/// <summary> /// Find the specific object group by object group ID. /// </summary> /// <param name="file">The instance of OneNoteRevisionStoreFile.</param> /// <param name="ObjectGroupId">The object group ID.</param> /// <returns>Returns the specify object group.</returns> private ObjectGroupList FindObjectGroup(OneNoteRevisionStoreFile file, ExGuid ObjectGroupId) { foreach (ObjectSpaceManifestList objSpaceManifest in file.RootFileNodeList.ObjectSpaceManifestList) { foreach (RevisionManifestList revManifestList in objSpaceManifest.RevisionManifestList) { for (int i = 0; i < revManifestList.RevisionManifests.Count; i++) { RevisionManifest revManifest = revManifestList.RevisionManifests[i]; ObjectGroupListReferenceFND objGroupListRef = revManifest.FileNodeSequence[1].fnd as ObjectGroupListReferenceFND; if (objGroupListRef.ObjectGroupID.Guid == ObjectGroupId.GUID && objGroupListRef.ObjectGroupID.N == ObjectGroupId.Value) { return(revManifestList.ObjectGroupList[i]); } } } } return(null); }
/// This method is used to deserialize the Revision Manifest List from the specified byte array and start index. /// </summary> /// <param name="byteArray">Specify the byte array.</param> /// <param name="reference">Specify the reference of Revision Manifest List.</param> public void DoDeserializeFromByteArray(byte[] byteArray, FileNodeChunkReference reference) { FileNodeListFragment fragment = new FileNodeListFragment(reference.CbValue); fragment.DoDeserializeFromByteArray(byteArray, (int)reference.StpValue); this.FileNodeListFragments.Add(fragment); this.FileNodeSequence.AddRange(fragment.rgFileNodes.Where(f => f.FileNodeID != FileNodeIDValues.ChunkTerminatorFND).ToArray()); FileChunkReference64x32 nextFragmentRef = fragment.nextFragment; while (nextFragmentRef.IsfcrNil() == false && nextFragmentRef.IsfcrZero() == false) { FileNodeListFragment nextFragment = new FileNodeListFragment(nextFragmentRef.Cb); nextFragment.DoDeserializeFromByteArray(byteArray, (int)nextFragmentRef.Stp); nextFragmentRef = nextFragment.nextFragment; this.FileNodeListFragments.Add(nextFragment); this.FileNodeSequence.AddRange(nextFragment.rgFileNodes.Where(f => f.FileNodeID != FileNodeIDValues.ChunkTerminatorFND).ToArray()); } RevisionManifest revisionManifest = null; foreach (FileNode fileNode in this.FileNodeSequence) { if (fileNode.FileNodeID == FileNodeIDValues.RevisionRoleDeclarationFND) { this.RevisionRoleDeclaration.Add(fileNode); continue; } if (fileNode.FileNodeID == FileNodeIDValues.RevisionRoleAndContextDeclarationFND) { this.RevisionRoleAndContextDeclaration.Add(fileNode); continue; } if (fileNode.FileNodeID == FileNodeIDValues.RevisionManifestStart6FND || fileNode.FileNodeID == FileNodeIDValues.RevisionManifestStart7FND || fileNode.FileNodeID == FileNodeIDValues.RevisionManifestStart4FND) { revisionManifest = new RevisionManifest(); revisionManifest.FileNodeSequence.Add(fileNode); } else if (fileNode.FileNodeID == FileNodeIDValues.RevisionManifestEndFND) { revisionManifest.FileNodeSequence.Add(fileNode); this.RevisionManifests.Add(revisionManifest); revisionManifest = new RevisionManifest(); } else if (fileNode.FileNodeID != FileNodeIDValues.ChunkTerminatorFND && fileNode.FileNodeID != FileNodeIDValues.RevisionManifestListStartFND) { if (fileNode.FileNodeID == FileNodeIDValues.ObjectDataEncryptionKeyV2FNDX) { OneNoteRevisionStoreFile.IsEncryption = true; } revisionManifest.FileNodeSequence.Add(fileNode); if (fileNode.FileNodeID == FileNodeIDValues.ObjectGroupListReferenceFND) { ObjectGroupListReferenceFND objectGroupListRef = fileNode.fnd as ObjectGroupListReferenceFND; ObjectGroupList objectGroupList = new ObjectGroupList(); objectGroupList.DoDeserializeFromByteArray(byteArray, objectGroupListRef.Ref); this.ObjectGroupList.Add(objectGroupList); } } } }