3 #define DBUS_API_SUBJECT_TO_CHANGE
4 #include <dbind/dbind.h>
5 #include <dbind/dbind-any.h>
10 * FIXME: compare types - to ensure they match &
11 * do dynamic padding of structures etc.
14 struct _DBindContext {
19 dbind_create_context (DBusBusType type, DBusError *opt_error)
21 DBindContext *ctx = NULL;
23 DBusError *err, real_err;
28 dbus_error_init (&real_err);
32 cnx = dbus_bus_get (DBUS_BUS_SESSION, err);
36 ctx = g_new0 (DBindContext, 1);
41 dbus_error_free (err);
47 dbind_context_free (DBindContext *ctx)
51 dbus_connection_unref (ctx->cnx);
56 dbind_context_method_call (DBindContext *ctx,
59 const char *interface,
62 const char *arg_types,
68 va_start (args, arg_types);
70 success = dbind_connection_method_call_va
71 (ctx->cnx, bus_name, path, interface, method, opt_error, arg_types, args);
79 dbind_connection_method_call (DBusConnection *cnx,
82 const char *interface,
85 const char *arg_types,
91 va_start (args, arg_types);
93 success = dbind_connection_method_call_va
94 (cnx, bus_name, path, interface, method, opt_error, arg_types, args);
102 dbind_connection_method_call_va (DBusConnection *cnx,
103 const char *bus_name,
105 const char *interface,
107 DBusError *opt_error,
108 const char *arg_types,
111 dbus_bool_t success = FALSE;
112 DBusMessage *msg = NULL, *reply = NULL;
113 DBusError *err, real_err;
119 dbus_error_init (&real_err);
123 msg = dbus_message_new_method_call (bus_name, path, interface, method);
126 dbus_message_set_auto_start (msg, TRUE);
129 p = (char *)arg_types;
131 DBusMessageIter iter;
133 dbus_message_iter_init_append (msg, &iter);
134 /* special case base-types since we need to walk the stack worse-luck */
135 for (;*p != '\0' && *p != '=';) {
139 dbus_int64_t int64arg;
144 case DBUS_TYPE_BOOLEAN:
145 case DBUS_TYPE_INT16:
146 case DBUS_TYPE_UINT16:
147 case DBUS_TYPE_INT32:
148 case DBUS_TYPE_UINT32:
149 intarg = va_arg (args, int);
152 case DBUS_TYPE_INT64:
153 case DBUS_TYPE_UINT64:
154 int64arg = va_arg (args, dbus_int64_t);
157 case DBUS_TYPE_DOUBLE:
158 doublearg = va_arg (args, double);
162 case DBUS_TYPE_STRING:
163 case DBUS_TYPE_OBJECT_PATH:
164 case DBUS_TYPE_SIGNATURE:
165 case DBUS_TYPE_ARRAY:
166 case DBUS_STRUCT_BEGIN_CHAR:
167 case DBUS_TYPE_DICT_ENTRY:
168 ptrarg = va_arg (args, void *);
172 case DBUS_TYPE_VARIANT:
173 fprintf (stderr, "No variant support yet - very toolkit specific\n");
174 ptrarg = va_arg (args, void *);
178 fprintf (stderr, "Unknown / invalid arg type %c\n", *p);
182 dbind_any_marshal (&iter, &p, &arg);
186 reply = dbus_connection_send_with_reply_and_block (cnx, msg, -1, err);
191 if (p[0] == '=' && p[1] == '>')
193 DBusMessageIter iter;
195 dbus_message_iter_init (reply, &iter);
197 void *arg = va_arg (args, void *);
198 dbind_any_demarshal (&iter, &p, &arg);
205 dbus_message_unref (msg);
208 dbus_message_unref (reply);
210 if (err == &real_err)
211 dbus_error_free (err);