Add DBus loader, combined ticker for Spotify metadata
parent
d975278396
commit
8024736253
@ -0,0 +1,270 @@
|
|||||||
|
|
||||||
|
#include "loaders/loader_dbus.h"
|
||||||
|
|
||||||
|
// Put these sanity checks here so that they fire at most once
|
||||||
|
// (to avoid cluttering the build output).
|
||||||
|
#if !defined(LIBRARY_LOADER_DBUS_H_DLOPEN) && !defined(LIBRARY_LOADER_DBUS_H_DT_NEEDED)
|
||||||
|
#error neither LIBRARY_LOADER_DBUS_H_DLOPEN nor LIBRARY_LOADER_DBUS_H_DT_NEEDED defined
|
||||||
|
#endif
|
||||||
|
#if defined(LIBRARY_LOADER_DBUS_H_DLOPEN) && defined(LIBRARY_LOADER_DBUS_H_DT_NEEDED)
|
||||||
|
#error both LIBRARY_LOADER_DBUS_H_DLOPEN and LIBRARY_LOADER_DBUS_H_DT_NEEDED defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
libdbus_loader::libdbus_loader() : loaded_(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
libdbus_loader::~libdbus_loader() {
|
||||||
|
CleanUp(loaded_);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool libdbus_loader::Load(const std::string& library_name) {
|
||||||
|
if (loaded_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_DBUS_H_DLOPEN)
|
||||||
|
library_ = dlopen(library_name.c_str(), RTLD_LAZY);
|
||||||
|
if (!library_)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
|
||||||
|
bus_add_match =
|
||||||
|
reinterpret_cast<decltype(this->bus_add_match)>(
|
||||||
|
dlsym(library_, "dbus_bus_add_match"));
|
||||||
|
if (!bus_add_match) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus_get =
|
||||||
|
reinterpret_cast<decltype(this->bus_get)>(
|
||||||
|
dlsym(library_, "dbus_bus_get"));
|
||||||
|
if (!bus_get) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus_get_unique_name =
|
||||||
|
reinterpret_cast<decltype(this->bus_get_unique_name)>(
|
||||||
|
dlsym(library_, "dbus_bus_get_unique_name"));
|
||||||
|
if (!bus_get_unique_name) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus_remove_match =
|
||||||
|
reinterpret_cast<decltype(this->bus_remove_match)>(
|
||||||
|
dlsym(library_, "dbus_bus_remove_match"));
|
||||||
|
if (!bus_remove_match) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_pop_message =
|
||||||
|
reinterpret_cast<decltype(this->connection_pop_message)>(
|
||||||
|
dlsym(library_, "dbus_connection_pop_message"));
|
||||||
|
if (!connection_pop_message) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_read_write =
|
||||||
|
reinterpret_cast<decltype(this->connection_read_write)>(
|
||||||
|
dlsym(library_, "dbus_connection_read_write"));
|
||||||
|
if (!connection_read_write) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_send_with_reply_and_block =
|
||||||
|
reinterpret_cast<decltype(this->connection_send_with_reply_and_block)>(
|
||||||
|
dlsym(library_, "dbus_connection_send_with_reply_and_block"));
|
||||||
|
if (!connection_send_with_reply_and_block) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
connection_unref =
|
||||||
|
reinterpret_cast<decltype(this->connection_unref)>(
|
||||||
|
dlsym(library_, "dbus_connection_unref"));
|
||||||
|
if (!connection_unref) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_free =
|
||||||
|
reinterpret_cast<decltype(this->error_free)>(
|
||||||
|
dlsym(library_, "dbus_error_free"));
|
||||||
|
if (!error_free) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_init =
|
||||||
|
reinterpret_cast<decltype(this->error_init)>(
|
||||||
|
dlsym(library_, "dbus_error_init"));
|
||||||
|
if (!error_init) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_is_set =
|
||||||
|
reinterpret_cast<decltype(this->error_is_set)>(
|
||||||
|
dlsym(library_, "dbus_error_is_set"));
|
||||||
|
if (!error_is_set) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_append_args =
|
||||||
|
reinterpret_cast<decltype(this->message_append_args)>(
|
||||||
|
dlsym(library_, "dbus_message_append_args"));
|
||||||
|
if (!message_append_args) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_is_signal =
|
||||||
|
reinterpret_cast<decltype(this->message_is_signal)>(
|
||||||
|
dlsym(library_, "dbus_message_is_signal"));
|
||||||
|
if (!message_is_signal) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_iter_get_arg_type =
|
||||||
|
reinterpret_cast<decltype(this->message_iter_get_arg_type)>(
|
||||||
|
dlsym(library_, "dbus_message_iter_get_arg_type"));
|
||||||
|
if (!message_iter_get_arg_type) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_iter_get_basic =
|
||||||
|
reinterpret_cast<decltype(this->message_iter_get_basic)>(
|
||||||
|
dlsym(library_, "dbus_message_iter_get_basic"));
|
||||||
|
if (!message_iter_get_basic) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_iter_init =
|
||||||
|
reinterpret_cast<decltype(this->message_iter_init)>(
|
||||||
|
dlsym(library_, "dbus_message_iter_init"));
|
||||||
|
if (!message_iter_init) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_iter_next =
|
||||||
|
reinterpret_cast<decltype(this->message_iter_next)>(
|
||||||
|
dlsym(library_, "dbus_message_iter_next"));
|
||||||
|
if (!message_iter_next) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_iter_recurse =
|
||||||
|
reinterpret_cast<decltype(this->message_iter_recurse)>(
|
||||||
|
dlsym(library_, "dbus_message_iter_recurse"));
|
||||||
|
if (!message_iter_recurse) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_new_method_call =
|
||||||
|
reinterpret_cast<decltype(this->message_new_method_call)>(
|
||||||
|
dlsym(library_, "dbus_message_new_method_call"));
|
||||||
|
if (!message_new_method_call) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
message_unref =
|
||||||
|
reinterpret_cast<decltype(this->message_unref)>(
|
||||||
|
dlsym(library_, "dbus_message_unref"));
|
||||||
|
if (!message_unref) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
move_error =
|
||||||
|
reinterpret_cast<decltype(this->move_error)>(
|
||||||
|
dlsym(library_, "dbus_move_error"));
|
||||||
|
if (!move_error) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
threads_init_default =
|
||||||
|
reinterpret_cast<decltype(this->threads_init_default)>(
|
||||||
|
dlsym(library_, "dbus_threads_init_default"));
|
||||||
|
if (!threads_init_default) {
|
||||||
|
CleanUp(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_DBUS_H_DT_NEEDED)
|
||||||
|
bus_add_match = &::dbus_bus_add_match;
|
||||||
|
bus_get = &::dbus_bus_get;
|
||||||
|
bus_get_unique_name = &::dbus_bus_get_unique_name;
|
||||||
|
bus_remove_match = &::dbus_bus_remove_match;
|
||||||
|
connection_pop_message = &::dbus_connection_pop_message;
|
||||||
|
connection_read_write = &::dbus_connection_read_write;
|
||||||
|
connection_send_with_reply_and_block = &::dbus_connection_send_with_reply_and_block;
|
||||||
|
connection_unref = &::dbus_connection_unref;
|
||||||
|
error_free = &::dbus_error_free;
|
||||||
|
error_init = &::dbus_error_init;
|
||||||
|
error_is_set = &::dbus_error_is_set;
|
||||||
|
message_append_args = &::dbus_message_append_args;
|
||||||
|
message_is_signal = &::dbus_message_is_signal;
|
||||||
|
message_iter_get_arg_type = &::dbus_message_iter_get_arg_type;
|
||||||
|
message_iter_get_basic = &::dbus_message_iter_get_basic;
|
||||||
|
message_iter_init = &::dbus_message_iter_init;
|
||||||
|
message_iter_next = &::dbus_message_iter_next;
|
||||||
|
message_iter_recurse = &::dbus_message_iter_recurse;
|
||||||
|
message_new_method_call = &::dbus_message_new_method_call;
|
||||||
|
message_unref = &::dbus_message_unref;
|
||||||
|
move_error = &::dbus_move_error;
|
||||||
|
threads_init_default = &::dbus_threads_init_default;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
loaded_ = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void libdbus_loader::CleanUp(bool unload) {
|
||||||
|
#if defined(LIBRARY_LOADER_DBUS_H_DLOPEN)
|
||||||
|
if (unload) {
|
||||||
|
dlclose(library_);
|
||||||
|
library_ = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
loaded_ = false;
|
||||||
|
bus_add_match = NULL;
|
||||||
|
bus_get = NULL;
|
||||||
|
bus_get_unique_name = NULL;
|
||||||
|
bus_remove_match = NULL;
|
||||||
|
connection_pop_message = NULL;
|
||||||
|
connection_read_write = NULL;
|
||||||
|
connection_send_with_reply_and_block = NULL;
|
||||||
|
connection_unref = NULL;
|
||||||
|
error_free = NULL;
|
||||||
|
error_init = NULL;
|
||||||
|
error_is_set = NULL;
|
||||||
|
message_append_args = NULL;
|
||||||
|
message_is_signal = NULL;
|
||||||
|
message_iter_get_arg_type = NULL;
|
||||||
|
message_iter_get_basic = NULL;
|
||||||
|
message_iter_init = NULL;
|
||||||
|
message_iter_next = NULL;
|
||||||
|
message_iter_recurse = NULL;
|
||||||
|
message_new_method_call = NULL;
|
||||||
|
message_unref = NULL;
|
||||||
|
move_error = NULL;
|
||||||
|
threads_init_default = NULL;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
#ifndef LIBRARY_LOADER_DBUS_H
|
||||||
|
#define LIBRARY_LOADER_DBUS_H
|
||||||
|
|
||||||
|
#include <dbus/dbus.h>
|
||||||
|
#define LIBRARY_LOADER_DBUS_H_DLOPEN
|
||||||
|
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
class libdbus_loader {
|
||||||
|
public:
|
||||||
|
libdbus_loader();
|
||||||
|
libdbus_loader(const std::string& library_name) : libdbus_loader() {
|
||||||
|
Load(library_name);
|
||||||
|
}
|
||||||
|
~libdbus_loader();
|
||||||
|
|
||||||
|
bool Load(const std::string& library_name);
|
||||||
|
bool IsLoaded() { return loaded_; }
|
||||||
|
|
||||||
|
decltype(&::dbus_bus_add_match) bus_add_match;
|
||||||
|
decltype(&::dbus_bus_get) bus_get;
|
||||||
|
decltype(&::dbus_bus_get_unique_name) bus_get_unique_name;
|
||||||
|
decltype(&::dbus_bus_remove_match) bus_remove_match;
|
||||||
|
decltype(&::dbus_connection_pop_message) connection_pop_message;
|
||||||
|
decltype(&::dbus_connection_read_write) connection_read_write;
|
||||||
|
decltype(&::dbus_connection_send_with_reply_and_block) connection_send_with_reply_and_block;
|
||||||
|
decltype(&::dbus_connection_unref) connection_unref;
|
||||||
|
decltype(&::dbus_error_free) error_free;
|
||||||
|
decltype(&::dbus_error_init) error_init;
|
||||||
|
decltype(&::dbus_error_is_set) error_is_set;
|
||||||
|
decltype(&::dbus_message_append_args) message_append_args;
|
||||||
|
decltype(&::dbus_message_is_signal) message_is_signal;
|
||||||
|
decltype(&::dbus_message_iter_get_arg_type) message_iter_get_arg_type;
|
||||||
|
decltype(&::dbus_message_iter_get_basic) message_iter_get_basic;
|
||||||
|
decltype(&::dbus_message_iter_init) message_iter_init;
|
||||||
|
decltype(&::dbus_message_iter_next) message_iter_next;
|
||||||
|
decltype(&::dbus_message_iter_recurse) message_iter_recurse;
|
||||||
|
decltype(&::dbus_message_new_method_call) message_new_method_call;
|
||||||
|
decltype(&::dbus_message_unref) message_unref;
|
||||||
|
decltype(&::dbus_move_error) move_error;
|
||||||
|
decltype(&::dbus_threads_init_default) threads_init_default;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CleanUp(bool unload);
|
||||||
|
|
||||||
|
#if defined(LIBRARY_LOADER_DBUS_H_DLOPEN)
|
||||||
|
void* library_;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool loaded_;
|
||||||
|
|
||||||
|
// Disallow copy constructor and assignment operator.
|
||||||
|
libdbus_loader(const libdbus_loader&);
|
||||||
|
void operator=(const libdbus_loader&);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LIBRARY_LOADER_DBUS_H
|
Loading…
Reference in New Issue