130 lines
3.6 KiB
C++
130 lines
3.6 KiB
C++
// 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 <dlfcn.h>
|
|
|
|
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_cast<decltype(this->notify_is_initted)>(
|
|
dlsym(library_, "notify_is_initted"));
|
|
if (!notify_is_initted) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_init = reinterpret_cast<decltype(this->notify_init)>(
|
|
dlsym(library_, "notify_init"));
|
|
if (!notify_init) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_get_server_info =
|
|
reinterpret_cast<decltype(this->notify_get_server_info)>(
|
|
dlsym(library_, "notify_get_server_info"));
|
|
if (!notify_get_server_info) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_get_server_caps =
|
|
reinterpret_cast<decltype(this->notify_get_server_caps)>(
|
|
dlsym(library_, "notify_get_server_caps"));
|
|
if (!notify_get_server_caps) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_notification_new =
|
|
reinterpret_cast<decltype(this->notify_notification_new)>(
|
|
dlsym(library_, "notify_notification_new"));
|
|
if (!notify_notification_new) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_notification_add_action =
|
|
reinterpret_cast<decltype(this->notify_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_cast<decltype(
|
|
this->notify_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_cast<decltype(this->notify_notification_set_timeout)>(
|
|
dlsym(library_, "notify_notification_set_timeout"));
|
|
if (!notify_notification_set_timeout) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_notification_set_hint_string =
|
|
reinterpret_cast<decltype(this->notify_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_cast<decltype(this->notify_notification_show)>(
|
|
dlsym(library_, "notify_notification_show"));
|
|
if (!notify_notification_show) {
|
|
CleanUp(true);
|
|
return false;
|
|
}
|
|
|
|
notify_notification_close =
|
|
reinterpret_cast<decltype(this->notify_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;
|
|
}
|