package com.limegroup.gnutella.hashing; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import org.limewire.io.IOUtils; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; /** * Ability to parse and return the the start and end of the audio * portion of a file. */ public abstract class NonMetaDataHasher { protected static final Log LOG = LogFactory.getLog(NonMetaDataHasher.class); /** * Returns the position where the audio portion of the file begins. * If there was any problems locating this position in the file an * IOException is thrown. */ public abstract long getStartPosition() throws IOException; /** * Returns the position where the audio portion of the file ends. * If there was any problems locating this position in the file an * IOException is thrown. */ public abstract long getEndPosition() throws IOException; /** * Opens the file and fills the buffer with the contents * located at the end of the file, filling the buffer's capacity. */ protected static void fillBuffer(ByteBuffer buffer, File file, int rearOffset) throws IOException { FileInputStream fis = null; buffer.rewind(); try { // using a FIS because we're reading once to a set // size buffer fis = new FileInputStream(file); FileChannel fc = fis.getChannel(); if(fc.size() >= buffer.capacity() + rearOffset) { fc.position(fc.size() - buffer.capacity() - rearOffset); } else { fc.position(0); } int totalRead = 0; int read = 0; while(totalRead < buffer.capacity() && totalRead < fc.size()) { read = fc.read(buffer); totalRead += read; if(read == 0 || read == -1) break; } buffer.limit(totalRead); } finally { IOUtils.close(fis); } } }