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 #include <metadata_extractor.h>
19 #include <image_util.h>
23 #include "email-debug.h"
24 #include "email-composer.h"
25 #include "email-composer-util.h"
26 #include "email-composer-attachment.h"
27 #include "email-composer-filetype.h"
28 #include "email-composer-callback.h"
29 #include "email-composer-recipient.h"
30 #include "email-composer-js.h"
32 static int toggle = 0;
33 static Evas_Object *_g_attach_btn;
35 EmailComposerUGD *g_ugd;
37 static void _composer_attachment_delete_icon_clicked_cb(void *data, Evas_Object *obj, void *event_info);
38 static void _composer_attachment_contracted_item_clicked_cb(void *data, Evas_Object *obj, void *event_info);
39 static void _composer_attachment_unfocus(void *data, Evas_Object *obj, const char *emission, const char *source);
40 static void _composer_attachment_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
43 * Returns total size of attachments including attachments, inline images and new files to be attached/inserted.
45 * @param [in] ugd composer ui gadget data
46 * @param [in] files_list contains 'to be attached/inserted' filepaths. NULL is passed if there is no new files
48 * @return total size or -1 incase of 'stat' error
50 int _composer_get_attachments_total_size(EmailComposerUGD *ugd)
56 int total_attachments_size = 0;
58 struct stat file_info;
61 Eina_Iterator *it = NULL;
62 Evas_Object *attachment_obj = NULL;
63 email_attachment_data_t *attachment_data = NULL;
65 it = eina_list_iterator_new(ugd->attachment_item_obj_list);
67 while (eina_iterator_next(it, (void **)&attachment_obj)) {
69 attachment_data = evas_object_data_get(attachment_obj, "attachment_data");
71 if (attachment_data) {
73 if ((return_stat = stat(attachment_data->attachment_path, &file_info)) == -1) {
74 debug_error("stat Error(%d): %s", errno, strerror(errno));
75 attach_size += attachment_data->attachment_size;
79 debug_log("file size in byte : %d", file_info.st_size);
81 attach_size += file_info.st_size;
86 eina_iterator_free(it);
89 if (EINA_TRUE == ugd->has_body_html) {
91 inline_size = _composer_get_inline_images_size(ugd);
92 if (inline_size < 0) {
93 debug_log("Failed to get inline images total size");
94 return COMPOSER_ERROR_INVALID_FILE_SIZE;
98 debug_log("existing attachments size = %d, existing inline images size = %d", attach_size, inline_size);
100 total_attachments_size = inline_size + attach_size;
102 debug_log("total size = %d", total_attachments_size);
104 return total_attachments_size;
108 * Returns total size of files
110 * @param [in] files_list contains file paths
112 * @return total size or -1 incase of 'stat' error
114 int _composer_get_files_size(Eina_List *files_list)
119 return COMPOSER_ERROR_NULL_POINTER;
121 Eina_List *list = files_list;
128 EINA_LIST_FOREACH(list, l, recv) {
129 debug_log("File : %s", recv);
131 if (ecore_file_exists(recv))
132 file_size = ecore_file_size(recv);
135 debug_log("file_size : %d", file_size);
136 temp_size = temp_size + file_size;
137 debug_log("total_size : %d", temp_size);
140 debug_log("Files total size : %d", temp_size);
145 * Returns total size of inline images in mail body
147 * @param [in] ugd composer ui gadget data
149 * @return total size or -1 incase of 'stat' error
151 int _composer_get_inline_images_size(EmailComposerUGD *ugd)
156 if (EINA_TRUE == ugd->has_body_html) {
157 debug_log("attachment_inline_item_list count : %d", eina_list_count(ugd->attachment_inline_item_list));
158 if (eina_list_count(ugd->attachment_inline_item_list) > 0) {
160 Eina_List *list = ugd->attachment_inline_item_list;
162 email_attachment_data_t *attachment_data = NULL;
164 Eina_List *inline_list = NULL;
166 EINA_LIST_FOREACH(list, l, attachment_data) {
167 if (attachment_data != NULL) {
168 if (attachment_data->attachment_path != NULL) {
169 debug_log("Inline image : %s", attachment_data->attachment_path);
170 inline_list = eina_list_append(inline_list, attachment_data->attachment_path);
174 if (eina_list_count(inline_list) > 0 && (inline_list != NULL)) {
175 total_size = _composer_get_files_size(inline_list); // -1 on 'stat' error of inline image file
178 eina_list_free(inline_list);
182 debug_log("Inline images total size : %d", total_size);
186 void _composer_attachment_reset(EmailComposerUGD *ugd)
190 Eina_Iterator *it = NULL;
191 Evas_Object *attachment_obj = NULL;
192 email_attachment_data_t *attachment_data = NULL;
194 it = eina_list_iterator_new(ugd->attachment_item_obj_list);
196 while (eina_iterator_next(it, (void **)&attachment_obj)) {
198 attachment_data = evas_object_data_get(attachment_obj, "attachment_data");
200 if (attachment_data) {
201 debug_log("attachment_data file name to be removed : %s", attachment_data->attachment_path);
203 email_free_attachment_data(&attachment_data, 1);
204 attachment_data = NULL;
207 elm_box_unpack(ugd->attachment_item_box, attachment_obj);
208 evas_object_del(attachment_obj);
211 if (ugd->new_mail_info) {
212 if (ugd->new_mail_info->mail_data) {
213 ugd->new_mail_info->mail_data->attachment_count = 0;
217 if (ugd->attachment_item_box) {
218 evas_object_del(ugd->attachment_item_box);
219 ugd->attachment_item_box = NULL;
223 eina_iterator_free(it);
226 if (ugd->attachment_item_obj_list) {
227 eina_list_free(ugd->attachment_item_obj_list);
228 ugd->attachment_item_obj_list = NULL;
231 if (ugd->attachment_contracted_item) {
232 elm_box_unpack(ugd->attachment_item_box, ugd->attachment_contracted_item);
233 evas_object_del(ugd->attachment_contracted_item);
234 ugd->attachment_contracted_item = NULL;
238 void _composer_attachment_create_list(EmailComposerUGD *ugd, Eina_List *attachment_list, Eina_Bool is_inline)
242 if (attachment_list == NULL)
245 int nTobeAttachedCount = eina_list_count(attachment_list);
246 debug_log("nTobeAttachedCount : %d", nTobeAttachedCount);
248 if (nTobeAttachedCount <= 0)
251 int nAttachmentObjListCount = eina_list_count(ugd->attachment_item_obj_list);
252 debug_log("nAttachmentObjListCount : %d", nAttachmentObjListCount);
254 if (ugd->attachment_item_box == NULL) {
255 Evas_Object *attachment_item_box;
256 attachment_item_box = _composer_create_box(ugd->main_layout);
257 elm_object_focus_allow_set(attachment_item_box, EINA_TRUE);
258 elm_object_part_content_set(ugd->c_layout, "_attachment_field", attachment_item_box);
259 ugd->attachment_item_box = attachment_item_box;
261 _composer_attachment_expand_items(ugd);
264 bool bDuplicated = FALSE;
268 struct stat file_info;
271 email_attachment_data_t *attachment_data = NULL;
273 int nCount = nAttachmentObjListCount;
274 int total_attachments_size = _composer_get_attachments_total_size(ugd);
276 EINA_LIST_FOREACH(attachment_list, l, recv) {
278 bDuplicated = _composer_attachment_duplicate_check(ugd, recv);
281 debug_log("Attachment is duplicated");
283 if (ugd->composer_noti) {
284 evas_object_del(ugd->composer_noti);
285 ugd->composer_noti = NULL;
287 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), _("IDS_EMAIL_POP_FILE_ALREADY_EXISTS"), 0, NULL, NULL, 2.0,
288 _composer_noti_response_cb);
294 EINA_LIST_FOREACH(attachment_list, l, recv) {
296 bDuplicated = _composer_attachment_duplicate_check(ugd, recv);
301 if ((return_stat = stat(recv, &file_info)) == -1) {
302 debug_error("stat Error(%d): %s", errno, strerror(errno));
303 eina_list_free(attachment_list);
304 attachment_list = NULL;
306 if (ugd->composer_noti) {
307 evas_object_del(ugd->composer_noti);
308 ugd->composer_noti = NULL;
310 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
311 _("IDS_EMAIL_POP_UNABLE_TO_ATTACH_FILE"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
315 total_attachments_size += file_info.st_size;
317 if (total_attachments_size > MAX_ATTACHMENT_SIZE) {
318 debug_log("Total size is over");
320 char msg[MAX_STR_LEN] = { 0, };
321 snprintf(msg, sizeof(msg), _("IDS_EMAIL_POP_UNABLE_TO_ATTACH_MAXIMUM_SIZE_OF_FILES_IS_PD_KB"), MAX_ATTACHMENT_SIZE / 1024);
323 if (ugd->composer_noti) {
324 evas_object_del(ugd->composer_noti);
325 ugd->composer_noti = NULL;
327 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), msg, 0, NULL, NULL, 2.0,
328 _composer_noti_response_cb);
330 eina_list_free(attachment_list);
331 attachment_list = NULL;
336 if (nCount >= MAX_ATTACHMENT_ITEM) {
337 debug_log("Total count is over");
339 char msg[MAX_STR_LEN] = { 0, };
340 snprintf(msg, sizeof(msg), _("IDS_EMAIL_POP_UNABLE_TO_ATTACH_MAXIMUM_NUMBER_OF_FILES_IS_PD"), MAX_ATTACHMENT_ITEM);
342 if (ugd->composer_noti) {
343 evas_object_del(ugd->composer_noti);
344 ugd->composer_noti = NULL;
346 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), msg, 0, NULL, NULL, 2.0,
347 _composer_noti_response_cb);
349 eina_list_free(attachment_list);
350 attachment_list = NULL;
355 attachment_data = (email_attachment_data_t *)calloc(1, sizeof(email_attachment_data_t));
358 tokens = g_strsplit(recv, "/", -1);
360 attachment_data->attachment_name = COMPOSER_STRDUP(tokens[g_strv_length(tokens) - 1]);
361 attachment_data->attachment_path = COMPOSER_STRDUP(recv);
362 attachment_data->save_status = 1;
363 attachment_data->attachment_size = file_info.st_size;
366 attachment_data->inline_content_status = 1;
368 debug_log("attachment_name = %s, attachment_path = %s", attachment_data->attachment_name, attachment_data->attachment_path);
372 _composer_attachment_create_list_box(ugd, attachment_data);
377 if (_composer_check_recipient_is_empty(ugd)) {
378 if (!ugd->bSendBtnDisabled) {
379 elm_object_disabled_set(ugd->send_btn, EINA_TRUE);
380 elm_object_disabled_set(ugd->send_btm_btn, EINA_TRUE);
381 ugd->bSendBtnDisabled = true;
384 if (ugd->bSendBtnDisabled) {
385 elm_object_disabled_set(ugd->send_btn, EINA_FALSE);
386 elm_object_disabled_set(ugd->send_btm_btn, EINA_FALSE);
387 ugd->bSendBtnDisabled = false;
391 eina_list_free(attachment_list);
392 attachment_list = NULL;
394 _composer_attachment_contract_items(ugd);
397 void _composer_attachment_create_list_box(EmailComposerUGD *ugd, email_attachment_data_t *attachment_data)
399 debug_log("file path: %s", attachment_data->attachment_path);
401 if (attachment_data->inline_content_status == EINA_FALSE) {
404 Evas_Object *attachment_item = elm_layout_add(ugd->attachment_item_box);
406 elm_layout_file_set(attachment_item, COMPOSER_EDJ_NAME, "layout.attachment");
407 evas_object_size_hint_weight_set(attachment_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
408 evas_object_size_hint_align_set(attachment_item, EVAS_HINT_FILL, EVAS_HINT_FILL);
410 Evas_Object *delete_icon = NULL;
412 _composer_attachment_add_thumbnail(ugd, attachment_item, attachment_data->attachment_path);
413 delete_icon = _composer_attachment_add_delete_icon(ugd, attachment_item);
414 _composer_attachment_add_filename(ugd, attachment_data, attachment_item);
416 Evas_Object *attachment_base = elm_layout_add(ugd->attachment_item_box);
417 elm_layout_theme_set(attachment_base, "layout", "application", "noindicator");
418 evas_object_size_hint_weight_set(attachment_base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
419 evas_object_size_hint_align_set(attachment_base, EVAS_HINT_FILL, EVAS_HINT_FILL);
420 evas_object_show(attachment_base);
421 elm_object_part_content_set(attachment_base, "elm.swallow.content", attachment_item);
423 elm_box_pack_end(ugd->attachment_item_box, attachment_base);
424 evas_object_show(attachment_base);
426 evas_object_data_set(delete_icon, "delete_attachment", attachment_base);
428 ugd->attachment_item_obj_list = eina_list_append(ugd->attachment_item_obj_list, attachment_base);
429 _composer_attachment_set_attach_data(ugd, attachment_base, attachment_data);
431 if (attachment_data->attachment_path) {
432 edje_object_signal_callback_add(_EDJ(attachment_item), "clicked", "*", _composer_attachment_mouse_clicked, attachment_data);
434 edje_object_signal_callback_add(_EDJ(attachment_item), "clicked", "*", _composer_attachment_unfocus, ugd);
436 Evas_Object *attachment_base = elm_layout_add(ugd->attachment_item_box);
438 ugd->attachment_item_obj_list = eina_list_append(ugd->attachment_item_obj_list, attachment_base);
439 _composer_attachment_set_attach_data(ugd, attachment_base, attachment_data);
443 void _composer_attachment_update_thumbnail(EmailComposerUGD *ugd, Evas_Object *parent, char *filePath)
447 Evas_Object *thumb_nail;
448 const char *path = NULL;
450 thumb_nail = elm_object_part_content_get(parent, "attachment.thumbnail.icon");
452 if (thumb_nail != NULL) {
453 evas_object_del(thumb_nail);
457 if (ugd->attachment_list_compressed) {
458 thumb_nail = elm_icon_add(parent);
460 path = g_strdup(COMPOSER_ICON_DIR "/05_email_icon_attach_40x40.png");
461 debug_log("path = %s", path);
462 elm_image_file_set(thumb_nail, path, NULL);
465 debug_log("savename = %s", filePath);
467 thumb_nail = elm_icon_add(parent);
469 path = g_strdup(MYFILE_IMGE_PATH "/myfile_icon_etc.png");
470 elm_image_file_set(thumb_nail, path, NULL);
472 thumb_nail = _composer_attachment_make_thumbnail(ugd, filePath, parent);
476 elm_object_part_content_set(parent, "attachment.thumbnail.icon", thumb_nail);
477 evas_object_show(thumb_nail);
480 g_free((char *)path);
483 void _composer_attachment_add_thumbnail(EmailComposerUGD *ugd, Evas_Object *parent, char *filePath)
487 Evas_Object *thumb_nail;
488 const char *path = NULL;
490 if (ugd->attachment_list_compressed) {
491 thumb_nail = elm_icon_add(parent);
493 path = g_strdup(COMPOSER_ICON_DIR "/05_email_icon_attach_40x40.png");
494 debug_log("path = %s", path);
495 elm_image_file_set(thumb_nail, path, NULL);
498 debug_log("savename = %s", filePath);
500 thumb_nail = elm_icon_add(parent);
502 path = g_strdup(MYFILE_IMGE_PATH "/myfile_icon_etc.png");
503 elm_image_file_set(thumb_nail, path, NULL);
505 thumb_nail = _composer_attachment_make_thumbnail(ugd, filePath, parent);
509 elm_object_part_content_set(parent, "attachment.thumbnail.icon", thumb_nail);
510 evas_object_show(thumb_nail);
513 g_free((char *)path);
516 Evas_Object *_composer_attachment_add_delete_icon(EmailComposerUGD *ugd, Evas_Object *parent)
520 Evas_Object *delete_icon = elm_button_add(parent);
521 evas_object_show(delete_icon);
523 if (ugd->attachment_list_compressed) {
524 _g_attach_btn = delete_icon;
525 elm_object_style_set(delete_icon, "expand/closed");
526 elm_object_part_content_set(parent, "attachment.delete.icon", delete_icon);
528 evas_object_smart_callback_add(delete_icon, "clicked", _composer_attachment_contracted_item_clicked_cb, ugd);
530 elm_object_style_set(delete_icon, "minus");
531 elm_object_part_content_set(parent, "attachment.delete.icon", delete_icon);
533 evas_object_smart_callback_add(delete_icon, "clicked", _composer_attachment_delete_icon_clicked_cb, ugd);
539 void _composer_attachment_add_filename(EmailComposerUGD *ugd, email_attachment_data_t * attachment_data, Evas_Object *parent)
545 char file_string[256] = { 0, };
547 if (ugd->attachment_list_compressed) {
548 size = _composer_get_attachments_total_size(ugd);
550 char temp_name[128] = { 0, };
551 snprintf(temp_name, sizeof(temp_name), _("IDS_EMAIL_BODY_PD_ATTACHMENTS"), eina_list_count(ugd->attachment_item_obj_list));
552 file_name = g_strdup(temp_name);
554 if (ugd->new_mail_info->mail_data->file_path_html && (g_strcmp0(ugd->new_mail_info->mail_data->file_path_html, attachment_data->attachment_path) == 0)) {
555 size = email_get_file_size(attachment_data->attachment_path);
556 debug_log("Original html body size(%d)", size);
558 size = attachment_data->attachment_size;
559 debug_log("Attachment size(%d)", size);
561 file_name = g_strdup(attachment_data->attachment_name);
564 char *file_size = (char *)email_get_file_size_string((guint64)size);
566 snprintf(file_string, sizeof(file_string), "%s (%s)", file_name, file_size);
567 edje_object_part_text_set(_EDJ(parent), "attachment.filename", file_string);
573 Evas_Object *_composer_attachment_make_thumbnail(EmailComposerUGD *ugd, char *filePath, Evas_Object *parent)
577 Evas_Object *icon = NULL;
578 icon = elm_icon_add(parent);
581 const char *key = NULL;
585 debug_log("file path: %s", filePath);
587 char *m_type = (char *)efreet_mime_type_get(ecore_file_file_get(filePath));
590 type = g_strdup(m_type);
592 debug_log("mime type: %s", type);
593 efreet_mime_shutdown();
595 char thumb_path[MAX_ATTACHMENT_FILE_LEN + 1] = { 0, };
597 path = g_strdup(ATTACHMENT_ETC_FILE_PATH);
599 char *temp = g_strdup(filePath);
600 char *temp_filepath = g_strdup(filePath);
601 char *token = strtok(temp, "/");
604 token = strtok(NULL, "/");
608 struct _mtd *mtd = (struct _mtd *)mtd_main;
610 while (mtd && mtd->key) {
611 if (strncmp(type, mtd->key, strlen(type)) == 0) {
617 path = g_strdup(mtd->icon_path);
623 debug_log("file path : %s", filePath);
625 if (strncmp(type, ATTACHMENT_MEDIA_IMAGE, 5) == 0 || strncmp(type, ATTACHMENT_MEDIA_VIDEO, 5) == 0) {
626 int err = _composer_attachment_make_ethumb(filePath, thumb_path);
628 if (err != COMPOSER_ERROR_NONE)
630 } else if (strncmp(type, ATTACHMENT_MEDIA_AUDIO, 5) == 0) {
631 metadata_extractor_h metadata = NULL;
632 int ret = METADATA_EXTRACTOR_ERROR_NONE;
633 void *artwork = NULL;
634 int artwork_size = 0;
635 char *artwork_mime = NULL;
637 ret = metadata_extractor_create(&metadata);
638 debug_log("metadata_extractor_create: %d", ret);
640 debug_log("metadata extractor create failed");
644 ret = metadata_extractor_set_path(metadata, filePath);
645 debug_log("metadata_extractor_set_path: %d", ret);
647 ret = metadata_extractor_get_artwork(metadata, &artwork, &artwork_size, &artwork_mime);
648 debug_log("metadata_extractor_get_artwork: %d", ret);
649 debug_log("artwork_mime: %s, artwork_size: %d", artwork_mime, artwork_size);
652 gchar *mm_path = NULL;
653 int fd = g_file_open_tmp(NULL, &mm_path, NULL);
656 FILE *fp = fdopen(fd, "w");
658 debug_log("fail to fdopen()");
661 if (fwrite((unsigned char *)artwork, 1, artwork_size, fp) != artwork_size/*1*/) {
662 debug_log("fail to fwrite()");
673 snprintf(thumb_path, sizeof(thumb_path), "%s", mm_path);
675 debug_log("file : %s, album art_path : %s", filePath, thumb_path);
686 g_free(artwork_mime);
688 ret = metadata_extractor_destroy(metadata);
689 debug_log("metadata_extractor_destroy: %d", ret);
693 token = strtok(temp_filepath, ".");
695 token = strtok(NULL, ".");
697 if (g_strcmp0(token, ATTACHMENT_MEDIA_VCALENDAR) == 0) {
698 snprintf(thumb_path, sizeof(thumb_path), "%s", ATTACHMENT_VCALENDAR_FILE_PATH);
699 } else if (g_strcmp0(token, ATTACHMENT_MEDIA_VCARD) == 0) {
700 snprintf(thumb_path, sizeof(thumb_path), "%s", ATTACHMENT_VCARD_FILE_PATH);
703 debug_log("thumb_path: %s", thumb_path);
706 if (strlen(thumb_path)) {
707 elm_image_file_set(icon, thumb_path, NULL);
709 elm_image_file_set(icon, path, key);
714 if (strncmp(type, ATTACHMENT_MEDIA_IMAGE, 5) == 0) {
715 _composer_make_default_thumbnail(icon, filePath, COMPOSER_ATTACHMENT_ITEM_IMAGE);
716 } else if (strncmp(type, ATTACHMENT_MEDIA_AUDIO, 5) == 0) {
717 _composer_make_default_thumbnail(icon, filePath, COMPOSER_ATTACHMENT_ITEM_SOUND);
718 } else if (strncmp(type, ATTACHMENT_MEDIA_VIDEO, 5) == 0) {
719 _composer_make_default_thumbnail(icon, filePath, COMPOSER_ATTACHMENT_ITEM_VIDEO);
721 _composer_make_default_thumbnail(icon, filePath, COMPOSER_ATTACHMENT_ITEM_ETC);
743 temp_filepath = NULL;
749 int _composer_attachment_make_ethumb(const char *source, char *target)
753 /* debug_log("file path: %s", source);
755 char *type = (char *)efreet_mime_type_get(ecore_file_file_get(source));
756 char *mime_type = g_strdup(type);
757 debug_log("mime type: %s", mime_type);
758 efreet_mime_shutdown();
761 if (strncmp(mime_type, "image", 5) == 0) {
762 strncpy(target, source, MAX_ATTACHMENT_FILE_LEN);
764 } else if (strncmp(mime_type, "video", 5) == 0) {*/
765 metadata_extractor_h metadata = NULL;
766 int ret = METADATA_EXTRACTOR_ERROR_NONE;
767 char *video_width = NULL;
768 char *video_height = NULL;
769 char *video_track_cnt = NULL;
770 void *video_thumbnail = NULL;
771 int video_thumbnail_len = 0;
775 ret = metadata_extractor_create(&metadata);
776 debug_log("metadata_extractor_create: %d", ret);
778 debug_log("metadata extractor create failed");
779 return COMPOSER_ERROR_ETHUMB_FAIL;
782 ret = metadata_extractor_set_path(metadata, source);
783 debug_log("metadata_extractor_set_path: %d", ret);
785 ret = metadata_extractor_get_metadata(metadata, METADATA_VIDEO_WIDTH, &video_width);
786 debug_log("metadata_extractor_get_metadata: %d [video_width:%s]", ret, video_width);
787 ret = metadata_extractor_get_metadata(metadata, METADATA_VIDEO_HEIGHT, &video_height);
788 debug_log("metadata_extractor_get_metadata: %d [video_height:%s]", ret, video_height);
789 ret = metadata_extractor_get_metadata(metadata, METADATA_HAS_VIDEO, &video_track_cnt);
790 debug_log("metadata_extractor_get_metadata: %d [video_track_cnt:%s]", ret, video_track_cnt);
792 ret = metadata_extractor_get_frame(metadata, &video_thumbnail, &video_thumbnail_len);
793 debug_log("metadata_extractor_get_frame: %d (video_thumbnail_len:%d)", ret, video_thumbnail_len);
795 if (video_thumbnail) {
797 char filename[MAX_ATTACHMENT_FILE_LEN] = { 0, };
798 char *file_name = NULL;
799 char *file_ext = NULL;
801 email_parse_get_filename_n_ext_from_path(source, &file_name, &file_ext);
802 snprintf(filename, sizeof(filename), "%s%s%s%s", EMAIL_TMP_FOLDER"/", file_name, file_ext, ".jpg");
807 video_w = atoi(video_width);
809 video_h = atoi(video_height);
810 mm_ret = image_util_encode_jpeg(video_thumbnail,
812 IMAGE_UTIL_COLORSPACE_RGB888, 70, filename);
814 if (ecore_file_exists(filename)) {
815 strncpy(target, filename, MAX_ATTACHMENT_FILE_LEN);
816 debug_log("file : %s, thumb_path : %s", source, target);
818 g_free(video_thumbnail);
824 g_free(video_height);
826 g_free(video_track_cnt);
828 ret = metadata_extractor_destroy(metadata);
829 debug_log("metadata_extractor_destroy: %d", ret);
835 return COMPOSER_ERROR_NONE;
838 void _composer_ethumb_generate_cb(void *data, Ethumb *e, Eina_Bool success)
840 if (success == EINA_TRUE) {
841 debug_log("Succeed in thumbnail generation");
843 debug_log("Fail to create thumbnail");
847 void _composer_attachment_set_attach_data(EmailComposerUGD *ugd, Evas_Object *parent, email_attachment_data_t *attachment_data)
851 evas_object_data_set(parent, "attachment_data", attachment_data);
854 static void _composer_attachment_delete_item_from_fw_attachment_list(EmailComposerUGD *ugd, email_attachment_data_t *attachment_data)
859 debug_log("ugd == NULL");
862 debug_log("1. %d", g_list_length(ugd->fw_attachment_list));
864 for (i = 0; i < g_list_length(ugd->fw_attachment_list); ++i) {
865 EMAIL_ATTACHMENT_INFO_S *info = (EMAIL_ATTACHMENT_INFO_S *) g_list_nth_data(ugd->fw_attachment_list, i);
866 debug_log("%x", info);
868 debug_log("%d , %d", info->attach_id, attachment_data->attachment_id);
869 if (info->attach_id == attachment_data->attachment_id) {
870 ugd->fw_attachment_list = g_list_remove(ugd->fw_attachment_list, info);
871 debug_log("2. %d", g_list_length(ugd->fw_attachment_list));
872 ugd->fw_dn_cnt = g_list_length(ugd->fw_attachment_list);
877 if (ugd->fw_dn_cnt == 0)
878 ugd->need_download = EINA_FALSE;
881 static void _composer_attachment_delete_icon_clicked_cb(void *data, Evas_Object *obj, void *event_info)
891 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
893 if (EINA_FALSE == ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_GET_IMAGE_LIST, _composer_get_image_list_cb, (void *)ugd)) {
894 debug_log("COMPOSER_JS_GET_IMAGE_LIST error.");
897 Evas_Object *object = NULL;
898 object = evas_object_data_get(obj, "delete_attachment");
900 ugd->attachment_item_obj_list = eina_list_remove(ugd->attachment_item_obj_list, object);
902 email_attachment_data_t *attachment_data = NULL;
903 attachment_data = evas_object_data_get(object, "attachment_data");
905 _composer_attachment_delete_item_from_fw_attachment_list(ugd, attachment_data);
907 elm_box_unpack(ugd->attachment_item_box, object);
908 evas_object_del(object);
910 if (ugd->attachment_contracted_item) {
911 Evas_Object *contracted_item = evas_object_data_get(ugd->attachment_contracted_item, "attachment_item");
912 debug_log("contracted_item = %p", contracted_item);
913 if (eina_list_count(ugd->attachment_item_obj_list) < 2) {
914 elm_box_unpack(ugd->attachment_item_box, ugd->attachment_contracted_item);
915 evas_object_del(ugd->attachment_contracted_item);
916 ugd->attachment_contracted_item = NULL;
917 ugd->attachment_list_compressed = FALSE;
918 _composer_attachment_add_filename(ugd, attachment_data, contracted_item);
920 ugd->attachment_list_compressed = TRUE;
921 _composer_attachment_add_filename(ugd, attachment_data, contracted_item);
922 ugd->attachment_list_compressed = FALSE;
926 if (ugd->attachment_item_obj_list == NULL) {
927 ugd->selected_entry = ugd->priv_selected_entry;
928 ugd->priv_selected_entry = NULL;
931 if (attachment_data) {
932 debug_log("attachment_data file name = %s", attachment_data->attachment_path);
934 email_free_attachment_data(&attachment_data, 1);
935 attachment_data = NULL;
938 _composer_mbe_set_focus(ugd);
940 elm_box_recalculate(ugd->attachment_item_box);
941 elm_layout_sizing_eval(ugd->main_layout);
944 bool _composer_attachment_duplicate_check(EmailComposerUGD *ugd, char *pszAttachedFilePath)
946 debug_log("to be attached file path : %s", pszAttachedFilePath);
951 bool bDuplicated = FALSE;
953 Eina_Iterator *it = NULL;
954 Evas_Object *attachment_obj = NULL;
955 email_attachment_data_t *attachment_data = NULL;
957 it = eina_list_iterator_new(ugd->attachment_item_obj_list);
959 while (eina_iterator_next(it, (void **)&attachment_obj)) {
960 attachment_data = evas_object_data_get(attachment_obj, "attachment_data");
962 debug_log("attachment_data->attachment_path = %s", attachment_data->attachment_path);
963 if (attachment_data->attachment_path != NULL) {
964 if (strcmp(pszAttachedFilePath, attachment_data->attachment_path) == 0) {
965 debug_log("Attached file path is duplicated");
973 eina_iterator_free(it);
979 void _composer_attachment_expand_items(EmailComposerUGD *ugd)
983 if (ugd->attachment_list_compressed == EINA_FALSE)
986 Eina_List *list = NULL;
987 Evas_Object *attachment_item = NULL;
989 EINA_LIST_FOREACH(ugd->attachment_item_obj_list, list, attachment_item) {
990 if (attachment_item) {
991 elm_box_pack_end(ugd->attachment_item_box, attachment_item);
992 evas_object_show(attachment_item);
996 ugd->attachment_list_compressed = EINA_FALSE;
998 elm_box_recalculate(ugd->attachment_item_box);
999 elm_layout_sizing_eval(ugd->main_layout);
1002 void _composer_attachment_contract_items(EmailComposerUGD *ugd)
1006 int nAttachmentObjCount = eina_list_count(ugd->attachment_item_obj_list);
1008 debug_log("attachment_count = %d", nAttachmentObjCount);
1009 debug_log("attachment_list_compressed = %d", ugd->attachment_list_compressed);
1011 if (nAttachmentObjCount > 1 && !ugd->attachment_list_compressed) {
1012 ugd->attachment_list_compressed = EINA_TRUE;
1014 Eina_List *list = NULL;
1015 Evas_Object *attachment_item = NULL;
1017 EINA_LIST_FOREACH(ugd->attachment_item_obj_list, list, attachment_item) {
1018 if (attachment_item) {
1019 elm_box_unpack(ugd->attachment_item_box, attachment_item);
1020 evas_object_hide(attachment_item);
1024 if (ugd->attachment_contracted_item) {
1025 Evas_Object *contracted_item = evas_object_data_get(ugd->attachment_contracted_item, "attachment_item");
1026 debug_log("contracted_item = %p", contracted_item);
1027 _composer_attachment_add_filename(ugd, NULL, contracted_item);
1029 _composer_attachment_create_contracted_box(ugd);
1034 snprintf(buf, sizeof(buf), "expand/closed");
1035 elm_object_style_set(_g_attach_btn, buf);
1040 elm_box_recalculate(ugd->attachment_item_box);
1041 elm_layout_sizing_eval(ugd->main_layout);
1044 void _composer_attachment_create_contracted_box(EmailComposerUGD *ugd)
1048 Evas_Object *contracted_item = NULL;
1049 contracted_item = elm_layout_add(ugd->attachment_item_box);
1051 elm_layout_file_set(contracted_item, COMPOSER_EDJ_NAME, "layout.attachment");
1052 evas_object_size_hint_weight_set(contracted_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1053 evas_object_size_hint_align_set(contracted_item, EVAS_HINT_FILL, EVAS_HINT_FILL);
1055 _composer_attachment_add_thumbnail(ugd, contracted_item, NULL);
1056 _composer_attachment_add_delete_icon(ugd, contracted_item);
1057 _composer_attachment_add_filename(ugd, NULL, contracted_item);
1059 Evas_Object *contracted_base = elm_layout_add(ugd->attachment_item_box);
1060 elm_layout_theme_set(contracted_base, "layout", "application", "noindicator");
1061 evas_object_size_hint_weight_set(contracted_base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1062 evas_object_size_hint_align_set(contracted_base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1064 evas_object_show(contracted_base);
1065 elm_object_part_content_set(contracted_base, "elm.swallow.content", contracted_item);
1067 elm_box_pack_start(ugd->attachment_item_box, contracted_base);
1069 ugd->attachment_contracted_item = contracted_base;
1071 evas_object_show(contracted_base);
1073 evas_object_data_set(ugd->attachment_contracted_item, "attachment_item", contracted_item);
1076 static void _composer_attachment_contracted_item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
1080 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
1083 Evas_Object *btn = obj;
1086 /* expand button closed style */
1087 snprintf(buf, sizeof(buf), "expand/opened");
1088 elm_object_style_set(btn, buf);
1090 if (ugd->selected_entry == ugd->body_ewkview) {
1091 debug_log("Webkit unfocused");
1092 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
1093 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_UNFOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
1094 debug_log("COMPOSER_JS_SET_UNFOCUS failed.");
1097 elm_object_focus_set(obj, EINA_TRUE);
1099 _composer_attachment_expand_items(ugd);
1101 ugd->priv_selected_entry = ugd->selected_entry;
1102 ugd->selected_entry = ugd->attachment_contracted_item;
1106 /* expand button opened style */
1107 snprintf(buf, sizeof(buf), "expand/closed");
1108 elm_object_style_set(btn, buf);
1110 if (ugd->selected_entry == ugd->body_ewkview) {
1111 debug_log("Webkit unfocused");
1112 evas_object_focus_set(ugd->body_ewkview, EINA_FALSE);
1113 if (ewk_view_script_execute(ugd->body_ewkview, COMPOSER_JS_SET_UNFOCUS, _composer_script_executed_cb, NULL) == EINA_FALSE)
1114 debug_log("COMPOSER_JS_SET_UNFOCUS failed.");
1117 elm_object_focus_set(obj, EINA_TRUE);
1119 _composer_attachment_contract_items(ugd);
1121 ugd->priv_selected_entry = ugd->selected_entry;
1122 ugd->selected_entry = ugd->attachment_contracted_item;
1128 static void _composer_attachment_mouse_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
1132 email_attachment_data_t *item_list = (email_attachment_data_t *) data;
1134 debug_log("savename = %s", item_list->attachment_path);
1137 service_h service = NULL;
1138 ret = service_create(&service);
1139 debug_log("service_create: %d", ret);
1141 debug_log("service create failed");
1144 ret = service_set_operation(service, SERVICE_OPERATION_VIEW);
1145 debug_log("service_set_operation: %d", ret);
1146 ret = service_set_uri(service, item_list->attachment_path);
1147 debug_log("service_set_uri: %d", ret);
1148 ret = service_add_extra_data(service, EMAIL_BUNDLE_KEY_VIDEO_PLAYER_LAUNCH_APP, "email");
1149 debug_log("service_add_extra_data: %d", ret);
1150 ret = service_send_launch_request(service, NULL, NULL);
1151 debug_log("service_send_launch_request: %d", ret);
1152 if (ret != SERVICE_ERROR_NONE) {
1153 if (g_ugd->composer_noti) {
1154 evas_object_del(g_ugd->composer_noti);
1155 g_ugd->composer_noti = NULL;
1157 g_ugd->composer_noti = _composer_create_noti(g_ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
1158 _("IDS_EMAIL_POP_THIS_ATTACHMENT_CANNOT_BE_DISPLAYED"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
1160 ret = service_destroy(service);
1161 debug_log("service_destroy: %d", ret);
1164 static void _composer_attachment_unfocus(void *data, Evas_Object *obj, const char *emission, const char *source)
1168 EmailComposerUGD *ugd = (EmailComposerUGD *)data;
1170 Evas_Object *mbe = NULL;
1171 if (ugd->selected_entry == ugd->to_mbe_entry)
1173 else if (ugd->selected_entry == ugd->cc_mbe_entry)
1175 else if (ugd->selected_entry == ugd->bcc_mbe_entry)
1178 /* For unfocus TO mbe */
1180 elm_object_focus_set(ugd->to_mbe, EINA_FALSE);
1182 elm_object_focus_set(ugd->cc_mbe, EINA_FALSE);
1184 elm_object_focus_set(ugd->bcc_mbe, EINA_FALSE);