[Telepathy-commits] [telepathy-mission-control/master] Map MC errors as DBus errors

Alberto Mardegan alberto.mardegan at nokia.com
Thu Feb 26 23:32:41 PST 2009


Register a GType for the McError enum, and register it to DBus for error
mapping.
Code mostly copied from tp-glib.
---
 libmcclient/mc-errors.c |   46 ++++++++++++++++++++++++++++++++++++++++++----
 libmcclient/mc-errors.h |   11 ++++++++++-
 src/mcd-misc.c          |    2 --
 3 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/libmcclient/mc-errors.c b/libmcclient/mc-errors.c
index 624a743..2b34557 100644
--- a/libmcclient/mc-errors.c
+++ b/libmcclient/mc-errors.c
@@ -21,12 +21,50 @@
  */
 
 #include "mc-errors.h"
+#include <dbus/dbus-glib.h>
 
 GQuark mc_error_quark (void)
 {
-    static GQuark quark = 0;
-    if (quark == 0)
-        quark = g_quark_from_static_string ("mission-control-quark");
-    return quark;
+    static gsize quark = 0;
+
+    if (g_once_init_enter (&quark))
+    {
+        GQuark domain = g_quark_from_static_string ("mc-errors");
+
+        g_assert (sizeof (GQuark) <= sizeof (gsize));
+
+        g_type_init ();
+        dbus_g_error_domain_register (domain, MC_ERROR_PREFIX, MC_TYPE_ERROR);
+        g_once_init_leave (&quark, domain);
+    }
+    return (GQuark) quark;
+}
+
+GType
+mc_error_get_type (void)
+{
+    static GType etype = 0;
+    if (G_UNLIKELY (etype == 0))
+    {
+        static const GEnumValue values[] = {
+            { MC_DISCONNECTED_ERROR, "MC_DISCONNECTED_ERROR", "Disconnected" },
+            { MC_INVALID_HANDLE_ERROR, "MC_INVALID_HANDLE_ERROR", "InvalidHandle" },
+            { MC_NO_MATCHING_CONNECTION_ERROR, "MC_NO_MATCHING_CONNECTION_ERROR", "NoMatchingConnection" },
+            { MC_INVALID_ACCOUNT_ERROR, "MC_INVALID_ACCOUNT_ERROR", "InvalidAccount" },
+            { MC_PRESENCE_FAILURE_ERROR, "MC_PRESENCE_FAILURE_ERROR", "PresenceFailure" },
+            { MC_NO_ACCOUNTS_ERROR, "MC_NO_ACCOUNTS_ERROR", "NoAccounts" },
+            { MC_NETWORK_ERROR, "MC_NETWORK_ERROR", "NetworkError" },
+            { MC_CONTACT_DOES_NOT_SUPPORT_VOICE_ERROR, "MC_CONTACT_DOES_NOT_SUPPORT_VOICE_ERROR", "ContactDoesNotSupportVoice" },
+            { MC_LOWMEM_ERROR, "MC_LOWMEM_ERROR", "Lowmem" },
+            { MC_CHANNEL_REQUEST_GENERIC_ERROR, "MC_CHANNEL_REQUEST_GENERIC_ERROR", "ChannelRequestGenericError" },
+            { MC_CHANNEL_BANNED_ERROR, "MC_CHANNEL_BANNED_ERROR", "ChannelBanned" },
+            { MC_CHANNEL_FULL_ERROR, "MC_CHANNEL_FULL_ERROR", "ChannelFull" },
+            { MC_CHANNEL_INVITE_ONLY_ERROR, "MC_CHANNEL_INVITE_ONLY_ERROR", "ChannelInviteOnly" },
+            { 0 }
+        };
+
+      etype = g_enum_register_static ("McError", values);
+    }
+  return etype;
 }
 
diff --git a/libmcclient/mc-errors.h b/libmcclient/mc-errors.h
index 235d74a..a2da9af 100644
--- a/libmcclient/mc-errors.h
+++ b/libmcclient/mc-errors.h
@@ -25,6 +25,12 @@
 #define __LIBMCCLIENT_ERRORS_H__
 
 #include <glib.h>
+#include <glib-object.h>
+
+#define MC_ERROR_PREFIX "com.nokia.MissionControl.Errors"
+
+#define MC_TYPE_ERROR (mc_error_get_type())
+GType mc_error_get_type (void);
 
 #define MC_ERROR (mc_error_quark())
 
@@ -43,7 +49,10 @@ typedef enum {
     MC_CHANNEL_FULL_ERROR,
     MC_CHANNEL_INVITE_ONLY_ERROR,
     MC_LAST_ERROR /*< skip >*/
-} MCError;
+} McError;
+
+/* Keep API compatibility: */
+#define MCError McError
 
 GQuark mc_error_quark (void);
 
diff --git a/src/mcd-misc.c b/src/mcd-misc.c
index 177fec3..5ec5102 100644
--- a/src/mcd-misc.c
+++ b/src/mcd-misc.c
@@ -104,8 +104,6 @@ _mcd_deepcopy_asv (GHashTable *asv)
     return copy;
 }
 
-#define MC_ERROR_PREFIX "com.nokia.MissionControl.Errors"
-
 const gchar *
 _mcd_get_error_string (const GError *error)
 {
-- 
1.5.6.5




More information about the telepathy-commits mailing list