Use eina for logging (part 1)
[mokosuite2:libmokosuite.git] / utils / misc.c
1 #include "globals.h"
2 #include "misc.h"
3
4 #include <glib-object.h>
5 #include <glib/gi18n-lib.h>
6 #include <sys/stat.h>
7
8 #define DAYS(x)     (24*60*60*x)
9
10 /**
11  * Restituisce un attributo in una HashTable proveniente da FSO.
12  */
13 const char* map_get_attribute(GHashTable* properties, const char* key)
14 {
15     const char* value = NULL;
16     GValue* gval = NULL;
17
18     gval = g_hash_table_lookup(properties, key);
19     //g_debug("[%s] Type=%s", __func__, G_VALUE_TYPE_NAME(gval));
20
21     if (gval != NULL && G_VALUE_HOLDS_STRING(gval))
22         value = g_value_get_string(gval);
23
24     return value;
25 }
26
27 int map_get_attribute_int(GHashTable* properties, const char* key)
28 {
29     int value = 0;
30     GValue* gval = NULL;
31
32     gval = g_hash_table_lookup(properties, key);
33     //g_debug("[%s] Type=%s", __func__, G_VALUE_TYPE_NAME(gval));
34
35     if (gval != NULL && G_VALUE_HOLDS_INT(gval))
36         value = g_value_get_int(gval);
37
38     return value;
39 }
40
41 gboolean map_get_attribute_bool(GHashTable* properties, const char* key, gboolean fallback_int)
42 {
43     gboolean value = FALSE;
44     GValue* gval = NULL;
45
46     gval = g_hash_table_lookup(properties, key);
47     //g_debug("[%s] Type=%s", __func__, G_VALUE_TYPE_NAME(gval));
48
49     if (gval != NULL) {
50         if (G_VALUE_HOLDS_BOOLEAN(gval))
51             value = g_value_get_boolean(gval);
52         else if (fallback_int && G_VALUE_HOLDS_INT(gval))
53             value = g_value_get_int(gval);
54     }
55
56     return value;
57 }
58
59 void g_value_free(gpointer data)
60 {
61     GValue* value = data;
62     g_value_unset(value);
63     g_free(value);
64 }
65
66 GValue* g_value_from_string(const char* string)
67 {
68     GValue* value = g_new0(GValue, 1);
69     g_value_init(value, G_TYPE_STRING);
70     g_value_set_string(value, string);
71
72     return value;
73 }
74
75 GValue* g_value_from_int(int number)
76 {
77     GValue* value = g_new0(GValue, 1);
78     g_value_init(value, G_TYPE_INT);
79     g_value_set_int(value, number);
80
81     return value;
82 }
83
84 guint64 get_current_time(void)
85 {
86     GTimeVal tv = {0};
87     g_get_current_time(&tv);
88
89     return (guint64)tv.tv_sec;
90 }
91
92 /**
93  * Restituisce una rappresentazione sensata del timestamp passato.
94  * La stringa è già tradotta e andrà liberata.
95  */
96 char* get_time_repr(guint64 timestamp)
97 {
98     guint64 now = get_current_time();
99     gint64 diff = now - timestamp;  // differenza
100
101     struct tm* timestamp_tm = localtime((const time_t*)&timestamp);
102
103     char* ret = NULL;
104     char strf[100+1] = {0, };
105
106     //g_debug("now(%llu) - timestamp(%llu) = %lld", now, timestamp, diff);
107
108     if (diff < DAYS(1)) {
109         strftime(strf, 100, "%H:%M", timestamp_tm);
110         ret = g_strdup(strf);
111     }
112
113     else if (diff < DAYS(2)) {
114         ret = g_strdup(_("Yesterday"));
115     }
116
117     // FIXME calcolo dinamico giorni
118     else if (diff < DAYS(3)) {
119         ret = g_strdup(_("2 days ago"));
120     }
121
122     //else if (diff > DAYS(2) && diff < DAYS(... TODO
123
124     else {
125         strftime(strf, 100, "%d %b", timestamp_tm);
126         ret = g_strdup(strf);
127     }
128
129     //g_debug("Returning time repr: \"%s\"", ret);
130     return ret;
131 }
132
133 char* get_time_repr_full(guint64 timestamp)
134 {
135     char strf[100+1] = {0, };
136     struct tm* timestamp_tm = localtime((const time_t*)&timestamp);
137
138     strftime(strf, 100, "%F %T", timestamp_tm);
139     return g_strdup(strf);
140 }
141
142 time_t get_modification_time(const char* path)
143 {
144     struct stat st = {0};
145     return (!stat(path, &st)) ? st.st_mtime : -1;
146 }