Update 2005-12-18
This commit is contained in:
parent
a2adf018c8
commit
48d7816c11
|
@ -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));
|
||||
}
|
||||
|
|
39
gtk/main.c
39
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 *
|
||||
|
|
138
gtk/prefs.c
138
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);
|
||||
}
|
||||
|
|
10
gtk/prefs.h
10
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 */
|
||||
|
|
Loading…
Reference in New Issue