protected String getString() { return( "[" + offset + " - " + (offset+size-1) + ":" + buffer.position(DirectByteBuffer.SS_CACHE)+"/"+buffer.limit(DirectByteBuffer.SS_CACHE)+"]" ); } }
@Override protected void readSupport( DirectByteBuffer buffer, long offset ) throws FMFileManagerException { if ( AEDiagnostics.CHECK_DUMMY_FILE_DATA ){ offset += file_offset_in_torrent; while( buffer.hasRemaining( DirectByteBuffer.SS_FILE )){ buffer.put( DirectByteBuffer.SS_FILE, (byte)offset++ ); } }else{ buffer.position( DirectByteBuffer.SS_FILE, buffer.limit( DirectByteBuffer.SS_FILE )); } }
protected requestDispatcher( DiskManagerReadRequest _request, DiskManagerReadRequestListener _listener, DirectByteBuffer _buffer, List _chunks ) { dm_request = _request; listener = _listener; buffer = _buffer; chunks = _chunks; /* String str = "Read: " + dm_request.getPieceNumber()+"/"+dm_request.getOffset()+"/"+dm_request.getLength()+":"; for (int i=0;i<chunks.size();i++){ Object[] entry = (Object[])chunks.get(i); String str2 = entry[0] + "/" + entry[1] +"/" + entry[2]; str += (i==0?"":",") + str2; } System.out.println( str ); */ buffer_length = buffer.limit( DirectByteBuffer.SS_DR ); dispatch(); }
buffer.position( DirectByteBuffer.SS_FILE, buffer.limit( DirectByteBuffer.SS_FILE ));
int length = raw.getRawData()[0].limit( DirectByteBuffer.SS_NET );
protected void doRequest( DiskAccessRequestListener l ) { Object[] stuff = (Object[])chunks.get( chunk_index++ ); if ( chunk_index > 0 ){ buffer.position( DirectByteBuffer.SS_DR, chunk_limit ); } chunk_limit = ((Integer)stuff[2]).intValue(); buffer.limit( DirectByteBuffer.SS_DR, chunk_limit ); short cache_policy = dm_request.getUseCache()?CacheFile.CP_READ_CACHE:CacheFile.CP_NONE; if ( dm_request.getFlush()){ cache_policy |= CacheFile.CP_FLUSH; } disk_access.queueReadRequest( (CacheFile)stuff[0], ((Long)stuff[1]).longValue(), buffer, cache_policy, l ); }
@Override public byte[] toByteArray() { buffer.position( DirectByteBuffer.SS_EXTERNAL, 0 ); int len = buffer.limit( DirectByteBuffer.SS_EXTERNAL ); byte[] res = new byte[len]; buffer.get( DirectByteBuffer.SS_EXTERNAL, res ); buffer.position( DirectByteBuffer.SS_EXTERNAL, 0 ); return( res ); }
@Override public void write( RandomAccessFile raf, DirectByteBuffer[] buffers, long position ) throws FMFileManagerException { for (int i=0;i<buffers.length;i++){ DirectByteBuffer buffer = buffers[i]; int len = buffers[i].limit(SS) - buffers[i].position(SS); write( raf, buffer, position ); position += len; } if ( position > current_length ){ setLength( raf, position ); } }
protected CacheEntry( int _entry_type, CacheFileWithCache _file, DirectByteBuffer _buffer, long _offset, int _size ) { entry_type = _entry_type; file = _file; buffer = _buffer; offset = _offset; size = _size; buffer_pos = buffer.position(DirectByteBuffer.SS_CACHE); buffer_limit = buffer.limit(DirectByteBuffer.SS_CACHE); if ( size != buffer_limit - buffer_pos ){ Debug.out( "CacheEntry: initial size incorrect - size =" + size + ", pos = " + buffer_pos + ", lim = " + buffer_limit ); } dirty = true; last_used = SystemTime.getCurrentTime(); }
@Override public void read( DirectByteBuffer buffer, long position, short policy ) throws CacheFileManagerException { boolean read_cache = ( policy & CP_READ_CACHE ) != 0; boolean flush = ( policy & CP_FLUSH ) != 0; if ( flush ){ int file_buffer_position = buffer.position(DirectByteBuffer.SS_CACHE); int file_buffer_limit = buffer.limit(DirectByteBuffer.SS_CACHE); int read_length = file_buffer_limit - file_buffer_position; flushCache( position, read_length, false, -1, 0, -1 ); } readCache( buffer, position, false, !read_cache ); }
@Override public void read( RandomAccessFile raf, DirectByteBuffer[] buffers, long position ) throws FMFileManagerException { for (int i=0;i<buffers.length;i++){ DirectByteBuffer buffer = buffers[i]; int len = buffers[i].limit(SS) - buffers[i].position(SS); read( raf, buffer, position ); int rem = buffers[i].remaining( SS ); position += len - rem; if ( rem > 0 ){ break; } } if ( position > current_length ){ setLength( raf, position ); } }
buffer.limit( DirectByteBuffer.SS_DR, ((Integer)stuff[2]).intValue());
lb.limit( SS, 4 );
@Override protected boolean writeSupport( SocketChannel sc ) throws IOException { // socket SX -> SY via BX // so if SX = source_channel then BX is target buffer SocketChannel chan1 = sc; SocketChannel chan2 = sc==source_channel?target_channel:source_channel; DirectByteBuffer read_buffer = sc==source_channel?target_buffer:source_buffer; int written = read_buffer.write( DirectByteBuffer.SS_PROXY, chan1 ); if ( chan1 == target_channel ){ outward_bytes += written; }else{ inward_bytes += written; } if ( read_buffer.hasRemaining(DirectByteBuffer.SS_PROXY)){ connection.requestWriteSelect( chan1 ); }else{ read_buffer.position(DirectByteBuffer.SS_PROXY,0); read_buffer.limit( DirectByteBuffer.SS_PROXY, read_buffer.capacity(DirectByteBuffer.SS_PROXY)); connection.requestReadSelect( chan2 ); } return( written > 0 ); }
if ( buffer.limit(SS_CACHE) - buffer.position(SS_CACHE) != entry.getLength()){
read_buffer.limit( DirectByteBuffer.SS_PROXY, read_buffer.capacity(DirectByteBuffer.SS_PROXY));