imported D-Bus C++ library

git-svn-id: http://dev.openwengo.org/svn/openwengo/wengophone-ng/branches/wengophone-dbus-api/libs/dbus@7382 30a43799-04e7-0310-8b2b-ea0d24f86d0e
This commit is contained in:
pdurante 2006-09-05 13:36:22 +00:00
commit acfeb85b87
89 changed files with 92818 additions and 0 deletions

134
src/introspection.cpp Normal file
View file

@ -0,0 +1,134 @@
/*
*
* D-Bus++ - C++ bindings for DBus
*
* Copyright (C) 2005-2006 Paolo Durante <shackan@gmail.com>
*
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <dbus-c++/introspection.h>
#include <dbus-c++/message.h>
#include <dbus-c++/xml.h>
#include <dbus/dbus.h>
using namespace DBus;
static const char* introspectable_name = "org.freedesktop.DBus.Introspectable";
IntrospectableAdaptor::IntrospectableAdaptor()
: InterfaceAdaptor(introspectable_name)
{
register_method(IntrospectableAdaptor, Introspect, Introspect);
}
Message IntrospectableAdaptor::Introspect( const CallMessage& call )
{
debug_log("requested introspection data");
Xml::Node iroot("node");
InterfaceTable::const_iterator iti;
for(iti = _interfaces.begin(); iti != _interfaces.end(); ++iti)
{
debug_log("introspecting interface %s", iti->first.c_str());
IntrospectedInterface* const intro = iti->second->introspect();
if(intro)
{
Xml::Node& iface = iroot.add(Xml::Node("interface"));
iface.set("name", intro->name);
for(const IntrospectedMethod* m = intro->methods; m->args; ++m)
{
Xml::Node& method = iface.add(Xml::Node("method"));
method.set("name", m->name);
for(const IntrospectedArgument* a = m->args; a->type; ++a)
{
Xml::Node& arg = method.add(Xml::Node("arg"));
if(a->name) arg.set("name", a->name);
arg.set("direction", a->in ? "in" : "out");
arg.set("type", a->type);
}
}
for(const IntrospectedMethod* m = intro->signals; m->args; ++m)
{
Xml::Node& method = iface.add(Xml::Node("signal"));
method.set("name", m->name);
for(const IntrospectedArgument* a = m->args; a->type; ++a)
{
Xml::Node& arg = method.add(Xml::Node("arg"));
if(a->name) arg.set("name", a->name);
arg.set("type", a->type);
}
}
}
}
std::string xml = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE + iroot.to_xml();
ReturnMessage reply(call);
MessageIter wi = reply.w_iter();
wi.append_string(xml.c_str());
return reply;
}
IntrospectedInterface* const IntrospectableAdaptor::introspect() const
{
static IntrospectedArgument Introspect_args[] =
{
{ "data", "s", false },
{ 0, 0, 0 }
};
static IntrospectedMethod Introspectable_methods[] =
{
{ "Introspect", Introspect_args },
{ 0, 0 }
};
static IntrospectedMethod Introspectable_signals[] =
{
{ 0, 0 }
};
static IntrospectedInterface Introspectable_interface =
{
introspectable_name, Introspectable_methods, Introspectable_signals
};
return &Introspectable_interface;
}
IntrospectableProxy::IntrospectableProxy()
: InterfaceProxy(introspectable_name)
{}
std::string IntrospectableProxy::Introspect()
{
DBus::CallMessage call;
call.member("Introspect");
DBus::Message ret = invoke_method(call);
DBus::MessageIter ri = ret.r_iter();
const char* str = ri.get_string();
return str;
}