diff options
author | jusung son <jusung07.son@samsung.com> | 2016-09-19 12:56:02 +0900 |
---|---|---|
committer | jusung son <jusung07.son@samsung.com> | 2016-09-19 13:00:46 +0900 |
commit | 7caf3dd31063fe6c5531d23f4795e4ddd978abc8 (patch) | |
tree | b9154b8196eb8ce43e935b857ca67b551b54931e /lib | |
parent | 61c89c1e63b4459e0f9930910fcd8fb444905791 (diff) | |
download | shortcut-7caf3dd31063fe6c5531d23f4795e4ddd978abc8.tar.gz shortcut-7caf3dd31063fe6c5531d23f4795e4ddd978abc8.tar.bz2 shortcut-7caf3dd31063fe6c5531d23f4795e4ddd978abc8.zip |
Separate internal API from shortcut_managersubmit/tizen/20160919.100356accepted/tizen/wearable/20160920.051909accepted/tizen/tv/20160920.051847accepted/tizen/mobile/20160920.051833accepted/tizen/ivi/20160920.051926accepted/tizen/common/20160919.154757
Change-Id: I82acf5549f9dad2b82de2bae6a043a8e5bbc05bc
Signed-off-by: jusung son <jusung07.son@samsung.com>
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/CMakeLists.txt | 2 | ||||
-rwxr-xr-x | lib/include/shortcut_internal.h | 54 | ||||
-rwxr-xr-x | lib/src/shortcut_internal.c | 473 | ||||
-rwxr-xr-x | lib/src/shortcut_manager.c | 442 |
4 files changed, 538 insertions, 433 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 2cb3dee..43399c1 100755 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -36,6 +36,7 @@ ADD_DEFINITIONS("-DDB_PATH=\"${DB_PATH}\"") ADD_LIBRARY(${PROJECT_NAME} SHARED src/shortcut_manager.c src/shortcut_db.c + src/shortcut_internal.c ) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${svc_pkgs_LDFLAGS}) @@ -48,6 +49,7 @@ INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/include/shortcut.h DESTINATION include/${P INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/include/shortcut_private.h DESTINATION include/${PROJECT_NAME}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/include/shortcut_db.h DESTINATION include/${PROJECT_NAME}) INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/include/shortcut_manager.h DESTINATION include/${PROJECT_NAME}) +INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/include/shortcut_internal.h DESTINATION include/${PROJECT_NAME}) INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) INSTALL(FILES ${CMAKE_SOURCE_DIR}/lib/LICENSE DESTINATION /usr/share/license RENAME "lib${PROJECT_NAME}") diff --git a/lib/include/shortcut_internal.h b/lib/include/shortcut_internal.h new file mode 100755 index 0000000..e9b2e5d --- /dev/null +++ b/lib/include/shortcut_internal.h @@ -0,0 +1,54 @@ +/* + * + * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef __SHORTCUT_INTERNAL_DEF_H__ +#define __SHORTCUT_INTERNAL_DEF_H__ + +#include <gio/gio.h> +#include <glib.h> +#include "shortcut.h" + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct result_cb_item { + result_internal_cb_t result_internal_cb; + result_cb_t result_cb; + void *data; +}; + +int _dbus_init(void); +int _dbus_signal_init(); +char *_shortcut_get_pkgname_by_pid(void); +int _send_sync_shortcut(GVariant *body, GDBusMessage **reply, char *cmd); +int _send_service_register(); +int _send_async_shortcut(GVariant *body, struct result_cb_item *cb_item, char *cmd); +int _check_privilege(void); +void _set_request_cb(shortcut_request_cb request_cb, void *data); +int _dbus_set_watch_name(); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SHORTCUT_INTERNAL_DEF_H__ */ + diff --git a/lib/src/shortcut_internal.c b/lib/src/shortcut_internal.c new file mode 100755 index 0000000..569dfcd --- /dev/null +++ b/lib/src/shortcut_internal.c @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2011 - 2016 Samsung Electronics Co., Ltd. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ +#include <gio/gio.h> +#include <stdlib.h> +#include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> + +#include <aul.h> +#include <dlog.h> +#include <glib.h> +#include <stdio.h> + +#include "shortcut.h" +#include "shortcut_private.h" +#include "shortcut_internal.h" +#include "shortcut_manager.h" + +#define SHORTCUT_PKGNAME_LEN 512 + +#define PROVIDER_BUS_NAME "org.tizen.data_provider_service" +#define PROVIDER_OBJECT_PATH "/org/tizen/data_provider_service" +#define PROVIDER_SHORTCUT_INTERFACE_NAME "org.tizen.data_provider_shortcut_service" + +#define DBUS_SERVICE_DBUS "org.freedesktop.DBus" +#define DBUS_PATH_DBUS "/org/freedesktop/DBus" +#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" + +static GDBusConnection *_gdbus_conn = NULL; +static int monitor_id = 0; +static int provider_monitor_id = 0; + +static const GDBusErrorEntry dbus_error_entries[] = { + {SHORTCUT_ERROR_INVALID_PARAMETER, "org.freedesktop.Shortcut.Error.INVALID_PARAMETER"}, + {SHORTCUT_ERROR_OUT_OF_MEMORY, "org.freedesktop.Shortcut.Error.OUT_OF_MEMORY"}, + {SHORTCUT_ERROR_IO_ERROR, "org.freedesktop.Shortcut.Error.IO_ERROR"}, + {SHORTCUT_ERROR_PERMISSION_DENIED, "org.freedesktop.Shortcut.Error.PERMISSION_DENIED"}, + {SHORTCUT_ERROR_NOT_SUPPORTED, "org.freedesktop.Shortcut.Error.NOT_SUPPORTED"}, + {SHORTCUT_ERROR_RESOURCE_BUSY, "org.freedesktop.Shortcut.Error.RESOURCE_BUSY"}, + {SHORTCUT_ERROR_NO_SPACE, "org.freedesktop.Shortcut.Error.NO_SPACE"}, + {SHORTCUT_ERROR_EXIST, "org.freedesktop.Shortcut.Error.EXIST"}, + {SHORTCUT_ERROR_FAULT, "org.freedesktop.Shortcut.Error.FAULT"}, + {SHORTCUT_ERROR_COMM, "org.freedesktop.Shortcut.Error.COMM"}, +}; + +typedef struct _shortcut_cb_info { + int (*request_cb)(const char *appid, const char *name, int type, const char *content, const char *icon, pid_t pid, double period, int allow_duplicate, void *data); + void *data; +} shortcut_cb_info; + +static shortcut_cb_info _callback_info; + +#define SHORTCUT_ERROR_QUARK "shortcut-error-quark" + +EXPORT_API GQuark shortcut_error_quark(void) +{ + static volatile gsize quark_volatile = 0; + static char *domain_name = NULL; + + /* This is for preventing crash when notification api is used in ui-gadget */ + /* ui-gadget libraries can be unloaded when it is needed and the static string */ + /* parameter to g_dbus_error_register_error_domain may cause crash. */ + GQuark quark = g_quark_try_string(SHORTCUT_ERROR_QUARK); + + if (quark == 0) { + if (domain_name == NULL) + domain_name = strdup(SHORTCUT_ERROR_QUARK); + } else { + domain_name = SHORTCUT_ERROR_QUARK; + } + + g_dbus_error_register_error_domain(domain_name, + &quark_volatile, + dbus_error_entries, + G_N_ELEMENTS(dbus_error_entries)); + return (GQuark) quark_volatile; +} + +/* LCOV_EXCL_START */ +static void _add_shortcut_notify(GVariant *parameters) +{ + const char *appid; + const char *name; + int type; + const char *content; + const char *icon; + int allow_duplicate; + int sender_pid; + + g_variant_get(parameters, "(i&s&si&s&si)", &sender_pid, &appid, &name, &type, &content, &icon, &allow_duplicate); + DbgPrint("_add_shortcut_notify sender_pid: %d ", sender_pid); + _callback_info.request_cb(appid, name, type, content, icon, sender_pid, -1.0f, allow_duplicate, _callback_info.data); +} +/* LCOV_EXCL_STOP */ + +/* LCOV_EXCL_START */ +static void _add_shortcut_widget_notify(GVariant *parameters) +{ + const char *appid; + const char *name; + int type; + const char *content; + const char *icon; + int allow_duplicate; + int sender_pid; + double period; + + g_variant_get(parameters, "(i&s&si&s&sdi)", &sender_pid, &appid, &name, &type, &content, &icon, &period, &allow_duplicate); + _callback_info.request_cb(appid, name, type, content, icon, sender_pid, period, allow_duplicate, _callback_info.data); +} +/* LCOV_EXCL_STOP */ + +/* LCOV_EXCL_START */ +static void _handle_shortcut_notify(GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + DbgPrint("signal_name: %s", signal_name); + if (g_strcmp0(signal_name, "add_shortcut_notify") == 0) + _add_shortcut_notify(parameters); + else if (g_strcmp0(signal_name, "add_shortcut_widget_notify") == 0) + _add_shortcut_widget_notify(parameters); +} +/* LCOV_EXCL_STOP */ + +int _dbus_init(void) +{ + GError *error = NULL; + + if (_gdbus_conn == NULL) { + _gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + + if (_gdbus_conn == NULL) { + /* LCOV_EXCL_START */ + if (error != NULL) { + + ErrPrint("Failed to get dbus [%s]", error->message); + g_error_free(error); + + } + return SHORTCUT_ERROR_IO_ERROR; + /* LCOV_EXCL_STOP */ + } + shortcut_error_quark(); + } + + return SHORTCUT_ERROR_NONE; +} + +int _dbus_signal_init() +{ + int ret = SHORTCUT_ERROR_NONE; + int id; + + if (monitor_id == 0) { + DbgPrint("get dbus connection success"); + id = g_dbus_connection_signal_subscribe( + _gdbus_conn, + PROVIDER_BUS_NAME, + PROVIDER_SHORTCUT_INTERFACE_NAME, /* interface */ + NULL, /* member */ + PROVIDER_OBJECT_PATH, /* path */ + NULL, /* arg0 */ + G_DBUS_SIGNAL_FLAGS_NONE, + _handle_shortcut_notify, + NULL, + NULL); + + DbgPrint("subscribe id : %d", id); + if (id == 0) { + /* LCOV_EXCL_START */ + ret = SHORTCUT_ERROR_IO_ERROR; + ErrPrint("Failed to _register_noti_dbus_interface"); + /* LCOV_EXCL_STOP */ + } else { + monitor_id = id; + } + } + + return ret; +} + +char *_shortcut_get_pkgname_by_pid(void) +{ + char pkgname[SHORTCUT_PKGNAME_LEN + 1] = { 0, }; + char buf[SHORTCUT_PKGNAME_LEN + 1] = { 0, }; + int pid, ret; + int fd; + char *dup_pkgname; + + pid = getpid(); + + ret = aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname)); + if (ret != 0) { + /* LCOV_EXCL_START */ + snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); + + fd = open(buf, O_RDONLY); + if (fd < 0) + return NULL; + + ret = read(fd, pkgname, sizeof(pkgname) - 1); + close(fd); + + if (ret <= 0) + return NULL; + + pkgname[ret] = '\0'; + /* LCOV_EXCL_STOP */ + /*! + * \NOTE + * "ret" is not able to be larger than "sizeof(pkgname) - 1", + * if the system is not going wrong. + */ + } else { + if (strlen(pkgname) <= 0) + return NULL; + } + + dup_pkgname = strdup(pkgname); + if (!dup_pkgname) + ErrPrint("Heap: %d\n", errno); /* LCOV_EXCL_LINE */ + + return dup_pkgname; +} + +/* + * implement user request + */ +int _send_sync_shortcut(GVariant *body, GDBusMessage **reply, char *cmd) +{ + GError *err = NULL; + GDBusMessage *msg ; + int ret = SHORTCUT_ERROR_NONE; + + msg = g_dbus_message_new_method_call( + PROVIDER_BUS_NAME, + PROVIDER_OBJECT_PATH, + PROVIDER_SHORTCUT_INTERFACE_NAME, + cmd); + if (!msg) { + /* LCOV_EXCL_START */ + ErrPrint("Can't allocate new method call"); + if (body) + g_variant_unref(body); + return SHORTCUT_ERROR_OUT_OF_MEMORY; + /* LCOV_EXCL_STOP */ + } + + if (body != NULL) + g_dbus_message_set_body(msg, body); + + *reply = g_dbus_connection_send_message_with_reply_sync( + _gdbus_conn, + msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + NULL, + NULL, + &err); + + g_object_unref(msg); + + if (!*reply) { + /* LCOV_EXCL_START */ + ret = SHORTCUT_ERROR_COMM; + if (err != NULL) { + ErrPrint("No reply. cmd = %s, error = %s", cmd, err->message); + if (err->code == G_DBUS_ERROR_ACCESS_DENIED) + ret = SHORTCUT_ERROR_PERMISSION_DENIED; + g_error_free(err); + } + return ret; + /* LCOV_EXCL_STOP */ + } + + if (g_dbus_message_to_gerror(*reply, &err)) { + /* LCOV_EXCL_START */ + if (err->code == G_DBUS_ERROR_ACCESS_DENIED) + ret = SHORTCUT_ERROR_PERMISSION_DENIED; + else + ret = err->code; + + ErrPrint("_send_sync_shortcut error %s err code: %d", err->message, ret); + g_error_free(err); + return ret; + /* LCOV_EXCL_STOP */ + } + DbgPrint("_send_sync_shortcut done !!"); + return SHORTCUT_ERROR_NONE; +} + +int _send_service_register() +{ + GDBusMessage *reply = NULL; + int result; + + result = _send_sync_shortcut(g_variant_new("(i)", getuid()), &reply, "shortcut_service_register"); + ErrPrint("_send_service_register done"); + return result; +} + +static void _send_message_with_reply_sync_cb(GDBusConnection *connection, + GAsyncResult *res, + gpointer user_data) +{ + int result = SHORTCUT_ERROR_NONE; + GError *err = NULL; + GDBusMessage *reply = NULL; + struct result_cb_item *cb_item = (struct result_cb_item *)user_data; + + if (cb_item == NULL) { + /* LCOV_EXCL_START */ + ErrPrint("Failed to get a callback item"); + return; + /* LCOV_EXCL_STOP */ + } + + reply = g_dbus_connection_send_message_with_reply_finish( + connection, + res, + &err); + + if (!reply) { + /* LCOV_EXCL_START */ + if (err != NULL) { + ErrPrint("No reply. error = %s", err->message); + g_error_free(err); + } + result = SHORTCUT_ERROR_COMM; + /* LCOV_EXCL_STOP */ + + } else if (g_dbus_message_to_gerror(reply, &err)) { + /* LCOV_EXCL_START */ + if (err->code == G_DBUS_ERROR_ACCESS_DENIED) + result = SHORTCUT_ERROR_PERMISSION_DENIED; + else + result = err->code; + + ErrPrint("_send_message_with_reply_sync_cb error %s err code: %d", err->message, result); + g_error_free(err); + /* LCOV_EXCL_STOP */ + } + + if (cb_item->result_internal_cb) + result = cb_item->result_internal_cb(result, getpid(), cb_item->data); /* LCOV_EXCL_LINE */ + else if (cb_item->result_cb) + result = cb_item->result_cb(result, cb_item->data); + + if (reply) + g_object_unref(reply); + + free(cb_item); +} + +int _send_async_shortcut(GVariant *body, struct result_cb_item *cb_item, char *cmd) +{ + GDBusMessage *msg; + msg = g_dbus_message_new_method_call( + PROVIDER_BUS_NAME, + PROVIDER_OBJECT_PATH, + PROVIDER_SHORTCUT_INTERFACE_NAME, + cmd); + if (!msg) { + /* LCOV_EXCL_START */ + ErrPrint("Can't allocate new method call"); + return SHORTCUT_ERROR_OUT_OF_MEMORY; + /* LCOV_EXCL_STOP */ + } + + if (body != NULL) + g_dbus_message_set_body(msg, body); + + g_dbus_connection_send_message_with_reply( + _gdbus_conn, + msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + -1, + NULL, + NULL, + (GAsyncReadyCallback)_send_message_with_reply_sync_cb, + cb_item); + + g_object_unref(msg); + + DbgPrint("_send_async_shortcut done !!"); + return SHORTCUT_ERROR_NONE; +} + +int _check_privilege(void) +{ + GDBusMessage *reply = NULL; + int ret = SHORTCUT_ERROR_NONE; + + ret = _send_sync_shortcut(NULL, &reply, "check_privilege"); + + if (reply) + g_object_unref(reply); + + return ret; +} + + +/* LCOV_EXCL_START */ +static void _on_name_appeared(GDBusConnection *connection, + const gchar *name, + const gchar *name_owner, + gpointer user_data) +{ + DbgPrint("name appeared : %s", name); + _send_service_register(); +} +/* LCOV_EXCL_STOP */ + +/* LCOV_EXCL_START */ +static void _on_name_vanished(GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + DbgPrint("name vanished : %s", name); +} +/* LCOV_EXCL_STOP */ + +void _set_request_cb(shortcut_request_cb request_cb, void *data) +{ + _callback_info.request_cb = request_cb; + _callback_info.data = data; +} + +int _dbus_set_watch_name() +{ + if (provider_monitor_id == 0) { + provider_monitor_id = g_bus_watch_name_on_connection( + _gdbus_conn, + PROVIDER_BUS_NAME, + G_BUS_NAME_WATCHER_FLAGS_NONE, + _on_name_appeared, + _on_name_vanished, + NULL, + NULL); + + if (provider_monitor_id == 0) { + /* LCOV_EXCL_START */ + ErrPrint("watch on name fail"); + return SHORTCUT_ERROR_IO_ERROR; + /* LCOV_EXCL_STOP */ + } + } + + return SHORTCUT_ERROR_NONE; +} + + + diff --git a/lib/src/shortcut_manager.c b/lib/src/shortcut_manager.c index 7e03dc6..21081be 100755 --- a/lib/src/shortcut_manager.c +++ b/lib/src/shortcut_manager.c @@ -30,423 +30,10 @@ #include "shortcut_private.h" #include "shortcut_db.h" #include "shortcut_manager.h" +#include "shortcut_internal.h" -#define SHORTCUT_PKGNAME_LEN 512 -#define SHORTCUT_IS_WIDGET_SIZE(size) (!!((size) & WIDGET_SIZE_DEFAULT)) - -#define PROVIDER_BUS_NAME "org.tizen.data_provider_service" -#define PROVIDER_OBJECT_PATH "/org/tizen/data_provider_service" -#define PROVIDER_SHORTCUT_INTERFACE_NAME "org.tizen.data_provider_shortcut_service" - -#define DBUS_SERVICE_DBUS "org.freedesktop.DBus" -#define DBUS_PATH_DBUS "/org/freedesktop/DBus" -#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus" - -static GDBusConnection *_gdbus_conn = NULL; -static int monitor_id = 0; -static int provider_monitor_id = 0; - -static const GDBusErrorEntry dbus_error_entries[] = { - {SHORTCUT_ERROR_INVALID_PARAMETER, "org.freedesktop.Shortcut.Error.INVALID_PARAMETER"}, - {SHORTCUT_ERROR_OUT_OF_MEMORY, "org.freedesktop.Shortcut.Error.OUT_OF_MEMORY"}, - {SHORTCUT_ERROR_IO_ERROR, "org.freedesktop.Shortcut.Error.IO_ERROR"}, - {SHORTCUT_ERROR_PERMISSION_DENIED, "org.freedesktop.Shortcut.Error.PERMISSION_DENIED"}, - {SHORTCUT_ERROR_NOT_SUPPORTED, "org.freedesktop.Shortcut.Error.NOT_SUPPORTED"}, - {SHORTCUT_ERROR_RESOURCE_BUSY, "org.freedesktop.Shortcut.Error.RESOURCE_BUSY"}, - {SHORTCUT_ERROR_NO_SPACE, "org.freedesktop.Shortcut.Error.NO_SPACE"}, - {SHORTCUT_ERROR_EXIST, "org.freedesktop.Shortcut.Error.EXIST"}, - {SHORTCUT_ERROR_FAULT, "org.freedesktop.Shortcut.Error.FAULT"}, - {SHORTCUT_ERROR_COMM, "org.freedesktop.Shortcut.Error.COMM"}, -}; - -struct result_cb_item { - result_internal_cb_t result_internal_cb; - result_cb_t result_cb; - void *data; -}; - -typedef struct _shortcut_cb_info { - int (*request_cb)(const char *appid, const char *name, int type, const char *content, const char *icon, pid_t pid, double period, int allow_duplicate, void *data); - void *data; -} shortcut_cb_info; - -static shortcut_cb_info _callback_info; -static int _dbus_init(); -static char *_shortcut_get_pkgname_by_pid(void); - -#define SHORTCUT_ERROR_QUARK "shortcut-error-quark" - -EXPORT_API GQuark shortcut_error_quark(void) -{ - static volatile gsize quark_volatile = 0; - static char *domain_name = NULL; - - /* This is for preventing crash when notification api is used in ui-gadget */ - /* ui-gadget libraries can be unloaded when it is needed and the static string */ - /* parameter to g_dbus_error_register_error_domain may cause crash. */ - GQuark quark = g_quark_try_string(SHORTCUT_ERROR_QUARK); - - if (quark == 0) { - if (domain_name == NULL) - domain_name = strdup(SHORTCUT_ERROR_QUARK); - } else { - domain_name = SHORTCUT_ERROR_QUARK; - } - - g_dbus_error_register_error_domain(domain_name, - &quark_volatile, - dbus_error_entries, - G_N_ELEMENTS(dbus_error_entries)); - return (GQuark) quark_volatile; -} - -/* LCOV_EXCL_START */ -static void _add_shortcut_notify(GVariant *parameters) -{ - const char *appid; - const char *name; - int type; - const char *content; - const char *icon; - int allow_duplicate; - int sender_pid; - - g_variant_get(parameters, "(i&s&si&s&si)", &sender_pid, &appid, &name, &type, &content, &icon, &allow_duplicate); - DbgPrint("_add_shortcut_notify sender_pid: %d ", sender_pid); - _callback_info.request_cb(appid, name, type, content, icon, sender_pid, -1.0f, allow_duplicate, _callback_info.data); -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void _add_shortcut_widget_notify(GVariant *parameters) -{ - const char *appid; - const char *name; - int type; - const char *content; - const char *icon; - int allow_duplicate; - int sender_pid; - double period; - - g_variant_get(parameters, "(i&s&si&s&sdi)", &sender_pid, &appid, &name, &type, &content, &icon, &period, &allow_duplicate); - _callback_info.request_cb(appid, name, type, content, icon, sender_pid, period, allow_duplicate, _callback_info.data); -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void _handle_shortcut_notify(GDBusConnection *connection, - const gchar *sender_name, - const gchar *object_path, - const gchar *interface_name, - const gchar *signal_name, - GVariant *parameters, - gpointer user_data) -{ - DbgPrint("signal_name: %s", signal_name); - if (g_strcmp0(signal_name, "add_shortcut_notify") == 0) - _add_shortcut_notify(parameters); - else if (g_strcmp0(signal_name, "add_shortcut_widget_notify") == 0) - _add_shortcut_widget_notify(parameters); -} -/* LCOV_EXCL_STOP */ - -static int _dbus_init(void) -{ - GError *error = NULL; - - if (_gdbus_conn == NULL) { - _gdbus_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); - - if (_gdbus_conn == NULL) { - /* LCOV_EXCL_START */ - if (error != NULL) { - - ErrPrint("Failed to get dbus [%s]", error->message); - g_error_free(error); - - } - return SHORTCUT_ERROR_IO_ERROR; - /* LCOV_EXCL_STOP */ - } - shortcut_error_quark(); - } - - return SHORTCUT_ERROR_NONE; -} - -static int _dbus_signal_init() -{ - int ret = SHORTCUT_ERROR_NONE; - int id; - - if (monitor_id == 0) { - DbgPrint("get dbus connection success"); - id = g_dbus_connection_signal_subscribe( - _gdbus_conn, - PROVIDER_BUS_NAME, - PROVIDER_SHORTCUT_INTERFACE_NAME, /* interface */ - NULL, /* member */ - PROVIDER_OBJECT_PATH, /* path */ - NULL, /* arg0 */ - G_DBUS_SIGNAL_FLAGS_NONE, - _handle_shortcut_notify, - NULL, - NULL); - - DbgPrint("subscribe id : %d", id); - if (id == 0) { - /* LCOV_EXCL_START */ - ret = SHORTCUT_ERROR_IO_ERROR; - ErrPrint("Failed to _register_noti_dbus_interface"); - /* LCOV_EXCL_STOP */ - } else { - monitor_id = id; - } - } - - return ret; -} - -static char *_shortcut_get_pkgname_by_pid(void) -{ - char pkgname[SHORTCUT_PKGNAME_LEN + 1] = { 0, }; - char buf[SHORTCUT_PKGNAME_LEN + 1] = { 0, }; - int pid, ret; - int fd; - char *dup_pkgname; - - pid = getpid(); - - ret = aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname)); - if (ret != 0) { - /* LCOV_EXCL_START */ - snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); - fd = open(buf, O_RDONLY); - if (fd < 0) - return NULL; - - ret = read(fd, pkgname, sizeof(pkgname) - 1); - close(fd); - - if (ret <= 0) - return NULL; - - pkgname[ret] = '\0'; - /* LCOV_EXCL_STOP */ - /*! - * \NOTE - * "ret" is not able to be larger than "sizeof(pkgname) - 1", - * if the system is not going wrong. - */ - } else { - if (strlen(pkgname) <= 0) - return NULL; - } - - dup_pkgname = strdup(pkgname); - if (!dup_pkgname) - ErrPrint("Heap: %d\n", errno); /* LCOV_EXCL_LINE */ - - return dup_pkgname; -} - -/* - * implement user request - */ -static int _send_sync_shortcut(GVariant *body, GDBusMessage **reply, char *cmd) -{ - GError *err = NULL; - GDBusMessage *msg ; - int ret = SHORTCUT_ERROR_NONE; - - msg = g_dbus_message_new_method_call( - PROVIDER_BUS_NAME, - PROVIDER_OBJECT_PATH, - PROVIDER_SHORTCUT_INTERFACE_NAME, - cmd); - if (!msg) { - /* LCOV_EXCL_START */ - ErrPrint("Can't allocate new method call"); - if (body) - g_variant_unref(body); - return SHORTCUT_ERROR_OUT_OF_MEMORY; - /* LCOV_EXCL_STOP */ - } - - if (body != NULL) - g_dbus_message_set_body(msg, body); - - *reply = g_dbus_connection_send_message_with_reply_sync( - _gdbus_conn, - msg, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, - -1, - NULL, - NULL, - &err); - - g_object_unref(msg); - - if (!*reply) { - /* LCOV_EXCL_START */ - ret = SHORTCUT_ERROR_COMM; - if (err != NULL) { - ErrPrint("No reply. cmd = %s, error = %s", cmd, err->message); - if (err->code == G_DBUS_ERROR_ACCESS_DENIED) - ret = SHORTCUT_ERROR_PERMISSION_DENIED; - g_error_free(err); - } - return ret; - /* LCOV_EXCL_STOP */ - } - - if (g_dbus_message_to_gerror(*reply, &err)) { - /* LCOV_EXCL_START */ - if (err->code == G_DBUS_ERROR_ACCESS_DENIED) - ret = SHORTCUT_ERROR_PERMISSION_DENIED; - else - ret = err->code; - - ErrPrint("_send_sync_shortcut error %s err code: %d", err->message, ret); - g_error_free(err); - return ret; - /* LCOV_EXCL_STOP */ - } - DbgPrint("_send_sync_shortcut done !!"); - return SHORTCUT_ERROR_NONE; -} - -static int _send_service_register() -{ - GDBusMessage *reply = NULL; - int result; - - result = _send_sync_shortcut(g_variant_new("(i)", getuid()), &reply, "shortcut_service_register"); - ErrPrint("_send_service_register done"); - return result; -} - -static void _send_message_with_reply_sync_cb(GDBusConnection *connection, - GAsyncResult *res, - gpointer user_data) -{ - int result = SHORTCUT_ERROR_NONE; - GError *err = NULL; - GDBusMessage *reply = NULL; - struct result_cb_item *cb_item = (struct result_cb_item *)user_data; - - if (cb_item == NULL) { - /* LCOV_EXCL_START */ - ErrPrint("Failed to get a callback item"); - return; - /* LCOV_EXCL_STOP */ - } - - reply = g_dbus_connection_send_message_with_reply_finish( - connection, - res, - &err); - - if (!reply) { - /* LCOV_EXCL_START */ - if (err != NULL) { - ErrPrint("No reply. error = %s", err->message); - g_error_free(err); - } - result = SHORTCUT_ERROR_COMM; - /* LCOV_EXCL_STOP */ - - } else if (g_dbus_message_to_gerror(reply, &err)) { - /* LCOV_EXCL_START */ - if (err->code == G_DBUS_ERROR_ACCESS_DENIED) - result = SHORTCUT_ERROR_PERMISSION_DENIED; - else - result = err->code; - - ErrPrint("_send_message_with_reply_sync_cb error %s err code: %d", err->message, result); - g_error_free(err); - /* LCOV_EXCL_STOP */ - } - - if (cb_item->result_internal_cb) - result = cb_item->result_internal_cb(result, getpid(), cb_item->data); /* LCOV_EXCL_LINE */ - else if (cb_item->result_cb) - result = cb_item->result_cb(result, cb_item->data); - - if (reply) - g_object_unref(reply); - - free(cb_item); -} - -static int _send_async_shortcut(GVariant *body, struct result_cb_item *cb_item, char *cmd) -{ - GDBusMessage *msg; - msg = g_dbus_message_new_method_call( - PROVIDER_BUS_NAME, - PROVIDER_OBJECT_PATH, - PROVIDER_SHORTCUT_INTERFACE_NAME, - cmd); - if (!msg) { - /* LCOV_EXCL_START */ - ErrPrint("Can't allocate new method call"); - return SHORTCUT_ERROR_OUT_OF_MEMORY; - /* LCOV_EXCL_STOP */ - } - - if (body != NULL) - g_dbus_message_set_body(msg, body); - - g_dbus_connection_send_message_with_reply( - _gdbus_conn, - msg, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, - -1, - NULL, - NULL, - (GAsyncReadyCallback)_send_message_with_reply_sync_cb, - cb_item); - - g_object_unref(msg); - - DbgPrint("_send_async_shortcut done !!"); - return SHORTCUT_ERROR_NONE; -} - -/* LCOV_EXCL_START */ -static void _on_name_appeared(GDBusConnection *connection, - const gchar *name, - const gchar *name_owner, - gpointer user_data) -{ - DbgPrint("name appeared : %s", name); - _send_service_register(); -} -/* LCOV_EXCL_STOP */ - -/* LCOV_EXCL_START */ -static void _on_name_vanished(GDBusConnection *connection, - const gchar *name, - gpointer user_data) -{ - DbgPrint("name vanished : %s", name); -} -/* LCOV_EXCL_STOP */ - -static int _check_privilege(void) -{ - GDBusMessage *reply = NULL; - int ret = SHORTCUT_ERROR_NONE; - - ret = _send_sync_shortcut(NULL, &reply, "check_privilege"); - - if (reply) - g_object_unref(reply); - - return ret; -} +#define SHORTCUT_IS_WIDGET_SIZE(size) (!!((size) & WIDGET_SIZE_DEFAULT)) EAPI int shortcut_set_request_cb(shortcut_request_cb request_cb, void *data) { @@ -478,26 +65,15 @@ EAPI int shortcut_set_request_cb(shortcut_request_cb request_cb, void *data) /* LCOV_EXCL_STOP */ } - if (provider_monitor_id == 0) { - provider_monitor_id = g_bus_watch_name_on_connection( - _gdbus_conn, - PROVIDER_BUS_NAME, - G_BUS_NAME_WATCHER_FLAGS_NONE, - _on_name_appeared, - _on_name_vanished, - NULL, - NULL); - - if (provider_monitor_id == 0) { - /* LCOV_EXCL_START */ - ErrPrint("watch on name fail"); - return SHORTCUT_ERROR_IO_ERROR; - /* LCOV_EXCL_STOP */ - } + ret = _dbus_set_watch_name(); + if (ret != SHORTCUT_ERROR_NONE) { + /* LCOV_EXCL_START */ + ErrPrint("Can't init _dbus_set_watch_name %d", ret); + return ret; + /* LCOV_EXCL_STOP */ } - _callback_info.request_cb = request_cb; - _callback_info.data = data; + _set_request_cb(request_cb, data); return SHORTCUT_ERROR_NONE; } |