19 package org.sleuthkit.autopsy.keywordsearch;
 
   21 import java.io.IOException;
 
   22 import java.io.InputStream;
 
   23 import java.nio.charset.Charset;
 
   24 import java.util.List;
 
   38 class AbstractFileStringIntStream 
extends InputStream {
 
   40     private static final Logger logger = Logger.getLogger(AbstractFileStringIntStream.class.getName());
 
   41     private static final int FILE_BUF_SIZE = 1024 * 1024;
 
   42     private AbstractFile content;
 
   43     private final byte[] oneCharBuf = 
new byte[1];
 
   44     private final StringExtract stringExtractor;
 
   45     private final byte[] fileReadBuff = 
new byte[FILE_BUF_SIZE];
 
   46     private long fileReadOffset = 0L;
 
   47     private byte[] convertBuff; 
 
   48     private int convertBuffOffset = 0; 
 
   49     private int bytesInConvertBuff = 0; 
 
   50     private boolean fileEOF = 
false; 
 
   51     private boolean extractUTF8;
 
   52     private boolean extractUTF16;
 
   53     private Charset outCharset;
 
   55     private StringExtractResult lastExtractResult;
 
   70     public AbstractFileStringIntStream(AbstractFile content, List<SCRIPT> scripts, 
boolean extractUTF8,
 
   71             boolean extractUTF16, Charset outCharset) {
 
   72         this.content = content;
 
   73         this.stringExtractor = 
new StringExtract();
 
   74         this.stringExtractor.setEnabledScripts(scripts);
 
   75         this.extractUTF8 = extractUTF8;
 
   76         this.extractUTF16 = extractUTF16;
 
   77         this.outCharset = outCharset;
 
   78         this.stringExtractor.setEnableUTF8(extractUTF8);
 
   79         this.stringExtractor.setEnableUTF16(extractUTF16);
 
   83     public int read() throws IOException {
 
   84         if (extractUTF8 == 
false && extractUTF16 == 
false) {
 
   87         final int read = read(oneCharBuf, 0, 1);
 
   97     public int read(byte[] b, 
int off, 
int len) 
throws IOException {
 
   99             throw new NullPointerException();
 
  100         } 
else if (off < 0 || len < 0 || len > b.length - off) {
 
  101             throw new IndexOutOfBoundsException();
 
  102         } 
else if (len == 0) {
 
  106         if (extractUTF8 == 
false && extractUTF16 == 
false) {
 
  110         long fileSize = content.getSize();
 
  118         int offsetUser = off;
 
  119         while (bytesToUser < len && offsetUser < len) {
 
  121             int convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
 
  123             if ((convertBuff == null || convertBuffRemain == 0) && !fileEOF && fileReadOffset < fileSize) {
 
  143                     toRead = Math.min(FILE_BUF_SIZE, fileSize - fileReadOffset);
 
  145                     int read = content.read(fileReadBuff, fileReadOffset, toRead);
 
  146                     if (read == -1 || read == 0) {
 
  149                         fileReadOffset += read;
 
  150                         if (fileReadOffset >= fileSize) {
 
  156                         convertBuffRemain = bytesInConvertBuff - convertBuffOffset;
 
  158                 } 
catch (TskCoreException ex) {
 
  165             if (convertBuff == null || convertBuffRemain == 0) {
 
  167                     return bytesToUser > 0 ? bytesToUser : -1;
 
  175             final int toCopy = Math.min(convertBuffRemain, len - offsetUser);
 
  176             System.arraycopy(convertBuff, convertBuffOffset, b, offsetUser, toCopy);
 
  184             convertBuffOffset += toCopy;
 
  185             offsetUser += toCopy;
 
  187             bytesToUser += toCopy;
 
  201     private void convert(
int numBytes) {
 
  202         lastExtractResult = stringExtractor.extract(fileReadBuff, numBytes, 0);
 
  203         convertBuff = lastExtractResult.getText().getBytes(outCharset);
 
  206         if (lastExtractResult.getNumBytes() == 0) {
 
  207             bytesInConvertBuff = 0;
 
  209             bytesInConvertBuff = convertBuff.length;
 
  211         convertBuffOffset = 0;