diff options
author | mk5004.lee <mk5004.lee@samsung.com> | 2020-04-07 18:03:20 +0900 |
---|---|---|
committer | mk5004.lee <mk5004.lee@samsung.com> | 2020-04-08 09:43:36 +0900 |
commit | d58b88e0cfff3f149977cde7ee6af891680f5e88 (patch) | |
tree | dfdc8c5c033fdd8891454183909adec764f37923 | |
parent | d0278d75630946ba1e344a342eac594da440a07a (diff) | |
download | notification-d58b88e0cfff3f149977cde7ee6af891680f5e88.tar.gz notification-d58b88e0cfff3f149977cde7ee6af891680f5e88.tar.bz2 notification-d58b88e0cfff3f149977cde7ee6af891680f5e88.zip |
Add exception handling for mothodcall of dbus listenser
Change-Id: Id029e291add66af0809f4a596ce518e39a0731e6
Signed-off-by: mk5004.lee <mk5004.lee@samsung.com>
-rw-r--r-- | notification-ex/common.cc | 57 | ||||
-rw-r--r-- | notification-ex/common.h | 4 | ||||
-rw-r--r-- | notification-ex/dbus_event_listener.cc | 86 | ||||
-rw-r--r-- | unittest/mock/gio_mock.h | 23 |
4 files changed, 107 insertions, 63 deletions
diff --git a/notification-ex/common.cc b/notification-ex/common.cc new file mode 100644 index 0000000..4d56ebb --- /dev/null +++ b/notification-ex/common.cc @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * 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 "notification-ex/common.h" + +#ifdef LOG_TAG +#undef LOG_TAG +#endif + +#define LOG_TAG "NOTIFICATION_EX" +#define NOTIFICATION_EX_ERROR_QUARK "notification-ex-error-quark" + +namespace notification { + +static const GDBusErrorEntry dbus_error_entries[] = { + {ERROR_INVALID_PARAMETER, "org.freedesktop.Notification-ex.Error.INVALID_PARAMETER"}, + {ERROR_OUT_OF_MEMORY, "org.freedesktop.Notification-ex.Error.OUT_OF_MEMORY"}, + {ERROR_IO_ERROR, "org.freedesktop.Notification-ex.Error.IO_ERROR"}, + {ERROR_PERMISSION_DENIED, "org.freedesktop.Notification-ex.Error.PERMISSION_DENIED"}, + {ERROR_FROM_DB, "org.freedesktop.Notification-ex.Error.FROM_DB"}, + {ERROR_ALREADY_EXIST_ID, "org.freedesktop.Notification-ex.Error.ALREADY_EXIST_ID"}, + {ERROR_FROM_DBUS, "org.freedesktop.Notification-ex.Error.FROM_DBUS"}, + {ERROR_NOT_EXIST_ID, "org.freedesktop.Notification-ex.Error.NOT_EXIST_ID"}, + {ERROR_SERVICE_NOT_READY, "org.freedesktop.Notification-ex.Error.SERVICE_NOT_READY"}, +}; + +GQuark noti_ex_error_quark(void) { + static volatile gsize quark_volatile = 0; + static const char *domain_name = NULL; + + GQuark quark = g_quark_try_string(NOTIFICATION_EX_ERROR_QUARK); + if (quark == 0) { + if (domain_name == NULL) + domain_name = strdup(NOTIFICATION_EX_ERROR_QUARK); + } else { + domain_name = NOTIFICATION_EX_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; +} + +} // namespace notification diff --git a/notification-ex/common.h b/notification-ex/common.h index fd45e75..9c56d5c 100644 --- a/notification-ex/common.h +++ b/notification-ex/common.h @@ -18,6 +18,7 @@ #define NOTIFICATION_EX_COMMON_H_ #include <tizen.h> +#include <gio/gio.h> #define REGULAR_UID_MIN 5000 @@ -36,7 +37,8 @@ enum NotificationError { ERROR_SERVICE_NOT_READY = TIZEN_ERROR_NOTIFICATION | 0x05, /**< No response from notification service */ }; +GQuark noti_ex_error_quark(void); + } // namespace notification #endif // NOTIFICATION_EX_COMMON_H_ - diff --git a/notification-ex/dbus_event_listener.cc b/notification-ex/dbus_event_listener.cc index fe83282..38a20e3 100644 --- a/notification-ex/dbus_event_listener.cc +++ b/notification-ex/dbus_event_listener.cc @@ -162,29 +162,31 @@ void DBusEventListener::Impl::SignalCb(GDBusConnection* connection, || (cur_appid == sender_appid)) return; - LOGE("%s : %s", cur_appid.c_str(), sender_appid.c_str()); - - char* raw = nullptr; - list<Bundle> ret_list; - while (g_variant_iter_loop(iter, "(s)", &raw) && raw != nullptr) { - Bundle ret(raw); - ret_list.emplace_back(ret); - } - - Bundle b(event_info_raw); - EventInfo info(b); + LOGD("%s : %s", cur_appid.c_str(), sender_appid.c_str()); + + try { + char* raw = nullptr; + list<Bundle> ret_list; + while (g_variant_iter_loop(iter, "(s)", &raw) && raw != nullptr) { + Bundle ret(raw); + ret_list.emplace_back(ret); + } - if (info.GetEventType() == EventInfo::Post + Bundle b(event_info_raw); + EventInfo info(b); + if (info.GetEventType() == EventInfo::Post || info.GetEventType() == EventInfo::Update) { - uid_t uid = GetSenderUid(connection, sender_name); - if (uid >= NORMAL_UID_BASE) { - pid_t pid = GetSenderPid(connection, sender_name); - info.SetValidatedOwner(util::GetAppId(pid)); - info.SetValidatedUid(uid); + uid_t uid = GetSenderUid(connection, sender_name); + if (uid >= NORMAL_UID_BASE) { + pid_t pid = GetSenderPid(connection, sender_name); + info.SetValidatedOwner(util::GetAppId(pid)); + info.SetValidatedUid(uid); + } } + dl->parent_->NotifyObserver(info, ret_list); + } catch(Exception &ex) { + LOGE("%s %d", ex.what(), ex.GetErrorCode()); } - - dl->parent_->NotifyObserver(info, ret_list); } void DBusEventListener::Impl::OnMethodCall( @@ -195,32 +197,36 @@ void DBusEventListener::Impl::OnMethodCall( LOGI("method_name[%s] sender[%s]", method_name, sender); DBusEventListener::Impl* dl = static_cast<DBusEventListener::Impl*>(user_data); GVariant *reply_body = NULL; - if (g_strcmp0(method_name, "Get") == 0) { + try { char* appid = NULL; char* serialized = NULL; - g_variant_get(parameters, "(&s&s)", &appid, &serialized); - - Bundle b(serialized); - EventInfo info(b); - list<Bundle> result = dl->parent_->NotifyObserver(info); - GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)")); - for (auto& i : result) { - g_variant_builder_add(builder, "(s)", + if (g_strcmp0(method_name, "Get") == 0) { + g_variant_get(parameters, "(&s&s)", &appid, &serialized); + + Bundle b(serialized); + EventInfo info(b); + list<Bundle> result = dl->parent_->NotifyObserver(info); + GVariantBuilder* builder = g_variant_builder_new(G_VARIANT_TYPE("a(s)")); + for (auto& i : result) { + g_variant_builder_add(builder, "(s)", reinterpret_cast<char*>(i.ToRaw().first.get())); + } + reply_body = g_variant_new("(a(s))", builder); + g_variant_builder_unref(builder); + } else if (g_strcmp0(method_name, "Count") == 0) { + g_variant_get(parameters, "(&s&s)", &appid, &serialized); + + Bundle b(serialized); + EventInfo info(b); + int num = dl->parent_->NotifyNumberRequest(info); + reply_body = g_variant_new("(i)", num); } - reply_body = g_variant_new("(a(s))", builder); - g_variant_builder_unref(builder); - } else if (g_strcmp0(method_name, "Count") == 0) { - char* appid = NULL; - char* serialized = NULL; - g_variant_get(parameters, "(&s&s)", &appid, &serialized); - - Bundle b(serialized); - EventInfo info(b); - int num = dl->parent_->NotifyNumberRequest(info); - reply_body = g_variant_new("(i)", num); + g_dbus_method_invocation_return_value(invocation, reply_body); + } catch (Exception &ex) { + LOGE("%s %d", ex.what(), ex.GetErrorCode()); + g_dbus_method_invocation_return_error(invocation, noti_ex_error_quark(), + ERROR_IO_ERROR, "OnMethodCall fail"); } - g_dbus_method_invocation_return_value(invocation, reply_body); } int DBusEventListener::Impl::RegisterGDBusInterface() { diff --git a/unittest/mock/gio_mock.h b/unittest/mock/gio_mock.h index ea0a33d..16f787f 100644 --- a/unittest/mock/gio_mock.h +++ b/unittest/mock/gio_mock.h @@ -18,33 +18,12 @@ #define MOCK_GIO_H_ #include "mock.h" -#include <glib.h> +#include <gio/gio.h> #ifdef __cplusplus extern "C" { #endif -typedef struct _GFile GFile; -typedef struct _GError GError; -typedef void GDBusConnection; -typedef void GCancellable; -typedef void* gpointer; -typedef int gboolean; - -typedef enum { - G_FILE_COPY_NONE = 0, - G_FILE_COPY_OVERWRITE = (1 << 0), - G_FILE_COPY_BACKUP = (1 << 1), - G_FILE_COPY_NOFOLLOW_SYMLINKS = (1 << 2), - G_FILE_COPY_ALL_METADATA = (1 << 3), - G_FILE_COPY_NO_FALLBACK_FOR_MOVE = (1 << 4), - G_FILE_COPY_TARGET_DEFAULT_PERMS = (1 << 5) -} GFileCopyFlags; - - -typedef void (*GFileProgressCallback) (goffset current_num_bytes, - goffset total_num_bytes, gpointer user_data); - DECLARE_FAKE_VALUE_FUNC(GFile*, g_file_new_for_path, const char*); DECLARE_FAKE_VALUE_FUNC(gboolean, g_file_query_exists, GFile*, GCancellable*); DECLARE_FAKE_VALUE_FUNC(gboolean, g_file_make_directory, GFile*, GCancellable*, |