/* 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
_DEFS(giomm,gio)
_PINCLUDE(glibmm/private/object_p.h)
namespace Gio
{
namespace DBus
{
/** This represents a virtual table for
* subtrees registered with Gio::DBus::Connection::register_subtree().
*
* The only correct use of this class is to declare a global instance of it
* (or an instance local to the main function) and pass pointers to the
* instance to the methods that require such a parameter. The instance can be
* used for multiple registrations and the memory it uses will be freed at the
* end of execution. Any other use (like creating an instance local to a
* function and using that) may cause memory leaks or errors (if the instance
* is destroyed too early).
*
* @newin{2,28}
* @ingroup DBus
*/
class GIOMM_API SubtreeVTable
{
_CLASS_GENERIC(SubtreeVTable, GDBusSubtreeVTable)
public:
/** The type for a slot which handles enumerating child nodes.
*
* This slot is called when generating introspection data and also when
* preparing to dispatch incoming messages in the event that the
* Gio::DBus::SUBTREE_FLAGS_DISPATCH_TO_UNENUMERATED_NODES flag is not
* specified (ie: to verify that the object path is valid).
*
* Hierarchies are not supported; the items that you return should not
* contain the '/' character.
*
* For example,
* @code
* std::vector on_subtree_enumerate(const
* Glib::RefPtr& connection, const Glib::ustring&
* sender, const Glib::ustring& object_path);
* @endcode
*/
using SlotSubtreeEnumerate = sigc::slot<
std::vector(
const Glib::RefPtr&,
const Glib::ustring&,
const Glib::ustring&)
>;
/** The type for a slot which handles introspecting a child node.
*
* Subtrees are flat. @a node, if non-0, is always exactly one
* segment of the object path (ie: it never contains a slash).
*
* This function should return an empty vector to indicate that there is no
* object at this node.
*
* If this function returns a non-empty vector, the return value is expected
* to be a list of InterfaceInfo structures describing the interfaces
* implemented by node.
*
* for example,
* @code
* std::vector< Glib::RefPtr >
* on_subtree_introspect(const Glib::RefPtr&
* connection, const Glib::ustring& sender, const Glib::ustring&
* object_path, const Glib::ustring& node);
* @endcode
*/
using SlotSubtreeIntrospect = sigc::slot<
std::vector< Glib::RefPtr >(
const Glib::RefPtr&,
const Glib::ustring&,
const Glib::ustring&,
const Glib::ustring&)
>;
/** The type for a slot which handles dispatching a remote call on a child
* node.
*
* Subtrees are flat. @a node, if non-0, is always exactly one
* segment of the object path (ie: it never contains a slash).
*
* for example,
* @code
* const Gio::DBus::InterfaceVTable* on_subtree_dispatch(const
* Glib::RefPtr& connection, const Glib::ustring&
* sender, const Glib::ustring& object_path, const Glib::ustring&
* interface_name, const Glib::ustring& node);
* @endcode
*/
using SlotSubtreeDispatch = sigc::slot<
const InterfaceVTable*(
const Glib::RefPtr&,
const Glib::ustring&,
const Glib::ustring&,
const Glib::ustring&,
const Glib::ustring&)
>;
/** Constructs a new SubtreeVTable using specified slots.
* @param slot_enumerate The slot for handling incoming method calls.
* @param slot_introspect The slot for getting a property.
* @param slot_dispatch The slot for setting a property.
*/
explicit SubtreeVTable(
const SlotSubtreeEnumerate& slot_enumerate,
const SlotSubtreeIntrospect& slot_introspect = {},
const SlotSubtreeDispatch& slot_dispatch = {}
);
SubtreeVTable(const SubtreeVTable& other) = delete;
SubtreeVTable& operator=(const SubtreeVTable& other) = delete;
SubtreeVTable(SubtreeVTable&& other) noexcept;
SubtreeVTable& operator=(SubtreeVTable&& other) noexcept;
/// Destructor.
virtual ~SubtreeVTable();
/// Provides access to the underlying C object.
GDBusSubtreeVTable* gobj()
{ return reinterpret_cast(&gobject_); }
/// Provides access to the underlying C object.
const GDBusSubtreeVTable* gobj() const
{ return reinterpret_cast(&gobject_); }
public:
#ifndef DOXYGEN_SHOULD_SKIP_THIS
// These are so the C callbacks and the
// Gio::DBus::Connection::register_subtreee() method can have access to the
// copies of the slots used for creation when registering.
SlotSubtreeEnumerate* get_slot_enumerate() const;
SlotSubtreeIntrospect* get_slot_introspect() const;
SlotSubtreeDispatch* get_slot_dispatch() const;
#endif
protected:
// The underlying C instance.
GDBusSubtreeVTable gobject_;
// Pointers to copies of the slots used to create an instance.
SlotSubtreeEnumerate* slot_enumerate_;
SlotSubtreeIntrospect* slot_introspect_;
SlotSubtreeDispatch* slot_dispatch_;
};
} //namespace DBus
} // namespace Gio