4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * GirishAshok Joshi <girish.joshi@samsung.com>
8 * DoHyun Pyun <dh79.pyun@samsung.com>
10 * Licensed under the Flora License, Version 1.1 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.tizenopensource.org/license
16 * Unless required by applicable law or agreed to in writing,
17 * software distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
24 #include <dbus/dbus.h>
25 #include <dbus/dbus-glib-bindings.h>
29 #include <notification.h>
30 #include <bluetooth-share-api.h>
32 #include "bt-share-ui-main.h"
33 #include "bt-share-ui-ipc.h"
34 #include "bt-share-ui-view.h"
35 #include "bt-share-ui-popup.h"
36 #include "bt-share-ui-resource.h"
37 #include "bt-share-ui-widget.h"
39 #define BT_ADDRESS_LENGTH_MAX 6
40 #define DBUS_CORE_APPS_PATH "/Org/Tizen/Coreapps/home/raise"
41 #define DBUS_CORE_APPS_INTERFACE "org.tizen.coreapps.home.raise"
42 #define DBUS_CORE_APPS_MEMBER "homeraise"
44 static gboolean opc_launched_session;
46 void _bt_set_opc_launched_session(gboolean value)
48 opc_launched_session = value;
51 static void __handle_opp_client_signal(void *data, DBusMessage *msg)
53 bt_share_event_param_t event_info = { 0, };
54 int result = BT_SHARE_UI_ERROR_NONE;
55 const char *member = dbus_message_get_member(msg);
57 retm_if(data == NULL, "Invalid argument: data is NULL\n");
58 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
59 bt_share_appdata_t *ad = (bt_share_appdata_t *)data;
60 retm_if(ad->tr_type == BT_TR_INBOUND, "Invalid tr_type: BT_TR_INBOUND");
61 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
64 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
67 if (!dbus_message_has_path(msg, BT_OPP_CLIENT_PATH))
70 ret_if(member == NULL);
72 if (strcasecmp(member, BT_OPP_CONNECTED) == 0) {
75 DBG("BT_OPP_CONNECTED signal");
76 if (!dbus_message_get_args(msg, NULL,
77 DBUS_TYPE_INT32, &result,
78 DBUS_TYPE_STRING, &address,
79 DBUS_TYPE_INT32, &request_id,
81 ERR("Unexpected parameters in signal");
84 event_info.event = BT_SHARE_UI_EVENT_OPC_CONNECTED;
85 event_info.param_data = address;
86 event_info.result = result;
87 event_info.user_data = data;
88 DBG("Event BT_SHARE_UI_EVENT_OPC_CONNECTED");
89 _bt_share_ui_event_handler(BT_SHARE_UI_EVENT_OPC_CONNECTED,
90 &event_info, event_info.user_data);
91 } else if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
92 char *file_path = NULL;
93 char *file_name = NULL;
94 char *device_addr = NULL;
97 bt_share_transfer_info_t transfer_info;
99 if (!dbus_message_get_args(msg, NULL,
100 DBUS_TYPE_INT32, &result,
101 DBUS_TYPE_STRING, &device_addr,
102 DBUS_TYPE_STRING, &file_path,
103 DBUS_TYPE_UINT64, &size,
104 DBUS_TYPE_INT32, &request_id,
105 DBUS_TYPE_INVALID)) {
106 ERR("Unexpected parameters in signal");
110 file_name = g_path_get_basename(file_path);
111 DBG("file_name:%s file_path:%s", file_name, file_path);
113 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
115 transfer_info.device_addr = g_strdup(device_addr);
116 transfer_info.filename = g_strdup(file_name);
117 transfer_info.size = size;
118 transfer_info.percentage = 0;
120 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED;
121 event_info.param_data = &transfer_info;
122 event_info.result = result;
123 event_info.user_data = data;
125 _bt_share_ui_event_handler(
126 BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED,
127 &event_info, event_info.user_data);
129 g_free(transfer_info.device_addr);
130 g_free(transfer_info.filename);
132 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
133 char *file_name = NULL;
137 bt_share_transfer_info_t transfer_info;
139 if (!dbus_message_get_args(msg, NULL,
140 DBUS_TYPE_INT32, &result,
141 DBUS_TYPE_STRING, &file_name,
142 DBUS_TYPE_UINT64, &size,
143 DBUS_TYPE_INT32, &progress,
144 DBUS_TYPE_INT32, &request_id,
145 DBUS_TYPE_INVALID)) {
146 ERR("Unexpected parameters in signal");
150 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
152 transfer_info.filename = g_strdup(file_name);
153 transfer_info.size = size;
154 transfer_info.percentage = progress;
156 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS;
157 event_info.param_data = &transfer_info;
158 event_info.result = result;
159 event_info.user_data = data;
161 _bt_share_ui_event_handler(
162 BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS,
163 &event_info, event_info.user_data);
165 g_free(transfer_info.filename);
166 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
167 char *file_name = NULL;
168 char *device_addr = NULL;
171 bt_share_transfer_info_t transfer_info;
173 if (!dbus_message_get_args(msg, NULL,
174 DBUS_TYPE_INT32, &result,
175 DBUS_TYPE_STRING, &device_addr,
176 DBUS_TYPE_STRING, &file_name,
177 DBUS_TYPE_UINT64, &size,
178 DBUS_TYPE_INT32, &request_id,
179 DBUS_TYPE_INVALID)) {
180 ERR("Unexpected parameters in signal");
184 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
186 transfer_info.device_addr = g_strdup(device_addr);
187 transfer_info.filename = g_strdup(file_name);
188 transfer_info.size = size;
190 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE;
191 event_info.param_data = &transfer_info;
192 event_info.result = result;
193 event_info.user_data = data;
195 _bt_share_ui_event_handler(
196 BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE,
197 &event_info, event_info.user_data);
199 g_free(transfer_info.device_addr);
200 g_free(transfer_info.filename);
201 } else if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) {
202 DBG("BT_OPP_CLIENT_DISCONNECTED signal");
203 char *device_addr = NULL;
206 if (!dbus_message_get_args(msg, NULL,
207 DBUS_TYPE_INT32, &result,
208 DBUS_TYPE_STRING, &device_addr,
209 DBUS_TYPE_INT32, &request_id,
210 DBUS_TYPE_INVALID)) {
211 ERR("Unexpected parameters in signal");
215 event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED;
216 event_info.param_data = device_addr;
217 event_info.result = result;
218 event_info.user_data = data;
220 _bt_share_ui_event_handler(
221 BT_SHARE_UI_EVENT_OPC_DISCONNECTED,
222 &event_info, event_info.user_data);
226 static void __handle_obex_server_signal(void *data, DBusMessage *msg)
228 bt_share_event_param_t event_info = { 0, };
229 int result = BT_SHARE_UI_ERROR_NONE;
230 const char *member = dbus_message_get_member(msg);
232 retm_if(data == NULL, "Invalid argument: data is NULL\n");
233 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
234 bt_share_appdata_t *ad = (bt_share_appdata_t *)data;
235 retm_if(ad->tr_type == BT_TR_OUTBOUND, "Invalid tr_type: BT_TR_OUTBOUND");
236 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
239 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
242 if (!dbus_message_has_path(msg, BT_OPP_SERVER_PATH))
245 retm_if(member == NULL, "member value is NULL\n");
246 if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
247 char *file_name = NULL;
249 char *device_name = NULL;
250 char *device_addr = NULL;
252 int server_type = 0; /* bt_server_type_t */
254 bt_share_server_transfer_info_t transfer_info;
256 if (!dbus_message_get_args(msg, NULL,
257 DBUS_TYPE_INT32, &result,
258 DBUS_TYPE_STRING, &device_name,
259 DBUS_TYPE_STRING, &file_name,
260 DBUS_TYPE_STRING, &type,
261 DBUS_TYPE_STRING, &device_addr,
262 DBUS_TYPE_UINT64, &size,
263 DBUS_TYPE_INT32, &transfer_id,
264 DBUS_TYPE_INT32, &server_type,
265 DBUS_TYPE_INVALID)) {
266 ERR("Unexpected parameters in signal");
270 memset(&transfer_info, 0x00,
271 sizeof(bt_share_server_transfer_info_t));
273 transfer_info.device_name = g_strdup(device_name);
274 transfer_info.address = g_strdup(device_addr);
275 transfer_info.filename = g_strdup(file_name);
276 transfer_info.type = g_strdup(type);
277 transfer_info.file_size = size;
278 transfer_info.transfer_id = transfer_id;
279 transfer_info.percentage = 0;
281 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED;
282 event_info.param_data = &transfer_info;
283 event_info.result = result;
284 event_info.user_data = data;
286 _bt_share_ui_event_handler(
287 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED,
288 &event_info, event_info.user_data);
290 g_free(transfer_info.device_name);
291 g_free(transfer_info.address);
292 g_free(transfer_info.filename);
293 g_free(transfer_info.type);
294 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
295 char *file_name = NULL;
297 char *device_name = NULL;
298 char *device_addr = NULL;
301 int server_type = 0; /* bt_server_type_t */
303 bt_share_server_transfer_info_t transfer_info;
305 if (!dbus_message_get_args(msg, NULL,
306 DBUS_TYPE_INT32, &result,
307 DBUS_TYPE_STRING, &file_name,
308 DBUS_TYPE_STRING, &type,
309 DBUS_TYPE_STRING, &device_name,
310 DBUS_TYPE_STRING, &device_addr,
311 DBUS_TYPE_UINT64, &size,
312 DBUS_TYPE_INT32, &transfer_id,
313 DBUS_TYPE_INT32, &progress,
314 DBUS_TYPE_INT32, &server_type,
315 DBUS_TYPE_INVALID)) {
316 ERR("Unexpected parameters in signal");
320 memset(&transfer_info, 0x00,
321 sizeof(bt_share_server_transfer_info_t));
323 transfer_info.device_name = g_strdup(device_name);
324 transfer_info.address = g_strdup(device_addr);
325 transfer_info.filename = g_strdup(file_name);
326 transfer_info.type = g_strdup(type);
327 transfer_info.file_size = size;
328 transfer_info.transfer_id = transfer_id;
329 transfer_info.percentage = progress;
331 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS;
332 event_info.param_data = &transfer_info;
333 event_info.result = result;
334 event_info.user_data = data;
336 _bt_share_ui_event_handler(
337 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
338 &event_info, event_info.user_data);
340 g_free(transfer_info.device_name);
341 g_free(transfer_info.address);
342 g_free(transfer_info.filename);
343 g_free(transfer_info.type);
344 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
345 char *file_name = NULL;
346 char *device_name = NULL;
347 char *device_addr = NULL;
351 int server_type = 0; /* bt_server_type_t */
353 bt_share_server_transfer_info_t transfer_info;
355 if (!dbus_message_get_args(msg, NULL,
356 DBUS_TYPE_INT32, &result,
357 DBUS_TYPE_STRING, &file_name,
358 DBUS_TYPE_STRING, &type,
359 DBUS_TYPE_STRING, &device_name,
360 DBUS_TYPE_STRING, &file_path,
361 DBUS_TYPE_STRING, &device_addr,
362 DBUS_TYPE_UINT64, &size,
363 DBUS_TYPE_INT32, &transfer_id,
364 DBUS_TYPE_INT32, &server_type,
365 DBUS_TYPE_INVALID)) {
366 ERR("Unexpected parameters in signal");
370 memset(&transfer_info, 0x00,
371 sizeof(bt_share_server_transfer_info_t));
373 transfer_info.filename = g_strdup(file_name);
374 transfer_info.type = g_strdup(type);
375 transfer_info.device_name = g_strdup(device_name);
376 transfer_info.address = g_strdup(device_addr);
377 transfer_info.file_path = g_strdup(file_path);
378 transfer_info.file_size = size;
379 transfer_info.transfer_id = transfer_id;
381 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED;
382 event_info.param_data = &transfer_info;
383 event_info.result = result;
384 event_info.user_data = data;
386 _bt_share_ui_event_handler(
387 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
388 &event_info, event_info.user_data);
390 g_free(transfer_info.filename);
391 g_free(transfer_info.type);
392 g_free(transfer_info.device_name);
393 g_free(transfer_info.address);
394 g_free(transfer_info.file_path);
398 static void __handle_update_view_signal(void *data, DBusMessage * msg)
400 bt_share_appdata_t *ad;
403 retm_if(data == NULL, "Invalid argument: data is NULL\n");
404 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
406 ad = (bt_share_appdata_t *)data;
410 if (!dbus_message_get_args(msg, NULL,
411 DBUS_TYPE_STRING, &db,
412 DBUS_TYPE_INVALID)) {
413 ERR("Event handling failed");
417 _bt_share_ui_handle_update_view(ad, db);
420 static void __handle_opp_disconnect_signal(void *data, DBusMessage * msg)
423 bt_share_event_param_t event_info = { 0, };
424 bt_share_server_transfer_info_t transfer_info = { 0, };
425 char *address = NULL;
427 int result = BT_SHARE_UI_ERROR_NONE;
428 int transfer_id = -1;
430 retm_if(data == NULL, "Invalid argument: data is NULL\n");
431 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
433 member = (char *)dbus_message_get_member(msg);
434 retm_if(member == NULL, "Invalid argument: member is NULL\n");
436 if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) {
437 DBG("BT_OPP_CLIENT_DISCONNECTED");
438 event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED;
439 } else if (strcasecmp(member, BT_OPP_SERVER_DISCONNECTED) == 0) {
440 DBG("BT_OPP_SERVER_DISCONNECTED");
441 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED;
443 DBG("Unhandled Signal");
447 if (!dbus_message_get_args(msg, NULL,
448 DBUS_TYPE_INT32, &result,
449 DBUS_TYPE_STRING, &address,
450 DBUS_TYPE_INT32, &transfer_id,
451 DBUS_TYPE_INVALID)) {
452 ERR("get_args failed");
456 transfer_info.file_path = address;
457 transfer_info.transfer_id = transfer_id;
459 event_info.result = result;
460 event_info.user_data = data;
461 event_info.param_data = &transfer_info;
463 _bt_share_ui_event_handler(event_info.event, &event_info,
464 event_info.user_data);
469 static void __handle_home_key_signal(void *data, DBusMessage *msg)
473 retm_if(data == NULL, "Invalid argument: data is NULL");
474 retm_if(msg == NULL, "Invalid argument: msg is NULL");
476 member = dbus_message_get_member(msg);
477 retm_if(member == NULL, "member value is NULL");
479 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
482 if (!dbus_message_has_interface(msg, DBUS_CORE_APPS_INTERFACE) ||
483 !dbus_message_has_path(msg, DBUS_CORE_APPS_PATH))
486 DBG("Received signal : %s", member);
488 if (strcasecmp(member, DBUS_CORE_APPS_MEMBER) == 0)
492 static void __bt_add_tr_data_list(bt_share_appdata_t *ad, int transfer_type)
497 bt_tr_data_t *info = NULL;
498 bt_tr_data_t *tr_data = NULL;
503 retm_if(!ad, "ad is NULL!");
505 GSList *tr_data_list = ad->tr_data_list;
506 retm_if(!tr_data_list, "tr_data_list is NULL!");
508 Elm_Object_Item *git = elm_genlist_item_next_get(ad->file_title_item);
510 db = bt_share_open_db();
514 list = bt_share_get_all_tr_data_by_sid(db, transfer_type,
515 ad->transfer_info->device_address, ad->transfer_info->db_sid);
516 bt_share_close_db(db);
517 retm_if(!list, "fail to get tr list!");
519 /* Append new tr data to tr_data_list */
520 len = g_slist_length(list);
522 for (i = 0; i < len; i++) {
526 next = g_slist_next(next);
527 tr_data_list = g_slist_next(tr_data_list);
528 if (tr_data_list == NULL)
532 git = elm_genlist_item_next_get(git);
540 if (info->tr_status == BT_TRANSFER_SUCCESS)
542 else if (info->tr_status == BT_TRANSFER_FAIL)
545 DBG_SECURE("ID :%d Status:%d Filename :%s", info->id,
546 info->tr_status, info->file_path);
549 if (transfer_type == BT_TR_OUTBOUND &&
550 info->id > ad->outbound_latest_id) {
551 tr_data = g_new0(bt_tr_data_t, 1);
552 tr_data->id = info->id;
553 tr_data->sid = info->sid;
554 tr_data->tr_status = info->tr_status;
555 tr_data->file_path = g_strdup(info->file_path);
556 tr_data->dev_name = g_strdup(info->dev_name);
557 tr_data->timestamp = info->timestamp;
558 tr_data->addr = g_strdup(info->addr);
559 tr_data->type = g_strdup(info->type);
560 tr_data->content = g_strdup(info->content);
561 tr_data->size = info->size;
562 ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data);
563 } else if (transfer_type == BT_TR_INBOUND &&
564 info->id > ad->inbound_latest_id) {
565 tr_data = g_new0(bt_tr_data_t, 1);
566 tr_data->id = info->id;
567 tr_data->sid = info->sid;
568 tr_data->tr_status = info->tr_status;
569 tr_data->file_path = g_strdup(info->file_path);
570 tr_data->dev_name = g_strdup(info->dev_name);
571 tr_data->timestamp = info->timestamp;
572 tr_data->addr = g_strdup(info->addr);
573 tr_data->type = g_strdup(info->type);
574 tr_data->content = g_strdup(info->content);
575 tr_data->size = info->size;
576 ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data);
578 // Update data in list
579 bt_tr_data_t *list_info = NULL;
580 list_info = tr_data_list->data;
583 if (list_info->id == info->id) {
584 list_info->timestamp = info->timestamp;
585 list_info->tr_status = info->tr_status;
586 list_info->size = info->size;
587 if (list_info->type == NULL)
588 list_info->type = g_strdup(info->type);
590 if (list_info->tr_status == BT_TRANSFER_ONGOING)
591 ad->current_item = git;
596 next = g_slist_next(next);
600 tr_data_list = g_slist_next(tr_data_list);
603 git = elm_genlist_item_next_get(git);
606 ad->transfer_info->success = success;
607 ad->transfer_info->failed = failed;
608 DBG("SUCCESS:%d, FAILED:%d", success, failed);
610 elm_genlist_item_fields_update(ad->status_item, "*",
611 ELM_GENLIST_ITEM_FIELD_TEXT);
613 bt_share_release_tr_data_list(list);
616 void _bt_signal_init(bt_share_appdata_t *ad)
618 E_DBus_Connection *conn = NULL;
619 E_DBus_Signal_Handler *sh = NULL;
622 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
623 retm_if(conn == NULL, "conn is NULL\n");
625 e_dbus_request_name(conn, BT_SHARE_UI_INTERFACE, 0, NULL, NULL);
627 sh = e_dbus_signal_handler_add(conn,
632 __handle_opp_client_signal, ad);
633 retm_if(sh == NULL, "Connect Event register failed\n");
634 ad->client_connected_sh = sh;
636 sh = e_dbus_signal_handler_add(conn,
641 __handle_opp_client_signal, ad);
642 retm_if(sh == NULL, "started Event register failed\n");
643 ad->client_started_sh = sh;
645 sh = e_dbus_signal_handler_add(conn,
649 BT_TRANSFER_PROGRESS,
650 __handle_opp_client_signal, ad);
651 retm_if(sh == NULL, "progress Event register failed\n");
652 ad->client_progress_sh = sh;
654 sh = e_dbus_signal_handler_add(conn,
658 BT_TRANSFER_COMPLETED,
659 __handle_opp_client_signal, ad);
660 retm_if(sh == NULL, "complete Event register failed\n");
661 ad->client_completed_sh = sh;
663 sh = e_dbus_signal_handler_add(conn,
668 __handle_obex_server_signal, ad);
669 retm_if(sh == NULL, "started Event register failed\n");
670 ad->server_started_sh = sh;
672 sh = e_dbus_signal_handler_add(conn,
676 BT_TRANSFER_PROGRESS,
677 __handle_obex_server_signal, ad);
678 retm_if(sh == NULL, "progress Event register failed\n");
679 ad->server_progress_sh = sh;
681 sh = e_dbus_signal_handler_add(conn,
685 BT_TRANSFER_COMPLETED,
686 __handle_obex_server_signal, ad);
687 retm_if(sh == NULL, "complete Event register failed\n");
688 ad->server_completed_sh = sh;
690 sh = e_dbus_signal_handler_add(conn,
693 BT_SHARE_ENG_INTERFACE,
694 BT_SHARE_ENG_SIGNAL_UPDATE_VIEW,
695 __handle_update_view_signal, ad);
697 retm_if(sh == NULL, "Progress Event register failed\n");
700 sh = e_dbus_signal_handler_add(conn,
703 BT_SHARE_ENG_INTERFACE,
704 BT_OPP_CLIENT_DISCONNECTED,
705 __handle_opp_disconnect_signal, ad);
706 retm_if(sh == NULL, "Disconnected Event register failed\n");
707 ad->client_disconnected_sh = sh;
709 sh = e_dbus_signal_handler_add(conn,
712 BT_SHARE_ENG_INTERFACE,
713 BT_OPP_SERVER_DISCONNECTED,
714 __handle_opp_disconnect_signal, ad);
715 retm_if(sh == NULL, "Disconnected Event register failed\n");
716 ad->server_disconnected_sh = sh;
718 sh = e_dbus_signal_handler_add(conn,
721 DBUS_CORE_APPS_INTERFACE,
722 DBUS_CORE_APPS_MEMBER,
723 __handle_home_key_signal, ad);
724 retm_if(sh == NULL, "Connect Event register failed");
725 ad->app_core_sh = sh;
727 ad->dbus_conn = conn;
732 void _bt_signal_deinit(bt_share_appdata_t *ad)
736 if (ad->client_connected_sh) {
737 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_connected_sh);
738 ad->client_connected_sh = NULL;
740 if (ad->client_started_sh) {
741 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_started_sh);
742 ad->client_started_sh = NULL;
744 if (ad->client_progress_sh) {
745 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_progress_sh);
746 ad->client_progress_sh = NULL;
748 if (ad->client_completed_sh) {
749 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_completed_sh);
750 ad->client_completed_sh = NULL;
752 if (ad->server_started_sh) {
753 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_started_sh);
754 ad->server_started_sh = NULL;
756 if (ad->server_progress_sh) {
757 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_progress_sh);
758 ad->server_progress_sh = NULL;
760 if (ad->server_completed_sh) {
761 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_completed_sh);
762 ad->server_completed_sh = NULL;
764 if (ad->client_disconnected_sh) {
765 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_disconnected_sh);
766 ad->client_disconnected_sh = NULL;
768 if (ad->server_disconnected_sh) {
769 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_disconnected_sh);
770 ad->server_disconnected_sh = NULL;
773 e_dbus_signal_handler_del(ad->dbus_conn, ad->update_sh);
774 ad->update_sh = NULL;
776 if (ad->app_core_sh) {
777 e_dbus_signal_handler_del(ad->dbus_conn, ad->app_core_sh);
778 ad->app_core_sh = NULL;
783 int _bt_abort_signal_send(bt_share_appdata_t *ad,
784 bt_share_abort_data_t *abort_data)
787 DBusMessage *msg = NULL;
789 retvm_if(abort_data == NULL, -1,
790 "progressbar data is NULL\n");
791 retvm_if(ad->dbus_conn == NULL, -1,
792 "Invalid argument: ad->dbus_conn is NULL\n");
794 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
795 BT_SHARE_UI_INTERFACE,
796 BT_SHARE_UI_SIGNAL_OPPABORT);
798 retvm_if(msg == NULL, -1, "msg is NULL\n");
800 if (!dbus_message_append_args(msg,
801 DBUS_TYPE_STRING, &abort_data->transfer_type,
802 DBUS_TYPE_INT32, &abort_data->transfer_id,
803 DBUS_TYPE_INVALID)) {
804 ERR("Abort sending failed");
805 dbus_message_unref(msg);
809 ad->opp_transfer_abort = TRUE; /* Transfer aborted by user */
811 INFO("abort_data->transfer_type = %s", abort_data->transfer_type);
812 INFO("abort_data->transfer_id = %d", abort_data->transfer_id);
814 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
815 dbus_message_unref(msg);
820 static void __bt_conv_addr_string_to_addr_type(char *addr,
826 if (!address || !addr)
829 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
830 addr[i] = strtol(address, &ptr, 16);
840 int _bt_share_ui_retry_failed(bt_share_appdata_t *ad)
843 DBusMessage *msg = NULL;
844 DBusMessageIter iter;
845 DBusMessageIter array_iter;
846 DBusMessageIter file_iter;
847 DBusMessageIter filepath_iter;
848 char *bd_addr = NULL;
849 char **file_path = NULL;
852 bt_tr_data_t *info = NULL;
854 int valid_files_count;
855 GSList *current = NULL;
856 GSList *failed = NULL;
858 DBG_SECURE("Device:%s SID:%s", ad->transfer_info->device_address,
859 ad->transfer_info->db_sid);
861 failed = ad->tr_data_list;
863 retvm_if(failed == NULL, -1, "Invalid argument: info is NULL\n");
865 retvm_if(ad->dbus_conn == NULL, -1,
866 "Invalid argument: ad->dbus_conn is NULL\n");
868 files_count = g_slist_length(failed);
869 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
870 BT_SHARE_UI_INTERFACE,
871 BT_SHARE_UI_SIGNAL_SEND_FILE);
878 bd_addr = g_new0(char, BT_ADDRESS_LENGTH_MAX);
879 __bt_conv_addr_string_to_addr_type((char *)bd_addr,
880 ad->transfer_info->device_address);
882 file_path = g_new0(char *, files_count);
885 DBG("Total files: %d", files_count);
887 while (current && (count < files_count)) {
888 info = current->data;
890 if (info->tr_status != BT_TRANSFER_FAIL) {
891 current = g_slist_next(current);
895 /* check for valid utf8 file*/
896 if (!g_utf8_validate(info->file_path, -1, NULL)) {
897 ERR_SECURE("Invalid filepath: %s", info->file_path);
898 notification_status_message_post(BT_STR_UNABLE_TO_SEND);
902 /* file validation check begin*/
903 if (access(info->file_path, F_OK) != 0) {
904 ERR_SECURE("access failed for %s. May be file is deleted from the Device", info->file_path);
905 notification_status_message_post(BT_STR_FILE_NOT_EXIST);
908 /* file validation check end*/
910 file_path[count] = g_strdup(info->content);
912 current = g_slist_next(current);
916 dbus_message_iter_init_append(msg, &iter);
918 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
919 DBUS_TYPE_BYTE_AS_STRING, &array_iter);
921 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
922 dbus_message_iter_append_basic(&array_iter,
923 DBUS_TYPE_BYTE, &bd_addr[i]);
925 dbus_message_iter_close_container(&iter, &array_iter);
928 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
930 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
934 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
935 DBUS_TYPE_ARRAY_AS_STRING
936 DBUS_TYPE_BYTE_AS_STRING, &file_iter);
939 valid_files_count = count;
940 for (count = 0; count < valid_files_count; count++) {
942 dbus_message_iter_open_container(&file_iter, DBUS_TYPE_ARRAY,
943 DBUS_TYPE_BYTE_AS_STRING, &filepath_iter);
944 file_length = strlen(file_path[count]);
945 for (i = 0; i < file_length; i++) {
946 dbus_message_iter_append_basic(&filepath_iter, DBUS_TYPE_BYTE,
947 &file_path[count][i]);
949 dbus_message_iter_close_container(&file_iter, &filepath_iter);
952 dbus_message_iter_close_container(&iter, &file_iter);
954 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
957 dbus_message_unref(msg);
960 for (count = 0; count < files_count; count++)
961 g_free(file_path[count]);
969 int _bt_share_ui_ipc_info_update(bt_share_appdata_t *ad, int uid)
972 retv_if(ad == NULL, -1);
974 DBusMessage *msg = NULL;
979 info_type = ad->tr_type;
981 INFO("info_uid = %d", info_uid);
982 INFO("info_type = %d", info_type);
984 retvm_if(ad->dbus_conn == NULL, -1,
985 "Invalid argument: ad->dbus_conn is NULL\n");
987 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
988 BT_SHARE_UI_INTERFACE,
989 BT_SHARE_UI_SIGNAL_INFO_UPDATE);
991 retvm_if(msg == NULL, -1, "msg is NULL\n");
993 if (!dbus_message_append_args(msg,
994 DBUS_TYPE_INT32, &info_uid,
995 DBUS_TYPE_INT32, &info_type,
996 DBUS_TYPE_INVALID)) {
997 ERR("Connect sending failed");
998 dbus_message_unref(msg);
1002 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
1003 dbus_message_unref(msg);
1009 void _bt_share_ui_handle_update_view(bt_share_appdata_t *ad,
1012 GSList *list_iter = NULL;
1013 bt_tr_data_t *info = NULL;
1015 Elm_Object_Item *git;
1018 if (g_strcmp0(table, BT_INBOUND_TABLE) == 0)
1019 transfer_type = BT_TR_INBOUND;
1020 else if (g_strcmp0(table, BT_OUTBOUND_TABLE) == 0)
1021 transfer_type = BT_TR_OUTBOUND;
1025 __bt_add_tr_data_list(ad, transfer_type);
1027 /* Insert new transfer result to first genlist item */
1028 list_iter = ad->tr_data_list;
1029 if (transfer_type == BT_TR_INBOUND && ad->tr_type == BT_TR_INBOUND) {
1030 while (NULL != list_iter) {
1031 info = list_iter->data;
1032 if (info->id > ad->inbound_latest_id) {
1033 _bt_genlist_append_tr_data_item
1034 (ad, info, transfer_type);
1037 list_iter = g_slist_next(list_iter);
1039 } else if (transfer_type == BT_TR_OUTBOUND &&
1040 ad->tr_type == BT_TR_OUTBOUND) {
1041 while (NULL != list_iter) {
1042 info = list_iter->data;
1043 if (info->id > ad->outbound_latest_id) {
1044 _bt_genlist_append_tr_data_item
1045 (ad, info, transfer_type);
1047 list_iter = g_slist_next(list_iter);
1051 /* Update Finished and Processing Items */
1052 if (ad->current_item) {
1053 _bt_share_genlist_item_content_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON);
1054 _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT);
1055 _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_SIZE);
1057 git = elm_genlist_item_prev_get(ad->current_item);
1058 _bt_share_genlist_item_content_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON);
1059 _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT);
1060 _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_SIZE);
1063 evas_object_show(ad->tr_genlist);
1067 static void __bt_share_ui_handle_progress(bt_share_appdata_t *ad,
1068 int transfer_id, char *name, int percentage,
1069 gboolean completed, int error_type)
1072 if (completed == FALSE)
1073 _bt_update_progressbar(ad, transfer_id, name, percentage);
1075 static void __bt_share_ui_handle_error(bt_share_appdata_t *ad, int error_type,
1076 bt_share_tr_type_e trans_type)
1078 DBG("Error type : %d", error_type);
1080 switch (error_type) {
1081 case BT_SHARE_UI_ERROR_NOT_CONNECTED:
1082 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND);
1084 case BT_SHARE_UI_ERROR_CANCEL:
1085 DBG("opp_transfer_abort by user:%d, trans_type = %d",
1086 ad->opp_transfer_abort, ad->tr_type);
1087 if ((trans_type == BT_TR_INBOUND) &&
1088 !ad->opp_transfer_abort)
1089 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_RECEIVE);
1090 else if (!ad->opp_transfer_abort &&
1091 (trans_type == BT_TR_OUTBOUND))
1092 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND);
1093 ad->opp_transfer_abort = FALSE;
1100 void _bt_share_ui_event_handler(int event, bt_share_event_param_t *param,
1104 bt_share_server_transfer_info_t *transfer_info = NULL;
1105 bt_share_transfer_info_t *client_info = NULL;
1108 bt_share_appdata_t *ad = (bt_share_appdata_t *)user_data;
1111 case BT_SHARE_UI_EVENT_OPC_CONNECTED:
1112 INFO("BT_SHARE_UI_EVENT_OPC_CONNECTED");
1113 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1114 __bt_share_ui_handle_error(ad, param->result,
1116 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1119 /* Set to false when new Outbound OPP session is started*/
1120 opc_launched_session = FALSE;
1123 case BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED:
1124 if (opc_launched_session == FALSE) {
1125 /* Do not process events for new OPP Session */
1126 INFO("TRANSFER_STARTED: Different Obex Session");
1130 INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED");
1131 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1132 client_info = (bt_share_transfer_info_t *)param->param_data;
1134 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1135 _bt_share_ui_handle_transfer_started(ad,
1136 client_info->device_addr, client_info->filename,
1137 client_info->size, 0, BT_TR_OUTBOUND);
1142 case BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS:
1143 if (opc_launched_session == FALSE) {
1144 /* Do not process events for new OPP Session */
1148 client_info = (bt_share_transfer_info_t *)param->param_data;
1150 name = strrchr(client_info->filename, '/');
1154 name = client_info->filename;
1156 percentage = client_info->percentage;
1157 __bt_share_ui_handle_progress(ad, 0, name, percentage,
1158 FALSE, BT_SHARE_UI_ERROR_NONE);
1161 case BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE:
1162 if (opc_launched_session == FALSE) {
1163 /* Do not process events for new OPP Session */
1164 INFO("TRANSFER_COMPLETE: Different Obex Session");
1168 INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE ");
1169 client_info = (bt_share_transfer_info_t *)param->param_data;
1171 if (g_strcmp0(ad->transfer_info->device_address, client_info->device_addr))
1174 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1175 __bt_share_ui_handle_error(ad, param->result,
1178 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1179 else if (ad->info_popup == NULL)
1180 _bt_terminate_app();
1182 _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr,
1188 INFO_SECURE("client_info->filename = [%s]",
1189 client_info->filename);
1191 name = strrchr(client_info->filename, '/');
1195 name = client_info->filename;
1197 INFO("name address = [%x]", name);
1198 __bt_share_ui_handle_progress(ad, 0, name, 100, TRUE,
1201 if (ad->tr_view == NULL)
1202 _bt_terminate_app();
1204 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1206 _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr,
1210 case BT_SHARE_UI_EVENT_OPC_DISCONNECTED: {
1211 GSList *failed = NULL;
1214 INFO("BT_SHARE_UI_EVENT_OPC_DISCONNECTED");
1216 db = bt_share_open_db();
1217 retm_if(!db, "fail to open db!");
1219 failed = bt_share_get_failed_tr_data_by_sid(db,
1220 ad->tr_type, ad->transfer_info->device_address,
1221 ad->transfer_info->db_sid);
1222 bt_share_close_db(db);
1225 /* Some failed items are there */
1226 elm_object_text_set(ad->toolbar_button,
1227 BT_STR_RESEND_FAILED_FILES);
1228 elm_object_disabled_set(ad->toolbar_button, FALSE);
1230 bt_share_release_tr_data_list(failed);
1232 _bt_share_delete_toolbar_button(ad);
1233 ad->launch_mode = BT_LAUNCH_TRANSFER_LIST;
1235 _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_OUTBOUND);
1236 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1238 elm_genlist_realized_items_update(ad->tr_genlist);
1242 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED:
1243 INFO("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED");
1244 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1245 transfer_info = param->param_data;
1247 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1248 /* Different session */
1249 INFO("TRANSFER_STARTED: Different Session");
1253 _bt_share_ui_handle_transfer_started(ad, transfer_info->address,
1254 transfer_info->filename, transfer_info->file_size, transfer_info->transfer_id,
1258 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
1259 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1260 transfer_info = param->param_data;
1262 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1263 /* Different session */
1266 __bt_share_ui_handle_progress(ad,
1267 transfer_info->transfer_id,
1268 transfer_info->filename,
1269 transfer_info->percentage,
1270 FALSE, BT_SHARE_UI_ERROR_NONE);
1274 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
1275 INFO("BT_SHARE_UI_EVENT_OBEX_TRANSFER_COMPLETED ");
1277 transfer_info = param->param_data;
1278 if (g_strcmp0(ad->transfer_info->device_address, transfer_info->address))
1281 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1282 /* Different session */
1283 INFO("TRANSFER_STARTED: Different Session");
1287 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1288 __bt_share_ui_handle_error(ad, param->result,
1291 _bt_share_ui_handle_update_view(ad,
1294 _bt_share_ui_handle_transfer_complete(ad, transfer_info->address,
1299 if (ad->tr_view == NULL)
1300 _bt_terminate_app();
1302 _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE);
1304 _bt_share_ui_handle_transfer_complete(ad, transfer_info->address,
1308 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED: {
1309 DBG("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED");
1310 transfer_info = param->param_data;
1311 INFO("transfer_info->transfer_id: [%d]", transfer_info->transfer_id);
1312 INFO("ad->transfer_info->transfer_id: [%d]", ad->transfer_info->transfer_id);
1313 if (transfer_info->transfer_id == ad->transfer_info->transfer_id) {
1314 DBG("Same session");
1315 _bt_share_delete_toolbar_button(ad);
1316 _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_INBOUND);
1318 _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE);
1319 elm_genlist_realized_items_update(ad->tr_genlist);
1325 DBG("Unhandled event %x", event);