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); }
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(); } }