bt-service: Disable BT if bluetoothd is terminated
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-request-handler.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *              http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <string.h>
19 #include <glib.h>
20 #include <dlog.h>
21 #include <gio/gio.h>
22 #include <cynara-client.h>
23 #include <cynara-creds-gdbus.h>
24
25 #include "bluetooth-api.h"
26 #include "bt-service-common.h"
27 #include "bt-service-util.h"
28 #include "bt-service-event.h"
29 #include "bt-service-adapter.h"
30 #include "bt-service-adapter-le.h"
31 #include "bt-service-device.h"
32 #include "bt-service-hid.h"
33 #include "bt-service-network.h"
34 #include "bt-service-audio.h"
35 #include "bt-service-oob.h"
36 #include "bt-service-avrcp.h"
37 #include "bt-service-avrcp-controller.h"
38 #include "bt-service-opp-client.h"
39 #include "bt-service-map-client.h"
40 #include "bt-service-obex-server.h"
41 #include "bt-service-rfcomm-client.h"
42 #include "bt-service-rfcomm-server.h"
43 #include "bt-request-handler.h"
44 #include "bt-service-pbap.h"
45 #include "bt-service-dpm.h"
46 #include "bt-service-agent.h"
47 #include "bt-service-proximity.h"
48 #include "bt-service-tds.h"
49
50 static GDBusConnection *bt_service_conn;
51 static guint owner_id = 0;
52 cynara *p_cynara;
53 cynara_configuration *conf;
54
55 static const gchar bt_service_introspection_xml[] =
56 "<node name='/org/projectx/bt_service'>"
57 "       <interface name='org.projectx.bt'>"
58 "               <method name='service_request'>"
59                         /* Input Parameters */
60 "                       <arg type='i' name='service_type' direction='in' />"
61 "                       <arg type='i' name='service_function' direction='in' />"
62 "                       <arg type='i' name='request_type' direction='in' />"
63 "                       <arg type='ay' name='input_param1' direction='in' />"
64 "                       <arg type='ay' name='input_param2' direction='in' />"
65 "                       <arg type='ay' name='input_param3' direction='in' />"
66 "                       <arg type='ay' name='input_param4' direction='in' />"
67 "                       <arg type='ay' name='input_param5' direction='in' />"
68                         /* Return Parameters */
69 "                       <arg type='i' name='output_param1' direction='out' />"
70 "                       <arg type='v' name='output_param2' direction='out' />"
71 "               </method>"
72 "       </interface>"
73 "</node>";
74
75 GDBusNodeInfo *node_info = NULL;
76 static gboolean name_acquired = FALSE;
77
78 static char *current_sender_playing = NULL;
79
80 static void __bt_service_method(GDBusConnection *connection,
81                 const gchar *sender,
82                 const gchar *object_path,
83                 const gchar *interface_name,
84                 const gchar *method_name,
85                 GVariant *parameters,
86                 GDBusMethodInvocation *invocation,
87                 gpointer user_data);
88
89 int __bt_bluez_request(int function_name,
90                 int request_type,
91                 int request_id,
92                 GDBusMethodInvocation *context,
93                 GVariant *in_param1,
94                 GVariant *in_param2,
95                 GVariant *in_param3,
96                 GVariant *in_param4,
97                 GArray **out_param1);
98 int __bt_obexd_request(int function_name,
99                 int request_type,
100                 int request_id,
101                 GDBusMethodInvocation *context,
102                 GVariant *in_param1,
103                 GVariant *in_param2,
104                 GVariant *in_param3,
105                 GVariant *in_param4,
106                 GArray **out_param1);
107 int __bt_agent_request(int function_name,
108                 int request_type,
109                 int request_id,
110                 GDBusMethodInvocation *context,
111                 GVariant *in_param1,
112                 GVariant *in_param2,
113                 GVariant *in_param3,
114                 GVariant *in_param4,
115                 GArray **out_param1);
116 int __bt_core_request(int function_name,
117                 int request_type,
118                 int request_id,
119                 GDBusMethodInvocation *context,
120                 GVariant *in_param1);
121
122 gboolean __bt_service_check_privilege(int function_name,
123                                         int service_type,
124                                         const char *unique_name);
125
126 /* Function definitions*/
127 static void __bt_fill_garray_from_variant(GVariant *var, GArray *param)
128 {
129         char *data;
130         int size;
131
132         size = g_variant_get_size(var);
133         if (size > 0) {
134                 data = (char *)g_variant_get_data(var);
135                 if (data)
136                         param = g_array_append_vals(param, data, size);
137
138         }
139 }
140
141 static void __bt_service_get_parameters(GVariant *in_param,
142                 void *value, int size)
143 {
144         void *buf = NULL;
145         buf = (void *)g_variant_get_data(in_param);
146         memcpy(value, buf, size);
147 }
148
149 static void __bt_service_method(GDBusConnection *connection,
150                 const gchar *sender,
151                 const gchar *object_path,
152                 const gchar *interface_name,
153                 const gchar *method_name,
154                 GVariant *parameters,
155                 GDBusMethodInvocation *invocation,
156                 gpointer user_data)
157 {
158         FN_START;
159
160         BT_DBG("Method[%s] Object Path[%s] Interface Name[%s]",
161                         method_name, object_path, interface_name);
162
163         if (g_strcmp0(method_name, "service_request") == 0) {
164                 int service_type;
165                 int service_function;
166                 int request_type;
167                 GVariant *param1 = NULL;
168                 GVariant *param2 = NULL;
169                 GVariant *param3 = NULL;
170                 GVariant *param4 = NULL;
171                 GVariant *param5 = NULL;
172                 GArray *out_param1 = NULL;
173                 GVariant *out_var = NULL;
174                 int result = 0;
175                 int request_id = -1;
176                 const char *sender = NULL;
177
178                 g_variant_get(parameters, "(iii@ay@ay@ay@ay@ay)", &service_type,
179                                 &service_function, &request_type,
180                                 &param1, &param2, &param3, &param4, &param5);
181
182                 out_param1 = g_array_new(FALSE, FALSE, sizeof(gchar));
183
184                 sender = g_dbus_method_invocation_get_sender(invocation);
185
186                 if (service_type == BT_CORE_SERVICE) {
187                         BT_DBG("No need to check privilege from bt-core");
188                 } else if (__bt_service_check_privilege(service_function,
189                                         service_type, (const char *)sender) == FALSE) {
190                         BT_ERR("Client don't have the privilege to excute this function");
191                         result = BLUETOOTH_ERROR_PERMISSION_DEINED;
192                         goto fail;
193                 }
194
195                 if (request_type == BT_ASYNC_REQ
196                                 || service_function == BT_OBEX_SERVER_ACCEPT_CONNECTION) {
197                         /* Set the timer */
198                         request_id = _bt_assign_request_id();
199                         BT_DBG("Request ID: %d", request_id);
200
201                         if (request_id < 0) {
202                                 BT_ERR("Fail to assign the request id");
203                                 result = BLUETOOTH_ERROR_INTERNAL;
204
205                                 goto fail;
206                         }
207                 }
208
209                 BT_DBG("Service type = %d, fn = %s (0x%x)",
210                                 service_type, _bt_convert_service_function_to_string(service_function),
211                                 service_function);
212                 switch (service_type) {
213                 case BT_BLUEZ_SERVICE:
214                         result = __bt_bluez_request(service_function,
215                                         request_type, request_id,
216                                         invocation, param1, param2,
217                                         param3, param4, &out_param1);
218                         break;
219                 case BT_OBEX_SERVICE:
220                         result = __bt_obexd_request(service_function,
221                                         request_type, request_id,
222                                         invocation, param1,
223                                         param2, param3,
224                                         param4, &out_param1);
225                         break;
226                 case BT_AGENT_SERVICE:
227                         result = __bt_agent_request(service_function,
228                                         request_type, request_id,
229                                         invocation, param1,
230                                         param2, param3,
231                                         param4, &out_param1);
232                         break;
233                 case BT_CORE_SERVICE:
234                         result = __bt_core_request(service_function,
235                                         request_type, request_id,
236                                         invocation, param1);
237                         break;
238                 case BT_CHECK_PRIVILEGE:
239                         result = BLUETOOTH_ERROR_NONE;
240                         break;
241                 default:
242                         BT_ERR("Unknown service type");
243                         result = BLUETOOTH_ERROR_INTERNAL;
244                         goto fail;
245                 }
246
247                 if (result != BLUETOOTH_ERROR_NONE)
248                         goto fail;
249
250                 if ((request_type == BT_ASYNC_REQ ||
251                         service_function == BT_OBEX_SERVER_ACCEPT_CONNECTION) &&
252                         service_function != BT_OPP_PUSH_FILES) {
253                         BT_DBG("INSERT INTO REQ LIST");
254                         _bt_insert_request_list(request_id, service_function,
255                                                 NULL, invocation);
256                 } else {
257                         /* Return result */
258                         if (service_type == BT_CHECK_PRIVILEGE ||
259                                         service_function != BT_OPP_PUSH_FILES) {
260                                 out_var = g_variant_new_from_data((const GVariantType *)"ay",
261                                                 out_param1->data, out_param1->len,
262                                                 TRUE, NULL, NULL);
263
264                                 GVariant *temp = g_variant_new("(iv)", result, out_var);
265                                 g_dbus_method_invocation_return_value(invocation, temp);
266
267                                 g_array_free(out_param1, TRUE);
268                                 out_param1 = NULL;
269                         }
270                 }
271                 /* TODO: MAP? see the if{}else{} above */
272
273                 g_variant_unref(param1);
274                 g_variant_unref(param2);
275                 g_variant_unref(param3);
276                 g_variant_unref(param4);
277                 g_variant_unref(param5);
278 //              g_free(sender);
279                 FN_END;
280                 return;
281 fail:
282                 BT_ERR_C("Request is failed [%s] [0x%x]",
283                                 _bt_convert_error_to_string(result), result);
284
285                 out_var = g_variant_new_from_data((const GVariantType *)"ay",
286                                 out_param1->data, out_param1->len,
287                                 TRUE, NULL, NULL);
288
289                 GVariant *temp = g_variant_new("(iv)", result, out_var);
290                 g_dbus_method_invocation_return_value(invocation, temp);
291
292                 g_array_free(out_param1, TRUE);
293                 out_param1 = NULL;
294
295                 if (request_type == BT_ASYNC_REQ)
296                         _bt_delete_request_id(request_id);
297
298                 g_variant_unref(param1);
299                 g_variant_unref(param2);
300                 g_variant_unref(param3);
301                 g_variant_unref(param4);
302                 g_variant_unref(param5);
303 //              g_free(sender);
304         }
305
306         FN_END;
307         return;
308 }
309
310
311 static const GDBusInterfaceVTable method_table = {
312         __bt_service_method,
313         NULL,
314         NULL,
315 };
316
317 int __bt_bluez_request(int function_name,
318                 int request_type,
319                 int request_id,
320                 GDBusMethodInvocation *context,
321                 GVariant *in_param1,
322                 GVariant *in_param2,
323                 GVariant *in_param3,
324                 GVariant *in_param4,
325                 GArray **out_param1)
326 {
327         int result = BLUETOOTH_ERROR_NONE;
328
329         switch (function_name) {
330         case BT_ENABLE_ADAPTER:
331                 result = _bt_enable_adapter();
332                 break;
333         case BT_DISABLE_ADAPTER:
334                 result = _bt_disable_adapter();
335                 break;
336         case BT_RECOVER_ADAPTER:
337                 result = _bt_recover_adapter();
338                 break;
339         case BT_ENABLE_ADAPTER_LE:
340                 _bt_set_le_intended_status(TRUE);
341                 result = _bt_enable_adapter_le();
342                 break;
343         case BT_DISABLE_ADAPTER_LE:
344                 _bt_set_le_intended_status(FALSE);
345                 result = _bt_disable_adapter_le();
346                 break;
347         case BT_RESET_ADAPTER:
348                 result = _bt_reset_adapter();
349                 break;
350         case BT_CHECK_ADAPTER: {
351                 int enabled = BT_ADAPTER_DISABLED;
352
353                 result = _bt_check_adapter(&enabled);
354
355                 g_array_append_vals(*out_param1, &enabled,
356                                 sizeof(int));
357                 break;
358         }
359         case BT_GET_LOCAL_ADDRESS: {
360                 bluetooth_device_address_t local_address = { {0} };
361                 result = _bt_get_local_address(&local_address);
362
363                 g_array_append_vals(*out_param1, &local_address,
364                                 sizeof(bluetooth_device_address_t));
365                 break;
366         }
367         case BT_GET_LOCAL_VERSION: {
368                 bluetooth_version_t ver = { {0} };
369                 result = _bt_get_local_version(&ver);
370
371                 g_array_append_vals(*out_param1, &ver,
372                                 sizeof(bluetooth_version_t));
373                 break;
374         }
375         case BT_GET_LOCAL_NAME: {
376                 bluetooth_device_name_t local_name = { {0} };
377                 result = _bt_get_local_name(&local_name);
378
379                 g_array_append_vals(*out_param1, &local_name,
380                                 sizeof(bluetooth_device_name_t));
381
382                 break;
383         }
384         case BT_SET_LOCAL_NAME: {
385                 bluetooth_device_name_t local_name = { {0} };
386                 __bt_service_get_parameters(in_param1,
387                                 &local_name, sizeof(bluetooth_device_name_t));
388
389                 result = _bt_set_local_name(local_name.name);
390
391                 break;
392         }
393         case BT_IS_SERVICE_USED: {
394                 char *uuid;
395                 gboolean used = FALSE;
396
397                 uuid = (char *)g_variant_get_data(in_param1);
398
399                 result = _bt_is_service_used(uuid, &used);
400
401                 if (result == BLUETOOTH_ERROR_NONE) {
402                         g_array_append_vals(*out_param1, &used,
403                                                 sizeof(gboolean));
404                 }
405                 break;
406         }
407         case BT_GET_DISCOVERABLE_MODE: {
408                 int mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
409
410                 result = _bt_get_discoverable_mode(&mode);
411
412                 g_array_append_vals(*out_param1, &mode, sizeof(int));
413                 break;
414         }
415         case BT_SET_DISCOVERABLE_MODE: {
416                 int mode = BLUETOOTH_DISCOVERABLE_MODE_CONNECTABLE;
417                 int time = 0;
418
419                 __bt_service_get_parameters(in_param1, &mode, sizeof(int));
420                 __bt_service_get_parameters(in_param2, &time, sizeof(int));
421
422                 result = _bt_set_discoverable_mode(mode, time);
423                 break;
424         }
425         case BT_GET_DISCOVERABLE_TIME: {
426                 int timeout = 0;
427
428                 result = _bt_get_timeout_value(&timeout);
429
430                 g_array_append_vals(*out_param1, &timeout, sizeof(int));
431                 break;
432         }
433         case BT_START_DISCOVERY:
434                 result = _bt_start_discovery();
435
436                 break;
437         case BT_START_CUSTOM_DISCOVERY: {
438                 bt_discovery_role_type_t role;
439
440                 __bt_service_get_parameters(in_param1,
441                                 &role, sizeof(bt_discovery_role_type_t));
442                 result = _bt_start_custom_discovery(role);
443
444                 break;
445         }
446         case BT_CANCEL_DISCOVERY:
447                 result = _bt_cancel_discovery();
448                 break;
449         case BT_IS_DISCOVERYING: {
450                 gboolean discovering = FALSE;
451                 discovering = _bt_is_discovering();
452                 g_array_append_vals(*out_param1,
453                                 &discovering, sizeof(gboolean));
454                 break;
455         }
456         case BT_START_LE_DISCOVERY: {
457                 char *sender = NULL;
458
459                 sender = (char *)g_dbus_method_invocation_get_sender(context);
460                 result = _bt_start_le_scan(sender);
461
462                 break;
463         }
464         case BT_STOP_LE_DISCOVERY: {
465                 char *sender = NULL;
466
467                 sender = (char *)g_dbus_method_invocation_get_sender(context);
468                 result = _bt_stop_le_scan(sender);
469
470                 break;
471         }
472         case BT_IS_LE_DISCOVERYING: {
473                 gboolean le_discovering = FALSE;
474
475                 le_discovering = _bt_is_le_scanning();
476                 g_array_append_vals(*out_param1,
477                                 &le_discovering, sizeof(gboolean));
478
479                 break;
480         }
481         case BT_REGISTER_SCAN_FILTER: {
482                 char *sender = NULL;
483                 bluetooth_le_scan_filter_t scan_filter;
484                 int slot_id;
485
486                 sender = (char *)g_dbus_method_invocation_get_sender(context);
487                 __bt_service_get_parameters(in_param1, &scan_filter,
488                                 sizeof(bluetooth_le_scan_filter_t));
489                 BT_DBG("bluetooth_le_scan_filter_t [features : %.2x]",
490                                 scan_filter.added_features);
491
492                 result = _bt_register_scan_filter(sender,
493                                 &scan_filter, &slot_id);
494
495                 g_array_append_vals(*out_param1, &slot_id, sizeof(int));
496                 break;
497         }
498         case BT_UNREGISTER_SCAN_FILTER:{
499                 char *sender = NULL;
500                 int slot_id;
501
502                 sender = (char *)g_dbus_method_invocation_get_sender(context);
503                 __bt_service_get_parameters(in_param1, &slot_id, sizeof(int));
504                 BT_DBG("Remove scan filter [Slot ID : %d]", slot_id);
505
506                 result = _bt_unregister_scan_filter(sender, slot_id);
507
508                 break;
509         }
510         case BT_UNREGISTER_ALL_SCAN_FILTERS:{
511                 char *sender = NULL;
512
513                 sender = (char *)g_dbus_method_invocation_get_sender(context);
514
515                 BT_DBG("Remove all scan filters [Sender : %s]", sender);
516
517                 result = _bt_unregister_all_scan_filters(sender);
518
519                 break;
520         }
521         case BT_IS_SCAN_FILTER_SUPPORTED:{
522                 int is_supported = 0;
523
524                 if (_bt_is_scan_filter_supported() == TRUE)
525                         is_supported = 1;
526
527                 g_array_append_vals(*out_param1,
528                                 &is_supported, sizeof(int));
529
530                 break;
531         }
532         case BT_ENABLE_RSSI: {
533                 bluetooth_device_address_t bd_addr;
534                 int link_type;
535                 bt_rssi_threshold_t rssi_threshold;
536                 int low_threshold;
537                 int in_range_threshold;
538                 int high_threshold;
539
540                 BT_DBG("Enable RSSI");
541
542                 __bt_service_get_parameters(in_param1,
543                                 &bd_addr, sizeof(bluetooth_device_address_t));
544                 __bt_service_get_parameters(in_param2,
545                                 &link_type, sizeof(int));
546                 __bt_service_get_parameters(in_param3,
547                                 &rssi_threshold, sizeof(bt_rssi_threshold_t));
548
549                 low_threshold = rssi_threshold.low_threshold;
550                 in_range_threshold = rssi_threshold.in_range_threshold;
551                 high_threshold = rssi_threshold.high_threshold;
552
553                 result = _bt_enable_rssi(&bd_addr,
554                                 link_type, low_threshold,
555                                 in_range_threshold, high_threshold);
556                 break;
557         }
558         case BT_GET_RSSI: {
559                 int link_type;
560                 bluetooth_device_address_t bd_addr;
561
562                 BT_DBG("Get RSSI Strength");
563
564                 __bt_service_get_parameters(in_param1,
565                                 &bd_addr, sizeof(bluetooth_device_address_t));
566                 __bt_service_get_parameters(in_param2,
567                                 &link_type, sizeof(int));
568
569                 result = _bt_get_rssi_strength(&bd_addr, link_type);
570                 break;
571         }
572         case BT_IS_CONNECTABLE: {
573                 gboolean is_connectable;
574
575                 is_connectable = _bt_is_connectable();
576                 g_array_append_vals(*out_param1,
577                                 &is_connectable, sizeof(gboolean));
578                 break;
579         }
580         case BT_SET_CONNECTABLE: {
581                 gboolean is_connectable;
582
583                 __bt_service_get_parameters(in_param1,
584                                 &is_connectable, sizeof(gboolean));
585                 result = _bt_set_connectable(is_connectable);
586                 break;
587         }
588         case BT_SET_ADVERTISING: {
589                 char *sender = NULL;
590                 int adv_handle;
591                 gboolean enable = FALSE;
592                 gboolean use_reserved_slot = FALSE;
593
594                 __bt_service_get_parameters(in_param1,
595                                 &adv_handle, sizeof(int));
596                 __bt_service_get_parameters(in_param2,
597                                 &enable, sizeof(gboolean));
598                 __bt_service_get_parameters(in_param3,
599                                 &use_reserved_slot, sizeof(gboolean));
600
601                 sender = (char *)g_dbus_method_invocation_get_sender(context);
602
603                 result = _bt_set_advertising(sender, adv_handle,
604                                 enable, use_reserved_slot);
605                 break;
606         }
607         case BT_SET_CUSTOM_ADVERTISING: {
608                 char *sender = NULL;
609                 int adv_handle;
610                 gboolean enable = FALSE;
611                 bluetooth_advertising_params_t adv_params;
612                 gboolean use_reserved_slot = FALSE;
613
614                 sender = (char *)g_dbus_method_invocation_get_sender(context);
615
616                 __bt_service_get_parameters(in_param1, &adv_handle,
617                                 sizeof(int));
618                 __bt_service_get_parameters(in_param2, &enable,
619                                 sizeof(gboolean));
620                 __bt_service_get_parameters(in_param3, &adv_params,
621                                 sizeof(bluetooth_advertising_params_t));
622                 __bt_service_get_parameters(in_param4, &use_reserved_slot,
623                                 sizeof(gboolean));
624
625                 BT_DBG("bluetooth_advertising_params_t [%f %f %d %d]",
626                                 adv_params.interval_min, adv_params.interval_max,
627                                 adv_params.filter_policy, adv_params.type);
628                 result = _bt_set_custom_advertising(sender, adv_handle,
629                                 enable, &adv_params, use_reserved_slot);
630                 break;
631         }
632         case BT_GET_ADVERTISING_DATA: {
633                 bluetooth_advertising_data_t adv = { {0} };
634                 int length = 0;
635
636                 result = _bt_get_advertising_data(&adv, &length);
637                 if (result == BLUETOOTH_ERROR_NONE)
638                         g_array_append_vals(*out_param1, adv.data, length);
639
640                 break;
641         }
642         case BT_SET_ADVERTISING_DATA: {
643                 char *sender = NULL;
644                 int adv_handle;
645                 bluetooth_advertising_data_t adv = { {0} };
646                 int length;
647                 gboolean use_reserved_slot = FALSE;
648
649                 sender = (char *)g_dbus_method_invocation_get_sender(context);
650
651                 __bt_service_get_parameters(in_param1,
652                                 &adv_handle, sizeof(int));
653                 __bt_service_get_parameters(in_param2,
654                                 &adv, sizeof(bluetooth_advertising_data_t));
655                 __bt_service_get_parameters(in_param3,
656                                 &length, sizeof(int));
657                 __bt_service_get_parameters(in_param4,
658                                 &use_reserved_slot, sizeof(gboolean));
659
660                 result = _bt_set_advertising_data(sender, adv_handle,
661                                 &adv, length, use_reserved_slot);
662                 break;
663         }
664         case BT_GET_SCAN_RESPONSE_DATA: {
665                 bluetooth_scan_resp_data_t rsp = { {0} };
666                 int length = 0;
667
668                 result = _bt_get_scan_response_data(&rsp, &length);
669                 if (result == BLUETOOTH_ERROR_NONE)
670                         g_array_append_vals(*out_param1, rsp.data, length);
671
672                 break;
673         }
674         case BT_SET_SCAN_RESPONSE_DATA: {
675                 char *sender = NULL;
676                 int adv_handle;
677                 bluetooth_scan_resp_data_t rsp = { {0} };
678                 int length;
679                 gboolean use_reserved_slot = FALSE;
680
681                 sender = (char *)g_dbus_method_invocation_get_sender(context);
682
683                 __bt_service_get_parameters(in_param1,
684                                 &adv_handle, sizeof(int));
685                 __bt_service_get_parameters(in_param2,
686                                 &rsp, sizeof(bluetooth_scan_resp_data_t));
687                 __bt_service_get_parameters(in_param3,
688                                 &length, sizeof(int));
689                 __bt_service_get_parameters(in_param4,
690                                 &use_reserved_slot, sizeof(gboolean));
691
692                 result = _bt_set_scan_response_data(sender, adv_handle,
693                                 &rsp, length, use_reserved_slot);
694
695                 break;
696         }
697         case BT_SET_MANUFACTURER_DATA: {
698                 bluetooth_manufacturer_data_t m_data = { 0 };
699                 __bt_service_get_parameters(in_param1,
700                                 &m_data, sizeof(bluetooth_manufacturer_data_t));
701
702                 result = _bt_set_manufacturer_data(&m_data);
703                 break;
704         }
705         case BT_SET_SCAN_PARAMETERS: {
706                 bluetooth_le_scan_params_t scan_params;
707                 __bt_service_get_parameters(in_param1, &scan_params,
708                                 sizeof(bluetooth_le_scan_params_t));
709
710                 BT_DBG("bluetooth_le_scan_params_t [%f %f %d]",
711                                 scan_params.interval, scan_params.window,
712                                 scan_params.type);
713
714                 result = _bt_set_scan_parameters(&scan_params);
715                 break;
716         }
717         case BT_LE_CONN_UPDATE: {
718                 char *sender = NULL;
719                 bluetooth_device_address_t local_address = { {0} };
720                 bluetooth_le_connection_param_t parameters = {0};
721
722                 sender = (char *)g_dbus_method_invocation_get_sender(context);
723
724                 __bt_service_get_parameters(in_param1, &local_address,
725                                 sizeof(bluetooth_device_address_t));
726                 __bt_service_get_parameters(in_param2, &parameters,
727                                 sizeof(bluetooth_le_connection_param_t));
728
729                 result =  _bt_le_conn_update(sender,
730                                         local_address.addr,
731                                         parameters.interval_min,
732                                         parameters.interval_max,
733                                         parameters.latency,
734                                         parameters.timeout);
735                 break;
736         }
737         case BT_IS_ADVERTISING: {
738                 gboolean advertising = FALSE;
739                 advertising = _bt_is_advertising();
740
741                 g_array_append_vals(*out_param1, &advertising,
742                                 sizeof(gboolean));
743                 break;
744         }
745         case BT_ADD_WHITE_LIST: {
746                 bluetooth_device_address_t address = { {0} };
747                 int addr_type = 0;
748
749                 __bt_service_get_parameters(in_param1, &address,
750                                 sizeof(bluetooth_device_address_t));
751                 __bt_service_get_parameters(in_param2, &addr_type,
752                                 sizeof(int));
753
754                 result = _bt_add_white_list(&address, addr_type);
755                 break;
756         }
757         case BT_REMOVE_WHITE_LIST: {
758                 bluetooth_device_address_t address = { {0} };
759                 int addr_type = 0;
760
761                 __bt_service_get_parameters(in_param1,
762                                 &address, sizeof(bluetooth_device_address_t));
763                 __bt_service_get_parameters(in_param2,
764                                 &addr_type, sizeof(int));
765
766                 result = _bt_remove_white_list(&address, addr_type);
767                 break;
768         }
769         case BT_CLEAR_WHITE_LIST: {
770                 result = _bt_clear_white_list();
771                 break;
772         }
773         case BT_GET_BONDED_DEVICES: {
774                 result = _bt_get_bonded_devices(out_param1);
775                 break;
776         }
777         case BT_GET_PROFILE_CONNECTED_DEVICES: {
778                 char *uuid;
779                 uuid = (char *)g_variant_get_data(in_param1);
780                 result = _bt_get_profile_connected_devices(uuid, out_param1);
781                 break;
782         }
783         case BT_SET_PASSKEY_NOTIFICATION: {
784                 char *sender = NULL;
785                 gboolean enable;
786
787                 sender = (char *)g_dbus_method_invocation_get_sender(context);
788                 __bt_service_get_parameters(in_param1,
789                                 &enable, sizeof(gboolean));
790
791                 result = _bt_set_passkey_notification(sender, enable);
792                 break;
793         }
794         case BT_GET_BONDED_DEVICE: {
795                 bluetooth_device_address_t address = { {0} };
796                 bluetooth_device_info_t dev_info;
797
798                 __bt_service_get_parameters(in_param1,
799                                 &address, sizeof(bluetooth_device_address_t));
800
801                 memset(&dev_info, 0x00, sizeof(bluetooth_device_info_t));
802                 result = _bt_get_bonded_device_info(&address, &dev_info);
803
804                 if (result == BLUETOOTH_ERROR_NONE) {
805                         g_array_append_vals(*out_param1, &dev_info,
806                                         sizeof(bluetooth_device_info_t));
807                 }
808                 break;
809         }
810         case BT_GET_IS_ALIAS_SET: {
811                 bluetooth_device_address_t address = { {0} };
812                 gboolean is_alias_set = FALSE;
813
814                 __bt_service_get_parameters(in_param1,
815                                 &address, sizeof(bluetooth_device_address_t));
816
817                 result = _bt_is_alias_set(&address, &is_alias_set);
818                 if (result == BLUETOOTH_ERROR_NONE)
819                         g_array_append_vals(*out_param1, &is_alias_set, sizeof(gboolean));
820
821                 break;
822         }
823         case BT_BOND_DEVICE: {
824                 bluetooth_device_address_t address = { {0} };
825
826                 __bt_service_get_parameters(in_param1,
827                                 &address, sizeof(bluetooth_device_address_t));
828
829                 result = _bt_bond_device(request_id, &address,
830                                 BLUETOOTH_DEV_CONN_DEFAULT, out_param1);
831                 break;
832         }
833         case BT_BOND_DEVICE_BY_TYPE: {
834                 bluetooth_device_address_t address = { {0} };
835                 unsigned short conn_type = 0;
836
837                 __bt_service_get_parameters(in_param1,
838                                 &address, sizeof(bluetooth_device_address_t));
839                 __bt_service_get_parameters(in_param2,
840                                 &conn_type, sizeof(unsigned short));
841
842                 result = _bt_bond_device(request_id, &address,
843                                 conn_type, out_param1);
844                 break;
845         }
846         case BT_CANCEL_BONDING: {
847                 result = _bt_cancel_bonding();
848                 break;
849         }
850         case BT_PASSKEY_REPLY: {
851                 const char *passkey = NULL;
852                 gboolean authentication_reply = FALSE;
853
854                 passkey = g_variant_get_data(in_param1);
855                 __bt_service_get_parameters(in_param2,
856                         &authentication_reply, sizeof(gboolean));
857                 result = _bt_passkey_reply(passkey, authentication_reply);
858                 break;
859         }
860         case BT_PASSKEY_CONFIRMATION_REPLY: {
861                 gboolean confirmation_reply = FALSE;
862
863                 __bt_service_get_parameters(in_param1,
864                         &confirmation_reply, sizeof(gboolean));
865                 result = _bt_passkey_confirmation_reply(confirmation_reply);
866                 break;
867         }
868         case BT_UNBOND_DEVICE: {
869                 bluetooth_device_address_t address = { {0} };
870
871                 __bt_service_get_parameters(in_param1,
872                                 &address, sizeof(bluetooth_device_address_t));
873
874                 result = _bt_unbond_device(request_id, &address, out_param1);
875
876                 break;
877         }
878         case BT_SET_ALIAS: {
879                 bluetooth_device_address_t address = { {0} };
880                 const char *local_name;
881
882                 __bt_service_get_parameters(in_param1,
883                                 &address, sizeof(bluetooth_device_address_t));
884                 local_name = (const char *)g_variant_get_data(in_param2);
885
886                 result = _bt_set_alias(&address, local_name);
887                 break;
888         }
889         case BT_SEARCH_SERVICE: {
890                 bluetooth_device_address_t address = { {0} };
891
892                 __bt_service_get_parameters(in_param1,
893                                 &address, sizeof(bluetooth_device_address_t));
894
895                 result = _bt_search_device(request_id, &address);
896                 if (result != BLUETOOTH_ERROR_NONE) {
897                         g_array_append_vals(*out_param1, &address,
898                                         sizeof(bluetooth_device_address_t));
899                 }
900                 break;
901         }
902         case BT_CANCEL_SEARCH_SERVICE: {
903                 result = _bt_cancel_search_device();
904                 break;
905         }
906         case BT_SET_AUTHORIZATION: {
907                 bluetooth_device_address_t address = { {0} };
908                 gboolean authorize;
909
910                 __bt_service_get_parameters(in_param1,
911                                 &address, sizeof(bluetooth_device_address_t));
912                 __bt_service_get_parameters(in_param2,
913                                 &authorize, sizeof(gboolean));
914
915                 result = _bt_set_authorization(&address, authorize);
916                 break;
917         }
918         case BT_IS_DEVICE_CONNECTED: {
919                 bluetooth_device_address_t address = { {0} };
920                 int type;
921                 gboolean connected = FALSE;
922
923                 __bt_service_get_parameters(in_param1,
924                                 &address, sizeof(bluetooth_device_address_t));
925                 __bt_service_get_parameters(in_param2,
926                                 &type, sizeof(int));
927
928                 result = _bt_is_device_connected(&address, type, &connected);
929                 BT_DBG("is_connected: %d", connected);
930                 if (result == BLUETOOTH_ERROR_NONE) {
931                         g_array_append_vals(*out_param1, &connected,
932                                                 sizeof(gboolean));
933                 }
934
935                 break;
936         }
937         case BT_GET_CONNECTED_LINK_TYPE: {
938                 bluetooth_device_address_t address = { {0} };
939                 bluetooth_connected_link_t connected = BLUETOOTH_CONNECTED_LINK_NONE;
940
941                 __bt_service_get_parameters(in_param1,
942                                 &address, sizeof(bluetooth_device_address_t));
943
944                 result = _bt_get_connected_link(&address, &connected);
945
946                 if (result == BLUETOOTH_ERROR_NONE) {
947                         g_array_append_vals(*out_param1, &connected,
948                                         sizeof(guint));
949                 }
950
951                 break;
952         }
953         case BT_SET_PIN_CODE: {
954                 bluetooth_device_address_t address = { {0} };
955                 bluetooth_device_pin_code_t pin_code = { {0} };
956
957                 __bt_service_get_parameters(in_param1,
958                                 &address, sizeof(bluetooth_device_address_t));
959                 __bt_service_get_parameters(in_param2,
960                                 &pin_code, sizeof(bluetooth_device_pin_code_t));
961
962                 result = _bt_set_pin_code(&address, &pin_code);
963                 break;
964         }
965         case BT_UNSET_PIN_CODE: {
966                 bluetooth_device_address_t address = { {0} };
967
968                 __bt_service_get_parameters(in_param1,
969                                 &address, sizeof(bluetooth_device_address_t));
970
971                 result = _bt_unset_pin_code(&address);
972                 break;
973         }
974         case BT_UPDATE_LE_CONNECTION_MODE: {
975                 char *sender = NULL;
976                 bluetooth_device_address_t remote_address = { { 0 } };
977                 bluetooth_le_connection_param_t param = { 0 };
978                 bluetooth_le_connection_mode_t mode = BLUETOOTH_LE_CONNECTION_MODE_BALANCED;
979
980                 __bt_service_get_parameters(in_param1, &remote_address,
981                                 sizeof(bluetooth_device_address_t));
982                 __bt_service_get_parameters(in_param2, &mode,
983                                 sizeof(bluetooth_le_connection_mode_t));
984
985                 result = _bt_get_le_connection_parameter(mode, &param);
986                 if (result != BLUETOOTH_ERROR_NONE)
987                         break;
988
989                 sender = (char *)g_dbus_method_invocation_get_sender(context);
990
991                 result = _bt_le_conn_update(sender,
992                                 remote_address.addr,
993                                 param.interval_min,
994                                 param.interval_max,
995                                 param.latency,
996                                 param.timeout);
997                 break;
998         }
999
1000         case BT_SET_PROFILE_TRUSTED: {
1001                 bluetooth_device_address_t bd_addr = { {0} };
1002                 int profile;
1003                 int trust;
1004
1005                 __bt_service_get_parameters(in_param1, &bd_addr,
1006                                 sizeof(bluetooth_device_address_t));
1007                 __bt_service_get_parameters(in_param2, &profile, sizeof(int));
1008                 __bt_service_get_parameters(in_param3, &trust, sizeof(int));
1009
1010                 result = _bt_set_trust_profile(&bd_addr, profile, trust);
1011                 break;
1012         }
1013         case BT_GET_PROFILE_TRUSTED: {
1014                 bluetooth_device_address_t bd_addr = { {0} };
1015                 int profile;
1016                 guint trusted_profile = 0;
1017
1018                 __bt_service_get_parameters(in_param1, &bd_addr,
1019                                 sizeof(bluetooth_device_address_t));
1020                 __bt_service_get_parameters(in_param2, &profile, sizeof(int));
1021
1022                 result = _bt_get_trust_profile(&bd_addr, profile, &trusted_profile);
1023                 BT_DBG("TRUST %d", trusted_profile);
1024                 if (result == BLUETOOTH_ERROR_NONE) {
1025                         g_array_append_vals(*out_param1, &trusted_profile,
1026                                         sizeof(guint));
1027                 }
1028
1029                 break;
1030         }
1031         case BT_SET_PROFILE_RESTRICTED: {
1032                 bluetooth_device_address_t bd_addr = { {0} };
1033                 int profile;
1034                 int restricted;
1035
1036                 __bt_service_get_parameters(in_param1, &bd_addr,
1037                                 sizeof(bluetooth_device_address_t));
1038                 __bt_service_get_parameters(in_param2, &profile, sizeof(int));
1039                 __bt_service_get_parameters(in_param3, &restricted, sizeof(int));
1040
1041                 result = _bt_set_restrict_profile(&bd_addr, profile, restricted);
1042                 break;
1043         }
1044         case BT_GET_PROFILE_RESTRICTED: {
1045                 bluetooth_device_address_t bd_addr = { {0} };
1046                 int profile;
1047                 guint restricted_profile = 0;
1048
1049                 __bt_service_get_parameters(in_param1, &bd_addr,
1050                                 sizeof(bluetooth_device_address_t));
1051                 __bt_service_get_parameters(in_param2, &profile, sizeof(int));
1052
1053                 result = _bt_get_restrict_profile(&bd_addr, profile, &restricted_profile);
1054                 BT_DBG("Restricted %d", restricted_profile);
1055                 if (result == BLUETOOTH_ERROR_NONE) {
1056                         g_array_append_vals(*out_param1, &restricted_profile,
1057                                         sizeof(guint));
1058                 }
1059
1060                 break;
1061         }
1062         case BT_HID_CONNECT: {
1063                 bluetooth_device_address_t address = { {0} };
1064
1065                 __bt_service_get_parameters(in_param1,
1066                                 &address, sizeof(bluetooth_device_address_t));
1067
1068                 result = _bt_hid_connect(request_id, &address);
1069                 if (result != BLUETOOTH_ERROR_NONE) {
1070                         g_array_append_vals(*out_param1, &address,
1071                                         sizeof(bluetooth_device_address_t));
1072                 }
1073                 break;
1074         }
1075         case BT_HID_DISCONNECT: {
1076                 bluetooth_device_address_t address = { {0} };
1077
1078                 __bt_service_get_parameters(in_param1,
1079                                 &address, sizeof(bluetooth_device_address_t));
1080
1081                 result = _bt_hid_disconnect(request_id, &address);
1082                 if (result != BLUETOOTH_ERROR_NONE) {
1083                         g_array_append_vals(*out_param1, &address,
1084                                         sizeof(bluetooth_device_address_t));
1085                 }
1086                 break;
1087         }
1088         case BT_HID_ENABLE_BARCODE_FEATURE: {
1089                 result = _bt_hid_enable_barcode_feature();
1090                 break;
1091         }
1092         case BT_NETWORK_ACTIVATE:
1093                 result = _bt_network_activate();
1094                 break;
1095         case BT_NETWORK_DEACTIVATE:
1096                 result = _bt_network_deactivate();
1097                 break;
1098         case BT_NETWORK_CONNECT: {
1099                 bluetooth_device_address_t address = { {0} };
1100                 int role;
1101
1102                 __bt_service_get_parameters(in_param1,
1103                                 &address, sizeof(bluetooth_device_address_t));
1104                 __bt_service_get_parameters(in_param2,
1105                                 &role, sizeof(int));
1106
1107                 result = _bt_network_connect(request_id, role, &address);
1108                 if (result != BLUETOOTH_ERROR_NONE) {
1109                         g_array_append_vals(*out_param1, &address,
1110                                         sizeof(bluetooth_device_address_t));
1111                 }
1112                 break;
1113         }
1114         case BT_NETWORK_DISCONNECT: {
1115                 bluetooth_device_address_t address = { {0} };
1116
1117                 __bt_service_get_parameters(in_param1,
1118                                 &address, sizeof(bluetooth_device_address_t));
1119
1120                 result = _bt_network_disconnect(request_id, &address);
1121                 if (result != BLUETOOTH_ERROR_NONE) {
1122                         g_array_append_vals(*out_param1, &address,
1123                                         sizeof(bluetooth_device_address_t));
1124                 }
1125                 break;
1126         }
1127         case BT_NETWORK_SERVER_DISCONNECT: {
1128                 bluetooth_device_address_t address = { {0} };
1129
1130                 __bt_service_get_parameters(in_param1,
1131                                 &address, sizeof(bluetooth_device_address_t));
1132
1133                 result = _bt_network_server_disconnect(request_id, &address);
1134                 if (result != BLUETOOTH_ERROR_NONE) {
1135                         g_array_append_vals(*out_param1, &address,
1136                                         sizeof(bluetooth_device_address_t));
1137                 }
1138                 break;
1139         }
1140
1141         case BT_AUDIO_CONNECT: {
1142                 bluetooth_device_address_t address = { {0} };
1143
1144                 __bt_service_get_parameters(in_param1,
1145                                 &address, sizeof(bluetooth_device_address_t));
1146
1147                 result = _bt_audio_connect(request_id, BT_AUDIO_ALL,
1148                                         &address, *out_param1);
1149                 break;
1150         }
1151         case BT_AUDIO_DISCONNECT: {
1152                 bluetooth_device_address_t address = { {0} };
1153
1154                 __bt_service_get_parameters(in_param1,
1155                                 &address, sizeof(bluetooth_device_address_t));
1156
1157                 result = _bt_audio_disconnect(request_id, BT_AUDIO_ALL,
1158                                         &address, *out_param1);
1159                 break;
1160         }
1161         case BT_AG_CONNECT: {
1162                 bluetooth_device_address_t address = { {0} };
1163
1164                 __bt_service_get_parameters(in_param1,
1165                                 &address, sizeof(bluetooth_device_address_t));
1166
1167                 result = _bt_audio_connect(request_id, BT_AUDIO_HSP,
1168                                         &address, *out_param1);
1169                 break;
1170         }
1171         case BT_AG_DISCONNECT: {
1172                 bluetooth_device_address_t address = { {0} };
1173
1174                 __bt_service_get_parameters(in_param1,
1175                                 &address, sizeof(bluetooth_device_address_t));
1176
1177                 result = _bt_audio_disconnect(request_id, BT_AUDIO_HSP,
1178                                         &address, *out_param1);
1179                 break;
1180         }
1181         case BT_AV_CONNECT: {
1182                 bluetooth_device_address_t address = { {0} };
1183
1184                 __bt_service_get_parameters(in_param1,
1185                                 &address, sizeof(bluetooth_device_address_t));
1186
1187                 result = _bt_audio_connect(request_id, BT_AUDIO_A2DP,
1188                                         &address, *out_param1);
1189                 break;
1190         }
1191         case BT_AV_DISCONNECT: {
1192                 bluetooth_device_address_t address = { {0} };
1193
1194                 __bt_service_get_parameters(in_param1,
1195                                 &address, sizeof(bluetooth_device_address_t));
1196
1197                 result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP,
1198                                         &address, *out_param1);
1199                 break;
1200         }
1201         case BT_AVRCP_CONTROL_CONNECT: {
1202                 bluetooth_device_address_t address = { {0} };
1203
1204                 __bt_service_get_parameters(in_param1,
1205                                 &address, sizeof(bluetooth_device_address_t));
1206
1207                 result = _bt_audio_connect(request_id, BT_AVRCP,
1208                                         &address, *out_param1);
1209                 break;
1210         }
1211         case BT_AVRCP_CONTROL_DISCONNECT: {
1212                 bluetooth_device_address_t address = { {0} };
1213
1214                 __bt_service_get_parameters(in_param1,
1215                                 &address, sizeof(bluetooth_device_address_t));
1216
1217                 result = _bt_audio_disconnect(request_id, BT_AVRCP,
1218                                         &address, *out_param1);
1219                 break;
1220         }
1221         case BT_AVRCP_TARGET_CONNECT: {
1222                 bluetooth_device_address_t address = { {0} };
1223                 __bt_service_get_parameters(in_param1,
1224                                 &address, sizeof(bluetooth_device_address_t));
1225                 result = _bt_audio_connect(request_id, BT_AVRCP_TARGET,
1226                                         &address, *out_param1);
1227                 break;
1228                 }
1229         case BT_AVRCP_TARGET_DISCONNECT: {
1230                 bluetooth_device_address_t address = { {0} };
1231                 __bt_service_get_parameters(in_param1,
1232                                 &address, sizeof(bluetooth_device_address_t));
1233                 result = _bt_audio_disconnect(request_id, BT_AVRCP_TARGET,
1234                                         &address, *out_param1);
1235                 break;
1236                 }
1237         case BT_AV_SOURCE_CONNECT: {
1238                 bluetooth_device_address_t address = { {0} };
1239
1240                 __bt_service_get_parameters(in_param1, &address,
1241                                 sizeof(bluetooth_device_address_t));
1242
1243                 result = _bt_audio_connect(request_id, BT_AUDIO_A2DP_SOURCE,
1244                                         &address, *out_param1);
1245                 break;
1246         }
1247         case BT_AV_SOURCE_DISCONNECT: {
1248                 bluetooth_device_address_t address = { {0} };
1249
1250                 __bt_service_get_parameters(in_param1, &address,
1251                                 sizeof(bluetooth_device_address_t));
1252
1253                 result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP_SOURCE,
1254                                         &address, *out_param1);
1255                 break;
1256         }
1257         case BT_HF_CONNECT: {
1258                 bluetooth_device_address_t address = { {0} };
1259
1260                 __bt_service_get_parameters(in_param1,
1261                                 &address, sizeof(bluetooth_device_address_t));
1262
1263                 result = _bt_hf_connect(request_id, &address, *out_param1);
1264                 break;
1265         }
1266         case BT_HF_DISCONNECT: {
1267                 bluetooth_device_address_t address = { {0} };
1268
1269                 __bt_service_get_parameters(in_param1,
1270                                 &address, sizeof(bluetooth_device_address_t));
1271
1272                 result = _bt_hf_disconnect(request_id, &address, *out_param1);
1273                 break;
1274         }
1275         case BT_SET_CONTENT_PROTECT: {
1276                 gboolean status;
1277
1278                 __bt_service_get_parameters(in_param1,
1279                                 &status, sizeof(gboolean));
1280
1281                 result = _bt_audio_set_content_protect(status);
1282
1283                 break;
1284         }
1285         case BT_OOB_READ_LOCAL_DATA: {
1286                 bt_oob_data_t local_oob_data;
1287
1288                 memset(&local_oob_data, 0x00, sizeof(bt_oob_data_t));
1289                 result = _bt_oob_read_local_data(&local_oob_data);
1290
1291                 g_array_append_vals(*out_param1, &local_oob_data,
1292                                 sizeof(bt_oob_data_t));
1293
1294                 break;
1295         }
1296         case BT_OOB_ADD_REMOTE_DATA: {
1297                 bluetooth_device_address_t address = { {0} };
1298                 bt_oob_data_t remote_oob_data;
1299
1300                 __bt_service_get_parameters(in_param1,
1301                                 &address, sizeof(bluetooth_device_address_t));
1302                 __bt_service_get_parameters(in_param2,
1303                                 &remote_oob_data, sizeof(bt_oob_data_t));
1304
1305                 result = _bt_oob_add_remote_data(&address, &remote_oob_data);
1306
1307                 break;
1308         }
1309         case BT_OOB_REMOVE_REMOTE_DATA: {
1310                 bluetooth_device_address_t address = { {0} };
1311
1312                 __bt_service_get_parameters(in_param1,
1313                                 &address, sizeof(bluetooth_device_address_t));
1314
1315                 result = _bt_oob_remove_remote_data(&address);
1316
1317                 break;
1318         }
1319         case BT_AVRCP_SET_TRACK_INFO: {
1320                 media_metadata_t data;
1321                 media_metadata_attributes_t meta_data;
1322
1323                 memset(&data, 0x00, sizeof(media_metadata_t));
1324                 memset(&meta_data, 0x00, sizeof(media_metadata_attributes_t));
1325
1326                 __bt_service_get_parameters(in_param1,
1327                                 &data, sizeof(media_metadata_t));
1328
1329                 meta_data.title = g_strdup(data.title);
1330                 meta_data.artist = g_strdup(data.artist);
1331                 meta_data.album = g_strdup(data.album);
1332                 meta_data.genre = g_strdup(data.genre);
1333                 meta_data.total_tracks = data.total_tracks;
1334                 meta_data.number = data.number;
1335                 meta_data.duration = (int64_t) data.duration;
1336
1337                 result = _bt_avrcp_set_track_info(&meta_data);
1338
1339                 g_free((gpointer)meta_data.title);
1340                 g_free((gpointer)meta_data.artist);
1341                 g_free((gpointer)meta_data.album);
1342                 g_free((gpointer)meta_data.genre);
1343
1344                 break;
1345         }
1346         case BT_AVRCP_SET_PROPERTY: {
1347                 int type;
1348                 unsigned int value;
1349                 char *sender = NULL;
1350                 sender = (char *)g_dbus_method_invocation_get_sender(context);
1351                 BT_INFO("Sender %s", sender);
1352
1353                 __bt_service_get_parameters(in_param1,
1354                                 &type, sizeof(int));
1355                 __bt_service_get_parameters(in_param2,
1356                                 &value, sizeof(unsigned int));
1357
1358                 if (value == STATUS_PLAYING) {
1359                         if (current_sender_playing)
1360                                 g_free(current_sender_playing);
1361                         current_sender_playing = g_strdup(sender);
1362                 }
1363                 if (g_strcmp0(sender, current_sender_playing) == 0 ||
1364                         current_sender_playing == NULL) {
1365                         BT_INFO("Current Player Status %d type %d", value, type);
1366                 } else {
1367                         BT_INFO("Current Player and this sender are different");
1368                         result = BLUETOOTH_ERROR_NONE;
1369                         break;
1370                 }
1371                 result = _bt_avrcp_set_property(type, value);
1372
1373                 break;
1374         }
1375         case BT_AVRCP_SET_PROPERTIES: {
1376                 media_player_settings_t properties;
1377
1378                 memset(&properties, 0x00, sizeof(media_player_settings_t));
1379                 __bt_service_get_parameters(in_param1,
1380                                 &properties, sizeof(media_player_settings_t));
1381
1382                 result = _bt_avrcp_set_properties(&properties);
1383
1384                 break;
1385         }
1386         case BT_AVRCP_HANDLE_CONTROL: {
1387                 int type;
1388
1389                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
1390
1391                 result = _bt_avrcp_control_cmd(type);
1392
1393                 break;
1394         }
1395         case BT_AVRCP_CONTROL_SET_PROPERTY: {
1396                 int type;
1397                 unsigned int value;
1398
1399                 __bt_service_get_parameters(in_param1,
1400                                 &type, sizeof(int));
1401                 __bt_service_get_parameters(in_param2,
1402                                 &value, sizeof(unsigned int));
1403
1404                 result = _bt_avrcp_control_set_property(type, value);
1405
1406                 break;
1407         }
1408         case BT_AVRCP_CONTROL_GET_PROPERTY: {
1409                 int type;
1410                 unsigned int value;
1411
1412                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
1413
1414                 result = _bt_avrcp_control_get_property(type, &value);
1415                 g_array_append_vals(*out_param1, &value, sizeof(int));
1416
1417                 break;
1418         }
1419         case BT_AVRCP_GET_TRACK_INFO: {
1420                 media_metadata_t meta_data;
1421                 media_metadata_attributes_t metadata;
1422
1423                 memset(&meta_data, 0x00, sizeof(media_metadata_t));
1424                 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1425
1426                 result = _bt_avrcp_control_get_track_info(&metadata);
1427
1428                 if (BLUETOOTH_ERROR_NONE != result)
1429                         break;
1430
1431                 if (_bt_copy_utf8_string(meta_data.title, metadata.title,
1432                                                         BT_META_DATA_MAX_LEN))
1433                         BT_ERR("Error in copying Title\n");
1434                 if (_bt_copy_utf8_string(meta_data.artist, metadata.artist,
1435                                                         BT_META_DATA_MAX_LEN))
1436                         BT_ERR("Error in copying Artist\n");
1437                 if (_bt_copy_utf8_string(meta_data.album, metadata.album,
1438                                                         BT_META_DATA_MAX_LEN))
1439                         BT_ERR("Error in copying Album\n");
1440                 if (_bt_copy_utf8_string(meta_data.genre, metadata.genre,
1441                                                         BT_META_DATA_MAX_LEN))
1442                         BT_ERR("Error in copying Genre\n");
1443
1444                 if (_bt_utf8_validate(meta_data.title) == FALSE)
1445                         meta_data.title[0] = '\0';
1446
1447                 if (_bt_utf8_validate(meta_data.artist) == FALSE)
1448                         meta_data.artist[0] = '\0';
1449
1450                 if (_bt_utf8_validate(meta_data.album) == FALSE)
1451                         meta_data.album[0] = '\0';
1452
1453                 if (_bt_utf8_validate(meta_data.genre) == FALSE)
1454                         meta_data.genre[0] = '\0';
1455
1456                 meta_data.total_tracks = metadata.total_tracks;
1457                 meta_data.number = metadata.number;
1458                 meta_data.duration = metadata.duration;
1459
1460                 g_free((gpointer)metadata.title);
1461                 g_free((gpointer)metadata.artist);
1462                 g_free((gpointer)metadata.album);
1463                 g_free((gpointer)metadata.genre);
1464
1465                 g_array_append_vals(*out_param1, &meta_data,
1466                                         sizeof(media_metadata_t));
1467                 break;
1468         }
1469         case BT_RFCOMM_CLIENT_CONNECT: {
1470 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1471                 result = BLUETOOTH_ERROR_NONE;
1472 #else
1473                 bluetooth_device_address_t address = { {0} };
1474                 char *input_string;
1475                 int connect_type;
1476
1477                 __bt_service_get_parameters(in_param1,
1478                                 &address, sizeof(bluetooth_device_address_t));
1479
1480                 input_string = &g_array_index(in_param2, char, 0);
1481
1482                 connect_type = g_array_index(in_param3, int, 0);
1483
1484                 if (connect_type == BT_RFCOMM_UUID) {
1485                         result = _bt_rfcomm_connect_using_uuid(request_id,
1486                                                         &address, input_string);
1487                 } else {
1488                         result = _bt_rfcomm_connect_using_channel(request_id,
1489                                                         &address, input_string);
1490                 }
1491
1492                 if (result != BLUETOOTH_ERROR_NONE) {
1493                         g_array_append_vals(*out_param1, &address,
1494                                         sizeof(bluetooth_device_address_t));
1495                 }
1496 #endif
1497                 break;
1498         }
1499         case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
1500                 result = _bt_rfcomm_cancel_connect();
1501                 break;
1502         case BT_RFCOMM_CLIENT_IS_CONNECTED: {
1503                 gboolean connected = FALSE;
1504                 result = _bt_rfcomm_is_connected(&connected);
1505
1506                 g_array_append_vals(*out_param1, &connected, sizeof(gboolean));
1507                 break;
1508         }
1509         case BT_RFCOMM_SOCKET_DISCONNECT: {
1510 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1511                 result = BLUETOOTH_ERROR_NONE;
1512 #else
1513                 int socket_fd;
1514
1515                 socket_fd = g_array_index(in_param1, int, 0);
1516
1517                 result = _bt_rfcomm_disconnect(socket_fd);
1518 #endif
1519                 break;
1520         }
1521         case BT_RFCOMM_SOCKET_WRITE: {
1522 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1523                 result = BLUETOOTH_ERROR_NONE;
1524 #else
1525                 int socket_fd;
1526                 int length;
1527                 char *buffer;
1528
1529                 socket_fd = g_array_index(in_param1, int, 0);
1530                 length = g_array_index(in_param2, int, 0);
1531                 buffer = &g_array_index(in_param3, char, 0);
1532
1533                 result = _bt_rfcomm_write(socket_fd, buffer, length);
1534 #endif
1535                 break;
1536         }
1537         case BT_RFCOMM_CREATE_SOCKET: {
1538 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1539                 result = BLUETOOTH_ERROR_NONE;
1540 #else
1541                 char *sender;
1542                 char *uuid;
1543                 int socket_fd = -1;
1544
1545                 sender = (char *)g_dbus_method_invocation_get_sender(context);
1546                 uuid = &g_array_index(in_param1, char, 0);
1547
1548                 result = _bt_rfcomm_create_socket(sender, uuid);
1549
1550                 if (result > 0) {
1551                         socket_fd = result;
1552                         result = BLUETOOTH_ERROR_NONE;
1553                 }
1554
1555                 g_array_append_vals(*out_param1, &socket_fd, sizeof(int));
1556
1557                 g_free(sender);
1558 #endif
1559                 break;
1560         }
1561         case BT_RFCOMM_REMOVE_SOCKET: {
1562 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1563                 result = BLUETOOTH_ERROR_NONE;
1564 #else
1565                 int socket_fd;
1566
1567                 socket_fd = g_array_index(in_param1, int, 0);
1568
1569                 result = _bt_rfcomm_remove_socket(socket_fd);
1570 #endif
1571                 break;
1572         }
1573         case BT_RFCOMM_LISTEN: {
1574                 int socket_fd;
1575                 int pending;
1576                 gboolean is_native;
1577
1578                 __bt_service_get_parameters(in_param1, &socket_fd,
1579                                 sizeof(int));
1580                 __bt_service_get_parameters(in_param2, &pending,
1581                                 sizeof(int));
1582                 __bt_service_get_parameters(in_param3, &is_native,
1583                                 sizeof(gboolean));
1584
1585                 result = _bt_rfcomm_listen(socket_fd, pending, is_native);
1586                 break;
1587         }
1588         case BT_RFCOMM_IS_UUID_AVAILABLE: {
1589                 gboolean available = TRUE;
1590                 char *uuid;
1591
1592                 uuid = (char *)g_variant_get_data(in_param1);
1593
1594                 result = _bt_rfcomm_is_uuid_available(uuid, &available);
1595
1596                 g_array_append_vals(*out_param1, &available, sizeof(gboolean));
1597                 break;
1598         }
1599         case BT_RFCOMM_ACCEPT_CONNECTION: {
1600                 int socket_fd;
1601
1602                 __bt_service_get_parameters(in_param1, &socket_fd, sizeof(int));
1603                 BT_DBG(" socket fd %d", socket_fd);
1604                 result = _bt_rfcomm_accept_connection();
1605                 break;
1606         }
1607         case BT_RFCOMM_REJECT_CONNECTION: {
1608                 int socket_fd;
1609
1610                 __bt_service_get_parameters(in_param1, &socket_fd, sizeof(int));
1611                 BT_DBG(" socket fd %d", socket_fd);
1612                 result = _bt_rfcomm_reject_connection();
1613                 break;
1614         }
1615         case BT_RFCOMM_CREATE_SOCKET_EX: {
1616                 result = BLUETOOTH_ERROR_NONE;
1617                 break;
1618         }
1619         case BT_RFCOMM_REMOVE_SOCKET_EX: {
1620                 result = BLUETOOTH_ERROR_NONE;
1621                 break;
1622         }
1623         case BT_CONNECT_LE: {
1624                 bluetooth_device_address_t address = { {0} };
1625                 gboolean auto_connect;
1626
1627                 __bt_service_get_parameters(in_param1,
1628                                 &address, sizeof(bluetooth_device_address_t));
1629                 __bt_service_get_parameters(in_param2,
1630                                 &auto_connect, sizeof(gboolean));
1631
1632                 result = _bt_connect_le_device(request_id, &address,
1633                                 auto_connect);
1634                 if (result != BLUETOOTH_ERROR_NONE) {
1635                         g_array_append_vals(*out_param1, &address,
1636                                         sizeof(bluetooth_device_address_t));
1637                 }
1638
1639                 break;
1640         }
1641         case BT_DISCONNECT_LE: {
1642                 bluetooth_device_address_t address = { {0} };
1643
1644                 __bt_service_get_parameters(in_param1, &address,
1645                                 sizeof(bluetooth_device_address_t));
1646
1647                 result = _bt_disconnect_le_device(request_id, &address);
1648                 if (result != BLUETOOTH_ERROR_NONE) {
1649                         g_array_append_vals(*out_param1, &address,
1650                                         sizeof(bluetooth_device_address_t));
1651                 }
1652
1653                 break;
1654         }
1655         case BT_SET_LE_PRIVACY: {
1656                 gboolean set_privacy;
1657
1658                 __bt_service_get_parameters(in_param1, &set_privacy,
1659                                 sizeof(gboolean));
1660
1661                 result = _bt_set_le_privacy(set_privacy);
1662
1663                 break;
1664         }
1665         case BT_REQ_ATT_MTU: {
1666                 bluetooth_device_address_t address = { {0} };
1667                 unsigned int mtu;
1668
1669                 __bt_service_get_parameters(in_param1,
1670                                 &address, sizeof(bluetooth_device_address_t));
1671                 __bt_service_get_parameters(in_param2,
1672                                 &mtu, sizeof(unsigned int));
1673
1674                 result = _bt_request_att_mtu(request_id, &address, mtu);
1675                 if (result != BLUETOOTH_ERROR_NONE) {
1676                         g_array_append_vals(*out_param1, &address,
1677                                         sizeof(bluetooth_device_info_t));
1678                 }
1679                 break;
1680         }
1681         case BT_GET_ATT_MTU: {
1682                 bluetooth_device_address_t address = { {0} };
1683                 unsigned int mtu = 0;
1684
1685                 __bt_service_get_parameters(in_param1,
1686                                 &address, sizeof(bluetooth_device_address_t));
1687
1688                 result = _bt_get_att_mtu(&address, &mtu);
1689                 BT_DBG("MTU: %d", mtu);
1690                 if (result == BLUETOOTH_ERROR_NONE) {
1691                         g_array_append_vals(*out_param1, &mtu,
1692                                                 sizeof(unsigned int));
1693                 }
1694                 break;
1695         }
1696         case BT_GET_DEVICE_IDA: {
1697                 bluetooth_device_address_t address = { {0} };
1698                 bluetooth_device_address_t id_addr = { {0} };
1699
1700                 __bt_service_get_parameters(in_param1,
1701                                 &address, sizeof(bluetooth_device_address_t));
1702
1703                 result = _bt_get_device_ida(&address, &id_addr);
1704
1705                 if (result == BLUETOOTH_ERROR_NONE) {
1706                         g_array_append_vals(*out_param1, &id_addr,
1707                                         sizeof(bluetooth_device_address_t));
1708                 }
1709                 break;
1710         }
1711         case BT_SET_LE_STATIC_RANDOM_ADDRESS: {
1712                 gboolean is_enable;
1713
1714                 __bt_service_get_parameters(in_param1, &is_enable,
1715                                 sizeof(gboolean));
1716
1717                 result = _bt_set_le_static_random_address(is_enable);
1718
1719                 break;
1720         }
1721         case BT_HDP_CONNECT:
1722         case BT_HDP_DISCONNECT:
1723         case BT_HDP_SEND_DATA:
1724
1725         case BT_GATT_GET_PRIMARY_SERVICES:
1726         case BT_GATT_DISCOVER_CHARACTERISTICS:
1727         case BT_GATT_SET_PROPERTY_REQUEST:
1728         case BT_GATT_READ_CHARACTERISTIC:
1729         case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
1730
1731         case BT_HID_DEVICE_ACTIVATE:
1732         case BT_HID_DEVICE_DEACTIVATE:
1733         case BT_HID_DEVICE_CONNECT:
1734         case BT_HID_DEVICE_DISCONNECT:
1735         case BT_HID_DEVICE_SEND_MOUSE_EVENT:
1736         case BT_HID_DEVICE_SEND_KEY_EVENT:
1737         case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
1738                 /* Just call to check the privilege */
1739                 break;
1740         case BT_LE_IPSP_INIT:
1741                 result = _bt_initialize_ipsp();
1742                 break;
1743         case BT_LE_IPSP_DEINIT:
1744                 result = _bt_deinitialize_ipsp();
1745                 break;
1746         case BT_LE_IPSP_CONNECT: {
1747                 bluetooth_device_address_t address = { {0} };
1748                 __bt_service_get_parameters(in_param1, &address,
1749                                 sizeof(bluetooth_device_address_t));
1750
1751                 result = _bt_connect_le_ipsp_device(&address);
1752                 break;
1753         }
1754         case BT_LE_IPSP_DISCONNECT: {
1755                 bluetooth_device_address_t address = { {0} };
1756
1757                 __bt_service_get_parameters(in_param1, &address,
1758                                 sizeof(bluetooth_device_address_t));
1759
1760                 result = _bt_disconnect_le_ipsp_device(&address);
1761                 break;
1762         }
1763         case BT_LE_READ_MAXIMUM_DATA_LENGTH: {
1764                 bluetooth_le_read_maximum_data_length_t max_le_datalength = {0};
1765
1766                 result = _bt_le_read_maximum_data_length(&max_le_datalength);
1767
1768                 g_array_append_vals(*out_param1, &max_le_datalength,
1769                         sizeof(bluetooth_le_read_maximum_data_length_t));
1770                 break;
1771         }
1772         case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH: {
1773                 unsigned int def_tx_Octects = 0;
1774                 unsigned int def_tx_Time = 0;
1775
1776                 __bt_service_get_parameters(in_param1,
1777                                 &def_tx_Octects, sizeof(int));
1778                 __bt_service_get_parameters(in_param2,
1779                                 &def_tx_Time, sizeof(int));
1780
1781                 result = _bt_le_write_host_suggested_default_data_length(
1782                                                 def_tx_Octects, def_tx_Time);
1783                 break;
1784         }
1785         case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH: {
1786                 bluetooth_le_read_host_suggested_data_length_t def_data_length = {0};
1787
1788                 result = _bt_le_read_host_suggested_default_data_length(&def_data_length);
1789
1790                 g_array_append_vals(*out_param1, &def_data_length,
1791                                 sizeof(bluetooth_le_read_host_suggested_data_length_t));
1792
1793                 break;
1794         }
1795         case BT_LE_SET_DATA_LENGTH: {
1796                 int max_tx_Octets = 0;
1797                 int max_tx_Time = 0;
1798                 bluetooth_device_address_t address = { {0} };
1799
1800                 __bt_service_get_parameters(in_param1, &address,
1801                                 sizeof(bluetooth_device_address_t));
1802                 __bt_service_get_parameters(in_param2,
1803                                 &max_tx_Octets, sizeof(int));
1804                 __bt_service_get_parameters(in_param3,
1805                                 &max_tx_Time, sizeof(int));
1806
1807                 result = _bt_le_set_data_length(&address, max_tx_Octets, max_tx_Time);
1808                 break;
1809         }
1810         case BT_DPM_SET_ALLOW_BT_MODE: {
1811                 dpm_bt_allow_t value = DPM_BT_ERROR;
1812
1813                 __bt_service_get_parameters(in_param1, &value,
1814                                 sizeof(int));
1815
1816                 result = _bt_dpm_set_allow_bluetooth_mode(value);
1817                 break;
1818         }
1819         case BT_DPM_GET_ALLOW_BT_MODE: {
1820                 int value = DPM_BT_ERROR;
1821
1822                 result = _bt_dpm_get_allow_bluetooth_mode(&value);
1823                 g_array_append_vals(*out_param1, &value, sizeof(int));
1824                 break;
1825         }
1826         case BT_DPM_SET_DEVICE_RESTRITION: {
1827                 dpm_status_t value = DPM_STATUS_ERROR;
1828
1829                 __bt_service_get_parameters(in_param1, &value,
1830                                 sizeof(int));
1831
1832                 result = _bt_dpm_activate_bluetooth_device_restriction(value);
1833                 break;
1834         }
1835         case BT_DPM_GET_DEVICE_RESTRITION: {
1836                 int value = DPM_STATUS_ERROR;
1837
1838                 result = _bt_dpm_is_bluetooth_device_restriction_active(&value);
1839                 g_array_append_vals(*out_param1, &value, sizeof(int));
1840                 break;
1841         }
1842         case BT_DPM_SET_UUID_RESTRITION: {
1843                 dpm_status_t value = DPM_STATUS_ERROR;
1844
1845                 __bt_service_get_parameters(in_param1, &value,
1846                                 sizeof(int));
1847
1848                 result = _bt_dpm_activate_bluetoooth_uuid_restriction(value);
1849                 break;
1850         }
1851         case BT_DPM_GET_UUID_RESTRITION: {
1852                 int value = DPM_STATUS_ERROR;
1853
1854                 result = _bt_dpm_is_bluetooth_uuid_restriction_active(&value);
1855                 g_array_append_vals(*out_param1, &value, sizeof(int));
1856                 break;
1857         }
1858         case BT_DPM_ADD_DEVICES_BLACKLIST: {
1859                 bluetooth_device_address_t address = { {0} };
1860
1861                 __bt_service_get_parameters(in_param1, &address,
1862                         sizeof(bluetooth_device_address_t));
1863
1864                 result = _bt_dpm_add_bluetooth_devices_to_blacklist(&address);
1865                 break;
1866         }
1867         case BT_DPM_ADD_DEVICES_WHITELIST: {
1868                 bluetooth_device_address_t address = { {0} };
1869
1870                 __bt_service_get_parameters(in_param1, &address,
1871                         sizeof(bluetooth_device_address_t));
1872
1873                 result = _bt_dpm_add_bluetooth_devices_to_whitelist(&address);
1874                 break;
1875         }
1876         case BT_DPM_ADD_UUIDS_BLACKLIST: {
1877                 const char *uuid = NULL;
1878
1879                 uuid = g_variant_get_data(in_param1);
1880
1881                 result = _bt_dpm_add_bluetooth_uuids_to_blacklist(uuid);
1882                 break;
1883         }
1884         case BT_DPM_ADD_UUIDS_WHITELIST: {
1885                 const char *uuid = NULL;
1886
1887                 uuid = g_variant_get_data(in_param1);
1888
1889                 result = _bt_dpm_add_bluetooth_uuids_to_whitelist(uuid);
1890                 break;
1891         }
1892         case BT_DPM_CLEAR_DEVICES_BLACKLIST: {
1893                 result = _bt_dpm_clear_bluetooth_devices_from_blacklist();
1894                 break;
1895         }
1896         case BT_DPM_CLEAR_DEVICES_WHITELIST: {
1897                 result = _bt_dpm_clear_bluetooth_devices_from_whitelist();
1898                 break;
1899         }
1900         case BT_DPM_CLEAR_UUIDS_BLACKLIST: {
1901                 result = _bt_dpm_clear_bluetooth_uuids_from_blacklist();
1902                 break;
1903         }
1904         case BT_DPM_CLEAR_UUIDS_WHITELIST: {
1905                 result = _bt_dpm_clear_bluetooth_uuids_from_whitelist();
1906                 break;
1907         }
1908         case BT_DPM_REMOVE_DEVICE_BLACKLIST: {
1909                 bluetooth_device_address_t address = { {0} };
1910
1911                 __bt_service_get_parameters(in_param1, &address,
1912                         sizeof(bluetooth_device_address_t));
1913
1914                 result = _bt_dpm_remove_bluetooth_devices_from_blacklist(&address);
1915                 break;
1916         }
1917         case BT_DPM_REMOVE_DEVICE_WHITELIST: {
1918                 bluetooth_device_address_t address = { {0} };
1919
1920                 __bt_service_get_parameters(in_param1, &address,
1921                         sizeof(bluetooth_device_address_t));
1922
1923                 result = _bt_dpm_remove_bluetooth_devices_from_whitelist(&address);
1924                 break;
1925         }
1926         case BT_DPM_REMOVE_UUID_BLACKLIST: {
1927                 const char *uuid = NULL;
1928
1929                 uuid = g_variant_get_data(in_param1);
1930
1931                 result = _bt_dpm_remove_bluetooth_uuids_from_blacklist(uuid);
1932                 break;
1933         }
1934         case BT_DPM_REMOVE_UUID_WHITELIST: {
1935                 const char *uuid = NULL;
1936
1937                 uuid = g_variant_get_data(in_param1);
1938
1939                 result = _bt_dpm_remove_bluetooth_uuids_from_whitelist(uuid);
1940
1941                 break;
1942         }
1943         case BT_DPM_GET_DEVICES_BLACKLIST: {
1944                 result = _bt_dpm_get_bluetooth_devices_from_blacklist(out_param1);
1945                 break;
1946         }
1947         case BT_DPM_GET_DEVICES_WHITELIST: {
1948                 result = _bt_dpm_get_bluetooth_devices_from_whitelist(out_param1);
1949                 break;
1950         }
1951         case BT_DPM_GET_UUIDS_BLACKLIST: {
1952                 result = _bt_dpm_get_bluetooth_uuids_from_blacklist(out_param1);
1953                 break;
1954         }
1955         case BT_DPM_GET_UUIDS_WHITELIST: {
1956                 result = _bt_dpm_get_bluetooth_uuids_from_whitelist(out_param1);
1957                 break;
1958         }
1959         case BT_DPM_SET_ALLOW_OUTGOING_CALL: {
1960                 dpm_status_t value = DPM_STATUS_ERROR;
1961
1962                 __bt_service_get_parameters(in_param1, &value,
1963                                 sizeof(int));
1964
1965                 result = _bt_dpm_set_allow_bluetooth_outgoing_call(value);
1966
1967                 break;
1968         }
1969         case BT_DPM_GET_ALLOW_OUTGOING_CALL: {
1970                 int value = DPM_STATUS_ERROR;
1971
1972                 result = _bt_dpm_get_allow_bluetooth_outgoing_call(&value);
1973                 g_array_append_vals(*out_param1, &value, sizeof(int));
1974                 break;
1975         }
1976         case BT_DPM_SET_PAIRING_STATE: {
1977                 dpm_status_t value = DPM_STATUS_ERROR;
1978
1979                 __bt_service_get_parameters(in_param1, &value,
1980                                 sizeof(int));
1981
1982                 result = _bt_dpm_set_bluetooth_pairing_state(value);
1983
1984                 break;
1985         }
1986         case BT_DPM_GET_PAIRING_STATE: {
1987                 int value = DPM_STATUS_ERROR;
1988
1989                 result = _bt_dpm_get_bluetooth_pairing_state(&value);
1990                 g_array_append_vals(*out_param1, &value, sizeof(int));
1991                 break;
1992         }
1993         case BT_DPM_SET_PROFILE_STATE: {
1994                 int value = DPM_STATUS_ERROR;
1995                 int profile = DPM_PROFILE_NONE;
1996
1997                 __bt_service_get_parameters(in_param1, &profile,
1998                                 sizeof(int));
1999                 __bt_service_get_parameters(in_param2, &value,
2000                                 sizeof(int));
2001
2002                 result = _bt_dpm_set_bluetooth_profile_state(profile, value);
2003
2004                 break;
2005         }
2006         case BT_DPM_GET_PROFILE_STATE: {
2007                 int value = DPM_STATUS_ERROR;
2008                 int profile = DPM_PROFILE_NONE;
2009
2010                 __bt_service_get_parameters(in_param1, &profile,
2011                                 sizeof(int));
2012
2013                 result = _bt_dpm_get_bluetooth_profile_state(profile, &value);
2014                 g_array_append_vals(*out_param1, &value, sizeof(int));
2015                 break;
2016         }
2017         case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE: {
2018                 int value = DPM_BT_ERROR;
2019
2020                 __bt_service_get_parameters(in_param1, &value,
2021                                 sizeof(int));
2022
2023                 result = _bt_dpm_set_bluetooth_desktop_connectivity_state(value);
2024
2025                 break;
2026         }
2027         case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE: {
2028                 int value = DPM_STATUS_ERROR;
2029
2030                 result = _bt_dpm_get_bluetooth_desktop_connectivity_state(&value);
2031                 g_array_append_vals(*out_param1, &value, sizeof(int));
2032                 break;
2033         }
2034         case BT_DPM_SET_DISCOVERABLE_STATE: {
2035                 int value = DPM_STATUS_ERROR;
2036
2037                 __bt_service_get_parameters(in_param1, &value,
2038                                 sizeof(int));
2039
2040                 result = _bt_dpm_set_bluetooth_discoverable_state(value);
2041
2042                 break;
2043         }
2044         case BT_DPM_GET_DISCOVERABLE_STATE: {
2045                 int value = DPM_STATUS_ERROR;
2046
2047                 result = _bt_dpm_get_bluetooth_discoverable_state(&value);
2048                 g_array_append_vals(*out_param1, &value, sizeof(int));
2049                 break;
2050         }
2051         case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE: {
2052                 int value = DPM_STATUS_ERROR;
2053
2054                 __bt_service_get_parameters(in_param1, &value,
2055                                 sizeof(int));
2056
2057                 result = _bt_dpm_set_bluetooth_limited_discoverable_state(value);
2058
2059                 break;
2060         }
2061         case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE: {
2062                 int value = DPM_STATUS_ERROR;
2063
2064                 result = _bt_dpm_get_bluetooth_limited_discoverable_state(&value);
2065                 g_array_append_vals(*out_param1, &value, sizeof(int));
2066                 break;
2067         }
2068         case BT_DPM_SET_DATA_TRANSFER_STATE: {
2069                 int value = DPM_STATUS_ERROR;
2070
2071                 __bt_service_get_parameters(in_param1, &value,
2072                                 sizeof(int));
2073
2074                 result = _bt_dpm_set_bluetooth_data_transfer_state(value);
2075
2076                 break;
2077         }
2078         case BT_DPM_GET_DATA_TRANSFER_STATE: {
2079                 int value = DPM_STATUS_ERROR;
2080
2081                 result = _bt_dpm_get_allow_bluetooth_data_transfer_state(&value);
2082                 g_array_append_vals(*out_param1, &value, sizeof(int));
2083                 break;
2084         }
2085         case BT_PXP_MONITOR_SET_PROPERTY: {
2086                 bluetooth_device_address_t address = { {0} };
2087                 unsigned int property = 0;
2088                 unsigned int value = 0;
2089
2090                 __bt_service_get_parameters(in_param1,
2091                                 &address, sizeof(bluetooth_device_address_t));
2092                 __bt_service_get_parameters(in_param2,
2093                                 &property, sizeof(int));
2094                 __bt_service_get_parameters(in_param3,
2095                                 &value, sizeof(int));
2096
2097                 result = _bt_proximity_monitor_set_property(&address, property, value);
2098                 break;
2099         }
2100         case BT_PXP_MONITOR_GET_PROPERTY: {
2101                 bluetooth_device_address_t address = { {0} };
2102                 unsigned int property = 0;
2103                 int value = 0;
2104
2105                 __bt_service_get_parameters(in_param1,
2106                                 &address, sizeof(bluetooth_device_address_t));
2107                 __bt_service_get_parameters(in_param2,
2108                                 &property, sizeof(unsigned int));
2109
2110                 result = _bt_proximity_monitor_get_property(&address, property, &value);
2111                 if (result == BLUETOOTH_ERROR_NONE) {
2112                         g_array_append_vals(*out_param1, &value,
2113                                                 sizeof(int));
2114                 }
2115                 break;
2116         }
2117         case BT_PXP_MONITOR_GET_SUPPORTED_SERIVCES: {
2118                 bluetooth_device_address_t address = { {0} };
2119                 unsigned int property = 0;
2120
2121                 __bt_service_get_parameters(in_param1,
2122                                 &address, sizeof(bluetooth_device_address_t));
2123
2124                 result = _bt_proximity_monitor_get_supported_services(&address, &property);
2125                 if (result == BLUETOOTH_ERROR_NONE) {
2126                         g_array_append_vals(*out_param1, &property,
2127                                                 sizeof(int));
2128                 }
2129                 break;
2130         }
2131         case BT_PXP_REPORTER_REGISTER: {
2132                 char *sender = NULL;
2133                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2134                 result = _bt_proximity_reporter_register(sender);
2135                 break;
2136         }
2137         case BT_PXP_REPORTER_UNREGISTER: {
2138                 char *sender = NULL;
2139                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2140                 result = _bt_proximity_reporter_unregister(sender);
2141                 break;
2142         }
2143         case BT_PXP_REPORTER_GET_PROPERTY: {
2144                 bluetooth_device_address_t address = { {0} };
2145                 unsigned int property = 0;
2146                 int value = 0;
2147
2148                 __bt_service_get_parameters(in_param1,
2149                                 &address, sizeof(bluetooth_device_address_t));
2150                 __bt_service_get_parameters(in_param2,
2151                                 &property, sizeof(unsigned int));
2152
2153                 result = _bt_proximity_reporter_get_property(&address, property, &value);
2154                 if (result == BLUETOOTH_ERROR_NONE) {
2155                         g_array_append_vals(*out_param1, &value,
2156                                                 sizeof(int));
2157                 }
2158                 break;
2159         }
2160         case BT_TDS_PROVIDER_REGISTER: {
2161                 char *sender = NULL;
2162
2163                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2164                 result = _bt_tds_provider_register(sender);
2165
2166                 break;
2167         }
2168         case BT_TDS_PROVIDER_UNREGISTER: {
2169                 char *sender = NULL;
2170
2171                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2172                 result = _bt_tds_provider_unregister(sender);
2173
2174                 break;
2175         }
2176         case BT_TDS_PROVIDER_SET_MANUF_DATA: {
2177                 char *sender = NULL;
2178                 unsigned int length = 0;
2179                 bluetooth_advertising_data_t manuf_data;
2180
2181                 __bt_service_get_parameters(in_param1,
2182                                 &length, sizeof(unsigned int));
2183                 __bt_service_get_parameters(in_param2,
2184                                 &manuf_data, sizeof(bluetooth_advertising_data_t));
2185                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2186
2187                 result = _bt_tds_provider_set_manuf_data(sender, manuf_data.data, length);
2188                 break;
2189         }
2190         case BT_TDS_PROVIDER_CREATE: {
2191                 char *sender = NULL;
2192                 unsigned int tds_handle = 0;
2193                 int transport;
2194
2195                 __bt_service_get_parameters(in_param1,
2196                                 &tds_handle, sizeof(unsigned int));
2197                 __bt_service_get_parameters(in_param2,
2198                                 &transport, sizeof(int));
2199                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2200                 result = _bt_tds_provider_transport_create(sender, transport, tds_handle);
2201
2202                 break;
2203         }
2204         case BT_TDS_PROVIDER_DESTROY: {
2205                 char *sender = NULL;
2206                 unsigned int tds_handle = 0;
2207
2208                 __bt_service_get_parameters(in_param1,
2209                                 &tds_handle, sizeof(unsigned int));
2210                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2211                 result = _bt_tds_provider_transport_remove(sender, tds_handle);
2212
2213                 break;
2214         }
2215         case BT_TDS_PROVIDER_SET_TRANSPORT_DATA: {
2216                 char *sender = NULL;
2217                 unsigned int tds_handle = 0;
2218                 int transport_state = 0;
2219                 bluetooth_tds_data_t tds_data;
2220
2221                 __bt_service_get_parameters(in_param1,
2222                                 &tds_handle, sizeof(unsigned int));
2223                 __bt_service_get_parameters(in_param2,
2224                                 &transport_state, sizeof(int));
2225                 __bt_service_get_parameters(in_param3,
2226                                 &tds_data, sizeof(bluetooth_tds_data_t));
2227                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2228
2229                 result = _bt_tds_provider_set_transport_data(sender, tds_handle,
2230                                 transport_state, tds_data.data, tds_data.length);
2231                 break;
2232         }
2233         case BT_TDS_SEND_ACTIVATION_RESPONSE: {
2234                 bluetooth_device_address_t address = { {0} };
2235                 bluetooth_tds_data_t tds_data;
2236                 char *sender = NULL;
2237                 unsigned int tds_handle = 0;
2238                 int response;
2239
2240                 __bt_service_get_parameters(in_param1,
2241                                 &tds_handle, sizeof(unsigned int));
2242                 __bt_service_get_parameters(in_param2,
2243                                 &response, sizeof(int));
2244                 __bt_service_get_parameters(in_param3, &address,
2245                         sizeof(bluetooth_device_address_t));
2246                 __bt_service_get_parameters(in_param4,
2247                                 &tds_data, sizeof(bluetooth_tds_data_t));
2248                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2249
2250                 result = _bt_tds_provider_send_activation_response(sender, tds_handle,
2251                                 &address, response, tds_data.data, tds_data.length);
2252                 break;
2253         }
2254         case BT_TDS_READ_TRANSPORT_DATA: {
2255                 char *handle;
2256                 char *data = NULL;
2257                 guint data_len = 0;
2258
2259                 char *sender = NULL;
2260                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2261
2262                 bluetooth_device_address_t address = { {0} };
2263                 __bt_service_get_parameters(in_param2,
2264                         &address, sizeof(bluetooth_device_address_t));
2265
2266                 data_len = g_variant_get_size(in_param1);
2267                 data = (char *)g_variant_get_data(in_param1);
2268
2269                 handle = g_strndup(data, data_len);
2270                 BT_DBG("Read TDS Transport Block [%s]", handle);
2271
2272                 result = _bt_tds_read_transport_data(request_id, sender, &address, handle);
2273
2274                 if (result != BLUETOOTH_ERROR_NONE) {
2275                         BT_ERR("Reading TDS Transport data failed result [%d]", result);
2276                         g_array_append_vals(*out_param1, &address,
2277                                         sizeof(bluetooth_device_address_t));
2278                 }
2279                 if (handle)
2280                         g_free(handle);
2281                 break;
2282         }
2283         case BT_TDS_ENABLE_CONTROL_POINT: {
2284                 char *handle;
2285                 char *data = NULL;
2286                 guint data_len = 0;
2287                 bluetooth_device_address_t address = { {0} };
2288
2289                 char *sender = NULL;
2290                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2291
2292                 data_len = g_variant_get_size(in_param1);
2293                 data = (char *)g_variant_get_data(in_param1);
2294                 __bt_service_get_parameters(in_param2,
2295                         &address, sizeof(bluetooth_device_address_t));
2296
2297                 handle = g_strndup(data, data_len);
2298                 BT_DBG("TDS Control point CCCD handle [%s]", handle);
2299
2300                 result = _bt_tds_enable_control_point(request_id, sender, &address, handle);
2301
2302                 if (result != BLUETOOTH_ERROR_NONE) {
2303                         BT_ERR("Enabling TDS CCCD failed result [%d]", result);
2304                         g_array_append_vals(*out_param1, &address,
2305                                         sizeof(bluetooth_device_address_t));
2306                 }
2307                 if (handle)
2308                         g_free(handle);
2309                 break;
2310         }
2311         case BT_TDS_ACTIVATE_CONTROL_POINT: {
2312                 char *handle;
2313                 char *data = NULL;
2314                 guint data_len = 0;
2315                 bluetooth_control_point_data_t tds_data;
2316                 char *sender = NULL;
2317
2318                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2319
2320                 bluetooth_device_address_t address = { {0} };
2321
2322                 data_len = g_variant_get_size(in_param1);
2323                 data = (char *)g_variant_get_data(in_param1);
2324
2325                  __bt_service_get_parameters(in_param2,
2326                         &address, sizeof(bluetooth_device_address_t));
2327
2328                 __bt_service_get_parameters(in_param3,
2329                         &tds_data, sizeof(bluetooth_control_point_data_t));
2330
2331                 handle = g_strndup(data, data_len);
2332                 BT_DBG("TDS Activate Control point handle [%s]", handle);
2333
2334                 result = _bt_tds_activate_control_point(request_id, sender, &address, handle,
2335                                                                 tds_data.data, tds_data.length);
2336
2337                 if (result != BLUETOOTH_ERROR_NONE) {
2338                         BT_ERR("Activating TDS Control Point request failed result [%d]", result);
2339                         g_array_append_vals(*out_param1, &address,
2340                                         sizeof(bluetooth_device_address_t));
2341                 }
2342                 if (handle)
2343                         g_free(handle);
2344                 break;
2345         }
2346         default:
2347                 result = BLUETOOTH_ERROR_INTERNAL;
2348                 break;
2349         }
2350
2351         return result;
2352 }
2353
2354 int __bt_obexd_request(int function_name,
2355                 int request_type,
2356                 int request_id,
2357                 GDBusMethodInvocation *context,
2358                 GVariant *in_param1,
2359                 GVariant *in_param2,
2360                 GVariant *in_param3,
2361                 GVariant *in_param4,
2362                 GArray **out_param1)
2363 {
2364         BT_DBG("+");
2365
2366         int result;
2367
2368         BT_DBG("function_name : %x", function_name);
2369
2370         switch (function_name) {
2371         case BT_OPP_PUSH_FILES: {
2372                 BT_DBG("BT_OPP_PUSH_FILES");
2373                 int i;
2374                 bluetooth_device_address_t address = { {0} };
2375                 bt_file_path_t path;
2376                 char **file_path;
2377                 int file_count;
2378                 GArray *param2;
2379
2380                 __bt_service_get_parameters(in_param1, &address,
2381                                 sizeof(bluetooth_device_address_t));
2382                 __bt_service_get_parameters(in_param3, &file_count,
2383                                 sizeof(int));
2384
2385                 file_path = g_new0(char *, file_count + 1);
2386
2387                 param2 = g_array_new(TRUE, TRUE, sizeof(gchar));
2388                 __bt_fill_garray_from_variant(in_param2, param2);
2389
2390                 for (i = 0; i < file_count; i++) {
2391                         path = g_array_index(param2, bt_file_path_t, i);
2392                         file_path[i] = g_strdup(path.path);
2393                 }
2394                 BT_DBG("_bt_opp_client_push_files");
2395                 result = _bt_opp_client_push_files(request_id, context,
2396                                                 &address, file_path,
2397                                                 file_count);
2398
2399                 for (i = 0; i < file_count; i++)
2400                         g_free(file_path[i]);
2401
2402                 g_free(file_path);
2403                 g_array_free(param2, TRUE);
2404
2405                 break;
2406         }
2407         case BT_OPP_CANCEL_PUSH: {
2408                 result = _bt_opp_client_cancel_push();
2409
2410                 break;
2411         }
2412         case BT_OPP_IS_PUSHING_FILES: {
2413                 gboolean is_sending = FALSE;
2414
2415                 result = _bt_opp_client_is_sending(&is_sending);
2416
2417                 g_array_append_vals(*out_param1, &is_sending,
2418                                 sizeof(gboolean));
2419                 break;
2420         }
2421         case BT_OPP_GET_TRANSFER_PROGRESS: {
2422                 int direction;
2423                 int transfer_id;
2424                 guint8 progress = 0;
2425
2426                 __bt_service_get_parameters(in_param1, &direction,
2427                                 sizeof(int));
2428                 __bt_service_get_parameters(in_param2, &transfer_id,
2429                                 sizeof(int));
2430                 if (direction)
2431                         result = _bt_opp_get_client_progress(&progress);
2432                 else
2433                         result = _bt_opp_get_server_progress(transfer_id, &progress);
2434
2435                 g_array_append_vals(*out_param1, &progress,
2436                                 sizeof(guint8));
2437
2438                 break;
2439         }
2440
2441         case BT_MAP_CREATE_SESSION: {
2442                 BT_DBG("BT_MAP_CREATE_SESSION");
2443                 char *address = (char *)g_variant_get_data(in_param1);
2444                 char *session_id = NULL;
2445                 result = _bt_create_session_sync(address, &session_id);
2446                 if (result == BLUETOOTH_ERROR_NONE)
2447                         g_array_append_vals(*out_param1, session_id, strlen(session_id)+1);
2448                 break;
2449         }
2450
2451         case BT_MAP_DESTROY_SESSION: {
2452                 BT_DBG("BT_MAP_DESTROY_SESSION");
2453                 char* session_id = (char *)g_variant_get_data(in_param1);
2454                 result = _bt_destroy_session_sync(session_id);
2455                 if (result == BLUETOOTH_ERROR_NONE)
2456                         BT_DBG("successfully destroyed session");
2457                 break;
2458         }
2459
2460         case BT_MAP_SET_FOLDER: {
2461                 BT_DBG("BT_MAP_SET_FOLDER");
2462                 char *session_id = (char *)g_variant_get_data(in_param1);
2463                 char *name = (char *)g_variant_get_data(in_param2);
2464                 result = _bt_map_client_set_folder(session_id, name);
2465                 break;
2466         }
2467
2468         case BT_MAP_LIST_FOLDERS: {
2469                 BT_DBG("BT_MAP_LIST_FOLDERS");
2470
2471                 char* session_id = (char *)g_variant_get_data(in_param1);
2472                 char* filter_serialized = (char*)g_variant_get_data(in_param2);
2473
2474                 result = _bt_map_client_list_folders(request_id, context, session_id, filter_serialized);
2475                 if (result == BLUETOOTH_ERROR_NONE)
2476                         BT_DBG("_bt_map_client_list_folders succeed");
2477
2478                 break;
2479         }
2480
2481         case BT_MAP_LIST_FILTER_FIELDS: {
2482                 BT_DBG("BT_MAP_LIST_FILTER_FIELDS");
2483
2484                 char* session_id = (char *)g_variant_get_data(in_param1);
2485
2486                 result = _bt_map_client_list_filter_fields(request_id, context, session_id);
2487                 if (result == BLUETOOTH_ERROR_NONE)
2488                         BT_DBG("_bt_map_client_list_filter_fields succeed");
2489
2490                 break;
2491         }
2492
2493         case BT_MAP_LIST_MESSAGES: {
2494                 BT_DBG("BT_MAP_LIST_MESSAGES");
2495
2496                 char* session_id = (char*)g_variant_get_data(in_param1);
2497                 char* folder = (char*)g_variant_get_data(in_param2);
2498                 char* filter_serialized = (char*)g_variant_get_data(in_param3);
2499
2500                 result = _bt_map_client_list_messages(request_id, context, session_id, folder, filter_serialized);
2501                 if (result == BLUETOOTH_ERROR_NONE)
2502                         BT_DBG("_bt_map_client_list_messages succeed");
2503                 else
2504                         BT_DBG("_bt_map_client_list_messages failed");
2505
2506                 break;
2507         }
2508
2509         case BT_MAP_UPDATE_INBOX: {
2510                 BT_DBG("BT_MAP_UPDATE_INBOX");
2511                 char* session_id = (char *)g_variant_get_data(in_param1);
2512                 result = _bt_map_client_update_inbox(session_id);
2513                 break;
2514         }
2515
2516         case BT_MAP_PUSH_MESSAGE: {
2517                 BT_DBG("BT_MAP_PUSH_MESSAGE");
2518
2519                 char* session_id = (char *)g_variant_get_data(in_param1);
2520                 char* source_file = (char *)g_variant_get_data(in_param2);
2521                 char* folder = (char *)g_variant_get_data(in_param3);
2522                 char* args_serialized = (char *)g_variant_get_data(in_param4);
2523
2524                 result = _bt_map_client_push_message(
2525                                 request_id, context, session_id, source_file, folder, args_serialized);
2526                 if (result == BLUETOOTH_ERROR_NONE)
2527                         BT_DBG("_bt_map_client_push_message succeed");
2528                 else
2529                         BT_ERR("_bt_map_client_push_message failed");
2530
2531                 break;
2532         }
2533
2534         case BT_MAP_GET_MESSAGE: {
2535                 BT_DBG("BT_MAP_GET_MESSAGE");
2536                 // TODO session currently is not used, but should be valid
2537                 //char* session_id = (char *)g_variant_get_data(in_param1);
2538                 char* message_object = (char *)g_variant_get_data(in_param2);
2539                 char* target_file = (char *)g_variant_get_data(in_param3);
2540                 bool attachment = false;
2541                 __bt_service_get_parameters(in_param4, &attachment, sizeof(bool));
2542
2543                 result = _bt_map_client_get_message(request_id, context, message_object,
2544                                 target_file, attachment);
2545                 if (result == BLUETOOTH_ERROR_NONE)
2546                         BT_DBG("_bt_map_client_get_message succeed");
2547
2548                 break;
2549         }
2550
2551         case BT_OBEX_SERVER_ALLOCATE: {
2552                 int app_pid;
2553                 gboolean is_native;
2554                 char *path;
2555                 char *sender;
2556
2557                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2558
2559                 path = (char *)g_variant_get_data(in_param1);
2560                 __bt_service_get_parameters(in_param2, &is_native,
2561                                 sizeof(gboolean));
2562                 __bt_service_get_parameters(in_param3, &app_pid,
2563                                 sizeof(int));
2564
2565                 result = _bt_obex_server_allocate(sender,
2566                                 path, app_pid, is_native);
2567
2568                 break;
2569         }
2570         case BT_OBEX_SERVER_DEALLOCATE: {
2571                 int app_pid;
2572                 gboolean is_native;
2573
2574                 __bt_service_get_parameters(in_param1, &is_native,
2575                                 sizeof(gboolean));
2576                 __bt_service_get_parameters(in_param2, &app_pid,
2577                                 sizeof(int));
2578
2579                 result = _bt_obex_server_deallocate(app_pid, is_native);
2580                 break;
2581         }
2582         case BT_OBEX_SERVER_IS_ACTIVATED: {
2583                 gboolean is_activated = FALSE;
2584
2585                 result = _bt_obex_server_is_activated(&is_activated);
2586
2587                 g_array_append_vals(*out_param1, &is_activated,
2588                                 sizeof(gboolean));
2589
2590                 break;
2591         }
2592         case BT_OBEX_SERVER_ACCEPT_CONNECTION: {
2593                 result = _bt_obex_server_accept_connection(request_id);
2594
2595                 break;
2596         }
2597         case BT_OBEX_SERVER_REJECT_CONNECTION: {
2598                 result = _bt_obex_server_reject_connection();
2599
2600                 break;
2601         }
2602         case BT_OBEX_SERVER_ACCEPT_FILE: {
2603                 char *file_name;
2604
2605                 file_name = (char *)g_variant_get_data(in_param1);
2606
2607                 result = _bt_obex_server_accept_authorize(file_name, TRUE);
2608
2609                 break;
2610         }
2611         case BT_OBEX_SERVER_REJECT_FILE: {
2612                 result = _bt_obex_server_reject_authorize();
2613
2614                 break;
2615         }
2616         case BT_OBEX_SERVER_SET_PATH: {
2617                 gboolean is_native;
2618                 char *destination_path;
2619
2620                 destination_path = (char *)g_variant_get_data(in_param1);
2621                 __bt_service_get_parameters(in_param2, &is_native,
2622                                 sizeof(gboolean));
2623
2624                 result = _bt_obex_server_set_destination_path(destination_path,
2625                                                         is_native);
2626
2627                 break;
2628         }
2629         case BT_OBEX_SERVER_SET_ROOT: {
2630                 char *root;
2631
2632                 root = (char *)g_variant_get_data(in_param1);
2633
2634                 result = _bt_obex_server_set_root(root);
2635
2636                 break;
2637         }
2638         case BT_OBEX_SERVER_CANCEL_TRANSFER: {
2639                 int transfer_id;
2640
2641                 __bt_service_get_parameters(in_param1, &transfer_id,
2642                                 sizeof(int));
2643
2644                 result = _bt_obex_server_cancel_transfer(transfer_id);
2645
2646                 break;
2647         }
2648         case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS: {
2649                 result = _bt_obex_server_cancel_all_transfers();
2650
2651                 break;
2652         }
2653         case BT_OBEX_SERVER_IS_RECEIVING: {
2654                 gboolean is_receiving = FALSE;
2655
2656                 result = _bt_obex_server_is_receiving(&is_receiving);
2657
2658                 g_array_append_vals(*out_param1, &is_receiving,
2659                                 sizeof(gboolean));
2660                 break;
2661         }
2662         case BT_PBAP_CONNECT: {
2663                 bluetooth_device_address_t address = { {0} };
2664
2665                 __bt_service_get_parameters(in_param1, &address,
2666                                 sizeof(bluetooth_device_address_t));
2667
2668                 result = _bt_pbap_connect(&address);
2669                 break;
2670         }
2671         case BT_PBAP_DISCONNECT: {
2672                 bluetooth_device_address_t address = { {0} };
2673
2674                 __bt_service_get_parameters(in_param1, &address,
2675                                 sizeof(bluetooth_device_address_t));
2676
2677                 result = _bt_pbap_disconnect(&address);
2678                 break;
2679         }
2680         case BT_PBAP_GET_PHONEBOOK_SIZE: {
2681                 bluetooth_device_address_t address = { {0} };
2682                 bt_pbap_folder_t folder = { 0, };
2683
2684                 __bt_service_get_parameters(in_param1, &address,
2685                                 sizeof(bluetooth_device_address_t));
2686                 __bt_service_get_parameters(in_param2, &folder,
2687                                 sizeof(bt_pbap_folder_t));
2688
2689                 result = _bt_pbap_get_phonebook_size(&address,
2690                                 folder.addressbook, folder.folder_type);
2691                 break;
2692         }
2693         case BT_PBAP_GET_PHONEBOOK: {
2694                 bluetooth_device_address_t address = { {0} };
2695                 bt_pbap_folder_t folder = { 0, };
2696                 bt_pbap_pull_parameters_t app_param = { 0, };
2697
2698                 __bt_service_get_parameters(in_param1, &address,
2699                                 sizeof(bluetooth_device_address_t));
2700                 __bt_service_get_parameters(in_param2, &folder,
2701                                 sizeof(bt_pbap_folder_t));
2702                 __bt_service_get_parameters(in_param3, &app_param,
2703                                 sizeof(bt_pbap_pull_parameters_t));
2704
2705                 result = _bt_pbap_get_phonebook(&address, folder.addressbook,
2706                                 folder.folder_type, &app_param);
2707                 break;
2708         }
2709         case BT_PBAP_GET_LIST: {
2710                 bluetooth_device_address_t address = { {0} };
2711                 bt_pbap_folder_t folder = { 0, };
2712                 bt_pbap_list_parameters_t app_param = { 0, };
2713
2714                 __bt_service_get_parameters(in_param1, &address,
2715                                 sizeof(bluetooth_device_address_t));
2716                 __bt_service_get_parameters(in_param2, &folder,
2717                                 sizeof(bt_pbap_folder_t));
2718                 __bt_service_get_parameters(in_param3, &app_param,
2719                                 sizeof(bt_pbap_list_parameters_t));
2720
2721                 result = _bt_pbap_get_list(&address, folder.addressbook,
2722                                 folder.folder_type, &app_param);
2723                 break;
2724         }
2725         case BT_PBAP_PULL_VCARD: {
2726                 bluetooth_device_address_t address = { {0} };
2727                 bt_pbap_folder_t folder = { 0, };
2728                 bt_pbap_pull_vcard_parameters_t app_param = { 0, };
2729
2730                 __bt_service_get_parameters(in_param1, &address,
2731                                 sizeof(bluetooth_device_address_t));
2732                 __bt_service_get_parameters(in_param2, &folder,
2733                                 sizeof(bt_pbap_folder_t));
2734                 __bt_service_get_parameters(in_param3, &app_param,
2735                                 sizeof(bt_pbap_pull_vcard_parameters_t));
2736
2737                 result = _bt_pbap_pull_vcard(&address, folder.addressbook,
2738                                 folder.folder_type, &app_param);
2739                 break;
2740         }
2741         case BT_PBAP_PHONEBOOK_SEARCH: {
2742                 bluetooth_device_address_t address = { {0} };
2743                 bt_pbap_folder_t folder = { 0, };
2744                 bt_pbap_search_parameters_t app_param = { 0, };
2745
2746                 __bt_service_get_parameters(in_param1, &address,
2747                                 sizeof(bluetooth_device_address_t));
2748                 __bt_service_get_parameters(in_param2, &folder,
2749                                 sizeof(bt_pbap_folder_t));
2750                 __bt_service_get_parameters(in_param3, &app_param,
2751                                 sizeof(bt_pbap_search_parameters_t));
2752
2753                 result = _bt_pbap_phonebook_search(&address, folder.addressbook,
2754                                 folder.folder_type, &app_param);
2755                 break;
2756         }
2757
2758         default:
2759                 BT_ERR("Unknown function!");
2760                 result = BLUETOOTH_ERROR_INTERNAL;
2761                 break;
2762         }
2763
2764         FN_END;
2765
2766         return result;
2767 }
2768
2769 int __bt_agent_request(int function_name,
2770                 int request_type,
2771                 int request_id,
2772                 GDBusMethodInvocation *context,
2773                 GVariant *in_param1,
2774                 GVariant *in_param2,
2775                 GVariant *in_param3,
2776                 GVariant *in_param4,
2777                 GArray **out_param1)
2778 {
2779         int result;
2780         switch (function_name) {
2781         case BT_SET_AUTHORIZATION: {
2782                 int type;
2783                 char *uuid;
2784                 char *path;
2785                 int fd;
2786
2787                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
2788                 uuid = (char *)g_variant_get_data(in_param2);
2789                 path = (char *)g_variant_get_data(in_param3);
2790                 __bt_service_get_parameters(in_param4, &fd, sizeof(int));
2791
2792                 result = _bt_register_osp_server_in_agent(type, uuid, path, fd);
2793                 break;
2794         }
2795         case BT_UNSET_AUTHORIZATION: {
2796                 int type;
2797                 char *uuid;
2798
2799                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
2800                 uuid = (char *)g_variant_get_data(in_param2);
2801
2802                 result = _bt_unregister_osp_server_in_agent(type, uuid);
2803                 break;
2804         }
2805         default:
2806                 BT_ERR("Unknown function!");
2807                 result = BLUETOOTH_ERROR_INTERNAL;
2808                 break;
2809         }
2810
2811         return result;
2812 }
2813
2814 int __bt_core_request(int function_name,
2815                 int request_type,
2816                 int request_id,
2817                 GDBusMethodInvocation *context,
2818                 GVariant *in_param1)
2819 {
2820         int result;
2821
2822         switch (function_name) {
2823         case BT_ENABLE_ADAPTER:
2824         {
2825                 bt_status_t status;
2826
2827                 status = _bt_adapter_get_status();
2828
2829                 if (status == BT_ACTIVATING) {
2830                         BT_DBG("Enabling in progress");
2831                         result = BLUETOOTH_ERROR_IN_PROGRESS;
2832                 } else if (status == BT_ACTIVATED) {
2833                         BT_DBG("Already enabled");
2834                         result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
2835                 } else {
2836                         _bt_adapter_set_status(BT_ACTIVATING);
2837                         _bt_adapter_start_enable_timer();
2838                         result = BLUETOOTH_ERROR_NONE;
2839                 }
2840
2841                 break;
2842         }
2843         case BT_DISABLE_ADAPTER:
2844         {
2845                 bt_status_t status;
2846
2847                 status = _bt_adapter_get_status();
2848                 if (status == BT_DEACTIVATING) {
2849                                 BT_DBG("Disabling in progress");
2850                                 result = BLUETOOTH_ERROR_IN_PROGRESS;
2851                 } else if (status == BT_DEACTIVATED) {
2852                                 BT_DBG("Already disabled");
2853                                 result = BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2854                 } else {
2855                         _bt_adapter_set_status(BT_DEACTIVATING);
2856                         result = BLUETOOTH_ERROR_NONE;
2857                 }
2858
2859                 break;
2860         }
2861         case BT_ENABLE_ADAPTER_LE:
2862         {
2863                 bt_le_status_t le_status;
2864
2865                 le_status = _bt_adapter_get_le_status();
2866                 if (le_status == BT_LE_ACTIVATING) {
2867                         BT_DBG("Enabling in progress");
2868                         result = BLUETOOTH_ERROR_IN_PROGRESS;
2869                 } else if (le_status == BT_LE_ACTIVATED) {
2870                         BT_DBG("Already enabled");
2871                         result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
2872                 } else {
2873                         _bt_adapter_set_le_status(BT_LE_ACTIVATING);
2874                         _bt_adapter_start_le_enable_timer();
2875                         result = BLUETOOTH_ERROR_NONE;
2876                 }
2877
2878                 break;
2879         }
2880         case BT_DISABLE_ADAPTER_LE:
2881         {
2882                 bt_le_status_t le_status;
2883
2884                 le_status = _bt_adapter_get_le_status();
2885                 if (le_status == BT_LE_DEACTIVATING) {
2886                                 BT_DBG("Disabling in progress");
2887                                 result = BLUETOOTH_ERROR_IN_PROGRESS;
2888                 } else if (le_status == BT_LE_DEACTIVATED) {
2889                                 BT_DBG("Already disabled");
2890                                 result = BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2891                 } else {
2892                         _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
2893                         result = BLUETOOTH_ERROR_NONE;
2894                 }
2895
2896                 break;
2897         }
2898         default:
2899                 BT_ERR("Unknown function!");
2900                 result = BLUETOOTH_ERROR_INTERNAL;
2901                 break;
2902         }
2903
2904         return result;
2905 }
2906
2907 gboolean __bt_service_check_privilege(int function_name,
2908                                         int service_type,
2909                                         const char *unique_name)
2910 {
2911         int ret_val;
2912         gboolean result = TRUE;
2913         char *client_creds = NULL;
2914         char *user_creds = NULL;
2915         char *client_session = "";
2916         enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
2917         enum cynara_user_creds user_creds_method = USER_METHOD_UID;
2918         char err_msg[256] = {0, };
2919
2920         retv_if(unique_name == NULL, FALSE);
2921
2922         BT_DBG("unique_name: %s", unique_name);
2923
2924         retv_if(bt_service_conn == NULL, FALSE);
2925
2926         ret_val = cynara_creds_get_default_client_method(&client_creds_method);
2927         if (ret_val != CYNARA_API_SUCCESS) {
2928                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
2929                 BT_ERR("Fail to get default client method: %s", err_msg);
2930                 return FALSE;
2931         }
2932
2933         ret_val = cynara_creds_get_default_user_method(&user_creds_method);
2934         if (ret_val != CYNARA_API_SUCCESS) {
2935                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
2936                 BT_ERR("Fail to get default user method: %s", err_msg);
2937                 return FALSE;
2938         }
2939
2940         ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
2941         if (ret_val != CYNARA_API_SUCCESS) {
2942                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
2943                 BT_ERR("Fail to get client credential: %s", err_msg);
2944                 return FALSE;
2945         }
2946
2947         BT_DBG("client_creds: %s", client_creds);
2948
2949         ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
2950         if (ret_val != CYNARA_API_SUCCESS) {
2951                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
2952                 BT_ERR("Fail to get user credential: %s", err_msg);
2953                 if (client_creds)
2954                         free(client_creds);
2955                 return FALSE;
2956         }
2957
2958         BT_DBG("user_creds: %s", user_creds);
2959
2960         switch (function_name) {
2961         case BT_SET_LOCAL_NAME:
2962         case BT_START_DISCOVERY:
2963         case BT_START_CUSTOM_DISCOVERY:
2964         case BT_CANCEL_DISCOVERY:
2965         case BT_OOB_ADD_REMOTE_DATA:
2966         case BT_OOB_REMOVE_REMOTE_DATA:
2967         case BT_SET_ADVERTISING:
2968         case BT_SET_CUSTOM_ADVERTISING:
2969         case BT_SET_ADVERTISING_PARAMETERS:
2970         case BT_START_LE_DISCOVERY:
2971         case BT_STOP_LE_DISCOVERY:
2972         case BT_SET_SCAN_PARAMETERS:
2973
2974         case BT_BOND_DEVICE:
2975         case BT_CANCEL_BONDING:
2976         case BT_UNBOND_DEVICE:
2977         case BT_SET_ALIAS:
2978         case BT_SET_AUTHORIZATION:
2979         case BT_UNSET_AUTHORIZATION:
2980         case BT_SEARCH_SERVICE:
2981
2982         case BT_RFCOMM_CLIENT_CONNECT:
2983         case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
2984         case BT_RFCOMM_SOCKET_DISCONNECT:
2985         case BT_RFCOMM_SOCKET_WRITE:
2986         case BT_RFCOMM_CREATE_SOCKET:
2987         case BT_RFCOMM_REMOVE_SOCKET:
2988
2989         case BT_OPP_PUSH_FILES:
2990         case BT_OPP_CANCEL_PUSH:
2991         /* TODO: MAP? MAP functions, see above */
2992
2993         case BT_OBEX_SERVER_ACCEPT_CONNECTION:
2994         case BT_OBEX_SERVER_REJECT_CONNECTION:
2995         case BT_OBEX_SERVER_ACCEPT_FILE:
2996         case BT_OBEX_SERVER_REJECT_FILE:
2997         case BT_OBEX_SERVER_SET_PATH:
2998         case BT_OBEX_SERVER_SET_ROOT:
2999         case BT_OBEX_SERVER_CANCEL_TRANSFER:
3000         case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
3001
3002         case BT_AUDIO_CONNECT:
3003         case BT_AUDIO_DISCONNECT:
3004         case BT_AG_CONNECT:
3005         case BT_AG_DISCONNECT:
3006         case BT_AV_CONNECT:
3007         case BT_AV_DISCONNECT:
3008         case BT_AV_SOURCE_CONNECT:
3009         case BT_AV_SOURCE_DISCONNECT:
3010         case BT_AVRCP_CONTROL_CONNECT:
3011         case BT_AVRCP_CONTROL_DISCONNECT:
3012         case BT_AVRCP_HANDLE_CONTROL:
3013         case BT_AVRCP_SET_TRACK_INFO:
3014         case BT_AVRCP_SET_PROPERTY:
3015         case BT_AVRCP_SET_PROPERTIES:
3016         case BT_AVRCP_CONTROL_SET_PROPERTY:
3017
3018         case BT_HF_CONNECT:
3019         case BT_HF_DISCONNECT:
3020
3021         case BT_HID_CONNECT:
3022         case BT_HID_DISCONNECT:
3023
3024         case BT_HID_DEVICE_ACTIVATE:
3025         case BT_HID_DEVICE_DEACTIVATE:
3026         case BT_HID_DEVICE_CONNECT:
3027         case BT_HID_DEVICE_DISCONNECT:
3028         case BT_HID_DEVICE_SEND_MOUSE_EVENT:
3029         case BT_HID_DEVICE_SEND_KEY_EVENT:
3030         case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
3031         case BT_HID_DEVICE_SEND_CUSTOM_EVENT:
3032
3033         case BT_CONNECT_LE:
3034         case BT_DISCONNECT_LE:
3035
3036         case BT_SET_ADVERTISING_DATA:
3037         case BT_SET_SCAN_RESPONSE_DATA:
3038
3039         case BT_HDP_CONNECT:
3040         case BT_HDP_DISCONNECT:
3041         case BT_HDP_SEND_DATA:
3042         case BT_HDP_REGISTER_SINK_APP:
3043         case BT_HDP_UNREGISTER_SINK_APP:
3044
3045         case BT_DPM_SET_ALLOW_BT_MODE:
3046         case BT_DPM_GET_ALLOW_BT_MODE:
3047         case BT_DPM_SET_DEVICE_RESTRITION:
3048         case BT_DPM_GET_DEVICE_RESTRITION:
3049         case BT_DPM_SET_UUID_RESTRITION:
3050         case BT_DPM_GET_UUID_RESTRITION:
3051         case BT_DPM_ADD_DEVICES_BLACKLIST:
3052         case BT_DPM_ADD_DEVICES_WHITELIST:
3053         case BT_DPM_ADD_UUIDS_BLACKLIST:
3054         case BT_DPM_ADD_UUIDS_WHITELIST:
3055         case BT_DPM_CLEAR_DEVICES_BLACKLIST:
3056         case BT_DPM_CLEAR_DEVICES_WHITELIST:
3057         case BT_DPM_CLEAR_UUIDS_BLACKLIST:
3058         case BT_DPM_CLEAR_UUIDS_WHITELIST:
3059         case BT_DPM_REMOVE_DEVICE_BLACKLIST:
3060         case BT_DPM_REMOVE_DEVICE_WHITELIST:
3061         case BT_DPM_REMOVE_UUID_BLACKLIST:
3062         case BT_DPM_REMOVE_UUID_WHITELIST:
3063         case BT_DPM_GET_DEVICES_BLACKLIST:
3064         case BT_DPM_GET_DEVICES_WHITELIST:
3065         case BT_DPM_GET_UUIDS_BLACKLIST:
3066         case BT_DPM_GET_UUIDS_WHITELIST:
3067         case BT_DPM_SET_ALLOW_OUTGOING_CALL:
3068         case BT_DPM_GET_ALLOW_OUTGOING_CALL:
3069         case BT_DPM_SET_PAIRING_STATE:
3070         case BT_DPM_GET_PAIRING_STATE:
3071         case BT_DPM_SET_PROFILE_STATE:
3072         case BT_DPM_GET_PROFILE_STATE:
3073         case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
3074         case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
3075         case BT_DPM_SET_DISCOVERABLE_STATE:
3076         case BT_DPM_GET_DISCOVERABLE_STATE:
3077         case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
3078         case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
3079         case BT_DPM_SET_DATA_TRANSFER_STATE:
3080         case BT_DPM_GET_DATA_TRANSFER_STATE:
3081
3082         case BT_NETWORK_ACTIVATE:
3083         case BT_NETWORK_DEACTIVATE:
3084         case BT_NETWORK_CONNECT:
3085         case BT_NETWORK_DISCONNECT:
3086         case BT_NETWORK_SERVER_DISCONNECT:
3087
3088         case BT_GATT_GET_PRIMARY_SERVICES:
3089         case BT_GATT_DISCOVER_CHARACTERISTICS:
3090         case BT_GATT_SET_PROPERTY_REQUEST:
3091         case BT_GATT_READ_CHARACTERISTIC:
3092         case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
3093         case BT_GATT_REGISTER_APPLICATION:
3094         case BT_GATT_REGISTER_SERVICE:
3095         case BT_GATT_SEND_RESPONSE:
3096
3097         case BT_PBAP_CONNECT:
3098         case BT_PBAP_DISCONNECT:
3099         case BT_PBAP_GET_PHONEBOOK_SIZE:
3100         case BT_PBAP_GET_PHONEBOOK:
3101         case BT_PBAP_GET_LIST:
3102         case BT_PBAP_PULL_VCARD:
3103         case BT_PBAP_PHONEBOOK_SEARCH:
3104
3105         ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3106                                                 BT_PRIVILEGE_PUBLIC);
3107
3108         if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3109                 BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
3110                 result = FALSE;
3111         }
3112
3113         /* Need to check mediastorage privilege */
3114         if (function_name == BT_PBAP_GET_PHONEBOOK ||
3115                 function_name == BT_PBAP_PULL_VCARD) {
3116                 ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3117                                                         MEDIASTORAGE_PRIVILEGE);
3118
3119                 if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3120                 BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
3121                 result = FALSE;
3122                 }
3123         }
3124         break;
3125
3126         case BT_ENABLE_ADAPTER:
3127         case BT_DISABLE_ADAPTER:
3128         case BT_RESET_ADAPTER:
3129         case BT_RECOVER_ADAPTER:
3130         case BT_ENABLE_ADAPTER_LE:
3131         case BT_DISABLE_ADAPTER_LE:
3132         case BT_SET_CONNECTABLE:
3133         case BT_SET_DISCOVERABLE_MODE:
3134         case BT_ADD_WHITE_LIST:
3135         case BT_REMOVE_WHITE_LIST:
3136         case BT_CLEAR_WHITE_LIST:
3137         case BT_SET_MANUFACTURER_DATA:
3138         case BT_SET_PROFILE_RESTRICTED:
3139
3140         case BT_CANCEL_SEARCH_SERVICE:
3141         case BT_ENABLE_RSSI:
3142
3143         case BT_RFCOMM_ACCEPT_CONNECTION:
3144         case BT_RFCOMM_REJECT_CONNECTION:
3145         case BT_RFCOMM_LISTEN:
3146
3147         case BT_AVRCP_CONTROL_GET_PROPERTY:
3148         case BT_AVRCP_GET_TRACK_INFO:
3149
3150         case BT_SET_CONTENT_PROTECT:
3151         case BT_BOND_DEVICE_BY_TYPE:
3152         case BT_SET_LE_PRIVACY:
3153         case BT_SET_LE_STATIC_RANDOM_ADDRESS:
3154         case BT_LE_CONN_UPDATE:
3155         case BT_UPDATE_LE_CONNECTION_MODE:
3156         case BT_REQ_ATT_MTU:
3157         case BT_GET_DEVICE_IDA:
3158         case BT_LE_READ_MAXIMUM_DATA_LENGTH:
3159         case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
3160         case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
3161         case BT_LE_SET_DATA_LENGTH:
3162
3163         case BT_GET_ATT_MTU:
3164
3165         case BT_LE_IPSP_INIT:
3166         case BT_LE_IPSP_DEINIT:
3167         case BT_LE_IPSP_CONNECT:
3168         case BT_LE_IPSP_DISCONNECT:
3169         case BT_PXP_MONITOR_SET_PROPERTY:
3170         case BT_PXP_MONITOR_GET_PROPERTY:
3171         case BT_PXP_MONITOR_GET_SUPPORTED_SERIVCES:
3172         case BT_PXP_REPORTER_REGISTER:
3173         case BT_PXP_REPORTER_UNREGISTER:
3174         case BT_PXP_REPORTER_GET_PROPERTY:
3175
3176         /* TDS */
3177         case BT_TDS_PROVIDER_REGISTER:
3178         case BT_TDS_PROVIDER_UNREGISTER:
3179         case BT_TDS_PROVIDER_SET_MANUF_DATA:
3180         case BT_TDS_PROVIDER_CREATE:
3181         case BT_TDS_PROVIDER_DESTROY:
3182         case BT_TDS_PROVIDER_SET_TRANSPORT_DATA:
3183         case BT_TDS_SEND_ACTIVATION_RESPONSE:
3184         case BT_TDS_READ_TRANSPORT_DATA:
3185         case BT_TDS_ENABLE_CONTROL_POINT:
3186         case BT_TDS_ACTIVATE_CONTROL_POINT:
3187
3188         case BT_MAP_CREATE_SESSION:
3189         case BT_MAP_DESTROY_SESSION:
3190         case BT_MAP_SET_FOLDER:
3191         case BT_MAP_LIST_FOLDERS:
3192         case BT_MAP_LIST_FILTER_FIELDS:
3193         case BT_MAP_LIST_MESSAGES:
3194         case BT_MAP_UPDATE_INBOX:
3195         case BT_MAP_PUSH_MESSAGE:
3196         case BT_MAP_GET_MESSAGE:
3197
3198         ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3199                                 BT_PRIVILEGE_PLATFORM);
3200
3201         if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3202                 BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
3203                 result = FALSE;
3204         }
3205         break;
3206
3207         case BT_CHECK_ADAPTER:
3208         case BT_GET_RSSI:
3209
3210         case BT_GET_LOCAL_NAME:
3211         case BT_GET_LOCAL_ADDRESS:
3212         case BT_GET_LOCAL_VERSION:
3213         case BT_IS_SERVICE_USED:
3214         case BT_GET_DISCOVERABLE_MODE:
3215         case BT_GET_DISCOVERABLE_TIME:
3216         case BT_IS_DISCOVERYING:
3217         case BT_IS_LE_DISCOVERYING:
3218         case BT_IS_CONNECTABLE:
3219         case BT_GET_BONDED_DEVICES:
3220         case BT_GET_PROFILE_CONNECTED_DEVICES:
3221         case BT_GET_BONDED_DEVICE:
3222         case BT_GET_IS_ALIAS_SET:
3223         case BT_IS_DEVICE_CONNECTED:
3224         case BT_GET_CONNECTED_LINK_TYPE:
3225         case BT_SET_PROFILE_TRUSTED:
3226         case BT_GET_PROFILE_TRUSTED:
3227         case BT_GET_SPEAKER_GAIN:
3228         case BT_SET_SPEAKER_GAIN:
3229         case BT_OOB_READ_LOCAL_DATA:
3230         case BT_RFCOMM_CLIENT_IS_CONNECTED:
3231         case BT_RFCOMM_IS_UUID_AVAILABLE:
3232         case BT_GET_ADVERTISING_DATA:
3233         case BT_GET_SCAN_RESPONSE_DATA:
3234         case BT_IS_ADVERTISING:
3235         case BT_GET_PROFILE_RESTRICTED:
3236         case BT_REGISTER_SCAN_FILTER:
3237         case BT_UNREGISTER_SCAN_FILTER:
3238         case BT_UNREGISTER_ALL_SCAN_FILTERS:
3239         case BT_IS_SCAN_FILTER_SUPPORTED:
3240
3241         case BT_OBEX_SERVER_ALLOCATE:
3242         case BT_OBEX_SERVER_DEALLOCATE:
3243         case BT_OBEX_SERVER_IS_ACTIVATED:
3244         case BT_OPP_GET_TRANSFER_PROGRESS:
3245                 /* Non-privilege control */
3246                 break;
3247         default:
3248                 BT_ERR("Unknown function!");
3249                 result = FALSE;
3250                 break;
3251         }
3252
3253         if (client_creds)
3254                 free(client_creds);
3255
3256         if (user_creds)
3257                 free(user_creds);
3258
3259         return result;
3260 }
3261
3262 GDBusNodeInfo *__bt_service_create_method_node_info
3263                                         (const gchar *introspection_data)
3264 {
3265         GError *err = NULL;
3266         GDBusNodeInfo *node_info = NULL;
3267
3268         if (introspection_data == NULL) {
3269                 ERR("Introspection XML not present");
3270                 return NULL;
3271         }
3272
3273         node_info = g_dbus_node_info_new_for_xml(introspection_data, &err);
3274
3275         if (err) {
3276                 ERR("Unable to create node: %s", err->message);
3277                 g_clear_error(&err);
3278         }
3279         return node_info;
3280 }
3281
3282 int __bt_service_register_object(GDBusConnection *conn,
3283                 GDBusNodeInfo *node_info, gboolean reg)
3284 {
3285         static guint service_id = 0;
3286         GError *error = NULL;
3287
3288         if (reg) {
3289                 if (node_info == NULL)
3290                         return -1;
3291
3292                 service_id = g_dbus_connection_register_object(conn,
3293                                 BT_SERVICE_PATH,
3294                                 node_info->interfaces[0],
3295                                 &method_table,
3296                                 NULL, NULL, &error);
3297                 if (service_id == 0)
3298                         return -1;
3299         } else {
3300                 if (service_id > 0) {
3301                         g_dbus_connection_unregister_object(conn,
3302                                         service_id);
3303                         service_id = 0;
3304                 }
3305         }
3306
3307         return 0;
3308 }
3309
3310 static void __bt_service_bus_acquired_handler(GDBusConnection *connection,
3311                 const gchar *name, gpointer user_data)
3312 {
3313         BT_INFO("bus acquired");
3314
3315         ret_if(connection == NULL);
3316
3317         node_info = __bt_service_create_method_node_info(
3318                         bt_service_introspection_xml);
3319
3320         ret_if(node_info == NULL);
3321
3322         __bt_service_register_object(connection, node_info, TRUE);
3323         g_dbus_node_info_unref(node_info);
3324         node_info = NULL;
3325
3326         bt_service_conn = connection;
3327 }
3328
3329 static void __bt_service_name_acquired_handler(GDBusConnection *connection,
3330                 const gchar *name, gpointer user_data)
3331 {
3332         BT_INFO("name acquired");
3333         name_acquired = TRUE;
3334 }
3335
3336 static void __bt_service_name_lost_handler(GDBusConnection *connection,
3337                 const gchar *name, gpointer user_data)
3338 {
3339         BT_INFO("name lost");
3340         name_acquired = FALSE;
3341 }
3342
3343 gboolean _is_name_acquired(void)
3344 {
3345         return name_acquired;
3346 }
3347
3348 int _bt_service_register(void)
3349 {
3350         GDBusConnection *conn;
3351         GError *err = NULL;
3352
3353         conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
3354         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3355         bt_service_conn = conn;
3356
3357         owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
3358                                 BT_SERVICE_NAME,
3359                                 G_BUS_NAME_OWNER_FLAGS_NONE,
3360                                 __bt_service_bus_acquired_handler,
3361                                 __bt_service_name_acquired_handler,
3362                                 __bt_service_name_lost_handler,
3363                                 NULL, NULL);
3364         BT_DBG("owner_id is [%d]", owner_id);
3365         if (owner_id == 0)
3366                 goto fail;
3367
3368         return BLUETOOTH_ERROR_NONE;
3369
3370 fail:
3371         if (bt_service_conn) {
3372                 g_object_unref(bt_service_conn);
3373                 bt_service_conn = NULL;
3374         }
3375
3376         return BLUETOOTH_ERROR_INTERNAL;
3377 }
3378
3379 void _bt_service_unregister(void)
3380 {
3381         if (bt_service_conn) {
3382                 __bt_service_register_object(bt_service_conn, NULL, FALSE);
3383                 if (bt_service_conn) {
3384                         g_object_unref(bt_service_conn);
3385                         bt_service_conn = NULL;
3386                 }
3387                 if (node_info) {
3388                         g_dbus_node_info_unref(node_info);
3389                         node_info = NULL;
3390                 }
3391                 if (owner_id > 0) {
3392                         g_bus_unown_name(owner_id);
3393                         owner_id = 0;
3394                 }
3395         }
3396 }
3397
3398 int _bt_service_cynara_init(void)
3399 {
3400         int result;
3401         char err_msg[256] = {0, };
3402
3403         retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
3404
3405         result = cynara_initialize(&p_cynara, conf);
3406
3407         if (result != CYNARA_API_SUCCESS) {
3408                 cynara_strerror(result, err_msg, sizeof(err_msg));
3409                 BT_ERR("Fail to initialize cynara: [%s]", err_msg);
3410                 return BLUETOOTH_ERROR_INTERNAL;
3411         }
3412
3413         return BLUETOOTH_ERROR_NONE;
3414 }
3415
3416 void _bt_service_cynara_deinit(void)
3417 {
3418         int result;
3419         char err_msg[256] = {0, };
3420
3421         ret_if(p_cynara == NULL);
3422
3423         result = cynara_finish(p_cynara);
3424
3425         if (result != CYNARA_API_SUCCESS) {
3426                 cynara_strerror(result, err_msg, sizeof(err_msg));
3427                 BT_ERR("Fail to finish cynara: [%s]", err_msg);
3428                 return;
3429         }
3430
3431         p_cynara = NULL;
3432         conf = NULL;
3433 }
3434