blob: 0ccec23fbbdefadc8c1b5329a7b4d1e9a108f1ec [file] [log] [blame]
Emeric Vigier2f625822012-08-06 11:09:52 -04001#include "dbus-browser.h"
2
3#include <xml.h>
4#include <iostream>
5
6using namespace std;
7
8static const char *DBUS_SERVER_NAME = "org.freedesktop.DBus";
9static const char *DBUS_SERVER_PATH = "/org/freedesktop/DBus";
10
11DBusBrowser::DBusBrowser(::DBus::Connection &conn)
12 : ::DBus::ObjectProxy(conn, DBUS_SERVER_PATH, DBUS_SERVER_NAME)
13{
14 set_title("D-Bus Browser");
15 set_border_width(5);
16 set_default_size(400, 500);
17
18 typedef std::vector< std::string > Names;
19
20 Names names = ListNames();
21
22 for (Names::iterator it = names.begin(); it != names.end(); ++it)
23 {
24 _cb_busnames.append_text(*it);
25 }
26
27 _cb_busnames.signal_changed().connect(sigc::mem_fun(*this, &DBusBrowser::on_select_busname));
28
29 _tm_inspect = Gtk::TreeStore::create(_records);
30 _tv_inspect.set_model(_tm_inspect);
31 _tv_inspect.append_column("Node", _records.name);
32
33 _sc_tree.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
34 _sc_tree.add(_tv_inspect);
35
36 _vbox.pack_start(_cb_busnames, Gtk::PACK_SHRINK);
37 _vbox.pack_start(_sc_tree);
38
39 add(_vbox);
40
41 show_all_children();
42}
43
44void DBusBrowser::NameOwnerChanged(
45 const std::string &name, const std::string &old_owner, const std::string &new_owner)
46{
47 cout << name << ": " << old_owner << " -> " << new_owner << endl;
48}
49
50void DBusBrowser::NameLost(const std::string &name)
51{
52 cout << name << " lost" << endl;
53}
54
55void DBusBrowser::NameAcquired(const std::string &name)
56{
57 cout << name << " acquired" << endl;
58}
59
60void DBusBrowser::on_select_busname()
61{
62 Glib::ustring busname = _cb_busnames.get_active_text();
63 if (busname.empty()) return;
64
65 _tm_inspect->clear();
66 _inspect_append(NULL, "", busname);
67}
68
69void DBusBrowser::_inspect_append(Gtk::TreeModel::Row *row, const std::string &buspath, const std::string &busname)
70{
71 DBusInspector inspector(conn(), buspath.empty() ? "/" : buspath.c_str(), busname.c_str());
72
73 ::DBus::Xml::Document doc(inspector.Introspect());
74 ::DBus::Xml::Node &root = *(doc.root);
75
76 ::DBus::Xml::Nodes ifaces = root["interface"];
77
78 for (::DBus::Xml::Nodes::iterator ii = ifaces.begin(); ii != ifaces.end(); ++ii)
79 {
80 ::DBus::Xml::Node &iface = **ii;
81
82 Gtk::TreeModel::Row i_row = row
83 ? *(_tm_inspect->append(row->children()))
84 : *(_tm_inspect->append());
85 i_row[_records.name] = "interface: " + iface.get("name");
86
87 ::DBus::Xml::Nodes methods = iface["method"];
88
89 for (::DBus::Xml::Nodes::iterator im = methods.begin(); im != methods.end(); ++im)
90 {
91 Gtk::TreeModel::Row m_row = *(_tm_inspect->append(i_row.children()));
92 m_row[_records.name] = "method: " + (*im)->get("name");
93 }
94
95 ::DBus::Xml::Nodes signals = iface["signal"];
96
97 for (::DBus::Xml::Nodes::iterator is = signals.begin(); is != signals.end(); ++is)
98 {
99 Gtk::TreeModel::Row s_row = *(_tm_inspect->append(i_row.children()));
100 s_row[_records.name] = "signal: " + (*is)->get("name");
101 }
102 }
103
104 ::DBus::Xml::Nodes nodes = root["node"];
105
106 for (::DBus::Xml::Nodes::iterator in = nodes.begin(); in != nodes.end(); ++in)
107 {
108 std::string name = (*in)->get("name");
109
110 Gtk::TreeModel::Row n_row = row
111 ? *(_tm_inspect->append(row->children()))
112 : *(_tm_inspect->append());
113 n_row[_records.name] = name;
114
115 _inspect_append(&n_row, buspath + "/" + name, busname);
116 }
117}
118
119DBus::Glib::BusDispatcher dispatcher;
120
121int main(int argc, char *argv[])
122{
123 Gtk::Main kit(argc, argv);
124
125 DBus::default_dispatcher = &dispatcher;
126
127 dispatcher.attach(NULL);
128
129 // activate one of both for either system or session bus
130 // TODO: choose in the GUI
131 DBus::Connection conn = DBus::Connection::SessionBus();
132 //DBus::Connection conn = DBus::Connection::SystemBus();
133
134 DBusBrowser browser(conn);
135
136 Gtk::Main::run(browser);
137
138 return 0;
139}