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.
25 #include <bluetooth.h>
28 #include "bt-main-ug.h"
29 #include "bt-main-view.h"
30 #include "bt-ipc-handler.h"
31 #include "bt-string-define.h"
34 #include "bt-widget.h"
35 #include "bt-callback.h"
37 static void __bt_on_bus_acquired(GDBusConnection *connection,
41 bt_ug_data *ugd = (bt_ug_data *)user_data;
43 retm_if(user_data == NULL, "Invalid argument: user_data is NULL");
44 retm_if(connection == NULL, "Invalid argument: connection is NULL");
46 ugd->g_conn = connection;
49 static void __bt_on_name_acquired(GDBusConnection *connection,
53 BT_DBG("Acquired the name %s on the system bus", name);
56 static void __bt_on_name_lost(GDBusConnection *connection,
60 BT_DBG("Lost the name %s on the system bus", name);
63 int _bt_ipc_register_popup_event_signal(bt_ug_data *ugd)
67 retvm_if(ugd == NULL, BT_UG_FAIL, "Invalid argument: data is NULL");
69 ugd->gdbus_owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
71 G_BUS_NAME_OWNER_FLAGS_NONE,
73 __bt_on_name_acquired,
77 retvm_if(ugd->gdbus_owner_id == 0, BT_UG_FAIL,
78 "Failed registering event signal");
81 return BT_UG_ERROR_NONE;
84 int _bt_ipc_unregister_popup_event_signal(bt_ug_data *ugd)
88 retvm_if(ugd == NULL, BT_UG_FAIL, "Invalid argument: data is NULL");
90 g_bus_unown_name(ugd->gdbus_owner_id);
91 ugd->gdbus_owner_id = 0;
94 return BT_UG_ERROR_NONE;
97 int _bt_ipc_send_obex_message(obex_ipc_param_t *param, void *data)
101 bt_ug_data *ugd = NULL;
102 GVariantBuilder *filepath_builder;
103 GVariantBuilder *bd_addr;
104 GError *error = NULL;
108 retvm_if(param == NULL, BT_UG_FAIL,
109 "Invalid argument: param is NULL");
110 retvm_if(data == NULL, BT_UG_FAIL, "Invalid argument: data is NULL");
112 ugd = (bt_ug_data *)data;
114 bd_addr = g_variant_builder_new(G_VARIANT_TYPE("ay"));
115 for (i = 0; i < BT_ADDRESS_LENGTH_MAX; i++)
116 g_variant_builder_add(bd_addr, "y", param->addr[i]);
118 filepath_builder = g_variant_builder_new(G_VARIANT_TYPE("aay"));
119 for (i = 0; i < param->file_cnt; i++)
120 g_variant_builder_add(filepath_builder, "^ay", param->filepath[i]);
122 ret = g_dbus_connection_emit_signal(ugd->g_conn,
124 BT_UG_IPC_REQUEST_OBJECT,
126 BT_UG_IPC_METHOD_SEND,
127 g_variant_new("(ayssaay)",
135 BT_ERR("Unable to connect to dbus: %s", error->message);
136 g_clear_error(&error);
139 g_variant_builder_unref(filepath_builder);
140 g_variant_builder_unref(bd_addr);
143 return ret ? BT_UG_ERROR_NONE : BT_UG_FAIL;
146 void _bt_ipc_update_connected_status(void *data, int connected_type,
147 bool connected, int result,
154 bt_ug_data *ugd = (bt_ug_data *)data;
155 ret_if(ugd->op_status == BT_DEACTIVATING || ugd->op_status == BT_DEACTIVATED);
157 bt_dev_t *item = NULL;
158 char addr_str[BT_ADDRESS_STR_LEN + 1] = { 0 };
160 _bt_util_addr_type_to_addr_string(addr_str, addr->bd_addr);
162 item = _bt_main_get_dev_info_by_address(ugd->paired_device, addr_str);
165 item = _bt_main_get_dev_info(ugd->paired_device, ugd->paired_item);
167 /* In GATT connection case, connection failed event is recieved before the pairing is completed.
168 So, it can get device info from searched device list */
169 if (TIZEN_FEATURE_BT_HOG && (item == NULL) && (connected_type == BT_LE_HID_CONNECTED))
170 item = _bt_main_get_dev_info_by_address(ugd->searched_device, addr_str);
175 if (connected == TRUE) {
176 item->status = BT_IDLE;
177 item->connected_mask |= (result == BT_UG_ERROR_NONE) ? \
178 connected_type : 0x00;
180 if (!ugd->disconn_req)
181 item->status = BT_IDLE;
183 item->connected_mask &= (result == BT_UG_ERROR_NONE) ? \
184 ~connected_type : 0xFF;
187 if (item->connected_mask == 0x00) {
188 item->status = BT_IDLE;
189 item->is_connected = 0;
191 item->is_connected = 1;
194 BT_DBG("is_connected : %d, connected_mask : 0x%02x",
195 item->is_connected, item->connected_mask);
197 if (result != BT_UG_ERROR_NONE &&
198 item->connected_mask == 0x00) {
199 BT_ERR("Connection Failed");
200 _bt_update_genlist_item((Elm_Object_Item *)item->genlist_item);
201 if (!ugd->profile_vd) {
202 Evas_Object *btn1 = NULL;
203 Evas_Object *btn2 = NULL;
204 _bt_main_popup_del_cb(ugd, NULL, NULL);
206 ugd->popup_data.type = BT_POPUP_CONNECTION_ERROR;
207 ugd->popup_data.data = g_strdup(item->name);
209 if (ugd->connect_req == true) {
210 ugd->popup = _bt_create_popup(ugd, NULL, NULL, 0);
211 retm_if(ugd->popup == NULL, "fail to create popup!");
213 btn1 = elm_button_add(ugd->popup);
214 elm_object_style_set(btn1, "popup");
215 elm_object_domain_translatable_text_set(
217 PKGNAME, "IDS_BR_SK_CANCEL");
218 elm_object_part_content_set(ugd->popup, "button1", btn1);
219 evas_object_smart_callback_add(btn1,
220 "clicked", _bt_retry_connection_cb, item);
222 btn2 = elm_button_add(ugd->popup);
223 elm_object_style_set(btn2, "popup");
224 elm_object_domain_translatable_text_set(
226 PKGNAME, "IDS_ST_BUTTON_RETRY");
227 elm_object_part_content_set(ugd->popup, "button2", btn2);
228 evas_object_smart_callback_add(btn2,
229 "clicked", _bt_retry_connection_cb, item);
231 evas_object_data_set(ugd->popup, "bd_addr", (void *)item->addr_str);
232 eext_object_event_callback_add(ugd->popup,
233 EEXT_CALLBACK_BACK, _bt_retry_connection_cb, item);
234 evas_object_show(ugd->popup);
238 } else if (item->status == BT_IDLE) {
239 /* No need to check for connected state as that is handled in _bt_connect_net_profile api */
240 _bt_sort_paired_device_list(ugd, item, item->is_connected);
241 _bt_update_genlist_item((Elm_Object_Item *)item->genlist_item);
244 ugd->connect_req = FALSE;
246 if (ugd->bt_launch_mode == BT_LAUNCH_CONNECT_HEADSET &&
247 connected_type == BT_HEADSET_CONNECTED &&
249 result == BT_UG_ERROR_NONE) {
250 BT_DBG("BT_LAUNCH_CONNECT_HEADSET: Connected, destroying UG");
251 _bt_ug_destroy(ugd, NULL);
254 ret_if(!ugd->profile_vd);
255 BT_DBG("is_connected : %d, connected_mask : 0x%02x",
256 item->is_connected, item->connected_mask);
258 /* Check if the device update and the Profile view device is same */
259 /* Go through the ugd->profile_vd->genlist and check device address */
260 bt_dev_t *dev_info = NULL;
261 Elm_Object_Item *dev_item;
263 dev_item = elm_genlist_first_item_get(ugd->profile_vd->genlist);
265 if (dev_item == NULL) {
266 BT_DBG("No item in the list");
270 while (dev_item != NULL) {
271 dev_info = (bt_dev_t *)elm_object_item_data_get(dev_item);
273 if (dev_info == NULL)
274 dev_item = elm_genlist_item_next_get(dev_item);
279 /* dev_info can be NULL again, so a check is applied */
280 if (dev_info == NULL) {
281 BT_DBG("No item in the list");
285 /* Match the BD address */
286 if (g_strcmp0(dev_info->addr_str, addr_str) != 0)
289 dev_info->call_checked = dev_info->connected_mask & \
290 BT_HEADSET_CONNECTED;
292 #ifdef TIZEN_BT_A2DP_SINK_ENABLE
293 dev_info->media_checked = dev_info->connected_mask & \
294 BT_MUSIC_PLAYER_CONNECTED;
296 dev_info->media_checked = dev_info->connected_mask & \
297 BT_STEREO_HEADSET_CONNECTED;
300 dev_info->hid_checked = dev_info->connected_mask & \
303 dev_info->network_checked = dev_info->connected_mask & \
304 BT_NETWORK_CONNECTED;
306 _bt_util_set_list_disabled(ugd->profile_vd->genlist,