diff options
| author | Joel Klinghed <the_jk@yahoo.com> | 2011-11-18 23:38:36 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@yahoo.com> | 2011-11-18 23:38:36 +0100 |
| commit | e41ea45dfa3e1494b051c75857f7cb5be08e92ab (patch) | |
| tree | fe21843b2cc40126ce5ef61c0f246da0068a4c40 /src/main.c | |
| parent | 8d8236e041af06e187a582e5a64d8e718d8396fc (diff) | |
Fix return value check for start, stop and rehash.
Also, make stop update the list correctly if the command was remove.
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 62 |
1 files changed, 57 insertions, 5 deletions
@@ -122,11 +122,14 @@ typedef enum /* Worker responding to a MSG_START/MSG_STOP/MSG_REHASH with uptodate * torrent state */ MSG_SYNCSTATE, + /* Worker responding to a MSG_START/MSG_STOP/MSG_REHASH that a torrent + * is removed */ + MSG_SYNCREMOVE, /* Tell worker to send a start command for torrent. * Generates a MSG_SYNCSTATE as response if no error */ MSG_START, /* Tell worker to send a stop command for torrent. - * Generates a MSG_SYNCSTATE as response if no error */ + * Generates a MSG_SYNCSTATE or MSG_SYNCREMOVE as response if no error */ MSG_STOP, /* Tell worker to send a rehash command for torrent. * Generates a MSG_SYNCSTATE as response if no error */ @@ -199,6 +202,12 @@ typedef struct typedef struct { msg_t base; + const gchar* hash; +} msg_syncremove_t; + +typedef struct +{ + msg_t base; gchar* hash; } msg_start_t; @@ -239,6 +248,7 @@ static msg_t* msg_updatelist(void); static msg_t* msg_synclist(torrent_data_t* data, torrent_data_t* added, const gchar** removed); static msg_t* msg_syncstate(const gchar* hash, state_t state); +static msg_t* msg_syncremove(const gchar* hash); static msg_t* msg_start(const gchar* hash); static msg_t* msg_stop(const gchar* hash); static msg_t* msg_rehash(const gchar* hash); @@ -681,6 +691,17 @@ gboolean incoming_msg(gpointer data) } break; } + case MSG_SYNCREMOVE: + { + msg_syncremove_t* m = (msg_syncremove_t*)msg; + if (msg->master->item_lock == m->hash) + { + msg->master->item_lock = NULL; + listselection_changed(msg->master->listselection, msg->master); + } + g_hash_table_remove(msg->master->torrents, m->hash); + break; + } case MSG_CONNECT: case MSG_DISCONNECT: case MSG_QUIT: @@ -1130,6 +1151,7 @@ gpointer worker_main(gpointer _data) { msg_start_t* m = (msg_start_t*)msg; xmlrpc_value* params, * item, * result = NULL; + xmlrpc_int ret; params = xmlrpc_array_new(&env); item = xmlrpc_string_new(&env, m->hash); xmlrpc_array_append_item(&env, params, item); @@ -1138,7 +1160,9 @@ gpointer worker_main(gpointer _data) xmlrpc_client_call2(&env, client, server, "d.resume", params, &result); xmlrpc_DECREF(params); - if (!get_bool_xmlrpc(&env, result) || env.fault_occurred) + xmlrpc_read_int(&env, result, &ret); + if (result) xmlrpc_DECREF(result); + if (env.fault_occurred || ret != 0) { worker_respond(data, msg_status("Failed to resume torrent %s (%d): %s", @@ -1174,11 +1198,14 @@ gpointer worker_main(gpointer _data) } else { + xmlrpc_int ret; xmlrpc_client_call2(&env, client, server, active ? "d.pause" : "d.erase", params, &result); xmlrpc_DECREF(params); - if (!get_bool_xmlrpc(&env, result) || env.fault_occurred) + xmlrpc_read_int(&env, result, &ret); + if (result) xmlrpc_DECREF(result); + if (env.fault_occurred || ret != 0) { worker_respond(data, msg_status("Failed to %s torrent %s (%d): %s", @@ -1188,7 +1215,14 @@ gpointer worker_main(gpointer _data) } else { - sync_torrent_state(data, &env, client, server, m->hash); + if (active) + { + sync_torrent_state(data, &env, client, server, m->hash); + } + else + { + worker_respond(data, msg_syncremove(m->hash)); + } } } msg_free(msg); @@ -1198,6 +1232,7 @@ gpointer worker_main(gpointer _data) { msg_rehash_t* m = (msg_rehash_t*)msg; xmlrpc_value* params, * item, * result = NULL; + xmlrpc_int ret; params = xmlrpc_array_new(&env); item = xmlrpc_string_new(&env, m->hash); xmlrpc_array_append_item(&env, params, item); @@ -1206,7 +1241,9 @@ gpointer worker_main(gpointer _data) xmlrpc_client_call2(&env, client, server, "d.check_hash", params, &result); xmlrpc_DECREF(params); - if (!get_bool_xmlrpc(&env, result) || env.fault_occurred) + xmlrpc_read_int(&env, result, &ret); + if (result) xmlrpc_DECREF(result); + if (env.fault_occurred || ret != 0) { worker_respond(data, msg_status("Failed to rehash torrent %s (%d): %s", @@ -1225,6 +1262,7 @@ gpointer worker_main(gpointer _data) case MSG_STATUS: case MSG_SYNCLIST: case MSG_SYNCSTATE: + case MSG_SYNCREMOVE: g_assert(FALSE); break; } @@ -1315,6 +1353,12 @@ void msg_free(msg_t* msg) g_slice_free(msg_syncstate_t, m); break; } + case MSG_SYNCREMOVE: + { + msg_syncremove_t* m = (msg_syncremove_t*)msg; + g_slice_free(msg_syncremove_t, m); + break; + } case MSG_START: { msg_start_t* m = (msg_start_t*)msg; @@ -1434,6 +1478,14 @@ msg_t* msg_syncstate(const gchar* hash, state_t state) return &msg->base; } +msg_t* msg_syncremove(const gchar* hash) +{ + msg_syncstate_t* msg = g_slice_new(msg_syncstate_t); + msg->base.type = MSG_SYNCREMOVE; + msg->hash = hash; + return &msg->base; +} + msg_t* msg_start(const gchar* hash) { msg_start_t* msg = g_slice_new(msg_start_t); |
