From 48d7816c11c2c7ac5b818886fa868bf45fd4fae8 Mon Sep 17 00:00:00 2001 From: Eric Petit Date: Thu, 12 Jan 2006 18:55:27 +0000 Subject: [PATCH] Update 2005-12-18 --- beos/TRWindow.cpp | 65 ++++++++++++++++------ gtk/main.c | 39 +++---------- gtk/prefs.c | 138 ++++++++++++++++++++++++++++++++++++++++++++-- gtk/prefs.h | 10 ++++ 4 files changed, 197 insertions(+), 55 deletions(-) diff --git a/beos/TRWindow.cpp b/beos/TRWindow.cpp index 559e93de9..0ca3bd07f 100644 --- a/beos/TRWindow.cpp +++ b/beos/TRWindow.cpp @@ -117,7 +117,7 @@ void TRWindow::LoadSettings() { /** * Rescans the active Torrents folder, and will add all the torrents there to the - * engine. + * engine. Called during initial Application Start & Stop. */ void TRWindow::RescanTorrents() { if (Lock()) { @@ -159,17 +159,31 @@ void TRWindow::AddEntry(BEntry *torrent) { if (addStatus == 0 && Lock()) { // Success. Add the TRTorrent item. transfers->AddItem(new TRTransfer(path.Path(), node)); - // Start the newly added torrent. - worker_info *startData = (worker_info*)calloc(1, sizeof(worker_info)); - startData->window = this; - startData->index = tr_torrentCount(engine) - 1; - thread_id start_thread = spawn_thread(TRWindow::AsynchStartTorrent, "BirthCanal", - B_NORMAL_PRIORITY, (void *)startData); - if (!((start_thread) < B_OK)) { - resume_thread(start_thread); - } else { // Fallback and start the old way. - StartTorrent(startData->index); - free(startData); + bool autoStart = true; + + // Decide if we should auto-start this torrent or not. + BString prefName("download."); + prefName << path.Path() << ".running"; + + Prefs *prefs = new Prefs(TRANSMISSION_SETTINGS); + if (prefs->FindBool(prefName.String(), &autoStart) != B_OK) { + autoStart = true; + } + delete prefs; + + if (autoStart) { + // Start the newly added torrent. + worker_info *startData = (worker_info*)calloc(1, sizeof(worker_info)); + startData->window = this; + startData->index = tr_torrentCount(engine) - 1; + thread_id start_thread = spawn_thread(TRWindow::AsynchStartTorrent, "BirthCanal", + B_NORMAL_PRIORITY, (void *)startData); + if (!((start_thread) < B_OK)) { + resume_thread(start_thread); + } else { // Fallback and start the old way. + StartTorrent(startData->index); + free(startData); + } } Unlock(); } else { @@ -246,9 +260,9 @@ void TRWindow::MessageReceived(BMessage *msg) { // Look for the torrent info in the engine with the matching // path name. tr_stat_t *stats; - tr_torrentStat(engine, &stats); + int max = tr_torrentStat(engine, &stats); int index; - for (index = 0; index < tr_torrentCount(engine); index++) { + for (index = 0; index < max; index++) { if (strcmp(stats[index].info.torrent, path) == 0) { tr_torrentClose(engine, index); transfers->RemoveItem(index); @@ -307,6 +321,8 @@ void TRWindow::MessageReceived(BMessage *msg) { delete entry; delete item; + + UpdateList(transfers->CurrentSelection(), true); } else if (msg->what == B_SIMPLE_DATA) { be_app->RefsReceived(msg); @@ -315,7 +331,11 @@ void TRWindow::MessageReceived(BMessage *msg) { BWindow::MessageReceived(msg); } - +/** + * Handles QuitRequests. + * Displays a BAlert asking if the user really wants to quit if torrents are running. + * If affimative, then we'll stop all the running torrents. + */ bool TRWindow::QuitRequested() { bool quit = false; @@ -348,11 +368,20 @@ bool TRWindow::QuitRequested() { if (quit) { Prefs *prefs = new Prefs(TRANSMISSION_SETTINGS); prefs->SetRect("window.frame", Frame()); - delete prefs; - for (int i = 0; i < tr_torrentCount(engine); i++) { - tr_torrentStop(engine, i); + BString strItem(""); + for (int i = 0; i < tr_torrentStat(engine, &s); i++) { + strItem = "download."; + strItem << s[i].info.torrent << ".running"; + if (s[i].status & (TR_STATUS_CHECK | TR_STATUS_DOWNLOAD | TR_STATUS_SEED)) { + prefs->SetBool(strItem.String(), true); + tr_torrentStop(engine, i); + } else { + prefs->SetBool(strItem.String(), false); + } } + free(s); + delete prefs; be_app->PostMessage(new BMessage(B_QUIT_REQUESTED)); } diff --git a/gtk/main.c b/gtk/main.c index c1c9c52b4..dbded9553 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -100,13 +100,11 @@ dopopupmenu(GdkEventButton *event, struct cbdata *data, GtkTreeIter *iter); void actionclick(GtkWidget *widget, gpointer gdata); -void -makeaddwind(struct cbdata *data); gboolean addtorrent(tr_handle_t *tr, GtkWindow *parentwind, const char *torrent, const char *dir, gboolean paused); void -fileclick(GtkWidget *widget, gpointer gdata); +addedtorrents(void *vdata); const char * statusstr(int status); void @@ -696,7 +694,7 @@ actionclick(GtkWidget *widget, gpointer gdata) { switch(act) { case ACT_OPEN: - makeaddwind(data); + makeaddwind(addtorrent, data->wind, data->tr, addedtorrents, data); return; case ACT_PREF: makeprefwindow(data->wind, data->tr); @@ -755,29 +753,12 @@ actionclick(GtkWidget *widget, gpointer gdata) { } } -void -makeaddwind(struct cbdata *data) { - GtkWidget *wind = gtk_file_selection_new("Add a Torrent"); - - g_object_set_data(G_OBJECT(GTK_FILE_SELECTION(wind)->ok_button), - CBDATA_PTR, data); - g_signal_connect(GTK_FILE_SELECTION(wind)->ok_button, "clicked", - G_CALLBACK(fileclick), wind); - g_signal_connect_swapped(GTK_FILE_SELECTION(wind)->cancel_button, "clicked", - G_CALLBACK(gtk_widget_destroy), wind); - gtk_window_set_transient_for(GTK_WINDOW(wind), data->wind); - gtk_window_set_destroy_with_parent(GTK_WINDOW(wind), TRUE); - gtk_window_set_modal(GTK_WINDOW(wind), TRUE); - gtk_widget_show_all(wind); -} - gboolean addtorrent(tr_handle_t *tr, GtkWindow *parentwind, const char *torrent, const char *dir, gboolean paused) { char *wd; - if(NULL == dir) { - dir = cf_getpref(PREF_DIR); + if(NULL == dir && NULL != (dir = cf_getpref(PREF_DIR))) { if(!mkdir_p(dir, 0777)) { errmsg(parentwind, "Failed to create download directory %s:\n%s", dir, strerror(errno)); @@ -809,17 +790,11 @@ addtorrent(tr_handle_t *tr, GtkWindow *parentwind, const char *torrent, } void -fileclick(GtkWidget *widget, gpointer gdata) { - struct cbdata *data = g_object_get_data(G_OBJECT(widget), CBDATA_PTR); - GtkWidget *wind = gdata; - const char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wind)); +addedtorrents(void *vdata) { + struct cbdata *data = vdata; - if(addtorrent(data->tr, data->wind, file, NULL, FALSE)) { - updatemodel(data); - savetorrents(data->tr, data->wind, -1, NULL); - } - - gtk_widget_destroy(wind); + updatemodel(data); + savetorrents(data->tr, data->wind, -1, NULL); } const char * diff --git a/gtk/prefs.c b/gtk/prefs.c index 20c017f65..cb4aa2e64 100644 --- a/gtk/prefs.c +++ b/gtk/prefs.c @@ -44,10 +44,28 @@ struct prefdata { tr_handle_t *tr; }; +struct addcb { + add_torrent_func_t addfunc; + GtkWindow *parent; + tr_handle_t *tr; + torrents_added_func_t donefunc; + void *donedata; + gboolean autostart; + gboolean usingaltdir; + GtkFileChooser *altdir; + GtkButtonBox *altbox; +}; + static void clicklimitbox(GtkWidget *widget, gpointer gdata); static void clickdialog(GtkWidget *widget, int resp, gpointer gdata); +static void +autoclick(GtkWidget *widget, gpointer gdata); +static void +dirclick(GtkWidget *widget, gpointer gdata); +static void +addresp(GtkWidget *widget, gint resp, gpointer gdata); void makeprefwindow(GtkWindow *parent, tr_handle_t *tr) { @@ -82,7 +100,7 @@ makeprefwindow(GtkWindow *parent, tr_handle_t *tr) { /* limit checkbox */ pref = cf_getpref(PREF_USELIMIT); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(limitbox), - (NULL == pref ? FALSE : strbool(pref))); + (NULL == pref ? TRUE : strbool(pref))); gtk_widget_set_sensitive(limitnum, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(limitbox))); g_signal_connect(G_OBJECT(limitbox), "clicked", @@ -91,8 +109,9 @@ makeprefwindow(GtkWindow *parent, tr_handle_t *tr) { /* limit label and entry */ label = gtk_label_new("Maximum upload speed"); - if(NULL != (pref = cf_getpref(PREF_LIMIT))) - gtk_spin_button_set_value(GTK_SPIN_BUTTON(limitnum), strtol(pref,NULL,10)); + pref = cf_getpref(PREF_LIMIT); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(limitnum), + (NULL == pref ? DEFAULT_UPLIMIT : strtol(pref,NULL,10))); gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3); gtk_table_attach_defaults(GTK_TABLE(table), limitnum, 1, 2, 2, 3); @@ -172,10 +191,119 @@ void setlimit(tr_handle_t *tr) { const char *pref; - if(NULL == (pref = cf_getpref(PREF_USELIMIT)) || !strbool(pref)) + if(NULL != (pref = cf_getpref(PREF_USELIMIT)) && !strbool(pref)) tr_setUploadLimit(tr, -1); else if(NULL != (pref = cf_getpref(PREF_LIMIT))) tr_setUploadLimit(tr, strtol(pref, NULL, 10)); else - tr_setUploadLimit(tr, -1); + tr_setUploadLimit(tr, DEFAULT_UPLIMIT); +} + +void +makeaddwind(add_torrent_func_t addfunc, GtkWindow *parent, tr_handle_t *tr, + torrents_added_func_t donefunc, void *donedata) { + GtkWidget *wind = gtk_file_chooser_dialog_new("Add a Torrent", parent, + GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); + struct addcb *data = g_new(struct addcb, 1); + GtkWidget *vbox = gtk_vbox_new(FALSE, 5); + GtkWidget *bbox = gtk_hbutton_box_new(); + GtkWidget *autocheck = gtk_check_button_new_with_label( + "Automatically start torrent"); + GtkWidget *dircheck = gtk_check_button_new_with_label( + "Use alternate download directory"); + GtkFileFilter *filter = gtk_file_filter_new(); + GtkFileFilter *unfilter = gtk_file_filter_new(); + GtkWidget *getdir = gtk_file_chooser_button_new( + "Choose a download directory", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + const char *pref; + + data->addfunc = addfunc; + data->parent = parent; + data->tr = tr; + data->donefunc = donefunc; + data->donedata = donedata; + data->autostart = TRUE; + data->usingaltdir = FALSE; + data->altdir = GTK_FILE_CHOOSER(getdir); + data->altbox = GTK_BUTTON_BOX(bbox); + + gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START); + gtk_box_pack_start_defaults(GTK_BOX(bbox), dircheck); + gtk_box_pack_start_defaults(GTK_BOX(bbox), getdir); + + gtk_box_pack_start_defaults(GTK_BOX(vbox), autocheck); + gtk_box_pack_start_defaults(GTK_BOX(vbox), bbox); + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(autocheck), TRUE); + if(NULL != (pref = cf_getpref(PREF_DIR))) + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(getdir), pref); + else { + pref = g_get_current_dir(); + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(getdir), pref); + g_free((char*)pref); + } + + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dircheck), FALSE); + + gtk_file_filter_set_name(filter, "Torrent files"); + gtk_file_filter_add_pattern(filter, "*.torrent"); + gtk_file_filter_set_name(unfilter, "All files"); + gtk_file_filter_add_pattern(unfilter, "*"); + + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wind), filter); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wind), unfilter); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(wind), TRUE); + gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(wind), vbox); + + g_signal_connect(G_OBJECT(autocheck), "clicked", G_CALLBACK(autoclick),data); + g_signal_connect(G_OBJECT(dircheck), "clicked", G_CALLBACK(dirclick), data); + g_signal_connect(G_OBJECT(wind), "response", G_CALLBACK(addresp), data); + + gtk_widget_show_all(wind); + gtk_widget_hide(getdir); +} + +static void +autoclick(GtkWidget *widget, gpointer gdata) { + struct addcb *data = gdata; + + data->autostart = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); +} + +static void +dirclick(GtkWidget *widget, gpointer gdata) { + struct addcb *data = gdata; + + data->usingaltdir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + gtk_button_box_set_layout(data->altbox, + (data->usingaltdir ? GTK_BUTTONBOX_EDGE : GTK_BUTTONBOX_START)); + if(data->usingaltdir) + gtk_widget_show(GTK_WIDGET(data->altdir)); + else + gtk_widget_hide(GTK_WIDGET(data->altdir)); +} + +static void +addresp(GtkWidget *widget, gint resp, gpointer gdata) { + struct addcb *data = gdata; + GSList *files, *ii; + gboolean added = FALSE; + char *dir = NULL; + + if(GTK_RESPONSE_ACCEPT == resp) { + if(data->usingaltdir) + dir = gtk_file_chooser_get_filename(data->altdir); + files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widget)); + for(ii = files; NULL != ii; ii = ii->next) + if(data->addfunc(data->tr, data->parent, ii->data, dir, + !data->autostart)) + added = TRUE; + if(added) + data->donefunc(data->donedata); + if(NULL != dir) + g_free(dir); + } + + gtk_widget_destroy(widget); } diff --git a/gtk/prefs.h b/gtk/prefs.h index 78108a27d..3c83a0e43 100644 --- a/gtk/prefs.h +++ b/gtk/prefs.h @@ -35,6 +35,11 @@ #define PREF_LIMIT "upload-limit" #define PREF_DIR "download-directory" +#define DEFAULT_UPLIMIT 20 + +typedef gboolean (*add_torrent_func_t)(tr_handle_t*, GtkWindow*, const char*, const char *, gboolean); +typedef void (*torrents_added_func_t)(void *); + void makeprefwindow(GtkWindow *parent, tr_handle_t *tr); @@ -42,4 +47,9 @@ makeprefwindow(GtkWindow *parent, tr_handle_t *tr); void setlimit(tr_handle_t *tr); +/* show the "add a torrent" dialog */ +void +makeaddwind(add_torrent_func_t addfunc, GtkWindow *parent, tr_handle_t *tr, + torrents_added_func_t donefunc, void *donedata); + #endif /* TG_PREFS_H */