summaryrefslogtreecommitdiff
diff options
authorAlex Launi <alex.launi@canonical.com>2011-10-28 16:47:58 -0400
committerAlex Launi <alex.launi@canonical.com>2011-10-28 16:47:58 -0400
commitbd0760e435d483a3b3cf822c6e6d4e43d00da2a8 (patch)
tree8dad8e651f9c3089d01e11f56d92c980c9a60914
parent14b222fd65094cb8e0de610deba72d8eb513f782 (diff)
parent46efefdb35be841813fd2e4582940980afd2c359 (diff)
Merge selective introspection branch
(bzr r1733)
-rw-r--r--plugins/unityshell/src/DebugDBusInterface.cpp122
-rw-r--r--plugins/unityshell/src/DebugDBusInterface.h7
-rw-r--r--plugins/unityshell/src/Introspectable.cpp3
-rw-r--r--plugins/unityshell/src/Introspectable.h5
4 files changed, 56 insertions, 81 deletions
diff --git a/plugins/unityshell/src/DebugDBusInterface.cpp b/plugins/unityshell/src/DebugDBusInterface.cpp
index e750a3b62..41292de1d 100644
--- a/plugins/unityshell/src/DebugDBusInterface.cpp
+++ b/plugins/unityshell/src/DebugDBusInterface.cpp
@@ -30,13 +30,13 @@
#define SI_METHOD_NAME_GETSTATE "GetState"
#define AP_METHOD_NAME_STARTTEST "StartTest"
-using namespace unity;
-
void StartTest(const gchar*);
GVariant* GetState(const gchar*);
void DBusMethodCall(GDBusConnection*, const gchar*, const gchar*,
const gchar*, const gchar*, GVariant*,
GDBusMethodInvocation*, gpointer);
+Introspectable* FindPieceToIntrospect(std::queue<Introspectable*> queue,
+ const gchar* pieceName);
static const GDBusInterfaceVTable si_vtable =
{
@@ -153,12 +153,12 @@ static const GDBusInterfaceInfo ap_iface_info =
NULL
};
-static unity::Introspectable* _introspectable;
+static unity::Introspectable* _parent_introspectable;
static unity::Autopilot* _autopilot;
-DebugDBusInterface::DebugDBusInterface(unity::Introspectable* introspectable)
+DebugDBusInterface::DebugDBusInterface(unity::Introspectable* parent)
{
- _introspectable = introspectable;
+ _parent_introspectable = parent;
_owner_id = g_bus_own_name(G_BUS_TYPE_SESSION,
UNITY_DBUS_BUS_NAME,
G_BUS_NAME_OWNER_FLAGS_NONE,
@@ -182,7 +182,7 @@ DebugDBusInterface::OnBusAcquired(GDBusConnection* connection, const gchar* name
int i = 0;
GError* error;
- UnityScreen* uscreen = dynamic_cast<UnityScreen*>(_introspectable);
+ UnityScreen* uscreen = dynamic_cast<UnityScreen*>(_parent_introspectable);
if (uscreen != NULL)
{
_autopilot = new unity::Autopilot(uscreen->screen, connection);
@@ -253,9 +253,23 @@ DBusMethodCall(GDBusConnection* connection,
}
GVariant*
-GetState(const gchar* piece)
+GetState(const gchar* pieceName)
{
- return _introspectable->Introspect();
+ std::queue<Introspectable*> queue;
+ queue.push(_parent_introspectable);
+
+ // Since the empty string won't really match the name of the parent (Unity),
+ // we make sure that we're able to accept a blank string and just define it to
+ // mean the top level.
+ Introspectable* piece = g_strcmp0(pieceName, "") == 0
+ ? _parent_introspectable
+ : FindPieceToIntrospect(queue, pieceName);
+
+ // FIXME this might not work, make sure it does.
+ if (piece == NULL)
+ return NULL;
+
+ return piece->Introspect();
}
void
@@ -264,71 +278,31 @@ StartTest(const gchar* name)
_autopilot->StartTest(name);
}
-/* a very contrived example purely for giving QA something purposes */
-GVariant*
-DebugDBusInterface::BuildFakeReturn()
+/*
+ * Do a breadth-first search of the introspectable tree.
+ */
+Introspectable*
+FindPieceToIntrospect(std::queue<Introspectable*> queue, const gchar* pieceName)
{
- GVariantBuilder* builder;
- GVariant* result, *panel_result, *indicators_result, *appmenu_result, *entries_result, *zero_result, *one_result;
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_string("_File"));
- g_variant_builder_add(builder, "{sv}", "image", g_variant_new_string(""));
- g_variant_builder_add(builder, "{sv}", "visible", g_variant_new_boolean(TRUE));
- g_variant_builder_add(builder, "{sv}", "sensitive", g_variant_new_boolean(TRUE));
- g_variant_builder_add(builder, "{sv}", "active", g_variant_new_boolean(FALSE));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(34));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(24));
- zero_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_string("_Edit"));
- g_variant_builder_add(builder, "{sv}", "image", g_variant_new_string(""));
- g_variant_builder_add(builder, "{sv}", "visible", g_variant_new_boolean(TRUE));
- g_variant_builder_add(builder, "{sv}", "sensitive", g_variant_new_boolean(TRUE));
- g_variant_builder_add(builder, "{sv}", "active", g_variant_new_boolean(FALSE));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(34));
- g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(24));
- one_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "0", zero_result);
- g_variant_builder_add(builder, "{sv}", "1", one_result);
- entries_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "model-name",
- g_variant_new_string("com.canonical.Unity.Panel.Service.Indicators.appmenu.324234243"));
- g_variant_builder_add(builder, "{sv}", "entries", entries_result);
- appmenu_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "appmenu", appmenu_result);
- indicators_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "backend",
- g_variant_new_string("/com/canonical/Unity/Panel/Service/324234243"));
- g_variant_builder_add(builder, "{sv}", "launch-type",
- g_variant_new_string("dbus"));
- g_variant_builder_add(builder, "{sv}", "width", g_variant_new_int32(1024));
- g_variant_builder_add(builder, "{sv}", "width", g_variant_new_int32(32));
- g_variant_builder_add(builder, "{sv}", "theme", g_variant_new_string("gtk"));
- g_variant_builder_add(builder, "{sv}", "indicators", indicators_result);
- panel_result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- g_variant_builder_add(builder, "{sv}", "panel", panel_result);
- result = g_variant_new("(a{sv})", builder);
- g_variant_builder_unref(builder);
-
- gchar* s = g_variant_print(result, TRUE);
- g_free(s);
- return result;
+ Introspectable* piece;
+
+ while (!queue.empty())
+ {
+ piece = queue.front();
+ queue.pop();
+
+ if (g_strcmp0 (piece->GetName(), pieceName) == 0)
+ {
+ return piece;
+ }
+
+ for (auto it = piece->GetIntrospectableChildren().begin(), last = piece->GetIntrospectableChildren().end(); it != last; it++)
+ {
+ queue.push(*it);
+ }
+
+ FindPieceToIntrospect(queue, pieceName);
+ }
+
+ return NULL;
}
diff --git a/plugins/unityshell/src/DebugDBusInterface.h b/plugins/unityshell/src/DebugDBusInterface.h
index 31ce8c49a..a79cf3dab 100644
--- a/plugins/unityshell/src/DebugDBusInterface.h
+++ b/plugins/unityshell/src/DebugDBusInterface.h
@@ -24,6 +24,8 @@
#include <gio/gio.h>
#include "Introspectable.h"
+using namespace unity;
+
#define UNITY_DBUS_BUS_NAME "com.canonical.Unity"
#define UNITY_DBUS_DEBUG_OBJECT_PATH "/com/canonical/Unity/Debug"
#define UNITY_DBUS_AP_IFACE_NAME "com.canonical.Unity.Debug.Autopilot"
@@ -33,20 +35,17 @@
class DebugDBusInterface
{
public:
- DebugDBusInterface(unity::Introspectable* introspectable);
+ DebugDBusInterface(Introspectable* introspectable);
~DebugDBusInterface();
private:
/* methods */
-
static void OnBusAcquired(GDBusConnection* connection, const gchar* name, gpointer data);
static void OnNameAcquired(GDBusConnection* connection, const gchar* name, gpointer data);
static void OnNameLost(GDBusConnection* connection, const gchar* name, gpointer data);
- //static GVariant *GetState (const char *piece);
-
static GVariant* BuildFakeReturn();
/* members */
diff --git a/plugins/unityshell/src/Introspectable.cpp b/plugins/unityshell/src/Introspectable.cpp
index 0236e646d..833b785d6 100644
--- a/plugins/unityshell/src/Introspectable.cpp
+++ b/plugins/unityshell/src/Introspectable.cpp
@@ -30,12 +30,11 @@ Introspectable::Introspect()
gint n_children = 0;
builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
-
AddProperties(builder);
child_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
- for (std::list<Introspectable*>::iterator it = _children.begin(); it != _children.end(); it++)
+ for (auto it = _children.begin(); it != _children.end(); it++)
{
if ((*it)->GetName())
{
diff --git a/plugins/unityshell/src/Introspectable.h b/plugins/unityshell/src/Introspectable.h
index 5b132e767..c96f98dc6 100644
--- a/plugins/unityshell/src/Introspectable.h
+++ b/plugins/unityshell/src/Introspectable.h
@@ -27,13 +27,16 @@ namespace unity
{
class Introspectable
{
+typedef std::list<Introspectable*> IntrospectableList;
+
public:
GVariant* Introspect();
+ virtual const gchar* GetName() = 0;
void AddChild(Introspectable* child);
void RemoveChild(Introspectable* child);
+ IntrospectableList const& GetIntrospectableChildren() { return _children; };
protected:
- virtual const gchar* GetName() = 0;
virtual const gchar* GetChildsName();
virtual void AddProperties(GVariantBuilder* builder) = 0;
/*