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.
25 #include <glib-object.h>
31 #include <communicator.h>
32 #include <core_object.h>
34 #include <user_request.h>
40 #include "tapi_common.h"
41 #include "module_req.h"
43 gboolean scomm_service_reqeust_sap(unsigned int ch_id, Communicator *c, TcorePlugin *plugin, tapi_service_command_e cmd, gchar *data, void **outparam)
45 GSList *co_list = NULL;
46 CoreObject *co_sap = NULL;
47 UserRequest *ur = NULL;
48 struct tcore_user_info ui = { 0, 0, 0, NULL,0,0, NULL };
53 struct _sipc_marshal_object *in_o;
55 co_list = tcore_plugin_get_core_objects_bytype(plugin, CORE_OBJECT_TYPE_SAP);
57 dbg("err-no sap core object list in current plugin");
61 co_sap = (CoreObject *)co_list->data;
63 dbg("err-no sap core object in current plugin");
67 g_slist_free(co_list);
69 ur = tcore_user_request_new(c, tcore_plugin_get_description(plugin)->name);
71 dbg("err - ur creation failed");
75 ui.channel_id = ch_id;
77 tcore_user_request_set_user_info(ur, &ui);
79 in_o = sipc_util_marshal_object_deserializer(data);
81 dbg("err - data deserializer failed");
86 case TAPI_SERVICE_SAP_CONNECT :{
87 struct treq_sap_req_connect req_conn = {0, };
89 g_max_size = sipc_util_marshal_object_get_int(in_o, "max_size");
90 req_conn.max_msg_size = (unsigned short)g_max_size;
91 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_connect), &req_conn);
92 tcore_user_request_set_command(ur, TREQ_SIM_SET_LANGUAGE);
96 case TAPI_SERVICE_SAP_DISCONNECT: {
97 struct treq_sap_req_disconnect req_disconn;
98 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_disconnect), &req_disconn);
99 tcore_user_request_set_command(ur, TREQ_SAP_REQ_DISCONNECT);
103 case TAPI_SERVICE_SAP_GET_CONNECTSTATUS: {
104 struct treq_sap_req_status req_status;
105 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_status), &req_status);
106 tcore_user_request_set_command(ur, TREQ_SAP_REQ_STATUS);
110 case TAPI_SERVICE_SAP_GET_ATR : {
111 struct treq_sap_req_atr req_atr;
112 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_atr), &req_atr);
113 tcore_user_request_set_command(ur, TREQ_SAP_REQ_ATR);
117 case TAPI_SERVICE_SAP_TRANSFER_APDU : {
118 struct treq_sap_transfer_apdu t_apdu = {0, };
119 gchar *apdu_data = NULL;
120 apdu_data = sipc_util_marshal_object_get_string(in_o, "apdu");
121 t_apdu.apdu_length = strlen(apdu_data);
122 memcpy(t_apdu.apdu_data, apdu_data, t_apdu.apdu_length);
124 tcore_user_request_set_data(ur, sizeof(struct treq_sap_transfer_apdu), &t_apdu);
125 tcore_user_request_set_command(ur, TREQ_SAP_TRANSFER_APDU);
129 case TAPI_SERVICE_SAP_SET_PROTOCOL : {
130 struct treq_sap_set_protocol set_protocol;
131 enum tel_sap_protocol_type g_protocol = 0;
132 g_protocol = sipc_util_marshal_object_get_int(in_o, "protocol");
133 set_protocol.protocol = g_protocol;
135 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_protocol), &set_protocol);
136 tcore_user_request_set_command(ur, TREQ_SAP_SET_PROTOCOL);
140 case TAPI_SERVICE_SAP_SET_POWER : {
141 struct treq_sap_set_power set_power;
142 enum tel_sap_power_mode g_mode = SAP_POWER_ON;
143 g_mode = sipc_util_marshal_object_get_int(in_o, "mode");
144 set_power.mode = g_mode;
146 tcore_user_request_set_data(ur, sizeof(struct treq_sap_set_power), &set_power);
147 tcore_user_request_set_command(ur, TREQ_SAP_SET_POWER);
151 case TAPI_SERVICE_SAP_GET_READERSTATUS : {
152 struct treq_sap_req_cardreaderstatus req_reader;
153 tcore_user_request_set_data(ur, sizeof(struct treq_sap_req_cardreaderstatus), &req_reader);
154 tcore_user_request_set_command(ur, TREQ_SAP_REQ_CARDREADERSTATUS);
159 dbg("not handled command[%d] here",cmd);
163 ret = tcore_communicator_dispatch_request(c, ur);
164 if (ret != TCORE_RETURN_SUCCESS) {
170 gboolean scomm_service_response_sap(Communicator *comm, UserRequest *ur, enum tcore_response_command command,
171 unsigned int data_len, const void *data)
173 const struct tresp_sap_req_connect *sap_conn = data;
174 const struct tresp_sap_req_disconnect *sap_disconn = data;
175 const struct tresp_sap_req_status *sap_status = data;
176 const struct tresp_sap_req_atr *sap_atr = data;
177 const struct tresp_sap_transfer_apdu *sap_apdu = data;
178 const struct tresp_sap_set_protocol *sap_protocol = data;
179 const struct tresp_sap_set_power *sap_power = data;
180 const struct tresp_sap_req_cardreaderstatus *sap_reader = data;
182 gchar *out_d= NULL, *serial_d = NULL;
183 struct custom_data *ctx = NULL;
184 const struct tcore_user_info *ui;
185 sipc_server_t *s = NULL;
186 struct _tapi_header hdr;
187 struct _sipc_marshal_object* out_o = NULL;
189 memset(&hdr, 0, sizeof(struct _tapi_header));
191 ctx = tcore_communicator_ref_user_data(comm);
193 dbg("user_data is NULL");
197 ui = tcore_user_request_ref_user_info(ur);
200 dbg("application channel id(%d), Command = [0x%x], data_len = %d", ui->channel_id, command, data_len);
201 hdr.cmd = (tapi_service_command_e)ui->client_cmd;
203 out_o = sipc_util_marshal_object_create();
206 case TRESP_SAP_REQ_CONNECT:
207 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_conn->status, SIPC_MARSHAL_DATA_INT_TYPE);
208 sipc_util_marshal_object_add_data(out_o, "max_size", (void*)&sap_conn->max_msg_size , SIPC_MARSHAL_DATA_INT_TYPE);
211 case TRESP_SAP_REQ_DISCONNECT:
212 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_disconn->result, SIPC_MARSHAL_DATA_INT_TYPE);
215 case TRESP_SAP_REQ_STATUS:
216 sipc_util_marshal_object_add_data(out_o, "status", (void*)&sap_status->status, SIPC_MARSHAL_DATA_INT_TYPE);
219 case TRESP_SAP_REQ_ATR:
220 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_atr->result, SIPC_MARSHAL_DATA_INT_TYPE);
221 sipc_util_marshal_object_add_data(out_o, "atr", (void*)&sap_atr->atr, SIPC_MARSHAL_DATA_STRING_TYPE);
224 case TRESP_SAP_TRANSFER_APDU:
225 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_apdu->result, SIPC_MARSHAL_DATA_INT_TYPE);
226 sipc_util_marshal_object_add_data(out_o, "apdu", (void*)&sap_apdu->resp_adpdu, SIPC_MARSHAL_DATA_STRING_TYPE);
229 case TRESP_SAP_SET_PROTOCOL:
230 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_protocol->result, SIPC_MARSHAL_DATA_INT_TYPE);
233 case TRESP_SAP_SET_POWER:
234 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_power->result, SIPC_MARSHAL_DATA_INT_TYPE);
237 case TRESP_SAP_REQ_CARDREADERSTATUS:
238 sipc_util_marshal_object_add_data(out_o, "result", (void*)&sap_reader->result, SIPC_MARSHAL_DATA_INT_TYPE);
239 sipc_util_marshal_object_add_data(out_o, "status", (void*)&sap_reader->reader_status, SIPC_MARSHAL_DATA_INT_TYPE);
245 serial_d = sipc_util_marshal_object_serializer(out_o);
246 hdr.data_len = strlen(serial_d);
247 sipc_util_marshal_object_destory(out_o);
250 out_d = g_new0(char, sizeof(struct _tapi_header)+hdr.data_len);
251 memcpy(out_d, &hdr, sizeof(struct _tapi_header));
253 memcpy(out_d+sizeof(struct _tapi_header), serial_d, hdr.data_len);
257 ret = sipc_server_send(s, ui->channel_id, out_d, sizeof(struct _tapi_header)+hdr.data_len, SIPC_SEND_DATA_ASYNC);
268 gboolean scomm_service_notification_sap(Communicator *comm, CoreObject *source, enum tcore_notification_command command,
269 unsigned int data_len, const void *data)
271 const struct tnoti_sap_status_changed *n_sap_status = data;
272 const struct tnoti_sap_disconnect *n_sap_disconn = data;
274 gchar *out_d = NULL, *serial_d = NULL;
275 struct custom_data *ctx = NULL;
276 sipc_server_t *s = NULL;
278 struct _tapi_header hdr;
279 struct _sipc_marshal_object* out_o = NULL;
281 memset(&hdr, 0, sizeof(struct _tapi_header));
283 ctx = tcore_communicator_ref_user_data(comm);
285 dbg("user_data is NULL");
290 dbg("notification !!! (command = 0x%x, data_len = %d)", command, data_len);
292 out_o = sipc_util_marshal_object_create();
295 case TNOTI_SAP_STATUS :
296 dbg("notified sap_status[%d]", n_sap_status->status);
297 sipc_util_marshal_object_add_data(out_o, "status", (void*)&n_sap_status->status, SIPC_MARSHAL_DATA_INT_TYPE);
300 case TNOTI_SAP_DISCONNECT :
301 dbg("notified sap_disconnect type[%d]", n_sap_disconn->type);
302 sipc_util_marshal_object_add_data(out_o, "type", (void*)&n_sap_disconn->type, SIPC_MARSHAL_DATA_INT_TYPE);
306 dbg("not handled command [%d] here",command);
311 serial_d = sipc_util_marshal_object_serializer(out_o);
312 hdr.data_len = strlen(serial_d);
313 sipc_util_marshal_object_destory(out_o);
316 out_d = g_new0(char, sizeof(struct _tapi_header)+hdr.data_len);
317 memcpy(out_d, &hdr, sizeof(struct _tapi_header));
319 memcpy(out_d+sizeof(struct _tapi_header), serial_d, hdr.data_len);
323 ret = sipc_server_broadcast(s, out_d, sizeof(struct _tapi_header)+hdr.data_len);