diff --git a/src/kits/package/FetchFileJob.cpp b/src/kits/package/FetchFileJob.cpp index 6f53ca8647..d5e3bc4042 100644 --- a/src/kits/package/FetchFileJob.cpp +++ b/src/kits/package/FetchFileJob.cpp @@ -17,6 +17,7 @@ #include #ifdef HAIKU_TARGET_PLATFORM_HAIKU +# include # include # include #endif @@ -36,6 +37,7 @@ FetchFileJob::FetchFileJob(const BContext& context, const BString& title, fFileURL(fileURL), fTargetEntry(targetEntry), fTargetFile(&targetEntry, B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY), + fError(B_ERROR), fDownloadProgress(0.0) { } @@ -96,41 +98,7 @@ FetchFileJob::Execute() thread_id thread = request->Run(); wait_for_thread(thread, NULL); - if (fSuccess == true) - return B_OK; - else - return B_ERROR; - - //TODO: More detailed error codes? -#if 0 - const BHttpResult& outResult = dynamic_cast - (request->Result()); - - switch (outResult.StatusCode()) { - case B_HTTP_STATUS_OK: - return B_OK; - case B_HTTP_STATUS_PARTIAL_CONTENT: - return B_PARTIAL_READ; - case B_HTTP_STATUS_REQUEST_TIMEOUT: - case B_HTTP_STATUS_GATEWAY_TIMEOUT: - return B_TIMED_OUT; - case B_HTTP_STATUS_NOT_IMPLEMENTED: - case B_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: - return B_NOT_SUPPORTED; - case B_HTTP_STATUS_UNAUTHORIZED: - return B_PERMISSION_DENIED; - case B_HTTP_STATUS_FORBIDDEN: - case B_HTTP_STATUS_METHOD_NOT_ALLOWED: - case B_HTTP_STATUS_NOT_ACCEPTABLE: - return B_NOT_ALLOWED; - case B_HTTP_STATUS_NOT_FOUND: - return B_NAME_NOT_FOUND; - case B_HTTP_STATUS_BAD_GATEWAY: - return B_BAD_DATA; - default: - return B_ERROR; - } -#endif + return fError; } @@ -156,9 +124,58 @@ FetchFileJob::DownloadProgress(BUrlRequest*, ssize_t bytesReceived, void -FetchFileJob::RequestCompleted(BUrlRequest*, bool success) +FetchFileJob::RequestCompleted(BUrlRequest* request, bool success) { - fSuccess = success; + fError = request->Status(); + + if (success) { + const BHttpResult& outResult = dynamic_cast + (request->Result()); + uint16 code = outResult.StatusCode(); + uint16 codeClass = BHttpRequest::StatusCodeClass(code); + + switch (codeClass) { + case B_HTTP_STATUS_CLASS_CLIENT_ERROR: + case B_HTTP_STATUS_CLASS_SERVER_ERROR: + fError = B_IO_ERROR; + break; + default: + fError = B_OK; + break; + } + switch (code) { + case B_HTTP_STATUS_OK: + fError = B_OK; + break; + case B_HTTP_STATUS_PARTIAL_CONTENT: + fError = B_PARTIAL_READ; + break; + case B_HTTP_STATUS_REQUEST_TIMEOUT: + case B_HTTP_STATUS_GATEWAY_TIMEOUT: + fError = B_DEV_TIMEOUT; + break; + case B_HTTP_STATUS_NOT_IMPLEMENTED: + case B_HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE: + fError = B_NOT_SUPPORTED; + break; + case B_HTTP_STATUS_UNAUTHORIZED: + fError = B_PERMISSION_DENIED; + break; + case B_HTTP_STATUS_FORBIDDEN: + case B_HTTP_STATUS_METHOD_NOT_ALLOWED: + case B_HTTP_STATUS_NOT_ACCEPTABLE: + fError = B_NOT_ALLOWED; + break; + case B_HTTP_STATUS_NOT_FOUND: + fError = B_NAME_NOT_FOUND; + break; + case B_HTTP_STATUS_BAD_GATEWAY: + fError = B_BAD_DATA; + break; + default: + break; + } + } } diff --git a/src/kits/package/FetchFileJob.h b/src/kits/package/FetchFileJob.h index 4cfdb1b3e3..b4ba4230e2 100644 --- a/src/kits/package/FetchFileJob.h +++ b/src/kits/package/FetchFileJob.h @@ -50,7 +50,7 @@ public: off_t position, ssize_t size); virtual void DownloadProgress(BUrlRequest*, ssize_t bytesReceived, ssize_t bytesTotal); - virtual void RequestCompleted(BUrlRequest*, bool success); + virtual void RequestCompleted(BUrlRequest* request, bool success); #endif protected: @@ -61,7 +61,7 @@ private: BString fFileURL; BEntry fTargetEntry; BFile fTargetFile; - bool fSuccess; + status_t fError; float fDownloadProgress; off_t fBytes; off_t fTotalBytes;