[Galago-commits] r2689 - in trunk/libgalago: . libgalago
galago-commits at freedesktop.org
galago-commits at freedesktop.org
Sun Apr 9 23:06:58 PDT 2006
Author: chipx86
Date: 2006-04-09 23:06:54 -0700 (Sun, 09 Apr 2006)
New Revision: 2689
Modified:
trunk/libgalago/ChangeLog
trunk/libgalago/libgalago/galago-object.c
Log:
Add support for listing attributes remotely.
Modified: trunk/libgalago/ChangeLog
===================================================================
--- trunk/libgalago/ChangeLog 2006-04-10 04:25:49 UTC (rev 2688)
+++ trunk/libgalago/ChangeLog 2006-04-10 06:06:54 UTC (rev 2689)
@@ -1,3 +1,8 @@
+Sun Apr 09 23:03:40 PDT 2006 Christian Hammond <chipx86 at chipx86.com>
+
+ * libgalago/galago-object.c:
+ - Add support for listing attributes remotely.
+
Sun Apr 09 21:24:53 PDT 2006 Christian Hammond <chipx86 at chipx86.com>
* libgalago/galago-object.c:
Modified: trunk/libgalago/libgalago/galago-object.c
===================================================================
--- trunk/libgalago/libgalago/galago-object.c 2006-04-10 04:25:49 UTC (rev 2688)
+++ trunk/libgalago/libgalago/galago-object.c 2006-04-10 06:06:54 UTC (rev 2689)
@@ -74,6 +74,7 @@
GValue *value);
static GValue *_galago_dbus_object_get_attribute(const GalagoObject *object,
const char *name);
+static GList *_galago_dbus_object_get_attributes(const GalagoObject *object);
static GObjectClass *parent_class = NULL;
static guint signals[LAST_SIGNAL] = {0};
@@ -670,8 +671,14 @@
static GList *
galago_object_real_get_attributes(const GalagoObject *object)
{
- if (object->priv->attrs_list == NULL && object->priv->attrs_table != NULL)
+ if (GALAGO_OBJECT_IS_REMOTE(object) && !galago_is_daemon())
{
+ reset_attrs_list((GalagoObject *)object);
+ object->priv->attrs_list = _galago_dbus_object_get_attributes(object);
+ }
+ else if (object->priv->attrs_list == NULL &&
+ object->priv->attrs_table != NULL)
+ {
g_hash_table_foreach(object->priv->attrs_table,
(GHFunc)get_attributes_foreach,
(gpointer)object);
@@ -759,45 +766,13 @@
}
static GValue *
-_galago_dbus_object_get_attribute(const GalagoObject *object,
- const char *name)
+_galago_dbus_object_get_attr_value(DBusMessageIter *iter)
{
- DBusConnection *dbus_conn;
- DBusMessage *message, *reply;
- DBusMessageIter iter, value_iter;
- DBusError error;
- GValue *value = NULL;
+ DBusMessageIter value_iter;
+ GValue *value;
- if (!galago_is_connected())
- return NULL;
+ dbus_message_iter_recurse(iter, &value_iter);
- dbus_conn = galago_get_dbus_conn();
-
- message = galago_dbus_message_new_method_call(GALAGO_OBJECT(object),
- "GetAttribute", TRUE, &iter);
- g_return_val_if_fail(message != NULL, NULL);
-
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
-
- dbus_error_init(&error);
- reply = dbus_connection_send_with_reply_and_block(dbus_conn, message,
- -1, &error);
- dbus_message_unref(message);
-
- if (dbus_error_is_set(&error))
- {
- if (!dbus_error_has_name(&error, GALAGO_DBUS_ERROR_INVALID_ATTRIBUTE))
- {
- g_warning("Error sending Object.GetAttribute(%s, %s): %s",
- galago_object_get_dbus_path(object), name, error.message);
- }
-
- goto exit;
- }
-
- dbus_message_iter_init(reply, &iter);
- dbus_message_iter_recurse(&iter, &value_iter);
-
value = g_new0(GValue, 1);
int type = dbus_message_iter_get_arg_type(&value_iter);
@@ -840,11 +815,54 @@
}
default:
- g_warning("Unknown attribute type %d for attribute %s",
- type, name);
+ g_value_unset(value);
+ value = NULL;
break;
}
+ return value;
+}
+
+static GValue *
+_galago_dbus_object_get_attribute(const GalagoObject *object,
+ const char *name)
+{
+ DBusConnection *dbus_conn;
+ DBusMessage *message, *reply;
+ DBusMessageIter iter;
+ DBusError error;
+ GValue *value = NULL;
+
+ if (!galago_is_connected())
+ return NULL;
+
+ dbus_conn = galago_get_dbus_conn();
+
+ message = galago_dbus_message_new_method_call(GALAGO_OBJECT(object),
+ "GetAttribute", TRUE, &iter);
+ g_return_val_if_fail(message != NULL, NULL);
+
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
+
+ dbus_error_init(&error);
+ reply = dbus_connection_send_with_reply_and_block(dbus_conn, message,
+ -1, &error);
+ dbus_message_unref(message);
+
+ if (dbus_error_is_set(&error))
+ {
+ if (!dbus_error_has_name(&error, GALAGO_DBUS_ERROR_INVALID_ATTRIBUTE))
+ {
+ g_warning("Error sending Object.GetAttribute(%s, %s): %s",
+ galago_object_get_dbus_path(object), name, error.message);
+ }
+
+ goto exit;
+ }
+
+ dbus_message_iter_init(reply, &iter);
+ value = _galago_dbus_object_get_attr_value(&iter);
+
exit:
dbus_error_free(&error);
@@ -853,3 +871,61 @@
return value;
}
+
+static GList *
+_galago_dbus_object_get_attributes(const GalagoObject *object)
+{
+ DBusConnection *dbus_conn;
+ DBusMessage *message, *reply;
+ DBusMessageIter iter, array_iter, struct_iter;
+ DBusError error;
+ GList *attrs = NULL;
+
+ if (!galago_is_connected())
+ return NULL;
+
+ dbus_conn = galago_get_dbus_conn();
+
+ message = galago_dbus_message_new_method_call(GALAGO_OBJECT(object),
+ "GetAttributes", TRUE, NULL);
+ g_return_val_if_fail(message != NULL, NULL);
+
+ dbus_error_init(&error);
+ reply = dbus_connection_send_with_reply_and_block(dbus_conn, message,
+ -1, &error);
+ dbus_message_unref(message);
+
+ if (dbus_error_is_set(&error))
+ {
+ g_warning("Error sending Object.GetAttributes(%s): %s",
+ galago_object_get_dbus_path(object), error.message);
+
+ goto exit;
+ }
+
+ dbus_message_iter_init(reply, &iter);
+ dbus_message_iter_recurse(&iter, &array_iter);
+
+ while (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_INVALID)
+ {
+ const char *attr_id;
+ GValue *value;
+
+ dbus_message_iter_recurse(&array_iter, &struct_iter);
+ dbus_message_iter_get_basic(&struct_iter, &attr_id);
+ dbus_message_iter_next(&struct_iter);
+
+ value = _galago_dbus_object_get_attr_value(&struct_iter);
+ dbus_message_iter_next(&array_iter);
+
+ attrs = g_list_append(attrs, galago_key_value_new(attr_id, value));
+ }
+
+exit:
+ dbus_error_free(&error);
+
+ if (reply != NULL)
+ dbus_message_unref(reply);
+
+ return attrs;
+}
More information about the galago-commits
mailing list