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>
28 #include <notification.h>
29 #include <bluetooth-share-api.h>
31 #include "bt-share-ui-main.h"
32 #include "bt-share-ui-ipc.h"
33 #include "bt-share-ui-view.h"
34 #include "bt-share-ui-popup.h"
35 #include "bt-share-ui-resource.h"
36 #include "bt-share-ui-widget.h"
38 #define BT_ADDRESS_LENGTH_MAX 6
40 static gboolean opc_launched_session;
42 void _bt_set_opc_launched_session(gboolean value)
44 opc_launched_session = value;
47 static void __handle_opp_client_signal(void *data, DBusMessage *msg)
49 bt_share_event_param_t event_info = { 0, };
50 int result = BT_SHARE_UI_ERROR_NONE;
51 const char *member = dbus_message_get_member(msg);
53 retm_if(data == NULL, "Invalid argument: data is NULL\n");
54 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
55 bt_share_appdata_t *ad = (bt_share_appdata_t *)data;
56 retm_if(ad->tr_type == BT_TR_INBOUND, "Invalid tr_type: BT_TR_INBOUND");
57 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
60 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
63 if (!dbus_message_has_path(msg, BT_OPP_CLIENT_PATH))
66 ret_if(member == NULL);
68 if (strcasecmp(member, BT_OPP_CONNECTED) == 0) {
71 DBG("BT_OPP_CONNECTED signal");
72 if (!dbus_message_get_args(msg, NULL,
73 DBUS_TYPE_INT32, &result,
74 DBUS_TYPE_STRING, &address,
75 DBUS_TYPE_INT32, &request_id,
77 ERR("Unexpected parameters in signal");
80 event_info.event = BT_SHARE_UI_EVENT_OPC_CONNECTED;
81 event_info.param_data = address;
82 event_info.result = result;
83 event_info.user_data = data;
84 DBG("Event BT_SHARE_UI_EVENT_OPC_CONNECTED");
85 _bt_share_ui_event_handler(BT_SHARE_UI_EVENT_OPC_CONNECTED,
86 &event_info, event_info.user_data);
87 } else if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
88 char *file_path = NULL;
89 char *file_name = NULL;
90 char *device_addr = NULL;
93 bt_share_transfer_info_t transfer_info;
95 if (!dbus_message_get_args(msg, NULL,
96 DBUS_TYPE_INT32, &result,
97 DBUS_TYPE_STRING, &device_addr,
98 DBUS_TYPE_STRING, &file_path,
99 DBUS_TYPE_UINT64, &size,
100 DBUS_TYPE_INT32, &request_id,
101 DBUS_TYPE_INVALID)) {
102 ERR("Unexpected parameters in signal");
106 file_name = g_path_get_basename(file_path);
107 DBG("file_name:%s file_path:%s", file_name, file_path);
109 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
111 transfer_info.device_addr = g_strdup(device_addr);
112 transfer_info.filename = g_strdup(file_name);
113 transfer_info.size = size;
114 transfer_info.percentage = 0;
116 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED;
117 event_info.param_data = &transfer_info;
118 event_info.result = result;
119 event_info.user_data = data;
121 _bt_share_ui_event_handler(
122 BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED,
123 &event_info, event_info.user_data);
125 g_free(transfer_info.device_addr);
126 g_free(transfer_info.filename);
128 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
129 char *file_name = NULL;
133 bt_share_transfer_info_t transfer_info;
135 if (!dbus_message_get_args(msg, NULL,
136 DBUS_TYPE_INT32, &result,
137 DBUS_TYPE_STRING, &file_name,
138 DBUS_TYPE_UINT64, &size,
139 DBUS_TYPE_INT32, &progress,
140 DBUS_TYPE_INT32, &request_id,
141 DBUS_TYPE_INVALID)) {
142 ERR("Unexpected parameters in signal");
146 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
148 transfer_info.filename = g_strdup(file_name);
149 transfer_info.size = size;
150 transfer_info.percentage = progress;
152 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS;
153 event_info.param_data = &transfer_info;
154 event_info.result = result;
155 event_info.user_data = data;
157 _bt_share_ui_event_handler(
158 BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS,
159 &event_info, event_info.user_data);
161 g_free(transfer_info.filename);
162 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
163 char *file_name = NULL;
164 char *device_addr = NULL;
167 bt_share_transfer_info_t transfer_info;
169 if (!dbus_message_get_args(msg, NULL,
170 DBUS_TYPE_INT32, &result,
171 DBUS_TYPE_STRING, &device_addr,
172 DBUS_TYPE_STRING, &file_name,
173 DBUS_TYPE_UINT64, &size,
174 DBUS_TYPE_INT32, &request_id,
175 DBUS_TYPE_INVALID)) {
176 ERR("Unexpected parameters in signal");
180 memset(&transfer_info, 0x00, sizeof(bt_share_transfer_info_t));
182 transfer_info.device_addr = g_strdup(device_addr);
183 transfer_info.filename = g_strdup(file_name);
184 transfer_info.size = size;
186 event_info.event = BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE;
187 event_info.param_data = &transfer_info;
188 event_info.result = result;
189 event_info.user_data = data;
191 _bt_share_ui_event_handler(
192 BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE,
193 &event_info, event_info.user_data);
195 g_free(transfer_info.device_addr);
196 g_free(transfer_info.filename);
197 } else if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) {
198 DBG("BT_OPP_CLIENT_DISCONNECTED signal");
199 char *device_addr = NULL;
202 if (!dbus_message_get_args(msg, NULL,
203 DBUS_TYPE_INT32, &result,
204 DBUS_TYPE_STRING, &device_addr,
205 DBUS_TYPE_INT32, &request_id,
206 DBUS_TYPE_INVALID)) {
207 ERR("Unexpected parameters in signal");
211 event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED;
212 event_info.param_data = device_addr;
213 event_info.result = result;
214 event_info.user_data = data;
216 _bt_share_ui_event_handler(
217 BT_SHARE_UI_EVENT_OPC_DISCONNECTED,
218 &event_info, event_info.user_data);
222 static void __handle_obex_server_signal(void *data, DBusMessage *msg)
224 bt_share_event_param_t event_info = { 0, };
225 int result = BT_SHARE_UI_ERROR_NONE;
226 const char *member = dbus_message_get_member(msg);
228 retm_if(data == NULL, "Invalid argument: data is NULL\n");
229 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
230 bt_share_appdata_t *ad = (bt_share_appdata_t *)data;
231 retm_if(ad->tr_type == BT_TR_OUTBOUND, "Invalid tr_type: BT_TR_OUTBOUND");
232 if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_SIGNAL)
235 if (!dbus_message_has_interface(msg, BT_EVENT_SERVICE))
238 if (!dbus_message_has_path(msg, BT_OPP_SERVER_PATH))
241 retm_if(member == NULL, "member value is NULL\n");
242 if (strcasecmp(member, BT_TRANSFER_STARTED) == 0) {
243 char *file_name = NULL;
245 char *device_name = NULL;
246 char *device_addr = NULL;
248 int server_type = 0; /* bt_server_type_t */
250 bt_share_server_transfer_info_t transfer_info;
252 if (!dbus_message_get_args(msg, NULL,
253 DBUS_TYPE_INT32, &result,
254 DBUS_TYPE_STRING, &device_name,
255 DBUS_TYPE_STRING, &file_name,
256 DBUS_TYPE_STRING, &type,
257 DBUS_TYPE_STRING, &device_addr,
258 DBUS_TYPE_UINT64, &size,
259 DBUS_TYPE_INT32, &transfer_id,
260 DBUS_TYPE_INT32, &server_type,
261 DBUS_TYPE_INVALID)) {
262 ERR("Unexpected parameters in signal");
266 memset(&transfer_info, 0x00,
267 sizeof(bt_share_server_transfer_info_t));
269 transfer_info.device_name = g_strdup(device_name);
270 transfer_info.address = g_strdup(device_addr);
271 transfer_info.filename = g_strdup(file_name);
272 transfer_info.type = g_strdup(type);
273 transfer_info.file_size = size;
274 transfer_info.transfer_id = transfer_id;
275 transfer_info.percentage = 0;
277 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED;
278 event_info.param_data = &transfer_info;
279 event_info.result = result;
280 event_info.user_data = data;
282 _bt_share_ui_event_handler(
283 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED,
284 &event_info, event_info.user_data);
286 g_free(transfer_info.device_name);
287 g_free(transfer_info.address);
288 g_free(transfer_info.filename);
289 g_free(transfer_info.type);
290 } else if (strcasecmp(member, BT_TRANSFER_PROGRESS) == 0) {
291 char *file_name = NULL;
293 char *device_name = NULL;
294 char *device_addr = NULL;
297 int server_type = 0; /* bt_server_type_t */
299 bt_share_server_transfer_info_t transfer_info;
301 if (!dbus_message_get_args(msg, NULL,
302 DBUS_TYPE_INT32, &result,
303 DBUS_TYPE_STRING, &file_name,
304 DBUS_TYPE_STRING, &type,
305 DBUS_TYPE_STRING, &device_name,
306 DBUS_TYPE_STRING, &device_addr,
307 DBUS_TYPE_UINT64, &size,
308 DBUS_TYPE_INT32, &transfer_id,
309 DBUS_TYPE_INT32, &progress,
310 DBUS_TYPE_INT32, &server_type,
311 DBUS_TYPE_INVALID)) {
312 ERR("Unexpected parameters in signal");
316 memset(&transfer_info, 0x00,
317 sizeof(bt_share_server_transfer_info_t));
319 transfer_info.device_name = g_strdup(device_name);
320 transfer_info.address = g_strdup(device_addr);
321 transfer_info.filename = g_strdup(file_name);
322 transfer_info.type = g_strdup(type);
323 transfer_info.file_size = size;
324 transfer_info.transfer_id = transfer_id;
325 transfer_info.percentage = progress;
327 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS;
328 event_info.param_data = &transfer_info;
329 event_info.result = result;
330 event_info.user_data = data;
332 _bt_share_ui_event_handler(
333 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS,
334 &event_info, event_info.user_data);
336 g_free(transfer_info.device_name);
337 g_free(transfer_info.address);
338 g_free(transfer_info.filename);
339 g_free(transfer_info.type);
340 } else if (strcasecmp(member, BT_TRANSFER_COMPLETED) == 0) {
341 char *file_name = NULL;
342 char *device_name = NULL;
343 char *device_addr = NULL;
347 int server_type = 0; /* bt_server_type_t */
349 bt_share_server_transfer_info_t transfer_info;
351 if (!dbus_message_get_args(msg, NULL,
352 DBUS_TYPE_INT32, &result,
353 DBUS_TYPE_STRING, &file_name,
354 DBUS_TYPE_STRING, &type,
355 DBUS_TYPE_STRING, &device_name,
356 DBUS_TYPE_STRING, &file_path,
357 DBUS_TYPE_STRING, &device_addr,
358 DBUS_TYPE_UINT64, &size,
359 DBUS_TYPE_INT32, &transfer_id,
360 DBUS_TYPE_INT32, &server_type,
361 DBUS_TYPE_INVALID)) {
362 ERR("Unexpected parameters in signal");
366 memset(&transfer_info, 0x00,
367 sizeof(bt_share_server_transfer_info_t));
369 transfer_info.filename = g_strdup(file_name);
370 transfer_info.type = g_strdup(type);
371 transfer_info.device_name = g_strdup(device_name);
372 transfer_info.address = g_strdup(device_addr);
373 transfer_info.file_path = g_strdup(file_path);
374 transfer_info.file_size = size;
375 transfer_info.transfer_id = transfer_id;
377 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED;
378 event_info.param_data = &transfer_info;
379 event_info.result = result;
380 event_info.user_data = data;
382 _bt_share_ui_event_handler(
383 BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED,
384 &event_info, event_info.user_data);
386 g_free(transfer_info.filename);
387 g_free(transfer_info.type);
388 g_free(transfer_info.device_name);
389 g_free(transfer_info.address);
390 g_free(transfer_info.file_path);
394 static void __handle_update_view_signal(void *data, DBusMessage * msg)
396 bt_share_appdata_t *ad;
399 retm_if(data == NULL, "Invalid argument: data is NULL\n");
400 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
402 ad = (bt_share_appdata_t *)data;
406 if (!dbus_message_get_args(msg, NULL,
407 DBUS_TYPE_STRING, &db,
408 DBUS_TYPE_INVALID)) {
409 ERR("Event handling failed");
413 _bt_share_ui_handle_update_view(ad, db);
416 static void __handle_opp_disconnect_signal(void *data, DBusMessage * msg)
419 bt_share_event_param_t event_info = { 0, };
420 bt_share_server_transfer_info_t transfer_info = { 0, };
421 char *address = NULL;
423 int result = BT_SHARE_UI_ERROR_NONE;
424 int transfer_id = -1;
426 retm_if(data == NULL, "Invalid argument: data is NULL\n");
427 retm_if(msg == NULL, "Invalid argument: msg is NULL\n");
429 member = (char *)dbus_message_get_member(msg);
430 retm_if(member == NULL, "Invalid argument: member is NULL\n");
432 if (strcasecmp(member, BT_OPP_CLIENT_DISCONNECTED) == 0) {
433 DBG("BT_OPP_CLIENT_DISCONNECTED");
434 event_info.event = BT_SHARE_UI_EVENT_OPC_DISCONNECTED;
435 } else if (strcasecmp(member, BT_OPP_SERVER_DISCONNECTED) == 0) {
436 DBG("BT_OPP_SERVER_DISCONNECTED");
437 event_info.event = BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED;
439 DBG("Unhandled Signal");
443 if (!dbus_message_get_args(msg, NULL,
444 DBUS_TYPE_INT32, &result,
445 DBUS_TYPE_STRING, &address,
446 DBUS_TYPE_INT32, &transfer_id,
447 DBUS_TYPE_INVALID)) {
448 ERR("get_args failed");
452 transfer_info.file_path = address;
453 transfer_info.transfer_id = transfer_id;
455 event_info.result = result;
456 event_info.user_data = data;
457 event_info.param_data = &transfer_info;
459 _bt_share_ui_event_handler(event_info.event, &event_info,
460 event_info.user_data);
465 static void __bt_add_tr_data_list(bt_share_appdata_t *ad, int transfer_type)
470 bt_tr_data_t *info = NULL;
471 bt_tr_data_t *tr_data = NULL;
476 retm_if(!ad, "ad is NULL!");
478 GSList *tr_data_list = ad->tr_data_list;
479 retm_if(!tr_data_list, "tr_data_list is NULL!");
481 Elm_Object_Item *git = elm_genlist_item_next_get(ad->file_title_item);
483 db = bt_share_open_db();
487 list = bt_share_get_all_tr_data_by_sid(db, transfer_type,
488 ad->transfer_info->device_address, ad->transfer_info->db_sid);
489 bt_share_close_db(db);
490 retm_if(!list, "fail to get tr list!");
492 /* Append new tr data to tr_data_list */
493 len = g_slist_length(list);
495 for (i = 0; i < len; i++) {
499 next = g_slist_next(next);
500 tr_data_list = g_slist_next(tr_data_list);
501 if (tr_data_list == NULL)
505 git = elm_genlist_item_next_get(git);
513 if (info->tr_status == BT_TRANSFER_SUCCESS)
515 else if (info->tr_status == BT_TRANSFER_FAIL)
518 DBG_SECURE("ID :%d Status:%d Filename :%s", info->id,
519 info->tr_status, info->file_path);
522 if (transfer_type == BT_TR_OUTBOUND &&
523 info->id > ad->outbound_latest_id) {
524 tr_data = g_new0(bt_tr_data_t, 1);
525 tr_data->id = info->id;
526 tr_data->sid = info->sid;
527 tr_data->tr_status = info->tr_status;
528 tr_data->file_path = g_strdup(info->file_path);
529 tr_data->dev_name = g_strdup(info->dev_name);
530 tr_data->timestamp = info->timestamp;
531 tr_data->addr = g_strdup(info->addr);
532 tr_data->type = g_strdup(info->type);
533 tr_data->content = g_strdup(info->content);
534 tr_data->size = info->size;
535 ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data);
536 } else if (transfer_type == BT_TR_INBOUND &&
537 info->id > ad->inbound_latest_id) {
538 tr_data = g_new0(bt_tr_data_t, 1);
539 tr_data->id = info->id;
540 tr_data->sid = info->sid;
541 tr_data->tr_status = info->tr_status;
542 tr_data->file_path = g_strdup(info->file_path);
543 tr_data->dev_name = g_strdup(info->dev_name);
544 tr_data->timestamp = info->timestamp;
545 tr_data->addr = g_strdup(info->addr);
546 tr_data->type = g_strdup(info->type);
547 tr_data->content = g_strdup(info->content);
548 tr_data->size = info->size;
549 ad->tr_data_list = g_slist_append(ad->tr_data_list, tr_data);
551 // Update data in list
552 bt_tr_data_t *list_info = NULL;
553 list_info = tr_data_list->data;
556 if (list_info->id == info->id) {
557 list_info->timestamp = info->timestamp;
558 list_info->tr_status = info->tr_status;
559 list_info->size = info->size;
560 if (list_info->type == NULL)
561 list_info->type = g_strdup(info->type);
563 if (list_info->tr_status == BT_TRANSFER_ONGOING)
564 ad->current_item = git;
569 next = g_slist_next(next);
573 tr_data_list = g_slist_next(tr_data_list);
576 git = elm_genlist_item_next_get(git);
579 ad->transfer_info->success = success;
580 ad->transfer_info->failed = failed;
581 DBG("SUCCESS:%d, FAILED:%d", success, failed);
583 elm_genlist_item_fields_update(ad->status_item, "*",
584 ELM_GENLIST_ITEM_FIELD_TEXT);
586 bt_share_release_tr_data_list(list);
589 void _bt_signal_init(bt_share_appdata_t *ad)
591 E_DBus_Connection *conn = NULL;
592 E_DBus_Signal_Handler *sh = NULL;
595 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
596 retm_if(conn == NULL, "conn is NULL\n");
598 e_dbus_request_name(conn, BT_SHARE_UI_INTERFACE, 0, NULL, NULL);
600 sh = e_dbus_signal_handler_add(conn,
605 __handle_opp_client_signal, ad);
606 retm_if(sh == NULL, "Connect Event register failed\n");
607 ad->client_connected_sh = sh;
609 sh = e_dbus_signal_handler_add(conn,
614 __handle_opp_client_signal, ad);
615 retm_if(sh == NULL, "started Event register failed\n");
616 ad->client_started_sh = sh;
618 sh = e_dbus_signal_handler_add(conn,
622 BT_TRANSFER_PROGRESS,
623 __handle_opp_client_signal, ad);
624 retm_if(sh == NULL, "progress Event register failed\n");
625 ad->client_progress_sh = sh;
627 sh = e_dbus_signal_handler_add(conn,
631 BT_TRANSFER_COMPLETED,
632 __handle_opp_client_signal, ad);
633 retm_if(sh == NULL, "complete Event register failed\n");
634 ad->client_completed_sh = sh;
636 sh = e_dbus_signal_handler_add(conn,
641 __handle_obex_server_signal, ad);
642 retm_if(sh == NULL, "started Event register failed\n");
643 ad->server_started_sh = sh;
645 sh = e_dbus_signal_handler_add(conn,
649 BT_TRANSFER_PROGRESS,
650 __handle_obex_server_signal, ad);
651 retm_if(sh == NULL, "progress Event register failed\n");
652 ad->server_progress_sh = sh;
654 sh = e_dbus_signal_handler_add(conn,
658 BT_TRANSFER_COMPLETED,
659 __handle_obex_server_signal, ad);
660 retm_if(sh == NULL, "complete Event register failed\n");
661 ad->server_completed_sh = sh;
663 sh = e_dbus_signal_handler_add(conn,
666 BT_SHARE_ENG_INTERFACE,
667 BT_SHARE_ENG_SIGNAL_UPDATE_VIEW,
668 __handle_update_view_signal, ad);
670 retm_if(sh == NULL, "Progress Event register failed\n");
673 sh = e_dbus_signal_handler_add(conn,
676 BT_SHARE_ENG_INTERFACE,
677 BT_OPP_CLIENT_DISCONNECTED,
678 __handle_opp_disconnect_signal, ad);
679 retm_if(sh == NULL, "Disconnected Event register failed\n");
680 ad->client_disconnected_sh = sh;
682 sh = e_dbus_signal_handler_add(conn,
685 BT_SHARE_ENG_INTERFACE,
686 BT_OPP_SERVER_DISCONNECTED,
687 __handle_opp_disconnect_signal, ad);
688 retm_if(sh == NULL, "Disconnected Event register failed\n");
689 ad->server_disconnected_sh = sh;
691 ad->dbus_conn = conn;
696 void _bt_signal_deinit(bt_share_appdata_t *ad)
700 if (ad->client_connected_sh) {
701 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_connected_sh);
702 ad->client_connected_sh = NULL;
704 if (ad->client_started_sh) {
705 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_started_sh);
706 ad->client_started_sh = NULL;
708 if (ad->client_progress_sh) {
709 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_progress_sh);
710 ad->client_progress_sh = NULL;
712 if (ad->client_completed_sh) {
713 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_completed_sh);
714 ad->client_completed_sh = NULL;
716 if (ad->server_started_sh) {
717 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_started_sh);
718 ad->server_started_sh = NULL;
720 if (ad->server_progress_sh) {
721 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_progress_sh);
722 ad->server_progress_sh = NULL;
724 if (ad->server_completed_sh) {
725 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_completed_sh);
726 ad->server_completed_sh = NULL;
728 if (ad->client_disconnected_sh) {
729 e_dbus_signal_handler_del(ad->dbus_conn, ad->client_disconnected_sh);
730 ad->client_disconnected_sh = NULL;
732 if (ad->server_disconnected_sh) {
733 e_dbus_signal_handler_del(ad->dbus_conn, ad->server_disconnected_sh);
734 ad->server_disconnected_sh = NULL;
737 e_dbus_signal_handler_del(ad->dbus_conn, ad->update_sh);
738 ad->update_sh = NULL;
744 int _bt_abort_signal_send(bt_share_appdata_t *ad,
745 bt_share_abort_data_t *abort_data)
748 DBusMessage *msg = NULL;
750 retvm_if(abort_data == NULL, -1,
751 "progressbar data is NULL\n");
752 retvm_if(ad->dbus_conn == NULL, -1,
753 "Invalid argument: ad->dbus_conn is NULL\n");
755 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
756 BT_SHARE_UI_INTERFACE,
757 BT_SHARE_UI_SIGNAL_OPPABORT);
759 retvm_if(msg == NULL, -1, "msg is NULL\n");
761 if (!dbus_message_append_args(msg,
762 DBUS_TYPE_STRING, &abort_data->transfer_type,
763 DBUS_TYPE_INT32, &abort_data->transfer_id,
764 DBUS_TYPE_INVALID)) {
765 ERR("Abort sending failed");
766 dbus_message_unref(msg);
770 ad->opp_transfer_abort = TRUE; /* Transfer aborted by user */
772 INFO("abort_data->transfer_type = %s", abort_data->transfer_type);
773 INFO("abort_data->transfer_id = %d", abort_data->transfer_id);
775 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
776 dbus_message_unref(msg);
781 static void __bt_conv_addr_string_to_addr_type(char *addr,
787 if (!address || !addr)
790 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
791 addr[i] = strtol(address, &ptr, 16);
801 int _bt_share_ui_retry_failed(bt_share_appdata_t *ad)
804 DBusMessage *msg = NULL;
805 DBusMessageIter iter;
806 DBusMessageIter array_iter;
807 DBusMessageIter file_iter;
808 DBusMessageIter filepath_iter;
809 char *bd_addr = NULL;
810 char **file_path = NULL;
813 bt_tr_data_t *info = NULL;
815 int valid_files_count;
816 GSList *current = NULL;
817 GSList *failed = NULL;
819 DBG_SECURE("Device:%s SID:%s", ad->transfer_info->device_address,
820 ad->transfer_info->db_sid);
822 failed = ad->tr_data_list;
824 retvm_if(failed == NULL, -1, "Invalid argument: info is NULL\n");
826 retvm_if(ad->dbus_conn == NULL, -1,
827 "Invalid argument: ad->dbus_conn is NULL\n");
829 files_count = g_slist_length(failed);
830 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
831 BT_SHARE_UI_INTERFACE,
832 BT_SHARE_UI_SIGNAL_SEND_FILE);
839 bd_addr = g_new0(char, BT_ADDRESS_LENGTH_MAX);
840 __bt_conv_addr_string_to_addr_type((char *)bd_addr,
841 ad->transfer_info->device_address);
843 file_path = g_new0(char *, files_count);
846 DBG("Total files: %d", files_count);
848 while (current && (count < files_count)) {
849 info = current->data;
851 if (info->tr_status != BT_TRANSFER_FAIL) {
852 current = g_slist_next(current);
856 /* check for valid utf8 file*/
857 if (!g_utf8_validate(info->file_path, -1, NULL)) {
858 ERR_SECURE("Invalid filepath: %s", info->file_path);
859 notification_status_message_post(BT_STR_UNABLE_TO_SEND);
863 /* file validation check begin*/
864 if (access(info->file_path, F_OK) != 0) {
865 ERR_SECURE("access failed for %s. May be file is deleted from the Device", info->file_path);
866 notification_status_message_post(BT_STR_FILE_NOT_EXIST);
869 /* file validation check end*/
871 file_path[count] = g_strdup(info->content);
873 current = g_slist_next(current);
877 dbus_message_iter_init_append(msg, &iter);
879 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
880 DBUS_TYPE_BYTE_AS_STRING, &array_iter);
882 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++) {
883 dbus_message_iter_append_basic(&array_iter,
884 DBUS_TYPE_BYTE, &bd_addr[i]);
886 dbus_message_iter_close_container(&iter, &array_iter);
889 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
891 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
895 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
896 DBUS_TYPE_ARRAY_AS_STRING
897 DBUS_TYPE_BYTE_AS_STRING, &file_iter);
900 valid_files_count = count;
901 for (count = 0; count < valid_files_count; count++) {
903 dbus_message_iter_open_container(&file_iter, DBUS_TYPE_ARRAY,
904 DBUS_TYPE_BYTE_AS_STRING, &filepath_iter);
905 file_length = strlen(file_path[count]);
906 for (i = 0; i < file_length; i++) {
907 dbus_message_iter_append_basic(&filepath_iter, DBUS_TYPE_BYTE,
908 &file_path[count][i]);
910 dbus_message_iter_close_container(&file_iter, &filepath_iter);
913 dbus_message_iter_close_container(&iter, &file_iter);
915 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
918 dbus_message_unref(msg);
921 for (count = 0; count < files_count; count++)
922 g_free(file_path[count]);
930 int _bt_share_ui_ipc_info_update(bt_share_appdata_t *ad, int uid)
933 retv_if(ad == NULL, -1);
935 DBusMessage *msg = NULL;
940 info_type = ad->tr_type;
942 INFO("info_uid = %d", info_uid);
943 INFO("info_type = %d", info_type);
945 retvm_if(ad->dbus_conn == NULL, -1,
946 "Invalid argument: ad->dbus_conn is NULL\n");
948 msg = dbus_message_new_signal(BT_SHARE_ENG_OBJECT,
949 BT_SHARE_UI_INTERFACE,
950 BT_SHARE_UI_SIGNAL_INFO_UPDATE);
952 retvm_if(msg == NULL, -1, "msg is NULL\n");
954 if (!dbus_message_append_args(msg,
955 DBUS_TYPE_INT32, &info_uid,
956 DBUS_TYPE_INT32, &info_type,
957 DBUS_TYPE_INVALID)) {
958 ERR("Connect sending failed");
959 dbus_message_unref(msg);
963 e_dbus_message_send(ad->dbus_conn, msg, NULL, -1, NULL);
964 dbus_message_unref(msg);
970 void _bt_share_ui_handle_update_view(bt_share_appdata_t *ad,
973 GSList *list_iter = NULL;
974 bt_tr_data_t *info = NULL;
976 Elm_Object_Item *git;
979 if (g_strcmp0(table, BT_INBOUND_TABLE) == 0)
980 transfer_type = BT_TR_INBOUND;
981 else if (g_strcmp0(table, BT_OUTBOUND_TABLE) == 0)
982 transfer_type = BT_TR_OUTBOUND;
986 __bt_add_tr_data_list(ad, transfer_type);
988 /* Insert new transfer result to first genlist item */
989 list_iter = ad->tr_data_list;
990 if (transfer_type == BT_TR_INBOUND && ad->tr_type == BT_TR_INBOUND) {
991 while (NULL != list_iter) {
992 info = list_iter->data;
993 if (info->id > ad->inbound_latest_id) {
994 _bt_genlist_append_tr_data_item
995 (ad, info, transfer_type);
998 list_iter = g_slist_next(list_iter);
1000 } else if (transfer_type == BT_TR_OUTBOUND &&
1001 ad->tr_type == BT_TR_OUTBOUND) {
1002 while (NULL != list_iter) {
1003 info = list_iter->data;
1004 if (info->id > ad->outbound_latest_id) {
1005 _bt_genlist_append_tr_data_item
1006 (ad, info, transfer_type);
1008 list_iter = g_slist_next(list_iter);
1012 /* Update Finished and Processing Items */
1013 if (ad->current_item) {
1014 _bt_share_genlist_item_content_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON);
1015 _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT);
1016 _bt_share_genlist_item_text_update(ad->current_item, BT_SHARE_ITEM_PART_FILE_SIZE);
1018 git = elm_genlist_item_prev_get(ad->current_item);
1019 _bt_share_genlist_item_content_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_ICON);
1020 _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_TRANSFER_STATUS_TEXT);
1021 _bt_share_genlist_item_text_update(git, BT_SHARE_ITEM_PART_FILE_SIZE);
1024 evas_object_show(ad->tr_genlist);
1028 static void __bt_share_ui_handle_progress(bt_share_appdata_t *ad,
1029 int transfer_id, char *name, int percentage,
1030 gboolean completed, int error_type)
1033 if (completed == FALSE)
1034 _bt_update_progressbar(ad, transfer_id, name, percentage);
1036 static void __bt_share_ui_handle_error(bt_share_appdata_t *ad, int error_type,
1037 bt_share_tr_type_e trans_type)
1039 DBG("Error type : %d", error_type);
1041 switch (error_type) {
1042 case BT_SHARE_UI_ERROR_NOT_CONNECTED:
1043 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND);
1045 case BT_SHARE_UI_ERROR_CANCEL:
1046 DBG("opp_transfer_abort by user:%d, trans_type = %d",
1047 ad->opp_transfer_abort, ad->tr_type);
1048 if ((trans_type == BT_TR_INBOUND) &&
1049 !ad->opp_transfer_abort)
1050 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_RECEIVE);
1051 else if (!ad->opp_transfer_abort &&
1052 (trans_type == BT_TR_OUTBOUND))
1053 _bt_create_info_popup(ad, BT_STR_UNABLE_TO_SEND);
1054 ad->opp_transfer_abort = FALSE;
1061 void _bt_share_ui_event_handler(int event, bt_share_event_param_t *param,
1065 bt_share_server_transfer_info_t *transfer_info = NULL;
1066 bt_share_transfer_info_t *client_info = NULL;
1069 bt_share_appdata_t *ad = (bt_share_appdata_t *)user_data;
1072 case BT_SHARE_UI_EVENT_OPC_CONNECTED:
1073 INFO("BT_SHARE_UI_EVENT_OPC_CONNECTED");
1074 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1075 __bt_share_ui_handle_error(ad, param->result,
1077 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1080 /* Set to false when new Outbound OPP session is started*/
1081 opc_launched_session = FALSE;
1084 case BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED:
1085 if (opc_launched_session == FALSE) {
1086 /* Do not process events for new OPP Session */
1087 INFO("TRANSFER_STARTED: Different Obex Session");
1091 INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_STARTED");
1092 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1093 client_info = (bt_share_transfer_info_t *)param->param_data;
1095 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1096 _bt_share_ui_handle_transfer_started(ad,
1097 client_info->device_addr, client_info->filename,
1098 client_info->size, 0, BT_TR_OUTBOUND);
1103 case BT_SHARE_UI_EVENT_OPC_TRANSFER_PROGRESS:
1104 if (opc_launched_session == FALSE) {
1105 /* Do not process events for new OPP Session */
1109 client_info = (bt_share_transfer_info_t *)param->param_data;
1111 name = strrchr(client_info->filename, '/');
1115 name = client_info->filename;
1117 percentage = client_info->percentage;
1118 __bt_share_ui_handle_progress(ad, 0, name, percentage,
1119 FALSE, BT_SHARE_UI_ERROR_NONE);
1122 case BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE:
1123 if (opc_launched_session == FALSE) {
1124 /* Do not process events for new OPP Session */
1125 INFO("TRANSFER_COMPLETE: Different Obex Session");
1129 INFO("BT_SHARE_UI_EVENT_OPC_TRANSFER_COMPLETE ");
1130 client_info = (bt_share_transfer_info_t *)param->param_data;
1132 if (g_strcmp0(ad->transfer_info->device_address, client_info->device_addr))
1135 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1136 __bt_share_ui_handle_error(ad, param->result,
1139 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1140 else if (ad->info_popup == NULL)
1141 _bt_terminate_app();
1143 _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr,
1149 INFO_SECURE("client_info->filename = [%s]",
1150 client_info->filename);
1152 name = strrchr(client_info->filename, '/');
1156 name = client_info->filename;
1158 INFO("name address = [%p]", name);
1159 __bt_share_ui_handle_progress(ad, 0, name, 100, TRUE,
1162 if (ad->tr_view == NULL)
1163 _bt_terminate_app();
1165 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1167 _bt_share_ui_handle_transfer_complete(ad, client_info->device_addr,
1171 case BT_SHARE_UI_EVENT_OPC_DISCONNECTED: {
1172 GSList *failed = NULL;
1175 INFO("BT_SHARE_UI_EVENT_OPC_DISCONNECTED");
1177 db = bt_share_open_db();
1178 retm_if(!db, "fail to open db!");
1180 failed = bt_share_get_failed_tr_data_by_sid(db,
1181 ad->tr_type, ad->transfer_info->device_address,
1182 ad->transfer_info->db_sid);
1183 bt_share_close_db(db);
1186 /* Some failed items are there */
1187 elm_object_text_set(ad->toolbar_button,
1188 BT_STR_RESEND_FAILED_FILES);
1189 elm_object_disabled_set(ad->toolbar_button, FALSE);
1191 bt_share_release_tr_data_list(failed);
1193 _bt_share_delete_toolbar_button(ad);
1194 ad->launch_mode = BT_LAUNCH_TRANSFER_LIST;
1196 _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_OUTBOUND);
1197 _bt_share_ui_handle_update_view(ad, BT_OUTBOUND_TABLE);
1199 elm_genlist_realized_items_update(ad->tr_genlist);
1203 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED:
1204 INFO("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_STARTED");
1205 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1206 transfer_info = param->param_data;
1208 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1209 /* Different session */
1210 INFO("TRANSFER_STARTED: Different Session");
1214 _bt_share_ui_handle_transfer_started(ad, transfer_info->address,
1215 transfer_info->filename, transfer_info->file_size, transfer_info->transfer_id,
1219 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
1220 if (param->result == BT_SHARE_UI_ERROR_NONE) {
1221 transfer_info = param->param_data;
1223 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1224 /* Different session */
1227 __bt_share_ui_handle_progress(ad,
1228 transfer_info->transfer_id,
1229 transfer_info->filename,
1230 transfer_info->percentage,
1231 FALSE, BT_SHARE_UI_ERROR_NONE);
1235 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
1236 INFO("BT_SHARE_UI_EVENT_OBEX_TRANSFER_COMPLETED ");
1238 transfer_info = param->param_data;
1239 if (g_strcmp0(ad->transfer_info->device_address, transfer_info->address))
1242 if (transfer_info->transfer_id != ad->transfer_info->transfer_id) {
1243 /* Different session */
1244 INFO("TRANSFER_STARTED: Different Session");
1248 if (param->result != BT_SHARE_UI_ERROR_NONE) {
1249 __bt_share_ui_handle_error(ad, param->result,
1252 _bt_share_ui_handle_update_view(ad,
1255 _bt_share_ui_handle_transfer_complete(ad, transfer_info->address,
1260 if (ad->tr_view == NULL)
1261 _bt_terminate_app();
1263 _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE);
1265 _bt_share_ui_handle_transfer_complete(ad, transfer_info->address,
1269 case BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED: {
1270 DBG("BT_SHARE_UI_EVENT_OBEX_SERVER_TRANSFER_DISCONNECTED");
1271 transfer_info = param->param_data;
1272 INFO("transfer_info->transfer_id: [%d]", transfer_info->transfer_id);
1273 INFO("ad->transfer_info->transfer_id: [%d]", ad->transfer_info->transfer_id);
1274 if (transfer_info->transfer_id == ad->transfer_info->transfer_id) {
1275 DBG("Same session");
1276 _bt_share_delete_toolbar_button(ad);
1277 _bt_share_ui_handle_transfer_disconnected(ad, BT_TR_INBOUND);
1279 _bt_share_ui_handle_update_view(ad, BT_INBOUND_TABLE);
1280 elm_genlist_realized_items_update(ad->tr_genlist);
1286 DBG("Unhandled event %x", event);