[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