2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * @file download-manager-downloadItem.cpp
19 * @author Jungki Kwak (jungki.kwak@samsung.com)
20 * @brief download item class for interface of download agent
25 #include "download-manager-downloadItem.h"
26 #include "download-manager-common.h"
27 #include "app_service.h"
29 static Ecore_Pipe *ecore_pipe = NULL;
30 static void __ecore_cb_pipe_update(void *data, void *buffer, unsigned int nbyte);
47 void updateDownloadItem();
49 inline void setType(DA_CB::TYPE type) { m_type = type; }
50 inline void setUserData(void *userData) { m_userData = userData; }
51 inline void setDownloadHandle(url_download_h handle) { m_download_handle = handle; }
52 inline void setReceivedFileSize(unsigned long int size) { m_receivedFileSize = size; }
53 inline void setFileSize(unsigned long int size) { m_fileSize = size; }
54 inline void setContentName(const char *name) { if (name) m_contentName = name; }
55 inline void setRegisteredFilePath(const char *path) { if (path) m_registeredFilePath = path; }
56 inline void setMimeType(const char *mime) { m_mimeType = mime; }
57 inline void setErrorCode(int err) { m_error = err; }
62 url_download_h m_download_handle;
64 unsigned long int m_receivedFileSize;
65 unsigned long int m_fileSize;
67 string m_registeredFilePath;
75 DownloadEngine::DownloadEngine()
79 DownloadEngine::~DownloadEngine()
84 void DownloadEngine::initEngine(void)
86 ecore_pipe = ecore_pipe_add(__ecore_cb_pipe_update, NULL);
89 void DownloadEngine::deinitEngine(void)
93 ecore_pipe_del(ecore_pipe);
98 void CbData::updateDownloadItem()
103 DP_LOGE("download item is NULL");
107 DownloadItem *downloadItem = static_cast<DownloadItem*>(m_userData);
108 if (downloadItem->state() == DL_ITEM::FAILED) {
109 DP_LOGE("download item is already failed");
112 downloadItem->setDownloadHandle(m_download_handle);
116 downloadItem->setState(DL_ITEM::STARTED);
117 //downloadItem->setFileSize(m_fileSize);
118 if (!m_contentName.empty())
119 downloadItem->setContentName(m_contentName);
120 if (!m_mimeType.empty())
121 downloadItem->setMimeType(m_mimeType);
123 case DA_CB::PROGRESS:
124 downloadItem->setState(DL_ITEM::UPDATING);
125 downloadItem->setFileSize(m_fileSize);
126 downloadItem->setReceivedFileSize(m_receivedFileSize);
129 downloadItem->setState(DL_ITEM::SUSPENDED);
130 downloadItem->setFileSize(m_fileSize);
131 downloadItem->setReceivedFileSize(m_receivedFileSize);
133 case DA_CB::COMPLETED:
134 downloadItem->setState(DL_ITEM::FINISHED);
135 if (!m_registeredFilePath.empty()) {
136 DP_LOGD("registeredFilePath[%s]", m_registeredFilePath.c_str());
137 downloadItem->setRegisteredFilePath(m_registeredFilePath);
139 downloadItem->destroyHandle();
142 if (m_error != URL_DOWNLOAD_ERROR_NONE) {
143 downloadItem->setState(DL_ITEM::FAILED);
144 downloadItem->setErrorCode(downloadItem->_convert_error(m_error));
146 downloadItem->setState(DL_ITEM::CANCELED);
148 downloadItem->destroyHandle();
153 downloadItem->notify();
156 void __ecore_cb_pipe_update(void *data, void *buffer, unsigned int nbyte)
162 pipe_data_t *pipe_data = static_cast<pipe_data_t *>(buffer);
163 CbData *cbData = pipe_data->cbData;
167 cbData->updateDownloadItem();
171 DownloadItem::DownloadItem()
172 : m_download_handle(NULL)
173 , m_state(DL_ITEM::IGNORE)
174 , m_errorCode(ERROR::NONE)
175 , m_receivedFileSize(0)
177 , m_downloadType(DL_TYPE::HTTP_DOWNLOAD)
181 DownloadItem::DownloadItem(auto_ptr<DownloadRequest> request)
182 : m_aptr_request(request)
183 , m_download_handle(NULL)
184 , m_state(DL_ITEM::IGNORE)
185 , m_errorCode(ERROR::NONE)
186 , m_receivedFileSize(0)
188 , m_downloadType(DL_TYPE::HTTP_DOWNLOAD)
192 void DownloadItem::createHandle()
194 int ret = url_download_create(&m_download_handle);
195 if (ret != URL_DOWNLOAD_ERROR_NONE) {
196 DP_LOGE("Fail to create download handle : [%d]", ret);
199 DP_LOGD("URL download handle : [%p]", m_download_handle);
200 ret = url_download_set_started_cb(m_download_handle, started_cb, static_cast<void*>(this));
201 if (ret != URL_DOWNLOAD_ERROR_NONE) {
202 DP_LOGE("Fail to set started callback : [%d]", ret);
206 ret = url_download_set_completed_cb(m_download_handle, completed_cb, static_cast<void*>(this));
207 if (ret != URL_DOWNLOAD_ERROR_NONE) {
208 DP_LOGE("Fail to set completed cb : [%d]", ret);
212 ret = url_download_set_paused_cb(m_download_handle, paused_cb, static_cast<void*>(this));
213 if (ret != URL_DOWNLOAD_ERROR_NONE) {
214 DP_LOGE("Fail to set paused cb : [%d]", ret);
218 ret = url_download_set_stopped_cb(m_download_handle, stopped_cb, static_cast<void*>(this));
219 if (ret != URL_DOWNLOAD_ERROR_NONE) {
220 DP_LOGE("Fail to set stopped cb : [%d]", ret);
224 ret = url_download_set_progress_cb(m_download_handle, progress_cb, static_cast<void*>(this));
225 if (ret != URL_DOWNLOAD_ERROR_NONE) {
226 DP_LOGE("Fail to set progress cb : [%d]", ret);
230 service_h service_handle;
231 ret = service_create(&service_handle);
233 DP_LOGE("Fail to create service handle");
237 ret = service_set_package(service_handle, PACKAGE_NAME);
239 DP_LOGE("Fail to set package name");
242 ret = url_download_set_notification(m_download_handle, service_handle);
243 if (ret != URL_DOWNLOAD_ERROR_NONE) {
244 DP_LOGE("Fail to set notification : [%d]", ret);
247 ret = service_destroy(service_handle);
249 DP_LOGE("Fail to create service handle");
254 DownloadItem::~DownloadItem()
260 void DownloadItem::destroyHandle()
262 if (!m_download_handle)
264 DP_LOGD("download handle[%p]", m_download_handle);
265 url_download_unset_started_cb(m_download_handle);
266 url_download_unset_completed_cb(m_download_handle);
267 url_download_unset_paused_cb(m_download_handle);
268 url_download_unset_stopped_cb(m_download_handle);
269 url_download_unset_progress_cb(m_download_handle);
270 url_download_destroy(m_download_handle);
271 m_download_handle = NULL;
274 void DownloadItem::started_cb(url_download_h download, const char *name,
275 const char *mime, void *user_data)
278 CbData *cbData = new CbData();
279 cbData->setType(DA_CB::STARTED);
280 cbData->setDownloadHandle(download);
281 cbData->setUserData(user_data);
283 cbData->setContentName(name);
285 cbData->setMimeType(mime);
287 pipe_data_t pipe_data;
288 pipe_data.cbData = cbData;
289 ecore_pipe_write(ecore_pipe, &pipe_data, sizeof(pipe_data_t));
292 void DownloadItem::paused_cb(url_download_h download, void *user_data)
294 CbData *cbData = new CbData();
295 cbData->setType(DA_CB::PAUSED);
296 cbData->setDownloadHandle(download);
297 cbData->setUserData(user_data);
299 pipe_data_t pipe_data;
300 pipe_data.cbData = cbData;
301 ecore_pipe_write(ecore_pipe, &pipe_data, sizeof(pipe_data_t));
304 void DownloadItem::completed_cb(url_download_h download, const char *path,
307 CbData *cbData = new CbData();
308 cbData->setType(DA_CB::COMPLETED);
309 cbData->setDownloadHandle(download);
310 cbData->setUserData(user_data);
311 cbData->setRegisteredFilePath(path);
313 pipe_data_t pipe_data;
314 pipe_data.cbData = cbData;
315 ecore_pipe_write(ecore_pipe, &pipe_data, sizeof(pipe_data_t));
318 void DownloadItem::stopped_cb(url_download_h download, url_download_error_e error,
321 CbData *cbData = new CbData();
322 cbData->setType(DA_CB::STOPPED);
323 cbData->setDownloadHandle(download);
324 cbData->setUserData(user_data);
325 cbData->setErrorCode(error);
327 pipe_data_t pipe_data;
328 pipe_data.cbData = cbData;
329 ecore_pipe_write(ecore_pipe, &pipe_data, sizeof(pipe_data_t));
332 void DownloadItem::progress_cb(url_download_h download, unsigned long long received,
333 unsigned long long total, void *user_data)
335 CbData *cbData = new CbData();
336 cbData->setType(DA_CB::PROGRESS);
337 cbData->setDownloadHandle(download);
338 cbData->setUserData(user_data);
339 cbData->setFileSize(total);
340 cbData->setReceivedFileSize(received);
341 // need to tmp path??
343 pipe_data_t pipe_data;
344 pipe_data.cbData = cbData;
345 ecore_pipe_write(ecore_pipe, &pipe_data, sizeof(pipe_data_t));
348 void DownloadItem::start(bool isRetry)
352 if (m_download_handle) {
357 ret = url_download_set_url(m_download_handle,
358 m_aptr_request->getUrl().c_str());
359 if (ret != URL_DOWNLOAD_ERROR_NONE) {
360 DP_LOGE("Fail to set url : [%d]", ret);
361 m_state = DL_ITEM::FAILED;
362 m_errorCode = ERROR::ENGINE_FAIL;
366 if (!m_aptr_request->getCookie().empty()) {
367 ret = url_download_add_http_header_field(m_download_handle,
368 "Cookie", m_aptr_request->getCookie().c_str());
369 if (ret != URL_DOWNLOAD_ERROR_NONE) {
370 DP_LOGE("Fail to set cookie : [%d]", ret);
371 m_state = DL_ITEM::FAILED;
372 m_errorCode = ERROR::ENGINE_FAIL;
377 ret = url_download_start(m_download_handle, &m_download_id);
378 DP_LOGD("URL download handle : handle[%p]id[%d]", m_download_handle, m_download_id);
380 if (ret != URL_DOWNLOAD_ERROR_NONE) {
381 m_state = DL_ITEM::FAILED;
382 m_errorCode = ERROR::ENGINE_FAIL;
387 ERROR::CODE DownloadItem::_convert_error(int err)
389 DP_LOGD("download module error[%d]", err);
393 case URL_DOWNLOAD_ERROR_NONE:
394 case URL_DOWNLOAD_ERROR_INVALID_PARAMETER:
395 case URL_DOWNLOAD_ERROR_OUT_OF_MEMORY:
396 case URL_DOWNLOAD_ERROR_IO_ERROR:
397 case URL_DOWNLOAD_ERROR_FIELD_NOT_FOUND:
398 case URL_DOWNLOAD_ERROR_INVALID_STATE:
399 case URL_DOWNLOAD_ERROR_INVALID_DESTINATION:
400 case URL_DOWNLOAD_ERROR_TOO_MANY_DOWNLOADS:
402 case URL_DOWNLOAD_ERROR_NETWORK_UNREACHABLE:
403 case URL_DOWNLOAD_ERROR_CONNECTION_TIMED_OUT:
404 case URL_DOWNLOAD_ERROR_CONNECTION_FAILED:
405 return ERROR::NETWORK_FAIL;
407 case URL_DOWNLOAD_ERROR_INVALID_URL:
408 return ERROR::INVALID_URL;
410 case URL_DOWNLOAD_ERROR_NO_SPACE:
411 return ERROR::NOT_ENOUGH_MEMORY;
413 // return ERROR::FAIL_TO_INSTALL;
415 return ERROR::UNKNOWN;
420 void DownloadItem::cancel()
422 DP_LOGD("DownloadItem::cancel");
423 if (m_state == DL_ITEM::CANCELED) {
424 DP_LOGD("It is already canceled");
428 int ret = url_download_stop(m_download_handle);
429 if (ret != URL_DOWNLOAD_ERROR_NONE) {
430 DP_LOGE("Fail to cancel download : handle[%p] reason[%d]",
431 m_download_handle, ret);
432 m_state = DL_ITEM::FAILED;
433 m_errorCode = ERROR::ENGINE_FAIL;
439 void DownloadItem::retry()
442 // m_download_handle = NULL;
443 m_state = DL_ITEM::IGNORE;
444 m_errorCode = ERROR::NONE;
445 m_receivedFileSize = 0;
447 m_downloadType = DL_TYPE::HTTP_DOWNLOAD;
451 void DownloadItem::suspend()
453 int ret = url_download_pause(m_download_handle);
454 if (ret != URL_DOWNLOAD_ERROR_NONE) {
455 DP_LOGE("Fail to suspend download : handle[%p] err[%d]",
456 m_download_handle, ret);
457 m_state = DL_ITEM::FAILED;
458 m_errorCode = ERROR::ENGINE_FAIL;
463 void DownloadItem::resume()
465 int ret = url_download_start(m_download_handle, &m_download_id);
466 if (ret != URL_DOWNLOAD_ERROR_NONE) {
467 DP_LOGE("Fail to resume download : handle[%p] err[%d]",
468 m_download_handle, ret);
469 m_state = DL_ITEM::FAILED;
470 m_errorCode = ERROR::ENGINE_FAIL;