a6fb1e45cb22e2115abc95aa153b547c32544306
[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 #include "bt-service-otp.h"
50
51 static GDBusConnection *bt_service_conn;
52 static guint owner_id = 0;
53 cynara *p_cynara;
54 cynara_configuration *conf;
55
56 static const gchar bt_service_introspection_xml[] =
57 "<node name='/org/projectx/bt_service'>"
58 "       <interface name='org.projectx.bt'>"
59 "               <method name='service_request'>"
60                         /* Input Parameters */
61 "                       <arg type='i' name='service_type' direction='in' />"
62 "                       <arg type='i' name='service_function' direction='in' />"
63 "                       <arg type='i' name='request_type' direction='in' />"
64 "                       <arg type='ay' name='input_param1' direction='in' />"
65 "                       <arg type='ay' name='input_param2' direction='in' />"
66 "                       <arg type='ay' name='input_param3' direction='in' />"
67 "                       <arg type='ay' name='input_param4' direction='in' />"
68 "                       <arg type='ay' name='input_param5' direction='in' />"
69                         /* Return Parameters */
70 "                       <arg type='i' name='output_param1' direction='out' />"
71 "                       <arg type='v' name='output_param2' direction='out' />"
72 "               </method>"
73 "       </interface>"
74 "</node>";
75
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_HID_CONNECT: {
1032                 bluetooth_device_address_t address = { {0} };
1033
1034                 __bt_service_get_parameters(in_param1,
1035                                 &address, sizeof(bluetooth_device_address_t));
1036
1037                 result = _bt_hid_connect(request_id, &address);
1038                 if (result != BLUETOOTH_ERROR_NONE) {
1039                         g_array_append_vals(*out_param1, &address,
1040                                         sizeof(bluetooth_device_address_t));
1041                 }
1042                 break;
1043         }
1044         case BT_HID_DISCONNECT: {
1045                 bluetooth_device_address_t address = { {0} };
1046
1047                 __bt_service_get_parameters(in_param1,
1048                                 &address, sizeof(bluetooth_device_address_t));
1049
1050                 result = _bt_hid_disconnect(request_id, &address);
1051                 if (result != BLUETOOTH_ERROR_NONE) {
1052                         g_array_append_vals(*out_param1, &address,
1053                                         sizeof(bluetooth_device_address_t));
1054                 }
1055                 break;
1056         }
1057         case BT_HID_ENABLE_BARCODE_FEATURE: {
1058                 result = _bt_hid_enable_barcode_feature();
1059                 break;
1060         }
1061         case BT_NETWORK_ACTIVATE:
1062                 result = _bt_network_activate();
1063                 break;
1064         case BT_NETWORK_DEACTIVATE:
1065                 result = _bt_network_deactivate();
1066                 break;
1067         case BT_NETWORK_CONNECT: {
1068                 bluetooth_device_address_t address = { {0} };
1069                 int role;
1070
1071                 __bt_service_get_parameters(in_param1,
1072                                 &address, sizeof(bluetooth_device_address_t));
1073                 __bt_service_get_parameters(in_param2,
1074                                 &role, sizeof(int));
1075
1076                 result = _bt_network_connect(request_id, role, &address);
1077                 if (result != BLUETOOTH_ERROR_NONE) {
1078                         g_array_append_vals(*out_param1, &address,
1079                                         sizeof(bluetooth_device_address_t));
1080                 }
1081                 break;
1082         }
1083         case BT_NETWORK_DISCONNECT: {
1084                 bluetooth_device_address_t address = { {0} };
1085
1086                 __bt_service_get_parameters(in_param1,
1087                                 &address, sizeof(bluetooth_device_address_t));
1088
1089                 result = _bt_network_disconnect(request_id, &address);
1090                 if (result != BLUETOOTH_ERROR_NONE) {
1091                         g_array_append_vals(*out_param1, &address,
1092                                         sizeof(bluetooth_device_address_t));
1093                 }
1094                 break;
1095         }
1096         case BT_NETWORK_SERVER_DISCONNECT: {
1097                 bluetooth_device_address_t address = { {0} };
1098
1099                 __bt_service_get_parameters(in_param1,
1100                                 &address, sizeof(bluetooth_device_address_t));
1101
1102                 result = _bt_network_server_disconnect(request_id, &address);
1103                 if (result != BLUETOOTH_ERROR_NONE) {
1104                         g_array_append_vals(*out_param1, &address,
1105                                         sizeof(bluetooth_device_address_t));
1106                 }
1107                 break;
1108         }
1109
1110         case BT_AUDIO_CONNECT: {
1111                 bluetooth_device_address_t address = { {0} };
1112
1113                 __bt_service_get_parameters(in_param1,
1114                                 &address, sizeof(bluetooth_device_address_t));
1115
1116                 result = _bt_audio_connect(request_id, BT_AUDIO_ALL,
1117                                         &address, *out_param1);
1118                 break;
1119         }
1120         case BT_AUDIO_DISCONNECT: {
1121                 bluetooth_device_address_t address = { {0} };
1122
1123                 __bt_service_get_parameters(in_param1,
1124                                 &address, sizeof(bluetooth_device_address_t));
1125
1126                 result = _bt_audio_disconnect(request_id, BT_AUDIO_ALL,
1127                                         &address, *out_param1);
1128                 break;
1129         }
1130         case BT_AG_CONNECT: {
1131                 bluetooth_device_address_t address = { {0} };
1132
1133                 __bt_service_get_parameters(in_param1,
1134                                 &address, sizeof(bluetooth_device_address_t));
1135
1136                 result = _bt_audio_connect(request_id, BT_AUDIO_HSP,
1137                                         &address, *out_param1);
1138                 break;
1139         }
1140         case BT_AG_DISCONNECT: {
1141                 bluetooth_device_address_t address = { {0} };
1142
1143                 __bt_service_get_parameters(in_param1,
1144                                 &address, sizeof(bluetooth_device_address_t));
1145
1146                 result = _bt_audio_disconnect(request_id, BT_AUDIO_HSP,
1147                                         &address, *out_param1);
1148                 break;
1149         }
1150         case BT_AV_CONNECT: {
1151                 bluetooth_device_address_t address = { {0} };
1152
1153                 __bt_service_get_parameters(in_param1,
1154                                 &address, sizeof(bluetooth_device_address_t));
1155
1156                 result = _bt_audio_connect(request_id, BT_AUDIO_A2DP,
1157                                         &address, *out_param1);
1158                 break;
1159         }
1160         case BT_AV_DISCONNECT: {
1161                 bluetooth_device_address_t address = { {0} };
1162
1163                 __bt_service_get_parameters(in_param1,
1164                                 &address, sizeof(bluetooth_device_address_t));
1165
1166                 result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP,
1167                                         &address, *out_param1);
1168                 break;
1169         }
1170         case BT_AVRCP_CONTROL_CONNECT: {
1171                 bluetooth_device_address_t address = { {0} };
1172
1173                 __bt_service_get_parameters(in_param1,
1174                                 &address, sizeof(bluetooth_device_address_t));
1175
1176                 result = _bt_audio_connect(request_id, BT_AVRCP,
1177                                         &address, *out_param1);
1178                 break;
1179         }
1180         case BT_AVRCP_CONTROL_DISCONNECT: {
1181                 bluetooth_device_address_t address = { {0} };
1182
1183                 __bt_service_get_parameters(in_param1,
1184                                 &address, sizeof(bluetooth_device_address_t));
1185
1186                 result = _bt_audio_disconnect(request_id, BT_AVRCP,
1187                                         &address, *out_param1);
1188                 break;
1189         }
1190         case BT_AVRCP_TARGET_CONNECT: {
1191                 bluetooth_device_address_t address = { {0} };
1192                 __bt_service_get_parameters(in_param1,
1193                                 &address, sizeof(bluetooth_device_address_t));
1194                 result = _bt_audio_connect(request_id, BT_AVRCP_TARGET,
1195                                         &address, *out_param1);
1196                 break;
1197                 }
1198         case BT_AVRCP_TARGET_DISCONNECT: {
1199                 bluetooth_device_address_t address = { {0} };
1200                 __bt_service_get_parameters(in_param1,
1201                                 &address, sizeof(bluetooth_device_address_t));
1202                 result = _bt_audio_disconnect(request_id, BT_AVRCP_TARGET,
1203                                         &address, *out_param1);
1204                 break;
1205                 }
1206         case BT_AV_SOURCE_CONNECT: {
1207                 bluetooth_device_address_t address = { {0} };
1208
1209                 __bt_service_get_parameters(in_param1, &address,
1210                                 sizeof(bluetooth_device_address_t));
1211
1212                 result = _bt_audio_connect(request_id, BT_AUDIO_A2DP_SOURCE,
1213                                         &address, *out_param1);
1214                 break;
1215         }
1216         case BT_AV_SOURCE_DISCONNECT: {
1217                 bluetooth_device_address_t address = { {0} };
1218
1219                 __bt_service_get_parameters(in_param1, &address,
1220                                 sizeof(bluetooth_device_address_t));
1221
1222                 result = _bt_audio_disconnect(request_id, BT_AUDIO_A2DP_SOURCE,
1223                                         &address, *out_param1);
1224                 break;
1225         }
1226         case BT_HF_CONNECT: {
1227                 bluetooth_device_address_t address = { {0} };
1228
1229                 __bt_service_get_parameters(in_param1,
1230                                 &address, sizeof(bluetooth_device_address_t));
1231
1232                 result = _bt_hf_connect(request_id, &address, *out_param1);
1233                 break;
1234         }
1235         case BT_HF_DISCONNECT: {
1236                 bluetooth_device_address_t address = { {0} };
1237
1238                 __bt_service_get_parameters(in_param1,
1239                                 &address, sizeof(bluetooth_device_address_t));
1240
1241                 result = _bt_hf_disconnect(request_id, &address, *out_param1);
1242                 break;
1243         }
1244         case BT_SET_CONTENT_PROTECT: {
1245                 gboolean status;
1246
1247                 __bt_service_get_parameters(in_param1,
1248                                 &status, sizeof(gboolean));
1249
1250                 result = _bt_audio_set_content_protect(status);
1251
1252                 break;
1253         }
1254         case BT_AUDIO_SELECT_ROLE: {
1255
1256                 bluetooth_audio_role_t role;
1257
1258                 __bt_service_get_parameters(in_param1,
1259                                 &role, sizeof(bluetooth_audio_role_t));
1260
1261                 result = _bt_audio_select_role(role);
1262
1263                 break;
1264         }
1265         case BT_OOB_READ_LOCAL_DATA: {
1266                 bt_oob_data_t local_oob_data;
1267
1268                 memset(&local_oob_data, 0x00, sizeof(bt_oob_data_t));
1269                 result = _bt_oob_read_local_data(&local_oob_data);
1270
1271                 g_array_append_vals(*out_param1, &local_oob_data,
1272                                 sizeof(bt_oob_data_t));
1273
1274                 break;
1275         }
1276         case BT_OOB_ADD_REMOTE_DATA: {
1277                 bluetooth_device_address_t address = { {0} };
1278                 unsigned short address_type;
1279                 bt_oob_data_t remote_oob_data;
1280
1281                 __bt_service_get_parameters(in_param1,
1282                                 &address, sizeof(bluetooth_device_address_t));
1283                 __bt_service_get_parameters(in_param2,
1284                                 &address_type, sizeof(unsigned short));
1285                 __bt_service_get_parameters(in_param3,
1286                                 &remote_oob_data, sizeof(bt_oob_data_t));
1287
1288                 result = _bt_oob_add_remote_data(&address, address_type, &remote_oob_data);
1289
1290                 break;
1291         }
1292         case BT_OOB_REMOVE_REMOTE_DATA: {
1293                 bluetooth_device_address_t address = { {0} };
1294
1295                 __bt_service_get_parameters(in_param1,
1296                                 &address, sizeof(bluetooth_device_address_t));
1297
1298                 result = _bt_oob_remove_remote_data(&address);
1299
1300                 break;
1301         }
1302         case BT_AVRCP_SET_TRACK_INFO: {
1303                 media_metadata_t data;
1304                 media_metadata_attributes_t meta_data;
1305
1306                 memset(&data, 0x00, sizeof(media_metadata_t));
1307                 memset(&meta_data, 0x00, sizeof(media_metadata_attributes_t));
1308
1309                 __bt_service_get_parameters(in_param1,
1310                                 &data, sizeof(media_metadata_t));
1311
1312                 meta_data.title = g_strdup(data.title);
1313                 meta_data.artist = g_strdup(data.artist);
1314                 meta_data.album = g_strdup(data.album);
1315                 meta_data.genre = g_strdup(data.genre);
1316                 meta_data.total_tracks = data.total_tracks;
1317                 meta_data.number = data.number;
1318                 meta_data.duration = (int64_t) data.duration;
1319
1320                 result = _bt_avrcp_set_track_info(&meta_data);
1321
1322                 g_free((gpointer)meta_data.title);
1323                 g_free((gpointer)meta_data.artist);
1324                 g_free((gpointer)meta_data.album);
1325                 g_free((gpointer)meta_data.genre);
1326
1327                 break;
1328         }
1329         case BT_AVRCP_SET_PROPERTY: {
1330                 int type;
1331                 unsigned int value;
1332                 char *sender = NULL;
1333                 sender = (char *)g_dbus_method_invocation_get_sender(context);
1334                 BT_INFO("Sender %s", sender);
1335
1336                 __bt_service_get_parameters(in_param1,
1337                                 &type, sizeof(int));
1338                 __bt_service_get_parameters(in_param2,
1339                                 &value, sizeof(unsigned int));
1340
1341                 if (value == STATUS_PLAYING) {
1342                         if (current_sender_playing)
1343                                 g_free(current_sender_playing);
1344                         current_sender_playing = g_strdup(sender);
1345                 }
1346                 if (g_strcmp0(sender, current_sender_playing) == 0 ||
1347                         current_sender_playing == NULL) {
1348                         BT_INFO("Current Player Status %d type %d", value, type);
1349                 } else {
1350                         BT_INFO("Current Player and this sender are different");
1351                         result = BLUETOOTH_ERROR_NONE;
1352                         break;
1353                 }
1354                 result = _bt_avrcp_set_property(type, value);
1355
1356                 break;
1357         }
1358         case BT_AVRCP_SET_PROPERTIES: {
1359                 media_player_settings_t properties;
1360
1361                 memset(&properties, 0x00, sizeof(media_player_settings_t));
1362                 __bt_service_get_parameters(in_param1,
1363                                 &properties, sizeof(media_player_settings_t));
1364
1365                 result = _bt_avrcp_set_properties(&properties);
1366
1367                 break;
1368         }
1369         case BT_AVRCP_HANDLE_CONTROL: {
1370                 int type;
1371
1372                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
1373
1374                 result = _bt_avrcp_control_cmd(type);
1375
1376                 break;
1377         }
1378         case BT_AVRCP_CONTROL_SET_PROPERTY: {
1379                 int type;
1380                 unsigned int value;
1381
1382                 __bt_service_get_parameters(in_param1,
1383                                 &type, sizeof(int));
1384                 __bt_service_get_parameters(in_param2,
1385                                 &value, sizeof(unsigned int));
1386
1387                 result = _bt_avrcp_control_set_property(type, value);
1388
1389                 break;
1390         }
1391         case BT_AVRCP_CONTROL_GET_PROPERTY: {
1392                 int type;
1393                 unsigned int value;
1394
1395                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
1396
1397                 result = _bt_avrcp_control_get_property(type, &value);
1398                 g_array_append_vals(*out_param1, &value, sizeof(int));
1399
1400                 break;
1401         }
1402         case BT_AVRCP_TRANSPORT_SET_PROPERTY: {
1403                 int type;
1404                 unsigned int value;
1405
1406                 __bt_service_get_parameters(in_param1,
1407                                 &type, sizeof(int));
1408                 __bt_service_get_parameters(in_param2,
1409                                 &value, sizeof(unsigned int));
1410
1411                 result = _bt_avrcp_transport_set_property(type, value);
1412
1413                 break;
1414         }
1415         case BT_AVRCP_GET_TRACK_INFO: {
1416                 media_metadata_t meta_data;
1417                 media_metadata_attributes_t metadata;
1418
1419                 memset(&meta_data, 0x00, sizeof(media_metadata_t));
1420                 memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
1421
1422                 result = _bt_avrcp_control_get_track_info(&metadata);
1423
1424                 if (BLUETOOTH_ERROR_NONE != result)
1425                         break;
1426
1427                 if (_bt_copy_utf8_string(meta_data.title, metadata.title,
1428                                                         BT_META_DATA_MAX_LEN))
1429                         BT_ERR("Error in copying Title\n");
1430                 if (_bt_copy_utf8_string(meta_data.artist, metadata.artist,
1431                                                         BT_META_DATA_MAX_LEN))
1432                         BT_ERR("Error in copying Artist\n");
1433                 if (_bt_copy_utf8_string(meta_data.album, metadata.album,
1434                                                         BT_META_DATA_MAX_LEN))
1435                         BT_ERR("Error in copying Album\n");
1436                 if (_bt_copy_utf8_string(meta_data.genre, metadata.genre,
1437                                                         BT_META_DATA_MAX_LEN))
1438                         BT_ERR("Error in copying Genre\n");
1439
1440                 if (_bt_utf8_validate(meta_data.title) == FALSE)
1441                         meta_data.title[0] = '\0';
1442
1443                 if (_bt_utf8_validate(meta_data.artist) == FALSE)
1444                         meta_data.artist[0] = '\0';
1445
1446                 if (_bt_utf8_validate(meta_data.album) == FALSE)
1447                         meta_data.album[0] = '\0';
1448
1449                 if (_bt_utf8_validate(meta_data.genre) == FALSE)
1450                         meta_data.genre[0] = '\0';
1451
1452                 meta_data.total_tracks = metadata.total_tracks;
1453                 meta_data.number = metadata.number;
1454                 meta_data.duration = metadata.duration;
1455
1456                 g_free((gpointer)metadata.title);
1457                 g_free((gpointer)metadata.artist);
1458                 g_free((gpointer)metadata.album);
1459                 g_free((gpointer)metadata.genre);
1460
1461                 g_array_append_vals(*out_param1, &meta_data,
1462                                         sizeof(media_metadata_t));
1463                 break;
1464         }
1465         case BT_RFCOMM_CLIENT_CONNECT: {
1466 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1467                 result = BLUETOOTH_ERROR_NONE;
1468 #else
1469                 bluetooth_device_address_t address = { {0} };
1470                 char *input_string;
1471                 int connect_type;
1472
1473                 __bt_service_get_parameters(in_param1,
1474                                 &address, sizeof(bluetooth_device_address_t));
1475
1476                 input_string = &g_array_index(in_param2, char, 0);
1477
1478                 connect_type = g_array_index(in_param3, int, 0);
1479
1480                 if (connect_type == BT_RFCOMM_UUID) {
1481                         result = _bt_rfcomm_connect_using_uuid(request_id,
1482                                                         &address, input_string);
1483                 } else {
1484                         result = _bt_rfcomm_connect_using_channel(request_id,
1485                                                         &address, input_string);
1486                 }
1487
1488                 if (result != BLUETOOTH_ERROR_NONE) {
1489                         g_array_append_vals(*out_param1, &address,
1490                                         sizeof(bluetooth_device_address_t));
1491                 }
1492 #endif
1493                 break;
1494         }
1495         case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
1496                 result = _bt_rfcomm_cancel_connect();
1497                 break;
1498         case BT_RFCOMM_CLIENT_IS_CONNECTED: {
1499                 gboolean connected = FALSE;
1500                 result = _bt_rfcomm_is_connected(&connected);
1501
1502                 g_array_append_vals(*out_param1, &connected, sizeof(gboolean));
1503                 break;
1504         }
1505         case BT_RFCOMM_SOCKET_DISCONNECT: {
1506 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1507                 result = BLUETOOTH_ERROR_NONE;
1508 #else
1509                 int socket_fd;
1510
1511                 socket_fd = g_array_index(in_param1, int, 0);
1512
1513                 result = _bt_rfcomm_disconnect(socket_fd);
1514 #endif
1515                 break;
1516         }
1517         case BT_RFCOMM_SOCKET_WRITE: {
1518 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1519                 result = BLUETOOTH_ERROR_NONE;
1520 #else
1521                 int socket_fd;
1522                 int length;
1523                 char *buffer;
1524
1525                 socket_fd = g_array_index(in_param1, int, 0);
1526                 length = g_array_index(in_param2, int, 0);
1527                 buffer = &g_array_index(in_param3, char, 0);
1528
1529                 result = _bt_rfcomm_write(socket_fd, buffer, length);
1530 #endif
1531                 break;
1532         }
1533         case BT_RFCOMM_CREATE_SOCKET: {
1534 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1535                 result = BLUETOOTH_ERROR_NONE;
1536 #else
1537                 char *sender;
1538                 char *uuid;
1539                 int socket_fd = -1;
1540
1541                 sender = (char *)g_dbus_method_invocation_get_sender(context);
1542                 uuid = &g_array_index(in_param1, char, 0);
1543
1544                 result = _bt_rfcomm_create_socket(sender, uuid);
1545
1546                 if (result > 0) {
1547                         socket_fd = result;
1548                         result = BLUETOOTH_ERROR_NONE;
1549                 }
1550
1551                 g_array_append_vals(*out_param1, &socket_fd, sizeof(int));
1552
1553                 g_free(sender);
1554 #endif
1555                 break;
1556         }
1557         case BT_RFCOMM_REMOVE_SOCKET: {
1558 #ifdef TIZEN_FEATURE_BT_RFCOMM_DIRECT
1559                 result = BLUETOOTH_ERROR_NONE;
1560 #else
1561                 int socket_fd;
1562
1563                 socket_fd = g_array_index(in_param1, int, 0);
1564
1565                 result = _bt_rfcomm_remove_socket(socket_fd);
1566 #endif
1567                 break;
1568         }
1569         case BT_RFCOMM_LISTEN: {
1570                 int socket_fd;
1571                 int pending;
1572                 gboolean is_native;
1573
1574                 __bt_service_get_parameters(in_param1, &socket_fd,
1575                                 sizeof(int));
1576                 __bt_service_get_parameters(in_param2, &pending,
1577                                 sizeof(int));
1578                 __bt_service_get_parameters(in_param3, &is_native,
1579                                 sizeof(gboolean));
1580
1581                 result = _bt_rfcomm_listen(socket_fd, pending, is_native);
1582                 break;
1583         }
1584         case BT_RFCOMM_IS_UUID_AVAILABLE: {
1585                 gboolean available = TRUE;
1586                 char *uuid;
1587
1588                 uuid = (char *)g_variant_get_data(in_param1);
1589
1590                 result = _bt_rfcomm_is_uuid_available(uuid, &available);
1591
1592                 g_array_append_vals(*out_param1, &available, sizeof(gboolean));
1593                 break;
1594         }
1595         case BT_RFCOMM_ACCEPT_CONNECTION: {
1596                 int socket_fd;
1597
1598                 __bt_service_get_parameters(in_param1, &socket_fd, sizeof(int));
1599                 BT_DBG(" socket fd %d", socket_fd);
1600                 result = _bt_rfcomm_accept_connection();
1601                 break;
1602         }
1603         case BT_RFCOMM_REJECT_CONNECTION: {
1604                 int socket_fd;
1605
1606                 __bt_service_get_parameters(in_param1, &socket_fd, sizeof(int));
1607                 BT_DBG(" socket fd %d", socket_fd);
1608                 result = _bt_rfcomm_reject_connection();
1609                 break;
1610         }
1611         case BT_RFCOMM_CREATE_SOCKET_EX: {
1612                 result = BLUETOOTH_ERROR_NONE;
1613                 break;
1614         }
1615         case BT_RFCOMM_REMOVE_SOCKET_EX: {
1616                 result = BLUETOOTH_ERROR_NONE;
1617                 break;
1618         }
1619         case BT_CONNECT_LE: {
1620                 bluetooth_device_address_t address = { {0} };
1621                 gboolean auto_connect;
1622
1623                 __bt_service_get_parameters(in_param1,
1624                                 &address, sizeof(bluetooth_device_address_t));
1625                 __bt_service_get_parameters(in_param2,
1626                                 &auto_connect, sizeof(gboolean));
1627
1628                 result = _bt_connect_le_device(request_id, &address,
1629                                 auto_connect);
1630                 if (result != BLUETOOTH_ERROR_NONE) {
1631                         g_array_append_vals(*out_param1, &address,
1632                                         sizeof(bluetooth_device_address_t));
1633                 }
1634
1635                 break;
1636         }
1637         case BT_DISCONNECT_LE: {
1638                 bluetooth_device_address_t address = { {0} };
1639
1640                 __bt_service_get_parameters(in_param1, &address,
1641                                 sizeof(bluetooth_device_address_t));
1642
1643                 result = _bt_disconnect_le_device(request_id, &address);
1644                 if (result != BLUETOOTH_ERROR_NONE) {
1645                         g_array_append_vals(*out_param1, &address,
1646                                         sizeof(bluetooth_device_address_t));
1647                 }
1648
1649                 break;
1650         }
1651         case BT_SET_LE_PRIVACY: {
1652                 gboolean set_privacy;
1653
1654                 __bt_service_get_parameters(in_param1, &set_privacy,
1655                                 sizeof(gboolean));
1656
1657                 result = _bt_set_le_privacy(set_privacy);
1658
1659                 break;
1660         }
1661         case BT_REQ_ATT_MTU: {
1662                 bluetooth_device_address_t address = { {0} };
1663                 unsigned int mtu;
1664
1665                 __bt_service_get_parameters(in_param1,
1666                                 &address, sizeof(bluetooth_device_address_t));
1667                 __bt_service_get_parameters(in_param2,
1668                                 &mtu, sizeof(unsigned int));
1669
1670                 result = _bt_request_att_mtu(request_id, &address, mtu);
1671                 if (result != BLUETOOTH_ERROR_NONE) {
1672                         g_array_append_vals(*out_param1, &address,
1673                                         sizeof(bluetooth_device_info_t));
1674                 }
1675                 break;
1676         }
1677         case BT_GET_ATT_MTU: {
1678                 bluetooth_device_address_t address = { {0} };
1679                 unsigned int mtu = 0;
1680
1681                 __bt_service_get_parameters(in_param1,
1682                                 &address, sizeof(bluetooth_device_address_t));
1683
1684                 result = _bt_get_att_mtu(&address, &mtu);
1685                 BT_DBG("MTU: %d", mtu);
1686                 if (result == BLUETOOTH_ERROR_NONE) {
1687                         g_array_append_vals(*out_param1, &mtu,
1688                                                 sizeof(unsigned int));
1689                 }
1690                 break;
1691         }
1692         case BT_GET_DEVICE_IDA: {
1693                 bluetooth_device_address_t address = { {0} };
1694                 bluetooth_device_address_t id_addr = { {0} };
1695
1696                 __bt_service_get_parameters(in_param1,
1697                                 &address, sizeof(bluetooth_device_address_t));
1698
1699                 result = _bt_get_device_ida(&address, &id_addr);
1700
1701                 if (result == BLUETOOTH_ERROR_NONE) {
1702                         g_array_append_vals(*out_param1, &id_addr,
1703                                         sizeof(bluetooth_device_address_t));
1704                 }
1705                 break;
1706         }
1707         case BT_SET_LE_STATIC_RANDOM_ADDRESS: {
1708                 gboolean is_enable;
1709
1710                 __bt_service_get_parameters(in_param1, &is_enable,
1711                                 sizeof(gboolean));
1712
1713                 result = _bt_set_le_static_random_address(is_enable);
1714
1715                 break;
1716         }
1717         case BT_HDP_CONNECT:
1718         case BT_HDP_DISCONNECT:
1719         case BT_HDP_SEND_DATA:
1720
1721         case BT_GATT_GET_PRIMARY_SERVICES:
1722         case BT_GATT_DISCOVER_CHARACTERISTICS:
1723         case BT_GATT_SET_PROPERTY_REQUEST:
1724         case BT_GATT_READ_CHARACTERISTIC:
1725         case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
1726
1727         case BT_HID_DEVICE_ACTIVATE:
1728         case BT_HID_DEVICE_DEACTIVATE:
1729         case BT_HID_DEVICE_CONNECT:
1730         case BT_HID_DEVICE_DISCONNECT:
1731         case BT_HID_DEVICE_SEND_MOUSE_EVENT:
1732         case BT_HID_DEVICE_SEND_KEY_EVENT:
1733         case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
1734                 /* Just call to check the privilege */
1735                 break;
1736         case BT_LE_IPSP_INIT:
1737                 result = _bt_initialize_ipsp();
1738                 break;
1739         case BT_LE_IPSP_DEINIT:
1740                 result = _bt_deinitialize_ipsp();
1741                 break;
1742         case BT_LE_IPSP_CONNECT: {
1743                 bluetooth_device_address_t address = { {0} };
1744                 __bt_service_get_parameters(in_param1, &address,
1745                                 sizeof(bluetooth_device_address_t));
1746
1747                 result = _bt_connect_le_ipsp_device(&address);
1748                 break;
1749         }
1750         case BT_LE_IPSP_DISCONNECT: {
1751                 bluetooth_device_address_t address = { {0} };
1752
1753                 __bt_service_get_parameters(in_param1, &address,
1754                                 sizeof(bluetooth_device_address_t));
1755
1756                 result = _bt_disconnect_le_ipsp_device(&address);
1757                 break;
1758         }
1759         case BT_LE_READ_MAXIMUM_DATA_LENGTH: {
1760                 bluetooth_le_read_maximum_data_length_t max_le_datalength = {0};
1761
1762                 result = _bt_le_read_maximum_data_length(&max_le_datalength);
1763
1764                 g_array_append_vals(*out_param1, &max_le_datalength,
1765                         sizeof(bluetooth_le_read_maximum_data_length_t));
1766                 break;
1767         }
1768         case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH: {
1769                 unsigned int def_tx_Octects = 0;
1770                 unsigned int def_tx_Time = 0;
1771
1772                 __bt_service_get_parameters(in_param1,
1773                                 &def_tx_Octects, sizeof(int));
1774                 __bt_service_get_parameters(in_param2,
1775                                 &def_tx_Time, sizeof(int));
1776
1777                 result = _bt_le_write_host_suggested_default_data_length(
1778                                                 def_tx_Octects, def_tx_Time);
1779                 break;
1780         }
1781         case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH: {
1782                 bluetooth_le_read_host_suggested_data_length_t def_data_length = {0};
1783
1784                 result = _bt_le_read_host_suggested_default_data_length(&def_data_length);
1785
1786                 g_array_append_vals(*out_param1, &def_data_length,
1787                                 sizeof(bluetooth_le_read_host_suggested_data_length_t));
1788
1789                 break;
1790         }
1791         case BT_LE_SET_DATA_LENGTH: {
1792                 int max_tx_Octets = 0;
1793                 int max_tx_Time = 0;
1794                 bluetooth_device_address_t address = { {0} };
1795
1796                 __bt_service_get_parameters(in_param1, &address,
1797                                 sizeof(bluetooth_device_address_t));
1798                 __bt_service_get_parameters(in_param2,
1799                                 &max_tx_Octets, sizeof(int));
1800                 __bt_service_get_parameters(in_param3,
1801                                 &max_tx_Time, sizeof(int));
1802
1803                 result = _bt_le_set_data_length(&address, max_tx_Octets, max_tx_Time);
1804                 break;
1805         }
1806         case BT_DPM_SET_ALLOW_BT_MODE: {
1807                 dpm_bt_allow_t value = DPM_BT_ERROR;
1808
1809                 __bt_service_get_parameters(in_param1, &value,
1810                                 sizeof(int));
1811
1812                 result = _bt_dpm_set_allow_bluetooth_mode(value);
1813                 break;
1814         }
1815         case BT_DPM_GET_ALLOW_BT_MODE: {
1816                 int value = DPM_BT_ERROR;
1817
1818                 result = _bt_dpm_get_allow_bluetooth_mode(&value);
1819                 g_array_append_vals(*out_param1, &value, sizeof(int));
1820                 break;
1821         }
1822         case BT_DPM_SET_DEVICE_RESTRITION: {
1823                 dpm_status_t value = DPM_STATUS_ERROR;
1824
1825                 __bt_service_get_parameters(in_param1, &value,
1826                                 sizeof(int));
1827
1828                 result = _bt_dpm_activate_bluetooth_device_restriction(value);
1829                 break;
1830         }
1831         case BT_DPM_GET_DEVICE_RESTRITION: {
1832                 int value = DPM_STATUS_ERROR;
1833
1834                 result = _bt_dpm_is_bluetooth_device_restriction_active(&value);
1835                 g_array_append_vals(*out_param1, &value, sizeof(int));
1836                 break;
1837         }
1838         case BT_DPM_SET_UUID_RESTRITION: {
1839                 dpm_status_t value = DPM_STATUS_ERROR;
1840
1841                 __bt_service_get_parameters(in_param1, &value,
1842                                 sizeof(int));
1843
1844                 result = _bt_dpm_activate_bluetoooth_uuid_restriction(value);
1845                 break;
1846         }
1847         case BT_DPM_GET_UUID_RESTRITION: {
1848                 int value = DPM_STATUS_ERROR;
1849
1850                 result = _bt_dpm_is_bluetooth_uuid_restriction_active(&value);
1851                 g_array_append_vals(*out_param1, &value, sizeof(int));
1852                 break;
1853         }
1854         case BT_DPM_ADD_DEVICES_BLACKLIST: {
1855                 bluetooth_device_address_t address = { {0} };
1856
1857                 __bt_service_get_parameters(in_param1, &address,
1858                         sizeof(bluetooth_device_address_t));
1859
1860                 result = _bt_dpm_add_bluetooth_devices_to_blacklist(&address);
1861                 break;
1862         }
1863         case BT_DPM_ADD_DEVICES_WHITELIST: {
1864                 bluetooth_device_address_t address = { {0} };
1865
1866                 __bt_service_get_parameters(in_param1, &address,
1867                         sizeof(bluetooth_device_address_t));
1868
1869                 result = _bt_dpm_add_bluetooth_devices_to_whitelist(&address);
1870                 break;
1871         }
1872         case BT_DPM_ADD_UUIDS_BLACKLIST: {
1873                 const char *uuid = NULL;
1874
1875                 uuid = g_variant_get_data(in_param1);
1876
1877                 result = _bt_dpm_add_bluetooth_uuids_to_blacklist(uuid);
1878                 break;
1879         }
1880         case BT_DPM_ADD_UUIDS_WHITELIST: {
1881                 const char *uuid = NULL;
1882
1883                 uuid = g_variant_get_data(in_param1);
1884
1885                 result = _bt_dpm_add_bluetooth_uuids_to_whitelist(uuid);
1886                 break;
1887         }
1888         case BT_DPM_CLEAR_DEVICES_BLACKLIST: {
1889                 result = _bt_dpm_clear_bluetooth_devices_from_blacklist();
1890                 break;
1891         }
1892         case BT_DPM_CLEAR_DEVICES_WHITELIST: {
1893                 result = _bt_dpm_clear_bluetooth_devices_from_whitelist();
1894                 break;
1895         }
1896         case BT_DPM_CLEAR_UUIDS_BLACKLIST: {
1897                 result = _bt_dpm_clear_bluetooth_uuids_from_blacklist();
1898                 break;
1899         }
1900         case BT_DPM_CLEAR_UUIDS_WHITELIST: {
1901                 result = _bt_dpm_clear_bluetooth_uuids_from_whitelist();
1902                 break;
1903         }
1904         case BT_DPM_REMOVE_DEVICE_BLACKLIST: {
1905                 bluetooth_device_address_t address = { {0} };
1906
1907                 __bt_service_get_parameters(in_param1, &address,
1908                         sizeof(bluetooth_device_address_t));
1909
1910                 result = _bt_dpm_remove_bluetooth_devices_from_blacklist(&address);
1911                 break;
1912         }
1913         case BT_DPM_REMOVE_DEVICE_WHITELIST: {
1914                 bluetooth_device_address_t address = { {0} };
1915
1916                 __bt_service_get_parameters(in_param1, &address,
1917                         sizeof(bluetooth_device_address_t));
1918
1919                 result = _bt_dpm_remove_bluetooth_devices_from_whitelist(&address);
1920                 break;
1921         }
1922         case BT_DPM_REMOVE_UUID_BLACKLIST: {
1923                 const char *uuid = NULL;
1924
1925                 uuid = g_variant_get_data(in_param1);
1926
1927                 result = _bt_dpm_remove_bluetooth_uuids_from_blacklist(uuid);
1928                 break;
1929         }
1930         case BT_DPM_REMOVE_UUID_WHITELIST: {
1931                 const char *uuid = NULL;
1932
1933                 uuid = g_variant_get_data(in_param1);
1934
1935                 result = _bt_dpm_remove_bluetooth_uuids_from_whitelist(uuid);
1936
1937                 break;
1938         }
1939         case BT_DPM_GET_DEVICES_BLACKLIST: {
1940                 result = _bt_dpm_get_bluetooth_devices_from_blacklist(out_param1);
1941                 break;
1942         }
1943         case BT_DPM_GET_DEVICES_WHITELIST: {
1944                 result = _bt_dpm_get_bluetooth_devices_from_whitelist(out_param1);
1945                 break;
1946         }
1947         case BT_DPM_GET_UUIDS_BLACKLIST: {
1948                 result = _bt_dpm_get_bluetooth_uuids_from_blacklist(out_param1);
1949                 break;
1950         }
1951         case BT_DPM_GET_UUIDS_WHITELIST: {
1952                 result = _bt_dpm_get_bluetooth_uuids_from_whitelist(out_param1);
1953                 break;
1954         }
1955         case BT_DPM_SET_ALLOW_OUTGOING_CALL: {
1956                 dpm_status_t value = DPM_STATUS_ERROR;
1957
1958                 __bt_service_get_parameters(in_param1, &value,
1959                                 sizeof(int));
1960
1961                 result = _bt_dpm_set_allow_bluetooth_outgoing_call(value);
1962
1963                 break;
1964         }
1965         case BT_DPM_GET_ALLOW_OUTGOING_CALL: {
1966                 int value = DPM_STATUS_ERROR;
1967
1968                 result = _bt_dpm_get_allow_bluetooth_outgoing_call(&value);
1969                 g_array_append_vals(*out_param1, &value, sizeof(int));
1970                 break;
1971         }
1972         case BT_DPM_SET_PAIRING_STATE: {
1973                 dpm_status_t value = DPM_STATUS_ERROR;
1974
1975                 __bt_service_get_parameters(in_param1, &value,
1976                                 sizeof(int));
1977
1978                 result = _bt_dpm_set_bluetooth_pairing_state(value);
1979
1980                 break;
1981         }
1982         case BT_DPM_GET_PAIRING_STATE: {
1983                 int value = DPM_STATUS_ERROR;
1984
1985                 result = _bt_dpm_get_bluetooth_pairing_state(&value);
1986                 g_array_append_vals(*out_param1, &value, sizeof(int));
1987                 break;
1988         }
1989         case BT_DPM_SET_PROFILE_STATE: {
1990                 int value = DPM_STATUS_ERROR;
1991                 int profile = DPM_PROFILE_NONE;
1992
1993                 __bt_service_get_parameters(in_param1, &profile,
1994                                 sizeof(int));
1995                 __bt_service_get_parameters(in_param2, &value,
1996                                 sizeof(int));
1997
1998                 result = _bt_dpm_set_bluetooth_profile_state(profile, value);
1999
2000                 break;
2001         }
2002         case BT_DPM_GET_PROFILE_STATE: {
2003                 int value = DPM_STATUS_ERROR;
2004                 int profile = DPM_PROFILE_NONE;
2005
2006                 __bt_service_get_parameters(in_param1, &profile,
2007                                 sizeof(int));
2008
2009                 result = _bt_dpm_get_bluetooth_profile_state(profile, &value);
2010                 g_array_append_vals(*out_param1, &value, sizeof(int));
2011                 break;
2012         }
2013         case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE: {
2014                 int value = DPM_BT_ERROR;
2015
2016                 __bt_service_get_parameters(in_param1, &value,
2017                                 sizeof(int));
2018
2019                 result = _bt_dpm_set_bluetooth_desktop_connectivity_state(value);
2020
2021                 break;
2022         }
2023         case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE: {
2024                 int value = DPM_STATUS_ERROR;
2025
2026                 result = _bt_dpm_get_bluetooth_desktop_connectivity_state(&value);
2027                 g_array_append_vals(*out_param1, &value, sizeof(int));
2028                 break;
2029         }
2030         case BT_DPM_SET_DISCOVERABLE_STATE: {
2031                 int value = DPM_STATUS_ERROR;
2032
2033                 __bt_service_get_parameters(in_param1, &value,
2034                                 sizeof(int));
2035
2036                 result = _bt_dpm_set_bluetooth_discoverable_state(value);
2037
2038                 break;
2039         }
2040         case BT_DPM_GET_DISCOVERABLE_STATE: {
2041                 int value = DPM_STATUS_ERROR;
2042
2043                 result = _bt_dpm_get_bluetooth_discoverable_state(&value);
2044                 g_array_append_vals(*out_param1, &value, sizeof(int));
2045                 break;
2046         }
2047         case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE: {
2048                 int value = DPM_STATUS_ERROR;
2049
2050                 __bt_service_get_parameters(in_param1, &value,
2051                                 sizeof(int));
2052
2053                 result = _bt_dpm_set_bluetooth_limited_discoverable_state(value);
2054
2055                 break;
2056         }
2057         case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE: {
2058                 int value = DPM_STATUS_ERROR;
2059
2060                 result = _bt_dpm_get_bluetooth_limited_discoverable_state(&value);
2061                 g_array_append_vals(*out_param1, &value, sizeof(int));
2062                 break;
2063         }
2064         case BT_DPM_SET_DATA_TRANSFER_STATE: {
2065                 int value = DPM_STATUS_ERROR;
2066
2067                 __bt_service_get_parameters(in_param1, &value,
2068                                 sizeof(int));
2069
2070                 result = _bt_dpm_set_bluetooth_data_transfer_state(value);
2071
2072                 break;
2073         }
2074         case BT_DPM_GET_DATA_TRANSFER_STATE: {
2075                 int value = DPM_STATUS_ERROR;
2076
2077                 result = _bt_dpm_get_allow_bluetooth_data_transfer_state(&value);
2078                 g_array_append_vals(*out_param1, &value, sizeof(int));
2079                 break;
2080         }
2081         case BT_PXP_MONITOR_SET_PROPERTY: {
2082                 bluetooth_device_address_t address = { {0} };
2083                 unsigned int property = 0;
2084                 unsigned int value = 0;
2085
2086                 __bt_service_get_parameters(in_param1,
2087                                 &address, sizeof(bluetooth_device_address_t));
2088                 __bt_service_get_parameters(in_param2,
2089                                 &property, sizeof(int));
2090                 __bt_service_get_parameters(in_param3,
2091                                 &value, sizeof(int));
2092
2093                 result = _bt_proximity_monitor_set_property(&address, property, value);
2094                 break;
2095         }
2096         case BT_PXP_MONITOR_GET_PROPERTY: {
2097                 bluetooth_device_address_t address = { {0} };
2098                 unsigned int property = 0;
2099                 int value = 0;
2100
2101                 __bt_service_get_parameters(in_param1,
2102                                 &address, sizeof(bluetooth_device_address_t));
2103                 __bt_service_get_parameters(in_param2,
2104                                 &property, sizeof(unsigned int));
2105
2106                 result = _bt_proximity_monitor_get_property(&address, property, &value);
2107                 if (result == BLUETOOTH_ERROR_NONE) {
2108                         g_array_append_vals(*out_param1, &value,
2109                                                 sizeof(int));
2110                 }
2111                 break;
2112         }
2113         case BT_PXP_MONITOR_GET_SUPPORTED_SERIVCES: {
2114                 bluetooth_device_address_t address = { {0} };
2115                 unsigned int property = 0;
2116
2117                 __bt_service_get_parameters(in_param1,
2118                                 &address, sizeof(bluetooth_device_address_t));
2119
2120                 result = _bt_proximity_monitor_get_supported_services(&address, &property);
2121                 if (result == BLUETOOTH_ERROR_NONE) {
2122                         g_array_append_vals(*out_param1, &property,
2123                                                 sizeof(int));
2124                 }
2125                 break;
2126         }
2127         case BT_PXP_REPORTER_REGISTER: {
2128                 char *sender = NULL;
2129                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2130                 result = _bt_proximity_reporter_register(sender);
2131                 break;
2132         }
2133         case BT_PXP_REPORTER_UNREGISTER: {
2134                 char *sender = NULL;
2135                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2136                 result = _bt_proximity_reporter_unregister(sender);
2137                 break;
2138         }
2139         case BT_PXP_REPORTER_GET_PROPERTY: {
2140                 bluetooth_device_address_t address = { {0} };
2141                 unsigned int property = 0;
2142                 int value = 0;
2143
2144                 __bt_service_get_parameters(in_param1,
2145                                 &address, sizeof(bluetooth_device_address_t));
2146                 __bt_service_get_parameters(in_param2,
2147                                 &property, sizeof(unsigned int));
2148
2149                 result = _bt_proximity_reporter_get_property(&address, property, &value);
2150                 if (result == BLUETOOTH_ERROR_NONE) {
2151                         g_array_append_vals(*out_param1, &value,
2152                                                 sizeof(int));
2153                 }
2154                 break;
2155         }
2156         case BT_TDS_PROVIDER_REGISTER: {
2157                 char *sender = NULL;
2158
2159                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2160                 result = _bt_tds_provider_register(sender);
2161
2162                 break;
2163         }
2164         case BT_TDS_PROVIDER_UNREGISTER: {
2165                 char *sender = NULL;
2166
2167                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2168                 result = _bt_tds_provider_unregister(sender);
2169
2170                 break;
2171         }
2172         case BT_TDS_PROVIDER_SET_MANUF_DATA: {
2173                 char *sender = NULL;
2174                 unsigned int length = 0;
2175                 bluetooth_advertising_data_t manuf_data;
2176
2177                 __bt_service_get_parameters(in_param1,
2178                                 &length, sizeof(unsigned int));
2179                 __bt_service_get_parameters(in_param2,
2180                                 &manuf_data, sizeof(bluetooth_advertising_data_t));
2181                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2182
2183                 result = _bt_tds_provider_set_manuf_data(sender, manuf_data.data, length);
2184                 break;
2185         }
2186         case BT_TDS_PROVIDER_CREATE: {
2187                 char *sender = NULL;
2188                 unsigned int tds_handle = 0;
2189                 int transport;
2190
2191                 __bt_service_get_parameters(in_param1,
2192                                 &tds_handle, sizeof(unsigned int));
2193                 __bt_service_get_parameters(in_param2,
2194                                 &transport, sizeof(int));
2195                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2196                 result = _bt_tds_provider_transport_create(sender, transport, tds_handle);
2197
2198                 break;
2199         }
2200         case BT_TDS_PROVIDER_DESTROY: {
2201                 char *sender = NULL;
2202                 unsigned int tds_handle = 0;
2203
2204                 __bt_service_get_parameters(in_param1,
2205                                 &tds_handle, sizeof(unsigned int));
2206                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2207                 result = _bt_tds_provider_transport_remove(sender, tds_handle);
2208
2209                 break;
2210         }
2211         case BT_TDS_PROVIDER_SET_TRANSPORT_DATA: {
2212                 char *sender = NULL;
2213                 unsigned int tds_handle = 0;
2214                 int transport_state = 0;
2215                 bluetooth_tds_data_t tds_data;
2216
2217                 __bt_service_get_parameters(in_param1,
2218                                 &tds_handle, sizeof(unsigned int));
2219                 __bt_service_get_parameters(in_param2,
2220                                 &transport_state, sizeof(int));
2221                 __bt_service_get_parameters(in_param3,
2222                                 &tds_data, sizeof(bluetooth_tds_data_t));
2223                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2224
2225                 result = _bt_tds_provider_set_transport_data(sender, tds_handle,
2226                                 transport_state, tds_data.data, tds_data.length);
2227                 break;
2228         }
2229         case BT_TDS_SEND_ACTIVATION_RESPONSE: {
2230                 bluetooth_device_address_t address = { {0} };
2231                 bluetooth_tds_data_t tds_data;
2232                 char *sender = NULL;
2233                 unsigned int tds_handle = 0;
2234                 int response;
2235
2236                 __bt_service_get_parameters(in_param1,
2237                                 &tds_handle, sizeof(unsigned int));
2238                 __bt_service_get_parameters(in_param2,
2239                                 &response, sizeof(int));
2240                 __bt_service_get_parameters(in_param3, &address,
2241                         sizeof(bluetooth_device_address_t));
2242                 __bt_service_get_parameters(in_param4,
2243                                 &tds_data, sizeof(bluetooth_tds_data_t));
2244                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2245
2246                 result = _bt_tds_provider_send_activation_response(sender, tds_handle,
2247                                 &address, response, tds_data.data, tds_data.length);
2248                 break;
2249         }
2250         case BT_TDS_READ_TRANSPORT_DATA: {
2251                 char *handle;
2252                 char *data = NULL;
2253                 guint data_len = 0;
2254
2255                 char *sender = NULL;
2256                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2257
2258                 bluetooth_device_address_t address = { {0} };
2259                 __bt_service_get_parameters(in_param2,
2260                         &address, sizeof(bluetooth_device_address_t));
2261
2262                 data_len = g_variant_get_size(in_param1);
2263                 data = (char *)g_variant_get_data(in_param1);
2264
2265                 handle = g_strndup(data, data_len);
2266                 BT_DBG("Read TDS Transport Block [%s]", handle);
2267
2268                 result = _bt_tds_read_transport_data(request_id, sender, &address, handle);
2269
2270                 if (result != BLUETOOTH_ERROR_NONE) {
2271                         BT_ERR("Reading TDS Transport data failed result [%d]", result);
2272                         g_array_append_vals(*out_param1, &address,
2273                                         sizeof(bluetooth_device_address_t));
2274                 }
2275                 if (handle)
2276                         g_free(handle);
2277                 break;
2278         }
2279         case BT_TDS_ENABLE_CONTROL_POINT: {
2280                 char *handle;
2281                 char *data = NULL;
2282                 guint data_len = 0;
2283                 bluetooth_device_address_t address = { {0} };
2284
2285                 char *sender = NULL;
2286                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2287
2288                 data_len = g_variant_get_size(in_param1);
2289                 data = (char *)g_variant_get_data(in_param1);
2290                 __bt_service_get_parameters(in_param2,
2291                         &address, sizeof(bluetooth_device_address_t));
2292
2293                 handle = g_strndup(data, data_len);
2294                 BT_DBG("TDS Control point CCCD handle [%s]", handle);
2295
2296                 result = _bt_tds_enable_control_point(request_id, sender, &address, handle);
2297
2298                 if (result != BLUETOOTH_ERROR_NONE) {
2299                         BT_ERR("Enabling TDS CCCD failed result [%d]", result);
2300                         g_array_append_vals(*out_param1, &address,
2301                                         sizeof(bluetooth_device_address_t));
2302                 }
2303                 if (handle)
2304                         g_free(handle);
2305                 break;
2306         }
2307         case BT_TDS_ACTIVATE_CONTROL_POINT: {
2308                 char *handle;
2309                 char *data = NULL;
2310                 guint data_len = 0;
2311                 bluetooth_control_point_data_t tds_data;
2312                 char *sender = NULL;
2313
2314                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2315
2316                 bluetooth_device_address_t address = { {0} };
2317
2318                 data_len = g_variant_get_size(in_param1);
2319                 data = (char *)g_variant_get_data(in_param1);
2320
2321                  __bt_service_get_parameters(in_param2,
2322                         &address, sizeof(bluetooth_device_address_t));
2323
2324                 __bt_service_get_parameters(in_param3,
2325                         &tds_data, sizeof(bluetooth_control_point_data_t));
2326
2327                 handle = g_strndup(data, data_len);
2328                 BT_DBG("TDS Activate Control point handle [%s]", handle);
2329
2330                 result = _bt_tds_activate_control_point(request_id, sender, &address, handle,
2331                                                                 tds_data.data, tds_data.length);
2332
2333                 if (result != BLUETOOTH_ERROR_NONE) {
2334                         BT_ERR("Activating TDS Control Point request failed result [%d]", result);
2335                         g_array_append_vals(*out_param1, &address,
2336                                         sizeof(bluetooth_device_address_t));
2337                 }
2338                 if (handle)
2339                         g_free(handle);
2340                 break;
2341         }
2342         case BT_OTP_SERVER_INIT: {
2343                 const char *directory;
2344                 directory = (const char *)g_variant_get_data(in_param1);
2345                 result = bt_otp_server_init(request_id, directory);
2346                 break;
2347         }
2348         case BT_OTP_SERVER_DEINIT: {
2349                 result = bt_otp_server_deinit(request_id);
2350                 break;
2351         }
2352         case BT_OTP_READ_VALUE: {
2353                 char *handle;
2354                 char *data = NULL;
2355                 guint data_len = 0;
2356
2357                 char *sender = NULL;
2358                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2359
2360                 data_len = g_variant_get_size(in_param1);
2361                 data = (char *)g_variant_get_data(in_param1);
2362
2363                 handle = g_strndup(data, data_len);
2364                 BT_DBG("Read OTP Characteristic Value [%s]", handle);
2365
2366                 result = _bt_otp_read_characteristic_value(request_id, sender, handle);
2367
2368                 if (result != BLUETOOTH_ERROR_NONE) {
2369                         BT_ERR("Reading OTP Characteristic Value failed result [%d]", result);
2370                         g_array_append_vals(*out_param1, handle, data_len);
2371                 }
2372                 if (handle)
2373                         g_free(handle);
2374                 break;
2375         }
2376         case BT_OTP_ENABLE_NOTIFICATION: {
2377                 char *handle;
2378                 char *data = NULL;
2379                 guint data_len = 0;
2380
2381                 char *sender = NULL;
2382                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2383
2384                 data_len = g_variant_get_size(in_param1);
2385                 data = (char *)g_variant_get_data(in_param1);
2386
2387                 handle = g_strndup(data, data_len);
2388                 BT_DBG("OTP Control point CCCD handle [%s]", handle);
2389
2390                 result = _bt_otp_enable_notification(request_id, sender, handle);
2391
2392                 if (result != BLUETOOTH_ERROR_NONE) {
2393                         BT_ERR("Enabling OTP CCCD failed result [%d]", result);
2394                         g_array_append_vals(*out_param1, handle, data_len);
2395                 }
2396                 if (handle)
2397                         g_free(handle);
2398                 break;
2399         }
2400         case BT_OTP_WRITE_VALUE: {
2401                 char *handle;
2402                 char *data = NULL;
2403                 guint data_len = 0;
2404                 char *sender = NULL;
2405                 bluetooth_otp_charc_data_t otp_charc_data;
2406                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2407
2408                 data_len = g_variant_get_size(in_param1);
2409                 data = (char *)g_variant_get_data(in_param1);
2410
2411                 handle = g_strndup(data, data_len);
2412                 BT_DBG("OTP Write Characteristic value [%s]", handle);
2413
2414                 __bt_service_get_parameters(in_param2,
2415                         &otp_charc_data, sizeof(bluetooth_otp_charc_data_t));
2416
2417                 int i;
2418                 for (i = 0; i < otp_charc_data.length; i++)
2419                         BT_DBG("Value[%d] = %u", i, otp_charc_data.data[i]);
2420
2421                 result = _bt_otp_write_characteristic_value(request_id, sender, handle,
2422                                                                 otp_charc_data.data, otp_charc_data.length);
2423
2424                 if (result != BLUETOOTH_ERROR_NONE) {
2425                         BT_ERR("OTP Write Characteristic failed result [%d]", result);
2426                         g_array_append_vals(*out_param1, handle, data_len);
2427                 }
2428                 if (handle)
2429                         g_free(handle);
2430                 break;
2431         }
2432         case BT_LE_OTC_CONNECT: {
2433                 BT_DBG("OTC Connect");
2434                 bluetooth_device_address_t address = { {0} };
2435                 __bt_service_get_parameters(in_param1, &address,
2436                                 sizeof(bluetooth_device_address_t));
2437
2438                 result = _bt_otp_connect_otc(request_id, &address);
2439                 break;
2440         }
2441         case BT_LE_OTC_DISCONNECT: {
2442                 BT_DBG("OTC Disconnect");
2443                 bluetooth_device_address_t address = { {0} };
2444
2445                 __bt_service_get_parameters(in_param1, &address,
2446                                                 sizeof(bluetooth_device_address_t));
2447                 result = _bt_otp_disconnect_otc(&address);
2448                 break;
2449         }
2450         default:
2451                 result = BLUETOOTH_ERROR_INTERNAL;
2452                 break;
2453         }
2454
2455         return result;
2456 }
2457
2458 int __bt_obexd_request(int function_name,
2459                 int request_type,
2460                 int request_id,
2461                 GDBusMethodInvocation *context,
2462                 GVariant *in_param1,
2463                 GVariant *in_param2,
2464                 GVariant *in_param3,
2465                 GVariant *in_param4,
2466                 GArray **out_param1)
2467 {
2468         BT_DBG("+");
2469
2470         int result;
2471
2472         BT_DBG("function_name : %x", function_name);
2473
2474         switch (function_name) {
2475         case BT_OPP_PUSH_FILES: {
2476                 BT_DBG("BT_OPP_PUSH_FILES");
2477                 int i;
2478                 bluetooth_device_address_t address = { {0} };
2479                 bt_file_path_t path;
2480                 char **file_path;
2481                 int file_count;
2482                 GArray *param2;
2483
2484                 __bt_service_get_parameters(in_param1, &address,
2485                                 sizeof(bluetooth_device_address_t));
2486                 __bt_service_get_parameters(in_param3, &file_count,
2487                                 sizeof(int));
2488
2489                 file_path = g_new0(char *, file_count + 1);
2490
2491                 param2 = g_array_new(TRUE, TRUE, sizeof(gchar));
2492                 __bt_fill_garray_from_variant(in_param2, param2);
2493
2494                 for (i = 0; i < file_count; i++) {
2495                         path = g_array_index(param2, bt_file_path_t, i);
2496                         file_path[i] = g_strdup(path.path);
2497                 }
2498                 BT_DBG("_bt_opp_client_push_files");
2499                 result = _bt_opp_client_push_files(request_id, context,
2500                                                 &address, file_path,
2501                                                 file_count);
2502
2503                 for (i = 0; i < file_count; i++)
2504                         g_free(file_path[i]);
2505
2506                 g_free(file_path);
2507                 g_array_free(param2, TRUE);
2508
2509                 break;
2510         }
2511         case BT_OPP_CANCEL_PUSH: {
2512                 result = _bt_opp_client_cancel_push();
2513
2514                 break;
2515         }
2516         case BT_OPP_IS_PUSHING_FILES: {
2517                 gboolean is_sending = FALSE;
2518
2519                 result = _bt_opp_client_is_sending(&is_sending);
2520
2521                 g_array_append_vals(*out_param1, &is_sending,
2522                                 sizeof(gboolean));
2523                 break;
2524         }
2525         case BT_OPP_GET_TRANSFER_PROGRESS: {
2526                 int direction;
2527                 int transfer_id;
2528                 guint8 progress = 0;
2529
2530                 __bt_service_get_parameters(in_param1, &direction,
2531                                 sizeof(int));
2532                 __bt_service_get_parameters(in_param2, &transfer_id,
2533                                 sizeof(int));
2534                 if (direction)
2535                         result = _bt_opp_get_client_progress(&progress);
2536                 else
2537                         result = _bt_opp_get_server_progress(transfer_id, &progress);
2538
2539                 g_array_append_vals(*out_param1, &progress,
2540                                 sizeof(guint8));
2541
2542                 break;
2543         }
2544
2545         case BT_MAP_CREATE_SESSION: {
2546                 BT_DBG("BT_MAP_CREATE_SESSION");
2547                 char *address = (char *)g_variant_get_data(in_param1);
2548                 char *session_id = NULL;
2549                 result = _bt_create_session_sync(address, &session_id);
2550                 if (result == BLUETOOTH_ERROR_NONE)
2551                         g_array_append_vals(*out_param1, session_id, strlen(session_id)+1);
2552                 break;
2553         }
2554
2555         case BT_MAP_DESTROY_SESSION: {
2556                 BT_DBG("BT_MAP_DESTROY_SESSION");
2557                 char* session_id = (char *)g_variant_get_data(in_param1);
2558                 result = _bt_destroy_session_sync(session_id);
2559                 if (result == BLUETOOTH_ERROR_NONE)
2560                         BT_DBG("successfully destroyed session");
2561                 break;
2562         }
2563
2564         case BT_MAP_SET_FOLDER: {
2565                 BT_DBG("BT_MAP_SET_FOLDER");
2566                 char *session_id = (char *)g_variant_get_data(in_param1);
2567                 char *name = (char *)g_variant_get_data(in_param2);
2568                 result = _bt_map_client_set_folder(session_id, name);
2569                 break;
2570         }
2571
2572         case BT_MAP_LIST_FOLDERS: {
2573                 BT_DBG("BT_MAP_LIST_FOLDERS");
2574
2575                 char* session_id = (char *)g_variant_get_data(in_param1);
2576                 char* filter_serialized = (char*)g_variant_get_data(in_param2);
2577
2578                 result = _bt_map_client_list_folders(request_id, context, session_id, filter_serialized);
2579                 if (result == BLUETOOTH_ERROR_NONE)
2580                         BT_DBG("_bt_map_client_list_folders succeed");
2581
2582                 break;
2583         }
2584
2585         case BT_MAP_LIST_FILTER_FIELDS: {
2586                 BT_DBG("BT_MAP_LIST_FILTER_FIELDS");
2587
2588                 char* session_id = (char *)g_variant_get_data(in_param1);
2589
2590                 result = _bt_map_client_list_filter_fields(request_id, context, session_id);
2591                 if (result == BLUETOOTH_ERROR_NONE)
2592                         BT_DBG("_bt_map_client_list_filter_fields succeed");
2593
2594                 break;
2595         }
2596
2597         case BT_MAP_LIST_MESSAGES: {
2598                 BT_DBG("BT_MAP_LIST_MESSAGES");
2599
2600                 char* session_id = (char*)g_variant_get_data(in_param1);
2601                 char* folder = (char*)g_variant_get_data(in_param2);
2602                 char* filter_serialized = (char*)g_variant_get_data(in_param3);
2603
2604                 result = _bt_map_client_list_messages(request_id, context, session_id, folder, filter_serialized);
2605                 if (result == BLUETOOTH_ERROR_NONE)
2606                         BT_DBG("_bt_map_client_list_messages succeed");
2607                 else
2608                         BT_DBG("_bt_map_client_list_messages failed");
2609
2610                 break;
2611         }
2612
2613         case BT_MAP_UPDATE_INBOX: {
2614                 BT_DBG("BT_MAP_UPDATE_INBOX");
2615                 char* session_id = (char *)g_variant_get_data(in_param1);
2616                 result = _bt_map_client_update_inbox(session_id);
2617                 break;
2618         }
2619
2620         case BT_MAP_PUSH_MESSAGE: {
2621                 BT_DBG("BT_MAP_PUSH_MESSAGE");
2622
2623                 char* session_id = (char *)g_variant_get_data(in_param1);
2624                 char* source_file = (char *)g_variant_get_data(in_param2);
2625                 char* folder = (char *)g_variant_get_data(in_param3);
2626                 char* args_serialized = (char *)g_variant_get_data(in_param4);
2627
2628                 result = _bt_map_client_push_message(
2629                                 request_id, context, session_id, source_file, folder, args_serialized);
2630                 if (result == BLUETOOTH_ERROR_NONE)
2631                         BT_DBG("_bt_map_client_push_message succeed");
2632                 else
2633                         BT_ERR("_bt_map_client_push_message failed");
2634
2635                 break;
2636         }
2637
2638         case BT_MAP_GET_MESSAGE: {
2639                 BT_DBG("BT_MAP_GET_MESSAGE");
2640                 // TODO session currently is not used, but should be valid
2641                 //char* session_id = (char *)g_variant_get_data(in_param1);
2642                 char* message_object = (char *)g_variant_get_data(in_param2);
2643                 char* target_file = (char *)g_variant_get_data(in_param3);
2644                 bool attachment = false;
2645                 __bt_service_get_parameters(in_param4, &attachment, sizeof(bool));
2646
2647                 result = _bt_map_client_get_message(request_id, context, message_object,
2648                                 target_file, attachment);
2649                 if (result == BLUETOOTH_ERROR_NONE)
2650                         BT_DBG("_bt_map_client_get_message succeed");
2651
2652                 break;
2653         }
2654
2655         case BT_OBEX_SERVER_ALLOCATE: {
2656                 int app_pid;
2657                 gboolean is_native;
2658                 char *path;
2659                 char *sender;
2660
2661                 sender = (char *)g_dbus_method_invocation_get_sender(context);
2662
2663                 path = (char *)g_variant_get_data(in_param1);
2664                 __bt_service_get_parameters(in_param2, &is_native,
2665                                 sizeof(gboolean));
2666                 __bt_service_get_parameters(in_param3, &app_pid,
2667                                 sizeof(int));
2668
2669                 result = _bt_obex_server_allocate(sender,
2670                                 path, app_pid, is_native);
2671
2672                 break;
2673         }
2674         case BT_OBEX_SERVER_DEALLOCATE: {
2675                 int app_pid;
2676                 gboolean is_native;
2677
2678                 __bt_service_get_parameters(in_param1, &is_native,
2679                                 sizeof(gboolean));
2680                 __bt_service_get_parameters(in_param2, &app_pid,
2681                                 sizeof(int));
2682
2683                 result = _bt_obex_server_deallocate(app_pid, is_native);
2684                 break;
2685         }
2686         case BT_OBEX_SERVER_IS_ACTIVATED: {
2687                 gboolean is_activated = FALSE;
2688
2689                 result = _bt_obex_server_is_activated(&is_activated);
2690
2691                 g_array_append_vals(*out_param1, &is_activated,
2692                                 sizeof(gboolean));
2693
2694                 break;
2695         }
2696         case BT_OBEX_SERVER_ACCEPT_CONNECTION: {
2697                 result = _bt_obex_server_accept_connection(request_id);
2698
2699                 break;
2700         }
2701         case BT_OBEX_SERVER_REJECT_CONNECTION: {
2702                 result = _bt_obex_server_reject_connection();
2703
2704                 break;
2705         }
2706         case BT_OBEX_SERVER_ACCEPT_FILE: {
2707                 char *file_name;
2708
2709                 file_name = (char *)g_variant_get_data(in_param1);
2710
2711                 result = _bt_obex_server_accept_authorize(file_name, TRUE);
2712
2713                 break;
2714         }
2715         case BT_OBEX_SERVER_REJECT_FILE: {
2716                 result = _bt_obex_server_reject_authorize();
2717
2718                 break;
2719         }
2720         case BT_OBEX_SERVER_SET_PATH: {
2721                 gboolean is_native;
2722                 char *destination_path;
2723
2724                 destination_path = (char *)g_variant_get_data(in_param1);
2725                 __bt_service_get_parameters(in_param2, &is_native,
2726                                 sizeof(gboolean));
2727
2728                 result = _bt_obex_server_set_destination_path(destination_path,
2729                                                         is_native);
2730
2731                 break;
2732         }
2733         case BT_OBEX_SERVER_SET_ROOT: {
2734                 char *root;
2735
2736                 root = (char *)g_variant_get_data(in_param1);
2737
2738                 result = _bt_obex_server_set_root(root);
2739
2740                 break;
2741         }
2742         case BT_OBEX_SERVER_CANCEL_TRANSFER: {
2743                 int transfer_id;
2744
2745                 __bt_service_get_parameters(in_param1, &transfer_id,
2746                                 sizeof(int));
2747
2748                 result = _bt_obex_server_cancel_transfer(transfer_id);
2749
2750                 break;
2751         }
2752         case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS: {
2753                 result = _bt_obex_server_cancel_all_transfers();
2754
2755                 break;
2756         }
2757         case BT_OBEX_SERVER_IS_RECEIVING: {
2758                 gboolean is_receiving = FALSE;
2759
2760                 result = _bt_obex_server_is_receiving(&is_receiving);
2761
2762                 g_array_append_vals(*out_param1, &is_receiving,
2763                                 sizeof(gboolean));
2764                 break;
2765         }
2766         case BT_PBAP_CONNECT: {
2767                 bluetooth_device_address_t address = { {0} };
2768
2769                 __bt_service_get_parameters(in_param1, &address,
2770                                 sizeof(bluetooth_device_address_t));
2771
2772                 result = _bt_pbap_connect(&address);
2773                 break;
2774         }
2775         case BT_PBAP_DISCONNECT: {
2776                 bluetooth_device_address_t address = { {0} };
2777
2778                 __bt_service_get_parameters(in_param1, &address,
2779                                 sizeof(bluetooth_device_address_t));
2780
2781                 result = _bt_pbap_disconnect(&address);
2782                 break;
2783         }
2784         case BT_PBAP_GET_PHONEBOOK_SIZE: {
2785                 bluetooth_device_address_t address = { {0} };
2786                 bt_pbap_folder_t folder = { 0, };
2787
2788                 __bt_service_get_parameters(in_param1, &address,
2789                                 sizeof(bluetooth_device_address_t));
2790                 __bt_service_get_parameters(in_param2, &folder,
2791                                 sizeof(bt_pbap_folder_t));
2792
2793                 result = _bt_pbap_get_phonebook_size(&address,
2794                                 folder.addressbook, folder.folder_type);
2795                 break;
2796         }
2797         case BT_PBAP_GET_PHONEBOOK: {
2798                 bluetooth_device_address_t address = { {0} };
2799                 bt_pbap_folder_t folder = { 0, };
2800                 bt_pbap_pull_parameters_t app_param = { 0, };
2801
2802                 __bt_service_get_parameters(in_param1, &address,
2803                                 sizeof(bluetooth_device_address_t));
2804                 __bt_service_get_parameters(in_param2, &folder,
2805                                 sizeof(bt_pbap_folder_t));
2806                 __bt_service_get_parameters(in_param3, &app_param,
2807                                 sizeof(bt_pbap_pull_parameters_t));
2808
2809                 result = _bt_pbap_get_phonebook(&address, folder.addressbook,
2810                                 folder.folder_type, &app_param);
2811                 break;
2812         }
2813         case BT_PBAP_GET_LIST: {
2814                 bluetooth_device_address_t address = { {0} };
2815                 bt_pbap_folder_t folder = { 0, };
2816                 bt_pbap_list_parameters_t app_param = { 0, };
2817
2818                 __bt_service_get_parameters(in_param1, &address,
2819                                 sizeof(bluetooth_device_address_t));
2820                 __bt_service_get_parameters(in_param2, &folder,
2821                                 sizeof(bt_pbap_folder_t));
2822                 __bt_service_get_parameters(in_param3, &app_param,
2823                                 sizeof(bt_pbap_list_parameters_t));
2824
2825                 result = _bt_pbap_get_list(&address, folder.addressbook,
2826                                 folder.folder_type, &app_param);
2827                 break;
2828         }
2829         case BT_PBAP_PULL_VCARD: {
2830                 bluetooth_device_address_t address = { {0} };
2831                 bt_pbap_folder_t folder = { 0, };
2832                 bt_pbap_pull_vcard_parameters_t app_param = { 0, };
2833
2834                 __bt_service_get_parameters(in_param1, &address,
2835                                 sizeof(bluetooth_device_address_t));
2836                 __bt_service_get_parameters(in_param2, &folder,
2837                                 sizeof(bt_pbap_folder_t));
2838                 __bt_service_get_parameters(in_param3, &app_param,
2839                                 sizeof(bt_pbap_pull_vcard_parameters_t));
2840
2841                 result = _bt_pbap_pull_vcard(&address, folder.addressbook,
2842                                 folder.folder_type, &app_param);
2843                 break;
2844         }
2845         case BT_PBAP_PHONEBOOK_SEARCH: {
2846                 bluetooth_device_address_t address = { {0} };
2847                 bt_pbap_folder_t folder = { 0, };
2848                 bt_pbap_search_parameters_t app_param = { 0, };
2849
2850                 __bt_service_get_parameters(in_param1, &address,
2851                                 sizeof(bluetooth_device_address_t));
2852                 __bt_service_get_parameters(in_param2, &folder,
2853                                 sizeof(bt_pbap_folder_t));
2854                 __bt_service_get_parameters(in_param3, &app_param,
2855                                 sizeof(bt_pbap_search_parameters_t));
2856
2857                 result = _bt_pbap_phonebook_search(&address, folder.addressbook,
2858                                 folder.folder_type, &app_param);
2859                 break;
2860         }
2861
2862         default:
2863                 BT_ERR("Unknown function!");
2864                 result = BLUETOOTH_ERROR_INTERNAL;
2865                 break;
2866         }
2867
2868         FN_END;
2869
2870         return result;
2871 }
2872
2873 int __bt_agent_request(int function_name,
2874                 int request_type,
2875                 int request_id,
2876                 GDBusMethodInvocation *context,
2877                 GVariant *in_param1,
2878                 GVariant *in_param2,
2879                 GVariant *in_param3,
2880                 GVariant *in_param4,
2881                 GArray **out_param1)
2882 {
2883         int result;
2884         switch (function_name) {
2885         case BT_SET_AUTHORIZATION: {
2886                 int type;
2887                 char *uuid;
2888                 char *path;
2889                 int fd;
2890
2891                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
2892                 uuid = (char *)g_variant_get_data(in_param2);
2893                 path = (char *)g_variant_get_data(in_param3);
2894                 __bt_service_get_parameters(in_param4, &fd, sizeof(int));
2895
2896                 result = _bt_register_osp_server_in_agent(type, uuid, path, fd);
2897                 break;
2898         }
2899         case BT_UNSET_AUTHORIZATION: {
2900                 int type;
2901                 char *uuid;
2902
2903                 __bt_service_get_parameters(in_param1, &type, sizeof(int));
2904                 uuid = (char *)g_variant_get_data(in_param2);
2905
2906                 result = _bt_unregister_osp_server_in_agent(type, uuid);
2907                 break;
2908         }
2909         default:
2910                 BT_ERR("Unknown function!");
2911                 result = BLUETOOTH_ERROR_INTERNAL;
2912                 break;
2913         }
2914
2915         return result;
2916 }
2917
2918 int __bt_core_request(int function_name,
2919                 int request_type,
2920                 int request_id,
2921                 GDBusMethodInvocation *context,
2922                 GVariant *in_param1)
2923 {
2924         int result;
2925
2926         switch (function_name) {
2927         case BT_ENABLE_ADAPTER:
2928         {
2929                 bt_status_t status;
2930
2931                 status = _bt_adapter_get_status();
2932
2933                 if (status == BT_ACTIVATING) {
2934                         BT_DBG("Enabling in progress");
2935                         result = BLUETOOTH_ERROR_IN_PROGRESS;
2936                 } else if (status == BT_ACTIVATED) {
2937                         BT_DBG("Already enabled");
2938                         result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
2939                 } else {
2940                         _bt_adapter_set_status(BT_ACTIVATING);
2941                         _bt_adapter_start_enable_timer();
2942                         result = BLUETOOTH_ERROR_NONE;
2943                 }
2944
2945                 break;
2946         }
2947         case BT_DISABLE_ADAPTER:
2948         {
2949                 bt_status_t status;
2950
2951                 status = _bt_adapter_get_status();
2952                 if (status == BT_DEACTIVATING) {
2953                                 BT_DBG("Disabling in progress");
2954                                 result = BLUETOOTH_ERROR_IN_PROGRESS;
2955                 } else if (status == BT_DEACTIVATED) {
2956                                 BT_DBG("Already disabled");
2957                                 result = BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2958                 } else {
2959                         _bt_adapter_set_status(BT_DEACTIVATING);
2960                         result = BLUETOOTH_ERROR_NONE;
2961                 }
2962
2963                 break;
2964         }
2965         case BT_ENABLE_ADAPTER_LE:
2966         {
2967                 bt_le_status_t le_status;
2968
2969                 le_status = _bt_adapter_get_le_status();
2970                 if (le_status == BT_LE_ACTIVATING) {
2971                         BT_DBG("Enabling in progress");
2972                         result = BLUETOOTH_ERROR_IN_PROGRESS;
2973                 } else if (le_status == BT_LE_ACTIVATED) {
2974                         BT_DBG("Already enabled");
2975                         result = BLUETOOTH_ERROR_DEVICE_ALREADY_ENABLED;
2976                 } else {
2977                         _bt_adapter_set_le_status(BT_LE_ACTIVATING);
2978                         _bt_adapter_start_le_enable_timer();
2979                         result = BLUETOOTH_ERROR_NONE;
2980                 }
2981
2982                 break;
2983         }
2984         case BT_DISABLE_ADAPTER_LE:
2985         {
2986                 bt_le_status_t le_status;
2987
2988                 le_status = _bt_adapter_get_le_status();
2989                 if (le_status == BT_LE_DEACTIVATING) {
2990                                 BT_DBG("Disabling in progress");
2991                                 result = BLUETOOTH_ERROR_IN_PROGRESS;
2992                 } else if (le_status == BT_LE_DEACTIVATED) {
2993                                 BT_DBG("Already disabled");
2994                                 result = BLUETOOTH_ERROR_DEVICE_NOT_ENABLED;
2995                 } else {
2996                         _bt_adapter_set_le_status(BT_LE_DEACTIVATING);
2997                         result = BLUETOOTH_ERROR_NONE;
2998                 }
2999
3000                 break;
3001         }
3002         default:
3003                 BT_ERR("Unknown function!");
3004                 result = BLUETOOTH_ERROR_INTERNAL;
3005                 break;
3006         }
3007
3008         return result;
3009 }
3010
3011 gboolean __bt_service_check_privilege(int function_name,
3012                                         int service_type,
3013                                         const char *unique_name)
3014 {
3015         int ret_val;
3016         gboolean result = TRUE;
3017         char *client_creds = NULL;
3018         char *user_creds = NULL;
3019         char *client_session = "";
3020         enum cynara_client_creds client_creds_method = CLIENT_METHOD_SMACK;
3021         enum cynara_user_creds user_creds_method = USER_METHOD_UID;
3022         char err_msg[256] = {0, };
3023
3024         retv_if(unique_name == NULL, FALSE);
3025         retv_if(bt_service_conn == NULL, FALSE);
3026
3027         ret_val = cynara_creds_get_default_client_method(&client_creds_method);
3028         if (ret_val != CYNARA_API_SUCCESS) {
3029                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
3030                 BT_ERR("Fail to get default client method: %s", err_msg);
3031                 return FALSE;
3032         }
3033
3034         ret_val = cynara_creds_get_default_user_method(&user_creds_method);
3035         if (ret_val != CYNARA_API_SUCCESS) {
3036                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
3037                 BT_ERR("Fail to get default user method: %s", err_msg);
3038                 return FALSE;
3039         }
3040
3041         ret_val = cynara_creds_gdbus_get_client(bt_service_conn, unique_name, client_creds_method, &client_creds);
3042         if (ret_val != CYNARA_API_SUCCESS) {
3043                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
3044                 BT_ERR("Fail to get client credential: %s", err_msg);
3045                 return FALSE;
3046         }
3047
3048         ret_val = cynara_creds_gdbus_get_user(bt_service_conn, unique_name, user_creds_method, &user_creds);
3049         if (ret_val != CYNARA_API_SUCCESS) {
3050                 cynara_strerror(ret_val, err_msg, sizeof(err_msg));
3051                 BT_ERR("Fail to get user credential: %s", err_msg);
3052                 if (client_creds)
3053                         free(client_creds);
3054                 return FALSE;
3055         }
3056
3057         BT_DBG("%s, %s, %s", unique_name, client_creds, user_creds);
3058
3059         switch (function_name) {
3060         case BT_SET_LOCAL_NAME:
3061         case BT_START_DISCOVERY:
3062         case BT_START_CUSTOM_DISCOVERY:
3063         case BT_CANCEL_DISCOVERY:
3064         case BT_OOB_ADD_REMOTE_DATA:
3065         case BT_OOB_REMOVE_REMOTE_DATA:
3066         case BT_SET_ADVERTISING:
3067         case BT_SET_CUSTOM_ADVERTISING:
3068         case BT_SET_ADVERTISING_PARAMETERS:
3069         case BT_START_LE_DISCOVERY:
3070         case BT_STOP_LE_DISCOVERY:
3071         case BT_SET_SCAN_PARAMETERS:
3072
3073         case BT_BOND_DEVICE:
3074         case BT_CANCEL_BONDING:
3075         case BT_UNBOND_DEVICE:
3076         case BT_SET_ALIAS:
3077         case BT_SET_AUTHORIZATION:
3078         case BT_UNSET_AUTHORIZATION:
3079         case BT_SEARCH_SERVICE:
3080
3081         case BT_RFCOMM_CLIENT_CONNECT:
3082         case BT_RFCOMM_CLIENT_CANCEL_CONNECT:
3083         case BT_RFCOMM_SOCKET_DISCONNECT:
3084         case BT_RFCOMM_SOCKET_WRITE:
3085         case BT_RFCOMM_CREATE_SOCKET:
3086         case BT_RFCOMM_REMOVE_SOCKET:
3087
3088         case BT_OPP_PUSH_FILES:
3089         case BT_OPP_CANCEL_PUSH:
3090         /* TODO: MAP? MAP functions, see above */
3091
3092         case BT_OBEX_SERVER_ACCEPT_CONNECTION:
3093         case BT_OBEX_SERVER_REJECT_CONNECTION:
3094         case BT_OBEX_SERVER_ACCEPT_FILE:
3095         case BT_OBEX_SERVER_REJECT_FILE:
3096         case BT_OBEX_SERVER_SET_PATH:
3097         case BT_OBEX_SERVER_SET_ROOT:
3098         case BT_OBEX_SERVER_CANCEL_TRANSFER:
3099         case BT_OBEX_SERVER_CANCEL_ALL_TRANSFERS:
3100
3101         case BT_AUDIO_CONNECT:
3102         case BT_AUDIO_DISCONNECT:
3103         case BT_AG_CONNECT:
3104         case BT_AG_DISCONNECT:
3105         case BT_AV_CONNECT:
3106         case BT_AV_DISCONNECT:
3107         case BT_AV_SOURCE_CONNECT:
3108         case BT_AV_SOURCE_DISCONNECT:
3109         case BT_AVRCP_CONTROL_CONNECT:
3110         case BT_AVRCP_CONTROL_DISCONNECT:
3111         case BT_AVRCP_HANDLE_CONTROL:
3112         case BT_AVRCP_SET_TRACK_INFO:
3113         case BT_AVRCP_SET_PROPERTY:
3114         case BT_AVRCP_SET_PROPERTIES:
3115         case BT_AVRCP_CONTROL_SET_PROPERTY:
3116
3117         case BT_HF_CONNECT:
3118         case BT_HF_DISCONNECT:
3119
3120         case BT_HID_CONNECT:
3121         case BT_HID_DISCONNECT:
3122
3123         case BT_HID_DEVICE_ACTIVATE:
3124         case BT_HID_DEVICE_DEACTIVATE:
3125         case BT_HID_DEVICE_CONNECT:
3126         case BT_HID_DEVICE_DISCONNECT:
3127         case BT_HID_DEVICE_SEND_MOUSE_EVENT:
3128         case BT_HID_DEVICE_SEND_KEY_EVENT:
3129         case BT_HID_DEVICE_SEND_REPLY_TO_REPORT:
3130         case BT_HID_DEVICE_SEND_CUSTOM_EVENT:
3131
3132         case BT_CONNECT_LE:
3133         case BT_DISCONNECT_LE:
3134
3135         case BT_SET_ADVERTISING_DATA:
3136         case BT_SET_SCAN_RESPONSE_DATA:
3137
3138         case BT_HDP_CONNECT:
3139         case BT_HDP_DISCONNECT:
3140         case BT_HDP_SEND_DATA:
3141         case BT_HDP_REGISTER_SINK_APP:
3142         case BT_HDP_UNREGISTER_SINK_APP:
3143
3144         case BT_DPM_SET_ALLOW_BT_MODE:
3145         case BT_DPM_GET_ALLOW_BT_MODE:
3146         case BT_DPM_SET_DEVICE_RESTRITION:
3147         case BT_DPM_GET_DEVICE_RESTRITION:
3148         case BT_DPM_SET_UUID_RESTRITION:
3149         case BT_DPM_GET_UUID_RESTRITION:
3150         case BT_DPM_ADD_DEVICES_BLACKLIST:
3151         case BT_DPM_ADD_DEVICES_WHITELIST:
3152         case BT_DPM_ADD_UUIDS_BLACKLIST:
3153         case BT_DPM_ADD_UUIDS_WHITELIST:
3154         case BT_DPM_CLEAR_DEVICES_BLACKLIST:
3155         case BT_DPM_CLEAR_DEVICES_WHITELIST:
3156         case BT_DPM_CLEAR_UUIDS_BLACKLIST:
3157         case BT_DPM_CLEAR_UUIDS_WHITELIST:
3158         case BT_DPM_REMOVE_DEVICE_BLACKLIST:
3159         case BT_DPM_REMOVE_DEVICE_WHITELIST:
3160         case BT_DPM_REMOVE_UUID_BLACKLIST:
3161         case BT_DPM_REMOVE_UUID_WHITELIST:
3162         case BT_DPM_GET_DEVICES_BLACKLIST:
3163         case BT_DPM_GET_DEVICES_WHITELIST:
3164         case BT_DPM_GET_UUIDS_BLACKLIST:
3165         case BT_DPM_GET_UUIDS_WHITELIST:
3166         case BT_DPM_SET_ALLOW_OUTGOING_CALL:
3167         case BT_DPM_GET_ALLOW_OUTGOING_CALL:
3168         case BT_DPM_SET_PAIRING_STATE:
3169         case BT_DPM_GET_PAIRING_STATE:
3170         case BT_DPM_SET_PROFILE_STATE:
3171         case BT_DPM_GET_PROFILE_STATE:
3172         case BT_DPM_SET_DESKROP_CONNECTIVITY_STATE:
3173         case BT_DPM_GET_DESKROP_CONNECTIVITY_STATE:
3174         case BT_DPM_SET_DISCOVERABLE_STATE:
3175         case BT_DPM_GET_DISCOVERABLE_STATE:
3176         case BT_DPM_SET_LIMITED_DISCOVERABLE_STATE:
3177         case BT_DPM_GET_LIMITED_DISCOVERABLE_STATE:
3178         case BT_DPM_SET_DATA_TRANSFER_STATE:
3179         case BT_DPM_GET_DATA_TRANSFER_STATE:
3180
3181         case BT_NETWORK_ACTIVATE:
3182         case BT_NETWORK_DEACTIVATE:
3183         case BT_NETWORK_CONNECT:
3184         case BT_NETWORK_DISCONNECT:
3185         case BT_NETWORK_SERVER_DISCONNECT:
3186
3187         case BT_GATT_GET_PRIMARY_SERVICES:
3188         case BT_GATT_DISCOVER_CHARACTERISTICS:
3189         case BT_GATT_SET_PROPERTY_REQUEST:
3190         case BT_GATT_READ_CHARACTERISTIC:
3191         case BT_GATT_DISCOVER_CHARACTERISTICS_DESCRIPTOR:
3192         case BT_GATT_REGISTER_APPLICATION:
3193         case BT_GATT_REGISTER_SERVICE:
3194         case BT_GATT_SEND_RESPONSE:
3195
3196         case BT_PBAP_CONNECT:
3197         case BT_PBAP_DISCONNECT:
3198         case BT_PBAP_GET_PHONEBOOK_SIZE:
3199         case BT_PBAP_GET_PHONEBOOK:
3200         case BT_PBAP_GET_LIST:
3201         case BT_PBAP_PULL_VCARD:
3202         case BT_PBAP_PHONEBOOK_SEARCH:
3203         case BT_AUDIO_SELECT_ROLE:
3204
3205         ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3206                                                 BT_PRIVILEGE_PUBLIC);
3207
3208         if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3209                 BT_ERR("Fail to access: %s", BT_PRIVILEGE_PUBLIC);
3210                 result = FALSE;
3211         }
3212
3213         /* Need to check mediastorage privilege */
3214         if (function_name == BT_PBAP_GET_PHONEBOOK ||
3215                 function_name == BT_PBAP_PULL_VCARD) {
3216                 ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3217                                                         MEDIASTORAGE_PRIVILEGE);
3218
3219                 if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3220                 BT_ERR("Fail to access: %s", MEDIASTORAGE_PRIVILEGE);
3221                 result = FALSE;
3222                 }
3223         }
3224         break;
3225
3226         case BT_ENABLE_ADAPTER:
3227         case BT_DISABLE_ADAPTER:
3228         case BT_RESET_ADAPTER:
3229         case BT_RECOVER_ADAPTER:
3230         case BT_ENABLE_ADAPTER_LE:
3231         case BT_DISABLE_ADAPTER_LE:
3232         case BT_SET_CONNECTABLE:
3233         case BT_SET_DISCOVERABLE_MODE:
3234         case BT_ADD_WHITE_LIST:
3235         case BT_REMOVE_WHITE_LIST:
3236         case BT_CLEAR_WHITE_LIST:
3237         case BT_SET_MANUFACTURER_DATA:
3238
3239         case BT_CANCEL_SEARCH_SERVICE:
3240         case BT_ENABLE_RSSI:
3241
3242         case BT_RFCOMM_ACCEPT_CONNECTION:
3243         case BT_RFCOMM_REJECT_CONNECTION:
3244         case BT_RFCOMM_LISTEN:
3245
3246         case BT_HID_ENABLE_BARCODE_FEATURE:
3247
3248         case BT_AVRCP_CONTROL_GET_PROPERTY:
3249         case BT_AVRCP_GET_TRACK_INFO:
3250         case BT_AVRCP_TRANSPORT_SET_PROPERTY:
3251
3252
3253         case BT_SET_CONTENT_PROTECT:
3254         case BT_BOND_DEVICE_BY_TYPE:
3255         case BT_SET_LE_PRIVACY:
3256         case BT_SET_LE_STATIC_RANDOM_ADDRESS:
3257         case BT_LE_CONN_UPDATE:
3258         case BT_UPDATE_LE_CONNECTION_MODE:
3259         case BT_REQ_ATT_MTU:
3260         case BT_GET_DEVICE_IDA:
3261         case BT_LE_READ_MAXIMUM_DATA_LENGTH:
3262         case BT_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH:
3263         case BT_LE_READ_HOST_SUGGESTED_DATA_LENGTH:
3264         case BT_LE_SET_DATA_LENGTH:
3265
3266         case BT_GET_ATT_MTU:
3267
3268         case BT_LE_IPSP_INIT:
3269         case BT_LE_IPSP_DEINIT:
3270         case BT_LE_IPSP_CONNECT:
3271         case BT_LE_IPSP_DISCONNECT:
3272         case BT_PXP_MONITOR_SET_PROPERTY:
3273         case BT_PXP_MONITOR_GET_PROPERTY:
3274         case BT_PXP_MONITOR_GET_SUPPORTED_SERIVCES:
3275         case BT_PXP_REPORTER_REGISTER:
3276         case BT_PXP_REPORTER_UNREGISTER:
3277         case BT_PXP_REPORTER_GET_PROPERTY:
3278
3279         /* TDS */
3280         case BT_TDS_PROVIDER_REGISTER:
3281         case BT_TDS_PROVIDER_UNREGISTER:
3282         case BT_TDS_PROVIDER_SET_MANUF_DATA:
3283         case BT_TDS_PROVIDER_CREATE:
3284         case BT_TDS_PROVIDER_DESTROY:
3285         case BT_TDS_PROVIDER_SET_TRANSPORT_DATA:
3286         case BT_TDS_SEND_ACTIVATION_RESPONSE:
3287         case BT_TDS_READ_TRANSPORT_DATA:
3288         case BT_TDS_ENABLE_CONTROL_POINT:
3289         case BT_TDS_ACTIVATE_CONTROL_POINT:
3290
3291         /* OTP Server */
3292         case BT_OTP_SERVER_INIT:
3293         case BT_OTP_SERVER_DEINIT:
3294         case BT_OTP_READ_VALUE:
3295         case BT_OTP_ENABLE_NOTIFICATION:
3296         case BT_OTP_WRITE_VALUE:
3297         case BT_LE_OTC_CONNECT:
3298         case BT_LE_OTC_DISCONNECT:
3299
3300         case BT_MAP_CREATE_SESSION:
3301         case BT_MAP_DESTROY_SESSION:
3302         case BT_MAP_SET_FOLDER:
3303         case BT_MAP_LIST_FOLDERS:
3304         case BT_MAP_LIST_FILTER_FIELDS:
3305         case BT_MAP_LIST_MESSAGES:
3306         case BT_MAP_UPDATE_INBOX:
3307         case BT_MAP_PUSH_MESSAGE:
3308         case BT_MAP_GET_MESSAGE:
3309
3310         ret_val = cynara_check(p_cynara, client_creds, client_session, user_creds,
3311                                 BT_PRIVILEGE_PLATFORM);
3312
3313         if (ret_val != CYNARA_API_ACCESS_ALLOWED) {
3314                 BT_ERR("Fail to access: %s", BT_PRIVILEGE_PLATFORM);
3315                 result = FALSE;
3316         }
3317         break;
3318
3319         case BT_CHECK_ADAPTER:
3320         case BT_GET_RSSI:
3321
3322         case BT_GET_LOCAL_NAME:
3323         case BT_GET_LOCAL_ADDRESS:
3324         case BT_GET_LOCAL_VERSION:
3325         case BT_IS_SERVICE_USED:
3326         case BT_GET_DISCOVERABLE_MODE:
3327         case BT_GET_DISCOVERABLE_TIME:
3328         case BT_IS_DISCOVERYING:
3329         case BT_IS_LE_DISCOVERYING:
3330         case BT_IS_CONNECTABLE:
3331         case BT_GET_BONDED_DEVICES:
3332         case BT_GET_PROFILE_CONNECTED_DEVICES:
3333         case BT_GET_BONDED_DEVICE:
3334         case BT_PASSKEY_REPLY:
3335         case BT_PASSKEY_CONFIRMATION_REPLY:
3336         case BT_GET_IS_ALIAS_SET:
3337         case BT_IS_DEVICE_CONNECTED:
3338         case BT_GET_CONNECTED_LINK_TYPE:
3339         case BT_SET_PROFILE_TRUSTED:
3340         case BT_GET_PROFILE_TRUSTED:
3341         case BT_GET_SPEAKER_GAIN:
3342         case BT_SET_SPEAKER_GAIN:
3343         case BT_OOB_READ_LOCAL_DATA:
3344         case BT_RFCOMM_CLIENT_IS_CONNECTED:
3345         case BT_RFCOMM_IS_UUID_AVAILABLE:
3346         case BT_GET_ADVERTISING_DATA:
3347         case BT_GET_SCAN_RESPONSE_DATA:
3348         case BT_IS_ADVERTISING:
3349         case BT_REGISTER_SCAN_FILTER:
3350         case BT_UNREGISTER_SCAN_FILTER:
3351         case BT_UNREGISTER_ALL_SCAN_FILTERS:
3352         case BT_IS_SCAN_FILTER_SUPPORTED:
3353
3354         case BT_OBEX_SERVER_ALLOCATE:
3355         case BT_OBEX_SERVER_DEALLOCATE:
3356         case BT_OBEX_SERVER_IS_ACTIVATED:
3357         case BT_OPP_GET_TRANSFER_PROGRESS:
3358                 /* Non-privilege control */
3359                 break;
3360         default:
3361                 BT_ERR("Unknown function!");
3362                 result = FALSE;
3363                 break;
3364         }
3365
3366         if (client_creds)
3367                 free(client_creds);
3368
3369         if (user_creds)
3370                 free(user_creds);
3371
3372         return result;
3373 }
3374
3375 GDBusNodeInfo *__bt_service_create_method_node_info
3376                                         (const gchar *introspection_data)
3377 {
3378         GError *err = NULL;
3379         GDBusNodeInfo *node_info = NULL;
3380
3381         if (introspection_data == NULL) {
3382                 ERR("Introspection XML not present");
3383                 return NULL;
3384         }
3385
3386         node_info = g_dbus_node_info_new_for_xml(introspection_data, &err);
3387
3388         if (err) {
3389                 ERR("Unable to create node: %s", err->message);
3390                 g_clear_error(&err);
3391         }
3392         return node_info;
3393 }
3394
3395 int __bt_service_register_object(GDBusConnection *conn,
3396                 GDBusNodeInfo *node_info, gboolean reg)
3397 {
3398         static guint service_id = 0;
3399         GError *error = NULL;
3400
3401         if (reg) {
3402                 if (node_info == NULL)
3403                         return -1;
3404
3405                 service_id = g_dbus_connection_register_object(conn,
3406                                 BT_SERVICE_PATH,
3407                                 node_info->interfaces[0],
3408                                 &method_table,
3409                                 NULL, NULL, &error);
3410                 if (service_id == 0)
3411                         return -1;
3412         } else {
3413                 if (service_id > 0) {
3414                         g_dbus_connection_unregister_object(conn,
3415                                         service_id);
3416                         service_id = 0;
3417                 }
3418         }
3419
3420         return 0;
3421 }
3422
3423 static void __bt_service_bus_acquired_handler(GDBusConnection *connection,
3424                 const gchar *name, gpointer user_data)
3425 {
3426         GDBusNodeInfo *node_info = NULL;
3427
3428         BT_INFO("bus acquired");
3429
3430         ret_if(connection == NULL);
3431
3432         node_info = __bt_service_create_method_node_info(
3433                         bt_service_introspection_xml);
3434         ret_if(node_info == NULL);
3435
3436         __bt_service_register_object(connection, node_info, TRUE);
3437         g_dbus_node_info_unref(node_info);
3438
3439         bt_service_conn = connection;
3440 }
3441
3442 static void __bt_service_name_acquired_handler(GDBusConnection *connection,
3443                 const gchar *name, gpointer user_data)
3444 {
3445         BT_INFO("name acquired");
3446         name_acquired = TRUE;
3447 }
3448
3449 static void __bt_service_name_lost_handler(GDBusConnection *connection,
3450                 const gchar *name, gpointer user_data)
3451 {
3452         BT_INFO("name lost");
3453         name_acquired = FALSE;
3454 }
3455
3456 gboolean _is_name_acquired(void)
3457 {
3458         return name_acquired;
3459 }
3460
3461 int _bt_service_register(void)
3462 {
3463         GDBusConnection *conn;
3464         GError *err = NULL;
3465
3466         conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
3467         retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
3468         bt_service_conn = conn;
3469
3470         owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
3471                                 BT_SERVICE_NAME,
3472                                 G_BUS_NAME_OWNER_FLAGS_NONE,
3473                                 __bt_service_bus_acquired_handler,
3474                                 __bt_service_name_acquired_handler,
3475                                 __bt_service_name_lost_handler,
3476                                 NULL, NULL);
3477         BT_DBG("owner_id is [%d]", owner_id);
3478         if (owner_id == 0)
3479                 goto fail;
3480
3481         return BLUETOOTH_ERROR_NONE;
3482
3483 fail:
3484         if (bt_service_conn) {
3485                 g_object_unref(bt_service_conn);
3486                 bt_service_conn = NULL;
3487         }
3488
3489         return BLUETOOTH_ERROR_INTERNAL;
3490 }
3491
3492 void _bt_service_unregister(void)
3493 {
3494         if (bt_service_conn) {
3495                 __bt_service_register_object(bt_service_conn, NULL, FALSE);
3496                 if (bt_service_conn) {
3497                         g_object_unref(bt_service_conn);
3498                         bt_service_conn = NULL;
3499                 }
3500                 if (owner_id > 0) {
3501                         g_bus_unown_name(owner_id);
3502                         owner_id = 0;
3503                 }
3504         }
3505 }
3506
3507 int _bt_service_cynara_init(void)
3508 {
3509         int result;
3510         char err_msg[256] = {0, };
3511
3512         retv_if(p_cynara != NULL, BLUETOOTH_ERROR_ALREADY_INITIALIZED);
3513
3514         result = cynara_initialize(&p_cynara, conf);
3515
3516         if (result != CYNARA_API_SUCCESS) {
3517                 cynara_strerror(result, err_msg, sizeof(err_msg));
3518                 BT_ERR("Fail to initialize cynara: [%s]", err_msg);
3519                 return BLUETOOTH_ERROR_INTERNAL;
3520         }
3521
3522         return BLUETOOTH_ERROR_NONE;
3523 }
3524
3525 void _bt_service_cynara_deinit(void)
3526 {
3527         int result;
3528         char err_msg[256] = {0, };
3529
3530         ret_if(p_cynara == NULL);
3531
3532         result = cynara_finish(p_cynara);
3533
3534         if (result != CYNARA_API_SUCCESS) {
3535                 cynara_strerror(result, err_msg, sizeof(err_msg));
3536                 BT_ERR("Fail to finish cynara: [%s]", err_msg);
3537                 return;
3538         }
3539
3540         p_cynara = NULL;
3541         conf = NULL;
3542 }
3543