dbus: Add __ofono_error_from_error utility function
authorPhilippe Nunes <philippe.nunes@linux.intel.com>
Wed, 30 May 2012 13:53:09 +0000 (15:53 +0200)
committerDenis Kenzior <denkenz@gmail.com>
Wed, 30 May 2012 14:03:23 +0000 (09:03 -0500)
src/dbus.c
src/ofono.h

index 5cccc32..4ae6969 100644 (file)
 
 static DBusConnection *g_connection;
 
+struct error_mapping_entry {
+       int error;
+       DBusMessage *(*ofono_error_func)(DBusMessage *);
+};
+
+struct error_mapping_entry cme_errors_mapping[] = {
+       { 3,    __ofono_error_not_allowed },
+       { 4,    __ofono_error_not_supported },
+       { 16,   __ofono_error_incorrect_password },
+       { 30,   __ofono_error_not_registered },
+       { 31,   __ofono_error_timed_out },
+       { 32,   __ofono_error_access_denied },
+       { 50,   __ofono_error_invalid_args },
+};
+
 static void append_variant(DBusMessageIter *iter,
                                int type, void *value)
 {
@@ -388,6 +403,33 @@ DBusMessage *__ofono_error_not_allowed(DBusMessage *msg)
                                        "Operation is not allowed");
 }
 
+DBusMessage *__ofono_error_from_error(const struct ofono_error *error,
+                                               DBusMessage *msg)
+{
+       struct error_mapping_entry *e;
+       int maxentries;
+       int i;
+
+       switch (error->type) {
+       case OFONO_ERROR_TYPE_CME:
+               e = cme_errors_mapping;
+               maxentries = sizeof(cme_errors_mapping) /
+                                       sizeof(struct error_mapping_entry);
+               for (i = 0; i < maxentries; i++)
+                       if (e[i].error == error->error)
+                               return e[i].ofono_error_func(msg);
+               break;
+       case OFONO_ERROR_TYPE_CMS:
+               return __ofono_error_failed(msg);
+       case OFONO_ERROR_TYPE_CEER:
+               return __ofono_error_failed(msg);
+       default:
+               return __ofono_error_failed(msg);
+       }
+
+       return __ofono_error_failed(msg);
+}
+
 void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply)
 {
        DBusConnection *conn = ofono_dbus_get_connection();
index 81d5f71..f0e1072 100644 (file)
@@ -66,6 +66,9 @@ DBusMessage *__ofono_error_emergency_active(DBusMessage *msg);
 DBusMessage *__ofono_error_incorrect_password(DBusMessage *msg);
 DBusMessage *__ofono_error_not_allowed(DBusMessage *msg);
 
+DBusMessage *__ofono_error_from_error(const struct ofono_error *error,
+                                               DBusMessage *msg);
+
 void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply);
 
 gboolean __ofono_dbus_valid_object_path(const char *path);