summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2012-02-24 10:17:12 +0100
committerMarc-André Lureau <marcandre.lureau@redhat.com>2012-02-29 17:32:47 +0100
commit9473c2607941b1e5032b01f1cb580fdf935e5729 (patch)
tree8d9072061ff3e1dc3e0c2de766732cde63315ba2
parentd748bbc86ddfe0fcde475d63cdab0e2d80d2a05b (diff)
Add a spice-controller-dump testing tool
By default, start a controller listener. If ran with --menu, start a foreign-menu listener.
-rw-r--r--gtk/controller/Makefile.am5
-rw-r--r--gtk/controller/dump.c117
-rw-r--r--gtk/controller/test.c21
3 files changed, 137 insertions, 6 deletions
diff --git a/gtk/controller/Makefile.am b/gtk/controller/Makefile.am
index 20f1a48..916309e 100644
--- a/gtk/controller/Makefile.am
+++ b/gtk/controller/Makefile.am
@@ -20,7 +20,7 @@ AM_VALAFLAGS = \
$(NULL)
lib_LTLIBRARIES = libspice-controller.la
-noinst_PROGRAMS = test-controller
+noinst_PROGRAMS = test-controller spice-controller-dump
BUILT_SOURCES = controller.vala.stamp
@@ -60,6 +60,9 @@ libspice_controllerinclude_HEADERS = \
test_controller_SOURCES = test.c
test_controller_LDADD = libspice-controller.la
+spice_controller_dump_SOURCES = dump.c
+spice_controller_dump_LDADD = libspice-controller.la
+
controller.vala.stamp: $(libspice_controller_la_VALASOURCES) custom.vapi
@if test -z "$(VALAC)"; then \
echo "" ; \
diff --git a/gtk/controller/dump.c b/gtk/controller/dump.c
new file mode 100644
index 0000000..6541dec
--- /dev/null
+++ b/gtk/controller/dump.c
@@ -0,0 +1,117 @@
+/* Copyright (C) 2011 Red Hat, Inc. */
+
+/* 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 <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdint.h>
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#endif
+
+#include "spice-controller.h"
+
+SpiceCtrlController *ctrl = NULL;
+SpiceCtrlForeignMenu *menu = NULL;
+GMainLoop *loop = NULL;
+
+void signaled (GObject *gobject, const gchar *signal_name)
+{
+ g_message ("signaled: %s", signal_name);
+}
+
+void notified (GObject *gobject, GParamSpec *pspec,
+ gpointer user_data)
+{
+ GValue value = { 0, };
+ GValue strvalue = { 0, };
+
+ g_return_if_fail (gobject != NULL);
+ g_return_if_fail (pspec != NULL);
+
+ g_value_init (&value, pspec->value_type);
+ g_value_init (&strvalue, G_TYPE_STRING);
+ g_object_get_property (gobject, pspec->name, &value);
+
+ if (pspec->value_type == G_TYPE_STRV) {
+ gchar** p = (gchar **)g_value_get_boxed (&value);
+ g_message ("notify::%s == ", pspec->name);
+ while (*p)
+ g_message ("%s", *p++);
+ } else if (G_TYPE_IS_OBJECT(pspec->value_type)) {
+ GObject *o = g_value_get_object (&value);
+ g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null");
+ } else {
+ g_value_transform (&value, &strvalue);
+ g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue));
+ }
+
+ g_value_unset (&value);
+ g_value_unset (&strvalue);
+}
+
+void connect_signals (gpointer obj)
+{
+ guint i, n_ids = 0;
+ guint *ids = NULL;
+ GType type = G_OBJECT_TYPE (obj);
+
+ ids = g_signal_list_ids (type, &n_ids);
+ for (i = 0; i < n_ids; i++) {
+ const gchar *name = g_signal_name (ids[i]);
+ g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name);
+ }
+}
+
+int main (int argc, char *argv[])
+{
+ g_type_init ();
+ loop = g_main_loop_new (NULL, FALSE);
+
+ if (argc > 1 && g_str_equal(argv[1], "--menu")) {
+ menu = spice_ctrl_foreign_menu_new ();
+ g_signal_connect (menu, "notify", G_CALLBACK (notified), NULL);
+ connect_signals (menu);
+
+ spice_ctrl_foreign_menu_listen (menu, NULL, NULL, NULL);
+ } else {
+ ctrl = spice_ctrl_controller_new ();
+ g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL);
+ connect_signals (ctrl);
+
+ spice_ctrl_controller_listen (ctrl, NULL, NULL, NULL);
+ }
+
+ g_main_loop_run (loop);
+
+ if (ctrl != NULL)
+ g_object_unref (ctrl);
+ if (menu != NULL)
+ g_object_unref (menu);
+
+ return 0;
+}
+
diff --git a/gtk/controller/test.c b/gtk/controller/test.c
index e43d299..3f3eb55 100644
--- a/gtk/controller/test.c
+++ b/gtk/controller/test.c
@@ -174,9 +174,9 @@ void notified (GObject *gobject, GParamSpec *pspec,
g_message ("notify::%s == ", pspec->name);
while (*p)
g_message ("%s", *p++);
- } else if (pspec->value_type == G_TYPE_OBJECT) {
+ } else if (G_TYPE_IS_OBJECT(pspec->value_type)) {
GObject *o = g_value_get_object (&value);
- g_message ("notify::%s == %s", pspec->name, G_OBJECT_TYPE_NAME (o));
+ g_message ("notify::%s == %s", pspec->name, o ? G_OBJECT_TYPE_NAME (o) : "null");
} else {
g_value_transform (&value, &strvalue);
g_message ("notify::%s = %s", pspec->name, g_value_get_string (&strvalue));
@@ -186,6 +186,19 @@ void notified (GObject *gobject, GParamSpec *pspec,
g_value_unset (&strvalue);
}
+void connect_signals (gpointer obj)
+{
+ guint i, n_ids = 0;
+ guint *ids = NULL;
+ GType type = G_OBJECT_TYPE (obj);
+
+ ids = g_signal_list_ids (type, &n_ids);
+ for (i = 0; i < n_ids; i++) {
+ const gchar *name = g_signal_name (ids[i]);
+ g_signal_connect (obj, name, G_CALLBACK (signaled), (gpointer)name);
+ }
+}
+
int main (int argc, char *argv[])
{
int spicec_pid = (argc > 1 ? atoi (argv[1]) : 0);
@@ -199,9 +212,7 @@ int main (int argc, char *argv[])
ctrl = spice_ctrl_controller_new ();
loop = g_main_loop_new (NULL, FALSE);
g_signal_connect (ctrl, "notify", G_CALLBACK (notified), NULL);
- g_signal_connect (ctrl, "show", G_CALLBACK (signaled), "show");
- g_signal_connect (ctrl, "hide", G_CALLBACK (signaled), "hide");
- g_signal_connect (ctrl, "do_connect", G_CALLBACK (signaled), "do_connect");
+ connect_signals (ctrl);
#ifdef WIN32
snprintf (pipe_name, PIPE_NAME_MAX_LEN, PIPE_NAME, spicec_pid);