2 * Copyright (c) 2015 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.
23 #include <syspopup_caller.h>
25 #include <bundle_internal.h>
26 #include <tethering.h>
27 #include <mime_type.h>
28 #include <app_control.h>
31 #include "bluetooth-api.h"
33 #define BT_AGENT_SYSPOPUP_MAX_ATTEMPT 3
34 #define BT_MAX_EVENT_STR_LENGTH 50
35 #define BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS 200
37 #ifdef TIZEN_FEATURE_BT_DPM
38 int bt_launch_dpm_popup(char *mode)
44 retv_if(b == NULL, BLUETOOTH_ERROR_INTERNAL);
46 bundle_add(b, "mode", mode);
48 ret = syspopup_launch(BT_DPM_SYSPOPUP, b);
51 BT_ERR("Popup launch failed: %d\n", ret);
59 static gboolean _bt_syspopup_timer_cb(gpointer user_data)
63 retv_if(user_data == NULL, FALSE);
65 b = (bundle *)user_data;
67 ret = syspopup_launch("bt-syspopup", b);
69 BT_ERR("Sorry!! Cannot launch popup return = %d, Retrying...", ret);
71 BT_DBG("Hurray!!! Finally Popup launched");
74 return (ret < 0) ? TRUE : FALSE;
78 static gboolean _bt_agent_system_popup_timer_cb(gpointer user_data)
81 static int retry_count;
82 bundle *b = (bundle *)user_data;
83 retv_if(user_data == NULL, FALSE);
87 ret = syspopup_launch("bt-syspopup", b);
89 BT_ERR("Sorry! Can't launch popup, ret=%d, Re-try[%d] time..",
91 if (retry_count >= BT_AGENT_SYSPOPUP_MAX_ATTEMPT) {
92 BT_ERR("Sorry!! Max retry %d reached", retry_count);
98 BT_DBG("Hurray!! Finally Popup launched");
103 return (ret < 0) ? TRUE : FALSE;
106 int bt_launch_system_popup(bt_agent_event_type_t event_type,
107 const char *device_name,
108 const unsigned char *auth_info,
110 const char *filename,
111 const char *agent_path)
115 char event_str[BT_MAX_EVENT_STR_LENGTH + 1];
119 BT_ERR("Launching system popup failed");
123 bundle_add(b, "device-name", device_name);
124 bundle_add(b, "auth-info", (const char *)auth_info);
125 bundle_add(b, "passkey", passkey);
126 bundle_add(b, "file", filename);
127 bundle_add(b, "agent-path", agent_path);
129 switch (event_type) {
130 case BT_AGENT_EVENT_PIN_REQUEST:
131 g_strlcpy(event_str, "pin-request", sizeof(event_str));
134 case BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST:
135 g_strlcpy(event_str, "passkey-confirm-request",
139 case BT_AGENT_EVENT_PASSKEY_REQUEST:
140 g_strlcpy(event_str, "passkey-request", sizeof(event_str));
143 case BT_AGENT_EVENT_PASSKEY_DISPLAY_REQUEST:
144 g_strlcpy(event_str, "passkey-display-request",
148 case BT_AGENT_EVENT_AUTHORIZE_REQUEST:
149 g_strlcpy(event_str, "authorize-request",
153 case BT_AGENT_EVENT_CONFIRM_MODE_REQUEST:
154 g_strlcpy(event_str, "confirm-mode-request",
158 case BT_AGENT_EVENT_FILE_RECEIVED:
159 g_strlcpy(event_str, "file-received", sizeof(event_str));
162 case BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST:
163 g_strlcpy(event_str, "keyboard-passkey-request",
167 case BT_AGENT_EVENT_TERMINATE:
168 g_strlcpy(event_str, "terminate", sizeof(event_str));
171 case BT_AGENT_EVENT_EXCHANGE_REQUEST:
172 g_strlcpy(event_str, "exchange-request", sizeof(event_str));
175 case BT_AGENT_EVENT_PBAP_REQUEST:
176 g_strlcpy(event_str, "phonebook-request", sizeof(event_str));
179 case BT_AGENT_EVENT_MAP_REQUEST:
180 g_strlcpy(event_str, "message-request", sizeof(event_str));
183 case BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE:
184 g_strlcpy(event_str, "remote-legacy-pair-failed", sizeof(event_str));
188 BT_ERR("Invalid event type");
194 bundle_add(b, "event-type", event_str);
196 ret = syspopup_launch("bt-syspopup", b);
198 BT_ERR("Popup launch failed...retry %d", ret);
200 g_timeout_add(BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS,
201 (GSourceFunc)_bt_agent_system_popup_timer_cb, b);
206 BT_INFO("_bt_agent_launch_system_popup");
210 bool bt_launch_unable_to_pairing_syspopup(int result)
220 bundle_add(b, "event-type", "unable-to-pairing");
222 if (result == BLUETOOTH_ERROR_TIMEOUT)
223 bundle_add(b, "error", "timeout");
224 else if (result == BLUETOOTH_ERROR_AUTHENTICATION_FAILED)
225 bundle_add(b, "error", "authfailed");
227 bundle_add(b, "error", "error");
229 ret = syspopup_launch("bt-syspopup", b);
231 BT_ERR("Popup launch failed...retry %d \n", ret);
232 g_timeout_add(200, (GSourceFunc) _bt_syspopup_timer_cb,
243 bool bt_is_tethering_enabled(void)
247 tethering_h tethering = NULL;
248 bool enabled = FALSE;
251 ret = tethering_create(&tethering);
253 if (ret != TETHERING_ERROR_NONE) {
254 BT_ERR("Fail to create tethering: %d", ret);
258 enabled = tethering_is_enabled(tethering, TETHERING_TYPE_BT);
261 BT_ERR("BT tethering is not enabled");
263 ret = tethering_destroy(tethering);
265 if (ret != TETHERING_ERROR_NONE)
266 BT_ERR("Fail to destroy tethering: %d", ret);
271 int bt_get_mime_type(char *file_name, char **mime_type)
275 int ret = MIME_TYPE_ERROR_NONE;
277 if (file_name == NULL)
278 return BLUETOOTH_ERROR_INVALID_PARAM;
280 ret = mime_type_get_mime_type(file_name, (gchar **)mime_type);
282 if (ret != MIME_TYPE_ERROR_NONE) {
283 BT_ERR("Fail to get mime type: %d", ret);
284 return BLUETOOTH_ERROR_INTERNAL;
287 return BLUETOOTH_ERROR_NONE;
290 void bt_destroy_popup_all(void)
292 syspopup_destroy_all();
295 int bt_app_control_send_launch_request(char *absolute_path)
299 app_control_h app_control;
302 app_control_create(&app_control);
303 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
304 app_control_set_uri(app_control, absolute_path);
305 app_control_set_mime(app_control, "*/*");
307 if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE)
308 ret = BLUETOOTH_ERROR_NONE;
310 ret = BLUETOOTH_ERROR_INTERNAL;
312 app_control_destroy(app_control);
317 extern struct bluetooth_headed_plugin_t headed_plugin
318 __attribute__ ((visibility("default")));
319 struct bluetooth_headed_plugin_t headed_plugin = {
320 #ifdef TIZEN_FEATURE_BT_DPM
325 bt_launch_system_popup,
326 bt_destroy_popup_all,
327 bt_launch_unable_to_pairing_syspopup,
328 bt_is_tethering_enabled,