// Copyright (c) 2015 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "atom/browser/notifications/linux/libnotify_loader.h" #include LibNotifyLoader::LibNotifyLoader() : loaded_(false) {} LibNotifyLoader::~LibNotifyLoader() { CleanUp(loaded_); } bool LibNotifyLoader::Load(const std::string& library_name) { if (loaded_) return false; library_ = dlopen(library_name.c_str(), RTLD_LAZY); if (!library_) return false; notify_is_initted = reinterpret_castnotify_is_initted)>( dlsym(library_, "notify_is_initted")); if (!notify_is_initted) { CleanUp(true); return false; } notify_init = reinterpret_castnotify_init)>( dlsym(library_, "notify_init")); if (!notify_init) { CleanUp(true); return false; } notify_get_server_info = reinterpret_castnotify_get_server_info)>( dlsym(library_, "notify_get_server_info")); if (!notify_get_server_info) { CleanUp(true); return false; } notify_get_server_caps = reinterpret_castnotify_get_server_caps)>( dlsym(library_, "notify_get_server_caps")); if (!notify_get_server_caps) { CleanUp(true); return false; } notify_notification_new = reinterpret_castnotify_notification_new)>( dlsym(library_, "notify_notification_new")); if (!notify_notification_new) { CleanUp(true); return false; } notify_notification_add_action = reinterpret_castnotify_notification_add_action)>( dlsym(library_, "notify_notification_add_action")); if (!notify_notification_add_action) { CleanUp(true); return false; } notify_notification_set_image_from_pixbuf = reinterpret_castnotify_notification_set_image_from_pixbuf)>( dlsym(library_, "notify_notification_set_image_from_pixbuf")); if (!notify_notification_set_image_from_pixbuf) { CleanUp(true); return false; } notify_notification_set_timeout = reinterpret_castnotify_notification_set_timeout)>( dlsym(library_, "notify_notification_set_timeout")); if (!notify_notification_set_timeout) { CleanUp(true); return false; } notify_notification_set_hint_string = reinterpret_castnotify_notification_set_hint_string)>( dlsym(library_, "notify_notification_set_hint_string")); if (!notify_notification_set_hint_string) { CleanUp(true); return false; } notify_notification_show = reinterpret_castnotify_notification_show)>( dlsym(library_, "notify_notification_show")); if (!notify_notification_show) { CleanUp(true); return false; } notify_notification_close = reinterpret_castnotify_notification_close)>( dlsym(library_, "notify_notification_close")); if (!notify_notification_close) { CleanUp(true); return false; } loaded_ = true; return true; } void LibNotifyLoader::CleanUp(bool unload) { if (unload) { dlclose(library_); library_ = NULL; } loaded_ = false; notify_is_initted = NULL; notify_init = NULL; notify_get_server_info = NULL; notify_get_server_caps = NULL; notify_notification_new = NULL; notify_notification_add_action = NULL; notify_notification_set_image_from_pixbuf = NULL; notify_notification_set_timeout = NULL; notify_notification_set_hint_string = NULL; notify_notification_show = NULL; notify_notification_close = NULL; }