static void formEventCallback(CFReadStreamRef stream, CFStreamEventType type, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); switch (type) { case kCFStreamEventHasBytesAvailable: CFReadStreamSignalEvent(form->formStream, kCFStreamEventHasBytesAvailable, 0); break; case kCFStreamEventErrorOccurred: { CFStreamError readStreamError = CFReadStreamGetError(stream); CFReadStreamSignalEvent(form->formStream, kCFStreamEventErrorOccurred, &readStreamError); break; } case kCFStreamEventEndEncountered: openNextStream(form); if (!form->currentStream) CFReadStreamSignalEvent(form->formStream, kCFStreamEventEndEncountered, 0); break; case kCFStreamEventNone: LOG_ERROR("unexpected kCFStreamEventNone"); break; case kCFStreamEventOpenCompleted: LOG_ERROR("unexpected kCFStreamEventOpenCompleted"); break; case kCFStreamEventCanAcceptBytes: LOG_ERROR("unexpected kCFStreamEventCanAcceptBytes"); break; } }
static CFIndex formRead(CFReadStreamRef, UInt8* buffer, CFIndex bufferLength, CFStreamError* error, Boolean* atEOF, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); while (form->currentStream) { CFIndex bytesToRead = bufferLength; if (form->currentStreamRangeLength != BlobDataItem::toEndOfFile && form->currentStreamRangeLength < bytesToRead) bytesToRead = static_cast<CFIndex>(form->currentStreamRangeLength); CFIndex bytesRead = CFReadStreamRead(form->currentStream, buffer, bytesToRead); if (bytesRead < 0) { *error = CFReadStreamGetError(form->currentStream); return -1; } if (bytesRead > 0) { error->error = 0; *atEOF = FALSE; form->bytesSent += bytesRead; if (form->currentStreamRangeLength != BlobDataItem::toEndOfFile) form->currentStreamRangeLength -= bytesRead; return bytesRead; } openNextStream(form); } error->error = 0; *atEOF = TRUE; return 0; }
static Boolean formOpen(CFReadStreamRef stream, CFStreamError* error, Boolean* openComplete, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); openNextStream(form); *openComplete = TRUE; error->error = 0; return TRUE; }
static Boolean formCanRead(CFReadStreamRef stream, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); while (form->currentStream && CFReadStreamGetStatus(form->currentStream) == kCFStreamStatusAtEnd) openNextStream(form); if (!form->currentStream) { CFReadStreamSignalEvent(stream, kCFStreamEventEndEncountered, 0); return FALSE; } return CFReadStreamHasBytesAvailable(form->currentStream); }
static Boolean formOpen(CFReadStreamRef, CFStreamError* error, Boolean* openComplete, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); bool opened = openNextStream(form); *openComplete = opened; error->error = opened ? 0 : #if PLATFORM(WIN) ENOENT; #else fnfErr; #endif return opened; }
static CFIndex formRead(CFReadStreamRef stream, UInt8* buffer, CFIndex bufferLength, CFStreamError* error, Boolean* atEOF, void* context) { FormStreamFields* form = static_cast<FormStreamFields*>(context); while (form->currentStream) { CFIndex bytesRead = CFReadStreamRead(form->currentStream, buffer, bufferLength); if (bytesRead < 0) { *error = CFReadStreamGetError(form->currentStream); return -1; } if (bytesRead > 0) { error->error = 0; *atEOF = FALSE; return bytesRead; } openNextStream(form); } error->error = 0; *atEOF = TRUE; return 0; }