blob: a9acb652742a2eceae88f935444ab470c82ef1c4 [file] [log] [blame]
#import <Foundation/Foundation.h>
#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 <HTTPResponse>
{
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.
**/