The download UI application is added.
[apps/web/download-manager.git] / src / download-manager-viewItem.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *    http://www.tizenopensource.org/license
9  *
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.
15  */
16
17 /**
18  * @file        download-manager-viewItem.cpp
19  * @author      Jungki Kwak (jungki.kwak@samsung.com)
20  * @brief       item data class for download view
21  */
22 #include "download-manager-viewItem.h"
23 #include "download-manager-items.h"
24 #include "download-manager-view.h"
25
26 ViewItem::ViewItem(Item *item)
27         : m_item(item)
28         , m_glItem(NULL)
29         , m_progressBar(NULL)
30         , m_checkedBtn(NULL)
31         , m_checked(EINA_FALSE)
32         , m_isRetryCase(false)
33         , m_dateGroupType(DATETIME::DATE_TYPE_NONE)
34 {
35         // FIXME need to makes exchange subject?? not yet, but keep it in mind!
36         if (item) {
37                 m_aptr_observer = auto_ptr<Observer>(
38                         new Observer(updateCB, this, "viewItemObserver"));
39                 item->subscribe(m_aptr_observer.get());
40         }
41
42         dldGenlistStyle.item_style = "3text.3icon";
43 #ifndef _TIZEN_PUBLIC
44         dldGenlistStyle.decorate_item_style = "mode/slide";
45 #endif
46         dldGenlistStyle.func.text_get = getGenlistLabelCB;
47         dldGenlistStyle.func.content_get = getGenlistIconCB;
48         dldGenlistStyle.func.state_get = NULL;
49         dldGenlistStyle.func.del = NULL;
50         dldGenlistStyle.decorate_all_item_style = "edit_default";
51
52         dldHistoryGenlistStyle.item_style = "3text.1icon.2";
53 #ifndef _TIZEN_PUBLIC
54         dldHistoryGenlistStyle.decorate_item_style = "mode/slide";
55 #endif
56         dldHistoryGenlistStyle.func.text_get = getGenlistLabelCB;
57         dldHistoryGenlistStyle.func.content_get = getGenlistIconCB;
58         dldHistoryGenlistStyle.func.state_get = NULL;
59         dldHistoryGenlistStyle.func.del = NULL;
60         dldHistoryGenlistStyle.decorate_all_item_style = "edit_default";
61
62         dldGenlistSlideStyle.item_style = "3text.1icon.2";
63 #ifndef _TIZEN_PUBLIC
64         dldGenlistSlideStyle.decorate_item_style = "mode/slide2";
65 #endif
66         dldGenlistSlideStyle.func.text_get = getGenlistLabelCB;
67         dldGenlistSlideStyle.func.content_get= getGenlistIconCB;
68         dldGenlistSlideStyle.func.state_get = NULL;
69         dldGenlistSlideStyle.func.del = NULL;
70         dldGenlistSlideStyle.decorate_all_item_style = "edit_default";
71
72 }
73
74 ViewItem::~ViewItem()
75 {
76         DP_LOGD_FUNC();
77 }
78
79 void ViewItem::create(Item *item)
80 {
81         ViewItem *newViewItem = new ViewItem(item);
82
83         DownloadView &view = DownloadView::getInstance();
84         view.attachViewItem(newViewItem);
85 }
86
87 void ViewItem::destroy()
88 {
89         DP_LOGD("ViewItem::destroy");
90         /* After item is destory,
91            view item also will be destroyed through event system */
92         if (m_item) {
93 #ifndef _TIZEN_PUBLIC
94                 DownloadView &view = DownloadView::getInstance();
95                 if (this == view.sweepedItem()) {
96                         DP_LOGD("reset sweeped item[%p]", view.sweepedItem());
97                         view.setSweepedItem(NULL);
98                 }
99 #endif
100                 m_item->destroy();
101         }
102 }
103
104 void ViewItem::updateCB(void *data)
105 {
106         if (data)
107                 static_cast<ViewItem*>(data)->updateFromItem();
108 }
109
110 void ViewItem::updateFromItem()
111 {
112         DownloadView &view = DownloadView::getInstance();
113         DP_LOGD("ViewItem::updateFromItem() ITEM::[%d]", state());
114         if (state() == ITEM::DESTROY) {
115                 int tempType = 0;
116                 DP_LOGD("ViewItem::updateFromItem() ITEM::DESTROY");
117                 if (m_item)
118                         m_item->deSubscribe(m_aptr_observer.get());
119                 m_aptr_observer->clear();
120                 elm_object_item_del(m_glItem);
121                 m_glItem = NULL;
122                 tempType = dateGroupType();
123                 view.detachViewItem(this);
124                 view.handleGenlistGroupItem(tempType);
125                 return;
126         }
127         if (m_glItem == NULL) {
128                 return;
129         }
130         if (state() == ITEM::SUSPENDED) {
131                 return;
132         } else if (state() == ITEM::DOWNLOADING) {
133                 if (fileSize() > 0 && m_progressBar) {
134                         double percentageProgress = 0.0;
135                         percentageProgress = (double)(receivedFileSize()) /
136                                 (double)(fileSize());
137                         DP_LOGD("progress value[%.2f]",percentageProgress);
138                         elm_progressbar_value_set(m_progressBar, percentageProgress);
139                 }
140                 elm_genlist_item_fields_update(m_glItem,"elm.text.2",
141                         ELM_GENLIST_ITEM_FIELD_TEXT);
142         } else if (m_isRetryCase && state() == ITEM::RECEIVING_DOWNLOAD_INFO) {
143                 elm_genlist_item_item_class_update(m_glItem, &dldGenlistStyle);
144         } else if (!isFinished()) {
145                 elm_genlist_item_update(m_glItem);
146         } else {/* finished state */
147                 if (state() == ITEM::FINISH_DOWNLOAD)
148                         elm_genlist_item_item_class_update(m_glItem, &dldHistoryGenlistStyle);
149                 else
150                         elm_genlist_item_item_class_update(m_glItem, &dldGenlistSlideStyle);
151                 if (view.isGenlistEditMode())
152                         elm_object_item_disabled_set(m_glItem, EINA_FALSE);
153         }
154 }
155
156 char *ViewItem::getGenlistLabelCB(void *data, Evas_Object *obj, const char *part)
157 {
158 //      DP_LOGD_FUNC();
159
160         if(!data || !obj || !part)
161                 return NULL;
162
163         ViewItem *item = static_cast<ViewItem *>(data);
164         return item->getGenlistLabel(obj, part);
165 }
166
167 char *ViewItem::getGenlistLabel(Evas_Object *obj,       const char *part)
168 {
169         DP_LOGD("ViewItem::getListLabel:part[%s]", part);
170
171 #ifndef _TIZEN_PUBLIC
172         if (strncmp(part, "elm.text.1", strlen("elm.text.1")) == 0 ||
173                 strncmp(part, "elm.slide.text.1", strlen("elm.slide.text.1")) == 0 ||
174                 strncmp(part, "elm.slide.text.2", strlen("elm.slide.text.2")) == 0) {
175 #else
176         if (strncmp(part, "elm.text.1", strlen("elm.text.1")) == 0) {
177 #endif
178                 return strdup(getTitle());
179         } else if (strncmp(part, "elm.text.2", strlen("elm.text.2")) == 0) {
180                 return strdup(getMessage());
181         } else if (strncmp(part, "elm.text.3", strlen("elm.text.3")) == 0) {
182                 if (!isFinished()) {
183                         return NULL;
184                 } else {
185                         string outBuf;
186                         DateUtil &inst = DateUtil::getInstance();
187                         double udateTime = finishedTime() * 1000;
188                         if (dateGroupType() == DATETIME::DATE_TYPE_PREVIOUS
189                                 || dateGroupType() == DATETIME::DATE_TYPE_LATER)
190                                 inst.getDateStr(LOCALE_STYLE::SHORT_DATE, udateTime, outBuf);
191                         else
192                                 inst.getDateStr(LOCALE_STYLE::TIME, udateTime, outBuf);
193                         return strdup(outBuf.c_str());
194                 }
195         } else {
196                 DP_LOGD("No Implementation");
197                 return NULL;
198         }
199 }
200
201 Evas_Object *ViewItem::getGenlistIconCB(void *data, Evas_Object *obj,
202         const char *part)
203 {
204 //      DP_LOGD_FUNC();
205         if(!data || !obj || !part) {
206                 DP_LOGE("parameter is NULL");
207                 return NULL;
208         }
209
210         ViewItem *item = static_cast<ViewItem *>(data);
211         return item->getGenlistIcon(obj, part);
212 }
213
214 Evas_Object *ViewItem::getGenlistIcon(Evas_Object *obj, const char *part)
215 {
216         //DP_LOGD("ViewItem::getGenlistIcon:part[%s]state[%s]", part, stateStr());
217
218         if (elm_genlist_decorate_mode_get(obj) && isFinished()) {
219                 if (strncmp(part,"elm.edit.icon.1", strlen("elm.edit.icon.1")) == 0) {
220                         Evas_Object *checkBtn = elm_check_add(obj);
221                         elm_check_state_pointer_set(checkBtn, &m_checked);
222                         evas_object_smart_callback_add(checkBtn, "changed", checkChangedCB,
223                                 this);
224                         m_checkedBtn = checkBtn;
225                         return checkBtn;
226                 } else if (strncmp(part,"elm.edit.icon.2", strlen("elm.edit.icon.2")) ==
227                         0) {
228                         return NULL;
229                 }
230
231         }
232         /* elm.icon.2 should be checked prior to elm.icon */
233         if (strncmp(part,"elm.icon.2", strlen("elm.icon.2")) == 0) {
234                 if (state() == ITEM::RECEIVING_DOWNLOAD_INFO ||
235                         state() == ITEM::DOWNLOADING ||
236                         isPreparingDownload())
237                         return createCancelBtn(obj);
238                 else
239                         return NULL;
240         } else if (strncmp(part,"elm.icon.1", strlen("elm.icon.1")) == 0 ||
241                 strncmp(part, "elm.icon", strlen("elm.icon")) == 0) {
242 //      if (strncmp(part,"elm.icon.1", strlen("elm.icon.1")) == 0) {
243                 Evas_Object *icon = elm_icon_add(obj);
244                 elm_icon_file_set(icon, getIconPath(), NULL);
245                 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL,1,1);
246                 return icon;
247         } else if (strcmp(part,"elm.swallow.progress") == 0) {
248                 return createProgressBar(obj);
249 #ifndef _TIZEN_PUBLIC
250         } else if (strcmp(part,"elm.slide.swallow.1") == 0) {
251                 if (isFinished())
252                         return createDeleteBtn(obj);
253                 else
254                         return NULL;
255         } else if (strcmp(part,"elm.slide.swallow.2") == 0) {
256                 if (isFinishedWithErr())
257                         return createRetryBtn(obj);
258                 else
259                         return NULL;
260 #endif
261         } else {
262                 DP_LOGE("Cannot enter here");
263                 return NULL;
264         }
265 }
266
267 void ViewItem::checkChangedCB(void *data, Evas_Object *obj,
268         void *event_info)
269 {
270         DownloadView &view = DownloadView::getInstance();
271         DP_LOGD_FUNC();
272         //ViewItem *item = static_cast<ViewItem *>(data);
273         //DP_LOGD("checked[%d] viewItem[%p]",(bool)(item->checkedValue()),item);
274         view.handleCheckedState();
275 }
276
277 #ifndef _TIZEN_PUBLIC
278 void ViewItem::sweepRight()
279 {
280         DP_LOGD_FUNC();
281         if (!m_glItem) {
282                 DP_LOGE("genlist item is NULL");
283                 return;
284         }
285         elm_genlist_item_decorate_mode_set(m_glItem,"slide", EINA_TRUE);
286         elm_genlist_item_select_mode_set(m_glItem, ELM_OBJECT_SELECT_MODE_NONE);
287 }
288
289 void ViewItem::sweepLeft()
290 {
291         DP_LOGD_FUNC();
292         if (!m_glItem) {
293                 DP_LOGE("genlist item is NULL");
294                 return;
295         }
296         elm_genlist_item_decorate_mode_set(m_glItem,"slide", EINA_FALSE);
297         elm_genlist_item_select_mode_set(m_glItem, ELM_OBJECT_SELECT_MODE_NONE);
298 }
299 #endif
300
301 void ViewItem::clickedDeleteButton()
302 {
303         DP_LOGD("ViewItem::clickedDeleteButton()");
304         m_item->deleteFromDB();
305         destroy();
306 }
307
308 void ViewItem::clickedCancelButton()
309 {
310         DP_LOG("ViewItem::clickedCancelButton()");
311         requestCancel();
312 }
313
314 void ViewItem::requestCancel()
315 {
316         if (m_item) {
317                 m_item->cancel();
318         }
319 }
320
321 void ViewItem::clickedRetryButton()
322 {
323         DP_LOG_FUNC();
324         retryViewItem();
325 }
326
327 void ViewItem::clickedGenlistItem()
328 {
329         DownloadView &view = DownloadView::getInstance();
330         DP_LOG_FUNC();
331         if (!m_item) {
332                 DP_LOGE("m_item is NULL");
333                 return;
334         }
335         if (view.isGenlistEditMode()) {
336                 m_checked = !m_checked;
337                 if (m_checkedBtn)
338                         elm_genlist_item_fields_update(genlistItem(),"elm.edit.icon.1",
339                                 ELM_GENLIST_ITEM_FIELD_CONTENT);
340                 else
341                         DP_LOGE("m_checkedBtn is NULL");
342                 view.handleCheckedState();
343         } else if (state() == ITEM::FINISH_DOWNLOAD) {
344                 bool ret = m_item->play();
345                 if (ret == false) {
346                         string desc = __("IDS_BR_POP_UNABLE_TO_OPEN_FILE");
347                         view.showErrPopup(desc);
348                 }
349         } else if (isFinishedWithErr()) {
350                 retryViewItem();
351         }
352         elm_genlist_item_selected_set(genlistItem(), EINA_FALSE);
353 }
354
355 Elm_Genlist_Item_Class *ViewItem::elmGenlistStyle()
356 {
357         /* Change the genlist style class in case of download history item */
358         if (state() == ITEM::FINISH_DOWNLOAD)
359                 return &dldHistoryGenlistStyle;
360         else if (isFinishedWithErr())
361                  return &dldGenlistSlideStyle;
362         else
363                 return &dldGenlistStyle;
364 }
365
366 const char *ViewItem::getMessage()
367 {
368         DP_LOGD("ViewItem state() ITEM::[%d]", state());
369         const char *buff = NULL;
370         switch(state()) {
371         case ITEM::IDLE:
372         case ITEM::REQUESTING:
373         case ITEM::PREPARE_TO_RETRY:
374         case ITEM::RECEIVING_DOWNLOAD_INFO:
375         /* Do not display string and show only the progress bar */
376 //              buff = __("Check for download");
377                 buff = "";
378                 break;
379         case ITEM::DOWNLOADING:
380         case ITEM::SUSPENDED:
381                 buff = getHumanFriendlyBytesStr(receivedFileSize(), true);
382 //              DP_LOGD("%s", buff);
383                 break;
384         case ITEM::CANCEL:
385                 buff = S_("IDS_COM_POP_CANCELLED");
386                 break;
387         case ITEM::FAIL_TO_DOWNLOAD:
388                 buff = getErrMsg();
389                 break;
390         case ITEM::REGISTERING_TO_SYSTEM:
391                 buff = "";
392                 break;
393         case ITEM::FINISH_DOWNLOAD:
394                 buff =  __("IDS_EMAIL_BODY_COMPLETE");
395                 break;
396         default:
397                 buff = "";
398                 break;
399         }
400         return buff;
401 }
402
403 const char *ViewItem::getHumanFriendlyBytesStr(unsigned long int bytes,
404         bool progressOption)
405 {
406         double doubleTypeBytes = 0.0;
407         const char *unitStr[4] = {"B", "KB", "MB", "GB"};
408         int unit = 0;
409         unsigned long int unitBytes = bytes;
410
411         /* using bit operation to avoid floating point arithmetic */
412         for (unit=0; (unitBytes > 1024 && unit < 4) ; unit++) {
413                 unitBytes = unitBytes >> 10;
414         }
415
416         unitBytes = 1 << (10*unit);
417         doubleTypeBytes = ((double)bytes / (double)(unitBytes));
418         // FIXME following code should be broken into another function, but leave it now to save function call time.s
419         char str[32] = {0};
420         if (progressOption && fileSize() != 0) {
421                 /* using fixed point arithmetic to avoid floating point arithmetic */
422                 const int fixed_point = 6;
423                 unsigned long long int receivedBytes = receivedFileSize() << fixed_point;
424                 unsigned long long int result = (receivedBytes*100) / fileSize();
425                 unsigned long long int result_int = result >> fixed_point;
426                 unsigned long long int result_fraction = result &
427                         ~(0xFFFFFFFF << fixed_point);
428                 if (unit == 0)
429                         snprintf(str, sizeof(str), "%lu %s / %llu.%.2llu %%",
430                                 bytes, unitStr[unit], result_int, result_fraction);
431                 else
432                         snprintf(str, sizeof(str), "%.2f %s / %llu.%.2llu %%",
433                                 doubleTypeBytes, unitStr[unit], result_int, result_fraction);
434         } else {
435                 if (unit == 0)
436                         snprintf(str, sizeof(str), "%lu %s", bytes, unitStr[unit]);
437                 else
438                         snprintf(str, sizeof(str), "%.2f %s", doubleTypeBytes, unitStr[unit]);
439         }
440         return string(str).c_str();
441 }
442
443 unsigned long int ViewItem::receivedFileSize()
444 {
445         if (m_item)
446                 return m_item->receivedFileSize();
447
448         return 0;
449 }
450
451 unsigned long int ViewItem::fileSize()
452 {
453         if (m_item)
454                 return m_item->fileSize();
455
456         return 0;
457 }
458
459 const char *ViewItem::getTitle()
460 {
461         const char *title = NULL;
462         if (m_item)
463                 title = m_item->title().c_str();
464
465         if (!title)
466                 return S_("IDS_COM_BODY_NO_NAME");
467
468         return title;
469 }
470
471 Evas_Object *ViewItem::createProgressBar(Evas_Object *parent)
472 {
473         Evas_Object *progress = NULL;
474         if (!parent) {
475                 DP_LOGE("parent is NULL");
476                 return NULL;
477         }
478         progress = elm_progressbar_add(parent);
479         setProgressBar(progress);
480         if (isFinished()) {
481                 DP_LOGE("Cannot enter here. finished item has othere genlist style");
482                 return NULL;
483         }
484
485         if (fileSize() == 0 || isPreparingDownload()) {
486                 //DP_LOGD("Pending style::progressBar[%p]",progress);
487                 elm_object_style_set(progress, "pending_list");
488                 elm_progressbar_horizontal_set(progress, EINA_TRUE);
489                 evas_object_size_hint_align_set(progress, EVAS_HINT_FILL, EVAS_HINT_FILL);
490                 evas_object_size_hint_weight_set(progress, EVAS_HINT_EXPAND,
491                         EVAS_HINT_EXPAND);
492                 elm_progressbar_pulse(progress, EINA_TRUE);
493         } else {
494                 //DP_LOGD("List style::progressBar[%p] fileSize[%d] state[%d]",progress, fileSize(),state());
495                 elm_object_style_set(progress, "list_progress");
496                 elm_progressbar_horizontal_set(progress, EINA_TRUE);
497
498                 if (isCompletedDownload())
499                         elm_progressbar_value_set(progress, 1.0);
500                 /* When realized event is happened, the progress is created.
501                    This is needed for that case */
502                 else if (state() == ITEM::DOWNLOADING) {
503                         double percentageProgress = 0.0;
504                         percentageProgress = (double)(receivedFileSize()) /
505                                 (double)(fileSize());
506                         elm_progressbar_value_set(progress, percentageProgress);
507                 }
508         }
509         evas_object_show(progress);
510         return progress;
511 }
512
513 void ViewItem::updateCheckedBtn()
514 {
515         if (m_checkedBtn)
516                 elm_check_state_pointer_set(m_checkedBtn,&m_checked);
517 }
518
519 #ifndef _TIZEN_PUBLIC
520 Evas_Object *ViewItem::createDeleteBtn(Evas_Object *parent)
521 {
522         DP_LOGD("DeleteButton::create()");
523         Evas_Object *button = elm_button_add(parent);
524         elm_object_style_set(button, "text_only/sweep");
525         elm_object_text_set(button, S_("IDS_COM_OPT_DELETE"));
526         evas_object_propagate_events_set(button, EINA_FALSE);
527         evas_object_smart_callback_add(button ,"clicked", deleteBtnClickedCB, this);
528         return button;
529 }
530
531 Evas_Object *ViewItem::createRetryBtn(Evas_Object *parent)
532 {
533         DP_LOGD("DeleteButton::create()");
534         Evas_Object *button = elm_button_add(parent);
535         elm_object_style_set(button, "text_only/sweep");
536         elm_object_text_set(button, __("IDS_BR_SK_RETRY"));
537         evas_object_propagate_events_set(button, EINA_FALSE);
538         evas_object_smart_callback_add(button ,"clicked", retryBtnClickedCB, this);
539         return button;
540 }
541 #endif
542
543 void ViewItem::deleteBtnClickedCB(void *data, Evas_Object *obj, void *event_info)
544 {
545         DP_LOGD_FUNC();
546         if (!data) {
547                 DP_LOGE("data is NULL");
548                 return;
549         }
550         ViewItem *viewItem = static_cast<ViewItem *>(data);
551         viewItem->clickedDeleteButton();
552 }
553
554 void ViewItem::retryBtnClickedCB(void *data, Evas_Object *obj, void *event_info)
555 {
556         DP_LOGD_FUNC();
557         if (!data) {
558                 DP_LOGE("data is NULL");
559                 return;
560         }
561         ViewItem *viewItem = static_cast<ViewItem *>(data);
562         viewItem->clickedRetryButton();
563 }
564
565 Evas_Object *ViewItem::createCancelBtn(Evas_Object *parent)
566 {
567         DP_LOGD_FUNC();
568         Evas_Object *button = elm_button_add(parent);
569         elm_object_part_content_set(parent, "btn_style1", button);
570         elm_object_style_set(button, "style1/auto_expand");
571         evas_object_size_hint_aspect_set(button, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
572         elm_object_text_set(button, S_("IDS_COM_SK_CANCEL"));
573         evas_object_propagate_events_set(button, EINA_FALSE);
574         evas_object_smart_callback_add(button,"clicked", cancelBtnClickedCB, this);
575         return button;
576 }
577
578 void ViewItem::cancelBtnClickedCB(void *data, Evas_Object *obj, void *event_info)
579 {
580         DP_LOGD_FUNC();
581         if (!data) {
582                 DP_LOGE("data is NULL");
583                 return;
584         }
585         ViewItem *viewItem = static_cast<ViewItem *>(data);
586         viewItem->clickedCancelButton();
587 }
588
589 void ViewItem::extractDateGroupType()
590 {
591         DP_LOGD_FUNC();
592         /* History Item */
593         //DP_LOGD("state[%s],finishedTime[%ld]",stateStr(),finishedTime());
594         if (isFinished() && finishedTime() > 0) {
595                 int diffDay = 0;
596                 DateUtil &inst = DateUtil::getInstance();
597                 double nowTime = inst.nowTime();
598                 double finishTime = finishedTime();
599                 diffDay = inst.getDiffDays((time_t)nowTime, (time_t)finishTime);
600                 if (diffDay == 0)
601                         m_dateGroupType = DATETIME::DATE_TYPE_TODAY;
602                 else if (diffDay == 1)
603                         m_dateGroupType = DATETIME::DATE_TYPE_YESTERDAY;
604                 else if (diffDay > 1)
605                         m_dateGroupType = DATETIME::DATE_TYPE_PREVIOUS;
606                 else
607                         m_dateGroupType = DATETIME::DATE_TYPE_LATER;
608                 return;
609         }
610         /* Item which is added now or retrying item */
611         m_dateGroupType = DATETIME::DATE_TYPE_TODAY;
612 }
613
614
615 void ViewItem::retryViewItem(void)
616 {
617         DownloadView &view = DownloadView::getInstance();
618         DP_LOGD_FUNC();
619         if (m_item) {
620                 m_isRetryCase = true;
621                 m_item->clearForRetry();
622                 if (!m_item->retry()) {
623                         DownloadView &view = DownloadView::getInstance();
624                         string desc = S_("IDS_COM_POP_FAILED");
625                         view.showErrPopup(desc);
626                         m_item->deleteFromDB();
627                         m_item->destroy();
628                         return;
629                 }
630                 /* Move a item to Today group, if it is not included to Today group */
631                 view.moveRetryItem(this);
632         }
633 }