09572e51f66fdc563a6b39453288bc8e798c0756
[apps/core/preloaded/calendar.git] / ug / edit / ug-edit.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (the "License");
6   *  you may not use this file except in compliance with the License.
7   *  You may obtain a copy of the License at
8   *
9   *       http://www.tizenopensource.org/license
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17
18
19 #include <ui-gadget-module.h>
20 #include <libintl.h>
21 #include <appcore-common.h>
22
23 #include "view.h"
24
25 #define MAX_STR_LEN                             1024
26
27 // TODO: get full path from caller
28 #define VFILE_PATH "/opt/data/ug-calendar"
29
30 static void __cal_edit_ug_init_base_time(ug_data *ugd)
31 {
32         if (NULL == ugd)
33         {
34                 return;
35         }
36         struct tm tm;
37         time_t now;
38
39         now = time(NULL);
40         localtime_r(&now, &tm);
41         tm.tm_min = 0; // min, sec reset for mktime()
42         tm.tm_sec = 0;
43
44         ugd->today_tm = tm;
45         ugd->base_tm = ugd->today_tm;
46 }
47
48 static Evas_Object *__cal_edit_ug_create_layout(Evas_Object *parent, ug_data *ugd)
49 {
50         ugd->base = cal_util_add_layout(parent, NULL);
51         CAL_ASSERT(ugd->base);
52
53         ugd->nv = elm_naviframe_add(parent);
54         CAL_ASSERT(ugd->nv);
55
56         ugd->bg = cal_util_add_bg(ugd->base, EINA_FALSE);
57         CAL_ASSERT(ugd->bg);
58
59         elm_object_part_content_set(ugd->base, "elm.swallow.content", ugd->nv);
60         elm_object_part_content_set(ugd->base, "elm.swallow.bg", ugd->bg);
61         elm_object_theme_set(ugd->nv, ugd->theme);
62
63         ugd->u_type = UG_EDIT;
64
65         __cal_edit_ug_init_base_time(ugd);
66
67         cal_edit_create_view(ugd, ugd->nv);
68
69         return ugd->base;
70 }
71
72 static void __cal_edit_ug_get_strnote(ug_data *ugd, service_h service)
73 {
74         c_ret_if(!ugd);
75         c_ret_if(!service);
76
77         char *str = NULL;
78         char *strnote = NULL;
79         int strnote_len = 0 ;
80         char strnote_tag[MAX_STR_LEN]= {0, };
81
82         if ((0 != ugd->account_id) && (0 != ugd->mail_id) && (NULL != ugd->src_box)) {
83
84                 int r = service_get_extra_data(service, "note", &str);
85                 c_ret_if(r != SERVICE_ERROR_NONE);
86
87                 snprintf(strnote_tag, sizeof(strnote_tag), "%s%d_%d_%s", EMAIL_LINK_FLAG, ugd->account_id, ugd->mail_id, ugd->src_box);
88                 strnote_len = strlen(str)+strlen(strnote_tag);
89
90                 CAL_CALLOC(strnote, strnote_len+1, char);
91                 if (strnote) {
92                         snprintf(strnote, strnote_len+1, "%s%s", str, strnote_tag);
93                         ugd->strnote = strdup(strnote);
94                         free(strnote);
95                 }
96
97                 free(str);
98         } else {
99                 int r = service_get_extra_data(service, "note", &str);
100                 c_ret_if(r != SERVICE_ERROR_NONE);
101
102                 ugd->strnote = str;
103         }
104 }
105 static void __cal_edit_ug_get_bundle_parameter(ug_data *ugd, service_h service)
106 {
107         c_ret_if(!ugd);
108         c_ret_if(!service);
109
110         char *str = NULL;
111         time_t t = time(NULL);
112         struct tm cur_tm;
113         struct tm *returned_tm = gmtime_r(&t, &cur_tm);
114         c_ret_if(!returned_tm);
115
116         //year
117         int r = service_get_extra_data(service, "year", &str);
118         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
119         if (str) {
120                 ugd->tm_year = atoi(str);
121
122                 free(str);
123
124                 str = NULL;
125         } else {
126                 ugd->tm_year = cur_tm.tm_year;
127         }
128
129         //month
130         r = service_get_extra_data(service, "month", &str);
131         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
132         if (str) {
133                 ugd->tm_mon = atoi(str);
134
135                 free(str);
136
137                 str = NULL;
138         } else {
139                 ugd->tm_mon = cur_tm.tm_mon;
140         }
141
142         //day
143         r = service_get_extra_data(service, "day", &str);
144         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
145         if (str) {
146                 ugd->tm_mday = atoi(str);
147
148                 free(str);
149
150                 str = NULL;
151         } else {
152                 ugd->tm_mday = cur_tm.tm_mday;
153         }
154
155
156         //day
157         r = service_get_extra_data(service, "hour", &str);
158         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
159         if (str) {
160                 ugd->base_hour = atoi(str);
161
162                 free(str);
163
164                 str = NULL;
165         } else {
166                 ugd->base_hour = -1;
167         }
168
169         //index
170         r = service_get_extra_data(service, "index", &str);
171         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
172         if (str) {
173                 ugd->cid = atoi(str);
174
175                 free(str);
176
177                 str = NULL;
178         } else {
179                 ugd->cid = 0;
180         }
181
182         r = service_get_extra_data(service, "account_id", &str);
183         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
184         if (str) {
185                 ugd->account_id =  atoi(str);
186
187                 free(str);
188
189                 str = NULL;
190         } else {
191                 ugd->account_id = 0;
192         }
193
194         r = service_get_extra_data(service, "mail_id", &str);
195         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
196         if (str) {
197                 ugd->mail_id =  atoi(str);
198
199                 free(str);
200
201                 str = NULL;
202         } else {
203                 ugd->mail_id = 0;
204         }
205
206         r = service_get_extra_data(service, "src_box", &str);
207         c_warn_if(r != SERVICE_ERROR_NONE, "service_get_extra_data() is failed(%d)", r);
208         if (str) {
209                 ugd->src_box = strdup(str);
210
211                 free(str);
212
213                 str = NULL;
214         } else {
215                 ugd->src_box = NULL;
216         }
217
218         __cal_edit_ug_get_strnote(ugd, service);
219 }
220
221 static void *__cal_edit_ug_create_callback(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv)
222 {
223         if (NULL == ug || NULL == priv)
224         {
225                 return NULL;
226         }
227
228         Evas_Object *parent = NULL;
229         ug_data *ugd = NULL;
230         Evas_Object *base = NULL;
231
232         ugd = priv;
233         ugd->ug = ug;
234
235         __cal_edit_ug_get_bundle_parameter(ugd,service);
236
237         if (UG_MODE_FULLVIEW != mode)
238                 return NULL;
239
240         parent = ug_get_parent_layout(ug);
241         CAL_ASSERT(parent);
242
243         ugd->win = ug_get_window();
244         CAL_ASSERT(ugd->win);
245
246         base = __cal_edit_ug_create_layout(parent, ugd);
247         if (NULL == base)
248         {
249                 CALENDAR_SVC_DISCONNECT();
250                 return NULL;
251         }
252
253         return base;
254 }
255
256 static void __cal_edit_ug_destroy_callback(ui_gadget_h ug, service_h service, void *priv)
257 {
258         CAL_FN_START;
259
260         ug_data *ugd;
261
262         if (!ug || !priv)
263                 return;
264
265         ugd = priv;
266
267         cal_util_delete_evas_object(&ugd->base);
268
269         free(ugd->strnote);
270 }
271
272 static void __cal_edit_ug_key_callback(ui_gadget_h ug, enum ug_key_event evt, service_h service, void *priv)
273 {
274         if (!ug)
275                 return;
276
277         DBG("UG: key event %d", evt);
278
279         switch (evt)
280         {
281         case UG_KEY_EVENT_END:
282                 ug_destroy_me(ug);
283                 break;
284
285         default:
286                 break;
287         }
288 }
289
290 static int __cal_edit_ug_initialize(ug_data *ugd)
291 {
292         if (NULL == ugd)
293         {
294                 return -1;
295         }
296
297         int r;
298
299         r = CALENDAR_SVC_CONNECT();
300         if (r != CAL_SUCCESS)
301         {
302                 ERR("calendar service connect failed");
303                 return -1;
304         }
305
306         r = account_connect();
307         c_retvm_if(r != ACCOUNT_ERROR_NONE, -1, "account_connect is failed(%x)", r);
308
309         appcore_set_i18n(CALENDAR_PACKAGE, LOCALEDIR);
310
311         ugd->theme = elm_theme_new();
312         if (NULL == ugd->theme)
313         {
314                 return -1;
315         }
316
317         elm_theme_ref_set(ugd->theme, NULL);     //refer to default theme(NULL)
318
319         cal_util_connect_pattern_generator();
320
321         return 0;
322 }
323
324 static int __cal_edit_ug_finish(ug_data *ugd)
325 {
326         int r;
327
328         r = CALENDAR_SVC_DISCONNECT();
329         if (r != CAL_SUCCESS)
330         {
331                 ERR("calendar service close failed");
332                 return -1;
333         }
334
335         r = account_disconnect();
336         c_retvm_if(r != ACCOUNT_ERROR_NONE, -1, "account_disconnect is failed(%x)", r);
337
338         if(NULL != ugd->theme)
339         {
340                 elm_theme_extension_del(ugd->theme, EDJDIR "/calendar_theme.edj");              //delete extension to the new theme (optional)
341                 elm_theme_free(ugd->theme);
342                 ugd->theme = NULL;
343         }
344
345         cal_util_disconnect_pattern_generator();
346
347         return 0;
348 }
349
350
351 static inline void __cal_edit_ug_bind_text_domain()
352 {
353         const char *r;
354
355         r = bindtextdomain(UGSETTINGS, UGLOCALE);
356         if (!r)
357                 ERR("UG: bindtextdomain error");
358 }
359
360 API int UG_MODULE_INIT(struct ug_module_ops *ops)
361 {
362         ug_data *ugd;
363
364         if (!ops)
365                 return -1;
366
367         CAL_CALLOC(ugd, 1, ug_data);
368
369         ops->create = __cal_edit_ug_create_callback;
370         ops->destroy = __cal_edit_ug_destroy_callback;
371         ops->key_event = __cal_edit_ug_key_callback;
372         ops->priv = ugd;
373         ops->opt = UG_OPT_INDICATOR_ENABLE;
374
375         __cal_edit_ug_bind_text_domain();
376
377         __cal_edit_ug_initialize(ugd);
378
379         return 0;
380 }
381
382 API void UG_MODULE_EXIT(struct ug_module_ops *ops)
383 {
384         ug_data *ugd;
385
386         if (!ops)
387                 return;
388
389         ugd = ops->priv;
390         if (ugd)
391         {
392                 __cal_edit_ug_finish(ugd);
393                 free(ugd);
394         }
395 }