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.
22 #include <syspopup_caller.h>
24 #include <bundle_internal.h>
25 #include <tethering.h>
26 #include <mime_type.h>
27 #include <app_control.h>
30 #include "bluetooth-api.h"
32 #define BT_AGENT_SYSPOPUP_MAX_ATTEMPT 3
33 #define BT_MAX_EVENT_STR_LENGTH 50
34 #define BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS 200
36 #ifdef TIZEN_FEATURE_BT_DPM
37 int bt_launch_dpm_popup(char *mode)
43 retv_if(b == NULL, BLUETOOTH_ERROR_INTERNAL);
45 bundle_add(b, "mode", mode);
47 ret = syspopup_launch(BT_DPM_SYSPOPUP, b);
50 BT_ERR("Popup launch failed: %d\n", ret);
58 static gboolean _bt_syspopup_timer_cb(gpointer user_data)
62 retv_if(user_data == NULL, FALSE);
64 b = (bundle *)user_data;
66 ret = syspopup_launch("bt-syspopup", b);
68 BT_ERR("Sorry!! Cannot launch popup return = %d, Retrying...", ret);
70 BT_DBG("Hurray!!! Finally Popup launched");
73 return (ret < 0) ? TRUE : FALSE;
77 static gboolean _bt_agent_system_popup_timer_cb(gpointer user_data)
80 static int retry_count;
81 bundle *b = (bundle *)user_data;
82 retv_if(user_data == NULL, FALSE);
86 ret = syspopup_launch("bt-syspopup", b);
88 BT_ERR("Sorry! Can't launch popup, ret=%d, Re-try[%d] time..",
90 if (retry_count >= BT_AGENT_SYSPOPUP_MAX_ATTEMPT) {
91 BT_ERR("Sorry!! Max retry %d reached", retry_count);
97 BT_DBG("Hurray!! Finally Popup launched");
102 return (ret < 0) ? TRUE : FALSE;
105 int bt_launch_system_popup(bt_agent_event_type_t event_type,
106 const char *device_name,
107 const unsigned char *auth_info,
109 const char *filename,
110 const char *agent_path)
114 char event_str[BT_MAX_EVENT_STR_LENGTH + 1];
118 BT_ERR("Launching system popup failed");
122 bundle_add(b, "device-name", device_name);
123 bundle_add(b, "auth-info", (const char *)auth_info);
124 bundle_add(b, "passkey", passkey);
125 bundle_add(b, "file", filename);
126 bundle_add(b, "agent-path", agent_path);
128 switch (event_type) {
129 case BT_AGENT_EVENT_PIN_REQUEST:
130 g_strlcpy(event_str, "pin-request", sizeof(event_str));
133 case BT_AGENT_EVENT_PASSKEY_CONFIRM_REQUEST:
134 g_strlcpy(event_str, "passkey-confirm-request",
138 case BT_AGENT_EVENT_PASSKEY_REQUEST:
139 g_strlcpy(event_str, "passkey-request", sizeof(event_str));
142 case BT_AGENT_EVENT_PASSKEY_DISPLAY_REQUEST:
143 g_strlcpy(event_str, "passkey-display-request",
147 case BT_AGENT_EVENT_AUTHORIZE_REQUEST:
148 g_strlcpy(event_str, "authorize-request",
152 case BT_AGENT_EVENT_CONFIRM_MODE_REQUEST:
153 g_strlcpy(event_str, "confirm-mode-request",
157 case BT_AGENT_EVENT_FILE_RECEIVED:
158 g_strlcpy(event_str, "file-received", sizeof(event_str));
161 case BT_AGENT_EVENT_KEYBOARD_PASSKEY_REQUEST:
162 g_strlcpy(event_str, "keyboard-passkey-request",
166 case BT_AGENT_EVENT_TERMINATE:
167 g_strlcpy(event_str, "terminate", sizeof(event_str));
170 case BT_AGENT_EVENT_EXCHANGE_REQUEST:
171 g_strlcpy(event_str, "exchange-request", sizeof(event_str));
174 case BT_AGENT_EVENT_PBAP_REQUEST:
175 g_strlcpy(event_str, "phonebook-request", sizeof(event_str));
178 case BT_AGENT_EVENT_MAP_REQUEST:
179 g_strlcpy(event_str, "message-request", sizeof(event_str));
182 case BT_AGENT_EVENT_LEGACY_PAIR_FAILED_FROM_REMOTE:
183 g_strlcpy(event_str, "remote-legacy-pair-failed", sizeof(event_str));
187 BT_ERR("Invalid event type");
193 bundle_add(b, "event-type", event_str);
195 ret = syspopup_launch("bt-syspopup", b);
197 BT_ERR("Popup launch failed...retry %d", ret);
199 g_timeout_add(BT_AGENT_SYSPOPUP_TIMEOUT_FOR_MULTIPLE_POPUPS,
200 (GSourceFunc)_bt_agent_system_popup_timer_cb, b);
205 BT_INFO("_bt_agent_launch_system_popup");
209 gboolean bt_launch_unable_to_pairing_syspopup(int result)
219 bundle_add(b, "event-type", "unable-to-pairing");
221 if (result == BLUETOOTH_ERROR_TIMEOUT)
222 bundle_add(b, "error", "timeout");
223 else if (result == BLUETOOTH_ERROR_AUTHENTICATION_FAILED)
224 bundle_add(b, "error", "authfailed");
226 bundle_add(b, "error", "error");
228 ret = syspopup_launch("bt-syspopup", b);
230 BT_ERR("Popup launch failed...retry %d \n", ret);
231 g_timeout_add(200, (GSourceFunc) _bt_syspopup_timer_cb,
242 gboolean bt_is_tethering_enabled(void)
246 tethering_h tethering = NULL;
247 bool enabled = FALSE;
250 ret = tethering_create(&tethering);
252 if (ret != TETHERING_ERROR_NONE) {
253 BT_ERR("Fail to create tethering: %d", ret);
257 enabled = tethering_is_enabled(tethering, TETHERING_TYPE_BT);
260 BT_ERR("BT tethering is not enabled");
262 ret = tethering_destroy(tethering);
264 if (ret != TETHERING_ERROR_NONE)
265 BT_ERR("Fail to destroy tethering: %d", ret);
267 return (gboolean)enabled;
270 int bt_get_mime_type(char *file_name, char **mime_type)
274 int ret = MIME_TYPE_ERROR_NONE;
276 if (file_name == NULL)
277 return BLUETOOTH_ERROR_INVALID_PARAM;
279 ret = mime_type_get_mime_type(file_name, (gchar **)mime_type);
281 if (ret != MIME_TYPE_ERROR_NONE) {
282 BT_ERR("Fail to get mime type: %d", ret);
283 return BLUETOOTH_ERROR_INTERNAL;
286 return BLUETOOTH_ERROR_NONE;
289 void bt_destroy_popup_all(void)
291 syspopup_destroy_all();
294 int bt_app_control_send_launch_request(char *absolute_path)
298 app_control_h app_control;
301 app_control_create(&app_control);
302 app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
303 app_control_set_uri(app_control, absolute_path);
304 app_control_set_mime(app_control, "*/*");
306 if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE)
307 ret = BLUETOOTH_ERROR_NONE;
309 ret = BLUETOOTH_ERROR_INTERNAL;
311 app_control_destroy(app_control);
316 extern struct bluetooth_headed_plugin_t headed_plugin
317 __attribute__ ((visibility("default")));
318 struct bluetooth_headed_plugin_t headed_plugin = {
319 #ifdef TIZEN_FEATURE_BT_DPM
324 bt_launch_system_popup,
325 bt_destroy_popup_all,
326 bt_launch_unable_to_pairing_syspopup,
327 bt_is_tethering_enabled,