summaryrefslogtreecommitdiff
path: root/dbind
diff options
context:
space:
mode:
authorMike Gorse <mgorse@novell.com>2010-11-28 14:48:52 -0500
committerMike Gorse <mgorse@novell.com>2010-11-28 14:48:52 -0500
commitfebc57fdd883c96a471a970f6801af9d5a5bdf92 (patch)
tree31b385ee12ddebc4ca1ffe62901bdedd52f1b39d /dbind
parentba62b6e42a04872513574b1abd2e02d44c2a6468 (diff)
downloadat-spi2-core-febc57fdd883c96a471a970f6801af9d5a5bdf92.tar.gz
Really commit fixes; make unit tests pass
Diffstat (limited to 'dbind')
-rw-r--r--dbind/dbind-any.c74
-rw-r--r--dbind/dbind-any.h6
-rw-r--r--dbind/dbind.c11
3 files changed, 74 insertions, 17 deletions
diff --git a/dbind/dbind-any.c b/dbind/dbind-any.c
index 8b224480..088a2076 100644
--- a/dbind/dbind-any.c
+++ b/dbind/dbind-any.c
@@ -434,7 +434,7 @@ dbind_any_marshal (DBusMessageIter *iter,
void
dbind_any_marshal_va (DBusMessageIter *iter,
const char **arg_types,
- va_list *args)
+ va_list args)
{
const char *p = *arg_types;
@@ -460,16 +460,16 @@ dbind_any_marshal_va (DBusMessageIter *iter,
case DBUS_TYPE_UINT16:
case DBUS_TYPE_INT32:
case DBUS_TYPE_UINT32:
- intarg = va_arg (*args, int);
+ intarg = va_arg (args, int);
arg = &intarg;
break;
case DBUS_TYPE_INT64:
case DBUS_TYPE_UINT64:
- int64arg = va_arg (*args, dbus_int64_t);
+ int64arg = va_arg (args, dbus_int64_t);
arg = &int64arg;
break;
case DBUS_TYPE_DOUBLE:
- doublearg = va_arg (*args, double);
+ doublearg = va_arg (args, double);
arg = &doublearg;
break;
/* ptr types */
@@ -478,21 +478,21 @@ dbind_any_marshal_va (DBusMessageIter *iter,
case DBUS_TYPE_SIGNATURE:
case DBUS_TYPE_ARRAY:
case DBUS_TYPE_DICT_ENTRY:
- ptrarg = va_arg (*args, void *);
+ ptrarg = va_arg (args, void *);
arg = &ptrarg;
break;
case DBUS_STRUCT_BEGIN_CHAR:
- ptrarg = va_arg (*args, void *);
+ ptrarg = va_arg (args, void *);
arg = ptrarg;
break;
case DBUS_DICT_ENTRY_BEGIN_CHAR:
- ptrarg = va_arg (*args, void *);
+ ptrarg = va_arg (args, void *);
arg = ptrarg;
break;
case DBUS_TYPE_VARIANT:
fprintf (stderr, "No variant support yet - very toolkit specific\n");
- ptrarg = va_arg (*args, void *);
+ ptrarg = va_arg (args, void *);
arg = &ptrarg;
break;
default:
@@ -635,11 +635,65 @@ dbind_any_demarshal (DBusMessageIter *iter,
void
dbind_any_demarshal_va (DBusMessageIter *iter,
const char **arg_types,
- va_list *args)
+ va_list args)
{
const char *p = *arg_types;
+
+ /* Pass in args */
+ for (;*p != '\0' && *p != '=';) {
+ int intarg;
+ void *ptrarg;
+ double doublearg;
+ dbus_int64_t int64arg;
+ void *arg = NULL;
+
+ switch (*p) {
+ case DBUS_TYPE_BYTE:
+ case DBUS_TYPE_BOOLEAN:
+ case DBUS_TYPE_INT16:
+ case DBUS_TYPE_UINT16:
+ case DBUS_TYPE_INT32:
+ case DBUS_TYPE_UINT32:
+ intarg = va_arg (args, int);
+ break;
+ case DBUS_TYPE_INT64:
+ case DBUS_TYPE_UINT64:
+ int64arg = va_arg (args, dbus_int64_t);
+ break;
+ case DBUS_TYPE_DOUBLE:
+ doublearg = va_arg (args, double);
+ break;
+ /* ptr types */
+ case DBUS_TYPE_STRING:
+ case DBUS_TYPE_OBJECT_PATH:
+ case DBUS_TYPE_SIGNATURE:
+ case DBUS_TYPE_ARRAY:
+ case DBUS_TYPE_DICT_ENTRY:
+ ptrarg = va_arg (args, void *);
+ break;
+ case DBUS_STRUCT_BEGIN_CHAR:
+ ptrarg = va_arg (args, void *);
+ break;
+ case DBUS_DICT_ENTRY_BEGIN_CHAR:
+ ptrarg = va_arg (args, void *);
+ break;
+
+ case DBUS_TYPE_VARIANT:
+ fprintf (stderr, "No variant support yet - very toolkit specific\n");
+ ptrarg = va_arg (args, void *);
+ break;
+ default:
+ fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
+ break;
+ }
+ p++;
+ }
+
+ if (p [0] == '=' && p[1] == '>')
+ p += 2;
+
for (;*p != '\0';) {
- void *arg = va_arg (*args, void *);
+ void *arg = va_arg (args, void *);
dbind_any_demarshal (iter, &p, &arg);
}
}
diff --git a/dbind/dbind-any.h b/dbind/dbind-any.h
index ae69caad..094b7166 100644
--- a/dbind/dbind-any.h
+++ b/dbind/dbind-any.h
@@ -11,8 +11,8 @@ void dbind_any_marshal (DBusMessageIter *iter,
void **val);
void dbind_any_marshal_va (DBusMessageIter *iter,
- const const char **arg_types,
- va_list *args);
+ const char **arg_types,
+ va_list args);
void dbind_any_demarshal (DBusMessageIter *iter,
const char **type,
@@ -20,7 +20,7 @@ void dbind_any_demarshal (DBusMessageIter *iter,
void dbind_any_demarshal_va (DBusMessageIter *iter,
const char **arg_types,
- va_list *args);
+ va_list args);
void dbind_any_free (const char *type,
void *ptr_to_ptr);
diff --git a/dbind/dbind.c b/dbind/dbind.c
index 9f284e92..a5da81d9 100644
--- a/dbind/dbind.c
+++ b/dbind/dbind.c
@@ -80,7 +80,9 @@ dbind_method_call_reentrant_va (DBusConnection *cnx,
DBusMessageIter iter;
DBusError *err, real_err;
const char *p;
+ va_list args_demarshal;
+ va_copy (args_demarshal, args);
if (opt_error)
err = opt_error;
else {
@@ -94,7 +96,7 @@ dbind_method_call_reentrant_va (DBusConnection *cnx,
p = arg_types;
dbus_message_iter_init_append (msg, &iter);
- dbind_any_marshal_va (&iter, &p, &args);
+ dbind_any_marshal_va (&iter, &p, args);
reply = dbind_send_and_allow_reentry (cnx, msg, err);
if (!reply)
@@ -110,9 +112,9 @@ dbind_method_call_reentrant_va (DBusConnection *cnx,
if (p[0] == '=' && p[1] == '>')
{
DBusMessageIter iter;
- p += 2;
dbus_message_iter_init (reply, &iter);
- dbind_any_demarshal_va (&iter, &p, &args);
+ p = arg_types;
+ dbind_any_demarshal_va (&iter, &p, args_demarshal);
}
success = TRUE;
@@ -126,6 +128,7 @@ out:
if (err == &real_err)
dbus_error_free (err);
+ va_end (args_demarshal);
return success;
}
@@ -203,7 +206,7 @@ dbind_emit_signal_va (DBusConnection *cnx,
p = arg_types;
dbus_message_iter_init_append (msg, &iter);
- dbind_any_marshal_va (&iter, &p, &args);
+ dbind_any_marshal_va (&iter, &p, args);
if (!dbus_connection_send (cnx, msg, NULL))
goto out;