#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;
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);
/* 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;
+}