Update 2005-12-18

This commit is contained in:
Eric Petit 2006-01-12 18:55:27 +00:00
parent a2adf018c8
commit 48d7816c11
4 changed files with 197 additions and 55 deletions

View File

@ -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));
}

View File

@ -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 *

View File

@ -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);
}

View File

@ -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 */