protected override long GetWritePositionLocked(OperationHint hint, int length)
        {
            var contentHint = hint as OptimizedOperation ?? throw new ArgumentException(nameof(hint));
            var retv        = -1L;

            lock (_blocksLockObject)
            {
                if (!TryGetAvailableBlock(length, out var block))
                {
                    retv = CurrentPosition;
                }
                else
                {
                    contentHint.IsExistingBlockUsed = true;
                    retv = block.Position;

                    if (block.Length <= length)
                    {
                        return(retv);
                    }

                    var generatedBlock = new DriveBlock
                    {
                        Length   = block.Length - length,
                        Position = block.Position + length
                    };

                    AddAvailableBlock(generatedBlock);
                    contentHint.GeneratedAvailableBlock = generatedBlock;
                }
            }

            return(retv);
        }
        protected override void SetCurrentPositionLocked(OperationHint hint, int writtenBytesCount)
        {
            var contentHint = hint as OptimizedOperation ?? throw new ArgumentException(nameof(hint));

            if (contentHint.IsExistingBlockUsed)
            {
                return;
            }

            CurrentPosition += writtenBytesCount;
        }
Exemple #3
0
 protected override WriteOperation MakeOperation(OperationHint hint, byte[] bytes, long position)
 {
     return(new FileTableOperation(drive => drive.Write(position, bytes), position));
 }
 protected abstract WriteOperation MakeOperation(OperationHint hint, byte[] bytes, long position);
 protected virtual void SetCurrentPositionLocked(OperationHint hint, int writtenBytesCount)
 {
     CurrentPosition += writtenBytesCount;
 }
 protected virtual long GetWritePositionLocked(OperationHint hint, int length)
 {
     return(CurrentPosition);
 }