2 * tel-plugin-socket-communicator
4 * Copyright (c) 2012 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.
26 #include "tapi_common_sipc.h"
28 static sipc_marshal_data_type_e _convert_marshal_data_type(tapi_object_data_type_e type)
31 case TAPI_OBJECT_DATA_TYPE_CHAR:{
32 return SIPC_MARSHAL_DATA_CHAR_TYPE;
34 case TAPI_OBJECT_DATA_TYPE_BOOLEAN:{
35 return SIPC_MARSHAL_DATA_BOOLEAN_TYPE;
37 case TAPI_OBJECT_DATA_TYPE_INT:{
38 return SIPC_MARSHAL_DATA_INT_TYPE;
40 case TAPI_OBJECT_DATA_TYPE_DOUBLE:{
41 return SIPC_MARSHAL_DATA_DOUBLE_TYPE;
43 case TAPI_OBJECT_DATA_TYPE_STRING:{
44 return SIPC_MARSHAL_DATA_STRING_TYPE;
46 case TAPI_OBJECT_DATA_TYPE_OBJECT:{
47 return SIPC_MARSHAL_DATA_OBJECT_TYPE;
51 return SIPC_MARSHAL_DATA_STRING_MAX;
54 static struct _tapi_header* _create_header( struct _tapi_handle *hdl, tapi_service_command_e c, unsigned int data_len )
56 struct _tapi_header *hdr = 0;
57 hdr = g_new0( struct _tapi_header, 1 );
59 memcpy( hdr->cookie, hdl->cookie, 20 );
60 memcpy( hdr->app_name, hdl->app_name, 16 );
61 memcpy( hdr->cp_name, hdl->cp_name, 16 );
64 hdr->data_len = data_len;
69 static gchar* _tapi_service_object_serializer(struct _tapi_service_object *so)
71 return sipc_util_marshal_object_serializer(so->mo);
74 static sipc_marshal_object_t* _tapi_service_object_deserializer(const gchar* inparam)
76 return sipc_util_marshal_object_deserializer(inparam);
79 struct _tapi_service_object* _tapi_service_object_create( tapi_service_command_e c )
81 struct _tapi_service_object *so = 0;
82 so = g_new0( struct _tapi_service_object, 1 );
85 so->mo = sipc_util_marshal_object_create();
95 gboolean _tapi_service_object_add_data(struct _tapi_service_object *so, const gchar* key, void *data, tapi_object_data_type_e type)
97 if(type != TAPI_OBJECT_DATA_TYPE_OBJECT)
98 return sipc_util_marshal_object_add_data(so->mo, key, data, _convert_marshal_data_type(type) );
100 return sipc_util_marshal_object_add_data(so->mo, key, ((struct _tapi_service_object *)data)->mo , _convert_marshal_data_type(type) );
103 gboolean _tapi_service_object_get_data(const struct _tapi_service_object *so, const gchar* key, void **data, tapi_object_data_type_e type)
105 if(type == TAPI_OBJECT_DATA_TYPE_OBJECT){
106 *data = g_new0( struct _tapi_service_object, 1 );
107 ((struct _tapi_service_object *)(*data))->cmd = TAPI_SERVICE_UNKNOWN;
108 sipc_util_marshal_object_get_data(so->mo, key, (void **)&(((struct _tapi_service_object *)(*data))->mo), _convert_marshal_data_type(type) );
112 return sipc_util_marshal_object_get_data(so->mo, key, data, _convert_marshal_data_type(type) );
115 gchar _tapi_service_object_get_char(const struct _tapi_service_object *so, const gchar* key)
117 return sipc_util_marshal_object_get_char(so->mo, key);
120 gboolean _tapi_service_object_get_boolean(const struct _tapi_service_object *so, const gchar* key)
122 return sipc_util_marshal_object_get_boolean(so->mo, key);
125 gint _tapi_service_object_get_int(const struct _tapi_service_object *so, const gchar* key)
127 return sipc_util_marshal_object_get_int(so->mo, key);
130 gdouble _tapi_service_object_get_double(const struct _tapi_service_object *so, const gchar* key)
132 return sipc_util_marshal_object_get_double(so->mo, key);
135 gchar* _tapi_service_object_get_string(const struct _tapi_service_object *so, const gchar* key)
137 return sipc_util_marshal_object_get_string(so->mo, key);
140 struct _tapi_service_object* _tapi_service_object_get_object(const struct _tapi_service_object *so, const gchar* key)
142 struct _tapi_service_object *rvalue = 0;
143 rvalue = g_new0( struct _tapi_service_object, 1 );
145 rvalue->cmd = TAPI_SERVICE_UNKNOWN;
146 rvalue->mo = sipc_util_marshal_object_get_object(so->mo, key);
155 struct _tapi_service_object* _tapi_service_object_extract_async_data(const gchar *data)
157 struct _tapi_service_object *so = 0;
158 so = g_new0( struct _tapi_service_object, 1 );
161 so->mo = _tapi_service_object_deserializer(data);
170 gboolean _tapi_service_object_remove_data(struct _tapi_service_object *so, const gchar* key)
172 return sipc_util_marshal_object_remove_data(so->mo, key);
175 gboolean _tapi_service_object_remove_alldata(struct _tapi_service_object *so)
177 return sipc_util_marshal_object_remove_alldata(so->mo);
180 gboolean _tapi_service_object_destory(struct _tapi_service_object *so)
185 rv = sipc_util_marshal_object_destory(so->mo);
191 gboolean _tapi_send_service_request_sync(struct _tapi_handle *h, struct _tapi_service_object *in_d, struct _tapi_service_object *out_d)
194 int serialized_data_len = 0, data_len = 0;
195 gchar *data = NULL, *o_data = NULL;
196 gchar *serialized_d = NULL;
197 struct _tapi_header *hdr;
199 serialized_d = _tapi_service_object_serializer(in_d);
201 serialized_data_len = strlen(serialized_d);
202 //dbg("serialized data (%s)", serialized_d);
205 hdr = _create_header( h, in_d->cmd, serialized_data_len );
207 data = g_new0(char, sizeof(struct _tapi_header)+serialized_data_len);
208 memcpy(data, hdr, sizeof(struct _tapi_header));
209 data_len = sizeof(struct _tapi_header);
211 if(serialized_data_len > 0){
212 memcpy( (data+data_len), serialized_d, serialized_data_len);
213 data_len = data_len+serialized_data_len;
217 g_free(serialized_d);
219 ret = sipc_channel_send( h->tx_ch, data, data_len, (void **)&o_data, SIPC_DATA_TYPE_SYNC );
221 dbg("fail to send data");
226 //dbg("return data (%s)", o_data);
227 sipc_util_marshal_object_destory(out_d->mo);
228 out_d->mo = _tapi_service_object_deserializer(o_data);
232 dbg("success to send data (%d)", data_len);