1 36 package org.columba.ristretto.imap; 37 38 import java.io.File ; 39 import java.io.FileInputStream ; 40 import java.io.FileOutputStream ; 41 import java.io.IOException ; 42 import java.io.InputStream ; 43 import java.io.OutputStream ; 44 import java.util.logging.Logger ; 45 46 import org.columba.ristretto.concurrency.Mutex; 47 import org.columba.ristretto.io.AsyncInputStream; 48 import org.columba.ristretto.io.MemBuffer; 49 import org.columba.ristretto.io.MemBufferInputStream; 50 import org.columba.ristretto.io.MemBufferOutputStream; 51 import org.columba.ristretto.io.TempSourceFactory; 52 53 60 public class IMAPDownloadThread implements Runnable { 61 private static final int BUFFER_SIZE = 1024; 62 63 64 private static final Logger LOG = Logger.getLogger("org.columba.ristretto.imap.protocol"); 65 66 private AsyncInputStream partner; 67 68 private InputStream source; 69 private OutputStream out; 70 71 private byte[] buffer = new byte[BUFFER_SIZE]; 72 73 private int size; 74 private int read; 75 76 private Mutex mutex; 77 78 79 82 public void run() { 83 int lastRead; 84 long startTime = System.currentTimeMillis(); 85 86 try { 87 while( read < size ) { 88 lastRead = source.read(buffer,0, size - read < BUFFER_SIZE ? size - read : BUFFER_SIZE); 89 out.write(buffer, 0, lastRead); 90 partner.grow(lastRead); 91 read += lastRead; 92 } 93 } catch (IOException e) { 94 partner.exceptionOccured(e); 95 partner.grow(size - read); 97 } 98 99 try { 100 int rest = 0; 102 while( rest != '\n' && rest != -1) { 103 rest = source.read(); 104 } 105 106 rest = 0; 108 while( rest != '\n' && rest != -1) { 109 rest = source.read(); 110 } 111 } catch (IOException e1) { 112 LOG.warning( e1.getLocalizedMessage() ); 113 } 114 115 LOG.finer("Needed " + (System.currentTimeMillis() - startTime) + " ms for downloading " + size + " bytes."); 116 117 if( mutex!= null ) { 118 mutex.release(); 119 } 120 } 121 128 private IMAPDownloadThread(AsyncInputStream partner, InputStream source, 129 OutputStream out, int size, Mutex mutex) { 130 this.partner = partner; 131 this.source = source; 132 this.size = size; 133 this.out = out; 134 this.mutex = mutex; 135 } 136 137 147 public static AsyncInputStream asyncDownload(InputStream input, int size, Mutex mutex) throws IOException { 148 InputStream literalSource; 149 OutputStream out; 150 151 if( TempSourceFactory.useMemoryTemp(size)) { 152 MemBuffer literalBuffer = new MemBuffer(size); 153 154 literalSource = new MemBufferInputStream(literalBuffer); 155 out = new MemBufferOutputStream(literalBuffer); 156 } else { 157 File tempFile = TempSourceFactory.createTempFile(); 158 159 byte[] zeros = new byte[10000]; 161 out = new FileOutputStream (tempFile); 162 try { 163 int i; 164 for( i=0; i<size; i+=10000) { 165 out.write(zeros); 166 } 167 out.write(zeros,0,size % 10000); 168 } finally { 169 out.close(); 170 } 171 172 literalSource = new FileInputStream (tempFile); 173 out = new FileOutputStream (tempFile); 174 } 175 176 177 AsyncInputStream asyncStream = new AsyncInputStream(literalSource, size); 178 179 IMAPDownloadThread thread = new IMAPDownloadThread( asyncStream, input, out, size, mutex ); 180 181 new Thread ( thread ).start(); 182 183 return asyncStream; 184 } 185 } 186 | Popular Tags |