Changeset 10532


Ignore:
Timestamp:
Apr 27, 2010, 3:10:32 AM (11 years ago)
Author:
charles
Message:

(trunk qt) #2840 "opening magnets with qt client opens new instances" -- fixed in trunk for 2.00

Location:
trunk/qt
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/qt/app.cc

    r10489 r10532  
    1515#include <iostream>
    1616
     17#include <QDBusConnection>
     18#include <QDBusError>
     19#include <QDBusMessage>
    1720#include <QDialogButtonBox>
    1821#include <QIcon>
     
    2730
    2831#include "app.h"
     32#include "dbus-adaptor.h"
    2933#include "mainwin.h"
    3034#include "options.h"
     
    3842namespace
    3943{
     44    const char * DBUS_SERVICE     ( "com.transmissionbt.Transmission"  );
     45    const char * DBUS_OBJECT_PATH ( "/com/transmissionbt/Transmission" );
     46    const char * DBUS_INTERFACE   ( "com.transmissionbt.Transmission"  );
     47
    4048    const char * MY_NAME( "transmission" );
    4149
     
    219227    for( QStringList::const_iterator it=filenames.begin(), end=filenames.end(); it!=end; ++it )
    220228        mySession->addTorrent( *it );
     229
     230    // register as the dbus handler for Transmission
     231    new TrDBusAdaptor( this );
     232    QDBusConnection bus = QDBusConnection::sessionBus();
     233    if (!bus.registerService("com.transmissionbt.Transmission"))
     234        fprintf(stderr, "%s\n", qPrintable(bus.lastError().message()));
     235    if( !bus.registerObject( "/com/transmissionbt/Transmission", this ))
     236        fprintf(stderr, "%s\n", qPrintable(bus.lastError().message()));
    221237}
    222238
     
    299315}
    300316
    301 void
    302 MyApp :: addTorrent( const QString& filename )
    303 {
    304     if( myPrefs->getBool( Prefs :: OPTIONS_PROMPT ) ) {
    305         Options * o = new Options( *mySession, *myPrefs, filename, myWindow );
    306         o->show( );
    307         QApplication :: alert( o );
    308     } else {
    309         mySession->addTorrent( filename );
    310         QApplication :: alert ( myWindow );
    311     }
    312 }
    313 
    314 
    315317/***
    316318****
    317319***/
    318320
     321void
     322MyApp :: addTorrent( const QString& key )
     323{
     324    if( !myPrefs->getBool( Prefs :: OPTIONS_PROMPT ) )
     325        mySession->addTorrent( key );
     326    else if( !QFile( key ).exists( ) )
     327        myWindow->openURL( key );
     328    else {
     329        Options * o = new Options( *mySession, *myPrefs, key, myWindow );
     330        o->show( );
     331    }
     332    raise( );
     333}
     334
     335void
     336MyApp :: raise( )
     337{
     338    QApplication :: alert ( myWindow );
     339}
     340
     341/***
     342****
     343***/
     344
    319345int
    320346main( int argc, char * argv[] )
    321347{
     348    // find .torrents, URLs, magnet links, etc in the command-line args
     349    int c;
     350    QStringList addme;
     351    const char * optarg;
     352    char ** argvv = argv;
     353    while( ( c = tr_getopt( getUsage( ), argc, (const char **)argvv, opts, &optarg ) ) )
     354        if( c == TR_OPT_UNK )
     355            addme.append( optarg );
     356
     357    // try to delegate the work to an existing copy of Transmission
     358    // before starting ourselves...
     359    bool delegated = false;
     360    QDBusConnection bus = QDBusConnection::sessionBus();
     361    for( int i=0, n=addme.size(); i<n; ++i )
     362    {
     363        const QString key = addme[i];
     364
     365        QDBusMessage request = QDBusMessage::createMethodCall( DBUS_SERVICE,
     366                                                               DBUS_OBJECT_PATH,
     367                                                               DBUS_INTERFACE,
     368                                                               "AddMetainfo" );
     369        QList<QVariant> arguments;
     370        arguments.push_back( QVariant( key ) );
     371        request.setArguments( arguments );
     372
     373        QDBusMessage response = bus.call( request );
     374        arguments = response.arguments( );
     375        delegated |= (arguments.size()==1) && arguments[0].toBool();
     376    }
     377    if( addme.empty() )
     378    {
     379        QDBusMessage request = QDBusMessage::createMethodCall( DBUS_SERVICE,
     380                                                               DBUS_OBJECT_PATH,
     381                                                               DBUS_INTERFACE,
     382                                                               "PresentWindow" );
     383        QDBusMessage response = bus.call( request );
     384        QList<QVariant> arguments = response.arguments( );
     385        delegated |= (arguments.size()==1) && arguments[0].toBool();
     386    }
     387
     388    if( delegated )
     389        return 0;
     390
     391    tr_optind = 1;
    322392    MyApp app( argc, argv );
    323393    return app.exec( );
  • trunk/qt/app.h

    r9868 r10532  
    3131        virtual ~MyApp( );
    3232
     33    public:
     34        void raise( );
     35
    3336    private:
    3437        Prefs * myPrefs;
     
    4649        void refreshPref( int key );
    4750        void refreshTorrents( );
     51
     52    public slots:
    4853        void addTorrent( const QString& );
    4954
  • trunk/qt/mainwin.cc

    r10515 r10532  
    11161116TrMainWindow :: openURL( )
    11171117{
     1118    QString tmp;
     1119    openURL( tmp );
     1120}
     1121
     1122void
     1123TrMainWindow :: openURL( QString url )
     1124{
    11181125    bool ok;
    11191126    const QString key = QInputDialog::getText( this,
     
    11211128                                               tr( "Add URL or Magnet Link" ),
    11221129                                               QLineEdit::Normal,
    1123                                                QString( ),
     1130                                               url,
    11241131                                               &ok );
    11251132    if( ok && !key.isEmpty( ) )
  • trunk/qt/mainwin.h

    r10515 r10532  
    9191        void updateNetworkIcon( );
    9292        QWidgetList myHidden;
     93
     94    public slots:
     95        void openURL( QString );
    9396
    9497    private slots:
  • trunk/qt/qtr.pro

    r9569 r10532  
    88INSTALLS += target
    99
    10 CONFIG += qt thread debug link_pkgconfig
     10CONFIG += qt qdbus thread debug link_pkgconfig
    1111QT += network
    1212PKGCONFIG = fontconfig libcurl openssl
     
    2424FORMS += mainwin.ui
    2525RESOURCES += application.qrc
    26 SOURCES += about.cc app.cc details.cc file-tree.cc filters.cc hig.cc \
    27            license.cc mainwin.cc make-dialog.cc options.cc prefs.cc \
     26SOURCES += about.cc app.cc dbus-adaptor.cc details.cc file-tree.cc filters.cc \
     27           hig.cc license.cc mainwin.cc make-dialog.cc options.cc prefs.cc \
    2828           prefs-dialog.cc qticonloader.cc relocate.cc session.cc \
    2929           session-dialog.cc squeezelabel.cc stats-dialog.cc torrent.cc \
  • trunk/qt/session.cc

    r10391 r10532  
    859859}
    860860
     861namespace
     862{
     863    bool isLink( const QString& str )
     864    {
     865        return str.startsWith( "magnet:?" )
     866            || str.startsWith( "http://" )
     867            || str.startsWith( "https://" )
     868            || str.startsWith( "ftp://" );
     869    }
     870}
     871
    861872void
    862873Session :: addTorrent( QString key, QString localPath )
     
    869880    tr_bencDictAddBool( args, "paused", !myPrefs.getBool( Prefs::START ) );
    870881
    871     // if "key" is a readable local file, add it as metadata...
    872     // otherwise it's probably a URL or magnet link, so pass it along
    873     // for the daemon to handle
    874     QFile file( key );
    875     file.open( QIODevice::ReadOnly );
    876     const QByteArray raw( file.readAll( ) );
    877     file.close( );
    878     if( !raw.isEmpty( ) )
    879     {
    880         int b64len = 0;
    881         char * b64 = tr_base64_encode( raw.constData(), raw.size(), &b64len );
    882         tr_bencDictAddRaw( args, "metainfo", b64, b64len  );
    883         tr_free( b64 );
    884     }
    885     else
    886     {
     882    // figure out what to do with "key"....
     883    bool keyHandled = false;
     884    if( !keyHandled && isLink( key  )) {
    887885        tr_bencDictAddStr( args, "filename", key.toUtf8().constData() );
     886        keyHandled = true; // it's a URL or magnet link...
     887    }
     888    if( !keyHandled ) {
     889        QFile file( key );
     890        file.open( QIODevice::ReadOnly );
     891        const QByteArray raw( file.readAll( ) );
     892        file.close( );
     893        if( !raw.isEmpty( ) ) {
     894            int b64len = 0;
     895            char * b64 = tr_base64_encode( raw.constData(), raw.size(), &b64len );
     896            tr_bencDictAddRaw( args, "metainfo", b64, b64len  );
     897            tr_free( b64 );
     898            keyHandled = true; // it's a local file...
     899        }
     900    }
     901    if( !keyHandled ) {
     902        const QByteArray tmp = key.toUtf8();
     903        tr_bencDictAddRaw( args, "metainfo", tmp.constData(), tmp.length() );
     904        keyHandled; // treat it as base64
    888905    }
    889906
Note: See TracChangeset for help on using the changeset viewer.