4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <stdlib.h> //calloc
23 #include <glib-object.h> //g_type_init
25 #include "calendar_service.h"
26 #include "calendar_db.h"
27 #include "calendar_types2.h"
29 #include "cal_internal.h"
30 #include "cal_typedef.h"
31 #include "cal_inotify.h"
33 #include "cal_record.h"
35 #include "cal_mutex.h"
38 #include "cal_ipc_marshal.h"
40 #include "cal_client_ipc.h"
42 static TLS pims_ipc_h calendar_ipc_thread = NULL;
43 static pims_ipc_h calendar_ipc = NULL;
44 static int calendar_connection_count = 0;
45 static int calendar_change_version = 0;
46 static TLS int calendar_change_version_thread = 0;
48 pims_ipc_h __cal_client_ipc_get_handle(void);
49 void __cal_client_ipc_lock(void);
50 void __cal_client_ipc_unlock(void);
52 API int calendar_connect(void)
54 int ret = CALENDAR_ERROR_NONE;
55 pims_ipc_data_h indata = NULL;
56 pims_ipc_data_h outdata = NULL;
57 pims_ipc_h ipc_handle = NULL;
61 _cal_mutex_lock(CAL_MUTEX_CONNECTION);
63 if (calendar_ipc == NULL)
65 ipc_handle = pims_ipc_create(CAL_IPC_SOCKET_PATH);
66 if (ipc_handle == NULL)
68 ERR("pims_ipc_create() Failed(%d)", CALENDAR_ERROR_OUT_OF_MEMORY);
69 ret = CALENDAR_ERROR_OUT_OF_MEMORY;
75 calendar_connection_count++;
76 CAL_DBG("calendar already connected = %d",calendar_connection_count);
77 ret = CALENDAR_ERROR_NONE;
78 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
83 if (pims_ipc_call(ipc_handle, CAL_IPC_MODULE, CAL_IPC_SERVER_CONNECT, indata, &outdata) != 0)
85 ERR("pims_ipc_call failed");
86 ret = CALENDAR_ERROR_IPC;
93 unsigned int size = 0;
94 ret = *(int*) pims_ipc_data_get(outdata,&size);
96 pims_ipc_data_destroy(outdata);
98 if (ret != CALENDAR_ERROR_NONE)
100 ERR("calendar_connect return (%d)",ret);
106 ERR("ipc outdata is NULL");
107 ret = CALENDAR_ERROR_IPC;
111 g_type_init(); // added for alarmmgr
113 if (_cal_inotify_initialize() != CALENDAR_ERROR_NONE)
115 ERR("_cal_inotify_initialize failed");
118 _cal_view_initialize();
120 calendar_connection_count++;
121 calendar_ipc = ipc_handle;
122 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
127 if (ipc_handle != NULL)
129 pims_ipc_destroy(ipc_handle);
132 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
136 API int calendar_disconnect(void)
138 int ret = CALENDAR_ERROR_NONE;
139 pims_ipc_data_h indata = NULL;
140 pims_ipc_data_h outdata = NULL;
142 retvm_if(calendar_ipc==NULL,CALENDAR_ERROR_NOT_PERMITTED,"calendar not connected");
145 _cal_mutex_lock(CAL_MUTEX_CONNECTION);
147 if (calendar_connection_count > 1)
149 calendar_connection_count--;
150 CAL_DBG("calendar connect count -1 = %d",calendar_connection_count);
151 ret = CALENDAR_ERROR_NONE;
152 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
157 if (pims_ipc_call(calendar_ipc, CAL_IPC_MODULE, CAL_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
159 ERR("pims_ipc_call failed");
160 ret = CALENDAR_ERROR_NOT_PERMITTED;
167 unsigned int size = 0;
168 ret = *(int*) pims_ipc_data_get(outdata,&size);
170 pims_ipc_data_destroy(outdata);
175 ERR("ipc outdata is NULL");
176 ret = CALENDAR_ERROR_IPC;
180 if (calendar_ipc && ret == CALENDAR_ERROR_NONE)
182 pims_ipc_destroy(calendar_ipc);
185 _cal_inotify_finalize();
186 _cal_view_finalize();
189 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
193 _cal_mutex_unlock(CAL_MUTEX_CONNECTION);
197 API int calendar_connect_on_thread(void)
199 int ret = CALENDAR_ERROR_NONE;
200 pims_ipc_data_h indata = NULL;
201 pims_ipc_data_h outdata = NULL;
206 if (calendar_ipc_thread == NULL)
208 calendar_ipc_thread = pims_ipc_create(CAL_IPC_SOCKET_PATH);
209 if (calendar_ipc_thread == NULL)
211 ERR("pims_ipc_create() Failed(%d)", CALENDAR_ERROR_OUT_OF_MEMORY);
212 ret = CALENDAR_ERROR_OUT_OF_MEMORY;
218 CAL_DBG("calendar already connected");
219 ret = CALENDAR_ERROR_NONE;
224 if (pims_ipc_call(calendar_ipc_thread, CAL_IPC_MODULE, CAL_IPC_SERVER_CONNECT, indata, &outdata) != 0)
226 ERR("pims_ipc_call failed");
227 ret = CALENDAR_ERROR_IPC;
234 unsigned int size = 0;
235 ret = *(int*) pims_ipc_data_get(outdata,&size);
237 pims_ipc_data_destroy(outdata);
239 if (ret != CALENDAR_ERROR_NONE)
241 ERR("calendar_connect return (%d)",ret);
247 ERR("ipc outdata is NULL");
248 ret = CALENDAR_ERROR_IPC;
252 if (_cal_inotify_initialize() != CALENDAR_ERROR_NONE)
254 ERR("_cal_inotify_initialize failed");
257 _cal_view_initialize();
261 if (calendar_ipc_thread != NULL)
263 pims_ipc_destroy(calendar_ipc_thread);
264 calendar_ipc_thread = NULL;
270 API int calendar_disconnect_on_thread(void)
272 int ret = CALENDAR_ERROR_NONE;
273 pims_ipc_data_h indata = NULL;
274 pims_ipc_data_h outdata = NULL;
276 retvm_if(calendar_ipc_thread==NULL,CALENDAR_ERROR_NOT_PERMITTED,"calendar_thread not connected");
281 if (pims_ipc_call(calendar_ipc_thread, CAL_IPC_MODULE, CAL_IPC_SERVER_DISCONNECT, indata, &outdata) != 0)
283 ERR("pims_ipc_call failed");
284 ret = CALENDAR_ERROR_NOT_PERMITTED;
291 unsigned int size = 0;
292 ret = *(int*) pims_ipc_data_get(outdata,&size);
294 pims_ipc_data_destroy(outdata);
299 ERR("ipc outdata is NULL");
300 ret = CALENDAR_ERROR_IPC;
304 if (calendar_ipc_thread && ret == CALENDAR_ERROR_NONE)
306 pims_ipc_destroy(calendar_ipc_thread);
307 calendar_ipc_thread = NULL;
309 _cal_inotify_finalize();
310 _cal_view_finalize();
319 API int calendar_connect_with_flags(unsigned int flags)
321 int ret = CALENDAR_ERROR_NONE;
323 ret = calendar_connect();
324 if (ret != CALENDAR_ERROR_NONE)
326 if (flags & CALENDAR_CONNECT_FLAG_RETRY)
328 int retry_time = 500;
332 usleep(retry_time*1000);
333 ret = calendar_connect();
334 DBG("retry cnt=%d, ret=%x",(i+1), ret);
335 if (ret == CALENDAR_ERROR_NONE)
346 bool _cal_client_ipc_is_call_inprogress(void)
348 return pims_ipc_is_call_in_progress(calendar_ipc);
351 pims_ipc_h __cal_client_ipc_get_handle(void)
353 if (calendar_ipc_thread == NULL)
357 return calendar_ipc_thread;
360 void __cal_client_ipc_lock(void)
362 if (calendar_ipc_thread == NULL)
364 _cal_mutex_lock(CAL_MUTEX_PIMS_IPC_CALL);
368 void __cal_client_ipc_unlock(void)
370 if (calendar_ipc_thread == NULL)
372 _cal_mutex_unlock(CAL_MUTEX_PIMS_IPC_CALL);
376 int _cal_client_ipc_call(char *module, char *function, pims_ipc_h data_in,
377 pims_ipc_data_h *data_out)
380 pims_ipc_h ipc_handle = __cal_client_ipc_get_handle();
382 __cal_client_ipc_lock();
384 ret = pims_ipc_call(ipc_handle, module, function, data_in, data_out);
386 __cal_client_ipc_unlock();
391 int _cal_client_ipc_call_async(char *module, char *function, pims_ipc_h data_in,
392 pims_ipc_call_async_cb callback, void *userdata)
395 pims_ipc_h ipc_handle = __cal_client_ipc_get_handle();
397 __cal_client_ipc_lock();
399 ret = pims_ipc_call_async(ipc_handle, module, function, data_in, callback, userdata);
401 __cal_client_ipc_unlock();
406 void _cal_client_ipc_set_change_version(int version)
408 if (calendar_ipc_thread == NULL)
410 calendar_change_version = version;
411 CAL_DBG("change_version=%d",version);
414 calendar_change_version_thread = version;
415 CAL_DBG("change_version=%d",version);
418 int _cal_client_ipc_get_change_version(void)
420 if (calendar_ipc_thread == NULL)
422 return calendar_change_version;
424 return calendar_change_version_thread;