diff options
author | Denis Kenzior <denkenz@gmail.com> | 2011-07-12 11:16:48 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2011-07-12 11:16:48 -0500 |
commit | 947c164a67cf06777a641ab1a4f434abbc9b4adb (patch) | |
tree | 47bfd271c454e738be44d17a384dbb4a2459f7a7 /plugins/connman.c | |
parent | 4c4c5ef10763f880bdabb4c14ea1b57d6989bb57 (diff) | |
download | ofono-947c164a67cf06777a641ab1a4f434abbc9b4adb.tar.bz2 |
connman: Refactor request_reply
Diffstat (limited to 'plugins/connman.c')
-rw-r--r-- | plugins/connman.c | 94 |
1 files changed, 53 insertions, 41 deletions
diff --git a/plugins/connman.c b/plugins/connman.c index 9fdd3214..40063851 100644 --- a/plugins/connman.c +++ b/plugins/connman.c @@ -98,45 +98,28 @@ static void connman_release(int uid) g_hash_table_remove(requests, &req->uid); } -static void request_reply(DBusPendingCall *call, void *user_data) +static gboolean parse_reply(DBusMessage *reply, const char **path, + struct ofono_private_network_settings *pns) { - struct connman_req *req = user_data; - struct ofono_private_network_settings pns; DBusMessageIter array, dict, entry; - DBusMessage *reply; - const char *path; - - DBG(""); - pns.fd = -1; - pns.server_ip = NULL; - pns.peer_ip = NULL; - pns.primary_dns = NULL; - pns.secondary_dns = NULL; - - req->pending = NULL; - - reply = dbus_pending_call_steal_reply(call); if (!reply) - goto error; + return FALSE; if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) - goto error; + return FALSE; if (dbus_message_iter_init(reply, &array) == FALSE) - goto error; + return FALSE; if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_OBJECT_PATH) - goto error; + return FALSE; dbus_message_iter_get_basic(&array, &path); dbus_message_iter_next(&array); if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_ARRAY) - goto error; - - if (req->redundant == TRUE) - goto release; + return FALSE; dbus_message_iter_recurse(&array, &dict); @@ -158,56 +141,85 @@ static void request_reply(DBusPendingCall *call, void *user_data) if (g_str_equal(key, "ServerIPv4") && type == DBUS_TYPE_STRING) - dbus_message_iter_get_basic(&iter, &pns.server_ip); + dbus_message_iter_get_basic(&iter, &pns->server_ip); else if (g_str_equal(key, "PeerIPv4") && type == DBUS_TYPE_STRING) - dbus_message_iter_get_basic(&iter, &pns.peer_ip); + dbus_message_iter_get_basic(&iter, &pns->peer_ip); else if (g_str_equal(key, "PrimaryDNS") && type == DBUS_TYPE_STRING) - dbus_message_iter_get_basic(&iter, &pns.primary_dns); + dbus_message_iter_get_basic(&iter, &pns->primary_dns); else if (g_str_equal(key, "SecondaryDNS") && type == DBUS_TYPE_STRING) - dbus_message_iter_get_basic(&iter, &pns.secondary_dns); + dbus_message_iter_get_basic(&iter, &pns->secondary_dns); dbus_message_iter_next(&dict); } dbus_message_iter_next(&array); if (dbus_message_iter_get_arg_type(&array) != DBUS_TYPE_UNIX_FD) + return FALSE; + + dbus_message_iter_get_basic(&array, &pns->fd); + + return TRUE; +} + +static void request_reply(DBusPendingCall *call, void *user_data) +{ + struct connman_req *req = user_data; + DBusMessage *reply; + const char *path = NULL; + struct ofono_private_network_settings pns; + + DBG(""); + + req->pending = NULL; + + memset(&pns, 0, sizeof(pns)); + pns.fd = -1; + + reply = dbus_pending_call_steal_reply(call); + if (reply == NULL) + goto badreply; + + if (parse_reply(dbus_pending_call_steal_reply(call), + &path, &pns) == FALSE) goto error; - dbus_message_iter_get_basic(&array, &pns.fd); - DBG("Fildescriptor = %d\n", pns.fd); + DBG("fd: %d, path: %s", pns.fd, path); - req->path = g_strdup(path); - DBG("Object path = %s\n", req->path); + if (req->redundant == TRUE) + goto redundant; if (pns.server_ip == NULL || pns.peer_ip == NULL || pns.primary_dns == NULL || pns.secondary_dns == NULL || pns.fd < 0) { - ofono_error("Error while reading dictionnary...\n"); - goto release; + ofono_error("Error while reading dictionary...\n"); + goto error; } + req->path = g_strdup(path); req->cb(&pns, req->data); dbus_message_unref(reply); dbus_pending_call_unref(call); - return; -release: - connman_release(req->uid); error: - if (pns.fd >= 0) +redundant: + if (pns.fd != -1) close(pns.fd); + if (path != NULL) + send_release(path); + + dbus_message_unref(reply); + +badreply: if (req->redundant == FALSE) req->cb(NULL, req->data); - if (reply) - dbus_message_unref(reply); - + g_hash_table_remove(requests, &req->uid); dbus_pending_call_unref(call); } |