/* Copyright (C) 2010 The giomm Development Team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . */ #include #include #include #include #include #include #include #include namespace { extern "C" { static void DBusInterfaceVTable_MethodCall_giomm_callback(GDBusConnection* connection, const char* sender, const char* object_path, const char* interface_name, const char* method_name, GVariant* parameters, GDBusMethodInvocation* invocation, void* user_data) { Gio::DBus::InterfaceVTable* vtable = static_cast(user_data); Gio::DBus::InterfaceVTable::SlotInterfaceMethodCall* the_slot = vtable->get_slot_method_call(); try { // Note that we use VariantContainerBase instead of VariantBase for the // GVariant, because it is documented as being a tuple (list of values). (*the_slot)(Glib::wrap(connection, true), (sender ? sender : ""), object_path, interface_name, method_name, Glib::VariantContainerBase(parameters, true), Glib::wrap(invocation, true)); } catch (...) { Glib::exception_handlers_invoke(); } } static GVariant* DBusInterfaceVTable_GetProperty_giomm_callback(GDBusConnection* connection, const char* sender, const char* object_path, const char* interface_name, const char* property_name, GError** error, void* user_data) { Gio::DBus::InterfaceVTable* vtable = static_cast(user_data); Gio::DBus::InterfaceVTable::SlotInterfaceGetProperty* the_slot = vtable->get_slot_get_property(); try { Glib::VariantBase result; (*the_slot)( result, Glib::wrap(connection, true), sender, object_path, interface_name, property_name); return result.gobj_copy(); } catch (const Glib::Error& ex) { if (error) *error = g_error_copy(ex.gobj()); } catch (...) { Glib::exception_handlers_invoke(); } return nullptr; } static gboolean DBusInterfaceVTable_SetProperty_giomm_callback(GDBusConnection* connection, const char* sender, const char* object_path, const char* interface_name, const char* property_name, GVariant* value, GError** error, void* user_data) { Gio::DBus::InterfaceVTable* vtable = static_cast(user_data); Gio::DBus::InterfaceVTable::SlotInterfaceSetProperty* the_slot = vtable->get_slot_set_property(); try { return static_cast((*the_slot)(Glib::wrap(connection, true), sender, object_path, interface_name, property_name, Glib::VariantBase(value, true))); } catch (const Glib::Error& ex) { if (error) *error = g_error_copy(ex.gobj()); } catch (...) { Glib::exception_handlers_invoke(); } return false; } } // extern "C" } namespace Gio { namespace DBus { InterfaceVTable::InterfaceVTable(const SlotInterfaceMethodCall& slot_method_call, const SlotInterfaceGetProperty& slot_get_property, const SlotInterfaceSetProperty& slot_set_property) : slot_method_call_(new SlotInterfaceMethodCall(slot_method_call)), slot_get_property_(new SlotInterfaceGetProperty(slot_get_property)), slot_set_property_(new SlotInterfaceSetProperty(slot_set_property)) { gobject_.method_call = &DBusInterfaceVTable_MethodCall_giomm_callback; gobject_.get_property = &DBusInterfaceVTable_GetProperty_giomm_callback; gobject_.set_property = &DBusInterfaceVTable_SetProperty_giomm_callback; } InterfaceVTable::InterfaceVTable(InterfaceVTable&& other) noexcept : gobject_(std::move(other.gobject_)), slot_method_call_(std::move(other.slot_method_call_)), slot_get_property_(std::move(other.slot_get_property_)), slot_set_property_(std::move(other.slot_set_property_)) { other.slot_method_call_ = nullptr; other.slot_get_property_ = nullptr; other.slot_set_property_ = nullptr; } InterfaceVTable& InterfaceVTable::operator=(InterfaceVTable&& other) noexcept { delete slot_method_call_; delete slot_get_property_; delete slot_set_property_; gobject_ = std::move(other.gobject_); slot_method_call_ = std::move(other.slot_method_call_); slot_get_property_ = std::move(other.slot_get_property_); slot_set_property_ = std::move(other.slot_set_property_); other.slot_method_call_ = nullptr; other.slot_get_property_ = nullptr; other.slot_set_property_ = nullptr; return *this; } InterfaceVTable::~InterfaceVTable() { delete slot_method_call_; delete slot_get_property_; delete slot_set_property_; } InterfaceVTable::SlotInterfaceMethodCall* InterfaceVTable::get_slot_method_call() const { return slot_method_call_; } InterfaceVTable::SlotInterfaceGetProperty* InterfaceVTable::get_slot_get_property() const { return slot_get_property_; } InterfaceVTable::SlotInterfaceSetProperty* InterfaceVTable::get_slot_set_property() const { return slot_set_property_; } } // namespace DBus } // namespace Gio