4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "popup-common.h"
22 #include <app_control.h>
25 #define MYFILES_APPNAME "org.tizen.myfile"
26 #define GALLERY_APPNAME "org.tizen.gallery"
28 #define USB_MOUNT_ROOT_PATH "/opt/storage"
29 #define USB_MOUNT_PATH "_DEVICE_PATH_"
33 #define DEVICED_PATH "/Org/Tizen/System/DeviceD"
34 #define DEVICED_IFACE "org.tizen.system.deviced"
35 #define DEVICED_PATH_USBHOST DEVICED_PATH"/Usbhost"
36 #define DEVICED_IFACE_USBHOST DEVICED_IFACE".Usbhost"
37 #define SIGNAL_NAME_UNMOUNT "unmount_storage"
39 static char added_path[BUF_MAX];
40 static char removed_path[BUF_MAX];
47 static const struct popup_ops storage_mounted_ops;
48 static const struct popup_ops unmount_storage_ops;
49 static const struct popup_ops camera_added_ops;
50 static const struct popup_ops storage_mount_failed_ops;
51 static const struct popup_ops storage_removed_unsafe_ops;
53 static void remove_otg_popup(const struct popup_ops *ops, char *path)
58 if (ops == &storage_mounted_ops)
59 popup_path = added_path;
60 else if (ops == &unmount_storage_ops)
61 popup_path = removed_path;
68 len = strlen(popup_path);
69 if (len != strlen(path))
71 if (strncmp(popup_path, path, len))
75 unload_simple_popup(ops);
78 static void set_myfiles_param(bundle *b)
83 if (strlen(added_path) > 0)
84 appsvc_add_data(b, "path", added_path);
86 appsvc_add_data(b, "path", USB_MOUNT_ROOT_PATH);
87 appsvc_set_pkgname(b, MYFILES_APPNAME);
90 static void set_gallery_param(bundle *b)
94 appsvc_add_data(b, "album-id", "GALLERY_ALBUM_PTP_ID");
95 appsvc_set_pkgname(b, GALLERY_APPNAME);
98 static struct ext_app_type {
100 void (*set_param)(bundle *b);
102 { EXT_MYFILES , set_myfiles_param },
103 { EXT_GALLERY , set_gallery_param },
106 static void launch_app(int type)
108 app_control_h app_control;
110 int ret, i, type_len;
112 type_len = ARRAY_SIZE(app_type);
113 for (i = 0 ; i < ARRAY_SIZE(app_type) ; i++) {
114 if (type == app_type[i].type)
118 _E("Invalid type (%d)", type);
122 ret = app_control_create(&app_control);
123 if (ret != APP_CONTROL_ERROR_NONE)
127 ret = app_control_set_app_id(app_control, MYFILES_APPNAME);
129 ret = app_control_set_app_id(app_control, GALLERY_APPNAME);
131 _E("No matched type(%d)", type);
135 if (ret != APP_CONTROL_ERROR_NONE) {
136 (void)app_control_destroy(app_control);
140 ret = app_control_send_launch_request(app_control, NULL, NULL);
141 if (ret != APP_CONTROL_ERROR_NONE)
142 _E("Failed to send launch request");
144 (void)app_control_destroy(app_control);
147 static void storage_browse(const struct popup_ops *ops)
149 unload_simple_popup(ops);
150 launch_app(EXT_MYFILES);
151 terminate_if_no_popup();
154 static void camera_browse(const struct popup_ops *ops)
156 unload_simple_popup(ops);
157 launch_app(EXT_GALLERY);
158 terminate_if_no_popup();
161 static void storage_unmount(const struct popup_ops *ops)
166 unload_simple_popup(ops);
168 param[0] = removed_path;
170 ret = broadcast_dbus_signal(DEVICED_PATH_USBHOST,
171 DEVICED_IFACE_USBHOST,
172 SIGNAL_NAME_UNMOUNT, "s", param);
174 _E("FAIL: broadcast_dbus_signal()");
176 memset(removed_path, 0, sizeof(removed_path));
178 terminate_if_no_popup();
181 static int storage_mounted_launch(bundle *b, const struct popup_ops *ops)
184 struct object_ops *obj;
190 ret = get_object_by_ops(ops, &obj);
192 _E("Failed to get object (%d)", ret);
196 path = (char *)bundle_get_val(obj->b, USB_MOUNT_PATH);
198 _E("Failed to get mount path");
202 _I("USB storage mount path (%s)", path);
203 snprintf(added_path, sizeof(added_path), "%s", path);
207 static int unmount_storage_launch(bundle *b, const struct popup_ops *ops)
210 struct object_ops *obj;
216 ret = get_object_by_ops(ops, &obj);
217 _D("ops = %s obj = %s", ops, obj);
219 _E("Failed to get object (%d)", ret);
223 path = (char *)bundle_get_val(obj->b, USB_MOUNT_PATH);
225 _E("Failed to get mount path");
229 remove_otg_popup(&storage_mounted_ops, path);
231 snprintf(removed_path, sizeof(removed_path), "%s", path);
235 static int storage_unmounted(bundle *b, const struct popup_ops *ops)
242 path = (char *)bundle_get_val(b, USB_MOUNT_PATH);
244 _E("Failed to get mount path");
248 remove_otg_popup(&storage_mounted_ops, path);
249 remove_otg_popup(&unmount_storage_ops, path);
251 terminate_if_no_popup();
255 static int camera_removed(bundle *b, const struct popup_ops *ops)
257 remove_otg_popup(&camera_added_ops, NULL);
258 terminate_if_no_popup();
262 static const struct popup_ops storage_mounted_ops = {
263 .name = "usbotg_storage_mounted",
264 .show = load_simple_popup,
265 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
266 .content = "IDS_USB_BODY_BROWSE_STORAGE_CONNECTED_VIA_USB_Q",
267 .left_text = "IDS_COM_SK_CANCEL",
268 .right_text = "IDS_BT_SK_BROWSE",
269 .right = storage_browse,
270 .pre = storage_mounted_launch,
273 static const struct popup_ops storage_unmounted_ops = {
274 .name = "usbotg_storage_unmounted",
275 .show = storage_unmounted,
278 static const struct popup_ops unmount_storage_ops = {
279 .name = "usbotg_unmount_storage",
280 .show = load_simple_popup,
281 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
282 .content = "IDS_COM_POP_UNMOUNT_USB_MASS_STORAGE_BEFORE_REMOVING_TO_AVOID_DATA_LOSS",
283 .left_text = "IDS_COM_SK_CANCEL",
284 .right_text = "IDS_USB_BUTTON_UNMOUNT",
285 .right = storage_unmount,
286 .pre = unmount_storage_launch,
289 static const struct popup_ops camera_added_ops = {
290 .name = "usbotg_camera_added",
291 .show = load_simple_popup,
292 .title = "IDS_CAM_HEADER_CAMERA_M_APPLICATION",
293 .content = "IDS_USB_BODY_BROWSE_CAMERA_CONNECTED_VIA_USB_Q",
294 .left_text = "IDS_COM_SK_CANCEL",
295 .right_text = "IDS_BT_SK_BROWSE",
296 .right = camera_browse,
299 static const struct popup_ops camera_removed_ops = {
300 .name = "usbotg_camera_removed",
301 .show = camera_removed,
304 static const struct popup_ops storage_mount_failed_ops = {
305 .name = "usbotg_storage_mount_failed",
306 .show = load_simple_popup,
307 .title = "IDS_COM_HEADER_ATTENTION",
308 .content = "IDS_COM_BODY_USB_STORAGE_BLANK_OR_HAS_UNSUPPORTED_FILE_SYSTEM",
309 .left_text = "IDS_COM_SK_OK",
312 static const struct popup_ops storage_removed_unsafe_ops = {
313 .name = "usbotg_storage_removed_unsafe",
314 .show = load_simple_popup,
315 .title = "IDS_COM_HEADER_ATTENTION",
316 .content = "IDS_COM_POP_USB_MASS_STORAGE_UNEXPECTEDLY_REMOVED",
317 .left_text = "IDS_COM_SK_OK",
321 /* Constructor to register mount_failed button */
322 static __attribute__ ((constructor)) void usbotg_register_popup(void)
324 register_popup(&storage_mounted_ops);
325 register_popup(&storage_unmounted_ops);
326 register_popup(&unmount_storage_ops);
327 register_popup(&camera_added_ops);
328 register_popup(&camera_removed_ops);
329 register_popup(&storage_mount_failed_ops);
330 register_popup(&storage_removed_unsafe_ops);