summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-errors.c
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@codefactory.se>2003-02-13 19:02:08 +0000
committerAnders Carlsson <andersca@codefactory.se>2003-02-13 19:02:08 +0000
commitb09fadc1145570d752e7f709bfc0cf8c486d5146 (patch)
tree306aae979a5484c1a5c8d2af61d3047190cf233e /dbus/dbus-errors.c
parentf28c36435215a56364681667045adcafecc791e6 (diff)
2003-02-13 Anders Carlsson <andersca@codefactory.se>
* dbus/dbus-errors.c: (dbus_result_to_string), (dbus_error_init), (dbus_error_free), (dbus_set_error_const), (dbus_set_error): * dbus/dbus-errors.h: Add DBusError structure.
Diffstat (limited to 'dbus/dbus-errors.c')
-rw-r--r--dbus/dbus-errors.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/dbus/dbus-errors.c b/dbus/dbus-errors.c
index c70c1bc4..a00ba946 100644
--- a/dbus/dbus-errors.c
+++ b/dbus/dbus-errors.c
@@ -21,6 +21,9 @@
*
*/
#include "dbus-errors.h"
+#include "dbus-internals.h"
+#include <stdarg.h>
+#include <stdio.h>
/**
* @defgroup DBusErrors Error reporting
@@ -42,6 +45,14 @@
* @{
*/
+typedef struct
+{
+ const char *name; /**< error name */
+ char *message; /**< error message */
+
+ unsigned int const_message : 1; /** Message is not owned by DBusError */
+} DBusRealError;
+
/**
* Set a result code at a result code location,
* if code_address is not #NULL.
@@ -112,4 +123,92 @@ dbus_result_to_string (DBusResultCode code)
return "Invalid error code";
}
+void
+dbus_error_init (DBusError *error)
+{
+ DBusRealError *real;
+
+ _dbus_assert (error != NULL);
+
+ _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError));
+
+ real = (DBusRealError *)error;
+
+ real->name = NULL;
+ real->message = NULL;
+
+ real->const_message = TRUE;
+}
+
+void
+dbus_error_free (DBusError *error)
+{
+ DBusRealError *real;
+
+ real = (DBusRealError *)error;
+
+ if (!real->const_message)
+ dbus_free (real->message);
+}
+
+void
+dbus_set_error_const (DBusError *error,
+ const char *name,
+ const char *message)
+{
+ DBusRealError *real;
+
+ if (error == NULL)
+ return;
+
+ dbus_error_init (error);
+
+ real = (DBusRealError *)error;
+
+ real->name = name;
+ real->message = (char *)message;
+ real->const_message = TRUE;
+}
+
+dbus_bool_t
+dbus_set_error (DBusError *error,
+ const char *name,
+ const char *format,
+ ...)
+{
+ DBusRealError *real;
+ va_list args, args2;
+ int message_length;
+ char *message;
+ char c;
+
+ if (error == NULL)
+ return TRUE;
+
+ va_start (args, format);
+
+ va_copy (args2, args);
+
+ /* Measure the message length */
+ message_length = vsnprintf (&c, 1,format, args) + 1;
+
+ message = dbus_malloc (message_length);
+
+ vsprintf (message, format, args2);
+
+ if (!message)
+ return FALSE;
+
+ va_end (args);
+
+ dbus_error_init (error);
+ real = (DBusRealError *)error;
+
+ real->name = name;
+ real->message = message;
+ real->const_message = FALSE;
+
+ return TRUE;
+}
+
/** @} */