Hello,

> reinventing the wheel could be hard and dangerous so I was thinking
> about something like yaml. On the plus side, it's easy to parse with
> libraries. On the minus side, you need to have the library on n900.

I've coded some kind of POC. It's not finished (my C is a bit
rusted...) and just print a json dump of the dbus message for the
moment.

I've only tested it on my linux workstation for the moment. You need
http://oss.metaparadigm.com/json-c/ to compile it.

If you are interested I can finish and clean it this to release it.
--- dbus-scripts.c.orig	2010-03-25 20:50:21.000000000 +0100
+++ dbus-scripts.c	2010-03-31 21:44:15.000000000 +0200
@@ -30,12 +30,15 @@
 #include <unistd.h>
 #include <sys/wait.h>
 
+#include <json.h>
 #include <glib.h>
 #include <glib-object.h>
 #define DBUS_API_SUBJECT_TO_CHANGE 1
 #include <dbus/dbus-glib-lowlevel.h>
 #include <dbus/dbus.h>
 
+
+
 #define DBUS_CONF_DIR "/etc/dbus-scripts.d"
 #define DBUS_RUN_SCRIPTS ""
 
@@ -155,106 +158,135 @@
   g_slist_foreach(script_list, (GFunc)script_file_call_if_matched, args);
 }
 
-static void
+static struct json_object*
 print_iter (DBusMessageIter *iter, dbus_bool_t literal, int depth)
 {
+  json_object *my_object, *my_array;
+  my_array = json_object_new_array();
+
   do {
       int type = dbus_message_iter_get_arg_type (iter);
       const char *str;
       dbus_uint32_t uint32;
       dbus_int32_t int32;
       dbus_bool_t boolean;
-#if 0
+#if 1
       double d;
       unsigned char byte;
 #endif
 
-      if (type == DBUS_TYPE_INVALID) break;
+      if (type == DBUS_TYPE_INVALID) {
+	my_object = json_object_new_string("invalid");
+	break;
+      }
 
       switch (type) {
 		case DBUS_TYPE_STRING:
           dbus_message_iter_get_basic (iter, &str);
 		  strncpy(msgs[nmsgs], str,127);
+		  my_object = json_object_new_string(str);
 		  nmsgs++;
 	  	  break;
 #if 1
 		case DBUS_TYPE_INT32:
 			dbus_message_iter_get_basic (iter, &int32);
 	  	  	sprintf (msgsv2[nmsgsv2], "%d", int32);
+			my_object = json_object_new_int(int32);
 		  	nmsgsv2++;
 	  	  break;
 
 		case DBUS_TYPE_UINT32:
 			dbus_message_iter_get_basic (iter, &uint32);
 	  	  	sprintf (msgsv2[nmsgsv2], "%u", uint32);
+			my_object = json_object_new_int(uint32);
 		  	nmsgsv2++;
 	  	  break;
 		case DBUS_TYPE_BOOLEAN:
   			dbus_message_iter_get_basic (iter, &boolean);
 			sprintf (msgsv2[nmsgsv2], "%s", boolean ? "true" : "false");
+			my_object = json_object_new_boolean(boolean);
 			nmsgsv2++;
   			break;
-			
 #endif
 
-#if 0
+#if 1
 		case DBUS_TYPE_DOUBLE:
 	  		dbus_message_iter_get_basic (iter, &d);
-	  		printf ("double %g\n", d);
+			my_object = json_object_new_double(d);
 	  		break;
 
 		case DBUS_TYPE_BYTE:
 			dbus_message_iter_get_basic (iter, &byte);
-			printf ("byte %d\n", byte);
+			my_object = json_object_new_int(byte);
 		    break;
 
 		case DBUS_TYPE_VARIANT:
 	  		{
 				DBusMessageIter subiter;
-				
 				dbus_message_iter_recurse (iter, &subiter);
-				
-				printf ("variant:");
-				print_iter (&subiter, literal, depth);
+				my_object = print_iter (&subiter, literal, depth + 1);
 				break;
 	  		}
 		case DBUS_TYPE_ARRAY:
 	  		{
 				int current_type;
 				DBusMessageIter subiter;
+				json_object *local_object;
 				
+				my_object = json_object_new_array();
 				dbus_message_iter_recurse (iter, &subiter);
 				
-				printf("[");
 				while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
 	  			{
-					print_iter (&subiter, literal, depth);
+				        local_object = print_iter (&subiter, literal, depth + 1);
+					json_object_array_add(my_object, local_object);
 					dbus_message_iter_next (&subiter);
-					if (dbus_message_iter_get_arg_type (&subiter) != DBUS_TYPE_INVALID)
-			  			printf (",");
 	  			}
-				printf("]");
 				break;
 	  		}
 		case DBUS_TYPE_DICT_ENTRY:
 	  		{
 				DBusMessageIter subiter;
+				json_object *key, *value;
 				
+				my_object = json_object_new_object();
 				dbus_message_iter_recurse (iter, &subiter);
 				
-				printf("{");
-				print_iter (&subiter, literal, depth);
+				key = print_iter (&subiter, literal, depth+1);
 				dbus_message_iter_next (&subiter);
-				print_iter (&subiter, literal, depth);
-				printf("}");
+				value = print_iter (&subiter, literal, depth+1);
+				json_object_object_add(my_object, key, value);
 				break;
 	  		}
+
+                case DBUS_TYPE_STRUCT:
+		        {
+			        int current_type;
+				DBusMessageIter subiter;
+				my_object = json_object_new_array();
+
+				dbus_message_iter_recurse (iter, &subiter);
+
+				while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
+				  {
+				    json_object *value;
+				    value = print_iter (&subiter, literal, depth+1);
+				    json_object_array_add(my_object, value);
+				    dbus_message_iter_next (&subiter);
+				  }
+				break;
+			}
+
+
 #endif
 		default:
 			break;
   	  }
       
+      json_object_array_add(my_array, my_object);
   } while (dbus_message_iter_next (iter));
+
+  return depth == 1 ? my_array : my_object;
 }
 
 void
@@ -266,6 +298,7 @@
   const char *destination;
   int message_type;
   int i;
+  json_object *my_object;
 
   message_type = dbus_message_get_type (message);
   sender = dbus_message_get_sender (message);
@@ -307,7 +340,8 @@
   }
 
   dbus_message_iter_init (message, &iter);
-  print_iter (&iter, literal, 1);
+  my_object = print_iter (&iter, literal, 1);
+  if (debug>1)  printf("my_object=%s\n", json_object_to_json_string(my_object));
 
   if (debug) {
     printf("=================================\n");
_______________________________________________
maemo-developers mailing list
[email protected]
https://lists.maemo.org/mailman/listinfo/maemo-developers

Reply via email to