initial MAP stub implementation 43/102843/2
authorPiotr Dabrowski <p.dabrowski2@samsung.com>
Mon, 17 Oct 2016 08:25:12 +0000 (10:25 +0200)
committerPyun DoHyun <dh79.pyun@samsung.com>
Thu, 8 Dec 2016 00:17:51 +0000 (16:17 -0800)
Change-Id: Ic23c297cb65b69d05b2ec63ef3db414504ec3014

24 files changed:
bt-api/CMakeLists.txt
bt-api/bt-dpm.c
bt-api/bt-event-handler.c
bt-api/bt-map-client.c [new file with mode: 0644]
bt-api/bt-request-sender.c
bt-api/include/bt-common.h
bt-api/include/bt-dpm.h
bt-service-emul/CMakeLists.txt
bt-service-emul/bt-request-handler.c
bt-service-emul/bt-service-event-sender.c
bt-service-emul/include/bt-service-common.h
bt-service/CMakeLists.txt
bt-service/bt-request-handler.c
bt-service/bt-service-adapter.c
bt-service/bt-service-agent.c
bt-service/bt-service-event-receiver.c
bt-service/bt-service-event-sender.c
bt-service/bt-service-headset-connection.c
bt-service/bt-service-map-client.c [new file with mode: 0644]
bt-service/include/bt-service-common.h
bt-service/include/bt-service-event.h
bt-service/include/bt-service-map-client.h [new file with mode: 0644]
include/bluetooth-api.h
include/bt-internal-types.h

index d2805d0..f649697 100644 (file)
@@ -14,6 +14,7 @@ bt-hdp.c
 bt-avrcp.c
 bt-telephony.c
 bt-opp-client.c
+bt-map-client.c
 bt-obex-server.c
 bt-rfcomm-client.c
 bt-rfcomm-server.c
index bbf4d6c..3c78062 100644 (file)
@@ -154,6 +154,7 @@ static bt_dpm_status_e _bt_check_dpm_blacklist_uuid(char *uuid)
                bluetooth_dpm_get_data_transfer_state(&dpm_status);
                return (dpm_status == BLUETOOTH_DPM_RESTRICTED ? BT_DPM_RESTRICTED : BT_DPM_ALLOWED);
        }
+       /* TODO: MAP? see above */
 
        /* ++ check MDM profile restriction ++ */
        if (g_strcmp0(BT_A2DP_UUID, uuid) == 0)
@@ -182,6 +183,7 @@ static bt_dpm_status_e _bt_check_dpm_transfer_restriction(void)
        bt_dpm_status_t dpm_value = BLUETOOTH_DPM_ALLOWED;
 
        dpm_status = _bt_check_dpm_blacklist_uuid(BT_OPP_UUID);
+       /* TODO: MAP? see above */
 
        if (dpm_status == BT_DPM_NO_SERVICE || dpm_status == BT_DPM_RESTRICTED)
                return dpm_status;
@@ -273,6 +275,7 @@ int _bt_check_dpm(int service, void *param)
        case BT_DPM_OPP:
                status = _bt_check_dpm_transfer_restriction();
                break;
+       /* TODO: MAP? see above */
        case BT_DPM_HSP:
                status = _bt_check_dpm_hsp_restriction();
                break;
index b861402..4d0d21a 100644 (file)
@@ -1975,6 +1975,77 @@ void __bt_opp_server_event_filter(GDBusConnection *connection,
        }
 }
 
+void __bt_map_client_event_filter(GDBusConnection *connection,
+                                                const gchar *sender_name,
+                                                const gchar *object_path,
+                                                const gchar *interface_name,
+                                                const gchar *signal_name,
+                                                GVariant *parameters,
+                                                gpointer user_data)
+{
+       bt_event_info_t *event_info;
+       int result = BLUETOOTH_ERROR_NONE;
+       event_info = (bt_event_info_t *)user_data;
+       ret_if(event_info == NULL);
+
+       if (strcasecmp(object_path, BT_MAP_CLIENT_PATH) != 0)
+               return;
+       if (strcasecmp(interface_name, BT_EVENT_SERVICE) != 0)
+               return;
+
+       ret_if(signal_name == NULL);
+
+       if (strcasecmp(signal_name, BT_MAP_CONNECTED) == 0) {
+               const char *address = NULL;
+               int request_id = 0;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               g_variant_get(parameters, "(i&si)", &result,
+                                               &address, &request_id);
+
+               if (__bt_is_request_id_exist(request_id) == FALSE) {
+                       BT_ERR("Different request id!");
+                       return;
+               }
+
+               _bt_convert_addr_string_to_type(dev_address.addr,
+                                               address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_MAP_CONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+
+               if (result != BLUETOOTH_ERROR_NONE) {
+                       __bt_remove_push_request_id(request_id);
+               }
+       } else if (strcasecmp(signal_name, BT_MAP_DISCONNECTED) == 0) {
+               const char *address = NULL;
+               int request_id = 0;
+               bluetooth_device_address_t dev_address = { {0} };
+
+               g_variant_get(parameters, "(i&si)", &result, &address,
+                                                       &request_id);
+
+               if (__bt_is_request_id_exist(request_id) == FALSE) {
+                       BT_ERR("Different request id!");
+                       return;
+               }
+
+               _bt_convert_addr_string_to_type(dev_address.addr,
+                                               address);
+
+               _bt_common_event_cb(BLUETOOTH_EVENT_MAP_DISCONNECTED,
+                               result, &dev_address,
+                               event_info->cb, event_info->user_data);
+
+               __bt_remove_push_request_id(request_id);
+       } else if (strcasecmp(signal_name, BT_MAP_OP_COMPLETE) == 0) {
+
+               /* TODO: MAP, see __bt_opp_client_event_filter above */
+
+       }
+}
+
 void __bt_pbap_client_event_filter(GDBusConnection *connection,
                                                 const gchar *sender_name,
                                                 const gchar *object_path,
@@ -2730,6 +2801,10 @@ int _bt_register_event(int event_type, void *event_cb, void *user_data)
                event_func = __bt_opp_server_event_filter;
                path = BT_OPP_SERVER_PATH;
                break;
+       case BT_MAP_CLIENT_EVENT:
+               event_func = __bt_map_client_event_filter;
+               path = BT_MAP_CLIENT_PATH;
+               break;
        case BT_PBAP_CLIENT_EVENT:
                event_func = __bt_pbap_client_event_filter;
                path = BT_PBAP_CLIENT_PATH;
diff --git a/bt-api/bt-map-client.c b/bt-api/bt-map-client.c
new file mode 100644 (file)
index 0000000..32bfebe
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <string.h>
+
+#include "bluetooth-api.h"
+#include "bt-internal-types.h"
+
+#include "bt-common.h"
+#include "bt-request-sender.h"
+#include "bt-event-handler.h"
+
+#ifdef TIZEN_DPM_ENABLE
+#include "bt-dpm.h"
+#endif
+
+BT_EXPORT_API int bluetooth_map_init(void)
+{
+       bt_user_info_t *user_info;
+
+       user_info = _bt_get_user_data(BT_COMMON);
+       retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       return _bt_register_event(BT_MAP_CLIENT_EVENT, user_info->cb, user_info->user_data);
+}
+
+BT_EXPORT_API int bluetooth_map_deinit(void)
+{
+       return _bt_unregister_event(BT_MAP_CLIENT_EVENT);
+}
+
+/* TODO: MAP API */
index 5f1ace5..df4812c 100644 (file)
@@ -316,6 +316,9 @@ static void __send_request_cb(GDBusProxy *proxy,
                                BT_DBG("request_id : %d", request_id);
                                _bt_add_push_request_id(request_id);
                        }
+                       if (cb_data->service_function == BT_MAP_111) {
+                               /* TODO: MAP service functions */
+                       }
 
                        goto done;
                }
index b863d34..6f476a7 100644 (file)
@@ -274,6 +274,9 @@ void _bt_avrcp_event_cb(int event, int result, void *param,
 void _bt_opp_client_event_cb(int event, int result, void *param,
                                        void *callback, void *user_data);
 
+void _bt_map_client_event_cb(int event, int result, void *param,
+                                       void *callback, void *user_data);
+
 void _bt_divide_device_class(bluetooth_device_class_t *device_class,
                                unsigned int cod);
 
index ae64f97..6750506 100644 (file)
@@ -45,6 +45,7 @@ typedef enum {
        BT_DPM_A2DP,
        BT_DPM_AVRCP,
        BT_DPM_SPP,
+       /* TODO: MAP? see above */
 } bt_dpm_service_e;
 
 int _bt_check_dpm(int service, void *param);
index e4f7299..8bcfd8b 100644 (file)
@@ -16,6 +16,7 @@ bt-service-network.c
 bt-service-audio.c
 bt-service-oob.c
 bt-service-opp-client.c
+bt-service-map-client.c
 bt-service-obex-server.c
 bt-service-rfcomm-client.c
 bt-service-rfcomm-server.c
index 9b2443d..27fac6c 100644 (file)
@@ -36,6 +36,7 @@
 #include "bt-service-avrcp.h"
 #include "bt-service-avrcp-controller.h"
 #include "bt-service-opp-client.h"
+#include "bt-service-map-client.h"
 #include "bt-service-obex-server.h"
 #include "bt-service-rfcomm-client.h"
 #include "bt-service-rfcomm-server.h"
@@ -260,6 +261,7 @@ static void __bt_service_method(GDBusConnection *connection,
                                out_param1 = NULL;
                        }
                }
+               /* TODO: MAP? see the if{}else{} above */
 
                g_variant_unref(param1);
                g_variant_unref(param2);
@@ -2029,6 +2031,7 @@ int __bt_obexd_request(int function_name,
                                sizeof(gboolean));
                break;
        }
+       /* TODO: MAP? MAP functions, see above */
        case BT_OBEX_SERVER_ALLOCATE: {
                int app_pid;
                gboolean is_native;
@@ -2467,6 +2470,7 @@ gboolean __bt_service_check_privilege(int function_name,
 
        case BT_OPP_PUSH_FILES:
        case BT_OPP_CANCEL_PUSH:
+       /* TODO: MAP? MAP functions, see above */
 
        case BT_OBEX_SERVER_ACCEPT_CONNECTION:
        case BT_OBEX_SERVER_REJECT_CONNECTION:
index 101f8ac..582f9ff 100644 (file)
@@ -68,6 +68,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BT_OPP_SERVER_EVENT:
                path = BT_OPP_SERVER_PATH;
                break;
+       case BT_MAP_CLIENT_EVENT:
+               path = BT_MAP_CLIENT_PATH;
+               break;
        case BT_PBAP_CLIENT_EVENT:
                path = BT_PBAP_CLIENT_PATH;
                break;
@@ -264,6 +267,14 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_OPP_DISCONNECTED;
                BT_INFO_C("Disconnected [OPP]");
                break;
+       case BLUETOOTH_EVENT_MAP_CONNECTED:
+               signal = BT_MAP_CONNECTED;
+               BT_INFO_C("Connected [MAP]");
+               break;
+       case BLUETOOTH_EVENT_MAP_DISCONNECTED:
+               signal = BT_MAP_DISCONNECTED;
+               BT_INFO_C("Disconnected [MAP]");
+               break;
        case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED:
                signal = BT_TRANSFER_CONNECTED;
                break;
index 4cc3b73..2e197e6 100644 (file)
@@ -219,6 +219,7 @@ extern "C" {
 #define PBAP_UUID               "0000112f-0000-1000-8000-00805f9b34fb"
 
 #define OBEX_OPP_UUID                  "00001105-0000-1000-8000-00805f9b34fb"
+#define OBEX_MAP_UUID                  "00001134-0000-1000-8000-00805f9b34fb"
 #define OBEX_PSE_UUID                  "0000112f-0000-1000-8000-00805f9b34fb"
 
 #define GATT_UUID                              "00001801-0000-1000-8000-00805f9b34fb"
index c0f0abc..8318ee8 100644 (file)
@@ -18,6 +18,7 @@ bt-service-audio.c
 bt-service-oob.c
 bt-service-obex-agent.c
 bt-service-opp-client.c
+bt-service-map-client.c
 bt-service-obex-server.c
 bt-service-rfcomm-client.c
 bt-service-rfcomm-server.c
index 90d706b..026fea6 100644 (file)
@@ -36,6 +36,7 @@
 #include "bt-service-avrcp.h"
 #include "bt-service-avrcp-controller.h"
 #include "bt-service-opp-client.h"
+#include "bt-service-map-client.h"
 #include "bt-service-obex-server.h"
 #include "bt-service-rfcomm-client.h"
 #include "bt-service-rfcomm-server.h"
@@ -263,6 +264,7 @@ static void __bt_service_method(GDBusConnection *connection,
                                out_param1 = NULL;
                        }
                }
+               /* TODO: MAP? see the if{}else{} above */
 
                g_variant_unref(param1);
                g_variant_unref(param2);
@@ -2257,6 +2259,7 @@ int __bt_obexd_request(int function_name,
 
                break;
        }
+       /* TODO: MAP? MAP functions, see above */
        case BT_OBEX_SERVER_ALLOCATE: {
                int app_pid;
                gboolean is_native;
@@ -2697,6 +2700,7 @@ gboolean __bt_service_check_privilege(int function_name,
 
        case BT_OPP_PUSH_FILES:
        case BT_OPP_CANCEL_PUSH:
+       /* TODO: MAP? MAP functions, see above */
 
        case BT_OBEX_SERVER_ACCEPT_CONNECTION:
        case BT_OBEX_SERVER_REJECT_CONNECTION:
index 0b752d6..27300e0 100644 (file)
@@ -37,6 +37,7 @@
 #include "bt-service-network.h"
 #include "bt-service-obex-server.h"
 #include "bt-service-opp-client.h"
+#include "bt-service-map-client.h"
 #include "bt-service-agent.h"
 #include "bt-service-main.h"
 #include "bt-service-avrcp.h"
index c7f181b..b3cb43a 100644 (file)
@@ -717,6 +717,7 @@ fail:
 
                goto done;
        }
+       /* TODO: MAP? see above */
 
        if (_gap_agent_exist_osp_server(agent, BT_RFCOMM_SERVER,
                                        (char *)uuid) == TRUE) {
@@ -740,6 +741,7 @@ fail:
                request_type = BT_AGENT_EVENT_PBAP_REQUEST;
        else if (!strcasecmp(uuid, MAP_UUID))
                request_type = BT_AGENT_EVENT_MAP_REQUEST;
+       /* TODO: MAP is already here */
 
        if (trust) {
                BT_INFO("Trusted device, so authorize\n");
index 374585d..ccad244 100644 (file)
@@ -42,6 +42,7 @@
 #include "bt-service-proximity.h"
 
 #include "bt-service-opp-client.h"
+#include "bt-service-map-client.h"
 
 #ifdef TIZEN_FEATURE_BT_DPM
 #include "bt-service-dpm.h"
@@ -51,6 +52,7 @@
 static GDBusConnection *manager_conn;
 static GDBusConnection *obexd_conn;
 static GDBusConnection *opc_obexd_conn;
+static GDBusConnection *map_obexd_conn;
 
 static GList *p_cache_list = NULL;
 
@@ -77,13 +79,16 @@ typedef enum {
        OBEX_PCSUITE = (1 << 6),
        OBEX_SYNCEVOLUTION = (1 << 7),
        OBEX_MAS = (1 << 8),
+       OBEX_MAP = (1 << 9),
 } bluetooth_obex_connection_type_t;
 
 void _bt_handle_property_changed_event(GVariant *msg, const char *object_path);
 void _bt_opc_property_changed_event(GVariant *msg, char *path);
+void _bt_map_property_changed_event(GVariant *msg, char *path); /* TODO: MAP, do we need this? */
 int _bt_register_service_event(GDBusConnection *g_conn, int event_type);
 void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type);
 void _bt_opp_client_event_deinit(void);
+void _bt_map_client_event_deinit(void);
 void _bt_handle_network_client_event(GVariant *msg_iter,
                                const char *path);
 void __bt_gatt_char_property_changed_event(GVariant *msg_iter,
@@ -889,6 +894,7 @@ static void __bt_obex_property_changed_event(GVariant *msg, const char *path)
 
                        _bt_obex_transfer_progress(path, transferred);
                }
+               /* TODO: MAP, "Complete"? see above */
                g_free(property);
                g_variant_unref(val);
                g_variant_unref(child);
@@ -1458,6 +1464,18 @@ void _bt_opc_property_changed_event(GVariant *msg, char *path)
 }
 
 
+void __bt_map_property_changed_event(GVariant *msg,
+                                               const char *path)
+{
+       /* TODO: MAP, do we need this? see above */
+}
+
+void _bt_map_property_changed_event(GVariant *msg, char *path)
+{
+       /* TODO: MAP, do we need this? see above */
+}
+
+
 void _bt_handle_input_event(GVariant *msg, const char *path)
 {
        int result = BLUETOOTH_ERROR_NONE;
@@ -1923,6 +1941,7 @@ void _bt_handle_device_event(GVariant *msg, const char *member, const char *path
                        _bt_opp_client_is_sending(&sending);
                        if (sending == TRUE)
                                _bt_opp_client_check_pending_transfer(address);
+                       /* TODO: MAP? see above */
                }
                param = g_variant_new("(isy)", result, address, addr_type);
                _bt_send_event(BT_DEVICE_EVENT,
@@ -2557,6 +2576,7 @@ void _bt_handle_agent_event(GVariant *msg, const char *member)
                _bt_send_event(BT_OPP_SERVER_EVENT,
                        BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE,
                        param);
+               /* TODO: MAP? see above */
                g_free(address);
                g_free(name);
        } else if (strcasecmp(member, "RfcommAuthorize") == 0) {
@@ -2896,6 +2916,7 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
                BT_INFO("object_path = [%s]", obj_path);
 
                /*Handle OPP_SERVER_CONNECTED_EVENT here */
+               /* TODO: MAP? see above */
                if (strncmp(obj_path, BT_SESSION_BASEPATH_SERVER,
                                strlen(BT_SESSION_BASEPATH_SERVER)) != 0) {
                        g_free(obj_path);
@@ -2909,6 +2930,7 @@ static  void __bt_obexd_event_filter(GDBusConnection *connection,
                g_free(obj_path);
        } else if (strcasecmp(member, "InterfacesRemoved") == 0) {
                /*Handle OPP_SERVER_DISCONNECTED_EVENT here */
+               /* TODO: MAP? see above */
                if (__bt_get_object_path(parameters, &obj_path)) {
                        BT_ERR("Fail to get the path");
                        return;
@@ -3059,6 +3081,53 @@ void _bt_opp_client_event_deinit(void)
        }
 }
 
+static  void __bt_map_event_filter(GDBusConnection *connection,
+                                       const gchar *sender_name,
+                                       const gchar *object_path,
+                                       const gchar *interface_name,
+                                       const gchar *signal_name,
+                                       GVariant *parameters,
+                                       gpointer user_data)
+{
+       /* TODO: MAP, do we need this here? see above */
+}
+
+int _bt_map_client_event_init(void)
+{
+       GError *error = NULL;
+
+       if (map_obexd_conn == NULL) {
+               map_obexd_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
+
+               if (!map_obexd_conn) {
+                       if (error) {
+                               BT_ERR("Unable to connect to dbus: %s", error->message);
+                               g_clear_error(&error);
+                       }
+               return BLUETOOTH_ERROR_INTERNAL;
+               }
+       }
+
+       if (_bt_register_service_event(map_obexd_conn,
+                       BT_MAP_CLIENT_EVENT) != BLUETOOTH_ERROR_NONE) {
+                       g_object_unref(map_obexd_conn);
+                       map_obexd_conn = NULL;
+                       return BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_map_client_event_deinit(void)
+{
+       if (map_obexd_conn) {
+               _bt_unregister_service_event(map_obexd_conn,
+                                               BT_MAP_CLIENT_EVENT);
+                g_object_unref(map_obexd_conn);
+                map_obexd_conn = NULL;
+       }
+}
+
 int _bt_register_manager_subscribe_signal(GDBusConnection *conn,
                int subscribe)
 {
@@ -3384,6 +3453,59 @@ int _bt_register_opp_client_subscribe_signal(GDBusConnection *conn,
        return 0;
 }
 
+int _bt_register_map_client_subscribe_signal(GDBusConnection *conn,
+               int subscribe)
+{
+       if (conn == NULL)
+               return -1;
+
+       static int subs_map_client_interface_added_id = -1;
+       static int subs_map_client_interface_removed_id = -1;
+       static int subs_map_client_property_id = -1;
+
+
+       if (subscribe) {
+               if (subs_map_client_interface_added_id == -1) {
+                       subs_map_client_interface_added_id = g_dbus_connection_signal_subscribe(conn,
+                               NULL, BT_MANAGER_INTERFACE,
+                               BT_INTERFACES_ADDED, NULL, NULL, 0,
+                               __bt_map_event_filter,
+                               NULL, NULL);
+               }
+               if (subs_map_client_interface_removed_id == -1) {
+                       subs_map_client_interface_removed_id = g_dbus_connection_signal_subscribe(conn,
+                               NULL, BT_MANAGER_INTERFACE,
+                               BT_INTERFACES_REMOVED, NULL, NULL, 0,
+                               __bt_map_event_filter,
+                               NULL, NULL);
+               }
+               if (subs_map_client_property_id == -1) {
+                       subs_map_client_property_id = g_dbus_connection_signal_subscribe(conn,
+                               NULL, BT_PROPERTIES_INTERFACE,
+                               BT_PROPERTIES_CHANGED, NULL, NULL, 0,
+                               __bt_map_event_filter,
+                               NULL, NULL);
+               }
+       } else {
+               if (subs_map_client_interface_added_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(conn,
+                                       subs_map_client_interface_added_id);
+                       subs_map_client_interface_added_id = -1;
+               }
+               if (subs_map_client_interface_removed_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(conn,
+                                       subs_map_client_interface_removed_id);
+                       subs_map_client_interface_removed_id = -1;
+               }
+               if (subs_map_client_property_id != -1) {
+                       g_dbus_connection_signal_unsubscribe(conn,
+                                       subs_map_client_property_id);
+                       subs_map_client_property_id = -1;
+               }
+       }
+       return 0;
+}
+
 int _bt_register_a2dp_subscribe_signal(GDBusConnection *conn,
                int subscribe)
 {
@@ -3491,6 +3613,10 @@ int _bt_register_service_event(GDBusConnection *g_conn, int event_type)
                BT_ERR("BT_OPP_CLIENT_EVENT: register service event");
                _bt_register_opp_client_subscribe_signal(g_conn, TRUE);
                break;
+       case BT_MAP_CLIENT_EVENT:
+               BT_ERR("BT_MAP_CLIENT_EVENT: register service event");
+               _bt_register_map_client_subscribe_signal(g_conn, TRUE);
+               break;
        case BT_A2DP_SOURCE_EVENT:
                BT_INFO("A2dp Source event");
                _bt_register_a2dp_subscribe_signal(g_conn, TRUE);
@@ -3523,6 +3649,9 @@ void _bt_unregister_service_event(GDBusConnection *g_conn, int event_type)
        case BT_OPP_CLIENT_EVENT:
                _bt_register_opp_client_subscribe_signal(g_conn, FALSE);
                break;
+       case BT_MAP_CLIENT_EVENT:
+               _bt_register_map_client_subscribe_signal(g_conn, FALSE);
+               break;
        default:
                BT_ERR("Unknown event");
                return;
index 089d174..de9b216 100644 (file)
@@ -100,6 +100,9 @@ int _bt_send_event(int event_type, int event, GVariant *param)
        case BT_OPP_SERVER_EVENT:
                path = BT_OPP_SERVER_PATH;
                break;
+       case BT_MAP_CLIENT_EVENT:
+               path = BT_MAP_CLIENT_PATH;
+               break;
        case BT_PBAP_CLIENT_EVENT:
                path = BT_PBAP_CLIENT_PATH;
                break;
@@ -317,6 +320,14 @@ int _bt_send_event(int event_type, int event, GVariant *param)
                signal = BT_OPP_DISCONNECTED;
                BT_INFO_C("Disconnected [OPP]");
                break;
+       case BLUETOOTH_EVENT_MAP_CONNECTED:
+               signal = BT_MAP_CONNECTED;
+               BT_INFO_C("Connected [MAP]");
+               break;
+       case BLUETOOTH_EVENT_MAP_DISCONNECTED:
+               signal = BT_MAP_DISCONNECTED;
+               BT_INFO_C("Disconnected [MAP]");
+               break;
        case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_CONNECTED:
                signal = BT_TRANSFER_CONNECTED;
                break;
index f88ffce..4fa18d7 100644 (file)
@@ -33,6 +33,7 @@
 #include "bt-service-headset-connection.h"
 
 #include "bt-service-opp-client.h"
+#include "bt-service-map-client.h"
 
 
 
diff --git a/bt-service/bt-service-map-client.c b/bt-service/bt-service-map-client.c
new file mode 100644 (file)
index 0000000..187854e
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <glib.h>
+#include <dlog.h>
+#include <string.h>
+#include <mime_type.h>
+#include <aul.h>
+#include <glib.h>
+#include <gio/gio.h>
+
+#include "bluetooth-api.h"
+#include "bt-internal-types.h"
+
+#include "bt-service-common.h"
+#include "bt-service-event.h"
+#include "bt-service-util.h"
+#include "bt-service-map-client.h"
+#include "bt-service-obex-agent.h"
+#include "bt-service-adapter.h"
+
+#define DBUS_TIEMOUT 20 * 1000  /* 20 Seconds */
+
+bt_session_info_t *session_info;
+
+static void __bt_free_session_info(bt_session_info_t *info)
+{
+       ret_if(info == NULL);
+
+       /* TODO: MAP bt_session_info_t, see bt-service-opp-client.c */
+
+       g_free(info->address);
+       g_free(info);
+}
+
+static void __bt_free_session_data(gpointer data)
+{
+       bt_session_data_t *info = data;
+
+       ret_if(info == NULL);
+
+       _bt_delete_request_id(info->request_id);
+
+       /* TODO: MAP bt_session_data_t, see bt-service-opp-client.c */
+
+       g_free(info->address);
+       g_free(info);
+}
+
+static void __bt_session_release_cb(GDBusProxy *proxy,
+                               GAsyncResult *res, gpointer user_data)
+{
+       BT_DBG("+");
+       ret_if(session_info == NULL);
+
+       GError *error = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+       GVariant *param = NULL;
+       g_dbus_proxy_call_finish(proxy, res, &error);
+       if (proxy)
+               g_object_unref(proxy);
+
+       if (error) {
+               BT_ERR("%s", error->message);
+               g_error_free(error);
+
+               result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               BT_DBG("Session Removed");
+       }
+
+       session_info->result = result;
+       param = g_variant_new("(isi)", session_info->result,
+                               session_info->address,
+                               session_info->request_id);
+       /* Send the event in only error none case */
+       _bt_send_event(BT_OPP_CLIENT_EVENT,
+                       BLUETOOTH_EVENT_OPC_DISCONNECTED,
+                       param);
+
+       __bt_free_session_info(session_info);
+       session_info = NULL;
+
+       _bt_map_client_event_deinit();
+
+       /* Operate remain works */
+       /* TODO: MAP */
+
+       return;
+fail:
+
+       BT_DBG("-");
+
+       return;
+}
+
+static int _bt_remove_session()
+{
+       GDBusConnection *g_conn;
+       GDBusProxy *session_proxy;
+       GError *err = NULL;
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       retv_if(session_info->session_path == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_OBEXD_DBUS_NAME,
+                                               BT_OBEX_CLIENT_PATH,
+                                               BT_OBEX_CLIENT_INTERFACE,
+                                               NULL, &err);
+
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       g_dbus_proxy_call(session_proxy, "RemoveSession",
+               g_variant_new("(o)", session_info->session_path),
+               G_DBUS_CALL_FLAGS_NONE,
+               DBUS_TIEMOUT, NULL,
+               (GAsyncReadyCallback)__bt_session_release_cb,
+               NULL);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+void _bt_map_disconnected(const char *session_path)
+{
+       BT_DBG("+");
+       GVariant *param = NULL;
+       ret_if(session_info == NULL);
+
+       if (g_strcmp0(session_info->session_path,
+                       session_path) != 0) {
+               BT_INFO("Path mismatch, previous transfer failed! Returning");
+               return;
+       }
+
+       param = g_variant_new("(isi)", session_info->result,
+                               session_info->address,
+                               session_info->request_id);
+       _bt_send_event(BT_MAP_CLIENT_EVENT,
+                       BLUETOOTH_EVENT_MAP_DISCONNECTED,
+                       param);
+
+       __bt_free_session_info(session_info);
+       session_info = NULL;
+
+       BT_DBG("-");
+}
+
+static void __bt_create_session_cb(GDBusProxy *proxy,
+                               GAsyncResult *res, gpointer user_data)
+{
+       BT_DBG("+");
+
+       GError *error = NULL;
+       GVariant *value;
+       int result = BLUETOOTH_ERROR_NONE;
+       char *session_path = NULL;
+       GVariant *param = NULL;
+
+       value = g_dbus_proxy_call_finish(proxy, res, &error);
+       if (value) {
+               g_variant_get(value, "(o)", &session_path);
+               g_variant_unref(value);
+       }
+       if (error) {
+
+               BT_ERR("%s", error->message);
+               g_clear_error(&error);
+
+               result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               BT_DBG("Session created");
+               if (session_info != NULL)
+                       session_info->session_path = g_strdup(session_path);
+       }
+       g_free(session_path);
+       g_object_unref(proxy);
+       ret_if(session_info == NULL);
+
+       session_info->result = result;
+       param = g_variant_new("(isi)", result,
+                               session_info->address,
+                               session_info->request_id);
+       /* Send the event in only error none case */
+       _bt_send_event(BT_MAP_CLIENT_EVENT,
+                       BLUETOOTH_EVENT_MAP_CONNECTED,
+                       param);
+
+       if (result != BLUETOOTH_ERROR_NONE) {
+               BT_ERR("Calling __bt_session_release");
+               gboolean ret = __bt_session_release();
+
+               __bt_free_session_info(session_info);
+               session_info = NULL;
+
+               if (ret == FALSE) {
+                       BT_DBG("ReleaseSession Not called");
+                       /* Operate remain works */
+
+                       /* TODO: MAP */
+
+               }
+       } else {
+
+               /* TODO: MAP */
+
+       }
+       BT_DBG("-");
+
+}
+
+static int __bt_opp_client_start_XXXXXXXXXX(int request_id, char *address
+                                       /* parameters................... */)
+{
+       /* TODO: MAP */
+}
+
+/* TODO: MAP */
index a9d063a..84a5677 100644 (file)
@@ -244,6 +244,7 @@ extern "C" {
 #define PBAP_UUID               "0000112f-0000-1000-8000-00805f9b34fb"
 
 #define OBEX_OPP_UUID                  "00001105-0000-1000-8000-00805f9b34fb"
+#define OBEX_MAP_UUID                  "00001134-0000-1000-8000-00805f9b34fb"
 #define OBEX_PSE_UUID                  "0000112f-0000-1000-8000-00805f9b34fb"
 
 #define GATT_UUID                              "00001801-0000-1000-8000-00805f9b34fb"
index 1a4cd75..4312e8f 100644 (file)
@@ -38,6 +38,9 @@ void _bt_deinit_service_event_receiver(void);
 int _bt_opp_client_event_init(void);
 void _bt_opp_client_event_deinit(void);
 
+int _bt_map_client_event_init(void);
+void _bt_map_client_event_deinit(void);
+
 int _bt_send_hf_local_term_event(char *address);
 int _bt_init_hf_local_term_event_sender(void);
 void _bt_deinit_hf_local_term_event_sender(void);
diff --git a/bt-service/include/bt-service-map-client.h b/bt-service/include/bt-service-map-client.h
new file mode 100644 (file)
index 0000000..a413387
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *             http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+#ifndef _BT_SERVICE_MAP_CLIENT_H_
+#define _BT_SERVICE_MAP_CLIENT_H_
+
+#include <glib.h>
+#include <sys/types.h>
+#include <gio/gio.h>
+#include "bluetooth-api.h"
+#include "bt-internal-types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define BT_OBEX_CLIENT_AGENT_PATH "/org/obex/client_agent"
+
+/* TODO: MAP */
+
+typedef struct {
+       int request_id;
+       int result;
+
+       char *session_path;
+
+       char *address;
+
+/*     int file_count;
+       int file_offset;
+       char **file_name_array;
+       gboolean is_canceled; */
+
+       /* TODO: MAP */
+
+} bt_session_info_t; /* TODO: "session"? */
+
+typedef struct {
+       char *address;
+       int request_id;
+
+       /*      char **file_path;
+               int file_count; */
+
+       /* TODO: MAP */
+
+} bt_session_data_t; /* TODO: "session"? */
+
+/* TODO: MAP */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif /*_BT_SERVICE_MAP_CLIENT_H_*/
index c50657c..46c1a80 100644 (file)
@@ -509,6 +509,8 @@ typedef struct {
                                                                /**< Base ID for AVRCP events */
 #define BLUETOOTH_EVENT_IPSP_BASE ((int)(BLUETOOTH_EVENT_AVRCP_CONTROL_BASE + 0x0020))
                                                                /**< Base ID for IPSP events */
+#define BLUETOOTH_EVENT_MAP_BASE  ((int)(BLUETOOTH_EVENT_IPSP_BASE + 0x0020))
+                                                               /**< Base ID for MAP events */
 
 /**
  * Bluetooth event type
@@ -588,6 +590,28 @@ typedef enum {
        BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS,  /* OPC Transfer progress event */
        BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE,  /* OPC Transfer Complete event */
 
+       BLUETOOTH_EVENT_MAP_CONNECTED = BLUETOOTH_EVENT_MAP_BASE,
+       BLUETOOTH_EVENT_MAP_DISCONNECTED,
+       /*
+       BLUETOOTH_EVENT_MAP_SET_FOLDER_COMPLETE,
+       BLUETOOTH_EVENT_MAP_SET_FOLDER_INVALID_ARGUMENTS,
+       BLUETOOTH_EVENT_MAP_SET_FOLDER_FAILED,
+       BLUETOOTH_EVENT_MAP_UPDATE_INBOX_COMPLETE,
+       BLUETOOTH_EVENT_MAP_UPDATE_INBOX_FAILED,
+       */
+       BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE,
+       BLUETOOTH_EVENT_MAP_LIST_FOLDERS_INVALID_ARGUMENTS,
+       BLUETOOTH_EVENT_MAP_LIST_FOLDERS_FAILED,
+       BLUETOOTH_EVENT_MAP_LIST_MESSAGES_COMPLETE,
+       BLUETOOTH_EVENT_MAP_LIST_MESSAGES_INVALID_ARGUMENTS,
+       BLUETOOTH_EVENT_MAP_LIST_MESSAGES_FAILED,
+       BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_COMPLETE,
+       BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_INVALID_ARGUMENTS,
+       BLUETOOTH_EVENT_MAP_PUSH_MESSAGE_FAILED,
+       BLUETOOTH_EVENT_MAP_GET_MESSAGE_COMPLETE,
+       BLUETOOTH_EVENT_MAP_GET_MESSAGE_INVALID_ARGUMENTS,
+       BLUETOOTH_EVENT_MAP_GET_MESSAGE_FAILED,
+
        BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE = BLUETOOTH_EVENT_OBEX_SERVER_BASE,
                                                                /* Obex server authorize event*/
        BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED,   /* Obex Server transfer started event*/
@@ -709,6 +733,7 @@ typedef enum {
        BLUETOOTH_DUN_PROFILE_UUID = ((unsigned short)0x1103),                  /**<DUN*/
        BLUETOOTH_OBEX_IR_MC_SYNC_SERVICE_UUID = ((unsigned short)0x1104),      /**<OBEX IR MC SYNC*/
        BLUETOOTH_OBEX_OBJECT_PUSH_SERVICE_UUID = ((unsigned short)0x1105),     /**<OPP*/
+       BLUETOOTH_OBEX_MESSAGE_ACCESS_SERVICE_UUID = ((unsigned short)0x1134),  /**<MAP*/
        BLUETOOTH_OBEX_FILE_TRANSFER_UUID = ((unsigned short)0x1106),           /**<FTP*/
        BLUETOOTH_IRMC_SYNC_COMMAND_UUID = ((unsigned short)0x1107),            /**<IRMC SYNC COMMAND*/
        BLUETOOTH_HS_PROFILE_UUID = ((unsigned short)0x1108),                   /**<HS*/
@@ -1248,6 +1273,8 @@ typedef struct {
        int percentage;
 } bt_opc_transfer_info_t;
 
+/* TODO: MAP client structures, see above */
+
 /* Obex Server transfer type */
 #define TRANSFER_PUT "PUT"
 #define TRANSFER_GET "GET"
@@ -4789,6 +4816,47 @@ int bluetooth_obex_server_is_receiving(gboolean *is_receiving);
 
 
 /**
+ * @fn int bluetooth_map_init(void)
+ * @brief Initialize MAP client.
+ *
+ * This function is a synchronous call.
+ * No event corresponding to this api
+ *
+ * @return   BLUETOOTH_ERROR_NONE  - Success \n
+ *              BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Device is not enabled \n
+ *              BLUETOOTH_ERROR_INTERNAL - Internal Error \n
+ *              BLUETOOTH_ERROR_NO_RESOURCES - Not resource available \n
+ *              BLUETOOTH_ERROR_ACCESS_DENIED -Memory allocation failed \n
+ *
+ * @exception   None
+ *
+ * @remark       None
+ * @see          bluetooth_map_deinit
+ */
+int bluetooth_map_init(void);
+
+/**
+ * @fn int bluetooth_map_deinit(void)
+ * @brief Deinitialize MAP client.
+ *
+ * This function is a synchronous call.
+ * No event corresponding to this api
+ *
+ * @return   BLUETOOTH_ERROR_NONE  - Success \n
+ *              BLUETOOTH_ERROR_DEVICE_NOT_ENABLED - Device is not enabled \n
+ *              BLUETOOTH_ERROR_ACCESS_DENIED -Memory allocation failed \n
+ *
+ * @exception   None
+ *
+ * @remark       None
+ * @see          bluetooth_map_init
+ */
+ int bluetooth_map_deinit(void);
+
+ /* TODO: MAP, see above */
+
+
+/**
  * @fn int bluetooth_oob_read_local_data(bt_oob_data_t *local_oob_data)
  * @brief Read the local Hash and Randmizer.
  *
index 8ff4c66..1244757 100644 (file)
@@ -63,6 +63,7 @@ typedef enum {
        BT_AVRCP_CONTROL_EVENT,
        BT_A2DP_SOURCE_EVENT,
        BT_HID_DEVICE_EVENT,
+       BT_MAP_CLIENT_EVENT,
 #ifdef GATT_NO_RELAY
        BT_GATT_BLUEZ_EVENT, /* GattValueChanged from bluez directly */
 #endif
@@ -109,6 +110,7 @@ typedef enum {
 #define BT_AVRCP_TARGET_UUID "0000110c-0000-1000-8000-00805f9b34fb"
 #define BT_OPP_UUID "00001105-0000-1000-8000-00805f9b34fb"
 #define BT_FTP_UUID "00001106-0000-1000-8000-00805f9b34fb"
+#define BT_MAP_UUID "00001134-0000-1000-8000-00805f9b34fb"
 #define BT_SPP_UUID "00001101-0000-1000-8000-00805f9b34fb"
 #define BT_HID_UUID "00001124-0000-1000-8000-00805f9b34fb"
 #define BT_PAN_PANU_UUID "00001115-0000-1000-8000-00805f9b34fb"
@@ -131,6 +133,7 @@ typedef enum {
 #define BT_FUNC_IPSP_BASE ((int)(BT_FUNC_GATT_BASE + 0x0020))
 #define BT_FUNC_DPM_BASE ((int)(BT_FUNC_IPSP_BASE + 0x0020))
 #define BT_FUNC_PXP_BASE ((int)(BT_FUNC_DPM_BASE + 0x0030)) /* Adding 0x0030 to base, as DPM has more use case */
+#define BT_FUNC_MAP_BASE ((int)(BT_FUNC_PXP_BASE + 0x0020))
 
 typedef enum {
        BT_CHECK_ADAPTER = BT_FUNC_BASE,
@@ -254,6 +257,12 @@ typedef enum {
        BT_OPP_CANCEL_PUSH,
        BT_OPP_IS_PUSHING_FILES,
        BT_OPP_GET_TRANSFER_PROGRESS,
+       BT_MAP_111 = BT_FUNC_MAP_BASE,
+       BT_MAP_222,
+       BT_MAP_333,
+       BT_MAP_444,
+       BT_MAP_555,
+       BT_MAP_666,
        BT_OBEX_SERVER_ALLOCATE,
        BT_OBEX_SERVER_DEALLOCATE,
        BT_OBEX_SERVER_IS_ACTIVATED,
@@ -408,6 +417,7 @@ typedef struct {
 #define BT_NETWORK_PATH "/org/projectx/bt/newtork"
 #define BT_OPP_CLIENT_PATH "/org/projectx/bt/opp_client"
 #define BT_OPP_SERVER_PATH "/org/projectx/bt/opp_server"
+#define BT_MAP_CLIENT_PATH "/org/projectx/bt/map_client"
 #define BT_PBAP_CLIENT_PATH "/org/projectx/bt/pbap_client"
 #define BT_RFCOMM_CLIENT_PATH "/org/projectx/bt/rfcomm_client"
 #define BT_RFCOMM_SERVER_PATH "/org/projectx/bt/rfcomm_server"
@@ -486,6 +496,9 @@ typedef struct {
 #define BT_NETWORK_SERVER_DISCONNECTED "NetworkServerDisconnected"
 #define BT_OPP_CONNECTED "OppConnected"
 #define BT_OPP_DISCONNECTED "OppDisconnected"
+#define BT_MAP_CONNECTED "MapConnected"
+#define BT_MAP_DISCONNECTED "MapDisconnected"
+#define BT_MAP_OP_COMPLETE "Complete"
 #define BT_TRANSFER_CONNECTED "TransferConnected"
 #define BT_TRANSFER_DISCONNECTED "TransferDisonnected"
 #define BT_TRANSFER_STARTED "TransferStarted"