#import #import "HTTPResponse.h" @class HTTPConnection; /** * This is an asynchronous version of HTTPFileResponse. * It reads data from the given file asynchronously via GCD. * * It may be overriden to allow custom post-processing of the data that has been read from the file. * An example of this is the HTTPDynamicFileResponse class. **/ @interface HTTPAsyncFileResponse : NSObject { HTTPConnection *connection; NSString *filePath; UInt64 fileLength; UInt64 fileOffset; // File offset as pertains to data given to connection UInt64 readOffset; // File offset as pertains to data read from file (but maybe not returned to connection) BOOL aborted; NSData *data; int fileFD; void *readBuffer; NSUInteger readBufferSize; // Malloced size of readBuffer NSUInteger readBufferOffset; // Offset within readBuffer where the end of existing data is NSUInteger readRequestLength; dispatch_queue_t readQueue; dispatch_source_t readSource; BOOL readSourceSuspended; } - (id)initWithFilePath:(NSString *)filePath forConnection:(HTTPConnection *)connection; - (NSString *)filePath; @end /** * Explanation of Variables (excluding those that are obvious) * * fileOffset * This is the number of bytes that have been returned to the connection via the readDataOfLength method. * If 1KB of data has been read from the file, but none of that data has yet been returned to the connection, * then the fileOffset variable remains at zero. * This variable is used in the calculation of the isDone method. * Only after all data has been returned to the connection are we actually done. * * readOffset * Represents the offset of the file descriptor. * In other words, the file position indidcator for our read stream. * It might be easy to think of it as the total number of bytes that have been read from the file. * However, this isn't entirely accurate, as the setOffset: method may have caused us to * jump ahead in the file (lseek). * * readBuffer * Malloc'd buffer to hold data read from the file. * * readBufferSize * Total allocation size of malloc'd buffer. * * readBufferOffset * Represents the position in the readBuffer where we should store new bytes. * * readRequestLength * The total number of bytes that were requested from the connection. * It's OK if we return a lesser number of bytes to the connection. * It's NOT OK if we return a greater number of bytes to the connection. * Doing so would disrupt proper support for range requests. * If, however, the response is chunked then we don't need to worry about this. * Chunked responses inheritly don't support range requests. **/