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