Changeset 8669


Ignore:
Timestamp:
Jun 11, 2009, 2:51:21 PM (13 years ago)
Author:
charles
Message:

(trunk gtk) #2197: Adding a torrent from a browser sometimes doesn't work

Location:
trunk/gtk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/add-dialog.c

    r8279 r8669  
    265265    GtkWidget *      t;
    266266    GtkWidget *      l;
     267    GtkWidget *      source_chooser;
    267268    struct AddData * data;
    268269    uint8_t          flag;
     
    317318    w = gtk_file_chooser_button_new( _( "Select Source File" ),
    318319                                     GTK_FILE_CHOOSER_ACTION_OPEN );
     320    source_chooser = w;
    319321    gtk_table_attach( GTK_TABLE(
    320322                          t ), w, col, col + 1, row, row + 1, ~0, 0, 0, 0 );
    321323    gtk_label_set_mnemonic_widget( GTK_LABEL( l ), w );
    322324    addTorrentFilters( GTK_FILE_CHOOSER( w ) );
    323     if( data->filename )
    324         if( !gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( w ),
    325                                             data->filename ) )
    326             g_warning( "couldn't select '%s'", data->filename );
    327325    g_signal_connect( w, "selection-changed",
    328326                      G_CALLBACK( sourceChanged ), data );
     
    388386                      0, 0 );
    389387
     388    /* trigger sourceChanged, either directly or indirectly,
     389     * so that it creates the tor/gtor objects */
     390    w = source_chooser;
     391    if( data->filename )
     392        gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( w ), data->filename );
     393    else
     394        sourceChanged( GTK_FILE_CHOOSER_BUTTON( w ), data );
     395
    390396    gtk_box_pack_start( GTK_BOX( GTK_DIALOG( d )->vbox ), t, TRUE, TRUE, 0 );
    391397    gtk_widget_show_all( d );
  • trunk/gtk/main.c

    r8666 r8669  
    332332{
    333333    char *              err = NULL;
    334     struct cbdata *     cbdata;
    335334    GSList *            argfiles;
    336335    GError *            gerr;
     
    359358    };
    360359
    361     cbdata = g_new0( struct cbdata, 1 );
    362 
    363360    /* bind the gettext domain */
    364361    setlocale( LC_ALL, "" );
     
    393390    didinit = cf_init( configDir, NULL ); /* must come before actions_init */
    394391
    395     myUIManager = gtk_ui_manager_new ( );
    396     actions_init ( myUIManager, cbdata );
    397     gtk_ui_manager_add_ui_from_string ( myUIManager, fallback_ui_file, -1, NULL );
    398     gtk_ui_manager_ensure_update ( myUIManager );
    399     gtk_window_set_default_icon_name ( MY_NAME );
    400 
    401392    setupsighandlers( ); /* set up handlers for fatal signals */
    402393
    403     /* either get a lockfile s.t. this is the one instance of
    404      * transmission that's running, OR if there are files to
    405      * be added, delegate that to the running instance via dbus */
    406394    didlock = cf_lock( &tr_state, &err );
    407395    argfiles = checkfilenames( argc - 1, argv + 1 );
     396
    408397    if( !didlock && argfiles )
    409398    {
     399        /* We have torrents to add but there's another copy of Transmsision
     400         * running... chances are we've been invoked from a browser, etc.
     401         * So send the files over to the "real" copy of Transmission, and
     402         * if that goes well, then our work is done. */
    410403        GSList * l;
    411404        gboolean delegated = FALSE;
     405
    412406        for( l = argfiles; l; l = l->next )
    413407            delegated |= gtr_dbus_add_torrent( l->data );
    414         if( delegated )
    415             err = NULL;
     408
     409        if( delegated ) {
     410            g_slist_foreach( argfiles, (GFunc)g_free, NULL );
     411            g_slist_free( argfiles );
     412            argfiles = NULL;
     413
     414            if( err ) {
     415                g_free( err );
     416                err = NULL;
     417            }
     418        }
    416419    }
    417420    else if( ( !didlock ) && ( tr_state == TR_LOCKFILE_ELOCK ) )
    418421    {
     422        /* There's already another copy of Transmission running,
     423         * so tell it to present its window to the user */
    419424        gtr_dbus_present_window( );
    420425        err = NULL;
     
    423428    if( didlock && ( didinit || cf_init( configDir, &err ) ) )
    424429    {
     430        /* No other copy of Transmission running...
     431         * so we're going to be the primary. */
     432
    425433        const char * str;
    426434        GtkWindow * win;
    427435        tr_session * session;
     436        struct cbdata * cbdata = g_new0( struct cbdata, 1 );
    428437
    429438        /* ensure the directories are created */
     
    438447        pref_int_set( TR_PREFS_KEY_PEER_PORT, tr_sessionGetPeerPort( session ) );
    439448        cbdata->core = tr_core_new( session );
     449
     450        /* init the ui manager */
     451        myUIManager = gtk_ui_manager_new ( );
     452        actions_init ( myUIManager, cbdata );
     453        gtk_ui_manager_add_ui_from_string ( myUIManager, fallback_ui_file, -1, NULL );
     454        gtk_ui_manager_ensure_update ( myUIManager );
     455        gtk_window_set_default_icon_name ( MY_NAME );
    440456
    441457        /* create main window now to be a parent to any error dialogs */
     
    894910    struct cbdata * cbdata = gdata;
    895911
    896     gtk_window_set_urgency_hint( GTK_WINDOW( cbdata->wind ), FALSE );
     912    if( cbdata->wind )
     913        gtk_window_set_urgency_hint( GTK_WINDOW( cbdata->wind ), FALSE );
    897914}
    898915
     
    910927    g_signal_connect( w, "focus-in-event",
    911928                      G_CALLBACK( on_main_window_focus_in ),  cbdata );
    912     gtk_window_set_urgency_hint( cbdata->wind, TRUE );
     929    if( cbdata->wind )
     930        gtk_window_set_urgency_hint( cbdata->wind, TRUE );
    913931#endif
    914932}
  • trunk/gtk/tr-core-dbus.xml

    r6559 r8669  
    22<node>
    33  <interface name="com.transmissionbt.Transmission">
    4     <method name="AddFile">
     4    <method name="AddMetainfo">
    55      <arg type="b" name="handled" direction="out"/>
    6       <arg type="s" name="filename" direction="in"/>
     6      <arg type="s" name="metainfo" direction="in"/>
    77    </method>
    88    <method name="PresentWindow">
  • trunk/gtk/tr-core.c

    r8668 r8669  
    853853}
    854854
    855 static void
    856 add_filename( TrCore *     core,
    857               const char * filename,
    858               gboolean     doStart,
    859               gboolean     doPrompt )
     855static int
     856add_ctor( TrCore * core, tr_ctor * ctor, gboolean doPrompt )
     857{
     858    tr_info inf;
     859    int err = tr_torrentParse( ctor, &inf );
     860
     861    switch( err )
     862    {
     863        case TR_EINVALID:
     864            break;
     865
     866        case TR_EDUPLICATE:
     867            g_message( "it's a duplicate" );
     868            /* don't complain about .torrent files in the watch directory
     869             * that have already been added... that gets annoying and we
     870             * don't want to be nagging users to clean up their watch dirs */
     871            if( !tr_ctorGetSourceFile(ctor) || !core->priv->adding_from_watch_dir )
     872                tr_core_errsig( core, err, inf.name );
     873            tr_metainfoFree( &inf );
     874            break;
     875
     876        default:
     877            if( doPrompt )
     878                g_signal_emit( core, TR_CORE_GET_CLASS( core )->promptsig, 0, ctor );
     879            else {
     880                tr_session * session = tr_core_session( core );
     881                TrTorrent * gtor = tr_torrent_new_ctor( session, ctor, &err );
     882                g_message( "creating a gtorrent" );
     883                if( !err )
     884                    tr_core_add_torrent( core, gtor );
     885            }
     886            tr_metainfoFree( &inf );
     887            break;
     888    }
     889
     890    return err;
     891}
     892
     893/* invoked remotely via dbus. */
     894gboolean
     895tr_core_add_metainfo( TrCore      * core,
     896                      const char  * base64_metainfo,
     897                      gboolean    * setme_success,
     898                      GError     ** gerr UNUSED )
    860899{
    861900    tr_session * session = tr_core_session( core );
    862901
     902    if( !session )
     903    {
     904        *setme_success = FALSE;
     905    }
     906    else
     907    {
     908        int err;
     909        int file_length;
     910        tr_ctor * ctor;
     911        char * file_contents;
     912        gboolean do_prompt = pref_flag_get( PREF_KEY_OPTIONS_PROMPT );
     913
     914        ctor = tr_ctorNew( session );
     915        tr_core_apply_defaults( ctor );
     916
     917        file_contents = tr_base64_decode( base64_metainfo, -1, &file_length );
     918        err = tr_ctorSetMetainfo( ctor, (const uint8_t*)file_contents, file_length );
     919
     920        if( !err )
     921            err = add_ctor( core, ctor, do_prompt );
     922
     923        tr_free( file_contents );
     924        tr_core_torrents_added( core );
     925        *setme_success = TRUE;
     926    }
     927
     928    return TRUE;
     929}
     930
     931static void
     932add_filename( TrCore      * core,
     933              const char  * filename,
     934              gboolean      doStart,
     935              gboolean      doPrompt )
     936{
     937    tr_session * session = tr_core_session( core );
    863938    if( filename && session )
    864939    {
     940        int err;
    865941        tr_ctor * ctor = tr_ctorNew( session );
    866942        tr_core_apply_defaults( ctor );
    867943        tr_ctorSetPaused( ctor, TR_FORCE, !doStart );
    868 
    869         if( tr_ctorSetMetainfoFromFile( ctor, filename ) )
    870         {
     944        tr_ctorSetMetainfoFromFile( ctor, filename );
     945
     946        err = add_ctor( core, ctor, doPrompt );
     947        if( err == TR_EINVALID )
    871948            tr_core_errsig( core, TR_EINVALID, filename );
    872             tr_ctorFree( ctor );
    873         }
    874         else
    875         {
    876             tr_info inf;
    877             int err = tr_torrentParse( ctor, &inf );
    878 
    879             switch( err )
    880             {
    881                 case TR_EINVALID:
    882                     tr_core_errsig( core, err, filename );
    883                     break;
    884 
    885                 case TR_EDUPLICATE:
    886                     /* don't complain about .torrent files in the watch directory
    887                      * that have already been added... that gets annoying and we
    888                      * don't want to be naggign users to clean up their watch dirs */
    889                     if( !core->priv->adding_from_watch_dir )
    890                         tr_core_errsig( core, err, inf.name );
    891                     tr_metainfoFree( &inf );
    892                     break;
    893 
    894                 default:
    895                     if( doPrompt )
    896                         g_signal_emit( core, TR_CORE_GET_CLASS( core )->promptsig, 0, ctor );
    897                     else {
    898                         TrTorrent * gtor = tr_torrent_new_ctor( session, ctor, &err );
    899                         if( err )
    900                             tr_core_errsig( core, err, filename );
    901                         else
    902                             tr_core_add_torrent( core, gtor );
    903                     }
    904                     tr_metainfoFree( &inf );
    905                     break;
    906             }
    907         }
    908     }
    909 }
    910 
    911 gboolean
    912 tr_core_add_file( TrCore *          core,
    913                   const char *      filename,
    914                   gboolean *        success,
    915                   GError     ** err UNUSED )
    916 {
    917     add_filename( core, filename,
    918                   pref_flag_get( PREF_KEY_START ),
    919                   pref_flag_get( PREF_KEY_OPTIONS_PROMPT ) );
    920     *success = TRUE;
    921     return TRUE;
     949    }
    922950}
    923951
  • trunk/gtk/tr-core.h

    r8279 r8669  
    141141
    142142
    143 /** Add a torrent. */
    144 gboolean tr_core_add_file( TrCore*, const char * filename, gboolean * setme_success, GError **    err );
     143/** @brief Add a torrent. */
     144gboolean tr_core_add_metainfo( TrCore      * core,
     145                               const char  * base64_metainfo,
     146                               gboolean    * setme_success,
     147                               GError     ** err );
     148
    145149/** Add a torrent. */
    146150void tr_core_add_torrent( TrCore*, TrTorrent* );
  • trunk/gtk/util.c

    r8599 r8669  
    582582gtr_dbus_add_torrent( const char * filename )
    583583{
    584     static gboolean   success = FALSE;
    585 
     584    /* FIXME: why is this static? */
     585    static gboolean success = FALSE;
    586586#ifdef HAVE_DBUS_GLIB
    587     DBusGProxy *      proxy = NULL;
    588     GError *          err = NULL;
     587    DBusGProxy * proxy = NULL;
     588    GError * err = NULL;
    589589    DBusGConnection * conn;
    590     if( ( conn = dbus_g_bus_get( DBUS_BUS_SESSION, &err ) ) )
    591         proxy = dbus_g_proxy_new_for_name ( conn, VALUE_SERVICE_NAME,
    592                                             VALUE_SERVICE_OBJECT_PATH,
    593                                             VALUE_SERVICE_INTERFACE );
    594     else if( err )
    595         g_message( "err: %s", err->message );
    596     if( proxy )
    597         dbus_g_proxy_call( proxy, "AddFile", &err,
    598                            G_TYPE_STRING, filename,
    599                            G_TYPE_INVALID,
    600                            G_TYPE_BOOLEAN, &success,
    601                            G_TYPE_INVALID );
    602     if( err )
    603         g_message( "err: %s", err->message );
    604 
    605     g_object_unref( proxy );
    606     dbus_g_connection_unref( conn );
     590    char * file_contents;
     591    gsize file_length;
     592
     593    if( g_file_get_contents( filename, &file_contents, &file_length, NULL ) )
     594    {
     595        char * b64 = tr_base64_encode( file_contents, file_length, NULL );
     596        if(( conn = dbus_g_bus_get( DBUS_BUS_SESSION, &err )))
     597            proxy = dbus_g_proxy_new_for_name (conn, VALUE_SERVICE_NAME,
     598                                                     VALUE_SERVICE_OBJECT_PATH,
     599                                                     VALUE_SERVICE_INTERFACE );
     600        else if( err )
     601           g_message( "err: %s", err->message );
     602        if( proxy )
     603            dbus_g_proxy_call( proxy, "AddMetainfo", &err,
     604                               G_TYPE_STRING, b64,
     605                               G_TYPE_INVALID,
     606                               G_TYPE_BOOLEAN, &success,
     607                               G_TYPE_INVALID );
     608        if( err )
     609           g_message( "err: %s", err->message );
     610
     611        if( proxy )
     612            g_object_unref( proxy );
     613        if( conn )
     614            dbus_g_connection_unref( conn );
     615
     616        tr_free( b64 );
     617        g_free( file_contents );
     618    }
     619    else g_message( "couldn't read %s", filename );
     620
    607621#endif
    608622    return success;
Note: See TracChangeset for help on using the changeset viewer.