diff options
author | Mark Doffman <mdoff@altair-voyager.(none)> | 2009-07-06 16:37:48 +0100 |
---|---|---|
committer | Mark Doffman <mdoff@altair-voyager.(none)> | 2009-07-06 16:37:48 +0100 |
commit | 5d374cf95f2447a712f94dd2efe2b294ecab58ca (patch) | |
tree | c41f792256d87de6faa8948ad4373a656f4c1ada /droute | |
parent | 36a4131a9cc9fc8d474058d2a9448bc9eac91f17 (diff) | |
download | at-spi2-atk-5d374cf95f2447a712f94dd2efe2b294ecab58ca.tar.gz |
2009-07-06 Mark Doffman <mark.doffman@codethink.co.uk>
Re-organize the build configuration to use an external registryd,
dbind and droute libraries from at-spi2-core.
Diffstat (limited to 'droute')
-rw-r--r-- | droute/Makefile.am | 32 | ||||
-rw-r--r-- | droute/droute-pairhash.c | 87 | ||||
-rw-r--r-- | droute/droute-pairhash.h | 41 | ||||
-rw-r--r-- | droute/droute-test.c | 243 | ||||
-rw-r--r-- | droute/droute-variant.c | 118 | ||||
-rw-r--r-- | droute/droute-variant.h | 35 | ||||
-rw-r--r-- | droute/droute.c | 593 | ||||
-rw-r--r-- | droute/droute.h | 95 | ||||
-rw-r--r-- | droute/test.interface.One | 15 | ||||
-rw-r--r-- | droute/test.interface.Two | 15 |
10 files changed, 0 insertions, 1274 deletions
diff --git a/droute/Makefile.am b/droute/Makefile.am deleted file mode 100644 index 8d7e957..0000000 --- a/droute/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -noinst_LTLIBRARIES = libdroute.la - -libdroute_la_CFLAGS = $(DBUS_GLIB_CFLAGS) \ - -DATSPI_INTROSPECTION_PATH=\"$(pkgdatadir)/$(DEFAULT_ATSPI_INTROSPECTION_PATH)\"\ - -I$(top_builddir)\ - -I$(top_srcdir) - -libdrouteinclude_HEADERS = \ - droute.h - droute-variant.h -libdrouteincludedir=$(includedir)/droute - -libdroute_la_SOURCES =\ - droute.c\ - droute.h\ - droute-variant.c\ - droute-variant.h\ - droute-pairhash.c\ - droute-pairhash.h - -TESTS = droute-test - -check_PROGRAMS = droute-test -droute_test_SOURCES = droute-test.c -droute_test_CFLAGS = $(DBUS_GLIB_CFLAGS) \ - -I$(top_builddir)\ - -I$(top_srcdir)\ - -DTEST_INTROSPECTION_DIRECTORY=\"$(top_srcdir)/droute\" - -droute_test_LDFLAGS = $(top_builddir)/dbind/libdbind.la\ - libdroute.la\ - $(DBUS_GLIB_LIBS) diff --git a/droute/droute-pairhash.c b/droute/droute-pairhash.c deleted file mode 100644 index f3b8da2..0000000 --- a/droute/droute-pairhash.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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 "droute-pairhash.h" - -/*---------------------------------------------------------------------------*/ - -static guint -str_hash (guint32 h, const char *p) -{ - for (p += 1; *p != '\0'; p++) - h = (h << 5) - h + *p; - - return h; -} - -/*---------------------------------------------------------------------------*/ - -StrPair * -str_pair_new (const gchar *one, const gchar *two) -{ - StrPair *pair; - - pair = g_new (StrPair, 1); - pair->one = one; - pair->two = two; - return pair; -} - -guint -str_pair_hash (gconstpointer key) -{ - StrPair *pair = (StrPair *) key; - guint hash = 0; - - /*g_return_val_if_fail (pair != NULL, 0); - g_return_val_if_fail (pair->one != NULL, 0); - g_return_val_if_fail (pair->two != NULL, 0); - */ - - if (*(pair->two) != '\0') - { - hash = *(pair->two); - hash = str_hash (hash, ++(pair->two)); - hash = str_hash (hash, pair->one); - } - - return hash; -} - -gboolean -str_pair_equal (gconstpointer a, gconstpointer b) -{ - StrPair *ap = (StrPair *) a; - StrPair *bp = (StrPair *) b; - - if (g_str_equal (ap->one, bp->one) && - g_str_equal (ap->two, bp->two)) - { - return TRUE; - } - else - { - return FALSE; - } -} - -/*END------------------------------------------------------------------------*/ diff --git a/droute/droute-pairhash.h b/droute/droute-pairhash.h deleted file mode 100644 index 1491c2d..0000000 --- a/droute/droute-pairhash.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ -#ifndef _DROUTE_PAIRHASH_H -#define _DROUTE_PAIRHASH_H - -#include <glib.h> - -typedef struct _StrPair StrPair; -struct _StrPair -{ - const gchar *one; - const gchar *two; -}; - -StrPair *str_pair_new (const gchar *one, - const gchar *two); - -guint str_pair_hash (gconstpointer key); -gboolean str_pair_equal (gconstpointer a, - gconstpointer b); - -#endif /* _DROUTE_PAIRHASH_H */ diff --git a/droute/droute-test.c b/droute/droute-test.c deleted file mode 100644 index 8b3fb7c..0000000 --- a/droute/droute-test.c +++ /dev/null @@ -1,243 +0,0 @@ -#include <stdio.h> -#include <glib.h> -#include <string.h> -#include <droute/droute.h> -#include <dbind/dbind.h> - -#include "dbus/dbus-glib-lowlevel.h" - -#define TEST_OBJECT_PATH "/test/object" -#define TEST_INTERFACE_ONE "test.interface.One" -#define TEST_INTERFACE_TWO "test.interface.Two" - -#define OBJECT_ONE "ObjectOne"; -#define OBJECT_TWO "ObjectTwo"; - -#if !defined TEST_INTROSPECTION_DIRECTORY - #error "No introspection XML directory defined" -#endif - -#define STRING_ONE "StringOne" -#define STRING_TWO "StringTwo" - -#define INT_ONE 0 -#define INT_TWO 456 - -#define NONE_REPLY_STRING "NoneMethod" - -typedef struct _AnObject -{ - gchar *astring; - guint *anint; -} AnObject; - -static DBusConnection *bus; -static GMainLoop *main_loop; -static gboolean success = TRUE; - -static DBusMessage * -impl_null (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - DBusMessage *reply; - - reply = dbus_message_new_method_return (message); - return reply; -} - -static DBusMessage * -impl_getInt (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - AnObject *object = (AnObject *) user_data; - DBusMessage *reply; - DBusError error; - - dbus_error_init (&error); - - reply = dbus_message_new_method_return (message); - dbus_message_append_args (reply, DBUS_TYPE_INT32, &(object->anint), DBUS_TYPE_INVALID); - return reply; -} - -static DBusMessage * -impl_setInt (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - AnObject *object = (AnObject *) user_data; - DBusMessage *reply; - DBusError error; - - dbus_error_init (&error); - - dbus_message_get_args (message, &error, DBUS_TYPE_INT32, &(object->anint), DBUS_TYPE_INVALID); - - reply = dbus_message_new_method_return (message); - return reply; -} - -static DBusMessage * -impl_getString (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - AnObject *object = (AnObject *) user_data; - DBusMessage *reply; - DBusError error; - - dbus_error_init (&error); - - reply = dbus_message_new_method_return (message); - dbus_message_append_args (reply, DBUS_TYPE_STRING, &(object->astring), DBUS_TYPE_INVALID); - return reply; -} - -static DBusMessage * -impl_setString (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - AnObject *object = (AnObject *) user_data; - DBusMessage *reply; - DBusError error; - - dbus_error_init (&error); - - g_free (object->astring); - dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &(object->astring), DBUS_TYPE_INVALID); - - reply = dbus_message_new_method_return (message); - return reply; -} - -static DBusMessage * -impl_getInterfaceOne (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - DBusMessage *reply; - DBusError error; - gchar *itf = TEST_INTERFACE_ONE; - - dbus_error_init (&error); - - reply = dbus_message_new_method_return (message); - dbus_message_append_args (reply, DBUS_TYPE_STRING, &itf, DBUS_TYPE_INVALID); - return reply; -} - -static DBusMessage * -impl_getInterfaceTwo (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - DBusMessage *reply; - DBusError error; - gchar *itf = TEST_INTERFACE_TWO; - - dbus_error_init (&error); - - reply = dbus_message_new_method_return (message); - dbus_message_append_args (reply, DBUS_TYPE_STRING, &itf, DBUS_TYPE_INVALID); - return reply; -} - -static DRouteMethod test_methods_one[] = { - {impl_null, "null"}, - {impl_getInt, "getInt"}, - {impl_setInt, "setInt"}, - {impl_getString, "getString"}, - {impl_setString, "setString"}, - {impl_getInterfaceOne, "getInterfaceOne"}, - {NULL, NULL} -}; - -static DRouteMethod test_methods_two[] = { - {impl_null, "null"}, - {impl_getInt, "getInt"}, - {impl_setInt, "setInt"}, - {impl_getString, "getString"}, - {impl_setString, "setString"}, - {impl_getInterfaceTwo, "getInterfaceTwo"}, - {NULL, NULL} -}; - -static DRouteProperty test_properties[] = { - {NULL, NULL, NULL} -}; - -gboolean -do_tests_func (gpointer data) -{ - DBusError error; - const gchar *bus_name; - - gchar *expected_string; - gchar *result_string; - - dbus_error_init (&error); - bus_name = dbus_bus_get_unique_name (bus); - - /* --------------------------------------------------------*/ - - dbind_method_call_reentrant (bus, - bus_name, - TEST_OBJECT_PATH, - TEST_INTERFACE_ONE, - "null", - NULL, - ""); - - /* --------------------------------------------------------*/ - - expected_string = TEST_INTERFACE_ONE; - result_string = NULL; - dbind_method_call_reentrant (bus, - bus_name, - TEST_OBJECT_PATH, - TEST_INTERFACE_ONE, - "getInterfaceOne", - NULL, - "=>s", - &result_string); - if (g_strcmp0(expected_string, result_string)) - { - g_print ("Failed: reply to getInterfaceOne not as expected\n"); - goto out; - } - - /* --------------------------------------------------------*/ - -out: - g_main_loop_quit (main_loop); - return FALSE; -} - - -int main (int argc, char **argv) -{ - DRouteContext *cnx; - DRoutePath *path; - AnObject *object; - DBusError error; - - /* Setup some server object */ - - object = g_new0(AnObject, 1); - object->astring = g_strdup (STRING_ONE); - object->anint = INT_ONE; - - dbus_error_init (&error); - main_loop = g_main_loop_new(NULL, FALSE); - bus = dbus_bus_get (DBUS_BUS_SESSION, &error); - dbus_connection_setup_with_g_main(bus, g_main_context_default()); - - cnx = droute_new (bus, TEST_INTROSPECTION_DIRECTORY); - path = droute_add_one (cnx, TEST_OBJECT_PATH, object); - - droute_path_add_interface (path, - TEST_INTERFACE_ONE, - test_methods_one, - test_properties); - - droute_path_add_interface (path, - TEST_INTERFACE_TWO, - test_methods_two, - test_properties); - - g_idle_add (do_tests_func, NULL); - g_main_run(main_loop); - if (success) - return 0; - else - return 1; -} diff --git a/droute/droute-variant.c b/droute/droute-variant.c deleted file mode 100644 index d4b5ca6..0000000 --- a/droute/droute-variant.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Novell, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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 <stdlib.h> -#include <string.h> - -#include "droute-variant.h" - -/*---------------------------------------------------------------------------*/ - -dbus_bool_t -droute_return_v_int32 (DBusMessageIter *iter, dbus_int32_t val) -{ - DBusMessageIter sub; - - if (!dbus_message_iter_open_container - (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_INT32_AS_STRING, &sub)) - { - return FALSE; - } - dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &val); - dbus_message_iter_close_container (iter, &sub); - return TRUE; -} - -dbus_bool_t -droute_return_v_double (DBusMessageIter *iter, double val) -{ - DBusMessageIter sub; - - if (!dbus_message_iter_open_container - (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_DOUBLE_AS_STRING, &sub)) - { - return FALSE; - } - dbus_message_iter_append_basic (&sub, DBUS_TYPE_DOUBLE, &val); - dbus_message_iter_close_container (iter, &sub); - return TRUE; -} - -dbus_bool_t -droute_return_v_string (DBusMessageIter *iter, const char *val) -{ - DBusMessageIter sub; - - if (!val) - val = ""; - if (!dbus_message_iter_open_container - (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_STRING_AS_STRING, &sub)) - { - return FALSE; - } - dbus_message_iter_append_basic (&sub, DBUS_TYPE_STRING, &val); - dbus_message_iter_close_container (iter, &sub); - return TRUE; -} - -dbus_bool_t -droute_return_v_object (DBusMessageIter *iter, const char *path) -{ - DBusMessageIter sub; - - if (!dbus_message_iter_open_container - (iter, DBUS_TYPE_VARIANT, DBUS_TYPE_OBJECT_PATH_AS_STRING, &sub)) - { - return FALSE; - } - dbus_message_iter_append_basic (&sub, DBUS_TYPE_OBJECT_PATH, &path); - dbus_message_iter_close_container (iter, &sub); - return TRUE; -} - -/*---------------------------------------------------------------------------*/ - -dbus_int32_t -droute_get_v_int32 (DBusMessageIter *iter) -{ - DBusMessageIter sub; - dbus_int32_t rv; - - // TODO- ensure we have the correct type - dbus_message_iter_recurse (iter, &sub); - dbus_message_iter_get_basic (&sub, &rv); - return rv; -} - -const char * -droute_get_v_string (DBusMessageIter *iter) -{ - DBusMessageIter sub; - char *rv; - - // TODO- ensure we have the correct type - dbus_message_iter_recurse (iter, &sub); - dbus_message_iter_get_basic (&sub, &rv); - return rv; -} - -/*END------------------------------------------------------------------------*/ diff --git a/droute/droute-variant.h b/droute/droute-variant.h deleted file mode 100644 index 47feb96..0000000 --- a/droute/droute-variant.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Novell, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ -#ifndef _DROUTE_VARIANT_H -#define _DROUTE_VARIANT_H - -#include <dbus/dbus.h> - -dbus_bool_t droute_return_v_int32 (DBusMessageIter *iter, dbus_int32_t val); -dbus_bool_t droute_return_v_double (DBusMessageIter *iter, double val); -dbus_bool_t droute_return_v_string (DBusMessageIter *iter, const char *val); -dbus_bool_t droute_return_v_object (DBusMessageIter *iter, const char *path); - -dbus_int32_t droute_get_v_int32 (DBusMessageIter *iter); -const char *droute_get_v_string (DBusMessageIter *iter); - -#endif /* _DROUTE_VARIANT_H */ diff --git a/droute/droute.c b/droute/droute.c deleted file mode 100644 index 212c280..0000000 --- a/droute/droute.c +++ /dev/null @@ -1,593 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Novell, Inc. - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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 <stdlib.h> -#include <string.h> - -#include "droute.h" -#include "droute-pairhash.h" - -#define CHUNKS_DEFAULT (512) - -#define oom() g_error ("D-Bus out of memory, this message will fail anyway") - -#if defined DROUTE_DEBUG - #define _DROUTE_DEBUG(format, args...) g_print (format , ## args) -#else - #define _DROUTE_DEBUG(format, args...) -#endif - -struct _DRouteContext -{ - DBusConnection *bus; - GPtrArray *registered_paths; - - gchar *introspect_dir; -}; - -struct _DRoutePath -{ - DRouteContext *cnx; - GStringChunk *chunks; - GPtrArray *interfaces; - GHashTable *methods; - GHashTable *properties; - - void *user_data; - DRouteGetDatumFunction get_datum; -}; - -/*---------------------------------------------------------------------------*/ - -typedef struct PropertyPair -{ - DRoutePropertyFunction get; - DRoutePropertyFunction set; -} PropertyPair; - -/*---------------------------------------------------------------------------*/ - -static DBusHandlerResult -handle_message (DBusConnection *bus, DBusMessage *message, void *user_data); - -/*---------------------------------------------------------------------------*/ - -static DRoutePath * -path_new (DRouteContext *cnx, - void *user_data, - DRouteGetDatumFunction get_datum) -{ - DRoutePath *new_path; - - new_path = g_new0 (DRoutePath, 1); - new_path->cnx = cnx; - new_path->chunks = g_string_chunk_new (CHUNKS_DEFAULT); - new_path->interfaces = g_ptr_array_new (); - - new_path->methods = g_hash_table_new_full ((GHashFunc)str_pair_hash, - str_pair_equal, - g_free, - NULL); - - new_path->properties = g_hash_table_new_full ((GHashFunc)str_pair_hash, - str_pair_equal, - g_free, - NULL); - - new_path->user_data = user_data; - new_path->get_datum = get_datum; - - return new_path; -} - -static void -path_free (DRoutePath *path, gpointer user_data) -{ - g_string_chunk_free (path->chunks); - g_ptr_array_free (path->interfaces, TRUE); - g_hash_table_destroy (path->methods); - g_hash_table_destroy (path->properties); -} - -static void * -path_get_datum (DRoutePath *path, const gchar *pathstr) -{ - if (path->get_datum != NULL) - return (path->get_datum) (pathstr, path->user_data); - else - return path->user_data; -} - -/*---------------------------------------------------------------------------*/ - -DRouteContext * -droute_new (DBusConnection *bus, const char *introspect_dir) -{ - DRouteContext *cnx; - - cnx = g_new0 (DRouteContext, 1); - cnx->bus = bus; - cnx->registered_paths = g_ptr_array_new (); - cnx->introspect_dir = g_strdup(introspect_dir); - - return cnx; -} - -void -droute_free (DRouteContext *cnx) -{ - g_ptr_array_foreach (cnx->registered_paths, (GFunc) path_free, NULL); - g_free (cnx->introspect_dir); - g_free (cnx); -} - -/*---------------------------------------------------------------------------*/ - -DBusConnection * -droute_get_bus (DRouteContext *cnx) -{ - return cnx->bus; -} - -/*---------------------------------------------------------------------------*/ - -static DBusObjectPathVTable droute_vtable = -{ - NULL, - &handle_message, - NULL, NULL, NULL, NULL -}; - -DRoutePath * -droute_add_one (DRouteContext *cnx, - const char *path, - const void *data) -{ - DRoutePath *new_path; - gboolean registered; - - new_path = path_new (cnx, (void *) data, NULL); - - registered = dbus_connection_register_object_path (cnx->bus, path, &droute_vtable, new_path); - if (!registered) - oom(); - - g_ptr_array_add (cnx->registered_paths, new_path); - return new_path; -} - -DRoutePath * -droute_add_many (DRouteContext *cnx, - const char *path, - const void *data, - const DRouteGetDatumFunction get_datum) -{ - DRoutePath *new_path; - - new_path = path_new (cnx, (void *) data, get_datum); - - if (!dbus_connection_register_fallback (cnx->bus, path, &droute_vtable, new_path)) - oom(); - - g_ptr_array_add (cnx->registered_paths, new_path); - return new_path; -} - -/*---------------------------------------------------------------------------*/ - -void -droute_path_add_interface(DRoutePath *path, - const char *name, - const DRouteMethod *methods, - const DRouteProperty *properties) -{ - gchar *itf; - - g_return_if_fail (name != NULL); - - itf = g_string_chunk_insert (path->chunks, name); - g_ptr_array_add (path->interfaces, itf); - - for (; methods != NULL && methods->name != NULL; methods++) - { - gchar *meth; - - meth = g_string_chunk_insert (path->chunks, methods->name); - g_hash_table_insert (path->methods, str_pair_new (itf, meth), methods->func); - } - - for (; properties != NULL && properties->name != NULL; properties++) - { - gchar *prop; - PropertyPair *pair; - - prop = g_string_chunk_insert (path->chunks, properties->name); - pair = g_new (PropertyPair, 1); - pair->get = properties->get; - pair->set = properties->set; - g_hash_table_insert (path->properties, str_pair_new (itf, prop), pair); - } -} - -/*---------------------------------------------------------------------------*/ - -/* The data structures don't support an efficient implementation of GetAll - * and I don't really care. - */ -static DBusMessage * -impl_prop_GetAll (DBusMessage *message, - DRoutePath *path, - const char *pathstr) -{ - DBusMessageIter iter, iter_dict, iter_dict_entry; - DBusMessage *reply; - DBusError error; - GHashTableIter prop_iter; - - StrPair *key; - PropertyPair *value; - gchar *iface; - - void *datum = path_get_datum (path, pathstr); - - dbus_error_init (&error); - if (!dbus_message_get_args - (message, &error, DBUS_TYPE_STRING, &iface, DBUS_TYPE_INVALID)) - return dbus_message_new_error (message, DBUS_ERROR_FAILED, error.message); - - reply = dbus_message_new_method_return (message); - if (!reply) - oom (); - - dbus_message_iter_init_append (reply, &iter); - if (!dbus_message_iter_open_container - (&iter, DBUS_TYPE_ARRAY, "{sv}", &iter_dict)) - oom (); - - g_hash_table_iter_init (&prop_iter, path->properties); - while (g_hash_table_iter_next (&prop_iter, (gpointer*)&key, (gpointer*)&value)) - { - if (!g_strcmp0 (key->one, iface)) - { - if (!value->get) - continue; - if (!dbus_message_iter_open_container - (&iter_dict, DBUS_TYPE_DICT_ENTRY, NULL, &iter_dict_entry)) - oom (); - dbus_message_iter_append_basic (&iter_dict_entry, DBUS_TYPE_STRING, - key->two); - (value->get) (&iter_dict_entry, datum); - if (!dbus_message_iter_close_container (&iter_dict, &iter_dict_entry)) - oom (); - } - } - - if (!dbus_message_iter_close_container (&iter, &iter_dict)) - oom (); - return reply; -} - -static DBusMessage * -impl_prop_GetSet (DBusMessage *message, - DRoutePath *path, - const char *pathstr, - gboolean get) -{ - DBusMessage *reply = NULL; - DBusError error; - - StrPair pair; - PropertyPair *prop_funcs = NULL; - - - dbus_error_init (&error); - if (!dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, - &(pair.one), - DBUS_TYPE_STRING, - &(pair.two), - DBUS_TYPE_INVALID)) - return dbus_message_new_error (message, DBUS_ERROR_FAILED, error.message); - - prop_funcs = (PropertyPair *) g_hash_table_lookup (path->properties, &pair); - if (!prop_funcs) - return dbus_message_new_error (message, DBUS_ERROR_FAILED, "Property unavailable"); - - if (get && prop_funcs->get) - { - void *datum = path_get_datum (path, pathstr); - DBusMessageIter iter; - - _DROUTE_DEBUG ("DRoute (handle prop Get): %s|%s on %s\n", pair.one, pair.two, pathstr); - - reply = dbus_message_new_method_return (message); - dbus_message_iter_init_append (reply, &iter); - if (!(prop_funcs->get) (&iter, datum)) - { - dbus_message_unref (reply); - reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Get failed"); - } - } - else if (!get && prop_funcs->set) - { - void *datum = path_get_datum (path, pathstr); - DBusMessageIter iter; - - _DROUTE_DEBUG ("DRoute (handle prop Get): %s|%s on %s\n", pair.one, pair.two, pathstr); - - dbus_message_iter_init (message, &iter); - /* Skip the interface and property name */ - dbus_message_iter_next(&iter); - dbus_message_iter_next(&iter); - (prop_funcs->set) (&iter, datum); - - reply = dbus_message_new_method_return (message); - } - else - { - reply = dbus_message_new_error (message, DBUS_ERROR_FAILED, "Getter or setter unavailable"); - } - - return reply; -} - -static DBusHandlerResult -handle_properties (DBusConnection *bus, - DBusMessage *message, - DRoutePath *path, - const gchar *iface, - const gchar *member, - const gchar *pathstr) -{ - DBusMessage *reply; - DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED; - - if (!g_strcmp0(member, "GetAll")) - reply = impl_prop_GetAll (message, path, pathstr); - else if (!g_strcmp0 (member, "Get")) - reply = impl_prop_GetSet (message, path, pathstr, TRUE); - else if (!g_strcmp0 (member, "Set")) - reply = impl_prop_GetSet (message, path, pathstr, FALSE); - else - result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - if (reply) - { - dbus_connection_send (bus, reply, NULL); - dbus_message_unref (reply); - } - - return result; -} - -/*---------------------------------------------------------------------------*/ - -static const char *introspection_header = -"<?xml version=\"1.0\"?>\n"; - -static const char *introspection_node_element = -"<node name=\"%s\">\n"; - -static const char *introspection_footer = -"</node>"; - -static void -append_interface (GString *str, - const gchar *interface, - const gchar *directory) -{ - gchar *filename; - gchar *contents; - gsize len; - - GError *err = NULL; - - filename = g_build_filename (directory, interface, NULL); - - if (g_file_get_contents (filename, &contents, &len, &err)) - { - g_string_append_len (str, contents, len); - } - else - { - g_warning ("AT-SPI: Cannot find introspection XML file %s - %s", - filename, err->message); - g_error_free (err); - } - - g_string_append (str, "\n"); - g_free (filename); - g_free (contents); -} - -static DBusHandlerResult -handle_introspection (DBusConnection *bus, - DBusMessage *message, - DRoutePath *path, - const gchar *iface, - const gchar *member, - const gchar *pathstr) -{ - GString *output; - gchar *final; - gint i; - - DBusMessage *reply; - - _DROUTE_DEBUG ("DRoute (handle introspection): %s\n", pathstr); - - if (g_strcmp0 (member, "Introspect")) - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - output = g_string_new(introspection_header); - - g_string_append_printf(output, introspection_node_element, pathstr); - - for (i=0; i < path->interfaces->len; i++) - { - gchar *interface = (gchar *) g_ptr_array_index (path->interfaces, i); - append_interface(output, interface, path->cnx->introspect_dir); - } - - g_string_append(output, introspection_footer); - final = g_string_free(output, FALSE); - - reply = dbus_message_new_method_return (message); - if (!reply) - oom (); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &final, - DBUS_TYPE_INVALID); - dbus_connection_send (bus, reply, NULL); - - dbus_message_unref (reply); - g_free(final); - return DBUS_HANDLER_RESULT_HANDLED; -} - -/*---------------------------------------------------------------------------*/ - -static DBusHandlerResult -handle_other (DBusConnection *bus, - DBusMessage *message, - DRoutePath *path, - const gchar *iface, - const gchar *member, - const gchar *pathstr) -{ - gint result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - StrPair pair; - DRouteFunction func; - DBusMessage *reply = NULL; - - pair.one = iface; - pair.two = member; - - _DROUTE_DEBUG ("DRoute (handle other): %s|%s on %s\n", member, iface, pathstr); - - func = (DRouteFunction) g_hash_table_lookup (path->methods, &pair); - if (func != NULL) - { - void *datum = path_get_datum (path, pathstr); - - reply = (func) (bus, message, datum); - - if (!reply) - { - /* All D-Bus method calls must have a reply. - * If one is not provided presume that the call has a void - * return and no error has occured. - */ - reply = dbus_message_new_method_return (message); - } - dbus_connection_send (bus, reply, NULL); - dbus_message_unref (reply); - result = DBUS_HANDLER_RESULT_HANDLED; - } - return result; -} - -/*---------------------------------------------------------------------------*/ - -static DBusHandlerResult -handle_message (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - DRoutePath *path = (DRoutePath *) user_data; - const gchar *iface = dbus_message_get_interface (message); - const gchar *member = dbus_message_get_member (message); - const gint type = dbus_message_get_type (message); - const gchar *pathstr = dbus_message_get_path (message); - - /* Check for basic reasons not to handle */ - if (type != DBUS_MESSAGE_TYPE_METHOD_CALL || - member == NULL || - iface == NULL) - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - - if (!strcmp (iface, "org.freedesktop.DBus.Properties")) - return handle_properties (bus, message, path, iface, member, pathstr); - - if (!strcmp (iface, "org.freedesktop.DBus.Introspectable")) - return handle_introspection (bus, message, path, iface, member, pathstr); - - return handle_other (bus, message, path, iface, member, pathstr); -} - -/*---------------------------------------------------------------------------*/ - -DBusMessage * -droute_not_yet_handled_error (DBusMessage *message) -{ - DBusMessage *reply; - gchar *errmsg; - - errmsg= g_strdup_printf ( - "Method \"%s\" with signature \"%s\" on interface \"%s\" doesn't exist\n", - dbus_message_get_member (message), - dbus_message_get_signature (message), - dbus_message_get_interface (message)); - reply = dbus_message_new_error (message, - DBUS_ERROR_UNKNOWN_METHOD, - errmsg); - g_free (errmsg); - return reply; -} - -DBusMessage * -droute_out_of_memory_error (DBusMessage *message) -{ - DBusMessage *reply; - gchar *errmsg; - - errmsg= g_strdup_printf ( - "Method \"%s\" with signature \"%s\" on interface \"%s\" could not be processed due to lack of memory\n", - dbus_message_get_member (message), - dbus_message_get_signature (message), - dbus_message_get_interface (message)); - reply = dbus_message_new_error (message, - DBUS_ERROR_NO_MEMORY, - errmsg); - g_free (errmsg); - return reply; -} - -DBusMessage * -droute_invalid_arguments_error (DBusMessage *message) -{ - DBusMessage *reply; - gchar *errmsg; - - errmsg= g_strdup_printf ( - "Method \"%s\" with signature \"%s\" on interface \"%s\" was supplied with invalid arguments\n", - dbus_message_get_member (message), - dbus_message_get_signature (message), - dbus_message_get_interface (message)); - reply = dbus_message_new_error (message, - DBUS_ERROR_INVALID_ARGS, - errmsg); - g_free (errmsg); - return reply; -} - -/*END------------------------------------------------------------------------*/ diff --git a/droute/droute.h b/droute/droute.h deleted file mode 100644 index a892c62..0000000 --- a/droute/droute.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Novell, Inc. - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ -#ifndef _DROUTE_H -#define _DROUTE_H - -#include <dbus/dbus.h> -#include <glib.h> - -#include <droute/droute-variant.h> - - -typedef DBusMessage *(*DRouteFunction) (DBusConnection *, DBusMessage *, void *); -typedef dbus_bool_t (*DRoutePropertyFunction) (DBusMessageIter *, void *); - -typedef void *(*DRouteGetDatumFunction) (const char *, void *); - -typedef struct _DRouteMethod DRouteMethod; -struct _DRouteMethod -{ - DRouteFunction func; - const char *name; -}; - -typedef struct _DRouteProperty DRouteProperty; -struct _DRouteProperty -{ - DRoutePropertyFunction get; - DRoutePropertyFunction set; - const char *name; -}; - -/*---------------------------------------------------------------------------*/ - -typedef struct _DRouteContext DRouteContext; - -typedef struct _DRoutePath DRoutePath; - -/*---------------------------------------------------------------------------*/ - -DRouteContext * -droute_new (DBusConnection *bus, - const char *introspect_dir); -void -droute_free (DRouteContext *cnx); - -DRoutePath * -droute_add_one (DRouteContext *cnx, - const char *path, - const void *data); - -DRoutePath * -droute_add_many (DRouteContext *cnx, - const char *path, - const void *data, - const DRouteGetDatumFunction get_datum); - -void -droute_path_add_interface (DRoutePath *path, - const char *name, - const DRouteMethod *methods, - const DRouteProperty *properties); - -DBusMessage * -droute_not_yet_handled_error (DBusMessage *message); - -DBusMessage * -droute_invalid_arguments_error (DBusMessage *message); - -DBusMessage * -droute_out_of_memory_error (DBusMessage *message); - -DBusConnection * -droute_get_bus (DRouteContext *cnx); - -#endif /* _DROUTE_H */ diff --git a/droute/test.interface.One b/droute/test.interface.One deleted file mode 100644 index a8e2206..0000000 --- a/droute/test.interface.One +++ /dev/null @@ -1,15 +0,0 @@ -<interface name="test.interface.One"> - <method name="null"/> - <method name="getInt"> - <arg direction="out" type="o"/> - </method> - <method name="setInt"> - <arg direction="in" type="o"/> - </method> - <method name="getString"> - <arg direction="out" type="s"/> - </method> - <method name="setString"> - <arg direction="in" type="s"/> - </method> -</interface> diff --git a/droute/test.interface.Two b/droute/test.interface.Two deleted file mode 100644 index ca661ec..0000000 --- a/droute/test.interface.Two +++ /dev/null @@ -1,15 +0,0 @@ -<interface name="test.interface.Two"> - <method name="null"/> - <method name="getInt"> - <arg direction="out" type="o"/> - </method> - <method name="setInt"> - <arg direction="in" type="o"/> - </method> - <method name="getString"> - <arg direction="out" type="s"/> - </method> - <method name="setString"> - <arg direction="in" type="s"/> - </method> -</interface> |