예제 #1
0
        public IList <ByteBuf> Decompose(int offset, int length)
        {
            CheckIndex(offset, length);
            if (length == 0)
            {
                return(Convenient.EmptyList <ByteBuf>());
            }

            int             componentId = FindIndex(offset);
            IList <ByteBuf> slice       = new List <ByteBuf>(_components.Count);

            // the first component
            var firstC = _components[componentId];
            var first  = firstC.Buf.Duplicate();

            first.SetReaderIndex(offset - firstC.Offset);

            ByteBuf buf          = first;
            int     bytesToSlice = length;

            do
            {
                int readableBytes = buf.ReadableBytes;
                if (bytesToSlice <= readableBytes)
                {
                    // last component
                    buf.SetWriterIndex(buf.ReaderIndex + bytesToSlice);
                    slice.Add(buf);
                    break;
                }
                else
                {
                    // not the last component
                    slice.Add(buf);
                    bytesToSlice -= readableBytes;
                    componentId++;

                    // fetch the next component
                    buf = _components[componentId].Buf.Duplicate();
                }
            } while (bytesToSlice > 0);

            // slice all component because only readable bytes are interesting
            for (int i = 0; i < slice.Count; i++)
            {
                slice[i] = slice[i].Slice();
            }

            return(slice);
        }
예제 #2
0
        public ICollection <Number160> FindContentForResponsiblePeerId(Number160 peerId)
        {
            var lockResp = LockResponsibility(peerId);

            try
            {
                var contentIds = _backend.FindContentForResponsiblePeerId(peerId);
                if (contentIds == null)
                {
                    return(Convenient.EmptyList <Number160>());
                }
                else
                {
                    return(new List <Number160>(contentIds));
                }
            }
            finally
            {
                lockResp.Unlock();
            }
        }