~mhr3/unity/no-zero-timeouts

« back to all changes in this revision

Viewing changes to plugins/unityshell/src/DebugDBusInterface.cpp

Merge selective introspection branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
#define SI_METHOD_NAME_GETSTATE  "GetState"
31
31
#define AP_METHOD_NAME_STARTTEST "StartTest"
32
32
 
33
 
using namespace unity;
34
 
 
35
33
void StartTest(const gchar*);
36
34
GVariant* GetState(const gchar*);
37
35
void DBusMethodCall(GDBusConnection*, const gchar*, const gchar*,
38
36
                    const gchar*, const gchar*, GVariant*,
39
37
                    GDBusMethodInvocation*, gpointer);
 
38
Introspectable* FindPieceToIntrospect(std::queue<Introspectable*> queue, 
 
39
                                      const gchar* pieceName);
40
40
 
41
41
static const GDBusInterfaceVTable si_vtable =
42
42
{
153
153
  NULL
154
154
};
155
155
 
156
 
static unity::Introspectable* _introspectable;
 
156
static unity::Introspectable* _parent_introspectable;
157
157
static unity::Autopilot* _autopilot;
158
158
 
159
 
DebugDBusInterface::DebugDBusInterface(unity::Introspectable* introspectable)
 
159
DebugDBusInterface::DebugDBusInterface(unity::Introspectable* parent)
160
160
{
161
 
  _introspectable = introspectable;
 
161
  _parent_introspectable = parent;
162
162
  _owner_id = g_bus_own_name(G_BUS_TYPE_SESSION,
163
163
                             UNITY_DBUS_BUS_NAME,
164
164
                             G_BUS_NAME_OWNER_FLAGS_NONE,
182
182
  int i = 0;
183
183
  GError* error;
184
184
 
185
 
  UnityScreen* uscreen = dynamic_cast<UnityScreen*>(_introspectable);
 
185
  UnityScreen* uscreen = dynamic_cast<UnityScreen*>(_parent_introspectable);
186
186
  if (uscreen != NULL)
187
187
  {
188
188
    _autopilot = new unity::Autopilot(uscreen->screen, connection);
253
253
}
254
254
 
255
255
GVariant*
256
 
GetState(const gchar* piece)
 
256
GetState(const gchar* pieceName)
257
257
{
258
 
  return _introspectable->Introspect();
 
258
  std::queue<Introspectable*> queue;
 
259
  queue.push(_parent_introspectable);
 
260
 
 
261
  // Since the empty string won't really match the name of the parent (Unity),
 
262
  // we make sure that we're able to accept a blank string and just define it to
 
263
  // mean the top level.
 
264
  Introspectable* piece = g_strcmp0(pieceName, "") == 0
 
265
    ? _parent_introspectable
 
266
    : FindPieceToIntrospect(queue, pieceName);
 
267
 
 
268
  // FIXME this might not work, make sure it does.
 
269
  if (piece == NULL)
 
270
    return NULL;
 
271
 
 
272
  return piece->Introspect();
259
273
}
260
274
 
261
275
void
264
278
  _autopilot->StartTest(name);
265
279
}
266
280
 
267
 
/* a very contrived example purely for giving QA something purposes */
268
 
GVariant*
269
 
DebugDBusInterface::BuildFakeReturn()
 
281
/*
 
282
 * Do a breadth-first search of the introspectable tree.
 
283
 */
 
284
Introspectable*
 
285
FindPieceToIntrospect(std::queue<Introspectable*> queue, const gchar* pieceName)
270
286
{
271
 
  GVariantBuilder* builder;
272
 
  GVariant* result, *panel_result, *indicators_result, *appmenu_result, *entries_result, *zero_result, *one_result;
273
 
 
274
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
275
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_string("_File"));
276
 
  g_variant_builder_add(builder, "{sv}", "image", g_variant_new_string(""));
277
 
  g_variant_builder_add(builder, "{sv}", "visible", g_variant_new_boolean(TRUE));
278
 
  g_variant_builder_add(builder, "{sv}", "sensitive", g_variant_new_boolean(TRUE));
279
 
  g_variant_builder_add(builder, "{sv}", "active", g_variant_new_boolean(FALSE));
280
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(34));
281
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(24));
282
 
  zero_result = g_variant_new("(a{sv})", builder);
283
 
  g_variant_builder_unref(builder);
284
 
 
285
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
286
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_string("_Edit"));
287
 
  g_variant_builder_add(builder, "{sv}", "image", g_variant_new_string(""));
288
 
  g_variant_builder_add(builder, "{sv}", "visible", g_variant_new_boolean(TRUE));
289
 
  g_variant_builder_add(builder, "{sv}", "sensitive", g_variant_new_boolean(TRUE));
290
 
  g_variant_builder_add(builder, "{sv}", "active", g_variant_new_boolean(FALSE));
291
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(34));
292
 
  g_variant_builder_add(builder, "{sv}", "label", g_variant_new_int32(24));
293
 
  one_result = g_variant_new("(a{sv})", builder);
294
 
  g_variant_builder_unref(builder);
295
 
 
296
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
297
 
  g_variant_builder_add(builder, "{sv}", "0", zero_result);
298
 
  g_variant_builder_add(builder, "{sv}", "1", one_result);
299
 
  entries_result = g_variant_new("(a{sv})", builder);
300
 
  g_variant_builder_unref(builder);
301
 
 
302
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
303
 
  g_variant_builder_add(builder, "{sv}", "model-name",
304
 
                        g_variant_new_string("com.canonical.Unity.Panel.Service.Indicators.appmenu.324234243"));
305
 
  g_variant_builder_add(builder, "{sv}", "entries", entries_result);
306
 
  appmenu_result = g_variant_new("(a{sv})", builder);
307
 
  g_variant_builder_unref(builder);
308
 
 
309
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
310
 
  g_variant_builder_add(builder, "{sv}", "appmenu", appmenu_result);
311
 
  indicators_result = g_variant_new("(a{sv})", builder);
312
 
  g_variant_builder_unref(builder);
313
 
 
314
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
315
 
  g_variant_builder_add(builder, "{sv}", "backend",
316
 
                        g_variant_new_string("/com/canonical/Unity/Panel/Service/324234243"));
317
 
  g_variant_builder_add(builder, "{sv}", "launch-type",
318
 
                        g_variant_new_string("dbus"));
319
 
  g_variant_builder_add(builder, "{sv}", "width", g_variant_new_int32(1024));
320
 
  g_variant_builder_add(builder, "{sv}", "width", g_variant_new_int32(32));
321
 
  g_variant_builder_add(builder, "{sv}", "theme", g_variant_new_string("gtk"));
322
 
  g_variant_builder_add(builder, "{sv}", "indicators", indicators_result);
323
 
  panel_result = g_variant_new("(a{sv})", builder);
324
 
  g_variant_builder_unref(builder);
325
 
 
326
 
  builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
327
 
  g_variant_builder_add(builder, "{sv}", "panel", panel_result);
328
 
  result = g_variant_new("(a{sv})", builder);
329
 
  g_variant_builder_unref(builder);
330
 
 
331
 
  gchar* s = g_variant_print(result, TRUE);
332
 
  g_free(s);
333
 
  return result;
 
287
  Introspectable* piece;
 
288
 
 
289
  while (!queue.empty())
 
290
  {
 
291
    piece = queue.front();
 
292
    queue.pop();
 
293
 
 
294
    if (g_strcmp0 (piece->GetName(), pieceName) == 0)
 
295
    {
 
296
      return piece;
 
297
    }
 
298
 
 
299
    for (auto it = piece->GetIntrospectableChildren().begin(), last = piece->GetIntrospectableChildren().end(); it != last; it++)
 
300
    {
 
301
      queue.push(*it);
 
302
    }
 
303
 
 
304
    FindPieceToIntrospect(queue, pieceName);
 
305
  }
 
306
 
 
307
  return NULL;
334
308
}