Changeset 9545


Ignore:
Timestamp:
Nov 22, 2009, 4:20:22 PM (13 years ago)
Author:
charles
Message:

(trunk gtk) #2556: add a torrent from a URL. works from the menu and from URLs passed in the command line at startup

Location:
trunk/gtk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/actions.c

    r9094 r9545  
    103103    { "edit-menu", NULL, N_( "_Edit" ), NULL, NULL, NULL },
    104104    { "help-menu", NULL, N_( "_Help" ), NULL, NULL, NULL },
     105    { "add-torrent-from-url",  GTK_STOCK_ADD, N_("Add _URL..." ), NULL, N_( "Add URL" ),  G_CALLBACK( action_cb ) },
    105106    { "add-torrent-toolbar",  GTK_STOCK_ADD, NULL, NULL, N_( "Add a torrent" ),  G_CALLBACK( action_cb ) },
    106107    { "add-torrent-menu", GTK_STOCK_ADD, N_( "_Add..." ), "<control>D", N_( "Add a torrent" ), G_CALLBACK( action_cb ) },
  • trunk/gtk/add-dialog.c

    r9338 r9545  
    1313#include <glib/gi18n.h>
    1414#include <gtk/gtk.h>
     15
    1516#include "add-dialog.h"
    1617#include "conf.h"
     
    2829get_recent_destinations( void )
    2930{
    30     int      i;
     31    int i;
    3132    GSList * list = NULL;
    3233
    33     for( i = 0; i < N_RECENT; ++i )
    34     {
    35         char         key[64];
     34    for( i=0; i<N_RECENT; ++i )
     35    {
     36        char key[64];
    3637        const char * val;
    37         g_snprintf( key, sizeof( key ), "recent-download-dir-%d", i + 1 );
    38         if( ( val = pref_string_get( key ) ) )
     38        g_snprintf( key, sizeof( key ), "recent-download-dir-%d", i+1 );
     39        if(( val = pref_string_get( key )))
    3940            list = g_slist_append( list, (void*)val );
    4041    }
     
    4546save_recent_destination( TrCore * core, const char * dir  )
    4647{
    47     int      i;
     48    int i;
     49    GSList * l;
    4850    GSList * list = get_recent_destinations( );
    49     GSList * l;
    50 
    51     if( !dir )
     51
     52    if( dir == NULL )
    5253        return;
    5354
    5455    /* if it was already in the list, remove it */
    55     if( ( l = g_slist_find_custom( list, dir, (GCompareFunc)strcmp ) ) )
     56    if(( l = g_slist_find_custom( list, dir, (GCompareFunc)strcmp )))
    5657        list = g_slist_delete_link( list, l );
    5758
     
    6162    /* make local copies of the strings that aren't
    6263     * invalidated by pref_string_set() */
    63     for( l = list; l; l = l->next )
     64    for( l=list; l; l=l->next )
    6465        l->data = g_strdup( l->data );
    6566
    6667    /* save the first N_RECENT directories */
    67     for( l = list, i = 0; l && ( i < N_RECENT ); ++i, l = l->next )
    68     {
     68    for( l=list, i=0; l && ( i<N_RECENT ); ++i, l=l->next ) {
    6969        char key[64];
    7070        g_snprintf( key, sizeof( key ), "recent-download-dir-%d", i + 1 );
     
    468468}
    469469
     470/***
     471****
     472***/
     473
     474static void
     475onAddURLResponse( GtkDialog * dialog, int response, gpointer user_data )
     476{
     477    gboolean destroy = TRUE;
     478
     479    if( response == GTK_RESPONSE_ACCEPT )
     480    {
     481        GtkWidget * e = GTK_WIDGET( g_object_get_data( G_OBJECT( dialog ), "url-entry" ) );
     482        char * url = g_strdup( gtk_entry_get_text( GTK_ENTRY( e ) ) );
     483        g_strstrip( url );
     484
     485        if( url && *url )
     486        {
     487            TrCore * core = user_data;
     488
     489            if( gtr_is_supported_url( url ) )
     490            {
     491                tr_core_add_from_url( core, url );
     492            }
     493            else
     494            {
     495                GtkWidget * w = gtk_message_dialog_new( GTK_WINDOW( dialog ),
     496                                                        GTK_DIALOG_MODAL,
     497                                                        GTK_MESSAGE_ERROR,
     498                                                        GTK_BUTTONS_CLOSE,
     499                                                        "%s", _( "Unrecognized URL" ) );
     500                gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( w ),
     501                    _( "Transmission doesn't know how to use \"%s\"" ), url );
     502                gtk_dialog_run( GTK_DIALOG( w ) );
     503                gtk_widget_destroy( w );
     504                destroy = FALSE;
     505            }
     506        }
     507    }
     508
     509    if( destroy )
     510        gtk_widget_destroy( GTK_WIDGET( dialog ) );
     511}
     512
     513GtkWidget*
     514addURLDialog( GtkWindow * parent, TrCore * core )
     515{
     516    int row;
     517    GtkWidget * e;
     518    GtkWidget * t;
     519    GtkWidget * w;
     520
     521    w = gtk_dialog_new_with_buttons( _( "Add a URL" ), parent,
     522                                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
     523                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
     524                                     GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT,
     525                                     NULL );
     526    gtk_dialog_set_alternative_button_order( GTK_DIALOG( w ),
     527                                             GTK_RESPONSE_ACCEPT,
     528                                             GTK_RESPONSE_CANCEL,
     529                                             -1 );
     530    g_signal_connect( w, "response", G_CALLBACK( onAddURLResponse ), core );
     531
     532    row = 0;
     533    t = hig_workarea_create( );
     534    hig_workarea_add_section_title( t, &row, _( "Add torrent from URL" ) );
     535    e = gtk_entry_new( );
     536    g_object_set_data( G_OBJECT( w ), "url-entry", e );
     537    hig_workarea_add_row( t, &row, _( "_URL" ), e, NULL );
     538   
     539    gtk_box_pack_start( GTK_BOX( GTK_DIALOG( w )->vbox ), t, TRUE, TRUE, 0 );
     540    gtk_widget_show_all( t );
     541    gtk_widget_show( w );
     542    return w;
     543}
  • trunk/gtk/add-dialog.h

    r7658 r9545  
    2525                      TrCore *    core );
    2626
     27GtkWidget* addURLDialog( GtkWindow * parent,
     28                         TrCore *    core );
     29
    2730#endif /* TR_GTK_ADD_DIALOG */
  • trunk/gtk/main.c

    r9528 r9545  
    365365
    366366    gerr = NULL;
    367     if( !gtk_init_with_args( &argc, &argv, (char*)_( "[torrent files]" ), entries,
     367    if( !gtk_init_with_args( &argc, &argv, (char*)_( "[torrent files or urls]" ), entries,
    368368                             (char*)domain, &gerr ) )
    369369    {
     
    13571357    gboolean        changed = FALSE;
    13581358
    1359     if(  !strcmp( action_name, "add-torrent-menu" )
     1359    if( !strcmp( action_name, "add-torrent-from-url" ) )
     1360    {
     1361        addURLDialog( data->wind, data->core );
     1362    }
     1363    else if(  !strcmp( action_name, "add-torrent-menu" )
    13601364      || !strcmp( action_name, "add-torrent-toolbar" ) )
    13611365    {
  • trunk/gtk/tr-core.c

    r9486 r9545  
    3939#include <libtransmission/json.h>
    4040#include <libtransmission/utils.h> /* tr_free */
     41#include <libtransmission/web.h>
    4142
    4243#include "conf.h"
     
    976977}
    977978
     979/***
     980****
     981***/
     982
     983struct url_dialog_data
     984{
     985    TrCore * core;
     986    tr_ctor * ctor;
     987    GtkDialog * dialog;
     988};
     989
     990static gboolean
     991onURLDoneIdle( gpointer vdata )
     992{
     993    struct url_dialog_data * data = vdata;
     994    tr_core_add_ctor( data->core, data->ctor );
     995    g_free( data );
     996    return FALSE;
     997}
     998
     999static void
     1000onURLDone( tr_session       * session,
     1001           long               response_code UNUSED,
     1002           const void       * response,
     1003           size_t             response_byte_count,
     1004           void             * vdata )
     1005{
     1006    struct url_dialog_data * data = vdata;
     1007    tr_ctor * ctor = tr_ctorNew( session );
     1008
     1009    /* FIME: error dialog */
     1010
     1011    if( tr_ctorSetMetainfo( ctor, response, response_byte_count ) )
     1012    {
     1013        tr_ctorFree( ctor );
     1014        g_free( data );
     1015    }
     1016    else /* move the work back to the gtk thread */
     1017    {
     1018        data->ctor = ctor;
     1019        gtr_idle_add( onURLDoneIdle, data );
     1020    }
     1021}
     1022
     1023void
     1024tr_core_add_from_url( TrCore * core, const char * url )
     1025{
     1026    if( gtr_is_magnet_link( url ) )
     1027    {
     1028        g_message( "FIXME: magnet link \"%s\" not handled", url );
     1029    }
     1030    else
     1031    {
     1032        struct url_dialog_data * data = g_new( struct url_dialog_data, 1 );
     1033        data->core = core;
     1034        tr_webRun( tr_core_session( core ), url, NULL, onURLDone, data );
     1035    }
     1036}
     1037
     1038/***
     1039****
     1040***/
     1041
    9781042static void
    9791043add_filename( TrCore      * core,
     
    9841048{
    9851049    tr_session * session = tr_core_session( core );
    986     if( filename && session )
     1050
     1051    if( session == NULL )
     1052        return;
     1053
     1054    if( gtr_is_supported_url( filename ) )
     1055    {
     1056        tr_core_add_from_url( core, filename );
     1057    }
     1058    else /* try it as a local file */
    9871059    {
    9881060        int err;
     1061
    9891062        tr_ctor * ctor = tr_ctorNew( session );
     1063        tr_ctorSetMetainfoFromFile( ctor, filename );
    9901064        tr_core_apply_defaults( ctor );
    9911065        tr_ctorSetPaused( ctor, TR_FORCE, !doStart );
    992         tr_ctorSetMetainfoFromFile( ctor, filename );
    9931066
    9941067        err = add_ctor( core, ctor, doPrompt, doNotify );
  • trunk/gtk/tr-core.h

    r9130 r9545  
    136136                               GError     ** err );
    137137
     138/** @brief Add a torrent from a URL */
     139void tr_core_add_from_url( TrCore * core, const char * url );
     140
    138141/** @brief Add a torrent.
    139142    @param ctor this function assumes ownership of the ctor */
  • trunk/gtk/ui.h

    r9483 r9545  
    44    "    <menu action='torrent-menu'>\n"
    55    "      <menuitem action='add-torrent-menu'/>\n"
     6    "      <menuitem action='add-torrent-from-url'/>\n"
    67    "      <menuitem action='new-torrent'/>\n"
    78    "      <separator/>\n"
  • trunk/gtk/util.c

    r9172 r9545  
    323323}
    324324
     325
     326gboolean
     327gtr_is_supported_url( const char * str )
     328{
     329    return gtr_is_magnet_link( str )
     330        || !strncmp( str, "ftp://", 6 )
     331        || !strncmp( str, "http://", 7 )
     332        || !strncmp( str, "https://", 8 );
     333}
     334
     335gboolean
     336gtr_is_magnet_link( const char * str )
     337{
     338    return !strncmp( str, "magnet:?", 8 );
     339}
     340
    325341GSList *
    326 checkfilenames( int    argc,
    327                 char **argv )
    328 {
    329     int      i;
     342checkfilenames( int argc, char **argv )
     343{
     344    int i;
    330345    GSList * ret = NULL;
    331     char *   pwd = g_get_current_dir( );
    332 
    333     for( i = 0; i < argc; ++i )
    334     {
    335         char * filename = g_path_is_absolute( argv[i] )
    336                           ? g_strdup ( argv[i] )
    337                           : g_build_filename( pwd, argv[i], NULL );
    338 
    339         if( g_file_test( filename, G_FILE_TEST_EXISTS ) )
    340             ret = g_slist_prepend( ret, filename );
    341         else
    342             g_free( filename );
     346    char * pwd = g_get_current_dir( );
     347
     348    for( i=0; i<argc; ++i )
     349    {
     350        if( gtr_is_supported_url( argv[i] ) )
     351        {
     352            ret = g_slist_prepend( ret, g_strdup( argv[i] ) );
     353        }
     354        else /* local file */
     355        {
     356            char * filename = g_path_is_absolute( argv[i] )
     357                            ? g_strdup ( argv[i] )
     358                            : g_build_filename( pwd, argv[i], NULL );
     359
     360            if( g_file_test( filename, G_FILE_TEST_EXISTS ) )
     361                ret = g_slist_prepend( ret, filename );
     362            else
     363                g_free( filename );
     364        }
    343365    }
    344366
  • trunk/gtk/util.h

    r8929 r9545  
    4343****
    4444***/
     45
     46gboolean gtr_is_supported_url( const char * str );
     47
     48gboolean gtr_is_magnet_link( const char * str );
    4549
    4650/* create a copy of a GSList of strings, this dups the actual strings too */
Note: See TracChangeset for help on using the changeset viewer.