Changeset 17


Ignore:
Timestamp:
Jan 12, 2006, 6:55:27 PM (15 years ago)
Author:
root
Message:

Update 2005-12-18

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/beos/TRWindow.cpp

    r14 r17  
    118118/**
    119119 * Rescans the active Torrents folder, and will add all the torrents there to the
    120  * engine.
     120 * engine. Called during initial Application Start & Stop.
    121121 */
    122122void TRWindow::RescanTorrents() {
     
    160160                                transfers->AddItem(new TRTransfer(path.Path(), node));
    161161                               
    162                                 // Start the newly added torrent.
    163                                 worker_info *startData = (worker_info*)calloc(1, sizeof(worker_info));
    164                                 startData->window = this;
    165                                 startData->index = tr_torrentCount(engine) - 1;
    166                                 thread_id start_thread = spawn_thread(TRWindow::AsynchStartTorrent, "BirthCanal",
    167                                                                       B_NORMAL_PRIORITY, (void *)startData);
    168                                 if (!((start_thread) < B_OK)) {
    169                                         resume_thread(start_thread);
    170                                 } else { // Fallback and start the old way.
    171                                         StartTorrent(startData->index);
    172                                         free(startData);
     162                                bool autoStart = true;
     163                               
     164                                // Decide if we should auto-start this torrent or not.
     165                                BString prefName("download.");
     166                                prefName << path.Path() << ".running";
     167                               
     168                                Prefs *prefs = new Prefs(TRANSMISSION_SETTINGS);
     169                                if (prefs->FindBool(prefName.String(), &autoStart) != B_OK) {
     170                                        autoStart = true;
     171                                }
     172                                delete prefs;
     173                               
     174                                if (autoStart) {
     175                                        // Start the newly added torrent.
     176                                        worker_info *startData = (worker_info*)calloc(1, sizeof(worker_info));
     177                                        startData->window = this;
     178                                        startData->index = tr_torrentCount(engine) - 1;
     179                                        thread_id start_thread = spawn_thread(TRWindow::AsynchStartTorrent, "BirthCanal",
     180                                                                              B_NORMAL_PRIORITY, (void *)startData);
     181                                        if (!((start_thread) < B_OK)) {
     182                                                resume_thread(start_thread);
     183                                        } else { // Fallback and start the old way.
     184                                                StartTorrent(startData->index);
     185                                                free(startData);
     186                                        }
    173187                                }
    174188                                Unlock();
     
    247261                                // path name.
    248262                                tr_stat_t *stats;
    249                                 tr_torrentStat(engine, &stats);
     263                                int max = tr_torrentStat(engine, &stats);
    250264                                int index;
    251                                 for (index = 0; index < tr_torrentCount(engine); index++) {
     265                                for (index = 0; index < max; index++) {
    252266                                        if (strcmp(stats[index].info.torrent, path) == 0) {
    253267                                                tr_torrentClose(engine, index);
     
    308322                delete item;
    309323               
     324               
     325               
    310326                UpdateList(transfers->CurrentSelection(), true);
    311327        } else if (msg->what == B_SIMPLE_DATA) {
     
    316332}
    317333
    318 
     334/**
     335 * Handles QuitRequests.
     336 * Displays a BAlert asking if the user really wants to quit if torrents are running.
     337 * If affimative, then we'll stop all the running torrents.
     338 */
    319339bool TRWindow::QuitRequested() {
    320340        bool quit = false;
     
    349369                Prefs *prefs = new Prefs(TRANSMISSION_SETTINGS);
    350370                prefs->SetRect("window.frame", Frame());
     371               
     372                BString strItem("");
     373                for (int i = 0; i < tr_torrentStat(engine, &s); i++) {
     374                        strItem = "download.";
     375                        strItem << s[i].info.torrent << ".running";
     376                        if (s[i].status & (TR_STATUS_CHECK | TR_STATUS_DOWNLOAD | TR_STATUS_SEED)) {
     377                                prefs->SetBool(strItem.String(), true);
     378                                tr_torrentStop(engine, i);
     379                        } else {
     380                                prefs->SetBool(strItem.String(), false);
     381                        }
     382                }
     383                free(s);
    351384                delete prefs;
    352                
    353                 for (int i = 0; i < tr_torrentCount(engine); i++) {
    354                         tr_torrentStop(engine, i);
    355                 }
    356385               
    357386                be_app->PostMessage(new BMessage(B_QUIT_REQUESTED));
  • trunk/gtk/main.c

    r12 r17  
    101101actionclick(GtkWidget *widget, gpointer gdata);
    102102
    103 void
    104 makeaddwind(struct cbdata *data);
    105103gboolean
    106104addtorrent(tr_handle_t *tr, GtkWindow *parentwind, const char *torrent,
    107105           const char *dir, gboolean paused);
    108106void
    109 fileclick(GtkWidget *widget, gpointer gdata);
     107addedtorrents(void *vdata);
    110108const char *
    111109statusstr(int status);
     
    697695  switch(act) {
    698696    case ACT_OPEN:
    699       makeaddwind(data);
     697      makeaddwind(addtorrent, data->wind, data->tr, addedtorrents, data);
    700698      return;
    701699    case ACT_PREF:
     
    756754}
    757755
    758 void
    759 makeaddwind(struct cbdata *data) {
    760   GtkWidget *wind = gtk_file_selection_new("Add a Torrent");
    761 
    762   g_object_set_data(G_OBJECT(GTK_FILE_SELECTION(wind)->ok_button),
    763                     CBDATA_PTR, data);
    764   g_signal_connect(GTK_FILE_SELECTION(wind)->ok_button, "clicked",
    765                    G_CALLBACK(fileclick), wind);
    766   g_signal_connect_swapped(GTK_FILE_SELECTION(wind)->cancel_button, "clicked",
    767                            G_CALLBACK(gtk_widget_destroy), wind);
    768   gtk_window_set_transient_for(GTK_WINDOW(wind), data->wind);
    769   gtk_window_set_destroy_with_parent(GTK_WINDOW(wind), TRUE);
    770   gtk_window_set_modal(GTK_WINDOW(wind), TRUE);
    771   gtk_widget_show_all(wind);
    772 }
    773 
    774756gboolean
    775757addtorrent(tr_handle_t *tr, GtkWindow *parentwind, const char *torrent,
     
    777759  char *wd;
    778760
    779   if(NULL == dir) {
    780     dir = cf_getpref(PREF_DIR);
     761  if(NULL == dir && NULL != (dir = cf_getpref(PREF_DIR))) {
    781762    if(!mkdir_p(dir, 0777)) {
    782763      errmsg(parentwind, "Failed to create download directory %s:\n%s",
     
    810791
    811792void
    812 fileclick(GtkWidget *widget, gpointer gdata) {
    813   struct cbdata *data = g_object_get_data(G_OBJECT(widget), CBDATA_PTR);
    814   GtkWidget *wind = gdata;
    815   const char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(wind));
    816 
    817   if(addtorrent(data->tr, data->wind, file, NULL, FALSE)) {
    818     updatemodel(data);
    819     savetorrents(data->tr, data->wind, -1, NULL);
    820   }
    821 
    822   gtk_widget_destroy(wind);
     793addedtorrents(void *vdata) {
     794  struct cbdata *data = vdata;
     795
     796  updatemodel(data);
     797  savetorrents(data->tr, data->wind, -1, NULL);
    823798}
    824799
  • trunk/gtk/prefs.c

    r7 r17  
    4545};
    4646
     47struct addcb {
     48  add_torrent_func_t addfunc;
     49  GtkWindow *parent;
     50  tr_handle_t *tr;
     51  torrents_added_func_t donefunc;
     52  void *donedata;
     53  gboolean autostart;
     54  gboolean usingaltdir;
     55  GtkFileChooser *altdir;
     56  GtkButtonBox *altbox;
     57};
     58
    4759static void
    4860clicklimitbox(GtkWidget *widget, gpointer gdata);
    4961static void
    5062clickdialog(GtkWidget *widget, int resp, gpointer gdata);
     63static void
     64autoclick(GtkWidget *widget, gpointer gdata);
     65static void
     66dirclick(GtkWidget *widget, gpointer gdata);
     67static void
     68addresp(GtkWidget *widget, gint resp, gpointer gdata);
    5169
    5270void
     
    83101  pref = cf_getpref(PREF_USELIMIT);
    84102  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(limitbox),
    85     (NULL == pref ? FALSE : strbool(pref)));
     103    (NULL == pref ? TRUE : strbool(pref)));
    86104  gtk_widget_set_sensitive(limitnum,
    87105    gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(limitbox)));
     
    92110  /* limit label and entry */
    93111  label = gtk_label_new("Maximum upload speed");
    94   if(NULL != (pref = cf_getpref(PREF_LIMIT)))
    95     gtk_spin_button_set_value(GTK_SPIN_BUTTON(limitnum), strtol(pref,NULL,10));
     112  pref = cf_getpref(PREF_LIMIT);
     113  gtk_spin_button_set_value(GTK_SPIN_BUTTON(limitnum),
     114    (NULL == pref ? DEFAULT_UPLIMIT : strtol(pref,NULL,10)));
    96115  gtk_table_attach_defaults(GTK_TABLE(table), label,            0, 1, 2, 3);
    97116  gtk_table_attach_defaults(GTK_TABLE(table), limitnum,         1, 2, 2, 3);
     
    173192  const char *pref;
    174193
    175   if(NULL == (pref = cf_getpref(PREF_USELIMIT)) || !strbool(pref))
     194  if(NULL != (pref = cf_getpref(PREF_USELIMIT)) && !strbool(pref))
    176195    tr_setUploadLimit(tr, -1);
    177196  else if(NULL != (pref = cf_getpref(PREF_LIMIT)))
    178197    tr_setUploadLimit(tr, strtol(pref, NULL, 10));
    179198  else
    180     tr_setUploadLimit(tr, -1);
    181 }
     199    tr_setUploadLimit(tr, DEFAULT_UPLIMIT);
     200}
     201
     202void
     203makeaddwind(add_torrent_func_t addfunc, GtkWindow *parent, tr_handle_t *tr,
     204            torrents_added_func_t donefunc, void *donedata) {
     205  GtkWidget *wind = gtk_file_chooser_dialog_new("Add a Torrent", parent,
     206    GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
     207    GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
     208  struct addcb *data = g_new(struct addcb, 1);
     209  GtkWidget *vbox = gtk_vbox_new(FALSE, 5);
     210  GtkWidget *bbox = gtk_hbutton_box_new();
     211  GtkWidget *autocheck = gtk_check_button_new_with_label(
     212    "Automatically start torrent");
     213  GtkWidget *dircheck = gtk_check_button_new_with_label(
     214    "Use alternate download directory");
     215  GtkFileFilter *filter = gtk_file_filter_new();
     216  GtkFileFilter *unfilter = gtk_file_filter_new();
     217  GtkWidget *getdir = gtk_file_chooser_button_new(
     218    "Choose a download directory", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
     219  const char *pref;
     220
     221  data->addfunc = addfunc;
     222  data->parent = parent;
     223  data->tr = tr;
     224  data->donefunc = donefunc;
     225  data->donedata = donedata;
     226  data->autostart = TRUE;
     227  data->usingaltdir = FALSE;
     228  data->altdir = GTK_FILE_CHOOSER(getdir);
     229  data->altbox = GTK_BUTTON_BOX(bbox);
     230
     231  gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_START);
     232  gtk_box_pack_start_defaults(GTK_BOX(bbox), dircheck);
     233  gtk_box_pack_start_defaults(GTK_BOX(bbox), getdir);
     234
     235  gtk_box_pack_start_defaults(GTK_BOX(vbox), autocheck);
     236  gtk_box_pack_start_defaults(GTK_BOX(vbox), bbox);
     237
     238  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(autocheck), TRUE);
     239  if(NULL != (pref = cf_getpref(PREF_DIR)))
     240    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(getdir), pref);
     241  else {
     242    pref = g_get_current_dir();
     243    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(getdir), pref);
     244    g_free((char*)pref);
     245  }
     246
     247  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dircheck), FALSE);
     248
     249  gtk_file_filter_set_name(filter, "Torrent files");
     250  gtk_file_filter_add_pattern(filter, "*.torrent");
     251  gtk_file_filter_set_name(unfilter, "All files");
     252  gtk_file_filter_add_pattern(unfilter, "*");
     253
     254  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wind), filter);
     255  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(wind), unfilter);
     256  gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(wind), TRUE);
     257  gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(wind), vbox);
     258
     259  g_signal_connect(G_OBJECT(autocheck), "clicked", G_CALLBACK(autoclick),data);
     260  g_signal_connect(G_OBJECT(dircheck), "clicked", G_CALLBACK(dirclick), data);
     261  g_signal_connect(G_OBJECT(wind), "response", G_CALLBACK(addresp), data);
     262
     263  gtk_widget_show_all(wind);
     264  gtk_widget_hide(getdir);
     265}
     266
     267static void
     268autoclick(GtkWidget *widget, gpointer gdata) {
     269  struct addcb *data = gdata;
     270
     271  data->autostart = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
     272}
     273
     274static void
     275dirclick(GtkWidget *widget, gpointer gdata) {
     276  struct addcb *data = gdata;
     277
     278  data->usingaltdir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
     279  gtk_button_box_set_layout(data->altbox,
     280    (data->usingaltdir ? GTK_BUTTONBOX_EDGE : GTK_BUTTONBOX_START));
     281  if(data->usingaltdir)
     282    gtk_widget_show(GTK_WIDGET(data->altdir));
     283  else
     284    gtk_widget_hide(GTK_WIDGET(data->altdir));
     285}
     286
     287static void
     288addresp(GtkWidget *widget, gint resp, gpointer gdata) {
     289  struct addcb *data = gdata;
     290  GSList *files, *ii;
     291  gboolean added = FALSE;
     292  char *dir = NULL;
     293
     294  if(GTK_RESPONSE_ACCEPT == resp) {
     295    if(data->usingaltdir)
     296      dir = gtk_file_chooser_get_filename(data->altdir);
     297    files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(widget));
     298    for(ii = files; NULL != ii; ii = ii->next)
     299      if(data->addfunc(data->tr, data->parent, ii->data, dir,
     300                       !data->autostart))
     301        added = TRUE;
     302    if(added)
     303      data->donefunc(data->donedata);
     304    if(NULL != dir)
     305      g_free(dir);
     306  }
     307
     308  gtk_widget_destroy(widget);
     309}
  • trunk/gtk/prefs.h

    r7 r17  
    3636#define PREF_DIR                "download-directory"
    3737
     38#define DEFAULT_UPLIMIT         20
     39
     40typedef gboolean (*add_torrent_func_t)(tr_handle_t*, GtkWindow*, const char*, const char *, gboolean);
     41typedef void (*torrents_added_func_t)(void *);
     42
    3843void
    3944makeprefwindow(GtkWindow *parent, tr_handle_t *tr);
     
    4348setlimit(tr_handle_t *tr);
    4449
     50/* show the "add a torrent" dialog */
     51void
     52makeaddwind(add_torrent_func_t addfunc, GtkWindow *parent, tr_handle_t *tr,
     53            torrents_added_func_t donefunc, void *donedata);
     54
    4555#endif /* TG_PREFS_H */
Note: See TracChangeset for help on using the changeset viewer.