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.
32 #include "generated-code.h"
33 #include "dtapi_common.h"
35 static gboolean on_sms_send_msg(TelephonySms *sms,
36 GDBusMethodInvocation *invocation,
37 gint format, GVariant *sca,
38 gint tpdu_length, GVariant *tpdu_data,
39 gint more_msg, gpointer user_data)
41 struct treq_sms_send_msg req;
42 struct custom_data *ctx = user_data;
43 enum tcore_request_command command;
44 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
47 GVariantIter *iter = NULL;
48 GVariant *inner_gv = NULL;
50 if (!check_access_control(p_cynara, invocation, AC_SMS, "x"))
53 memset(&req, 0x0, sizeof(struct treq_sms_send_msg));
55 if (SMS_NETTYPE_3GPP == format) {
56 command = TREQ_SMS_SEND_UMTS_MSG;
57 } else if (SMS_NETTYPE_3GPP2 == format) {
58 command = TREQ_SMS_SEND_CDMA_MSG;
60 err("Invalid Format Received:[%d]", format);
62 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
67 inner_gv = g_variant_get_variant(sca);
68 g_variant_get(inner_gv, "ay", &iter);
69 while (g_variant_iter_loop(iter, "y", &req.msgDataPackage.sca[i])) {
71 if (i >= SMS_SMSP_ADDRESS_LEN)
74 g_variant_iter_free(iter);
75 g_variant_unref(inner_gv);
77 req.msgDataPackage.msgLength = tpdu_length;
80 inner_gv = g_variant_get_variant(tpdu_data);
81 g_variant_get(inner_gv, "ay", &iter);
82 while (g_variant_iter_loop(iter, "y", &req.msgDataPackage.tpduData[i])) {
84 if (i >= SMS_SMDATA_SIZE_MAX + 1)
87 g_variant_iter_free(iter);
88 g_variant_unref(inner_gv);
90 req.msgDataPackage.format = format;
93 /* Dispatch request */
94 dtapi_dispatch_request(ctx, sms, invocation,
96 &req, sizeof(struct treq_sms_send_msg));
101 static gboolean on_sms_read_msg(TelephonySms *sms,
102 GDBusMethodInvocation *invocation, gint msg_index, gpointer user_data)
104 struct treq_sms_read_msg req;
105 struct custom_data *ctx = user_data;
106 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
108 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
111 req.index = msg_index;
113 /* Dispatch request */
114 dtapi_dispatch_request(ctx, sms, invocation,
116 &req, sizeof(struct treq_sms_read_msg));
121 static gboolean on_sms_save_msg(TelephonySms *sms,
122 GDBusMethodInvocation *invocation,
123 gint format, gint msg_status, GVariant *sca,
124 gint tpdu_length, GVariant *tpdu_data, gpointer user_data)
126 struct treq_sms_save_msg req;
127 struct custom_data *ctx = user_data;
128 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
131 GVariantIter *iter = NULL;
132 GVariant *inner_gv = NULL;
134 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
137 if (SMS_NETTYPE_3GPP == format) {
138 req.msgDataPackage.format = SMS_NETTYPE_3GPP;
139 } else if (SMS_NETTYPE_3GPP2 == format) {
140 req.msgDataPackage.format = SMS_NETTYPE_3GPP2;
142 err("Invalid Format Received:[%d]", format);
144 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
149 req.simIndex = 0xffff;
150 req.msgStatus = msg_status;
152 inner_gv = g_variant_get_variant(sca);
153 g_variant_get(inner_gv, "ay", &iter);
154 while (g_variant_iter_loop(iter, "y", &req.msgDataPackage.sca[i])) {
156 if (i >= SMS_SMSP_ADDRESS_LEN)
159 g_variant_iter_free(iter);
160 g_variant_unref(inner_gv);
163 inner_gv = g_variant_get_variant(tpdu_data);
164 g_variant_get(inner_gv, "ay", &iter);
165 while (g_variant_iter_loop(iter, "y", &req.msgDataPackage.tpduData[i])) {
167 if (i >= SMS_SMDATA_SIZE_MAX + 1)
170 g_variant_iter_free(iter);
171 g_variant_unref(inner_gv);
173 req.msgDataPackage.msgLength = tpdu_length;
175 /* Dispatch request */
176 dtapi_dispatch_request(ctx, sms, invocation,
178 &req, sizeof(struct treq_sms_save_msg));
183 static gboolean on_sms_delete_msg(TelephonySms *sms,
184 GDBusMethodInvocation *invocation, gint msg_index, gpointer user_data)
186 struct treq_sms_delete_msg req;
187 struct custom_data *ctx = user_data;
188 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
190 if (!check_access_control(p_cynara, invocation, AC_SMS, "x"))
193 req.index = msg_index;
195 /* Dispatch request */
196 dtapi_dispatch_request(ctx, sms, invocation,
198 &req, sizeof(struct treq_sms_delete_msg));
203 static gboolean on_sms_get_msg_count(TelephonySms *sms,
204 GDBusMethodInvocation *invocation, gpointer user_data)
206 struct custom_data *ctx = user_data;
207 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
209 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
212 /* Dispatch request */
213 dtapi_dispatch_request(ctx, sms, invocation,
220 static gboolean on_sms_get_sca(TelephonySms *sms,
221 GDBusMethodInvocation *invocation, gint msg_index, gpointer user_data)
223 struct treq_sms_get_sca req;
224 struct custom_data *ctx = user_data;
225 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
227 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
230 req.index = msg_index;
232 /* Dispatch request */
233 dtapi_dispatch_request(ctx, sms, invocation,
235 &req, sizeof(struct treq_sms_get_sca));
240 static gboolean on_sms_set_sca(TelephonySms *sms,
241 GDBusMethodInvocation *invocation,
243 gint sca_ton, gint sca_npi, gint sca_length, GVariant *sca,
246 struct custom_data *ctx = user_data;
247 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
249 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
252 if ((sca_length <= 0)
253 || (sca_length > (SMS_MAX_SMS_SERVICE_CENTER_ADDR + 1))) {
254 err("[tcore_SMS] TAPI_API_INVALID_INPUT !!!");
256 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
257 } else if (msg_index != 0) {
258 err("[tcore_SMS] Index except 0 is supported");
260 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
262 struct treq_sms_set_sca req;
265 GVariantIter *iter = NULL;
266 GVariant *inner_gv = NULL;
268 memset(&req, 0, sizeof(struct treq_sms_set_sca));
270 req.index = msg_index;
271 req.scaInfo.dialNumLen = sca_length;
272 req.scaInfo.typeOfNum = sca_ton;
273 req.scaInfo.numPlanId = sca_npi;
275 inner_gv = g_variant_get_variant(sca);
276 g_variant_get(inner_gv, "ay", &iter);
277 while (g_variant_iter_loop(iter, "y", &req.scaInfo.diallingNum[i])) {
279 if (i >= SMS_SMSP_ADDRESS_LEN + 1)
283 g_variant_iter_free(iter);
284 g_variant_unref(inner_gv);
286 /* Dispatch request */
287 dtapi_dispatch_request(ctx, sms, invocation,
289 &req, sizeof(struct treq_sms_set_sca));
295 static gboolean on_sms_get_cb_config(TelephonySms *sms,
296 GDBusMethodInvocation *invocation, gpointer user_data)
298 struct custom_data *ctx = user_data;
299 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
301 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
304 /* Dispatch request */
305 dtapi_dispatch_request(ctx, sms, invocation,
306 TREQ_SMS_GET_CB_CONFIG,
312 static gboolean on_sms_set_cb_config(TelephonySms *sms,
313 GDBusMethodInvocation *invocation,
314 gint network_type, gboolean enable_cb,
315 gint msg_id_max_cnt, gint msg_id_range_cnt,
316 GVariant *arg_mdgId, gpointer user_data)
318 struct treq_sms_set_cb_config req;
319 struct custom_data *ctx = user_data;
320 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
322 GVariant *value = NULL;
323 GVariant *inner_gv = NULL;
324 GVariantIter *iter = NULL;
325 GVariantIter *iter_row = NULL;
326 const gchar *key = NULL;
329 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
332 req.net3gppType = network_type;
333 req.cbEnabled = enable_cb;
334 req.msgIdMaxCount = msg_id_max_cnt;
335 req.msgIdRangeCount = msg_id_range_cnt;
337 inner_gv = g_variant_get_variant(arg_mdgId);
338 g_variant_get(inner_gv, "aa{sv}", &iter);
339 while (g_variant_iter_next(iter, "a{sv}", &iter_row)) {
340 while (g_variant_iter_loop(iter_row, "{sv}", &key, &value)) {
341 if (!g_strcmp0(key, "FromMsgId"))
342 req.msgIDs[i].net3gpp.fromMsgId = g_variant_get_uint16(value);
343 else if (!g_strcmp0(key, "ToMsgId"))
344 req.msgIDs[i].net3gpp.toMsgId = g_variant_get_uint16(value);
345 else if (!g_strcmp0(key, "CBCategory"))
346 req.msgIDs[i].net3gpp2.cbCategory = g_variant_get_uint16(value);
347 else if (!g_strcmp0(key, "CBLanguage"))
348 req.msgIDs[i].net3gpp2.cbLanguage = g_variant_get_uint16(value);
349 else if (!g_strcmp0(key, "Selected"))
350 req.msgIDs[i].net3gpp2.selected = g_variant_get_byte(value);
352 g_variant_iter_free(iter_row);
355 if (i >= SMS_GSM_SMS_CBMI_LIST_SIZE_MAX)
358 g_variant_iter_free(iter);
359 g_variant_unref(inner_gv);
361 /* Dispatch request */
362 dtapi_dispatch_request(ctx, sms, invocation,
363 TREQ_SMS_SET_CB_CONFIG,
364 &req, sizeof(struct treq_sms_set_cb_config));
369 static gboolean on_sms_set_mem_status(TelephonySms *sms,
370 GDBusMethodInvocation *invocation,
371 gint memory_status, gpointer user_data)
373 struct treq_sms_set_mem_status req;
374 struct custom_data *ctx = user_data;
375 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
377 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
380 req.memory_status = memory_status;
382 /* Dispatch request */
383 dtapi_dispatch_request(ctx, sms, invocation,
384 TREQ_SMS_SET_MEM_STATUS,
385 &req, sizeof(struct treq_sms_set_mem_status));
390 static gboolean on_sms_get_pref_bearer(TelephonySms *sms,
391 GDBusMethodInvocation *invocation, gpointer user_data)
393 struct custom_data *ctx = user_data;
394 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
396 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
399 /* Dispatch request */
400 dtapi_dispatch_request(ctx, sms, invocation,
401 TREQ_SMS_GET_PREF_BEARER,
407 static gboolean on_sms_set_pref_bearer(TelephonySms *sms,
408 GDBusMethodInvocation *invocation,
409 gint bearer_type, gpointer user_data)
411 struct treq_sms_set_pref_bearer req;
412 struct custom_data *ctx = user_data;
413 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
415 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
418 req.svc = bearer_type;
420 /* Dispatch request */
421 dtapi_dispatch_request(ctx, sms, invocation,
422 TREQ_SMS_SET_PREF_BEARER,
423 &req, sizeof(struct treq_sms_set_pref_bearer));
428 static gboolean on_sms_set_delivery_report(TelephonySms *sms,
429 GDBusMethodInvocation *invocation,
430 gint format, const gchar *sca,
431 gint tpdu_length, const gchar *tpdu_data,
432 gint rp_cause, gpointer user_data)
434 struct treq_sms_set_delivery_report req;
435 struct custom_data *ctx = user_data;
436 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
438 guchar *decoded_sca = NULL;
439 guchar *decoded_tpdu = NULL;
441 gsize decoded_sca_len = 0;
442 gsize decoded_tpdu_len = 0;
444 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
447 memset(&req, 0, sizeof(struct treq_sms_set_delivery_report));
449 if (SMS_NETTYPE_3GPP == format) {
450 req.dataInfo.format = SMS_NETTYPE_3GPP;
451 } else if (SMS_NETTYPE_3GPP2 == format) {
452 req.dataInfo.format = SMS_NETTYPE_3GPP2;
454 err("Invalid Format Received:[%d]", format);
456 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
461 decoded_sca = g_base64_decode(sca, &decoded_sca_len);
462 if (NULL == decoded_sca) {
463 warn("g_base64_decode: Failed to decode sca");
465 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
468 } else if (decoded_sca_len > SMS_SMSP_ADDRESS_LEN) {
469 err("Invalid Sca length");
471 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
475 memcpy(req.dataInfo.sca, decoded_sca, decoded_sca_len);
477 decoded_tpdu = g_base64_decode(tpdu_data, &decoded_tpdu_len);
478 if (NULL == decoded_tpdu) {
479 warn("g_base64_decode: Failed to decode tpdu");
480 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
482 } else if (decoded_tpdu_len > SMS_SMDATA_SIZE_MAX+1) {
483 err("Invalid tpdu length");
485 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
489 memcpy(req.dataInfo.tpduData, decoded_tpdu, decoded_tpdu_len);
491 info("[%s] Decoded SCA len: [%d] TPDU len: [%d]", GET_CP_NAME(invocation),
492 decoded_sca_len, decoded_tpdu_len);
494 req.dataInfo.msgLength = tpdu_length;
495 req.rspType = rp_cause;
497 /* Dispatch request */
498 dtapi_dispatch_request(ctx, sms, invocation,
499 TREQ_SMS_SET_DELIVERY_REPORT,
500 &req, sizeof(struct treq_sms_set_delivery_report));
504 g_free(decoded_tpdu);
509 static gboolean on_sms_set_msg_status(TelephonySms *sms,
510 GDBusMethodInvocation *invocation,
511 gint msg_index, gint msg_status, gpointer user_data)
513 struct treq_sms_set_msg_status req;
514 struct custom_data *ctx = user_data;
515 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
517 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
520 req.index = msg_index;
521 req.msgStatus = msg_status;
523 /* Dispatch request */
524 dtapi_dispatch_request(ctx, sms, invocation,
525 TREQ_SMS_SET_MSG_STATUS,
526 &req, sizeof(struct treq_sms_set_msg_status));
531 static gboolean on_sms_get_sms_params(TelephonySms *sms,
532 GDBusMethodInvocation *invocation,
533 gint msg_index, gpointer user_data)
535 struct treq_sms_get_params req;
536 struct custom_data *ctx = user_data;
537 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
539 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
542 req.index = msg_index;
544 /* Dispatch request */
545 dtapi_dispatch_request(ctx, sms, invocation,
547 &req, sizeof(struct treq_sms_get_params));
552 static gboolean on_sms_set_sms_params(TelephonySms *sms,
553 GDBusMethodInvocation *invocation,
554 gint record_index, gint record_len,
555 gint alpha_id_len, GVariant *alpha_id,
556 gint param_indicator,
557 gint dial_num_len, gint dial_num_ton, gint dial_num_npi, GVariant *dial_num,
558 gint sca_len, gint sca_ton, gint sca_npi, GVariant *sca,
559 gint protocol_id, gint dcs, gint validity_period,
562 struct treq_sms_set_params req;
563 struct custom_data *ctx = user_data;
564 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
567 GVariantIter *iter = NULL;
568 GVariant *inner_gv = NULL;
570 if (!check_access_control(p_cynara, invocation, AC_SMS, "w"))
573 memset(&req, 0x0, sizeof(struct treq_sms_set_params));
575 req.params.recordIndex = record_index;
576 req.params.recordLen = record_len;
577 req.params.alphaIdLen = alpha_id_len;
579 inner_gv = g_variant_get_variant(alpha_id);
580 g_variant_get(inner_gv, "ay", &iter);
581 while (g_variant_iter_loop(iter, "y", &req.params.szAlphaId[i])) {
583 if (i >= SMS_SMSP_ALPHA_ID_LEN_MAX + 1)
586 g_variant_iter_free(iter);
587 g_variant_unref(inner_gv);
589 req.params.paramIndicator = param_indicator;
590 req.params.tpDestAddr.dialNumLen = dial_num_len;
591 req.params.tpDestAddr.typeOfNum = dial_num_ton;
592 req.params.tpDestAddr.numPlanId = dial_num_npi;
595 inner_gv = g_variant_get_variant(dial_num);
596 g_variant_get(inner_gv, "ay", &iter);
597 while (g_variant_iter_loop(iter, "y", &req.params.tpDestAddr.diallingNum[i])) {
599 if (i >= SMS_SMSP_ADDRESS_LEN + 1)
602 g_variant_iter_free(iter);
603 g_variant_unref(inner_gv);
605 req.params.tpSvcCntrAddr.dialNumLen = sca_len;
606 req.params.tpSvcCntrAddr.typeOfNum = sca_ton;
607 req.params.tpSvcCntrAddr.numPlanId = sca_npi;
610 inner_gv = g_variant_get_variant(sca);
611 g_variant_get(inner_gv, "ay", &iter);
612 while (g_variant_iter_loop(iter, "y", &req.params.tpSvcCntrAddr.diallingNum[i])) {
614 if (i >= SMS_SMSP_ADDRESS_LEN + 1)
617 g_variant_iter_free(iter);
618 g_variant_unref(inner_gv);
620 req.params.tpProtocolId = protocol_id;
621 req.params.tpDataCodingScheme = dcs;
622 req.params.tpValidityPeriod = validity_period;
624 /* Dispatch request */
625 dtapi_dispatch_request(ctx, sms, invocation,
627 &req, sizeof(struct treq_sms_set_params));
632 static gboolean on_sms_get_sms_param_cnt(TelephonySms *sms,
633 GDBusMethodInvocation *invocation, gpointer user_data)
635 struct custom_data *ctx = user_data;
636 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
638 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
641 /* Dispatch request */
642 dtapi_dispatch_request(ctx, sms, invocation,
643 TREQ_SMS_GET_PARAMCNT,
649 static gboolean on_sms_get_sms_ready_status(TelephonySms *sms,
650 GDBusMethodInvocation *invocation, gpointer user_data)
652 struct custom_data *ctx = user_data;
653 CoreObject *co_sms = NULL;
654 TcorePlugin *plugin = NULL;
655 gboolean ready_status = FALSE;
656 cynara *p_cynara = (ctx) ? ctx->p_cynara : NULL;
658 if (!check_access_control(p_cynara, invocation, AC_SMS, "r"))
661 plugin = tcore_server_find_plugin(ctx->server, GET_CP_NAME(invocation));
662 co_sms = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SMS);
664 err("co_sms is NULL");
666 FAIL_RESPONSE(invocation, DEFAULT_MSG_REQ_FAILED);
671 ready_status = tcore_sms_get_ready_status(co_sms);
672 dbg("[%s] ready_status = %d", GET_CP_NAME(invocation), ready_status);
674 telephony_sms_complete_get_sms_ready_status(sms, invocation, ready_status);
679 gboolean dbus_plugin_setup_sms_interface(TelephonyObjectSkeleton *object,
680 struct custom_data *ctx)
684 sms = telephony_sms_skeleton_new();
685 telephony_object_skeleton_set_sms(object, sms);
688 dbg("sms = %p", sms);
691 * Register signal handlers for SMS interface
693 g_signal_connect(sms,
695 G_CALLBACK(on_sms_send_msg), ctx);
697 g_signal_connect(sms,
699 G_CALLBACK(on_sms_read_msg), ctx);
701 g_signal_connect(sms,
703 G_CALLBACK(on_sms_save_msg), ctx);
705 g_signal_connect(sms,
707 G_CALLBACK(on_sms_delete_msg), ctx);
709 g_signal_connect(sms,
710 "handle-get-msg-count",
711 G_CALLBACK(on_sms_get_msg_count), ctx);
713 g_signal_connect(sms,
715 G_CALLBACK(on_sms_get_sca), ctx);
717 g_signal_connect(sms,
719 G_CALLBACK(on_sms_set_sca), ctx);
721 g_signal_connect(sms,
722 "handle-get-cb-config",
723 G_CALLBACK(on_sms_get_cb_config), ctx);
725 g_signal_connect(sms,
726 "handle-set-cb-config",
727 G_CALLBACK(on_sms_set_cb_config), ctx);
729 g_signal_connect(sms,
730 "handle-set-mem-status",
731 G_CALLBACK(on_sms_set_mem_status), ctx);
733 g_signal_connect(sms,
734 "handle-get-pref-bearer",
735 G_CALLBACK(on_sms_get_pref_bearer), ctx);
737 g_signal_connect(sms,
738 "handle-set-pref-bearer",
739 G_CALLBACK(on_sms_set_pref_bearer), ctx);
741 g_signal_connect(sms,
742 "handle-set-delivery-report",
743 G_CALLBACK(on_sms_set_delivery_report), ctx);
745 g_signal_connect(sms,
746 "handle-set-msg-status",
747 G_CALLBACK(on_sms_set_msg_status), ctx);
749 g_signal_connect(sms,
750 "handle-get-sms-params",
751 G_CALLBACK(on_sms_get_sms_params), ctx);
753 g_signal_connect(sms,
754 "handle-set-sms-params",
755 G_CALLBACK(on_sms_set_sms_params), ctx);
757 g_signal_connect(sms,
758 "handle-get-sms-param-cnt",
759 G_CALLBACK(on_sms_get_sms_param_cnt), ctx);
761 g_signal_connect(sms,
762 "handle-get-sms-ready-status",
763 G_CALLBACK(on_sms_get_sms_ready_status), ctx);
768 gboolean dbus_plugin_sms_response(struct custom_data *ctx,
769 UserRequest *ur, struct dbus_request_info *dbus_info,
770 enum tcore_response_command command, unsigned int data_len, const void *data)
772 char *cpname = dbus_info ? GET_CP_NAME(dbus_info->invocation) : "";
775 case TRESP_SMS_SEND_UMTS_MSG: {
776 const struct tresp_sms_send_msg *resp = data;
778 dbg("[%s] SEND_UMTS_MSG (result:[0x%x])", cpname, resp->result);
780 telephony_sms_complete_send_msg(dbus_info->interface_object,
781 dbus_info->invocation, resp->result);
785 case TRESP_SMS_SEND_CDMA_MSG: {
786 const struct tresp_sms_send_msg *resp = data;
788 dbg("[%s] SEND_CDMA_MSG (result:[0x%x])", cpname, resp->result);
790 telephony_sms_complete_send_msg(dbus_info->interface_object,
791 dbus_info->invocation, resp->result);
795 case TRESP_SMS_READ_MSG: {
796 const struct tresp_sms_read_msg *resp = data;
797 GVariant *sca = NULL, *packet_sca = NULL;
798 GVariant *tpdu = NULL, *packet_tpdu = NULL;
802 dbg("[%s] READ_MSG (result:[0x%x])", cpname, resp->result);
804 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
805 for (i = 0; i < SMS_SMSP_ADDRESS_LEN; i++)
806 g_variant_builder_add(&b, "y", resp->dataInfo.smsData.sca[i]);
807 sca = g_variant_builder_end(&b);
809 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
810 for (i = 0; i < SMS_SMDATA_SIZE_MAX + 1; i++)
811 g_variant_builder_add(&b, "y", resp->dataInfo.smsData.tpduData[i]);
812 tpdu = g_variant_builder_end(&b);
814 packet_sca = g_variant_new("v", sca);
815 packet_tpdu = g_variant_new("v", tpdu);
817 telephony_sms_complete_read_msg(dbus_info->interface_object,
818 dbus_info->invocation, resp->result,
819 resp->dataInfo.simIndex, resp->dataInfo.msgStatus,
820 resp->dataInfo.smsData.format,
822 resp->dataInfo.smsData.msgLength,
827 case TRESP_SMS_SAVE_MSG: {
828 const struct tresp_sms_save_msg *resp = data;
830 dbg("[%s] SAVE_MSG (index:[%d] result:[0x%x])", cpname, resp->index, resp->result);
832 telephony_sms_complete_save_msg(dbus_info->interface_object,
833 dbus_info->invocation, resp->result, resp->index);
837 case TRESP_SMS_DELETE_MSG: {
838 const struct tresp_sms_delete_msg *resp = data;
840 dbg("[%s] DELETE_MSG (index:[%d] result:[0x%x])", cpname, resp->index, resp->result);
842 telephony_sms_complete_delete_msg(dbus_info->interface_object,
843 dbus_info->invocation, resp->result, resp->index);
847 case TRESP_SMS_GET_STORED_MSG_COUNT: {
848 const struct tresp_sms_get_storedMsgCnt *resp = data;
853 dbg("[%s] GET_STORED_MSG_COUNT (result:[0x%x])", cpname, resp->result);
855 g_variant_builder_init(&b, G_VARIANT_TYPE("ai"));
856 for (i = 0; i < resp->storedMsgCnt.totalCount; i++)
857 g_variant_builder_add(&b, "i", resp->storedMsgCnt.indexList[i]);
858 list = g_variant_builder_end(&b);
860 telephony_sms_complete_get_msg_count(dbus_info->interface_object,
861 dbus_info->invocation, resp->result,
862 resp->storedMsgCnt.totalCount,
863 resp->storedMsgCnt.usedCount,
868 case TRESP_SMS_GET_SCA: {
869 const struct tresp_sms_get_sca *resp = data;
870 GVariant *sca = NULL, *packet_sca = NULL;
874 dbg("[%s] GET_SCA (result:[0x%x])", cpname, resp->result);
876 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
877 for (i = 0; i < SMS_SMSP_ADDRESS_LEN + 1; i++)
878 g_variant_builder_add(&b, "y", resp->scaAddress.diallingNum[i]);
879 sca = g_variant_builder_end(&b);
881 packet_sca = g_variant_new("v", sca);
883 telephony_sms_complete_get_sca(dbus_info->interface_object,
884 dbus_info->invocation, resp->result,
885 resp->scaAddress.typeOfNum,
886 resp->scaAddress.numPlanId,
887 resp->scaAddress.dialNumLen,
892 case TRESP_SMS_SET_SCA: {
893 const struct tresp_sms_set_sca *resp = data;
895 dbg("[%s] SET_SCA (result:[0x%x])", cpname, resp->result);
897 telephony_sms_complete_set_sca(dbus_info->interface_object, dbus_info->invocation,
902 case TRESP_SMS_GET_CB_CONFIG: {
903 const struct tresp_sms_get_cb_config *resp = data;
904 GVariant *result = NULL;
908 dbg("[%s] GET_CB_CONFIG (result:[0x%x])", cpname, resp->result);
910 g_variant_builder_init(&b, G_VARIANT_TYPE("aa{sv}"));
911 for (i = 0; i < resp->cbConfig.msgIdRangeCount; i++) {
912 g_variant_builder_open(&b, G_VARIANT_TYPE("a{sv}"));
914 if (resp->cbConfig.net3gppType == SMS_NETTYPE_3GPP) {
915 g_variant_builder_add(&b, "{sv}", "FromMsgId",
916 g_variant_new_uint16(resp->cbConfig.msgIDs[i].net3gpp.fromMsgId));
917 g_variant_builder_add(&b, "{sv}", "ToMsgId",
918 g_variant_new_uint16(resp->cbConfig.msgIDs[i].net3gpp.toMsgId));
919 } else if (resp->cbConfig.net3gppType == SMS_NETTYPE_3GPP2) {
920 g_variant_builder_add(&b, "{sv}", "CBCategory",
921 g_variant_new_uint16(resp->cbConfig.msgIDs[i].net3gpp2.cbCategory));
922 g_variant_builder_add(&b, "{sv}", "CBLanguage",
923 g_variant_new_uint16(resp->cbConfig.msgIDs[i].net3gpp2.cbLanguage));
925 dbg("Unknown 3gpp type");
929 g_variant_builder_add(&b, "{sv}", "Selected",
930 g_variant_new_byte(resp->cbConfig.msgIDs[i].net3gpp.selected));
931 g_variant_builder_close(&b);
933 result = g_variant_builder_end(&b);
935 telephony_sms_complete_get_cb_config(dbus_info->interface_object,
936 dbus_info->invocation, resp->result,
937 resp->cbConfig.net3gppType,
938 resp->cbConfig.cbEnabled,
939 resp->cbConfig.msgIdMaxCount,
940 resp->cbConfig.msgIdRangeCount,
945 case TRESP_SMS_SET_CB_CONFIG: {
946 const struct tresp_sms_set_cb_config *resp = data;
948 dbg("[%s] SET_CB_CONFIG (result:[0x%x])", cpname, resp->result);
950 telephony_sms_complete_set_cb_config(dbus_info->interface_object,
951 dbus_info->invocation, resp->result);
955 case TRESP_SMS_SET_MEM_STATUS: {
956 const struct tresp_sms_set_mem_status *resp = data;
958 dbg("[%s] SET_MEM_STATUS (result:[0x%x])", cpname, resp->result);
960 telephony_sms_complete_set_mem_status(dbus_info->interface_object,
961 dbus_info->invocation, resp->result);
965 case TRESP_SMS_GET_PREF_BEARER: {
966 const struct tresp_sms_get_pref_bearer *resp = data;
968 dbg("[%s] GET_PREF_BEARER (result:[0x%x] svc:[0x%2x])", cpname, resp->result, resp->svc);
970 telephony_sms_complete_get_pref_bearer(dbus_info->interface_object,
971 dbus_info->invocation, resp->result, resp->svc);
975 case TRESP_SMS_SET_PREF_BEARER: {
976 const struct tresp_sms_set_pref_bearer *resp = data;
978 dbg("[%s] SET_PREF_BEARER (result:[0x%x])", cpname, resp->result);
980 telephony_sms_complete_set_pref_bearer(dbus_info->interface_object,
981 dbus_info->invocation, resp->result);
985 case TRESP_SMS_SET_DELIVERY_REPORT: {
986 const struct tresp_sms_set_delivery_report *resp = data;
988 dbg("[%s] SET_DELIVERY_REPORT (result:[0x%x])", cpname, resp->result);
990 telephony_sms_complete_set_delivery_report(dbus_info->interface_object,
991 dbus_info->invocation, resp->result);
995 case TRESP_SMS_SET_MSG_STATUS: {
996 const struct tresp_sms_set_mem_status *resp = data;
998 dbg("[%s] SET_MSG_STATUS (result:[0x%x])", cpname, resp->result);
1000 telephony_sms_complete_set_msg_status(dbus_info->interface_object,
1001 dbus_info->invocation, resp->result);
1005 case TRESP_SMS_GET_PARAMS: {
1006 const struct tresp_sms_get_params *resp = data;
1007 GVariant *alphaId = NULL, *packet_alphaId = NULL;
1008 GVariant *destDialNum = NULL, *packet_destDialNum = NULL;
1009 GVariant *scaDialNum = NULL, *packet_scaDialNum = NULL;
1013 dbg("[%s] GET_PARAMS (result:[0x%x])", cpname, resp->result);
1015 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
1016 for (i = 0; i < SMS_SMSP_ALPHA_ID_LEN_MAX + 1; i++)
1017 g_variant_builder_add(&b, "y", resp->paramsInfo.szAlphaId[i]);
1018 alphaId = g_variant_builder_end(&b);
1020 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
1021 for (i = 0; i < SMS_SMSP_ADDRESS_LEN + 1; i++)
1022 g_variant_builder_add(&b, "y", resp->paramsInfo.tpDestAddr.diallingNum[i]);
1023 destDialNum = g_variant_builder_end(&b);
1025 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
1026 for (i = 0; i < SMS_SMSP_ADDRESS_LEN + 1; i++)
1027 g_variant_builder_add(&b, "y", resp->paramsInfo.tpSvcCntrAddr.diallingNum[i]);
1028 scaDialNum = g_variant_builder_end(&b);
1030 packet_alphaId = g_variant_new("v", alphaId);
1031 packet_destDialNum = g_variant_new("v", destDialNum);
1032 packet_scaDialNum = g_variant_new("v", scaDialNum);
1034 telephony_sms_complete_get_sms_params(dbus_info->interface_object,
1035 dbus_info->invocation, resp->result,
1036 resp->paramsInfo.recordIndex,
1037 resp->paramsInfo.recordLen,
1038 resp->paramsInfo.alphaIdLen,
1040 resp->paramsInfo.paramIndicator,
1041 resp->paramsInfo.tpDestAddr.dialNumLen,
1042 resp->paramsInfo.tpDestAddr.typeOfNum,
1043 resp->paramsInfo.tpDestAddr.numPlanId,
1045 resp->paramsInfo.tpSvcCntrAddr.dialNumLen,
1046 resp->paramsInfo.tpSvcCntrAddr.typeOfNum,
1047 resp->paramsInfo.tpSvcCntrAddr.numPlanId,
1049 resp->paramsInfo.tpProtocolId,
1050 resp->paramsInfo.tpDataCodingScheme,
1051 resp->paramsInfo.tpValidityPeriod);
1055 case TRESP_SMS_SET_PARAMS:{
1056 const struct tresp_sms_set_params *resp = data;
1058 dbg("[%s] SET_PARAMS (result:[0x%x])", cpname, resp->result);
1060 telephony_sms_complete_set_sms_params(dbus_info->interface_object,
1061 dbus_info->invocation, resp->result);
1065 case TRESP_SMS_GET_PARAMCNT: {
1066 const struct tresp_sms_get_paramcnt *resp = data;
1068 dbg("[%s] GET_PARAMCNT (result:[0x%x])", cpname, resp->result);
1070 telephony_sms_complete_get_sms_param_cnt(dbus_info->interface_object,
1071 dbus_info->invocation, resp->result, resp->recordCount);
1076 err("Unhandled/Unknown Response: [0x%x]", command);
1083 gboolean dbus_plugin_sms_notification(struct custom_data *ctx,
1084 CoreObject *source, TelephonyObjectSkeleton *object,
1085 enum tcore_notification_command command, unsigned int data_len, const void *data)
1088 const char *cp_name;
1091 warn("object is NULL");
1095 cp_name = tcore_server_get_cp_name_by_plugin(tcore_object_ref_plugin(source));
1097 sms = telephony_object_peek_sms(TELEPHONY_OBJECT(object));
1099 err("sms object is NULL!!!");
1104 case TNOTI_SMS_INCOM_MSG: {
1105 const struct tnoti_sms_incoming_msg *noti = data;
1109 info("[%s] SMS_INCOM_MSG (len[%d])", cp_name, data_len);
1111 sca = g_base64_encode((const guchar *)(noti->msgInfo.sca), SMS_SMSP_ADDRESS_LEN);
1112 tpdu = g_base64_encode((const guchar *)(noti->msgInfo.tpduData), SMS_SMDATA_SIZE_MAX + 1);
1114 telephony_sms_emit_incomming_msg(sms,
1115 noti->msgInfo.format,
1117 noti->msgInfo.msgLength,
1125 case TNOTI_SMS_CB_INCOM_MSG: {
1126 const struct tnoti_sms_cellBroadcast_msg *noti = data;
1129 info("[%s] SMS_CB_INCOM_MSG (len[%d])", cp_name, data_len);
1131 tpdu = g_base64_encode((const guchar*)(noti->cbMsg.msgData), SMS_CB_SIZE_MAX+1);
1133 telephony_sms_emit_incomming_cb_msg(sms,
1134 noti->cbMsg.cbMsgType,
1142 case TNOTI_SMS_ETWS_INCOM_MSG: {
1143 const struct tnoti_sms_etws_msg *noti = data;
1144 GVariant *msg_data = NULL, *packet_msg_data = NULL;
1148 info("[%s] ETWS_INCOM_MSG (len[%d])", cp_name, data_len);
1150 g_variant_builder_init(&b, G_VARIANT_TYPE("ay"));
1152 for (i = 0; i < SMS_ETWS_SIZE_MAX + 1; i++)
1153 g_variant_builder_add(&b, "y", noti->etwsMsg.msgData[i]);
1154 msg_data = g_variant_builder_end(&b);
1155 packet_msg_data = g_variant_new("v", msg_data);
1157 telephony_sms_emit_incomming_etws_msg(sms,
1158 noti->etwsMsg.etwsMsgType,
1159 noti->etwsMsg.length,
1164 case TNOTI_SMS_INCOM_EX_MSG: {
1165 info("[%s] SMS_INCOM_EX_MSG (len[%d])", cp_name, data_len);
1169 case TNOTI_SMS_CB_INCOM_EX_MSG: {
1170 info("[%s] CB_INCOM_EX_MSG (len[%d])", cp_name, data_len);
1174 case TNOTI_SMS_MEMORY_STATUS: {
1175 const struct tnoti_sms_memory_status *noti = data;
1177 info("[%s] SMS_MEMORY_STATUS (%d)", cp_name, noti->status);
1179 telephony_sms_emit_memory_status(sms, noti->status);
1183 case TNOTI_SMS_DEVICE_READY: {
1184 const struct tnoti_sms_ready_status *noti = data;
1186 info("[%s] SMS_DEVICE_READY (%d)", cp_name, noti->status);
1188 #ifdef ENABLE_KPI_LOGS
1189 if (noti->status != SMS_READY_STATUS_NONE)
1190 TIME_CHECK("[%s] SMS Service Ready", cp_name);
1193 telephony_sms_emit_sms_ready(sms, noti->status);
1198 err("Unhandled/Unknown Notification: [0x%x]", command);