private List <RevisionStoreObjectGroup> ParseObjectGroup(CellID objectGroupCellID, MSOneStorePackage package) { StorageIndexCellMapping storageIndexCellMapping = package.FindStorageIndexCellMapping(objectGroupCellID); CellManifestDataElementData cellManifest = this.FindCellManifest(storageIndexCellMapping.CellMappingExtendedGUID); List <RevisionStoreObjectGroup> objectGroups = new List <RevisionStoreObjectGroup>(); package.CellManifests.Add(cellManifest); StorageIndexRevisionMapping revisionMapping = package.FindStorageIndexRevisionMapping(cellManifest.CellManifestCurrentRevision.CellManifestCurrentRevisionExtendedGUID); RevisionManifestDataElementData revisionManifest = this.FindRevisionManifestDataElement(revisionMapping.RevisionMappingExtendedGUID); package.RevisionManifests.Add(revisionManifest); RevisionManifestRootDeclare encryptionKeyRoot = revisionManifest.RevisionManifestRootDeclareList.Where(r => r.RootExtendedGUID.Equals(new ExGuid(3, Guid.Parse("4A3717F8-1C14-49E7-9526-81D942DE1741")))).SingleOrDefault(); bool isEncryption = encryptionKeyRoot != null; foreach (RevisionManifestObjectGroupReferences objRef in revisionManifest.RevisionManifestObjectGroupReferencesList) { ObjectGroupDataElementData dataObject = objectGroupDataElements.Where(d => d.DataElementExtendedGUID.Equals( objRef.ObjectGroupExtendedGUID)).Single().Data as ObjectGroupDataElementData; RevisionStoreObjectGroup objectGroup = RevisionStoreObjectGroup.CreateInstance(objRef.ObjectGroupExtendedGUID, dataObject, isEncryption); objectGroups.Add(objectGroup); } return(objectGroups); }
public MSOneStorePackage Parse(DataElementPackage dataElementPackage) { MSOneStorePackage package = new MSOneStorePackage(); storageIndexDataElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.StorageIndexDataElementData).ToArray(); storageManifestDataElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.StorageManifestDataElementData).ToArray(); cellManifestDataElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.CellManifestDataElementData).ToArray(); revisionManifestDataElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.RevisionManifestDataElementData).ToArray(); objectGroupDataElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.ObjectGroupDataElementData).ToArray(); objectBlOBElements = dataElementPackage.DataElements.Where(d => d.DataElementType == DataElementType.ObjectDataBLOBDataElementData).ToArray(); package.StorageIndex = storageIndexDataElements[0].Data as StorageIndexDataElementData; package.StorageManifest = storageManifestDataElements[0].Data as StorageManifestDataElementData; // Parse Header Cell CellID headerCellID = package.StorageManifest.StorageManifestRootDeclareList[0].CellID; StorageIndexCellMapping headerCellStorageIndexCellMapping = package.FindStorageIndexCellMapping(headerCellID); storageIndexHashTab.Add(headerCellID); if (headerCellStorageIndexCellMapping != null) { package.HeaderCellCellManifest = this.FindCellManifest(headerCellStorageIndexCellMapping.CellMappingExtendedGUID); StorageIndexRevisionMapping headerCellRevisionManifestMapping = package.FindStorageIndexRevisionMapping(package.HeaderCellCellManifest.CellManifestCurrentRevision.CellManifestCurrentRevisionExtendedGUID); package.HeaderCellRevisionManifest = this.FindRevisionManifestDataElement(headerCellRevisionManifestMapping.RevisionMappingExtendedGUID); package.HeaderCell = this.ParseHeaderCell(package.HeaderCellRevisionManifest); // Parse Data root CellID dataRootCellID = package.StorageManifest.StorageManifestRootDeclareList[1].CellID; storageIndexHashTab.Add(dataRootCellID); package.DataRoot = this.ParseObjectGroup(dataRootCellID, package); // Parse other data foreach (StorageIndexCellMapping storageIndexCellMapping in package.StorageIndex.StorageIndexCellMappingList) { if (storageIndexHashTab.Contains(storageIndexCellMapping.CellID) == false) { package.OtherFileNodeList.AddRange(this.ParseObjectGroup(storageIndexCellMapping.CellID, package)); storageIndexHashTab.Add(storageIndexCellMapping.CellID); } } } return(package); }