[bluetooth-frwk] Added listFolders implementation with async result
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-map-client.c
index 187854e..1ecba34 100644 (file)
@@ -33,7 +33,7 @@
 #include "bt-service-obex-agent.h"
 #include "bt-service-adapter.h"
 
-#define DBUS_TIEMOUT 20 * 1000  /* 20 Seconds */
+#define DBUS_TIMEOUT 20 * 1000  /* 20 Seconds */
 
 bt_session_info_t *session_info;
 
@@ -129,7 +129,7 @@ static int _bt_remove_session()
        g_dbus_proxy_call(session_proxy, "RemoveSession",
                g_variant_new("(o)", session_info->session_path),
                G_DBUS_CALL_FLAGS_NONE,
-               DBUS_TIEMOUT, NULL,
+               DBUS_TIMEOUT, NULL,
                (GAsyncReadyCallback)__bt_session_release_cb,
                NULL);
 
@@ -230,4 +230,316 @@ static int __bt_opp_client_start_XXXXXXXXXX(int request_id, char *address
        /* TODO: MAP */
 }
 
-/* TODO: MAP */
+int _bt_create_session_sync(const char* address, char** session_id)
+{
+       BT_DBG("Entered SERVICE create session");
+       GDBusConnection *g_conn;
+       GDBusProxy *session_proxy;
+       GError *err = NULL;
+       const char *session_path;
+
+       retv_if(address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_OBEX_SERVICE_NAME,
+                                               BT_OBEX_CLIENT_PATH,
+                                               BT_OBEX_CLIENT_INTERFACE,
+                                               NULL, &err);
+       if (err) {
+               BT_ERR("Unable to create session_proxy: %s", err->message);
+               g_clear_error(&err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariantBuilder* builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+       g_variant_builder_add(builder, "{sv}", "Target",
+                       g_variant_new("s", "map"));
+       GVariant *args = g_variant_builder_end(builder);
+       g_variant_builder_unref (builder);
+       GVariant *param = g_variant_new("(s@a{sv})", address, args);
+
+       char* string = g_variant_print (param, true);
+
+       GVariant *value = g_dbus_proxy_call_sync(session_proxy, "CreateSession", param,
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+       if (err != NULL) {
+               BT_ERR("Could not create session: %s\n", err->message);
+               g_error_free(err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               if (NULL == value) {
+                       BT_ERR("create session returned value is null\n");
+                       return BLUETOOTH_ERROR_INTERNAL;
+               } else {
+                       BT_DBG("create session succeed\n");
+               }
+       }
+
+       g_variant_get(value, "(&o)", session_id);
+       BT_DBG("session_id = \"%s\"\n", *session_id);
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_destroy_session_sync(const char* session_id)
+{
+       BT_DBG("Entered SERVICE destroy session with id: \"%s\"", session_id);
+       GDBusConnection *g_conn;
+       GDBusProxy *session_proxy;
+       GError *err = NULL;
+
+       retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
+                                               NULL, BT_OBEX_SERVICE_NAME,
+                                               BT_OBEX_CLIENT_PATH,
+                                               BT_OBEX_CLIENT_INTERFACE,
+                                               NULL, &err);
+       if (err) {
+               BT_ERR("Unable to create session_proxy: %s", err->message);
+               g_clear_error(&err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       }
+       retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariant *param = g_variant_new("(o)", session_id);
+
+       GVariant *value = g_dbus_proxy_call_sync(session_proxy, "RemoveSession", param,
+                       G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
+       if (err != NULL) {
+               BT_ERR("Could not remove session: %s\n", err->message);
+               g_error_free(err);
+               return BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               BT_DBG("remove session succeed\n");
+       }
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_set_folder(const char* session_id, const char* name)
+{
+       BT_DBG("+");
+
+       GError *err = NULL;
+       GDBusConnection *g_conn;
+       GDBusProxy *message_proxy;
+       GVariant *ret = NULL;
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       ret_if(g_conn == NULL);
+
+       GVariant *param = g_variant_new("(o)", session_id);
+
+       message_proxy = g_dbus_proxy_new_sync(g_conn,
+               G_DBUS_PROXY_FLAGS_NONE, NULL,
+               BT_OBEX_SERVICE_NAME, session_id,
+               BT_OBEX_MESSAGE_INTERFACE, NULL, &err);
+
+       retv_if(message_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       ret = g_dbus_proxy_call_sync(message_proxy,
+                               "SetFolder", g_variant_new("(s)", name),
+                               G_DBUS_CALL_FLAGS_NONE, DBUS_TIMEOUT,
+                               NULL, &err);
+
+       if (ret == NULL) {
+               if (err != NULL) {
+                       BT_ERR("SetFolder Error: %s\n", err->message);
+                       g_error_free(err);
+               }
+       } else {
+               g_variant_unref(ret);
+       }
+
+       g_object_unref(message_proxy);
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_list_folders(int request_id, GDBusMethodInvocation *context,
+               const char* session_id, int offset, int maxcount)
+{
+       BT_DBG("Entered _bt_map_list_folders with session id: \"%s\"", session_id);
+       BT_DBG("Entered offset: %d maxcount: %d", offset, maxcount);
+       GDBusConnection *g_conn;
+       GDBusProxy *message_access_proxy;
+       GError *error = NULL;
+       int result = BLUETOOTH_ERROR_NONE;
+
+       retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       GVariant *out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
+                       &request_id, sizeof(int),
+                       TRUE, NULL, NULL);
+       g_dbus_method_invocation_return_value(context,
+                       g_variant_new("(iv)", result, out_param1));
+
+       // create message access proxy
+       g_clear_error(&error);
+       message_access_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       BT_OBEX_SERVICE_NAME, session_id, "org.bluez.obex.MessageAccess1",
+                       NULL, &error);
+       if (error != NULL) {
+               BT_ERR("Could not create message access proxy: %s\n", error->message);
+               result = BLUETOOTH_ERROR_INTERNAL;
+       } else {
+               if (!message_access_proxy) {
+                       BT_ERR("message proxy handle is null\n");
+                       result = BLUETOOTH_ERROR_INTERNAL;
+               } else {
+                       BT_DBG("message proxy set");
+
+                       GVariantBuilder* b = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
+
+                       if (offset >= 0) {
+                               g_variant_builder_add(b, "{sv}", "Offset", g_variant_new_uint16(offset));
+                       }
+                       if (maxcount >= 0) {
+                               g_variant_builder_add(b, "{sv}", "MaxCount", g_variant_new_uint16(maxcount));
+                       }
+                       GVariant *args = g_variant_builder_end(b);
+                       GVariant *params = g_variant_new("(@a{sv})", args);
+                       g_variant_builder_unref (b);
+
+                       int* request_id_p = malloc(sizeof(*request_id_p));
+                       *request_id_p = request_id;
+
+                       GVariant *folder_list_var = g_dbus_proxy_call_sync(message_access_proxy,
+                                       "ListFolders", params, G_DBUS_CALL_FLAGS_NONE, -1,
+                                       NULL, &error);
+                       if (error != NULL) {
+                               BT_ERR("Could not ListFolders: %s\n", error->message);
+                               // TODO return correct error
+                               result = BLUETOOTH_ERROR_INTERNAL;
+                       } else {
+                               if (!folder_list_var) {
+                                       BT_ERR("returned ListFolders is null\n");
+                                       result = BLUETOOTH_ERROR_INTERNAL;
+                               } else {
+                                       BT_DBG("ListFolders succeed\n");
+
+                                       GVariant *param = g_variant_new("(iiv)", result, request_id, folder_list_var);
+                                       BT_DBG("RequestID[%d]", request_id);
+                                       result = _bt_send_event(BT_MAP_CLIENT_EVENT,
+                                                                       BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE, param);
+                               }
+                       }
+               }
+       }
+
+       g_object_unref(message_access_proxy);
+       BT_DBG("-");
+
+       return result;
+}
+
+int _bt_map_client_list_filter_fields(const char* session_id)
+{
+       BT_DBG("+");
+
+       /* TODO: MAP */
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_list_messages(
+               const char* session_id,
+               const char* folder,
+               GVariant *filter)
+{
+       BT_DBG("+");
+
+       /* TODO: MAP */
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_update_inbox(const char* session_id)
+{
+       BT_DBG("+");
+
+       GError *err = NULL;
+       GDBusConnection *g_conn;
+       GDBusProxy *message_proxy;
+       GVariantBuilder *builder;
+       GVariant *ret = NULL;
+
+       g_conn = _bt_gdbus_get_session_gconn();
+       ret_if(g_conn == NULL);
+
+       GVariant *param = g_variant_new("(o)", session_id);
+
+       message_proxy = g_dbus_proxy_new_sync(g_conn,
+               G_DBUS_PROXY_FLAGS_NONE, NULL,
+               BT_OBEX_SERVICE_NAME, session_id,
+               BT_OBEX_MESSAGE_INTERFACE, NULL, &err);
+
+       retv_if(message_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
+
+       ret = g_dbus_proxy_call_sync(message_proxy,
+                               "UpdateInbox", g_variant_new("()"),
+                               G_DBUS_CALL_FLAGS_NONE, -1,
+                               NULL, &err);
+
+       if (ret == NULL) {
+               if (err != NULL) {
+                       BT_ERR("UpdateInbox Error: %s\n", err->message);
+                       g_error_free(err);
+               }
+       } else {
+               g_variant_unref(ret);
+       }
+
+       g_object_unref(message_proxy);
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_push_message(
+               const char* session_id,
+               const char* source_file,
+               const char* folder,
+               GVariant *args)
+{
+       BT_DBG("+");
+
+       /* TODO: MAP */
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}
+
+int _bt_map_client_get_message(
+               const char* session_id,
+               const char* message_object_name,
+               const char* target_file,
+               bool attachment)
+{
+       BT_DBG("+");
+
+       /* TODO: MAP */
+
+       BT_DBG("-");
+
+       return BLUETOOTH_ERROR_NONE;
+}