multiparty details should support long numbers and names.
[profile/ivi/lemolo.git] / dialer / util.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include <Eina.h>
6 #include <time.h>
7
8 #define MINUTE 60
9 #define HOUR ((MINUTE) * 60)
10 #define DAY ((HOUR) * 24)
11 #define MONTH ((DAY) * 30)
12 #define YEAR ((MONTH) *12)
13
14 /* TODO: find a configurable way to format the number.
15  * Right now it's: 1-234-567-8901 as per
16  * http://en.wikipedia.org/wiki/Local_conventions_for_writing_telephone_numbers#North_America
17  *
18  * IDEA: use ordered set of regexp -> replacement.
19  */
20 char *phone_format(const char *number)
21 {
22         size_t i, slen;
23         Eina_Strbuf *d;
24         char *ret;
25
26         if (!number)
27                 return NULL;
28
29         slen = strlen(number);
30         if (slen < 1)
31                 return NULL;
32
33         if ((slen <= 4) || (slen > 12))
34                 goto show_verbatim;
35
36         if ((slen == 12) && (number[0] != '+'))
37                 goto show_verbatim;
38
39         for (i = 0; i < slen; i++) {
40                 if ((number[i] < '0') || (number[i] > '9')) {
41                         if ((number[i] == '+') && (i == 0))
42                                 continue;
43                         goto show_verbatim;
44                 }
45         }
46
47         d = eina_strbuf_new();
48         eina_strbuf_append_length(d, number, slen);
49         eina_strbuf_insert_char(d, '-', slen - 4);
50         if (slen > 7) {
51                 eina_strbuf_insert_char(d, '-', slen - 7);
52                 if ((slen > 10) && (number[slen - 11] != '+'))
53                         eina_strbuf_insert_char(d, '-', slen - 10);
54         }
55
56         ret = eina_strbuf_string_steal(d);
57         eina_strbuf_free(d);
58         return ret;
59
60 show_verbatim:
61         return strdup(number);
62 }
63
64 char *date_format(time_t date)
65 {
66         time_t now = time(NULL);
67         double dt = difftime(now, date);
68         char *buf;
69         int r;
70
71         if (dt < 30)
72                 r = asprintf(&buf, "Just now");
73         else if (dt < (MINUTE + 30))
74                 r = asprintf(&buf, "One minute ago");
75         else if (dt < (HOUR + 100))
76                 r = asprintf(&buf, "%d minutes ago", (int)dt/60);
77         else if (dt < (HOUR * 4))
78                 r = asprintf(&buf, "%d hours ago", (int)dt/3600);
79         else if (dt < DAY) {
80                 struct tm *f_time = gmtime(&date);
81                 EINA_SAFETY_ON_NULL_GOTO(f_time, err_gmtime);
82                 r = asprintf(&buf,  "%02d:%02d", f_time->tm_hour,
83                                 f_time->tm_min);
84         } else if(dt < MONTH){
85                 struct tm f_time;
86                 struct tm f_now;
87                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&now, &f_now), err_gmtime);
88                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&date, &f_time), err_gmtime);
89                 r = asprintf(&buf, "%d days ago",
90                                 f_now.tm_mday - f_time.tm_mday);
91         } else if (dt < YEAR) {
92                 struct tm f_time;
93                 struct tm f_now;
94                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&now, &f_now), err_gmtime);
95                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&date, &f_time), err_gmtime);
96                 r = asprintf(&buf, "%d months ago",
97                                 f_now.tm_mon - f_time.tm_mon);
98         } else {
99                 struct tm f_time;
100                 struct tm f_now;
101                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&now, &f_now), err_gmtime);
102                 EINA_SAFETY_ON_NULL_GOTO(gmtime_r(&date, &f_time), err_gmtime);
103                 r = asprintf(&buf, "%d years ago",
104                                 f_now.tm_year - f_time.tm_year);
105         }
106
107         if (r < 0)
108                 buf = strdup("");
109
110         return buf;
111
112 err_gmtime:
113         return strdup("");
114 }