summaryrefslogtreecommitdiff
path: root/common/src/email-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/email-utils.c')
-rwxr-xr-xcommon/src/email-utils.c607
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 */