summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/src/main.c b/src/main.c
index 6903d8f..d2db45d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);