public void ReadTransactionLog(Dictionary <uint, uint> transactionsData, IFileChunkReference fileChunkReference,
                                       uint cTransactionsInLog)
        {
            oneNoteFileReader.Move(fileChunkReference.Offset, "TransactionLog");

            uint cbRead = 0;
            var  cbTransactionLogFragmentSize = fileChunkReference.DataSize;
            var  cbMax = cbTransactionLogFragmentSize - FileChunkReference64x32.SizeInBytes;

            for (var i = 0; i < cTransactionsInLog; i++)
            {
                if (cbRead == cbMax)
                {
                    const string operationContext = "TransactionLog.nextFragment";

                    var nextFragment = new FileChunkReference64x32();

                    oneNoteFileReader.ReadFileChunkReference64x32(ref nextFragment, operationContext);
                    oneNoteFileReader.Move(nextFragment.Offset, operationContext);

                    cbRead = 0;
                    cbMax  = nextFragment.cb - FileChunkReference64x32.SizeInBytes;
                }
                else if (cbRead > cbMax)
                {
                    throw new FileFormatException("Transaction log is broken");
                }

                ReadTransaction(transactionsData, ref cbRead);
            }
        }
        public ObjectSpaceObjectPropSet ReadObjectSpaceObjectPropSet(IFileChunkReference fileChunkReference)
        {
            oneNoteFileReader.Move(fileChunkReference.Offset, "PropertySet");

            var oids       = ReadObjectSpaceObjectStream();
            var osids      = oids.Header.OsidStreamNotPresent ? null : ReadObjectSpaceObjectStream();
            var contextIDs = oids.Header.ExtendedStreamsPresent ? ReadObjectSpaceObjectStream() : null;

            return(new ObjectSpaceObjectPropSet(oids, osids, contextIDs));
        }
        public ICollection <FNDBase> ReadFileNodeList(IFileChunkReference fileChunkReference, Dictionary <uint, uint> transactionsData, params uint[] fileNodeIds)
        {
            ICollection <FNDBase> result = new List <FNDBase>();

            var nextFragment = new FileChunkReference64x32();

            while (true)
            {
                ReadFileNodeListFragment(fileChunkReference, result, ref nextFragment, transactionsData, fileNodeIds);

                if (FileChunkReference64x32.Nil.Equals(nextFragment))
                {
                    break;
                }

                fileChunkReference = nextFragment;
            }

            return(result);
        }
 public ObjectDeclaration2RefCountFND(FileNodeHeader header, IFileChunkReference blobFileChunkReference, ObjectDeclaration2Body body, byte cRef) : base(header)
 {
     this.blobFileChunkReference = blobFileChunkReference;
     this.body = body;
     this.cRef = cRef;
 }
 public RevisionManifestListReferenceFND(FileNodeHeader header, IFileChunkReference fileChunkReference) : base(header)
 {
     this.fileChunkReference = fileChunkReference;
 }
 public ObjectGroupListReferenceFND(FileNodeHeader header, IFileChunkReference fileChunkReference, ExtendedGuid objectGroupId) : base(header)
 {
     this.fileChunkReference = fileChunkReference;
     ObjectGroupID           = objectGroupId;
 }
 public ObjectSpaceManifestListReferenceFND(FileNodeHeader header, IFileChunkReference fileChunkReference, ExtendedGuid gosid)
     : base(header)
 {
     this.fileChunkReference = fileChunkReference;
     this.gosid = gosid;
 }
        public void ReadFileNodeListFragment(IFileChunkReference fileChunkReference, ICollection <FNDBase> result, ref FileChunkReference64x32 nextFragment, Dictionary <uint, uint> transactionsData, params uint[] fileNodeIds)
        {
            oneNoteFileReader.Move(fileChunkReference.Offset, "FileNodeListFragment");

            var jumpSizeToNextFragmentReference = GetJumpSizeToNextFragmentReference(fileChunkReference.DataSize);

            var fileNodeListHeader = new FileNodeListHeader();

            oneNoteFileReader.ReadFileNodeListHeader(ref fileNodeListHeader);
            jumpSizeToNextFragmentReference -= FileNodeListHeader.SizeInBytes;

            var fileNodeListId = fileNodeListHeader.FileNodeListID;
            var nodesCount     = transactionsData[fileNodeListId];
            var fileNodeHeader = new FileNodeHeader();

            while (true)
            {
                if (nodesCount == 0)
                {
                    break;
                }

                oneNoteFileReader.ReadFileNodeHeader(ref fileNodeHeader);
                jumpSizeToNextFragmentReference -= FileNodeHeader.SizeInBytes;

                var fileNodeId = fileNodeHeader.FileNodeID;
                if (fileNodeId == FileNodeIDs.ChunkTerminatorFND)
                {
                    break;
                }

                var sizeOfData = fileNodeHeader.Size - FileNodeHeader.SizeInBytes;
                var skip       = true;

                if (fileNodeIds.Length == 0 || Array.IndexOf(fileNodeIds, fileNodeId) >= 0)
                {
                    var readFileNodeData = ReadFileNodeData(fileNodeHeader);
                    if (readFileNodeData == null)
                    {
                        readFileNodeData = new NotImplementedFND(fileNodeHeader);
                    }
                    else
                    {
                        skip = false;
                    }

                    result.Add(readFileNodeData);
                    jumpSizeToNextFragmentReference -= sizeOfData;
                }

                if (skip && sizeOfData != 0)
                {
                    oneNoteFileReader.Skip(sizeOfData);
                    jumpSizeToNextFragmentReference -= sizeOfData;
                }

                nodesCount--;

                const uint minJumpSize = 4;
                if (jumpSizeToNextFragmentReference < minJumpSize)
                {
                    break;
                }
            }

            if (jumpSizeToNextFragmentReference != 0)
            {
                oneNoteFileReader.Skip(jumpSizeToNextFragmentReference);
            }

            oneNoteFileReader.ReadFileChunkReference64x32(ref nextFragment, "FileNodeListFragment.nextFragment");
            oneNoteFileReader.ExpectFileNodeListFooter();

            transactionsData[fileNodeListId] = nodesCount;
        }