[telepathy-mission-control/master] McdClientProxy: move .client file parsing from McdDispatcher
Simon McVittie
simon.mcvittie at collabora.co.uk
Tue Sep 22 06:55:09 PDT 2009
parse_client_file, parse_client_filter were moved verbatim.
---
src/mcd-client-priv.h | 2 +
src/mcd-client.c | 242 +++++++++++++++++++++++++++++++++++++++++++++++++
src/mcd-dispatcher.c | 231 +----------------------------------------------
3 files changed, 246 insertions(+), 229 deletions(-)
diff --git a/src/mcd-client-priv.h b/src/mcd-client-priv.h
index ce03ad0..8651a9b 100644
--- a/src/mcd-client-priv.h
+++ b/src/mcd-client-priv.h
@@ -93,6 +93,8 @@ G_GNUC_INTERNAL void _mcd_client_proxy_add_interfaces (McdClientProxy *self,
G_GNUC_INTERNAL gchar *_mcd_client_proxy_find_client_file (
const gchar *client_name);
+G_GNUC_INTERNAL gboolean _mcd_client_proxy_parse_client_file (
+ McdClientProxy *self);
G_GNUC_INTERNAL const GList *_mcd_client_proxy_get_approver_filters
(McdClientProxy *self);
diff --git a/src/mcd-client.c b/src/mcd-client.c
index 5199fc7..5cabc9f 100644
--- a/src/mcd-client.c
+++ b/src/mcd-client.c
@@ -26,10 +26,14 @@
#include "config.h"
#include "mcd-client-priv.h"
+#include <errno.h>
+
#include <telepathy-glib/dbus.h>
#include <telepathy-glib/defs.h>
#include <telepathy-glib/errors.h>
+#include <telepathy-glib/interfaces.h>
#include <telepathy-glib/proxy-subclass.h>
+#include <telepathy-glib/util.h>
#include "mcd-debug.h"
@@ -137,6 +141,209 @@ finish:
return absolute_filepath;
}
+static GHashTable *
+parse_client_filter (GKeyFile *file, const gchar *group)
+{
+ GHashTable *filter;
+ gchar **keys;
+ gsize len = 0;
+ guint i;
+
+ filter = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify) tp_g_value_slice_free);
+
+ keys = g_key_file_get_keys (file, group, &len, NULL);
+ for (i = 0; i < len; i++)
+ {
+ const gchar *key;
+ const gchar *space;
+ gchar *file_property;
+ gchar file_property_type;
+
+ key = keys[i];
+ space = g_strrstr (key, " ");
+
+ if (space == NULL || space[1] == '\0' || space[2] != '\0')
+ {
+ g_warning ("Invalid key %s in client file", key);
+ continue;
+ }
+ file_property_type = space[1];
+ file_property = g_strndup (key, space - key);
+
+ switch (file_property_type)
+ {
+ case 'q':
+ case 'u':
+ case 't': /* unsigned integer */
+ {
+ /* g_key_file_get_integer cannot be used because we need
+ * to support 64 bits */
+ guint x;
+ GValue *value = tp_g_value_slice_new (G_TYPE_UINT64);
+ gchar *str = g_key_file_get_string (file, group, key,
+ NULL);
+ errno = 0;
+ x = g_ascii_strtoull (str, NULL, 0);
+ if (errno != 0)
+ {
+ g_warning ("Invalid unsigned integer '%s' in client"
+ " file", str);
+ }
+ else
+ {
+ g_value_set_uint64 (value, x);
+ g_hash_table_insert (filter, file_property, value);
+ }
+ g_free (str);
+ break;
+ }
+
+ case 'y':
+ case 'n':
+ case 'i':
+ case 'x': /* signed integer */
+ {
+ gint x;
+ GValue *value = tp_g_value_slice_new (G_TYPE_INT64);
+ gchar *str = g_key_file_get_string (file, group, key, NULL);
+ errno = 0;
+ x = g_ascii_strtoll (str, NULL, 0);
+ if (errno != 0)
+ {
+ g_warning ("Invalid signed integer '%s' in client"
+ " file", str);
+ }
+ else
+ {
+ g_value_set_int64 (value, x);
+ g_hash_table_insert (filter, file_property, value);
+ }
+ g_free (str);
+ break;
+ }
+
+ case 'b':
+ {
+ GValue *value = tp_g_value_slice_new (G_TYPE_BOOLEAN);
+ gboolean b = g_key_file_get_boolean (file, group, key, NULL);
+ g_value_set_boolean (value, b);
+ g_hash_table_insert (filter, file_property, value);
+ break;
+ }
+
+ case 's':
+ {
+ GValue *value = tp_g_value_slice_new (G_TYPE_STRING);
+ gchar *str = g_key_file_get_string (file, group, key, NULL);
+
+ g_value_take_string (value, str);
+ g_hash_table_insert (filter, file_property, value);
+ break;
+ }
+
+ case 'o':
+ {
+ GValue *value = tp_g_value_slice_new
+ (DBUS_TYPE_G_OBJECT_PATH);
+ gchar *str = g_key_file_get_string (file, group, key, NULL);
+
+ g_value_take_boxed (value, str);
+ g_hash_table_insert (filter, file_property, value);
+ break;
+ }
+
+ default:
+ g_warning ("Invalid key %s in client file", key);
+ continue;
+ }
+ }
+ g_strfreev (keys);
+
+ return filter;
+}
+
+static void
+parse_client_file (McdClientProxy *client,
+ GKeyFile *file)
+{
+ gchar **iface_names, **groups, **cap_tokens;
+ guint i;
+ gsize len = 0;
+ gboolean is_approver, is_handler, is_observer;
+ GList *approver_filters = NULL;
+ GList *observer_filters = NULL;
+ GList *handler_filters = NULL;
+ gboolean bypass;
+
+ iface_names = g_key_file_get_string_list (file, TP_IFACE_CLIENT,
+ "Interfaces", 0, NULL);
+ if (!iface_names)
+ return;
+
+ _mcd_client_proxy_add_interfaces (client,
+ (const gchar * const *) iface_names);
+ g_strfreev (iface_names);
+
+ is_approver = tp_proxy_has_interface_by_id (client,
+ TP_IFACE_QUARK_CLIENT_APPROVER);
+ is_observer = tp_proxy_has_interface_by_id (client,
+ TP_IFACE_QUARK_CLIENT_OBSERVER);
+ is_handler = tp_proxy_has_interface_by_id (client,
+ TP_IFACE_QUARK_CLIENT_HANDLER);
+
+ /* parse filtering rules */
+ groups = g_key_file_get_groups (file, &len);
+ for (i = 0; i < len; i++)
+ {
+ if (is_approver &&
+ g_str_has_prefix (groups[i], TP_IFACE_CLIENT_APPROVER
+ ".ApproverChannelFilter "))
+ {
+ approver_filters =
+ g_list_prepend (approver_filters,
+ parse_client_filter (file, groups[i]));
+ }
+ else if (is_handler &&
+ g_str_has_prefix (groups[i], TP_IFACE_CLIENT_HANDLER
+ ".HandlerChannelFilter "))
+ {
+ handler_filters =
+ g_list_prepend (handler_filters,
+ parse_client_filter (file, groups[i]));
+ }
+ else if (is_observer &&
+ g_str_has_prefix (groups[i], TP_IFACE_CLIENT_OBSERVER
+ ".ObserverChannelFilter "))
+ {
+ observer_filters =
+ g_list_prepend (observer_filters,
+ parse_client_filter (file, groups[i]));
+ }
+ }
+ g_strfreev (groups);
+
+ _mcd_client_proxy_take_approver_filters (client,
+ approver_filters);
+ _mcd_client_proxy_take_observer_filters (client,
+ observer_filters);
+ _mcd_client_proxy_take_handler_filters (client,
+ handler_filters);
+
+ /* Other client options */
+ bypass = g_key_file_get_boolean (file, TP_IFACE_CLIENT_HANDLER,
+ "BypassApproval", NULL);
+ _mcd_client_proxy_set_bypass_approval (client, bypass);
+
+ cap_tokens = g_key_file_get_keys (file,
+ TP_IFACE_CLIENT_HANDLER ".Capabilities",
+ NULL,
+ NULL);
+ _mcd_client_proxy_add_cap_tokens (client,
+ (const gchar * const *) cap_tokens);
+ g_strfreev (cap_tokens);
+}
+
/* This is NULL-safe for the last argument, for ease of use with
* tp_asv_get_boxed */
void
@@ -235,6 +442,41 @@ mcd_client_proxy_emit_ready (McdClientProxy *self)
g_signal_emit (self, signals[S_READY], 0);
}
+gboolean
+_mcd_client_proxy_parse_client_file (McdClientProxy *self)
+{
+ gboolean file_found = FALSE;
+ gchar *filename;
+ const gchar *bus_name = tp_proxy_get_bus_name (self);
+
+ filename = _mcd_client_proxy_find_client_file (
+ bus_name + MC_CLIENT_BUS_NAME_BASE_LEN);
+
+ if (filename)
+ {
+ GKeyFile *file;
+ GError *error = NULL;
+
+ file = g_key_file_new ();
+ g_key_file_load_from_file (file, filename, 0, &error);
+ if (G_LIKELY (!error))
+ {
+ DEBUG ("File found for %s: %s", bus_name, filename);
+ parse_client_file (self, file);
+ file_found = TRUE;
+ }
+ else
+ {
+ g_warning ("Loading file %s failed: %s", filename, error->message);
+ g_error_free (error);
+ }
+ g_key_file_free (file);
+ g_free (filename);
+ }
+
+ return file_found;
+}
+
static gboolean
mcd_client_proxy_introspect (gpointer data)
{
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index a3f44b8..4ae2ebd 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -36,7 +36,6 @@
*/
#include <dlfcn.h>
-#include <errno.h>
#include <glib.h>
#include <glib/gprintf.h>
#include <glib/gi18n.h>
@@ -1745,128 +1744,6 @@ _mcd_dispatcher_dispose (GObject * object)
G_OBJECT_CLASS (mcd_dispatcher_parent_class)->dispose (object);
}
-static GHashTable *
-parse_client_filter (GKeyFile *file, const gchar *group)
-{
- GHashTable *filter;
- gchar **keys;
- gsize len = 0;
- guint i;
-
- filter = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
- (GDestroyNotify) tp_g_value_slice_free);
-
- keys = g_key_file_get_keys (file, group, &len, NULL);
- for (i = 0; i < len; i++)
- {
- const gchar *key;
- const gchar *space;
- gchar *file_property;
- gchar file_property_type;
-
- key = keys[i];
- space = g_strrstr (key, " ");
-
- if (space == NULL || space[1] == '\0' || space[2] != '\0')
- {
- g_warning ("Invalid key %s in client file", key);
- continue;
- }
- file_property_type = space[1];
- file_property = g_strndup (key, space - key);
-
- switch (file_property_type)
- {
- case 'q':
- case 'u':
- case 't': /* unsigned integer */
- {
- /* g_key_file_get_integer cannot be used because we need
- * to support 64 bits */
- guint x;
- GValue *value = tp_g_value_slice_new (G_TYPE_UINT64);
- gchar *str = g_key_file_get_string (file, group, key,
- NULL);
- errno = 0;
- x = g_ascii_strtoull (str, NULL, 0);
- if (errno != 0)
- {
- g_warning ("Invalid unsigned integer '%s' in client"
- " file", str);
- }
- else
- {
- g_value_set_uint64 (value, x);
- g_hash_table_insert (filter, file_property, value);
- }
- g_free (str);
- break;
- }
-
- case 'y':
- case 'n':
- case 'i':
- case 'x': /* signed integer */
- {
- gint x;
- GValue *value = tp_g_value_slice_new (G_TYPE_INT64);
- gchar *str = g_key_file_get_string (file, group, key, NULL);
- errno = 0;
- x = g_ascii_strtoll (str, NULL, 0);
- if (errno != 0)
- {
- g_warning ("Invalid signed integer '%s' in client"
- " file", str);
- }
- else
- {
- g_value_set_int64 (value, x);
- g_hash_table_insert (filter, file_property, value);
- }
- g_free (str);
- break;
- }
-
- case 'b':
- {
- GValue *value = tp_g_value_slice_new (G_TYPE_BOOLEAN);
- gboolean b = g_key_file_get_boolean (file, group, key, NULL);
- g_value_set_boolean (value, b);
- g_hash_table_insert (filter, file_property, value);
- break;
- }
-
- case 's':
- {
- GValue *value = tp_g_value_slice_new (G_TYPE_STRING);
- gchar *str = g_key_file_get_string (file, group, key, NULL);
-
- g_value_take_string (value, str);
- g_hash_table_insert (filter, file_property, value);
- break;
- }
-
- case 'o':
- {
- GValue *value = tp_g_value_slice_new
- (DBUS_TYPE_G_OBJECT_PATH);
- gchar *str = g_key_file_get_string (file, group, key, NULL);
-
- g_value_take_boxed (value, str);
- g_hash_table_insert (filter, file_property, value);
- break;
- }
-
- default:
- g_warning ("Invalid key %s in client file", key);
- continue;
- }
- }
- g_strfreev (keys);
-
- return filter;
-}
-
static void
mcd_client_set_filters (McdClientProxy *client,
McdClientInterface interface,
@@ -2337,94 +2214,12 @@ finally:
mcd_dispatcher_release_startup_lock (self);
}
-static void
-parse_client_file (McdClientProxy *client,
- GKeyFile *file)
-{
- gchar **iface_names, **groups, **cap_tokens;
- guint i;
- gsize len = 0;
- gboolean is_approver, is_handler, is_observer;
- GList *approver_filters = NULL;
- GList *observer_filters = NULL;
- GList *handler_filters = NULL;
- gboolean bypass;
-
- iface_names = g_key_file_get_string_list (file, TP_IFACE_CLIENT,
- "Interfaces", 0, NULL);
- if (!iface_names)
- return;
-
- _mcd_client_proxy_add_interfaces (client,
- (const gchar * const *) iface_names);
- g_strfreev (iface_names);
-
- is_approver = tp_proxy_has_interface_by_id (client,
- TP_IFACE_QUARK_CLIENT_APPROVER);
- is_observer = tp_proxy_has_interface_by_id (client,
- TP_IFACE_QUARK_CLIENT_OBSERVER);
- is_handler = tp_proxy_has_interface_by_id (client,
- TP_IFACE_QUARK_CLIENT_HANDLER);
-
- /* parse filtering rules */
- groups = g_key_file_get_groups (file, &len);
- for (i = 0; i < len; i++)
- {
- if (is_approver &&
- g_str_has_prefix (groups[i], TP_IFACE_CLIENT_APPROVER
- ".ApproverChannelFilter "))
- {
- approver_filters =
- g_list_prepend (approver_filters,
- parse_client_filter (file, groups[i]));
- }
- else if (is_handler &&
- g_str_has_prefix (groups[i], TP_IFACE_CLIENT_HANDLER
- ".HandlerChannelFilter "))
- {
- handler_filters =
- g_list_prepend (handler_filters,
- parse_client_filter (file, groups[i]));
- }
- else if (is_observer &&
- g_str_has_prefix (groups[i], TP_IFACE_CLIENT_OBSERVER
- ".ObserverChannelFilter "))
- {
- observer_filters =
- g_list_prepend (observer_filters,
- parse_client_filter (file, groups[i]));
- }
- }
- g_strfreev (groups);
-
- _mcd_client_proxy_take_approver_filters (client,
- approver_filters);
- _mcd_client_proxy_take_observer_filters (client,
- observer_filters);
- _mcd_client_proxy_take_handler_filters (client,
- handler_filters);
-
- /* Other client options */
- bypass = g_key_file_get_boolean (file, TP_IFACE_CLIENT_HANDLER,
- "BypassApproval", NULL);
- _mcd_client_proxy_set_bypass_approval (client, bypass);
-
- cap_tokens = g_key_file_get_keys (file,
- TP_IFACE_CLIENT_HANDLER ".Capabilities",
- NULL,
- NULL);
- _mcd_client_proxy_add_cap_tokens (client,
- (const gchar * const *) cap_tokens);
- g_strfreev (cap_tokens);
-}
-
/* FIXME: eventually this whole chain should move into McdClientProxy */
static void
mcd_client_start_introspection (McdClientProxy *proxy,
McdDispatcher *dispatcher)
{
- gchar *filename;
- gboolean file_found = FALSE;
+ gboolean file_found;
McdClientProxy *client;
const gchar *bus_name = tp_proxy_get_bus_name (proxy);
@@ -2440,29 +2235,7 @@ mcd_client_start_introspection (McdClientProxy *proxy,
* exists, it is better to read it than activating the service to read the
* D-Bus properties.
*/
- filename = _mcd_client_proxy_find_client_file (
- bus_name + MC_CLIENT_BUS_NAME_BASE_LEN);
- if (filename)
- {
- GKeyFile *file;
- GError *error = NULL;
-
- file = g_key_file_new ();
- g_key_file_load_from_file (file, filename, 0, &error);
- if (G_LIKELY (!error))
- {
- DEBUG ("File found for %s: %s", bus_name, filename);
- parse_client_file (client, file);
- file_found = TRUE;
- }
- else
- {
- g_warning ("Loading file %s failed: %s", filename, error->message);
- g_error_free (error);
- }
- g_key_file_free (file);
- g_free (filename);
- }
+ file_found = _mcd_client_proxy_parse_client_file (client);
if (!file_found)
{
--
1.5.6.5
More information about the telepathy-commits
mailing list