---
 src/call-barring.c    |   63 ++++++++++++++----------------------------------
 src/call-forwarding.c |   63 +++++++++++++++++-------------------------------
 src/call-settings.c   |   34 ++++++++------------------
 src/ussd.c            |   56 ++++++++++++++++++++++++++++--------------
 4 files changed, 89 insertions(+), 127 deletions(-)

diff --git a/src/call-barring.c b/src/call-barring.c
index d1a44cc..3145de5 100644
--- a/src/call-barring.c
+++ b/src/call-barring.c
@@ -359,25 +359,19 @@ static const char *cb_ss_service_to_fac(const char *svc)
        return NULL;
 }
 
-static gboolean cb_ss_control(int type, const char *sc,
+static int cb_ss_control(int type, const char *sc,
                                const char *sia, const char *sib,
                                const char *sic, const char *dn,
                                DBusMessage *msg, void *data)
 {
        struct ofono_call_barring *cb = data;
-       DBusConnection *conn = ofono_dbus_get_connection();
        int cls = BEARER_CLASS_DEFAULT;
        const char *fac;
-       DBusMessage *reply;
        void *operation = NULL;
        int i;
 
-       if (__ofono_call_barring_is_busy(cb)) {
-               reply = __ofono_error_busy(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (__ofono_call_barring_is_busy(cb))
+               return EBUSY;
 
        DBG("Received call barring ss control request");
 
@@ -386,7 +380,7 @@ static gboolean cb_ss_control(int type, const char *sc,
 
        fac = cb_ss_service_to_fac(sc);
        if (!fac)
-               return FALSE;
+               return -ENOENT;
 
        cb_set_query_bounds(cb, fac, type == SS_CONTROL_TYPE_QUERY);
 
@@ -397,13 +391,13 @@ static gboolean cb_ss_control(int type, const char *sc,
        cb->ss_req_lock = i;
 
        if (strlen(sic) > 0)
-               goto bad_format;
+               return EINVAL;
 
        if (strlen(dn) > 0)
-               goto bad_format;
+               return EINVAL;
 
        if (type != SS_CONTROL_TYPE_QUERY && !is_valid_pin(sia, PIN_TYPE_NET))
-               goto bad_format;
+               return EINVAL;
 
        switch (type) {
        case SS_CONTROL_TYPE_ACTIVATION:
@@ -419,12 +413,8 @@ static gboolean cb_ss_control(int type, const char *sc,
                break;
        }
 
-       if (!operation) {
-               reply = __ofono_error_not_implemented(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (!operation)
+               return ENOSYS;
 
        /* According to 27.007, AG, AC and AB only work with mode = 0
         * We support query by querying all relevant types, since we must
@@ -433,7 +423,7 @@ static gboolean cb_ss_control(int type, const char *sc,
        if ((!strcmp(fac, "AG") || !strcmp(fac, "AC") || !strcmp(fac, "AB")) &&
                (type == SS_CONTROL_TYPE_ACTIVATION ||
                        type == SS_CONTROL_TYPE_REGISTRATION))
-               goto bad_format;
+               return EINVAL;
 
        if (strlen(sib) > 0) {
                long service_code;
@@ -442,12 +432,12 @@ static gboolean cb_ss_control(int type, const char *sc,
                service_code = strtoul(sib, &end, 10);
 
                if (end == sib || *end != '\0')
-                       goto bad_format;
+                       return EINVAL;
 
                cls = mmi_service_code_to_bearer_class(service_code);
 
                if (cls == 0)
-                       goto bad_format;
+                       return EINVAL;
        }
 
        cb->ss_req_cls = cls;
@@ -472,12 +462,7 @@ static gboolean cb_ss_control(int type, const char *sc,
                break;
        }
 
-       return TRUE;
-
-bad_format:
-       reply = __ofono_error_invalid_format(msg);
-       g_dbus_send_message(conn, reply);
-       return TRUE;
+       return 0;
 }
 
 static void cb_set_passwd_callback(const struct ofono_error *error, void *data)
@@ -495,21 +480,15 @@ static void cb_set_passwd_callback(const struct 
ofono_error *error, void *data)
        __ofono_dbus_pending_reply(&cb->pending, reply);
 }
 
-static gboolean cb_ss_passwd(const char *sc,
+static int cb_ss_passwd(const char *sc,
                                const char *old, const char *new,
                                DBusMessage *msg, void *data)
 {
        struct ofono_call_barring *cb = data;
-       DBusConnection *conn = ofono_dbus_get_connection();
-       DBusMessage *reply;
        const char *fac;
 
-       if (__ofono_call_barring_is_busy(cb)) {
-               reply = __ofono_error_busy(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (__ofono_call_barring_is_busy(cb))
+               return EBUSY;
 
        DBG("Received call barring ss password change request");
 
@@ -521,19 +500,15 @@ static gboolean cb_ss_passwd(const char *sc,
                fac = cb_ss_service_to_fac(sc);
 
        if (!fac)
-               return FALSE;
+               return -ENOENT;
 
        if (!is_valid_pin(old, PIN_TYPE_NET) || !is_valid_pin(new, 
PIN_TYPE_NET))
-               goto bad_format;
+               return EINVAL;
 
        cb->pending = dbus_message_ref(msg);
        cb->driver->set_passwd(cb, fac, old, new, cb_set_passwd_callback, cb);
 
-       return TRUE;
-bad_format:
-       reply = __ofono_error_invalid_format(msg);
-       g_dbus_send_message(conn, reply);
-       return TRUE;
+       return 0;
 }
 
 static void cb_register_ss_controls(struct ofono_call_barring *cb)
diff --git a/src/call-forwarding.c b/src/call-forwarding.c
index ea72913..4a0f1cd 100644
--- a/src/call-forwarding.c
+++ b/src/call-forwarding.c
@@ -880,30 +880,24 @@ static void cf_ss_control_callback(const struct 
ofono_error *error, void *data)
        ss_set_query_next_cf_cond(cf);
 }
 
-static gboolean cf_ss_control(int type, const char *sc,
+static int cf_ss_control(int type, const char *sc,
                                const char *sia, const char *sib,
                                const char *sic, const char *dn,
                                DBusMessage *msg, void *data)
 {
        struct ofono_call_forwarding *cf = data;
-       DBusConnection *conn = ofono_dbus_get_connection();
        int cls = BEARER_CLASS_SS_DEFAULT;
        int timeout = DEFAULT_NO_REPLY_TIMEOUT;
        int cf_type;
-       DBusMessage *reply;
        struct ofono_phone_number ph;
        void *operation = NULL;
 
        /* Before we do anything, make sure we're actually initialized */
        if (!cf)
-               return FALSE;
+               return -ENOENT;
 
-       if (__ofono_call_forwarding_is_busy(cf)) {
-               reply = __ofono_error_busy(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (__ofono_call_forwarding_is_busy(cf))
+               return EBUSY;
 
        DBG("Received call forwarding ss control request");
 
@@ -923,13 +917,13 @@ static gboolean cf_ss_control(int type, const char *sc,
        else if (!strcmp(sc, "004"))
                cf_type = CALL_FORWARDING_TYPE_ALL_CONDITIONAL;
        else
-               return FALSE;
+               return -ENOENT;
 
        if (strlen(sia) &&
-               (type == SS_CONTROL_TYPE_QUERY ||
-               type == SS_CONTROL_TYPE_ERASURE ||
-               type == SS_CONTROL_TYPE_DEACTIVATION))
-               goto error;
+                       (type == SS_CONTROL_TYPE_QUERY ||
+                       type == SS_CONTROL_TYPE_ERASURE ||
+                       type == SS_CONTROL_TYPE_DEACTIVATION))
+               return EINVAL;
 
        /* Activation / Registration is figured context specific according to
         * 22.030 Section 6.5.2 "The UE shall determine from the context
@@ -940,8 +934,8 @@ static gboolean cf_ss_control(int type, const char *sc,
                type = SS_CONTROL_TYPE_REGISTRATION;
 
        if (type == SS_CONTROL_TYPE_REGISTRATION &&
-               !valid_phone_number_format(sia))
-               goto error;
+                       !valid_phone_number_format(sia))
+               return EINVAL;
 
        if (strlen(sib) > 0) {
                long service_code;
@@ -950,32 +944,32 @@ static gboolean cf_ss_control(int type, const char *sc,
                service_code = strtoul(sib, &end, 10);
 
                if (end == sib || *end != '\0')
-                       goto error;
+                       return EINVAL;
 
                cls = mmi_service_code_to_bearer_class(service_code);
 
                if (cls == 0)
-                       goto error;
+                       return EINVAL;
        }
 
        if (strlen(sic) > 0) {
                char *end;
 
                if  (type != SS_CONTROL_TYPE_REGISTRATION)
-                       goto error;
+                       return EINVAL;
 
                if (cf_type != CALL_FORWARDING_TYPE_ALL &&
                        cf_type != CALL_FORWARDING_TYPE_ALL_CONDITIONAL &&
                        cf_type != CALL_FORWARDING_TYPE_NO_REPLY)
-                       goto error;
+                       return EINVAL;
 
                timeout = strtoul(sic, &end, 10);
 
                if (end == sic || *end != '\0')
-                       goto error;
+                       return EINVAL;
 
                if (timeout < 1 || timeout > 30)
-                       goto error;
+                       return EINVAL;
        }
 
        switch (type) {
@@ -996,21 +990,13 @@ static gboolean cf_ss_control(int type, const char *sc,
                break;
        }
 
-       if (!operation) {
-               reply = __ofono_error_not_implemented(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (!operation)
+               return ENOSYS;
 
        cf->ss_req = g_try_new0(struct cf_ss_request, 1);
 
-       if (!cf->ss_req) {
-               reply = __ofono_error_failed(msg);
-               g_dbus_send_message(conn, reply);
-
-               return TRUE;
-       }
+       if (!cf->ss_req)
+               return ENOMEM;
 
        cf->ss_req->ss_type = type;
        cf->ss_req->cf_type = cf_type;
@@ -1065,12 +1051,7 @@ static gboolean cf_ss_control(int type, const char *sc,
                break;
        }
 
-       return TRUE;
-
-error:
-       reply = __ofono_error_invalid_format(msg);
-       g_dbus_send_message(conn, reply);
-       return TRUE;
+       return 0;
 }
 
 static void cf_register_ss_controls(struct ofono_call_forwarding *cf)
diff --git a/src/call-settings.c b/src/call-settings.c
index 16abc5e..dfa23d6 100644
--- a/src/call-settings.c
+++ b/src/call-settings.c
@@ -402,35 +402,29 @@ static void cw_ss_set_callback(const struct ofono_error 
*error, void *data)
                                cw_ss_query_callback, cs);
 }
 
-static gboolean cw_ss_control(int type,
+static int cw_ss_control(int type,
                                const char *sc, const char *sia,
                                const char *sib, const char *sic,
                                const char *dn, DBusMessage *msg, void *data)
 {
        struct ofono_call_settings *cs = data;
-       DBusConnection *conn = ofono_dbus_get_connection();
        int cls = BEARER_CLASS_SS_DEFAULT;
-       DBusMessage *reply;
 
        if (!cs)
-               return FALSE;
+               return -ENOENT;
 
        if (strcmp(sc, "43"))
-               return FALSE;
+               return -ENOENT;
 
-       if (__ofono_call_settings_is_busy(cs)) {
-               reply = __ofono_error_busy(msg);
-               goto error;
-       }
+       if (__ofono_call_settings_is_busy(cs))
+               return EBUSY;
 
        if (strlen(sib) || strlen(sib) || strlen(dn))
-               goto bad_format;
+               return EINVAL;
 
        if ((type == SS_CONTROL_TYPE_QUERY && !cs->driver->cw_query) ||
-               (type != SS_CONTROL_TYPE_QUERY && !cs->driver->cw_set)) {
-               reply = __ofono_error_not_implemented(msg);
-               goto error;
-       }
+                       (type != SS_CONTROL_TYPE_QUERY && !cs->driver->cw_set))
+               return ENOSYS;
 
        if (strlen(sia) > 0) {
                long service_code;
@@ -439,11 +433,11 @@ static gboolean cw_ss_control(int type,
                service_code = strtoul(sia, &end, 10);
 
                if (end == sia || *end != '\0')
-                       goto bad_format;
+                       return EINVAL;
 
                cls = mmi_service_code_to_bearer_class(service_code);
                if (cls == 0)
-                       goto bad_format;
+                       return EINVAL;
        }
 
        cs->ss_req_cls = cls;
@@ -477,13 +471,7 @@ static gboolean cw_ss_control(int type,
                break;
        }
 
-       return TRUE;
-
-bad_format:
-       reply = __ofono_error_invalid_format(msg);
-error:
-       g_dbus_send_message(conn, reply);
-       return TRUE;
+       return 0;
 }
 
 static void generate_ss_query_reply(struct ofono_call_settings *cs,
diff --git a/src/ussd.c b/src/ussd.c
index bbb9aed..6119573 100644
--- a/src/ussd.c
+++ b/src/ussd.c
@@ -205,32 +205,29 @@ static gboolean recognized_passwd_change_string(struct 
ofono_ussd *ussd,
                break;
 
        default:
-               return FALSE;
+               return -ENOENT;
        }
 
        if (strcmp(sc, "03") || strlen(dn))
-               return FALSE;
+               return -ENOENT;
 
        /* If SIC & SID don't match, then we just bail out here */
-       if (strcmp(sic, sid)) {
-               DBusConnection *conn = ofono_dbus_get_connection();
-               DBusMessage *reply = __ofono_error_invalid_format(msg);
-               g_dbus_send_message(conn, reply);
-               return TRUE;
-       }
+       if (strcmp(sic, sid))
+               return EINVAL;
 
        while ((l = g_slist_find_custom(l, sia,
                        ssc_entry_find_by_service)) != NULL) {
                struct ssc_entry *entry = l->data;
                ofono_ussd_passwd_cb_t cb = entry->cb;
+               int result = cb(sia, sib, sic, msg, entry->user);
 
-               if (cb(sia, sib, sic, msg, entry->user))
-                       return TRUE;
+               if (result >= 0)
+                       return result;
 
                l = l->next;
        }
 
-       return FALSE;
+       return -ENOENT;
 }
 
 static gboolean recognized_control_string(struct ofono_ussd *ussd,
@@ -240,7 +237,8 @@ static gboolean recognized_control_string(struct ofono_ussd 
*ussd,
        char *str = g_strdup(ss_str);
        char *sc, *sia, *sib, *sic, *sid, *dn;
        int type;
-       gboolean ret = FALSE;
+       int ret = -ENOENT;
+       int result;
 
        DBG("parsing control string");
 
@@ -254,9 +252,11 @@ static gboolean recognized_control_string(struct 
ofono_ussd *ussd,
                /* A password change string needs to be treated separately
                 * because it uses a fourth SI and is thus not a valid
                 * control string.  */
-               if (recognized_passwd_change_string(ussd, type, sc,
-                                       sia, sib, sic, sid, dn, msg)) {
-                       ret = TRUE;
+               result = recognized_passwd_change_string(ussd, type, sc,
+                                               sia, sib, sic, sid, dn, msg);
+
+               if (result >= 0) {
+                       ret = result;
                        goto out;
                }
 
@@ -268,8 +268,11 @@ static gboolean recognized_control_string(struct 
ofono_ussd *ussd,
                        struct ssc_entry *entry = l->data;
                        ofono_ussd_ssc_cb_t cb = entry->cb;
 
-                       if (cb(type, sc, sia, sib, sic, dn, msg, entry->user)) {
-                               ret = TRUE;
+                       result = cb(type, sc, sia, sib, sic, dn, msg,
+                                                               entry->user);
+
+                       if (result >= 0) {
+                               ret = result;
                                goto out;
                        }
 
@@ -547,6 +550,7 @@ static DBusMessage *ussd_initiate(DBusConnection *conn, 
DBusMessage *msg,
        int dcs = 0x0f;
        unsigned char buf[160];
        long num_packed;
+       int result;
 
        if (__ofono_ussd_is_busy(ussd))
                return __ofono_error_busy(msg);
@@ -559,8 +563,22 @@ static DBusMessage *ussd_initiate(DBusConnection *conn, 
DBusMessage *msg,
                return __ofono_error_invalid_format(msg);
 
        DBG("checking if this is a recognized control string");
-       if (recognized_control_string(ussd, str, msg))
-               return NULL;
+
+       result = recognized_control_string(ussd, str, msg);
+       if (result >= 0) {
+               switch (result) {
+               case EBUSY:
+                       return __ofono_error_busy(msg);
+               case EINVAL:
+                       return __ofono_error_invalid_format(msg);
+               case ENOSYS:
+                       return __ofono_error_not_implemented(msg);
+               case ENOMEM:
+                       return __ofono_error_failed(msg);
+               default:
+                       return NULL;
+               }
+       }
 
        DBG("No.., checking if this is a USSD string");
        if (!valid_ussd_string(str))
-- 
1.7.2.3

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to