2003-02-13 Anders Carlsson <andersca@codefactory.se>
authorAnders Carlsson <andersca@codefactory.se>
Thu, 13 Feb 2003 19:02:08 +0000 (19:02 +0000)
committerAnders Carlsson <andersca@codefactory.se>
Thu, 13 Feb 2003 19:02:08 +0000 (19:02 +0000)
* 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.

ChangeLog
dbus/dbus-errors.c
dbus/dbus-errors.h

index 01444b2..a944199 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 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.
+       
+2003-02-13  Anders Carlsson  <andersca@codefactory.se>
+
        * test/data/valid-messages/standard-acquire-service.message:
        * test/data/valid-messages/standard-hello.message:
        * test/data/valid-messages/standard-list-services.message:
index c70c1bc..a00ba94 100644 (file)
@@ -21,6 +21,9 @@
  *
  */
 #include "dbus-errors.h"
+#include "dbus-internals.h"
+#include <stdarg.h>
+#include <stdio.h>
 
 /**
  * @defgroup DBusErrors Error reporting
  * @{
  */
 
+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;
+}
+
 /** @} */
index 29f847d..0a7348f 100644 (file)
 #define DBUS_ERROR_H
 
 #include <dbus/dbus-macros.h>
+#include <dbus/dbus-types.h>
 
 DBUS_BEGIN_DECLS;
 
+typedef struct DBusError DBusError;
+
+struct DBusError
+{
+  const char *name;    /**< error name */
+  const char *message; /**< error message */
+
+  unsigned int dummy1 : 1; /**< placeholder */
+  unsigned int dummy2 : 1; /**< placeholder */
+};
+
 typedef enum
 {
   DBUS_RESULT_SUCCESS,         /**< Operation was successful. */
@@ -55,11 +67,22 @@ typedef enum
   DBUS_RESULT_FILE_NOT_FOUND   /**< File doesn't exist */
 } DBusResultCode;
 
+void        dbus_error_init      (DBusError  *error);
+void        dbus_error_free      (DBusError  *error);
+dbus_bool_t dbus_set_error       (DBusError  *error,
+                                 const char *name,
+                                 const char *message,
+                                 ...);
+void        dbus_set_error_const (DBusError  *error,
+                                 const char *name,
+                                 const char *message);
+
+                          
+                                  
 void        dbus_set_result       (DBusResultCode *code_address,
                                    DBusResultCode  code);
 const char* dbus_result_to_string (DBusResultCode  code);
 
-
 DBUS_END_DECLS;
 
 #endif /* DBUS_ERROR_H */