btrfs: Attempt to fix GCC2 build.
[haiku.git] / src / kits / package / FetchFileJob.cpp
blobfa55dcdbba03f079c83aed24ffa103847b2c2839
1 /*
2 * Copyright 2011-2015, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Axel Dörfler <axeld@pinc-software.de>
7 * Rene Gollent <rene@gollent.com>
8 * Oliver Tappe <zooey@hirschkaefer.de>
9 */
12 #include <package/FetchFileJob.h>
14 #include <stdio.h>
15 #ifndef HAIKU_BOOTSTRAP_BUILD
16 #include <curl/curl.h>
17 #endif
18 #include <sys/wait.h>
20 #include <Path.h>
23 namespace BPackageKit {
25 namespace BPrivate {
28 FetchFileJob::FetchFileJob(const BContext& context, const BString& title,
29 const BString& fileURL, const BEntry& targetEntry)
31 inherited(context, title),
32 fFileURL(fileURL),
33 fTargetEntry(targetEntry),
34 fTargetFile(&targetEntry, B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY),
35 fDownloadProgress(0.0)
40 FetchFileJob::~FetchFileJob()
45 float
46 FetchFileJob::DownloadProgress() const
48 return fDownloadProgress;
52 const char*
53 FetchFileJob::DownloadURL() const
55 return fFileURL.String();
59 const char*
60 FetchFileJob::DownloadFileName() const
62 return fTargetEntry.Name();
66 off_t
67 FetchFileJob::DownloadBytes() const
69 return fBytes;
73 off_t
74 FetchFileJob::DownloadTotalBytes() const
76 return fTotalBytes;
80 status_t
81 FetchFileJob::Execute()
83 status_t result = fTargetFile.InitCheck();
84 if (result != B_OK)
85 return result;
87 #ifndef HAIKU_BOOTSTRAP_BUILD
88 CURL* handle = curl_easy_init();
90 if (handle == NULL)
91 return B_NO_MEMORY;
93 result = curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0);
95 result = curl_easy_setopt(handle, CURLOPT_XFERINFOFUNCTION,
96 &_TransferCallback);
97 if (result != CURLE_OK)
98 return B_BAD_VALUE;
100 result = curl_easy_setopt(handle, CURLOPT_PROGRESSDATA, this);
101 if (result != CURLE_OK)
102 return B_ERROR;
104 result = curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION,
105 &_WriteCallback);
106 if (result != CURLE_OK)
107 return B_ERROR;
109 result = curl_easy_setopt(handle, CURLOPT_WRITEDATA, this);
110 if (result != CURLE_OK)
111 return B_ERROR;
113 result = curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1);
114 if (result != CURLE_OK)
115 return B_ERROR;
117 result = curl_easy_setopt(handle, CURLOPT_URL, fFileURL.String());
118 if (result != CURLE_OK)
119 return B_ERROR;
121 result = curl_easy_perform(handle);
122 curl_easy_cleanup(handle);
124 switch (result) {
125 case CURLE_OK:
126 return B_OK;
127 case CURLE_UNSUPPORTED_PROTOCOL:
128 return EPROTONOSUPPORT;
129 case CURLE_FAILED_INIT:
130 return B_NO_INIT;
131 case CURLE_URL_MALFORMAT:
132 return B_BAD_VALUE;
133 case CURLE_NOT_BUILT_IN:
134 return B_NOT_SUPPORTED;
135 case CURLE_COULDNT_RESOLVE_PROXY:
136 case CURLE_COULDNT_RESOLVE_HOST:
137 return B_NAME_NOT_FOUND;
138 case CURLE_COULDNT_CONNECT:
139 return ECONNREFUSED;
140 case CURLE_FTP_WEIRD_SERVER_REPLY:
141 return B_BAD_DATA;
142 case CURLE_REMOTE_ACCESS_DENIED:
143 return B_NOT_ALLOWED;
144 case CURLE_PARTIAL_FILE:
145 return B_PARTIAL_READ;
146 case CURLE_OUT_OF_MEMORY:
147 return B_NO_MEMORY;
148 case CURLE_OPERATION_TIMEDOUT:
149 return B_TIMED_OUT;
150 case CURLE_SSL_CONNECT_ERROR:
151 return B_BAD_REPLY;
152 default:
153 // TODO: map more curl error codes to ours for more
154 // precise error reporting
155 return B_ERROR;
158 #endif /* !HAIKU_BOOTSTRAP_BUILD */
160 return B_OK;
165 FetchFileJob::_TransferCallback(void* _job, off_t downloadTotal,
166 off_t downloaded, off_t uploadTotal, off_t uploaded)
168 FetchFileJob* job = reinterpret_cast<FetchFileJob*>(_job);
169 if (downloadTotal != 0) {
170 job->fBytes = downloaded;
171 job->fTotalBytes = downloadTotal;
172 job->fDownloadProgress = (float)downloaded / downloadTotal;
173 job->NotifyStateListeners();
175 return 0;
179 size_t
180 FetchFileJob::_WriteCallback(void *buffer, size_t size, size_t nmemb,
181 void *userp)
183 FetchFileJob* job = reinterpret_cast<FetchFileJob*>(userp);
184 ssize_t dataWritten = job->fTargetFile.Write(buffer, size * nmemb);
185 return size_t(dataWritten);
189 void
190 FetchFileJob::Cleanup(status_t jobResult)
192 if (jobResult != B_OK)
193 fTargetEntry.Remove();
197 } // namespace BPrivate
199 } // namespace BPackageKit