4 * Copyright (c) 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include <dbus/dbus-glib.h>
26 #include <dbus/dbus-glib-lowlevel.h>
27 #include <dbus/dbus.h>
31 #include "TelDefines.h"
32 #include "tel_cs_conn.h"
33 #include "TapiUtility.h"
34 #include "TelUtility.h"
35 #include "TapiCommon.h"
36 #include "tapi_proxy.h"
38 #include "tel_marshaler.h"
48 static char *_evt_sig_members[] = {
49 TAPI_SIGNAL_MEMBER_ARG0,
50 TAPI_SIGNAL_MEMBER_ARG2,
51 TAPI_SIGNAL_MEMBER_ARG4,
52 TAPI_SIGNAL_MEMBER_ARG5,
55 extern char *g_cookie_name;
56 extern int g_cookie_size;
58 tapi_dbus_connection_name conn_name;
66 typedef struct GDBusEvtItem_t {
78 typedef GCallback (*GDBusConnSig_t)(DBusGProxy *, const char *, void *);
80 static GCallback gdbus_conn_signal0(DBusGProxy *robj, const char *member, void *data);
81 static GCallback gdbus_conn_signal2(DBusGProxy *robj, const char *member, void *data);
82 static GCallback gdbus_conn_signal4(DBusGProxy *robj, const char *member, void *data);
83 static GCallback gdbus_conn_signal5(DBusGProxy *robj, const char *member, void *data);
85 static GDBusConnSig_t GDBusConnSig[TAPI_SIGNAL_MAX] = { gdbus_conn_signal0, gdbus_conn_signal2, gdbus_conn_signal4,
88 static DBusGConnection *GDBusHandle = NULL;
90 static int _tapi_init_ref_count = 0;
92 static GSList *EvtList = NULL;
93 static long int EvtId = 0;
95 static TelTapiEvtMode_t EvtMode = TAPI_EVTMODE_NONE;
97 #define CHK_EVENT_MODE(MODE) \
98 if (EvtMode != MODE) { \
99 TAPI_LIB_DEBUG(LEVEL_DEBUG,"Event MODE check failed (current: %d)", EvtMode); \
100 return TAPI_API_OPERATION_FAILED; \
103 #define CHK_EVENT_INIT_MODE(MODE) \
104 if (EvtMode != MODE && EvtMode != TAPI_EVTMODE_NONE) { \
105 TAPI_LIB_DEBUG(LEVEL_DEBUG,"Event MODE check failed (current: %d)", EvtMode); \
106 return TAPI_API_OPERATION_FAILED; \
109 #define EVENT_DUMP(Event) \
111 TAPI_LIB_DEBUG(LEVEL_DEBUG, " Received group is :0x%x", Event.EventClass); \
112 TAPI_LIB_DEBUG(LEVEL_DEBUG, " received event type is :0x%x", Event.EventType); \
113 TAPI_LIB_DEBUG(LEVEL_DEBUG, " received requestid is :0x%x", Event.RequestId); \
114 TAPI_LIB_DEBUG(LEVEL_DEBUG, " received status is :%d", Event.Status); \
117 static void on_gdbus_event_receive0(DBusGProxy *proxy, void *local_data)
119 TelTapiEvent_t Event;
121 Event.EventClass = -1;
123 Event.RequestId = -1;
130 /* Contents of parameters is defined by every notification. */
131 UserData_t *user_data;
132 user_data = (UserData_t *) local_data;
133 user_data->cb(&Event, user_data->data);
135 TAPI_LIB_DEBUG(LEVEL_DEBUG," Application Callback Invoked successfully ");
138 static void on_gdbus_event_receive2(DBusGProxy *proxy, int type, const char *data, void *local_data)
140 TelTapiEvent_t Event;
141 guchar *result = NULL;
144 Event.EventClass = -1;
145 Event.EventType = type;
146 Event.RequestId = -1;
152 TAPI_BASE64_DECODE(data, result, &out_len);
154 Event.pData = result;
155 Event.pDataLen = out_len;
157 /* Contents of parameters is defined by every notification. */
158 UserData_t *user_data;
159 user_data = (UserData_t *) local_data;
160 user_data->cb(&Event, user_data->data);
162 TAPI_LIB_DEBUG(LEVEL_DEBUG," Application Callback Invoked successfully ");
168 static void on_gdbus_event_receive4(
176 TelTapiEvent_t Event;
177 guchar *result = NULL;
180 Event.EventClass = grp;
181 Event.EventType = type;
182 Event.RequestId = -1;
183 Event.Status = status;
188 TAPI_BASE64_DECODE(data, result, &out_len);
190 Event.pData = result;
191 Event.pDataLen = out_len;
193 /* Contents of parameters is defined by every notification. */
194 UserData_t *user_data;
195 user_data = (UserData_t *) local_data;
196 user_data->cb(&Event, user_data->data);
198 TAPI_LIB_DEBUG(LEVEL_DEBUG," Application Callback Invoked successfully ");
203 static void on_gdbus_event_receive5(
212 TelTapiEvent_t Event;
213 guchar *result = NULL;
216 Event.EventClass = grp;
217 Event.EventType = type;
218 Event.RequestId = req_id;
219 Event.Status = status;
225 TAPI_BASE64_DECODE(data, result, &out_len);
226 Event.pData = result;
228 TAPI_LIB_DEBUG(LEVEL_DEBUG, "result =0x%p", result);
229 TAPI_LIB_DEBUG(LEVEL_DEBUG, "out_len =%d", out_len);
233 Event.pDataLen = out_len;
236 /* Contents of parameters is defined by every notification. */
237 UserData_t *user_data;
238 user_data = (UserData_t *) local_data;
240 user_data->cb(&Event, user_data->data);
242 TAPI_LIB_DEBUG(LEVEL_DEBUG," Application Callback Invoked successfully ");
247 static GCallback gdbus_conn_signal0(DBusGProxy *robj, const char *member, void *data)
249 dbus_g_proxy_add_signal(robj, member, G_TYPE_INVALID);
250 dbus_g_proxy_connect_signal(robj, member, G_CALLBACK(on_gdbus_event_receive0), data, NULL);
251 return G_CALLBACK(on_gdbus_event_receive0);
254 static GCallback gdbus_conn_signal2(DBusGProxy *robj, const char *member, void *data)
256 dbus_g_proxy_add_signal(robj, member, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID);
257 dbus_g_proxy_connect_signal(robj, member, G_CALLBACK(on_gdbus_event_receive2), data, NULL);
258 return G_CALLBACK(on_gdbus_event_receive2);
261 static GCallback gdbus_conn_signal4(DBusGProxy *robj, const char *member, void *data)
263 dbus_g_proxy_add_signal(robj, member, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID);
264 dbus_g_proxy_connect_signal(robj, member, G_CALLBACK(on_gdbus_event_receive4), data, NULL);
265 return G_CALLBACK(on_gdbus_event_receive4);
268 static GCallback gdbus_conn_signal5(DBusGProxy *robj, const char *member, void *data)
270 dbus_g_proxy_add_signal(robj, member, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID);
271 dbus_g_proxy_connect_signal(robj, member, G_CALLBACK(on_gdbus_event_receive5), data, NULL);
272 return G_CALLBACK(on_gdbus_event_receive5);
275 static void gdbus_del_signal(GDBusEvtItem_t *it)
278 for (i = 0; i < TAPI_SIGNAL_MAX; i++) {
279 dbus_g_proxy_disconnect_signal(it->robj, _evt_sig_members[i], G_CALLBACK(it->cb[i]), it->data);
287 static GDBusEvtItem_t *gdbus_add_signal(const char *event_string, void *data)
289 GDBusEvtItem_t *it = NULL;
293 robj = dbus_g_proxy_new_for_name(GDBusHandle, TAPI_SIGNAL_SENDER, TAPI_SIGNAL_OBJPATH, event_string);
295 TAPI_LIB_DEBUG(LEVEL_DEBUG,"failed to get proxy for iface: %s", event_string);
299 it = (GDBusEvtItem_t *) g_malloc0(sizeof(GDBusEvtItem_t));
301 TAPI_LIB_DEBUG(LEVEL_DEBUG,"failed to allocate item memory");
309 if ((EvtList = g_slist_append(EvtList, it)) == NULL) {
310 TAPI_LIB_DEBUG(LEVEL_ERR, "failed to event info append");
315 for (i = 0; i < TAPI_SIGNAL_MAX; i++)
316 it->cb[i] = GDBusConnSig[i](robj, _evt_sig_members[i], data);
321 static void _cookie_deinit(void)
326 g_cookie_name = NULL;
330 EXPORT_API int tel_init(void)
332 DBusGConnection *conn;
335 TAPI_LIB_DEBUG(LEVEL_DEBUG, "TelTapiInit");
337 if (++_tapi_init_ref_count > 1) {
338 TAPI_LIB_DEBUG(LEVEL_DEBUG, "Already initialized. (ref_count=%d)", _tapi_init_ref_count);
339 return TAPI_API_SUCCESS;
342 CHK_EVENT_INIT_MODE(TAPI_EVTMODE_GLIB);
343 EvtMode = TAPI_EVTMODE_GLIB;
346 return TAPI_API_SUCCESS;
350 conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &err);
352 TAPI_LIB_DEBUG(LEVEL_ERR, "dbus_bus_get failed: %s", (char *)err->message);
353 EvtMode = TAPI_EVTMODE_NONE;
354 return TAPI_API_OPERATION_FAILED;
360 dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__INT_INT_INT_INT_STRING, G_TYPE_NONE, G_TYPE_INT,
361 G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID);
363 dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__INT_INT_INT_STRING, G_TYPE_NONE, G_TYPE_INT,
364 G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID);
366 dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__INT_STRING, G_TYPE_NONE, G_TYPE_INT, G_TYPE_STRING,
369 /* Check TAPI READY vconf */
373 ret_val = vconf_get_int(VCONFKEY_TELEPHONY_TAPI_STATE, &ts_status);
375 TAPI_LIB_DEBUG(LEVEL_DEBUG, "[%s] vconf key default set (value=%d)",
376 VCONFKEY_TELEPHONY_TAPI_STATE,
377 VCONFKEY_TELEPHONY_TAPI_STATE_NONE);
378 vconf_set_int(VCONFKEY_TELEPHONY_TAPI_STATE, VCONFKEY_TELEPHONY_TAPI_STATE_NONE);
381 return TAPI_API_SUCCESS;
384 EXPORT_API int tel_register_event(int EventType, unsigned int *SubscriptionId, TelAppCallback AppCallBack, void *data)
386 char event_string[IF_NAME_MAX];
387 GDBusEvtItem_t *it = NULL;
389 CHK_EVENT_MODE(TAPI_EVTMODE_GLIB);
391 /* CHECK THE INPUT */
392 TAPI_RET_ERR_NUM_IF_FAIL(AppCallBack, TAPI_API_INVALID_PTR);
393 TAPI_RET_ERR_NUM_IF_FAIL(SubscriptionId, TAPI_API_INVALID_PTR);
395 if ((EventType < TAPI_EVENT_CALL_SETUP_CNF) || (EventType > TAPI_EVENT_TYPE_MAX)) {
396 TAPI_LIB_DEBUG(LEVEL_DEBUG,"Unknown EventClass");
397 return TAPI_EVENT_CLASS_UNKNOWN;
400 UserData_t *user_data;
401 user_data = (UserData_t *) malloc(sizeof(UserData_t));
402 user_data->data = data;
403 user_data->cb = AppCallBack;
405 TAPI_GET_EVENT_NAME(EventType, event_string);
406 TAPI_LIB_DEBUG(LEVEL_DEBUG,"PROXY COMMON EVENT STRING=%s", event_string);
407 it = gdbus_add_signal(event_string, (void *) user_data);
409 return TAPI_API_OPERATION_FAILED;
412 *SubscriptionId = EvtId++;
413 TAPI_LIB_DEBUG(LEVEL_DEBUG,"Noti Subscribe Successful with id %d", *SubscriptionId);
415 return TAPI_API_SUCCESS;
418 EXPORT_API int tel_deregister_event(unsigned int SubscriptionId)
422 CHK_EVENT_MODE(TAPI_EVTMODE_GLIB);
423 for (iter = EvtList; iter != NULL; iter = iter->next) {
424 it = (GDBusEvtItem_t *) iter->data;
425 if (it->id == SubscriptionId) {
426 gdbus_del_signal(it);
427 EvtList = g_slist_delete_link(EvtList, iter);
428 return TAPI_API_SUCCESS;
432 return TAPI_API_INVALID_INPUT;
435 static void _tel_remove_signal(gpointer data, gpointer user_data)
438 it = (GDBusEvtItem_t *) data;
440 TAPI_LIB_DEBUG(LEVEL_DEBUG, "TEL_REGI deletenode it=0x%x id=%d",it, it->id);
441 gdbus_del_signal(it);
445 EXPORT_API int tel_deinit(void)
447 TAPI_LIB_DEBUG(LEVEL_DEBUG, "TelTapiDeinit");
449 if (--_tapi_init_ref_count > 0) {
450 TAPI_LIB_DEBUG(LEVEL_DEBUG, "no work. (ref_count=%d)", _tapi_init_ref_count);
451 return TAPI_API_SUCCESS;
454 TAPI_LIB_DEBUG(LEVEL_DEBUG, "remove all signal");
456 g_slist_foreach(EvtList, _tel_remove_signal, NULL);
459 EvtMode = TAPI_EVTMODE_NONE;
460 g_slist_free(EvtList);
464 return TAPI_API_SUCCESS;
467 EXPORT_API int tel_register_app_name(char *name)
470 TAPI_LIB_DEBUG(LEVEL_ERR, "The 1st parameter, the connection name, is NULL\n");
471 return TAPI_API_INVALID_PTR;
474 DBusConnection *dbus_connection = NULL;
476 dbus_error_init(&err);
479 dbus_connection = dbus_g_connection_get_connection(GDBusHandle);
480 if (dbus_bus_request_name(dbus_connection, name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &err) < 0) {
481 TAPI_LIB_DEBUG(LEVEL_ERR, "Fail to request dbus connection name\n");
482 return TAPI_API_INVALID_OPERATION;
486 TAPI_LIB_DEBUG(LEVEL_ERR, "No valid dbus connection\n");
489 TAPI_LIB_DEBUG(LEVEL_DEBUG,"Request connection name = %s", name );
490 snprintf(conn_name.name, 255, "%s", name);
491 conn_name.length_of_name = strlen(conn_name.name);
493 return TAPI_API_SUCCESS;
496 EXPORT_API int tel_get_app_name(tapi_dbus_connection_name *app_name)
498 if (app_name == NULL) {
499 TAPI_LIB_DEBUG(LEVEL_ERR, "The 1st parameter, the application name, is NULL\n");
500 return TAPI_API_INVALID_PTR;
503 snprintf(app_name->name, TAPI_DBUS_CONNECTION_NAME_LEN_MAX, "%s", conn_name.name);
504 app_name->length_of_name = strlen(app_name->name);
506 return TAPI_API_SUCCESS;
510 This Api interacts with Telephony servers STATUS library to get the ready status
511 According to Lee this new code will be opened only in rel 1.0. Ramu is the author.
513 EXPORT_API int tel_check_service_ready(int *bStatus)
517 int api_err = TAPI_API_SUCCESS;
519 TAPI_RET_ERR_NUM_IF_FAIL(bStatus, TAPI_API_INVALID_PTR);
521 ret_val = vconf_get_int(VCONFKEY_TELEPHONY_TAPI_STATE, (int*) &ts_status);
526 TAPI_LIB_DEBUG(LEVEL_ERR, "[FAIL] GET VCONFKEY_TELEPHONY_TAPI_STATE");
531 TAPI_LIB_DEBUG(LEVEL_DEBUG, "NEW: Status Check value is %d", ts_status);
534 TAPI_LIB_DEBUG(LEVEL_DEBUG, "GETTING STATUS_TAPI_STATE Failed............\n");
535 return TAPI_API_SERVER_LAYER_FAILURE;
538 *bStatus = ts_status;
539 return TAPI_API_SUCCESS;
544 EXPORT_API int tel_request_tunnel(const TelTunnelInfo_t *pTunnelInfo, int *pRequestId)
547 int returnStatus = TAPI_API_SUCCESS;
549 TAPI_RET_ERR_NUM_IF_FAIL(pRequestId, TAPI_API_INVALID_PTR);
550 TAPI_RET_ERR_NUM_IF_FAIL(pTunnelInfo, TAPI_API_INVALID_PTR);
552 if (conn_name.length_of_name == 0) {
553 TAPI_LIB_DEBUG(LEVEL_ERR, "No dbus connection name");
554 return TAPI_API_OPERATION_FAILED;
557 /* check for the RPC link.... */
558 TAPI_RET_ERR_NUM_IF_FAIL(tapi_check_dbus_status(), TAPI_API_SYSTEM_RPC_LINK_DOWN);
559 TAPI_GLIB_INIT_PARAMS();
561 TAPI_GLIB_ALLOC_PARAMS(in_param1,in_param2,in_param3,in_param4,out_param1,out_param2,out_param3,out_param4);
563 g_array_append_vals(in_param1, pTunnelInfo, sizeof(TelTunnelInfo_t));
564 g_array_append_vals(in_param2, (unsigned char *) (pTunnelInfo->pTunnelData), pTunnelInfo->TunnelDataLen);
565 g_array_append_vals(in_param4, &conn_name, sizeof(tapi_dbus_connection_name));
567 ret = tapi_send_request(TAPI_EVENT_CLASS_UTIL, TAPI_CS_UTIL_TUNNEL_REQ, in_param1, in_param2, in_param3, in_param4,
568 &out_param1, &out_param2, &out_param3, &out_param4);
571 returnStatus = g_array_index(out_param1, int , 0);
572 *pRequestId = g_array_index(out_param2, int , 0);
576 returnStatus = TAPI_API_SYSTEM_RPC_LINK_DOWN;
579 TAPI_LIB_DEBUG(LEVEL_DEBUG, "Tunnel Request: Return Status : %d", returnStatus);
580 TAPI_LIB_DEBUG(LEVEL_DEBUG, "RequestId: %d", *pRequestId);
582 TAPI_GLIB_FREE_PARAMS(in_param1,in_param2,in_param3,in_param4,out_param1,out_param2,out_param3,out_param4);