Commit 1dae9197 authored by Michael Albinus's avatar Michael Albinus
Browse files

* dbusbind.c (xd_in_read_queued_messages): New variable.

(XD_SIGNAL1, XD_SIGNAL2, XD_SIGNAL3): New macros.  Throw
Qdbus_error.
(xd_read_queued_messages): Catch Qdbus_error from the macros.
(all): Replace xsignal1, xsignal2, xsignal3 by the respective
macro.  (Bug#1186).
parent 802393f6
2008-10-24 Michael Albinus <michael.albinus@gmx.de>
* dbusbind.c (xd_in_read_queued_messages): New variable.
(XD_SIGNAL1, XD_SIGNAL2, XD_SIGNAL3): New macros. Throw
Qdbus_error.
(xd_read_queued_messages): Catch Qdbus_error from the macros.
(all): Replace xsignal1, xsignal2, xsignal3 by the respective
macro. (Bug#1186).
2008-10-23 Ali Bahrami <ali_gnu@emvision.com> (tiny change) 2008-10-23 Ali Bahrami <ali_gnu@emvision.com> (tiny change)
   
* s/sol2-10.h: New file. * s/sol2-10.h: New file.
......
...@@ -63,10 +63,39 @@ Lisp_Object Vdbus_registered_functions_table; ...@@ -63,10 +63,39 @@ Lisp_Object Vdbus_registered_functions_table;
/* Whether to debug D-Bus. */ /* Whether to debug D-Bus. */
Lisp_Object Vdbus_debug; Lisp_Object Vdbus_debug;
/* Whether we are reading a D-Bus event. */
int xd_in_read_queued_messages = 0;
/* We use "xd_" and "XD_" as prefix for all internal symbols, because /* We use "xd_" and "XD_" as prefix for all internal symbols, because
we don't want to poison other namespaces with "dbus_". */ we don't want to poison other namespaces with "dbus_". */
/* Raise a signal. If we are reading events, we cannot signal; we
throw to xd_read_queued_messages then. */
#define XD_SIGNAL1(arg) \
do { \
if (xd_in_read_queued_messages) \
Fthrow (Qdbus_error, Qnil); \
else \
xsignal1 (Qdbus_error, arg); \
} while (0)
#define XD_SIGNAL2(arg1, arg2) \
do { \
if (xd_in_read_queued_messages) \
Fthrow (Qdbus_error, Qnil); \
else \
xsignal2 (Qdbus_error, arg1, arg2); \
} while (0)
#define XD_SIGNAL3(arg1, arg2, arg3) \
do { \
if (xd_in_read_queued_messages) \
Fthrow (Qdbus_error, Qnil); \
else \
xsignal3 (Qdbus_error, arg1, arg2, arg3); \
} while (0)
/* Raise a Lisp error from a D-Bus ERROR. */ /* Raise a Lisp error from a D-Bus ERROR. */
#define XD_ERROR(error) \ #define XD_ERROR(error) \
do { \ do { \
...@@ -76,7 +105,7 @@ Lisp_Object Vdbus_debug; ...@@ -76,7 +105,7 @@ Lisp_Object Vdbus_debug;
/* Remove the trailing newline. */ \ /* Remove the trailing newline. */ \
if (strchr (s, '\n') != NULL) \ if (strchr (s, '\n') != NULL) \
s[strlen (s) - 1] = '\0'; \ s[strlen (s) - 1] = '\0'; \
xsignal1 (Qdbus_error, build_string (s)); \ XD_SIGNAL1 (build_string (s)); \
} while (0) } while (0)
/* Macros for debugging. In order to enable them, build with /* Macros for debugging. In order to enable them, build with
...@@ -94,7 +123,7 @@ Lisp_Object Vdbus_debug; ...@@ -94,7 +123,7 @@ Lisp_Object Vdbus_debug;
if (!valid_lisp_object_p (object)) \ if (!valid_lisp_object_p (object)) \
{ \ { \
XD_DEBUG_MESSAGE ("%d Assertion failure", __LINE__); \ XD_DEBUG_MESSAGE ("%d Assertion failure", __LINE__); \
xsignal1 (Qdbus_error, build_string ("Assertion failure")); \ XD_SIGNAL1 (build_string ("Assertion failure")); \
} \ } \
} while (0) } while (0)
...@@ -370,8 +399,7 @@ xd_append_arg (dtype, object, iter) ...@@ -370,8 +399,7 @@ xd_append_arg (dtype, object, iter)
unsigned char val = XUINT (object) & 0xFF; unsigned char val = XUINT (object) & 0xFF;
XD_DEBUG_MESSAGE ("%c %d", dtype, val); XD_DEBUG_MESSAGE ("%c %d", dtype, val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -380,8 +408,7 @@ xd_append_arg (dtype, object, iter) ...@@ -380,8 +408,7 @@ xd_append_arg (dtype, object, iter)
dbus_bool_t val = (NILP (object)) ? FALSE : TRUE; dbus_bool_t val = (NILP (object)) ? FALSE : TRUE;
XD_DEBUG_MESSAGE ("%c %s", dtype, (val == FALSE) ? "false" : "true"); XD_DEBUG_MESSAGE ("%c %s", dtype, (val == FALSE) ? "false" : "true");
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -390,8 +417,7 @@ xd_append_arg (dtype, object, iter) ...@@ -390,8 +417,7 @@ xd_append_arg (dtype, object, iter)
dbus_int16_t val = XINT (object); dbus_int16_t val = XINT (object);
XD_DEBUG_MESSAGE ("%c %d", dtype, (int) val); XD_DEBUG_MESSAGE ("%c %d", dtype, (int) val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -400,8 +426,7 @@ xd_append_arg (dtype, object, iter) ...@@ -400,8 +426,7 @@ xd_append_arg (dtype, object, iter)
dbus_uint16_t val = XUINT (object); dbus_uint16_t val = XUINT (object);
XD_DEBUG_MESSAGE ("%c %u", dtype, (unsigned int) val); XD_DEBUG_MESSAGE ("%c %u", dtype, (unsigned int) val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -410,8 +435,7 @@ xd_append_arg (dtype, object, iter) ...@@ -410,8 +435,7 @@ xd_append_arg (dtype, object, iter)
dbus_int32_t val = XINT (object); dbus_int32_t val = XINT (object);
XD_DEBUG_MESSAGE ("%c %d", dtype, val); XD_DEBUG_MESSAGE ("%c %d", dtype, val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -420,8 +444,7 @@ xd_append_arg (dtype, object, iter) ...@@ -420,8 +444,7 @@ xd_append_arg (dtype, object, iter)
dbus_uint32_t val = XUINT (object); dbus_uint32_t val = XUINT (object);
XD_DEBUG_MESSAGE ("%c %u", dtype, val); XD_DEBUG_MESSAGE ("%c %u", dtype, val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -430,8 +453,7 @@ xd_append_arg (dtype, object, iter) ...@@ -430,8 +453,7 @@ xd_append_arg (dtype, object, iter)
dbus_int64_t val = XINT (object); dbus_int64_t val = XINT (object);
XD_DEBUG_MESSAGE ("%c %d", dtype, (int) val); XD_DEBUG_MESSAGE ("%c %d", dtype, (int) val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -440,8 +462,7 @@ xd_append_arg (dtype, object, iter) ...@@ -440,8 +462,7 @@ xd_append_arg (dtype, object, iter)
dbus_uint64_t val = XUINT (object); dbus_uint64_t val = XUINT (object);
XD_DEBUG_MESSAGE ("%c %u", dtype, (unsigned int) val); XD_DEBUG_MESSAGE ("%c %u", dtype, (unsigned int) val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
...@@ -449,8 +470,7 @@ xd_append_arg (dtype, object, iter) ...@@ -449,8 +470,7 @@ xd_append_arg (dtype, object, iter)
XD_DEBUG_MESSAGE ("%c %f", dtype, XFLOAT_DATA (object)); XD_DEBUG_MESSAGE ("%c %f", dtype, XFLOAT_DATA (object));
if (!dbus_message_iter_append_basic (iter, dtype, if (!dbus_message_iter_append_basic (iter, dtype,
&XFLOAT_DATA (object))) &XFLOAT_DATA (object)))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
case DBUS_TYPE_STRING: case DBUS_TYPE_STRING:
...@@ -460,8 +480,7 @@ xd_append_arg (dtype, object, iter) ...@@ -460,8 +480,7 @@ xd_append_arg (dtype, object, iter)
char *val = SDATA (Fstring_make_unibyte (object)); char *val = SDATA (Fstring_make_unibyte (object));
XD_DEBUG_MESSAGE ("%c %s", dtype, val); XD_DEBUG_MESSAGE ("%c %s", dtype, val);
if (!dbus_message_iter_append_basic (iter, dtype, &val)) if (!dbus_message_iter_append_basic (iter, dtype, &val))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Unable to append argument"), object);
build_string ("Unable to append argument"), object);
return; return;
} }
} }
...@@ -509,9 +528,8 @@ xd_append_arg (dtype, object, iter) ...@@ -509,9 +528,8 @@ xd_append_arg (dtype, object, iter)
SDATA (format2 ("%s", object, Qnil))); SDATA (format2 ("%s", object, Qnil)));
if (!dbus_message_iter_open_container (iter, dtype, if (!dbus_message_iter_open_container (iter, dtype,
signature, &subiter)) signature, &subiter))
xsignal3 (Qdbus_error, XD_SIGNAL3 (build_string ("Cannot open container"),
build_string ("Cannot open container"), make_number (dtype), build_string (signature));
make_number (dtype), build_string (signature));
break; break;
case DBUS_TYPE_VARIANT: case DBUS_TYPE_VARIANT:
...@@ -523,9 +541,8 @@ xd_append_arg (dtype, object, iter) ...@@ -523,9 +541,8 @@ xd_append_arg (dtype, object, iter)
SDATA (format2 ("%s", object, Qnil))); SDATA (format2 ("%s", object, Qnil)));
if (!dbus_message_iter_open_container (iter, dtype, if (!dbus_message_iter_open_container (iter, dtype,
signature, &subiter)) signature, &subiter))
xsignal3 (Qdbus_error, XD_SIGNAL3 (build_string ("Cannot open container"),
build_string ("Cannot open container"), make_number (dtype), build_string (signature));
make_number (dtype), build_string (signature));
break; break;
case DBUS_TYPE_STRUCT: case DBUS_TYPE_STRUCT:
...@@ -534,9 +551,8 @@ xd_append_arg (dtype, object, iter) ...@@ -534,9 +551,8 @@ xd_append_arg (dtype, object, iter)
XD_DEBUG_MESSAGE ("%c %s", dtype, XD_DEBUG_MESSAGE ("%c %s", dtype,
SDATA (format2 ("%s", object, Qnil))); SDATA (format2 ("%s", object, Qnil)));
if (!dbus_message_iter_open_container (iter, dtype, NULL, &subiter)) if (!dbus_message_iter_open_container (iter, dtype, NULL, &subiter))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Cannot open container"),
build_string ("Cannot open container"), make_number (dtype));
make_number (dtype));
break; break;
} }
...@@ -553,9 +569,8 @@ xd_append_arg (dtype, object, iter) ...@@ -553,9 +569,8 @@ xd_append_arg (dtype, object, iter)
/* Close the subiteration. */ /* Close the subiteration. */
if (!dbus_message_iter_close_container (iter, &subiter)) if (!dbus_message_iter_close_container (iter, &subiter))
xsignal2 (Qdbus_error, XD_SIGNAL2 (build_string ("Cannot close container"),
build_string ("Cannot close container"), make_number (dtype));
make_number (dtype));
} }
} }
...@@ -677,7 +692,7 @@ xd_initialize (bus) ...@@ -677,7 +692,7 @@ xd_initialize (bus)
/* Parameter check. */ /* Parameter check. */
CHECK_SYMBOL (bus); CHECK_SYMBOL (bus);
if (!((EQ (bus, QCdbus_system_bus)) || (EQ (bus, QCdbus_session_bus)))) if (!((EQ (bus, QCdbus_system_bus)) || (EQ (bus, QCdbus_session_bus))))
xsignal2 (Qdbus_error, build_string ("Wrong bus name"), bus); XD_SIGNAL2 (build_string ("Wrong bus name"), bus);
/* Open a connection to the bus. */ /* Open a connection to the bus. */
dbus_error_init (&derror); dbus_error_init (&derror);
...@@ -691,7 +706,7 @@ xd_initialize (bus) ...@@ -691,7 +706,7 @@ xd_initialize (bus)
XD_ERROR (derror); XD_ERROR (derror);
if (connection == NULL) if (connection == NULL)
xsignal2 (Qdbus_error, build_string ("No connection"), bus); XD_SIGNAL2 (build_string ("No connection"), bus);
/* Return the result. */ /* Return the result. */
return connection; return connection;
...@@ -715,7 +730,7 @@ DEFUN ("dbus-get-unique-name", Fdbus_get_unique_name, Sdbus_get_unique_name, ...@@ -715,7 +730,7 @@ DEFUN ("dbus-get-unique-name", Fdbus_get_unique_name, Sdbus_get_unique_name,
/* Request the name. */ /* Request the name. */
name = dbus_bus_get_unique_name (connection); name = dbus_bus_get_unique_name (connection);
if (name == NULL) if (name == NULL)
xsignal1 (Qdbus_error, build_string ("No unique name available")); XD_SIGNAL1 (build_string ("No unique name available"));
/* Return. */ /* Return. */
return build_string (name); return build_string (name);
...@@ -836,7 +851,7 @@ usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &optional :timeout TI ...@@ -836,7 +851,7 @@ usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &optional :timeout TI
SDATA (method)); SDATA (method));
UNGCPRO; UNGCPRO;
if (dmessage == NULL) if (dmessage == NULL)
xsignal1 (Qdbus_error, build_string ("Unable to create a new message")); XD_SIGNAL1 (build_string ("Unable to create a new message"));
/* Check for timeout parameter. */ /* Check for timeout parameter. */
if ((i+2 <= nargs) && (EQ ((args[i]), QCdbus_timeout))) if ((i+2 <= nargs) && (EQ ((args[i]), QCdbus_timeout)))
...@@ -887,7 +902,7 @@ usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &optional :timeout TI ...@@ -887,7 +902,7 @@ usage: (dbus-call-method BUS SERVICE PATH INTERFACE METHOD &optional :timeout TI
XD_ERROR (derror); XD_ERROR (derror);
if (reply == NULL) if (reply == NULL)
xsignal1 (Qdbus_error, build_string ("No reply")); XD_SIGNAL1 (build_string ("No reply"));
XD_DEBUG_MESSAGE ("Message sent"); XD_DEBUG_MESSAGE ("Message sent");
...@@ -1018,7 +1033,7 @@ usage: (dbus-call-method-asynchronously BUS SERVICE PATH INTERFACE METHOD HANDLE ...@@ -1018,7 +1033,7 @@ usage: (dbus-call-method-asynchronously BUS SERVICE PATH INTERFACE METHOD HANDLE
SDATA (interface), SDATA (interface),
SDATA (method)); SDATA (method));
if (dmessage == NULL) if (dmessage == NULL)
xsignal1 (Qdbus_error, build_string ("Unable to create a new message")); XD_SIGNAL1 (build_string ("Unable to create a new message"));
/* Check for timeout parameter. */ /* Check for timeout parameter. */
if ((i+2 <= nargs) && (EQ ((args[i]), QCdbus_timeout))) if ((i+2 <= nargs) && (EQ ((args[i]), QCdbus_timeout)))
...@@ -1061,7 +1076,7 @@ usage: (dbus-call-method-asynchronously BUS SERVICE PATH INTERFACE METHOD HANDLE ...@@ -1061,7 +1076,7 @@ usage: (dbus-call-method-asynchronously BUS SERVICE PATH INTERFACE METHOD HANDLE
/* Send the message. The message is just added to the outgoing /* Send the message. The message is just added to the outgoing
message queue. */ message queue. */
if (!dbus_connection_send_with_reply (connection, dmessage, NULL, timeout)) if (!dbus_connection_send_with_reply (connection, dmessage, NULL, timeout))
xsignal1 (Qdbus_error, build_string ("Cannot send message")); XD_SIGNAL1 (build_string ("Cannot send message"));
XD_DEBUG_MESSAGE ("Message sent"); XD_DEBUG_MESSAGE ("Message sent");
...@@ -1120,8 +1135,7 @@ usage: (dbus-method-return-internal BUS SERIAL SERVICE &rest ARGS) */) ...@@ -1120,8 +1135,7 @@ usage: (dbus-method-return-internal BUS SERIAL SERVICE &rest ARGS) */)
|| (!dbus_message_set_destination (dmessage, SDATA (service)))) || (!dbus_message_set_destination (dmessage, SDATA (service))))
{ {
UNGCPRO; UNGCPRO;
xsignal1 (Qdbus_error, XD_SIGNAL1 (build_string ("Unable to create a return message"));
build_string ("Unable to create a return message"));
} }
UNGCPRO; UNGCPRO;
...@@ -1159,7 +1173,7 @@ usage: (dbus-method-return-internal BUS SERIAL SERVICE &rest ARGS) */) ...@@ -1159,7 +1173,7 @@ usage: (dbus-method-return-internal BUS SERIAL SERVICE &rest ARGS) */)
/* Send the message. The message is just added to the outgoing /* Send the message. The message is just added to the outgoing
message queue. */ message queue. */
if (!dbus_connection_send (connection, dmessage, NULL)) if (!dbus_connection_send (connection, dmessage, NULL))
xsignal1 (Qdbus_error, build_string ("Cannot send message")); XD_SIGNAL1 (build_string ("Cannot send message"));
/* Flush connection to ensure the message is handled. */ /* Flush connection to ensure the message is handled. */
dbus_connection_flush (connection); dbus_connection_flush (connection);
...@@ -1216,8 +1230,7 @@ usage: (dbus-method-error-internal BUS SERIAL SERVICE &rest ARGS) */) ...@@ -1216,8 +1230,7 @@ usage: (dbus-method-error-internal BUS SERIAL SERVICE &rest ARGS) */)
|| (!dbus_message_set_destination (dmessage, SDATA (service)))) || (!dbus_message_set_destination (dmessage, SDATA (service))))
{ {
UNGCPRO; UNGCPRO;
xsignal1 (Qdbus_error, XD_SIGNAL1 (build_string ("Unable to create a error message"));
build_string ("Unable to create a error message"));
} }
UNGCPRO; UNGCPRO;
...@@ -1255,7 +1268,7 @@ usage: (dbus-method-error-internal BUS SERIAL SERVICE &rest ARGS) */) ...@@ -1255,7 +1268,7 @@ usage: (dbus-method-error-internal BUS SERIAL SERVICE &rest ARGS) */)
/* Send the message. The message is just added to the outgoing /* Send the message. The message is just added to the outgoing
message queue. */ message queue. */
if (!dbus_connection_send (connection, dmessage, NULL)) if (!dbus_connection_send (connection, dmessage, NULL))
xsignal1 (Qdbus_error, build_string ("Cannot send message")); XD_SIGNAL1 (build_string ("Cannot send message"));
/* Flush connection to ensure the message is handled. */ /* Flush connection to ensure the message is handled. */
dbus_connection_flush (connection); dbus_connection_flush (connection);
...@@ -1340,7 +1353,7 @@ usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */) ...@@ -1340,7 +1353,7 @@ usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */)
SDATA (signal)); SDATA (signal));
UNGCPRO; UNGCPRO;
if (dmessage == NULL) if (dmessage == NULL)
xsignal1 (Qdbus_error, build_string ("Unable to create a new message")); XD_SIGNAL1 (build_string ("Unable to create a new message"));
/* Initialize parameter list of message. */ /* Initialize parameter list of message. */
dbus_message_iter_init_append (dmessage, &iter); dbus_message_iter_init_append (dmessage, &iter);
...@@ -1375,7 +1388,7 @@ usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */) ...@@ -1375,7 +1388,7 @@ usage: (dbus-send-signal BUS SERVICE PATH INTERFACE SIGNAL &rest ARGS) */)
/* Send the message. The message is just added to the outgoing /* Send the message. The message is just added to the outgoing
message queue. */ message queue. */
if (!dbus_connection_send (connection, dmessage, NULL)) if (!dbus_connection_send (connection, dmessage, NULL))
xsignal1 (Qdbus_error, build_string ("Cannot send message")); XD_SIGNAL1 (build_string ("Cannot send message"));
/* Flush connection to ensure the message is handled. */ /* Flush connection to ensure the message is handled. */
dbus_connection_flush (connection); dbus_connection_flush (connection);
...@@ -1557,10 +1570,10 @@ xd_read_queued_messages () ...@@ -1557,10 +1570,10 @@ xd_read_queued_messages ()
Lisp errors during the call. */ Lisp errors during the call. */
if (HASH_TABLE_P (Vdbus_registered_functions_table)) if (HASH_TABLE_P (Vdbus_registered_functions_table))
{ {
internal_condition_case_1 (xd_read_message, QCdbus_system_bus, xd_in_read_queued_messages = 1;
Qerror, Fidentity); internal_catch (Qdbus_error, xd_read_message, QCdbus_system_bus);
internal_condition_case_1 (xd_read_message, QCdbus_session_bus, internal_catch (Qdbus_error, xd_read_message, QCdbus_session_bus);
Qerror, Fidentity); xd_in_read_queued_messages = 0;
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment