diff options
Diffstat (limited to 'common/src/email-utils.c')
-rwxr-xr-x | common/src/email-utils.c | 607 |
1 files changed, 597 insertions, 10 deletions
diff --git a/common/src/email-utils.c b/common/src/email-utils.c index 741a5d1..40f6d19 100755 --- a/common/src/email-utils.c +++ b/common/src/email-utils.c @@ -37,6 +37,34 @@ static UDateFormat *icu_formatter_EEEMMMd = NULL; enum appcore_time_format icu_timeformat; +enum { + EMAIL_GROUP_UNKNOWN = -1, + EMAIL_GROUP_TODAY, + EMAIL_GROUP_YESTERDAY, + EMAIL_GROUP_SUN, + EMAIL_GROUP_MON, + EMAIL_GROUP_TUE, + EMAIL_GROUP_WED, + EMAIL_GROUP_THU, + EMAIL_GROUP_LASTWEEK, + EMAIL_GROUP_TWOWEEKS_AGO, + EMAIL_GROUP_THREEWEEKS_AGO, + EMAIL_GROUP_EARLIER_THISMONTH, + EMAIL_GROUP_LASTMONTH, + EMAIL_GROUP_OLDER, + EMAIL_GROUP_UNREAD, + EMAIL_GROUP_READ, + EMAIL_GROUP_FAVORITES, + EMAIL_GROUP_ATTACHMENTS, + EMAIL_GROUP_OTHER, + EMAIL_GROUP_PRIORITY_HIGH, + EMAIL_GROUP_PRIORITY_NORMAL, + EMAIL_GROUP_PRIORITY_LOW, + EMAIL_GROUP_MAX, +}; + + +static gboolean _copy_actual_file(const char *src_full_path, const char *dest_full_path, gboolean(*copy_file_cb) (float percentage)); static void _generate_best_pattern(const char *locale, UChar * customSkeleton, char *formattedString, void *time); static int _open_icu_pattern_n_formatter(const char *locale, char *skeleton, UDateFormat **formatter); static int _close_icu_pattern_n_formatter(UDateFormat *formatter); @@ -119,11 +147,6 @@ gchar *email_parse_get_filename_from_path(const gchar *path) g_strfreev(token_list); /* MUST BE. */ - /*token_list = g_strsplit_set(file_name, ".", -1); - RETURN_VAL_IF_FAIL(token_list != NULL, NULL); - gchar *file_name_without_ext = g_strdup(token_list[0]); - g_strfreev(token_list);*/ - int len = 0; if (file_name) len = strlen(file_name); @@ -163,11 +186,6 @@ void email_parse_get_filename_n_ext_from_path(const gchar *path, gchar **ret_fil g_strfreev(token_list); /* MUST BE. */ - /*token_list = g_strsplit_set(file_name, ".", -1); - RETURN_VAL_IF_FAIL(token_list != NULL, NULL); - gchar *file_name_without_ext = g_strdup(token_list[0]); - g_strfreev(token_list);*/ - int len = 0; if (file_name) len = strlen(file_name); @@ -183,6 +201,27 @@ void email_parse_get_filename_n_ext_from_path(const gchar *path, gchar **ret_fil g_free(file_name); } +gchar *email_parse_get_filepath_from_path(const gchar *path) +{ + debug_log(""); + RETURN_VAL_IF_FAIL(STR_VALID(path), NULL); + + gchar *file_path = NULL; + gint i = 0; + gint size = STR_LEN((gchar *)path); + + for (i = (size - 1); i >= 0; --i) { + if (path[i] == '/') { + file_path = g_strndup(path, i + 1); + break; + } + } + + debug_log("file path (%s)", file_path); + + return file_path; +} + void email_save_file(const gchar *path, const gchar *buf, gsize len) { debug_log(""); @@ -331,6 +370,215 @@ gboolean email_get_address_validation(const char *address) return ret; } +gchar *email_cut_text_by_byte_len(const gchar *text, gint len) +{ + debug_log(""); + RETURN_VAL_IF_FAIL(STR_VALID(text), NULL); + RETURN_VAL_IF_FAIL(len > 0, NULL); + + gint char_len2 = g_utf8_strlen(text, len); + gchar *offset = g_utf8_offset_to_pointer(text, char_len2); + + gchar *ret_text = (gchar *)g_malloc0(offset - text + 1); + + STR_NCPY(ret_text, (gchar *)text, offset - text); + + return ret_text; +} + +static int is_yesterday(struct tm *req_tm, struct tm *now_tm) +{ + if (now_tm->tm_yday == 0) { /* It is the first day of year */ + if (req_tm->tm_year == now_tm->tm_year-1 && req_tm->tm_mon == 12 && req_tm->tm_mday == 31) + return 1; + else + return 0; + } else { + if (req_tm->tm_year == now_tm->tm_year && req_tm->tm_yday == now_tm->tm_yday - 1) + return 1; + else + return 0; + } +} + +static int is_today(struct tm *req_tm, struct tm *now_tm) +{ + if (req_tm->tm_year == now_tm->tm_year && req_tm->tm_yday == now_tm->tm_yday) + return 1; + else + return 0; +} + +static int is_nth_weeks_ago(struct tm *req_tm, struct tm *now_tm, int num) +{ + time_t req = mktime(req_tm); + time_t now = mktime(now_tm); + time_t nth_begin = 0, nth_end = 0; + nth_end = now - (now_tm->tm_wday * 3600 * 24 + now_tm->tm_hour * 3600 + now_tm->tm_min * 60 + now_tm->tm_sec) - ((num - 1) * 7 * 3600 * 24); + nth_begin = now - (now_tm->tm_wday * 3600 * 24 + now_tm->tm_hour * 3600 + now_tm->tm_min * 60 + now_tm->tm_sec) - (num * 7 * 3600 * 24); + + if(req > nth_begin && req < nth_end) + return 1; + else + return 0; +} + +static int is_lastmonth(struct tm *req_tm, struct tm *now_tm) +{ + if((req_tm->tm_year == now_tm->tm_year - 1) && (req_tm->tm_mon == 11) && (now_tm->tm_mon == 0)) + return 1; + else if((req_tm->tm_year == now_tm->tm_year) && (req_tm->tm_mon == now_tm->tm_mon - 1)) + return 1; + else + return 0; +} + +int email_get_group_title_str(const time_t req_time, gchar **group_title, + gchar **group_date) +{ + debug_log(""); + RETURN_VAL_IF_FAIL(group_title != NULL, 0); + RETURN_VAL_IF_FAIL(group_date != NULL, 0); + + int groupIndex = EMAIL_GROUP_UNKNOWN; + tzset(); /* MUST BE. */ + + time_t now_time = time(NULL); + + struct tm *dummy = localtime(&now_time); + struct tm now_tm; + memcpy(&now_tm, dummy, sizeof(struct tm)); + + dummy = localtime(&req_time); + struct tm req_tm; + memcpy(&req_tm, dummy, sizeof(struct tm)); + + if (is_today(&req_tm, &now_tm) || req_time > now_time /*future mail :)*/) { + *group_title = g_strdup(dgettext("sys_string", "IDS_COM_BODY_TODAY")); + *group_date = email_get_date_text_with_formatter(icu_formatter_EEEMMMd, (void *)&req_time); + groupIndex = EMAIL_GROUP_TODAY; + } + else if (is_yesterday(&req_tm, &now_tm)) { + *group_title = g_strdup(dgettext("sys_string", "IDS_COM_BODY_YESTERDAY")); + *group_date = email_get_date_text_with_formatter(icu_formatter_EEEMMMd, (void *)&req_time); + groupIndex = EMAIL_GROUP_YESTERDAY; + } + else if (is_nth_weeks_ago(&req_tm, &now_tm, 0)) { + switch(req_tm.tm_wday) + { + case 0: + *group_title = g_strdup(_("IDS_EMAIL_BODY_SUNDAY")); + groupIndex = EMAIL_GROUP_SUN; + break; + case 1: + *group_title = g_strdup(_("IDS_EMAIL_BODY_MONDAY")); + groupIndex = EMAIL_GROUP_MON; + break; + case 2: + *group_title = g_strdup(_("IDS_EMAIL_BODY_TUESDAY")); + groupIndex = EMAIL_GROUP_TUE; + break; + case 3: + *group_title = g_strdup(_("IDS_EMAIL_BODY_WEDNESDAY")); + groupIndex = EMAIL_GROUP_WED; + break; + case 4: + *group_title = g_strdup(_("IDS_EMAIL_BODY_THURSDAY")); + groupIndex = EMAIL_GROUP_THU; + break; + case 5: + *group_title = g_strdup(_("IDS_EMAIL_BODY_FRIDAY")); + groupIndex = EMAIL_GROUP_THU; + break; + case 6: + *group_title = g_strdup(_("IDS_EMAIL_BODY_SATURDAY")); + groupIndex = EMAIL_GROUP_THU; + break; + default: + debug_log("invalid date"); + break; + } + *group_date = email_get_date_text_with_formatter(icu_formatter_EEEMMMd, (void *)&req_time); + } + else if(is_nth_weeks_ago(&req_tm, &now_tm, 1)) { + *group_title = g_strdup(_("IDS_EMAIL_BODY_LAST_WEEK")); + groupIndex = EMAIL_GROUP_LASTWEEK; + *group_date = NULL; + } + else if(is_nth_weeks_ago(&req_tm, &now_tm, 2)) { + char str[MAX_STR_LEN] = { 0, }; + snprintf(str, sizeof(str), _("IDS_EMAIL_BODY_PD_WEEKS_AGO"), 2); + *group_title = g_strdup(str); + groupIndex = EMAIL_GROUP_TWOWEEKS_AGO; + *group_date = NULL; + } + else if(is_nth_weeks_ago(&req_tm, &now_tm, 3)) { + char str[MAX_STR_LEN] = { 0, }; + snprintf(str, sizeof(str), _("IDS_EMAIL_BODY_PD_WEEKS_AGO"), 3); + *group_title = g_strdup(str); + groupIndex = EMAIL_GROUP_THREEWEEKS_AGO; + *group_date = NULL; + } + else if((req_tm.tm_year == now_tm.tm_year) && (req_tm.tm_mon == now_tm.tm_mon)) { + *group_title = g_strdup(N_("Earlier this Month")); + groupIndex = EMAIL_GROUP_EARLIER_THISMONTH; + *group_date = NULL; + } + else if(is_lastmonth(&req_tm, &now_tm)) { + *group_title = g_strdup(_("IDS_EMAIL_BODY_LAST_MONTH")); + groupIndex = EMAIL_GROUP_LASTMONTH; + *group_date = NULL; + } + else { + *group_title = g_strdup(_("IDS_EMAIL_BODY_OLDER_M_HISTORY")); + groupIndex = EMAIL_GROUP_OLDER; + *group_date = NULL; + } + + /*debug_log("-now : %d.%d (%d)", now_tm.tm_year + 1900, now_tm.tm_yday, now_time); + debug_log("-req : %d.%d (%d)", req_tm.tm_year + 1900, req_tm.tm_yday, req_time); + debug_log("(%s) (%s)", *group_title, *group_date);*/ + + return groupIndex; +} + +char *email_get_str_datetime(const time_t req_time) +{ + debug_log(""); + + tzset(); /* MUST BE. */ + + time_t now_time = time(NULL); + + struct tm *dummy = localtime(&now_time); + struct tm now_tm; + memcpy(&now_tm, dummy, sizeof(struct tm)); + + dummy = localtime(&req_time); + struct tm req_tm; + memcpy(&req_tm, dummy, sizeof(struct tm)); + + /*debug_log("*now : %d.%d.%d", now_tm.tm_year + 1900, now_tm.tm_mon, now_tm.tm_mday); + debug_log("*req : %d.%d.%d", req_tm.tm_year + 1900, req_tm.tm_mon, req_tm.tm_mday);*/ + + char *datetime = ({ + char *_ret_str = NULL; + if (is_today(&req_tm, &now_tm) || is_yesterday(&req_tm, &now_tm) || + req_time > now_time) /* sometimes, future mail arrives :) */ { + /* today or yesterday */ + _ret_str = (icu_timeformat == APPCORE_TIME_FORMAT_12)? + email_get_date_text_with_formatter(icu_formatter_hmm, (void *)&req_time): + email_get_date_text_with_formatter(icu_formatter_Hmm, (void *)&req_time); + } else if (req_tm.tm_year < now_tm.tm_year) /* previous year */ + _ret_str = email_get_date_text_with_formatter(icu_formatter_MMMyyyy, (void *)&req_time); + else /* days before yesterday in this year */ + _ret_str = email_get_date_text_with_formatter(icu_formatter_MMMd, (void *)&req_time); + _ret_str; + }); + + return datetime; +} + char *email_get_date_text(const char *locale, char *skeleton, void *time) { debug_log(""); @@ -343,6 +591,27 @@ char *email_get_date_text(const char *locale, char *skeleton, void *time) return g_strdup(formattedString); } +char *email_get_date_text_with_formatter(UDateFormat *formatter, void *time) +{ + debug_log(""); + char formattedString[128] = { 0, }; + + UErrorCode status = U_ZERO_ERROR; + UDate date = 0; + UChar formatted[64] = { 0, }; + int32_t formattedCapacity; + int32_t formattedLength; + + formattedCapacity = (int32_t) (sizeof(formatted) / sizeof(formatted[0])); + if (time) { + time_t msg_time = *(time_t *)time; + date = (UDate)msg_time * 1000; /* Equivalent to Date = ucal_getNow() in Milliseconds */ + } + formattedLength = udat_format(formatter, date, formatted, formattedCapacity, NULL, &status); + u_austrncpy(formattedString, formatted, 128); + return g_strdup(formattedString); +} + int email_open_icu_pattern_generator(void) { debug_log(""); @@ -445,6 +714,227 @@ static void _generate_best_pattern(const char *locale, UChar * customSkeleton, c udat_close(formatter); } +void _create_download_folder() +{ + debug_log(""); + + if (!email_check_dir_exist(DIR_DEFAULT_MEDIA_PHONE"/Downloads")) { + int nErr = -1; + nErr = mkdir(DIR_DEFAULT_MEDIA_PHONE"/Downloads", 0755); + debug_log("errno: %d", nErr); + if (nErr == -1) + debug_log("Downloads folder creation failed"); + } else + debug_log("Downloads folder already exists."); +} + +int email_attachments_save_file(const gchar *path, gchar *newpath, gboolean(*copy_file_cb) (float percentage)) +{ + debug_log(""); + RETURN_VAL_IF_FAIL(STR_VALID(path), EMAIL_EXT_SAVE_ERR_UNKNOWN); + + gchar new_path[MAX_DEFAULT_DIR_PATH] = { 0, }; + gchar tmp_path[MAX_DEFAULT_DIR_PATH] = { 0, }; + gchar new_filename[MAX_DEFAULT_DIR_PATH] = { 0, }; + gchar prefix[MAX_DEFAULT_DIR_PATH] = { 0, }; + gboolean saved = FALSE; + gint err = 0; + gint max_length = MAX_DEFAULT_DIR_PATH; + + snprintf(prefix, sizeof(prefix), "%s", DIR_DEFAULT_MEDIA_PHONE"/Downloads"); + + debug_log("prefix:%s", prefix); + + memset(new_path, 0, sizeof(MAX_DEFAULT_DIR_PATH)); + memset(tmp_path, 0, sizeof(MAX_DEFAULT_DIR_PATH)); + + if (STR_LEN(tmp_path) == 0) { + g_sprintf(tmp_path, "%s", path); + } + + gchar *file_name = NULL; + gchar *file_ext = NULL; + gchar *file_path = email_parse_get_filepath_from_path(tmp_path); + email_parse_get_filename_n_ext_from_path(tmp_path, &file_name, &file_ext); + + debug_log("file_name:%s", file_name); + debug_log("file_ext:%s", file_ext); + + if (file_ext == NULL) + file_ext = ""; + + if (STR_VALID(file_name) && file_ext != NULL) { + debug_log(""); + if (STR_LEN(file_name) + STR_LEN(file_ext) > max_length - STR_LEN(prefix)) { + gint available_len = max_length - STR_LEN(prefix); + + if (STR_VALID(file_ext)) { + available_len -= STR_LEN(file_ext); + } + + gchar *new_name = email_cut_text_by_byte_len(file_name, available_len); + + if (STR_VALID(new_name)) { + g_sprintf(new_path, "%s/%s%s", prefix, new_name, file_ext); + g_sprintf(new_filename, "%s%s", new_name, file_ext); + g_free(new_name); /* MUST BE. */ + } + } else { + g_sprintf(new_path, "%s/%s%s", prefix, file_name, file_ext); + } + } + + if (STR_VALID(file_path)) { + g_free(file_path); /* MUST BE. */ + } + + if (STR_VALID(file_name)) { + g_free(file_name); /* MUST BE. */ + } + + if (STR_VALID(file_ext)) { + g_free(file_ext); /* MUST BE. */ + } + + debug_log("new_path:%s", new_path); + + /* Move for DRM file */ + + _create_download_folder(); + + /* Copy for non-DRM */ + if (access(new_path, F_OK) != -1) { + debug_log("file existed"); + err = EMAIL_EXT_SAVE_ERR_ALREADY_EXIST; + } else { + saved = _copy_actual_file(path, new_path, copy_file_cb); + debug_log("saved(%d), err(%d), errno(%d)", saved, err, errno); + + if (saved) + err = EMAIL_EXT_SAVE_ERR_NONE; + else + err = EMAIL_EXT_SAVE_ERR_UNKNOWN; + } + + snprintf(newpath, MAX_STR_LEN, "%s", new_path); + + return err; +} + +static gboolean _copy_actual_file(const char *src_full_path, const char *dest_full_path, gboolean(*copy_file_cb) (float percentage)) +{ + debug_log(""); + FILE *fs = NULL; + FILE *fd = NULL; + char buff[4096] = { 0, }; + int n = 0; + gboolean result = FALSE; + gboolean stop_copying = FALSE; + int m = 0; + int cnt = 0; + struct stat statbuf = { 0 }; + int ret = 0; + int total_size = 0; + int copied_size = 0; + gboolean remove_dest = FALSE; + clock_t begin; + clock_t finish; /* consumed time to copy whole file */ + double totaltime; + float percentage = 0.0; + + fs = fopen(src_full_path, "rb"); + if (fs == NULL) { + int err = errno; + debug_log("fopen error(%d)", err); + return FALSE; + } + + ret = fstat(fileno(fs), &statbuf); + if (ret != 0) { + debug_log("fstat error"); + fclose(fs); + return FALSE; + } + + total_size = (int)statbuf.st_size; + + fseek(fs, 0, SEEK_SET); + + fd = fopen(dest_full_path, "wb"); + + remove_dest = TRUE; + + if (fd == NULL) { + int err = errno; + debug_log("fopen error(%d)", err); + fclose(fs); + return FALSE; + } + + fseek(fd, 0, SEEK_SET); + + copied_size = 0; + + begin = clock(); + + while (1) { + result = feof(fs); + if (!result) { + n = fread(buff, sizeof(char), sizeof(buff), fs); + if (n > 0) { + m = fwrite(buff, sizeof(char), n, fd); + if (m <= 0) { + debug_log("fwrite = %d", m); + result = FALSE; + goto CATCH; + } + + cnt++; + copied_size += m; + + if (cnt > 100) { + percentage = ((float)(total_size - copied_size) / (float)total_size) * 100.0; + if (copy_file_cb) + stop_copying = copy_file_cb(percentage); + + if (stop_copying) { + result = FALSE; + remove_dest = TRUE; + goto CATCH; + } + + cnt = 0; + } + } else { + result = TRUE; + goto CATCH; + } + } else { + result = TRUE; + goto CATCH; + } + } + + CATCH: + fflush(fd); + fsync(fileno(fd)); + fclose(fd); + fclose(fs); + + if (remove_dest && result == FALSE) { + remove(dest_full_path); + sync(); + } + + if (result) { + finish = clock(); + totaltime = (double)(finish - begin) / CLOCKS_PER_SEC; + debug_log("takes %f s to copy %s", totaltime, src_full_path); + } + + return result; +} + gboolean email_drm_file_is_right(const gchar *path) { RETURN_VAL_IF_FAIL(STR_VALID(path), FALSE); @@ -482,4 +972,101 @@ gboolean email_drm_file_forward_lock_check(const gchar *path) return FALSE; } + + +static int termination_flag = 0; +static int pause_flag = 0; + +void set_app_terminated() +{ + termination_flag = 1; +} + +int get_app_terminated() +{ + return termination_flag; +} + +void set_app_paused() +{ + pause_flag = 1; +} + +void reset_app_paused() +{ + pause_flag = 0; +} + +int get_app_paused() +{ + return pause_flag; +} + +char* email_util_strrtrim(char* s) +{ + char t[MAX_STR_LEN]; + char *end; + + strcpy(t, s); + end = t + strlen(t) - 1; + while (end != t && isspace(*end)) + { + end--; + } + *(end + 1) = '\0'; + s = t; + + debug_log("result [%s]", s); + return s; +} + +char* email_util_strltrim(char* s) +{ + char* begin; + begin = s; + + while (*begin != '\0') { + if (isspace(*begin)) + begin++; + else { + s = begin; + break; + } + } + + debug_log("result [%s]", s); + return s; +} + +char* email_util_get_parent_folder(char *s) +{ + gchar **vector = NULL; + vector = g_strsplit_set(s, "/", -1); + int vlen = g_strv_length(vector); + gchar *foler_name = g_strdup(vector[vlen-1]); + gchar* retval = g_strdup(s); + gchar* ptr = NULL; + ptr = g_strstr_len(retval, -1, foler_name); + + debug_log("input [%s], vlen(%d)", s, vlen); + + if (ptr != NULL && vlen > 1){ + gchar* temp = g_strndup(retval, ptr-retval-1); + g_free(retval); + retval = g_strdup(temp); + g_free(temp); + + debug_log("foler_name [%s], retval[%s]", foler_name, retval); + + g_free(foler_name); + return retval; + } + else + { + debug_log("foler_name [%s]: parent == root. ", foler_name); + g_free(foler_name); + return NULL; + } +} + /* EOF */ |