/// This method is used to deserialize the Root File Node 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 Root File Node 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()); } FileNode[] objectSpaceManifestListStartArray = this.FileNodeSequence.Where(obj => obj.FileNodeID == FileNodeIDValues.ObjectSpaceManifestListStartFND).ToArray(); if (objectSpaceManifestListStartArray.Length == 1) { this.ObjectSpaceManifestListStart = objectSpaceManifestListStartArray[0]; } FileNode[] revisionManifestListRefArray = this.FileNodeSequence.Where(obj => obj.FileNodeID == FileNodeIDValues.RevisionManifestListReferenceFND).ToArray(); foreach (FileNode revisionManifestListNode in revisionManifestListRefArray) { RevisionManifestListReferenceFND revisionManifestListReferenceFND = revisionManifestListNode.fnd as RevisionManifestListReferenceFND; RevisionManifestList revisionManifestList = new MS_ONESTORE.RevisionManifestList(); revisionManifestList.DoDeserializeFromByteArray(byteArray, revisionManifestListReferenceFND.refField); this.RevisionManifestList.Add(revisionManifestList); } }
/// <summary> /// This method is used to deserialize the Root File Node 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 Root File Node List.</param> public void DoDeserializeFromByteArray(byte[] byteArray, FileChunkReference64x32 reference) { FileNodeListFragment fragment = new FileNodeListFragment(reference.Cb); fragment.DoDeserializeFromByteArray(byteArray, (int)reference.Stp); 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()); } FileNode[] objectSpaceManifestListReferences = this.FileNodeSequence.Where(obj => obj.FileNodeID == FileNodeIDValues.ObjectSpaceManifestListReferenceFND).ToArray(); foreach (FileNode node in objectSpaceManifestListReferences) { ObjectSpaceManifestListReferenceFND objectSpaceManifestListReference = node.fnd as ObjectSpaceManifestListReferenceFND; ObjectSpaceManifestList objectSpaceManifestList = new MS_ONESTORE.ObjectSpaceManifestList(); objectSpaceManifestList.DoDeserializeFromByteArray(byteArray, objectSpaceManifestListReference.refField); this.ObjectSpaceManifestList.Add(objectSpaceManifestList); } this.FileDataStoreListReference.AddRange(this.FileNodeSequence.Where(obj => obj.FileNodeID == FileNodeIDValues.FileDataStoreListReferenceFND).ToArray()); FileNode[] objectSpaceManifestRootArray = this.FileNodeSequence.Where(obj => obj.FileNodeID == FileNodeIDValues.ObjectSpaceManifestRootFND).ToArray(); if (objectSpaceManifestRootArray.Length == 1) { this.ObjectSpaceManifestRoot = objectSpaceManifestRootArray[0]; } }
/// <summary> /// This method is used to deserialize the FileDataStoreListReferenceFND object from the specified byte array and start index. /// </summary> /// <param name="byteArray">Specify the byte array.</param> /// <param name="startIndex">Specify the start index from the byte array.</param> /// <returns>Return the length in byte of the FileDataStoreListReferenceFND object.</returns> public override int DoDeserializeFromByteArray(byte[] byteArray, int startIndex) { this.Ref = new FileNodeChunkReference(this.stpFormat, this.cbFormat); int len = this.Ref.DoDeserializeFromByteArray(byteArray, startIndex); this.fileNodeListFragment = new FileNodeListFragment(this.Ref.CbValue); this.fileNodeListFragment.DoDeserializeFromByteArray(byteArray, (int)this.Ref.StpValue); return(len); }
/// This method is used to deserialize the Object Group from the specified byte array and start index. /// </summary> /// <param name="byteArray">Specify the byte array.</param> /// <param name="reference">Specify the reference of Object Group.</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()); } }
/// 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); } } } }
public void DoDeserializeFromByteArray(byte[] byteArray) { int index = 0; this.Header = new Header(); int len = this.Header.DoDeserializeFromByteArray(byteArray, index); index += len; this.FreeChunkList = new List <FreeChunkListFragment>(); FileChunkReference64x32 freeChunkRef = this.Header.fcrFreeChunkList; if (freeChunkRef.IsfcrNil() == false && freeChunkRef.IsfcrZero() == false) { do { FreeChunkListFragment freeChunkListFragment = new FreeChunkListFragment(freeChunkRef.Cb); len = freeChunkListFragment.DoDeserializeFromByteArray(byteArray, (int)freeChunkRef.Stp); index += len; this.FreeChunkList.Add(freeChunkListFragment); freeChunkRef = freeChunkListFragment.fcrNextChunk; }while (freeChunkRef.IsfcrNil() == false && freeChunkRef.IsfcrZero() == false); } this.TransactionLog = new List <TransactionLogFragment>(); FileChunkReference64x32 transLogRef = this.Header.fcrTransactionLog; do { TransactionLogFragment transLogFragment = new TransactionLogFragment(transLogRef.Cb); len = transLogFragment.DoDeserializeFromByteArray(byteArray, (int)transLogRef.Stp); transLogRef = transLogFragment.nextFragment; this.TransactionLog.Add(transLogFragment); foreach (TransactionEntry entry in transLogFragment.sizeTable.Where(t => t.srcID != 0x00000001).ToArray()) { if (FileNodeCountMapping.ContainsKey(entry.srcID)) { if (FileNodeCountMapping[entry.srcID] < entry.TransactionEntrySwitch) { FileNodeCountMapping[entry.srcID] = entry.TransactionEntrySwitch; } } else { FileNodeCountMapping.Add(entry.srcID, entry.TransactionEntrySwitch); } } }while (transLogRef.IsfcrNil() == false && transLogRef.IsfcrZero() == false); this.HashedChunkList = new List <FileNodeListFragment>(); FileChunkReference64x32 hashChunkRef = this.Header.fcrHashedChunkList; if (hashChunkRef.IsfcrNil() == false && hashChunkRef.IsfcrZero() == false) { do { FileNodeListFragment hashChunkList = new FileNodeListFragment(hashChunkRef.Cb); hashChunkList.DoDeserializeFromByteArray(byteArray, (int)hashChunkRef.Stp); this.HashedChunkList.Add(hashChunkList); hashChunkRef = hashChunkList.nextFragment; }while (hashChunkRef.IsfcrNil() == false && hashChunkRef.IsfcrZero() == false); } this.FileNodeList = new List <FileNodeListFragment>(); if (Header.fcrFileNodeListRoot.IsfcrNil() == false && Header.fcrFileNodeListRoot.IsfcrZero() == false) { this.RootFileNodeList = new RootFileNodeList(); this.RootFileNodeList.DoDeserializeFromByteArray(byteArray, Header.fcrFileNodeListRoot); } }