2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <mime_type.h>
26 #include "bluetooth-api.h"
27 #include "bt-internal-types.h"
29 #include "bt-service-common.h"
30 #include "bt-service-event.h"
31 #include "bt-service-util.h"
32 #include "bt-service-map-client.h"
33 #include "bt-service-obex-agent.h"
34 #include "bt-service-adapter.h"
36 #define DBUS_TIMEOUT 20 * 1000 /* 20 Seconds */
38 bt_session_info_t *session_info;
40 static void __bt_free_session_info(bt_session_info_t *info)
44 /* TODO: MAP bt_session_info_t, see bt-service-opp-client.c */
46 g_free(info->address);
50 static void __bt_free_session_data(gpointer data)
52 bt_session_data_t *info = data;
56 _bt_delete_request_id(info->request_id);
58 /* TODO: MAP bt_session_data_t, see bt-service-opp-client.c */
60 g_free(info->address);
64 static void __bt_session_release_cb(GDBusProxy *proxy,
65 GAsyncResult *res, gpointer user_data)
68 ret_if(session_info == NULL);
71 int result = BLUETOOTH_ERROR_NONE;
72 GVariant *param = NULL;
73 g_dbus_proxy_call_finish(proxy, res, &error);
75 g_object_unref(proxy);
78 BT_ERR("%s", error->message);
81 result = BLUETOOTH_ERROR_INTERNAL;
83 BT_DBG("Session Removed");
86 session_info->result = result;
87 param = g_variant_new("(isi)", session_info->result,
88 session_info->address,
89 session_info->request_id);
90 /* Send the event in only error none case */
91 _bt_send_event(BT_OPP_CLIENT_EVENT,
92 BLUETOOTH_EVENT_OPC_DISCONNECTED,
95 __bt_free_session_info(session_info);
98 _bt_map_client_event_deinit();
100 /* Operate remain works */
111 static int _bt_remove_session()
113 GDBusConnection *g_conn;
114 GDBusProxy *session_proxy;
117 g_conn = _bt_gdbus_get_session_gconn();
118 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
119 retv_if(session_info->session_path == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
121 session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
122 NULL, BT_OBEXD_DBUS_NAME,
124 BT_OBEX_CLIENT_INTERFACE,
127 retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
129 g_dbus_proxy_call(session_proxy, "RemoveSession",
130 g_variant_new("(o)", session_info->session_path),
131 G_DBUS_CALL_FLAGS_NONE,
133 (GAsyncReadyCallback)__bt_session_release_cb,
136 return BLUETOOTH_ERROR_NONE;
139 void _bt_map_disconnected(const char *session_path)
142 GVariant *param = NULL;
143 ret_if(session_info == NULL);
145 if (g_strcmp0(session_info->session_path,
146 session_path) != 0) {
147 BT_INFO("Path mismatch, previous transfer failed! Returning");
151 param = g_variant_new("(isi)", session_info->result,
152 session_info->address,
153 session_info->request_id);
154 _bt_send_event(BT_MAP_CLIENT_EVENT,
155 BLUETOOTH_EVENT_MAP_DISCONNECTED,
158 __bt_free_session_info(session_info);
164 static void __bt_create_session_cb(GDBusProxy *proxy,
165 GAsyncResult *res, gpointer user_data)
169 GError *error = NULL;
171 int result = BLUETOOTH_ERROR_NONE;
172 char *session_path = NULL;
173 GVariant *param = NULL;
175 value = g_dbus_proxy_call_finish(proxy, res, &error);
177 g_variant_get(value, "(o)", &session_path);
178 g_variant_unref(value);
182 BT_ERR("%s", error->message);
183 g_clear_error(&error);
185 result = BLUETOOTH_ERROR_INTERNAL;
187 BT_DBG("Session created");
188 if (session_info != NULL)
189 session_info->session_path = g_strdup(session_path);
191 g_free(session_path);
192 g_object_unref(proxy);
193 ret_if(session_info == NULL);
195 session_info->result = result;
196 param = g_variant_new("(isi)", result,
197 session_info->address,
198 session_info->request_id);
199 /* Send the event in only error none case */
200 _bt_send_event(BT_MAP_CLIENT_EVENT,
201 BLUETOOTH_EVENT_MAP_CONNECTED,
204 if (result != BLUETOOTH_ERROR_NONE) {
205 BT_ERR("Calling __bt_session_release");
206 gboolean ret = __bt_session_release();
208 __bt_free_session_info(session_info);
212 BT_DBG("ReleaseSession Not called");
213 /* Operate remain works */
227 static int __bt_opp_client_start_XXXXXXXXXX(int request_id, char *address
228 /* parameters................... */)
233 int _bt_create_session_sync(const char* address, char** session_id)
235 BT_DBG("Entered SERVICE create session");
236 GDBusConnection *g_conn;
237 GDBusProxy *session_proxy;
239 const char *session_path;
241 retv_if(address == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
243 g_conn = _bt_gdbus_get_session_gconn();
244 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
246 session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
247 NULL, BT_OBEX_SERVICE_NAME,
249 BT_OBEX_CLIENT_INTERFACE,
252 BT_ERR("Unable to create session_proxy: %s", err->message);
254 return BLUETOOTH_ERROR_INTERNAL;
256 retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
258 GVariantBuilder* builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
259 g_variant_builder_add(builder, "{sv}", "Target",
260 g_variant_new("s", "map"));
261 GVariant *args = g_variant_builder_end(builder);
262 g_variant_builder_unref (builder);
263 GVariant *param = g_variant_new("(s@a{sv})", address, args);
265 char* string = g_variant_print (param, true);
267 GVariant *value = g_dbus_proxy_call_sync(session_proxy, "CreateSession", param,
268 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
270 BT_ERR("Could not create session: %s\n", err->message);
272 return BLUETOOTH_ERROR_INTERNAL;
275 BT_ERR("create session returned value is null\n");
276 return BLUETOOTH_ERROR_INTERNAL;
278 BT_DBG("create session succeed\n");
282 g_variant_get(value, "(&o)", session_id);
283 BT_DBG("session_id = \"%s\"\n", *session_id);
285 return BLUETOOTH_ERROR_NONE;
288 int _bt_destroy_session_sync(const char* session_id)
290 BT_DBG("Entered SERVICE destroy session with id: \"%s\"", session_id);
291 GDBusConnection *g_conn;
292 GDBusProxy *session_proxy;
295 retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
297 g_conn = _bt_gdbus_get_session_gconn();
298 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
300 session_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE,
301 NULL, BT_OBEX_SERVICE_NAME,
303 BT_OBEX_CLIENT_INTERFACE,
306 BT_ERR("Unable to create session_proxy: %s", err->message);
308 return BLUETOOTH_ERROR_INTERNAL;
310 retv_if(session_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
312 GVariant *param = g_variant_new("(o)", session_id);
314 GVariant *value = g_dbus_proxy_call_sync(session_proxy, "RemoveSession", param,
315 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
317 BT_ERR("Could not remove session: %s\n", err->message);
319 return BLUETOOTH_ERROR_INTERNAL;
321 BT_DBG("remove session succeed\n");
324 return BLUETOOTH_ERROR_NONE;
327 int _bt_map_client_set_folder(const char* session_id, const char* name)
332 GDBusConnection *g_conn;
333 GDBusProxy *message_proxy;
334 GVariant *ret = NULL;
336 g_conn = _bt_gdbus_get_session_gconn();
337 ret_if(g_conn == NULL);
339 GVariant *param = g_variant_new("(o)", session_id);
341 message_proxy = g_dbus_proxy_new_sync(g_conn,
342 G_DBUS_PROXY_FLAGS_NONE, NULL,
343 BT_OBEX_SERVICE_NAME, session_id,
344 BT_OBEX_MESSAGE_INTERFACE, NULL, &err);
346 retv_if(message_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
348 ret = g_dbus_proxy_call_sync(message_proxy,
349 "SetFolder", g_variant_new("(s)", name),
350 G_DBUS_CALL_FLAGS_NONE, DBUS_TIMEOUT,
355 BT_ERR("SetFolder Error: %s\n", err->message);
359 g_variant_unref(ret);
362 g_object_unref(message_proxy);
366 return BLUETOOTH_ERROR_NONE;
369 int _bt_map_client_list_folders(int request_id, GDBusMethodInvocation *context,
370 const char* session_id, int offset, int maxcount)
372 BT_DBG("Entered _bt_map_list_folders with session id: \"%s\"", session_id);
373 BT_DBG("Entered offset: %d maxcount: %d", offset, maxcount);
374 GDBusConnection *g_conn;
375 GDBusProxy *message_access_proxy;
376 GError *error = NULL;
377 int result = BLUETOOTH_ERROR_NONE;
379 retv_if(session_id == NULL, BLUETOOTH_ERROR_INVALID_PARAM);
381 g_conn = _bt_gdbus_get_session_gconn();
382 retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
384 GVariant *out_param1 = g_variant_new_from_data((const GVariantType *)"ay",
385 &request_id, sizeof(int),
387 g_dbus_method_invocation_return_value(context,
388 g_variant_new("(iv)", result, out_param1));
390 // create message access proxy
391 g_clear_error(&error);
392 message_access_proxy = g_dbus_proxy_new_sync(g_conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
393 BT_OBEX_SERVICE_NAME, session_id, "org.bluez.obex.MessageAccess1",
396 BT_ERR("Could not create message access proxy: %s\n", error->message);
397 result = BLUETOOTH_ERROR_INTERNAL;
399 if (!message_access_proxy) {
400 BT_ERR("message proxy handle is null\n");
401 result = BLUETOOTH_ERROR_INTERNAL;
403 BT_DBG("message proxy set");
405 GVariantBuilder* b = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
408 g_variant_builder_add(b, "{sv}", "Offset", g_variant_new_uint16(offset));
411 g_variant_builder_add(b, "{sv}", "MaxCount", g_variant_new_uint16(maxcount));
413 GVariant *args = g_variant_builder_end(b);
414 GVariant *params = g_variant_new("(@a{sv})", args);
415 g_variant_builder_unref (b);
417 int* request_id_p = malloc(sizeof(*request_id_p));
418 *request_id_p = request_id;
420 GVariant *folder_list_var = g_dbus_proxy_call_sync(message_access_proxy,
421 "ListFolders", params, G_DBUS_CALL_FLAGS_NONE, -1,
424 BT_ERR("Could not ListFolders: %s\n", error->message);
425 // TODO return correct error
426 result = BLUETOOTH_ERROR_INTERNAL;
428 if (!folder_list_var) {
429 BT_ERR("returned ListFolders is null\n");
430 result = BLUETOOTH_ERROR_INTERNAL;
432 BT_DBG("ListFolders succeed\n");
434 GVariant *param = g_variant_new("(iiv)", result, request_id, folder_list_var);
435 BT_DBG("RequestID[%d]", request_id);
436 result = _bt_send_event(BT_MAP_CLIENT_EVENT,
437 BLUETOOTH_EVENT_MAP_LIST_FOLDERS_COMPLETE, param);
443 g_object_unref(message_access_proxy);
449 int _bt_map_client_list_filter_fields(const char* session_id)
457 return BLUETOOTH_ERROR_NONE;
460 int _bt_map_client_list_messages(
461 const char* session_id,
471 return BLUETOOTH_ERROR_NONE;
474 int _bt_map_client_update_inbox(const char* session_id)
479 GDBusConnection *g_conn;
480 GDBusProxy *message_proxy;
481 GVariantBuilder *builder;
482 GVariant *ret = NULL;
484 g_conn = _bt_gdbus_get_session_gconn();
485 ret_if(g_conn == NULL);
487 GVariant *param = g_variant_new("(o)", session_id);
489 message_proxy = g_dbus_proxy_new_sync(g_conn,
490 G_DBUS_PROXY_FLAGS_NONE, NULL,
491 BT_OBEX_SERVICE_NAME, session_id,
492 BT_OBEX_MESSAGE_INTERFACE, NULL, &err);
494 retv_if(message_proxy == NULL, BLUETOOTH_ERROR_INTERNAL);
496 ret = g_dbus_proxy_call_sync(message_proxy,
497 "UpdateInbox", g_variant_new("()"),
498 G_DBUS_CALL_FLAGS_NONE, -1,
503 BT_ERR("UpdateInbox Error: %s\n", err->message);
507 g_variant_unref(ret);
510 g_object_unref(message_proxy);
514 return BLUETOOTH_ERROR_NONE;
517 int _bt_map_client_push_message(
518 const char* session_id,
519 const char* source_file,
529 return BLUETOOTH_ERROR_NONE;
532 int _bt_map_client_get_message(
533 const char* session_id,
534 const char* message_object_name,
535 const char* target_file,
544 return BLUETOOTH_ERROR_NONE;