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>
36 #include <co_network.h>
39 #include "tapi_common.h"
40 #include "module_req.h"
42 static void _request_fail(UserRequest *ur, int cmd, int resp_len, void *resp)
44 tcore_user_request_send_response(ur, cmd, resp_len, resp);
45 tcore_user_request_unref(ur);
48 gboolean scomm_service_request_network(unsigned int ch_id, Communicator *c, TcorePlugin *plugin,
49 tapi_service_command_e cmd, gchar *data, void **outparam)
52 struct _sipc_marshal_object *out_obj;
53 struct _sipc_marshal_object *in_obj;
54 gboolean result = TRUE;
55 UserRequest *ur = NULL;
56 struct tcore_user_info ui = { 0, 0, 0, NULL, 0, 0, NULL };
58 in_obj = sipc_util_marshal_object_deserializer(data);
60 dbg("in_obj is NULL");
65 ur = tcore_user_request_new(c, tcore_plugin_get_description(plugin)->name);
72 ui.channel_id = ch_id;
74 tcore_user_request_set_user_info(ur, &ui);
77 case TAPI_SERVICE_NETWORK_SEARCH:
78 tcore_user_request_set_data(ur, 0, NULL);
79 tcore_user_request_set_command(ur, TREQ_NETWORK_SEARCH);
82 case TAPI_SERVICE_NETWORK_SET_PLMN_SELECTION_MODE: {
83 struct treq_network_set_plmn_selection_mode data_plmn_select;
84 struct tresp_network_set_plmn_selection_mode resp;
88 mode = sipc_util_marshal_object_get_string(in_obj, "mode");
90 resp.result = TCORE_RETURN_EINVAL;
91 _request_fail(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_set_plmn_selection_mode), &resp);
96 plmn = sipc_util_marshal_object_get_string(in_obj, "plmn");
98 memset(&data_plmn_select, 0, sizeof(struct treq_network_set_plmn_selection_mode));
99 if (!g_strcmp0(mode, "automatic")) {
100 data_plmn_select.mode = NETWORK_SELECT_MODE_GSM_AUTOMATIC;
102 else if (!g_strcmp0(mode, "manual")) {
103 data_plmn_select.mode = NETWORK_SELECT_MODE_GSM_MANUAL;
104 snprintf(data_plmn_select.plmn, 6, "%s", plmn);
105 if (strlen(data_plmn_select.plmn) <= 5)
106 data_plmn_select.plmn[5] = '#';
113 resp.result = TCORE_RETURN_EINVAL;
114 _request_fail(ur, TRESP_NETWORK_SET_PLMN_SELECTION_MODE, sizeof(struct tresp_network_set_plmn_selection_mode), &resp);
122 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_plmn_selection_mode), &data_plmn_select);
123 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_PLMN_SELECTION_MODE);
127 case TAPI_SERVICE_NETWORK_GET_PLMN_SELECTION_MODE:
128 tcore_user_request_set_data(ur, 0, NULL);
129 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_PLMN_SELECTION_MODE);
132 case TAPI_SERVICE_NETWORK_SET_SERVICE_DOMAIN: {
133 struct treq_network_set_service_domain data_service_domain;
134 struct tresp_network_set_service_domain resp;
135 gchar *domain = NULL;
137 domain = sipc_util_marshal_object_get_string(in_obj, "domain");
139 resp.result = TCORE_RETURN_EINVAL;
140 _request_fail(ur, TRESP_NETWORK_SET_SERVICE_DOMAIN, sizeof(struct tresp_network_set_service_domain), &resp);
145 if (!g_strcmp0(domain, "circuit")) {
146 data_service_domain.domain = NETWORK_SERVICE_DOMAIN_CS;
148 else if (!g_strcmp0(domain, "packet")) {
149 data_service_domain.domain = NETWORK_SERVICE_DOMAIN_PS;
151 else if (!g_strcmp0(domain, "combined")) {
152 data_service_domain.domain = NETWORK_SERVICE_DOMAIN_COMBINED;
158 resp.result = TCORE_RETURN_EINVAL;
159 _request_fail(ur, TRESP_NETWORK_SET_SERVICE_DOMAIN, sizeof(struct tresp_network_set_service_domain), &resp);
165 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_service_domain), &data_service_domain);
166 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_SERVICE_DOMAIN);
170 case TAPI_SERVICE_NETWORK_GET_SERVICE_DOMAIN:
171 tcore_user_request_set_data(ur, 0, NULL);
172 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_SERVICE_DOMAIN);
175 case TAPI_SERVICE_NETWORK_SET_BAND :{
176 struct treq_network_set_band data_band;
177 struct tresp_network_set_band resp;
181 mode = sipc_util_marshal_object_get_string(in_obj, "mode");
184 resp.result = TCORE_RETURN_EINVAL;
185 _request_fail(ur, TRESP_NETWORK_SET_BAND, sizeof(struct tresp_network_set_band), &resp);
189 band = sipc_util_marshal_object_get_int(in_obj, "band");
191 if (!g_strcmp0(mode, "only")) {
192 data_band.mode = NETWORK_BAND_MODE_ONLY;
194 else if (!g_strcmp0(mode, "preferred")) {
195 data_band.mode = NETWORK_BAND_MODE_PREFERRED;
201 resp.result = TCORE_RETURN_EINVAL;
202 _request_fail(ur, TRESP_NETWORK_SET_BAND, sizeof(struct tresp_network_set_band), &resp);
206 data_band.band = band;
210 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_band), &data_band);
211 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_BAND);
215 case TAPI_SERVICE_NETWORK_GET_BAND:
216 tcore_user_request_set_data(ur, 0, NULL);
217 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_BAND);
220 case TAPI_SERVICE_NETWORK_SET_PREFERRED_PLMN :{
221 struct treq_network_set_preferred_plmn data_preferred_plmn;
222 struct tresp_network_set_preferred_plmn resp;
228 mode = sipc_util_marshal_object_get_string(in_obj, "mode");
231 resp.result = TCORE_RETURN_EINVAL;
232 _request_fail(ur, TRESP_NETWORK_SET_PREFERRED_PLMN, sizeof(struct tresp_network_set_preferred_plmn), &resp);
236 plmn = sipc_util_marshal_object_get_string(in_obj, "plmn");
240 resp.result = TCORE_RETURN_EINVAL;
241 _request_fail(ur, TRESP_NETWORK_SET_PREFERRED_PLMN, sizeof(struct tresp_network_set_preferred_plmn), &resp);
245 act = sipc_util_marshal_object_get_int(in_obj, "act");
246 ef_index = sipc_util_marshal_object_get_int(in_obj, "ef_index");
248 if (!g_strcmp0(mode, "add")) {
249 data_preferred_plmn.operation = NETWORK_PREF_PLMN_ADD;
252 else if (!g_strcmp0(mode, "edit")) {
253 data_preferred_plmn.operation = NETWORK_PREF_PLMN_EDIT;
256 else if (!g_strcmp0(mode, "delete")) {
257 data_preferred_plmn.operation = NETWORK_PREF_PLMN_DELETE;
264 resp.result = TCORE_RETURN_EINVAL;
265 _request_fail(ur, TRESP_NETWORK_SET_PREFERRED_PLMN, sizeof(struct tresp_network_set_preferred_plmn), &resp);
269 snprintf(data_preferred_plmn.plmn, 6, "%s", plmn);
270 if (strlen(data_preferred_plmn.plmn) <= 5)
271 data_preferred_plmn.plmn[5] = '#';
273 data_preferred_plmn.act = act;
274 data_preferred_plmn.ef_index = ef_index;
279 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_preferred_plmn), &data_preferred_plmn);
280 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_PREFERRED_PLMN);
284 case TAPI_SERVICE_NETWORK_GET_PREFERRED_PLMN:
285 tcore_user_request_set_data(ur, 0, NULL);
286 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_PREFERRED_PLMN);
289 case TAPI_SERVICE_NETWORK_SET_ORDER :{
290 struct treq_network_set_order data_order;
291 struct tresp_network_set_order resp;
294 order = sipc_util_marshal_object_get_string(in_obj, "order");
297 resp.result = TCORE_RETURN_EINVAL;
298 _request_fail(ur, TRESP_NETWORK_SET_ORDER, sizeof(struct tresp_network_set_order), &resp);
302 if (!g_strcmp0(order, "auto")) {
303 data_order.order = NETWORK_ORDER_AUTO;
305 else if (!g_strcmp0(order, "gsm")) {
306 data_order.order = NETWORK_ORDER_GSM_FIRST;
308 else if (!g_strcmp0(order, "wcdma")) {
309 data_order.order = NETWORK_ORDER_WCDMA_FIRST;
311 else if (!g_strcmp0(order, "no_change")) {
312 data_order.order = NETWORK_ORDER_NO_CHANGE;
317 resp.result = TCORE_RETURN_EINVAL;
318 _request_fail(ur, TRESP_NETWORK_SET_ORDER, sizeof(struct tresp_network_set_order), &resp);
324 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_order), &data_order);
325 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_ORDER);
329 case TAPI_SERVICE_NETWORK_GET_ORDER:
330 tcore_user_request_set_data(ur, 0, NULL);
331 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_ORDER);
334 case TAPI_SERVICE_NETWORK_SET_POWER_ON_ATTACH :{
335 struct treq_network_set_power_on_attach data_power_on_attach;
338 enable = sipc_util_marshal_object_get_boolean(in_obj, "enable");
340 data_power_on_attach.enable = enable;
342 tcore_user_request_set_data(ur, sizeof(struct treq_network_set_power_on_attach), &data_power_on_attach);
343 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_POWER_ON_ATTACH);
347 case TAPI_SERVICE_NETWORK_GET_POWER_ON_ATTACH:
348 tcore_user_request_set_data(ur, 0, NULL);
349 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_POWER_ON_ATTACH);
352 case TAPI_SERVICE_NETWORK_SET_CANCEL_MANUAL_SEARCH:
353 tcore_user_request_set_data(ur, 0, NULL);
354 tcore_user_request_set_command(ur, TREQ_NETWORK_SET_CANCEL_MANUAL_SEARCH);
357 case TAPI_SERVICE_NETWORK_GET_SERVING_NETWORK:
358 tcore_user_request_set_data(ur, 0, NULL);
359 tcore_user_request_set_command(ur, TREQ_NETWORK_GET_SERVING_NETWORK);
364 sipc_util_marshal_object_destory(in_obj);
365 out_obj = sipc_util_marshal_object_create();
366 sipc_util_marshal_object_add_data(out_obj, "result", &result, SIPC_MARSHAL_DATA_BOOLEAN_TYPE);
368 dbg("result = %d", result);
370 *outparam = sipc_util_marshal_object_serializer(out_obj);
371 sipc_util_marshal_object_destory(out_obj);
373 if (result == FALSE) {
374 tcore_user_request_unref(ur);
378 ret = tcore_communicator_dispatch_request(c, ur);
379 if (ret != TCORE_RETURN_SUCCESS) {
386 gboolean scomm_service_response_network(Communicator *comm, UserRequest *ur, enum tcore_response_command command,
387 unsigned int data_len, const void *data)
389 const struct tresp_network_search *resp_network_search = data;
390 const struct tresp_network_set_plmn_selection_mode *resp_set_plmn_selection_mode = data;
391 const struct tresp_network_get_plmn_selection_mode *resp_get_plmn_selection_mode = data;
392 const struct tresp_network_set_service_domain *resp_set_service_domain = data;
393 const struct tresp_network_get_service_domain *resp_get_service_domain = data;
394 const struct tresp_network_set_band *resp_set_band = data;
395 const struct tresp_network_get_band *resp_get_band = data;
396 const struct tresp_network_set_preferred_plmn *resp_set_preferred_plmn = data;
397 const struct tresp_network_get_preferred_plmn *resp_get_preferred_plmn = data;
398 const struct tresp_network_set_order *resp_set_order = data;
399 const struct tresp_network_get_order *resp_get_order = data;
400 const struct tresp_network_set_power_on_attach *resp_set_power_on_attach = data;
401 const struct tresp_network_get_power_on_attach *resp_get_power_on_attach = data;
402 const struct tresp_network_set_cancel_manual_search *resp_set_cancel_manual_search = data;
403 const struct tresp_network_get_serving_network *resp_get_serving_network = data;
408 gchar *serial_d = NULL;
409 gchar entry_key[10] = { 0, };
410 struct custom_data *ctx = NULL;
411 const struct tcore_user_info *ui;
412 struct _tapi_header hdr;
413 struct _sipc_marshal_object* out_obj = NULL;
414 struct _sipc_marshal_object* entry_obj = NULL;
415 struct _sipc_marshal_object* in_obj = NULL;
417 ctx = tcore_communicator_ref_user_data(comm);
423 ui = tcore_user_request_ref_user_info(ur);
425 dbg("response command = [0x%x], data_len = %d", command, data_len);
426 dbg("channel_id = %d, client_cmd = %d", ui->channel_id, ui->client_cmd);
428 memset(&hdr, 0, sizeof(struct _tapi_header));
429 hdr.cmd = (tapi_service_command_e) ui->client_cmd;
431 out_obj = sipc_util_marshal_object_create();
434 case TRESP_NETWORK_SEARCH:
435 sipc_util_marshal_object_add_data(out_obj, "count", &resp_network_search->list_count,
436 SIPC_MARSHAL_DATA_INT_TYPE);
438 dbg("count = %d", resp_network_search->list_count);
439 for (i = 0; i < resp_network_search->list_count; i++) {
440 entry_obj = sipc_util_marshal_object_create();
441 sipc_util_marshal_object_add_data(entry_obj, "plmn", resp_network_search->list[i].plmn,
442 SIPC_MARSHAL_DATA_STRING_TYPE);
443 sipc_util_marshal_object_add_data(entry_obj, "status", &resp_network_search->list[i].status,
444 SIPC_MARSHAL_DATA_INT_TYPE);
445 sipc_util_marshal_object_add_data(entry_obj, "act", &resp_network_search->list[i].act,
446 SIPC_MARSHAL_DATA_INT_TYPE);
448 snprintf(entry_key, 10, "%d", i);
449 sipc_util_marshal_object_add_data(out_obj, entry_key, entry_obj, SIPC_MARSHAL_DATA_OBJECT_TYPE);
452 "entry=%p, key=%s, plmn=%s, status=%d, act=%d",
454 entry_key, resp_network_search->list[i].plmn, resp_network_search->list[i].status, resp_network_search->list[i].act);
458 case TRESP_NETWORK_SET_PLMN_SELECTION_MODE:
459 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_plmn_selection_mode->result,
460 SIPC_MARSHAL_DATA_INT_TYPE);
463 case TRESP_NETWORK_GET_PLMN_SELECTION_MODE:
464 switch (resp_get_plmn_selection_mode->mode) {
465 case NETWORK_SELECT_MODE_GSM_MANUAL:
466 sipc_util_marshal_object_add_data(out_obj, "mode", "manual", SIPC_MARSHAL_DATA_STRING_TYPE);
469 case NETWORK_SELECT_MODE_CDMA:
470 sipc_util_marshal_object_add_data(out_obj, "mode", "cdma", SIPC_MARSHAL_DATA_STRING_TYPE);
473 case NETWORK_SELECT_MODE_GLOBAL_AUTOMATIC:
475 sipc_util_marshal_object_add_data(out_obj, "mode", "automatic", SIPC_MARSHAL_DATA_STRING_TYPE);
476 sipc_util_marshal_object_add_data(out_obj, "mode", "automatic", SIPC_MARSHAL_DATA_STRING_TYPE);
481 case TRESP_NETWORK_SET_SERVICE_DOMAIN:
482 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_service_domain->result,
483 SIPC_MARSHAL_DATA_INT_TYPE);
486 case TRESP_NETWORK_GET_SERVICE_DOMAIN:
487 switch (resp_get_service_domain->domain) {
488 case NETWORK_SERVICE_DOMAIN_CS:
489 sipc_util_marshal_object_add_data(out_obj, "domain", "circuit", SIPC_MARSHAL_DATA_STRING_TYPE);
492 case NETWORK_SERVICE_DOMAIN_PS:
493 sipc_util_marshal_object_add_data(out_obj, "domain", "packet", SIPC_MARSHAL_DATA_STRING_TYPE);
496 case NETWORK_SERVICE_DOMAIN_COMBINED:
498 sipc_util_marshal_object_add_data(out_obj, "domain", "combined", SIPC_MARSHAL_DATA_STRING_TYPE);
503 case TRESP_NETWORK_SET_BAND:
504 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_band->result, SIPC_MARSHAL_DATA_INT_TYPE);
507 case TRESP_NETWORK_GET_BAND:
508 sipc_util_marshal_object_add_data(out_obj, "band", &resp_get_band->band, SIPC_MARSHAL_DATA_INT_TYPE);
509 if (resp_get_band->mode == NETWORK_BAND_MODE_ONLY) {
510 sipc_util_marshal_object_add_data(out_obj, "mode", "only", SIPC_MARSHAL_DATA_STRING_TYPE);
512 else if (resp_get_band->mode == NETWORK_BAND_MODE_PREFERRED) {
513 sipc_util_marshal_object_add_data(out_obj, "mode", "preferred", SIPC_MARSHAL_DATA_STRING_TYPE);
517 case TRESP_NETWORK_SET_PREFERRED_PLMN:
518 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_preferred_plmn->result,
519 SIPC_MARSHAL_DATA_INT_TYPE);
522 case TRESP_NETWORK_GET_PREFERRED_PLMN:
523 sipc_util_marshal_object_add_data(out_obj, "count", &resp_get_preferred_plmn->list_count,
524 SIPC_MARSHAL_DATA_INT_TYPE);
526 for (i = 0; i < resp_network_search->list_count; i++) {
527 entry_obj = sipc_util_marshal_object_create();
528 sipc_util_marshal_object_add_data(entry_obj, "plmn", resp_get_preferred_plmn->list[i].plmn,
529 SIPC_MARSHAL_DATA_STRING_TYPE);
530 sipc_util_marshal_object_add_data(entry_obj, "ef_index", &resp_get_preferred_plmn->list[i].ef_index,
531 SIPC_MARSHAL_DATA_INT_TYPE);
532 sipc_util_marshal_object_add_data(entry_obj, "act", &resp_get_preferred_plmn->list[i].act,
533 SIPC_MARSHAL_DATA_INT_TYPE);
534 snprintf(entry_key, 10, "%d", i);
535 sipc_util_marshal_object_add_data(out_obj, entry_key, entry_obj, SIPC_MARSHAL_DATA_OBJECT_TYPE);
539 case TRESP_NETWORK_SET_ORDER:
540 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_order->result, SIPC_MARSHAL_DATA_INT_TYPE);
543 case TRESP_NETWORK_GET_ORDER:
544 switch (resp_get_order->order) {
545 case NETWORK_ORDER_GSM_FIRST:
546 sipc_util_marshal_object_add_data(out_obj, "order", "gsm", SIPC_MARSHAL_DATA_STRING_TYPE);
549 case NETWORK_ORDER_WCDMA_FIRST:
550 sipc_util_marshal_object_add_data(out_obj, "order", "wcdma", SIPC_MARSHAL_DATA_STRING_TYPE);
553 case NETWORK_ORDER_NO_CHANGE:
554 sipc_util_marshal_object_add_data(out_obj, "order", "no_change", SIPC_MARSHAL_DATA_STRING_TYPE);
557 case NETWORK_ORDER_AUTO:
559 sipc_util_marshal_object_add_data(out_obj, "order", "auto", SIPC_MARSHAL_DATA_STRING_TYPE);
565 case TRESP_NETWORK_SET_POWER_ON_ATTACH:
566 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_power_on_attach->result,
567 SIPC_MARSHAL_DATA_INT_TYPE);
570 case TRESP_NETWORK_GET_POWER_ON_ATTACH:
571 sipc_util_marshal_object_add_data(out_obj, "enabled", &resp_get_power_on_attach->enabled,
572 SIPC_MARSHAL_DATA_BOOLEAN_TYPE);
575 case TRESP_NETWORK_SET_CANCEL_MANUAL_SEARCH:
576 sipc_util_marshal_object_add_data(out_obj, "result", &resp_set_cancel_manual_search->result,
577 SIPC_MARSHAL_DATA_INT_TYPE);
580 case TRESP_NETWORK_GET_SERVING_NETWORK:
581 sipc_util_marshal_object_add_data(out_obj, "plmn", resp_get_serving_network->plmn, SIPC_MARSHAL_DATA_STRING_TYPE);
582 sipc_util_marshal_object_add_data(out_obj, "act", &resp_get_serving_network->act, SIPC_MARSHAL_DATA_INT_TYPE);
583 sipc_util_marshal_object_add_data(out_obj, "lac", &resp_get_serving_network->gsm.lac, SIPC_MARSHAL_DATA_INT_TYPE);
584 sipc_util_marshal_object_add_data(out_obj, "carrier", &resp_get_serving_network->cdma.carrier, SIPC_MARSHAL_DATA_INT_TYPE);
585 sipc_util_marshal_object_add_data(out_obj, "sid", &resp_get_serving_network->cdma.sid, SIPC_MARSHAL_DATA_INT_TYPE);
586 sipc_util_marshal_object_add_data(out_obj, "nid", &resp_get_serving_network->cdma.nid, SIPC_MARSHAL_DATA_INT_TYPE);
587 sipc_util_marshal_object_add_data(out_obj, "bs_id", &resp_get_serving_network->cdma.bs_id, SIPC_MARSHAL_DATA_INT_TYPE);
588 sipc_util_marshal_object_add_data(out_obj, "bs_lat", &resp_get_serving_network->cdma.bs_lat, SIPC_MARSHAL_DATA_INT_TYPE);
589 sipc_util_marshal_object_add_data(out_obj, "bs_long", &resp_get_serving_network->cdma.bs_long, SIPC_MARSHAL_DATA_INT_TYPE);
590 sipc_util_marshal_object_add_data(out_obj, "reg_zone", &resp_get_serving_network->cdma.reg_zone, SIPC_MARSHAL_DATA_INT_TYPE);
591 sipc_util_marshal_object_add_data(out_obj, "pilot_pn", &resp_get_serving_network->cdma.pilot_pn, SIPC_MARSHAL_DATA_INT_TYPE);
596 serial_d = sipc_util_marshal_object_serializer(out_obj);
597 hdr.data_len = strlen(serial_d);
598 dbg("data_len = %d", hdr.data_len);
599 sipc_util_marshal_object_destory(out_obj);
602 out_d = g_new0(char, sizeof(struct _tapi_header) + hdr.data_len);
603 memcpy(out_d, &hdr, sizeof(struct _tapi_header));
606 memcpy(out_d + sizeof(struct _tapi_header), serial_d, hdr.data_len);
607 dbg("serial_d = [%s]", serial_d);
611 ret = sipc_server_send(ctx->sk_server, ui->channel_id, out_d, sizeof(struct _tapi_header) + hdr.data_len,
612 SIPC_SEND_DATA_ASYNC);
616 dbg("ret = %d", ret);
623 gboolean scomm_service_notification_network(Communicator *comm, CoreObject *source, enum tcore_notification_command command,
624 unsigned int data_len, const void *data)
626 const struct tnoti_network_registration_status *noti_registration_status = data;
627 const struct tnoti_network_location_cellinfo *noti_location_cellinfo = data;
628 const struct tnoti_network_icon_info *noti_icon_info = data;
629 const struct tnoti_network_change *noti_change = data;
630 const struct tnoti_network_timeinfo *noti_timeinfo = data;
631 const struct tnoti_network_identity *noti_identity = data;
634 struct custom_data *ctx = NULL;
635 struct _tapi_header hdr;
636 struct _sipc_marshal_object* out_obj = NULL;
637 gchar *out_d = NULL, *serial_d = NULL;
639 memset(&hdr, 0, sizeof(struct _tapi_header));
641 ctx = tcore_communicator_ref_user_data(comm);
643 dbg("user_data is NULL");
647 dbg("notification !!! (command = 0x%x, data_len = %d)", command, data_len);
650 case TNOTI_NETWORK_REGISTRATION_STATUS:
651 hdr.cmd = TAPI_NOTI_NETWORK_REGISTRATION_STATUS;
653 out_obj = sipc_util_marshal_object_create();
654 switch (noti_registration_status->cs_domain_status) {
655 case NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY:
656 sipc_util_marshal_object_add_data(out_obj, "circuit", "emergency", SIPC_MARSHAL_DATA_STRING_TYPE);
658 case NETWORK_SERVICE_DOMAIN_STATUS_FULL:
659 sipc_util_marshal_object_add_data(out_obj, "circuit", "full", SIPC_MARSHAL_DATA_STRING_TYPE);
661 case NETWORK_SERVICE_DOMAIN_STATUS_SEARCH:
662 sipc_util_marshal_object_add_data(out_obj, "circuit", "search", SIPC_MARSHAL_DATA_STRING_TYPE);
664 case NETWORK_SERVICE_DOMAIN_STATUS_NO:
666 sipc_util_marshal_object_add_data(out_obj, "circuit", "none", SIPC_MARSHAL_DATA_STRING_TYPE);
670 switch (noti_registration_status->ps_domain_status) {
671 case NETWORK_SERVICE_DOMAIN_STATUS_EMERGENCY:
672 sipc_util_marshal_object_add_data(out_obj, "packet", "emergency", SIPC_MARSHAL_DATA_STRING_TYPE);
674 case NETWORK_SERVICE_DOMAIN_STATUS_FULL:
675 sipc_util_marshal_object_add_data(out_obj, "packet", "full", SIPC_MARSHAL_DATA_STRING_TYPE);
677 case NETWORK_SERVICE_DOMAIN_STATUS_SEARCH:
678 sipc_util_marshal_object_add_data(out_obj, "packet", "search", SIPC_MARSHAL_DATA_STRING_TYPE);
680 case NETWORK_SERVICE_DOMAIN_STATUS_NO:
682 sipc_util_marshal_object_add_data(out_obj, "packet", "none", SIPC_MARSHAL_DATA_STRING_TYPE);
685 sipc_util_marshal_object_add_data(out_obj, "service_type", ¬i_registration_status->service_type, SIPC_MARSHAL_DATA_INT_TYPE);
686 sipc_util_marshal_object_add_data(out_obj, "roaming_status", ¬i_registration_status->roaming_status, SIPC_MARSHAL_DATA_BOOLEAN_TYPE);
689 case TNOTI_NETWORK_LOCATION_CELLINFO:
690 hdr.cmd = TAPI_NOTI_NETWORK_LOCATION_CELLINFO;
692 out_obj = sipc_util_marshal_object_create();
693 sipc_util_marshal_object_add_data(out_obj, "lac", ¬i_location_cellinfo->lac, SIPC_MARSHAL_DATA_INT_TYPE);
694 sipc_util_marshal_object_add_data(out_obj, "cell_id", ¬i_location_cellinfo->cell_id, SIPC_MARSHAL_DATA_INT_TYPE);
697 case TNOTI_NETWORK_ICON_INFO:
698 hdr.cmd = TAPI_NOTI_NETWORK_ICON_INFO;
700 out_obj = sipc_util_marshal_object_create();
701 if (noti_icon_info->type & 0x01) {
702 sipc_util_marshal_object_add_data(out_obj, "rssi", ¬i_icon_info->rssi,
703 SIPC_MARSHAL_DATA_INT_TYPE);
705 if (noti_icon_info->type & 0x02) {
706 sipc_util_marshal_object_add_data(out_obj, "battery", ¬i_icon_info->battery,
707 SIPC_MARSHAL_DATA_INT_TYPE);
709 if (noti_icon_info->type & 0x04) {
710 sipc_util_marshal_object_add_data(out_obj, "hdr_rssi", ¬i_icon_info->hdr_rssi,
711 SIPC_MARSHAL_DATA_INT_TYPE);
715 case TNOTI_NETWORK_CHANGE:
716 hdr.cmd = TAPI_NOTI_NETWORK_CHANGE;
718 out_obj = sipc_util_marshal_object_create();
719 sipc_util_marshal_object_add_data(out_obj, "plmn", noti_change->plmn, SIPC_MARSHAL_DATA_STRING_TYPE);
720 sipc_util_marshal_object_add_data(out_obj, "act", ¬i_change->act, SIPC_MARSHAL_DATA_INT_TYPE);
721 sipc_util_marshal_object_add_data(out_obj, "lac", ¬i_change->gsm.lac, SIPC_MARSHAL_DATA_INT_TYPE);
722 sipc_util_marshal_object_add_data(out_obj, "carrier", ¬i_change->cdma.carrier, SIPC_MARSHAL_DATA_INT_TYPE);
723 sipc_util_marshal_object_add_data(out_obj, "sid", ¬i_change->cdma.sid, SIPC_MARSHAL_DATA_INT_TYPE);
724 sipc_util_marshal_object_add_data(out_obj, "nid", ¬i_change->cdma.nid, SIPC_MARSHAL_DATA_INT_TYPE);
725 sipc_util_marshal_object_add_data(out_obj, "bs_id", ¬i_change->cdma.bs_id, SIPC_MARSHAL_DATA_INT_TYPE);
726 sipc_util_marshal_object_add_data(out_obj, "bs_lat", ¬i_change->cdma.bs_lat, SIPC_MARSHAL_DATA_INT_TYPE);
727 sipc_util_marshal_object_add_data(out_obj, "bs_long", ¬i_change->cdma.bs_long, SIPC_MARSHAL_DATA_INT_TYPE);
728 sipc_util_marshal_object_add_data(out_obj, "reg_zone", ¬i_change->cdma.reg_zone, SIPC_MARSHAL_DATA_INT_TYPE);
729 sipc_util_marshal_object_add_data(out_obj, "pilot_pn", ¬i_change->cdma.pilot_pn, SIPC_MARSHAL_DATA_INT_TYPE);
732 case TNOTI_NETWORK_TIMEINFO:
733 hdr.cmd = TAPI_NOTI_NETWORK_TIMEINFO;
735 out_obj = sipc_util_marshal_object_create();
736 sipc_util_marshal_object_add_data(out_obj, "plmn", noti_timeinfo->plmn, SIPC_MARSHAL_DATA_STRING_TYPE);
737 sipc_util_marshal_object_add_data(out_obj, "year", ¬i_timeinfo->year, SIPC_MARSHAL_DATA_INT_TYPE);
738 sipc_util_marshal_object_add_data(out_obj, "month", ¬i_timeinfo->month, SIPC_MARSHAL_DATA_INT_TYPE);
739 sipc_util_marshal_object_add_data(out_obj, "day", ¬i_timeinfo->day, SIPC_MARSHAL_DATA_INT_TYPE);
740 sipc_util_marshal_object_add_data(out_obj, "hour", ¬i_timeinfo->hour, SIPC_MARSHAL_DATA_INT_TYPE);
741 sipc_util_marshal_object_add_data(out_obj, "minute", ¬i_timeinfo->minute, SIPC_MARSHAL_DATA_INT_TYPE);
742 sipc_util_marshal_object_add_data(out_obj, "second", ¬i_timeinfo->second, SIPC_MARSHAL_DATA_INT_TYPE);
743 sipc_util_marshal_object_add_data(out_obj, "wday", ¬i_timeinfo->wday, SIPC_MARSHAL_DATA_INT_TYPE);
744 sipc_util_marshal_object_add_data(out_obj, "gmtoff", ¬i_timeinfo->gmtoff, SIPC_MARSHAL_DATA_INT_TYPE);
745 sipc_util_marshal_object_add_data(out_obj, "dstoff", ¬i_timeinfo->dstoff, SIPC_MARSHAL_DATA_INT_TYPE);
746 sipc_util_marshal_object_add_data(out_obj, "isdst", ¬i_timeinfo->isdst, SIPC_MARSHAL_DATA_INT_TYPE);
749 case TNOTI_NETWORK_IDENTITY:
750 hdr.cmd = TAPI_NOTI_NETWORK_IDENTITY;
752 out_obj = sipc_util_marshal_object_create();
753 sipc_util_marshal_object_add_data(out_obj, "plmn", noti_identity->plmn, SIPC_MARSHAL_DATA_STRING_TYPE);
754 sipc_util_marshal_object_add_data(out_obj, "short_name", noti_identity->short_name, SIPC_MARSHAL_DATA_STRING_TYPE);
755 sipc_util_marshal_object_add_data(out_obj, "full_name", noti_identity->full_name, SIPC_MARSHAL_DATA_STRING_TYPE);
759 dbg("unknown notification");
765 serial_d = sipc_util_marshal_object_serializer(out_obj);
766 hdr.data_len = strlen(serial_d);
767 sipc_util_marshal_object_destory(out_obj);
770 out_d = g_new0(char, sizeof(struct _tapi_header)+hdr.data_len);
771 memcpy(out_d, &hdr, sizeof(struct _tapi_header));
773 memcpy(out_d + sizeof(struct _tapi_header), serial_d, hdr.data_len);
777 dbg("len = %d, cmd = 0x%x, serialize = [%s]", sizeof(struct _tapi_header) + hdr.data_len, hdr.cmd, out_d);
779 ret = sipc_server_broadcast(ctx->sk_server, out_d, sizeof(struct _tapi_header) + hdr.data_len);
780 dbg("ret = %d", ret);