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-provider-item.cpp
19 * @author Jungki Kwak (jungki.kwak@samsung.com)
20 * @brief item class for saving download data
22 // FIXME later : move to util clas
23 #include "download-provider-item.h"
24 #include "download-provider-common.h"
25 #include "download-provider-items.h"
26 #include "download-provider-viewItem.h"
27 #include "download-provider-history-db.h"
28 #include "download-provider-network.h"
34 , m_errorCode(ERROR::NONE)
36 , m_contentType(DP_CONTENT_UNKOWN)
38 , m_downloadType(DL_TYPE::TYPE_NONE)
39 , m_gotFirstData(false)
41 // FIXME Later : init private members
44 Item::Item(DownloadRequest &rRequest)
46 , m_errorCode(ERROR::NONE)
48 , m_contentType(DP_CONTENT_UNKOWN)
50 , m_downloadType(DL_TYPE::TYPE_NONE)
51 , m_gotFirstData(false)
53 m_title = S_("IDS_COM_BODY_NO_NAME");
54 m_iconPath = DP_UNKNOWN_ICON_PATH;
55 m_aptr_request = auto_ptr<DownloadRequest>(new DownloadRequest(rRequest)); // FIXME ???
63 void Item::create(DownloadRequest &rRequest)
67 Item *newItem = new Item(rRequest);
69 Items &items = Items::getInstance();
70 items.attachItem(newItem);
72 ViewItem::create(newItem);
73 DP_LOGD("newItem[%p]",newItem);
78 Item *Item::createHistoryItem()
80 string url = string();
81 string cookie = string();
82 DownloadRequest request(url,cookie);
83 Item *newItem = new Item(request);
86 DP_LOGD("new History Item[%p]",newItem);
91 void Item::attachHistoryItem()
93 Items &items = Items::getInstance();
95 DP_LOGD("attach History Item[%p]",this);
96 items.attachItem(this);
97 ViewItem::create(this);
104 // FIXME prohibit to destroy if downloading
106 DP_LOGE("Cannot delete this item. State[%d]",m_state);
109 DP_LOGD("Item::destroy() notify()");
111 setState(ITEM::DESTROY);
113 // DP_LOG("Item::destroy() notify()... END");
114 m_aptr_downloadItem->deSubscribe(m_aptr_downloadObserver.get());
115 if (m_aptr_downloadObserver.get())
116 m_aptr_downloadObserver->clear();
118 DP_LOGE("download observer pointer is NULL");
119 /* When deleting item after download is failed */
120 if (m_aptr_netEventObserver.get()) {
121 NetMgr &netMgrInstance = NetMgr::getInstance();
122 netMgrInstance.deSubscribe(m_aptr_netEventObserver.get());
124 Items::getInstance().detachItem(this);
127 void Item::deleteFromDB()
129 DownloadHistoryDB::deleteItem(m_historyId);
132 void Item::download()
134 NetMgr &netMgrInstance = NetMgr::getInstance();
138 setState(ITEM::REQUESTING);
140 createSubscribeData();
142 netMgrInstance.subscribe(m_aptr_netEventObserver.get());
144 m_aptr_downloadItem->start();
146 DP_LOG("Item::download() notify()");
150 void Item::createSubscribeData() // autoptr's variable of this class.
152 m_aptr_downloadObserver = auto_ptr<Observer>(
153 new Observer(updateCBForDownloadObserver, this, "downloadItemObserver"));
154 m_aptr_netEventObserver = auto_ptr<Observer>(
155 new Observer(netEventCBObserver, this, "netMgrObserver"));
156 m_aptr_downloadItem = auto_ptr<DownloadItem>(new DownloadItem(m_aptr_request));
157 if (!m_aptr_downloadItem.get()) {
158 DP_LOGE("Fail to create download item");
161 m_aptr_downloadItem->subscribe(m_aptr_downloadObserver.get());
164 void Item::startUpdate(void)
166 if (m_gotFirstData) {
167 setState(ITEM::DOWNLOADING);
168 if (!registeredFilePath().empty())
169 /* need to parse title again, because installed path can be changed */
176 if (!m_aptr_downloadItem.get()) {
177 DP_LOGE("Fail to get download item");
180 m_gotFirstData = true;
181 // setState(ITEM::DOWNLOADING);
182 setState(ITEM::RECEIVING_DOWNLOAD_INFO);
185 DownloadUtil &util = DownloadUtil::getInstance();
186 m_contentType = util.getContentType(
187 m_aptr_downloadItem->mimeType().c_str(), filePath().c_str());
191 void Item::updateFromDownloadItem(void)
195 switch (m_aptr_downloadItem->state()) {
196 case DL_ITEM::STARTED:
198 case DL_ITEM::UPDATING:
201 case DL_ITEM::COMPLETE_DOWNLOAD:
202 setState(ITEM::REGISTERING_TO_SYSTEM);
203 /* need to parse title again, because installed path can be changed */
206 case DL_ITEM::INSTALL_NOTIFY:
207 setState(ITEM::NOTIFYING_TO_SERVER);
209 case DL_ITEM::START_DRM_DOMAIN:
210 setState(ITEM::PROCESSING_DOMAIN);
212 case DL_ITEM::FINISH_DRM_DOMAIN:
213 setState(ITEM::FINISH_PROCESSING_DOMAIN);
215 case DL_ITEM::WAITING_RO:
216 setState(ITEM::ACTIVATING);
218 case DL_ITEM::SUSPENDED:
219 setState(ITEM::SUSPEND);
220 m_aptr_downloadItem->resume();
222 case DL_ITEM::RESUMED:
223 //setState(ITEM::RESUMED);
225 case DL_ITEM::FINISHED:
226 setState(ITEM::FINISH_DOWNLOAD);
227 handleFinishedItem();
229 case DL_ITEM::CANCELED:
230 /* Already update for cancel state in case of cancellation from user Response popup */
231 if (state() == ITEM::CANCEL) {
232 DP_LOGD("Already cancelled when closing OMA download popup");
235 setState(ITEM::CANCEL);
236 handleFinishedItem();
239 case DL_ITEM::FAILED:
240 setState(ITEM::FAIL_TO_DOWNLOAD);
241 setErrorCode(m_aptr_downloadItem->errorCode());
242 handleFinishedItem();
244 case DL_ITEM::WAITING_CONFIRM:
245 setState(ITEM::WAITING_USER_RESPONSE);
251 DP_LOGD("Item[%p]::updateFromDownloadItem() notify() dl_state[%d]state[%d]", this, m_aptr_downloadItem->state(), state());
254 void Item::handleFinishedItem()
257 m_finishedTime = time(NULL);
258 DownloadHistoryDB::addToHistoryDB(this);
259 /* If download is finished, it is not need to get network event */
260 if (m_aptr_netEventObserver.get()) {
261 NetMgr &netMgrInstance = NetMgr::getInstance();
262 netMgrInstance.deSubscribe(m_aptr_netEventObserver.get());
266 const char *Item::getErrorMessage(void)
268 switch (m_errorCode) {
269 case ERROR::NETWORK_FAIL:
270 return S_("IDS_COM_POP_CONNECTION_FAILED");
272 case ERROR::INVALID_URL:
273 return S_("IDS_COM_POP_INVALID_URL");
275 case ERROR::NOT_ENOUGH_MEMORY:
276 return S_("IDS_COM_POP_NOT_ENOUGH_MEMORY");
278 case ERROR::FAIL_TO_INSTALL:
279 return __("IDS_BR_POP_INSTALLATION_FAILED");
281 case ERROR::OMA_POPUP_TIME_OUT:
282 return S_("IDS_COM_POP_CANCELLED") ;
284 case ERROR::FAIL_TO_PARSE_DESCRIPTOR:
285 return __("IDS_BR_POP_INVALIDDESCRIPTOR") ;
288 case ERROR::ENGINE_FAIL:
289 return S_("IDS_COM_POP_FAILED") ;
295 void Item::extractTitle(void)
297 if (!m_aptr_downloadItem.get()) {
298 DP_LOGE("Fail to get download item");
301 DP_LOGD("title [%s] filePath [%s]", m_title.c_str(), filePath().c_str());
302 if ((m_aptr_downloadItem->downloadType() == DL_TYPE::OMA_DOWNLOAD ||
303 m_aptr_downloadItem->downloadType() == DL_TYPE::MIDP_DOWNLOAD) &&
304 !m_aptr_downloadItem->contentName().empty()) {
305 m_title = m_aptr_downloadItem->contentName();
309 if (!registeredFilePath().empty())
310 path = registeredFilePath();
313 found = path.find_last_of("/");
314 if (found != string::npos)
315 m_title = path.substr(found+1);
319 void Item::extractIconPath()
321 // FIXME Later : change 2 dimension array??
322 switch(m_contentType) {
323 case DP_CONTENT_IMAGE :
324 m_iconPath = DP_IMAGE_ICON_PATH;
326 case DP_CONTENT_VIDEO :
327 m_iconPath = DP_VIDEO_ICON_PATH;
329 case DP_CONTENT_MUSIC:
330 m_iconPath = DP_MUSIC_ICON_PATH;
333 m_iconPath = DP_PDF_ICON_PATH;
335 case DP_CONTENT_WORD:
336 m_iconPath = DP_WORD_ICON_PATH;
339 m_iconPath = DP_PPT_ICON_PATH;
341 case DP_CONTENT_EXCEL:
342 m_iconPath = DP_EXCEL_ICON_PATH;
344 case DP_CONTENT_HTML:
345 m_iconPath = DP_HTML_ICON_PATH;
347 case DP_CONTENT_TEXT:
348 m_iconPath = DP_TEXT_ICON_PATH;
350 case DP_CONTENT_RINGTONE:
351 m_iconPath = DP_RINGTONE_ICON_PATH;
354 m_iconPath = DP_DRM_ICON_PATH;
356 case DP_CONTENT_JAVA:
357 m_iconPath = DP_JAVA_ICON_PATH;
359 case DP_CONTENT_UNKOWN:
361 m_iconPath = DP_UNKNOWN_ICON_PATH;
365 void Item::updateCBForDownloadObserver(void *data)
369 static_cast<Item*>(data)->updateFromDownloadItem();
372 void Item::netEventCBObserver(void *data)
374 /* It is only considerd that there is one network event which is suspend now.
375 * If other network evnet is added,
376 * it is needed to add function accroding to what kinds of network event is
380 static_cast<Item*>(data)->suspend();
383 void Item::sendUserResponse(bool res)
387 if (!m_aptr_downloadItem.get()) {
388 DP_LOGE("Fail to get download item");
391 ret = m_aptr_downloadItem->sendUserResponse(res);
393 /* Update UI at once if the user cancel the oma download
394 * But this is really needed??
397 setState(ITEM::CANCEL);
398 handleFinishedItem();
401 setState(ITEM::RECEIVING_DOWNLOAD_INFO);
408 if (m_contentType == DP_CONTENT_JAVA &&
409 m_aptr_downloadItem->downloadType() == DL_TYPE::MIDP_DOWNLOAD) {
411 DownloadUtil &util = DownloadUtil::getInstance();
412 pkgName = util.getMidletPkgName(m_contentName, m_vendorName);
413 return m_fileOpener.openApp(pkgName);
415 return m_fileOpener.openFile(registeredFilePath(), m_contentType);
420 const char *Item::stateStr(void)
422 switch((int)state()) {
425 case ITEM::REQUESTING:
427 case ITEM::PREPARE_TO_RETRY:
428 return "PREPARE_TO_RETRY";
429 case ITEM::WAITING_USER_RESPONSE:
430 return "WAITING_USER_RESPONSE";
431 case ITEM::RECEIVING_DOWNLOAD_INFO:
432 return "RECEIVING_DOWNLOAD_INFO";
433 case ITEM::DOWNLOADING:
434 return "DOWNLOADING";
435 case ITEM::REGISTERING_TO_SYSTEM:
436 return "REGISTERING_TO_SYSTEM";
437 case ITEM::PROCESSING_DOMAIN:
438 return "PROCESSING_DOMAIN";
439 case ITEM::FINISH_PROCESSING_DOMAIN:
440 return "FINISH_PROCESSING_DOMAIN";
441 case ITEM::ACTIVATING:
443 case ITEM::NOTIFYING_TO_SERVER:
444 return "NOTIFYING_TO_SERVER";
447 case ITEM::FINISH_DOWNLOAD:
448 return "FINISH_DOWNLOAD";
449 case ITEM::FAIL_TO_DOWNLOAD:
450 return "FAIL_TO_DOWNLOAD";
458 return "Unknown State";
461 DL_TYPE::TYPE Item::downloadType()
463 if (m_downloadType == DL_TYPE::TYPE_NONE) {
464 if (!m_aptr_downloadItem.get()) {
465 DP_LOGE("Fail to get download item");
466 return DL_TYPE::TYPE_NONE;
468 m_downloadType = m_aptr_downloadItem->downloadType();
470 return m_downloadType;
473 string &Item::contentName()
475 if (m_contentName.empty()) {
476 if (!m_aptr_downloadItem.get()) {
477 DP_LOGE("Fail to get download item");
478 return m_emptyString;
480 m_contentName = m_aptr_downloadItem->contentName();
482 return m_contentName;
485 string &Item::vendorName()
487 if (m_vendorName.empty()) {
488 if (!m_aptr_downloadItem.get()) {
489 DP_LOGE("Fail to get download item");
490 return m_emptyString;
492 m_vendorName = m_aptr_downloadItem->vendorName();
497 string &Item::registeredFilePath()
499 if (m_registeredFilePath.empty()) {
500 if (!m_aptr_downloadItem.get()) {
501 DP_LOGE("Fail to get download item");
502 return m_emptyString;
504 m_registeredFilePath = m_aptr_downloadItem->registeredFilePath();
506 return m_registeredFilePath;
512 if (!m_aptr_downloadItem.get()) {
513 DP_LOGE("Fail to get download item");
514 return m_emptyString;
516 m_url = m_aptr_downloadItem->url();
521 string &Item::cookie()
523 if (m_cookie.empty()) {
524 if (!m_aptr_downloadItem.get()) {
525 DP_LOGE("Fail to get download item");
526 return m_emptyString;
528 m_cookie = m_aptr_downloadItem->cookie();
534 void Item::createHistoryId()
537 unsigned tempId = time(NULL);
538 while (isExistedHistoryId(tempId)) {
539 srand((unsigned)(time(NULL)));
543 DP_LOGE("Fail to create unique ID");
547 DP_LOGD("random historyId[%ld]", m_historyId);
549 m_historyId = tempId;
552 bool Item::isExistedHistoryId(unsigned int id)
554 Items &items = Items::getInstance();
555 return items.isExistedHistoryId(id);
558 void Item::setRetryData(string &url, string &cookie)
563 m_aptr_request->setUrl(url);
564 m_aptr_request->setCookie(cookie);
566 createSubscribeData();
573 if (m_aptr_downloadItem.get()) {
574 NetMgr &netMgrInstance = NetMgr::getInstance();
575 setState(ITEM::PREPARE_TO_RETRY);
577 DownloadHistoryDB::deleteItem(m_historyId);
578 netMgrInstance.subscribe(m_aptr_netEventObserver.get());
580 m_aptr_downloadItem->retry();
583 m_state = ITEM::FAIL_TO_DOWNLOAD;
588 void Item::clearForRetry()
590 m_state = ITEM::IDLE;
591 m_errorCode = ERROR::NONE;
592 m_contentType = DP_CONTENT_UNKOWN;
594 m_downloadType = DL_TYPE::TYPE_NONE;
595 m_gotFirstData = false;
598 bool Item::isFinished()
602 case ITEM::FINISH_DOWNLOAD:
603 case ITEM::FAIL_TO_DOWNLOAD:
615 bool Item::isFinishedWithErr()
619 case ITEM::FAIL_TO_DOWNLOAD:
629 bool Item::isPreparingDownload()
634 case ITEM::REQUESTING:
635 case ITEM::PREPARE_TO_RETRY:
636 case ITEM::WAITING_USER_RESPONSE:
646 bool Item::isCompletedDownload()
648 if (isPreparingDownload() || m_state == ITEM::DOWNLOADING)