Changeset 11087


Ignore:
Timestamp:
Aug 1, 2010, 6:55:04 PM (12 years ago)
Author:
charles
Message:

(trunk) #3450 "regression: Qt client dbus support broken" -- fixed

Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/tr-core-dbus.xml

    r10717 r11087  
    55      <arg type="b" name="handled" direction="out"/>
    66      <arg type="s" name="metainfo" direction="in"/>
    7       <arg type="s" name="filename" direction="in"/>
    87    </method>
    98    <method name="PresentWindow">
  • trunk/gtk/tr-core.c

    r11086 r11087  
    10271027tr_core_add_metainfo( TrCore      * core,
    10281028                      const char  * payload,
    1029                       const char  * filename,
    10301029                      gboolean    * setme_handled,
    10311030                      GError     ** gerr UNUSED )
     
    10421041        *setme_handled = TRUE;
    10431042    }
    1044     else
    1045     {
     1043    else /* base64-encoded metainfo */
     1044    {
     1045        int file_length;
    10461046        tr_ctor * ctor;
    1047         gboolean has_metainfo = FALSE;
    1048         const gboolean do_prompt = pref_flag_get( PREF_KEY_OPTIONS_PROMPT );
    1049 
    1050         /* create the constructor */
     1047        char * file_contents;
     1048        gboolean do_prompt = pref_flag_get( PREF_KEY_OPTIONS_PROMPT );
     1049
    10511050        ctor = tr_ctorNew( session );
    10521051        tr_core_apply_defaults( ctor );
    10531052
    1054         if( !has_metainfo && g_file_test( filename, G_FILE_TEST_IS_REGULAR ) )
    1055         {
    1056             /* set the metainfo from a local file */
    1057             has_metainfo = !tr_ctorSetMetainfoFromFile( ctor, filename );
    1058         }
    1059 
    1060         if( !has_metainfo )
    1061         {
    1062             /* base64-encoded metainfo */
    1063             int file_length;
    1064             char * file_contents = tr_base64_decode( payload, -1, &file_length );
    1065             has_metainfo = !tr_ctorSetMetainfo( ctor, (const uint8_t*)file_contents, file_length );
    1066             tr_free( file_contents );
    1067         }
    1068 
    1069         if( has_metainfo )
    1070         {
    1071             add_ctor( core, ctor, do_prompt, TRUE );
    1072             tr_core_torrents_added( core );
    1073         }
    1074 
    1075         *setme_handled = has_metainfo;
     1053        file_contents = tr_base64_decode( payload, -1, &file_length );
     1054        tr_ctorSetMetainfo( ctor, (const uint8_t*)file_contents, file_length );
     1055        add_ctor( core, ctor, do_prompt, TRUE );
     1056
     1057        tr_free( file_contents );
     1058        tr_core_torrents_added( core );
     1059        *setme_handled = TRUE;
    10761060    }
    10771061
  • trunk/gtk/tr-core.h

    r11086 r11087  
    118118/** @brief Add a torrent. */
    119119gboolean tr_core_add_metainfo( TrCore      * core,
    120                                const char  * payload,
    121                                const char  * optional_filename,
     120                               const char  * base64_metainfo,
    122121                               gboolean    * setme_success,
    123122                               GError     ** err );
  • trunk/gtk/util.c

    r11060 r11087  
    587587            dbus_g_proxy_call( proxy, "AddMetainfo", &err,
    588588                               G_TYPE_STRING, payload,
    589                                G_TYPE_STRING, filename,
    590589                               G_TYPE_INVALID,
    591590                               G_TYPE_BOOLEAN, &handled,
  • trunk/qt/app.cc

    r11085 r11087  
    3131#include <libtransmission/version.h>
    3232
     33#include "add-data.h"
    3334#include "app.h"
    3435#include "dbus-adaptor.h"
     
    239240    new TrDBusAdaptor( this );
    240241    QDBusConnection bus = QDBusConnection::sessionBus();
    241     if (!bus.registerService("com.transmissionbt.Transmission"))
    242         if(bus.lastError().isValid())
    243             std::cerr << qPrintable(bus.lastError().message()) << std::endl;
    244     if( !bus.registerObject( "/com/transmissionbt/Transmission", this ))
    245         if(bus.lastError().isValid())
    246             std::cerr << qPrintable(bus.lastError().message()) << std::endl;
     242    if( !bus.registerService( DBUS_SERVICE ) )
     243        std::cerr << "couldn't register " << DBUS_SERVICE << std::endl;
     244    if( !bus.registerObject( DBUS_OBJECT_PATH, this ) )
     245        std::cerr << "couldn't register " << DBUS_OBJECT_PATH << std::endl;
    247246}
    248247
     
    368367MyApp :: addTorrent( const QString& key )
    369368{
     369    const AddData addme( key );
     370
     371    if( addme.type != addme.NONE )
     372        addTorrent( addme );
     373}
     374
     375void
     376MyApp :: addTorrent( const AddData& addme )
     377{
    370378    if( !myPrefs->getBool( Prefs :: OPTIONS_PROMPT ) )
    371379    {
    372         mySession->addTorrent( key );
    373     }
    374     else if( Utils::isMagnetLink( key ) || QFile( key ).exists( ) )
    375     {
    376         Options * o = new Options( *mySession, *myPrefs, key, myWindow );
     380        mySession->addTorrent( addme );
     381    }
     382    else if( addme.type == addme.URL )
     383    {
     384        myWindow->openURL( addme.url.toString( ) );
     385    }
     386    else
     387    {
     388        Options * o = new Options( *mySession, *myPrefs, addme, myWindow );
    377389        o->show( );
    378     }
    379     else if( Utils::isURL( key ) )
    380     {
    381         myWindow->openURL( key );
    382390    }
    383391
     
    441449    for( int i=0, n=addme.size(); i<n; ++i )
    442450    {
    443         const QString key = addme[i];
    444 
    445451        QDBusMessage request = QDBusMessage::createMethodCall( DBUS_SERVICE,
    446452                                                               DBUS_OBJECT_PATH,
     
    448454                                                               "AddMetainfo" );
    449455        QList<QVariant> arguments;
    450         arguments.push_back( QVariant( key ) );
     456        arguments.push_back( AddData(addme[i]).toBase64().constData() );
    451457        request.setArguments( arguments );
    452458
    453459        QDBusMessage response = bus.call( request );
     460        //std::cerr << qPrintable(response.errorName()) << std::endl;
     461        //std::cerr << qPrintable(response.errorMessage()) << std::endl;
    454462        arguments = response.arguments( );
    455463        delegated |= (arguments.size()==1) && arguments[0].toBool();
  • trunk/qt/app.h

    r11085 r11087  
    1717#include <QSet>
    1818#include <QTimer>
     19
    1920#include "favicon.h"
    2021
     22class AddData;
    2123class Prefs;
    2224class Session;
     
    6163    public slots:
    6264        void addTorrent( const QString& );
     65        void addTorrent( const AddData& );
    6366
    6467    private:
  • trunk/qt/dbus-adaptor.cc

    r10717 r11087  
    1111 */
    1212
    13 #include <QFile>
     13#include "add-data.h"
    1414#include "app.h"
    1515#include "dbus-adaptor.h"
     
    2929
    3030bool
    31 TrDBusAdaptor :: AddMetainfo( const QString& payload, const QString& filename )
     31TrDBusAdaptor :: AddMetainfo( const QString& key )
    3232{
    33     myApp->addTorrent( QFile(filename).exists() ? filename : payload );
     33    AddData addme( key );
     34
     35    if( addme.type != addme.NONE )
     36        myApp->addTorrent( addme );
     37
    3438    return true;
    3539}
  • trunk/qt/dbus-adaptor.h

    r10717 r11087  
    3232  public slots:
    3333    bool PresentWindow();
    34     bool AddMetainfo( const QString& payload, const QString& filename );
     34    bool AddMetainfo( const QString& );
    3535};
    3636
  • trunk/qt/make-dialog.cc

    r10933 r11087  
    5959        case QDialogButtonBox::Open:
    6060std::cerr << "calling mySession.addTorrent( " << qPrintable(myTarget) << ", " << qPrintable(QFileInfo(myBuilder->top).dir().path()) << ')' << std::endl;
    61             mySession.addTorrent( myTarget, QFileInfo(myBuilder->top).dir().path() );
     61            mySession.addNewlyCreatedTorrent( myTarget, QFileInfo(myBuilder->top).dir().path() );
    6262            break;
    6363        case QDialogButtonBox::Abort:
  • trunk/qt/options.cc

    r10723 r11087  
    1414#include <iostream>
    1515
     16#include <QApplication>
    1617#include <QCheckBox>
    1718#include <QComboBox>
     
    2324#include <QGridLayout>
    2425#include <QLabel>
     26#include <QMessageBox>
    2527#include <QPushButton>
    2628#include <QResizeEvent>
     
    3335#include <libtransmission/utils.h> /* mime64 */
    3436
     37#include "add-data.h"
    3538#include "file-tree.h"
    3639#include "hig.h"
     
    4548***/
    4649
    47 Options :: Options( Session& session, const Prefs& prefs, const QString& filename, QWidget * parent ):
     50void
     51FileAdded :: executed( int64_t tag, const QString& result, struct tr_benc * arguments )
     52{
     53    Q_UNUSED( arguments );
     54
     55    if( tag != myTag )
     56        return;
     57
     58    if( result == "success" )
     59        if( !myDelFile.isEmpty( ) )
     60            QFile( myDelFile ).remove( );
     61
     62    if( result != "success" ) {
     63        QString text = result;
     64        for( int i=0, n=text.size(); i<n; ++i )
     65            if( !i || text[i-1].isSpace() )
     66                text[i] = text[i].toUpper();
     67        QMessageBox::warning( QApplication::activeWindow(),
     68                              tr( "Error Adding Torrent" ),
     69                              QString("<p><b>%1</b></p><p>%2</p>").arg(text).arg(myName) );
     70    }
     71
     72    deleteLater();
     73}
     74
     75/***
     76****
     77***/
     78
     79Options :: Options( Session& session, const Prefs& prefs, const AddData& addme, QWidget * parent ):
    4880    QDialog( parent, Qt::Dialog ),
    4981    mySession( session ),
    50     myFile( filename ),
     82    myAdd( addme ),
    5183    myHaveInfo( false ),
    5284    myDestinationButton( 0 ),
     
    169201Options :: refreshFileButton( int width )
    170202{
    171     refreshButton( myFileButton, QFileInfo(myFile).baseName(), width );
     203    QString text;
     204
     205    switch( myAdd.type )
     206    {
     207        case AddData::FILENAME: text = QFileInfo(myAdd.filename).baseName(); break;
     208        case AddData::URL:      text = myAdd.url.toString(); break;
     209        case AddData::MAGNET:   text = myAdd.magnet; break;
     210        default:                break;
     211    }
     212
     213    refreshButton( myFileButton, text, width );
    172214}
    173215
     
    216258
    217259    tr_ctor * ctor = tr_ctorNew( 0 );
    218     if( Utils::isMagnetLink( myFile ) )
    219         tr_ctorSetMetainfoFromMagnetLink( ctor, myFile.toUtf8().constData() );
    220     else
    221         tr_ctorSetMetainfoFromFile( ctor, myFile.toUtf8().constData() );
     260
     261    switch( myAdd.type ) {
     262        case AddData::MAGNET:   tr_ctorSetMetainfoFromMagnetLink( ctor, myAdd.magnet.toUtf8().constData() ); break;
     263        case AddData::FILENAME: tr_ctorSetMetainfoFromFile( ctor, myAdd.filename.toUtf8().constData() ); break;
     264        case AddData::METAINFO: tr_ctorSetMetainfo( ctor, (const uint8_t*)myAdd.metainfo.constData(), myAdd.metainfo.size() ); break;
     265        default: break;
     266    }
    222267
    223268    const int err = tr_torrentParse( ctor, &myInfo );
     
    281326
    282327    // "metainfo"
    283     if( Utils::isMagnetLink( myFile ) || Utils::isURL( myFile ) )
    284         tr_bencDictAddStr( args, "filename", myFile.toUtf8().constData() );
    285     else {
    286         QFile file( myFile );
    287         file.open( QIODevice::ReadOnly );
    288         const QByteArray metainfo( file.readAll( ) );
    289         file.close( );
    290         int base64Size = 0;
    291         char * base64 = tr_base64_encode( metainfo.constData(), metainfo.size(), &base64Size );
    292         tr_bencDictAddRaw( args, "metainfo", base64, base64Size );
    293         tr_free( base64 );
     328    switch( myAdd.type )
     329    {
     330        case AddData::MAGNET:
     331            tr_bencDictAddStr( args, "filename", myAdd.magnet.toUtf8().constData() );
     332            break;
     333
     334        case AddData::URL:
     335            tr_bencDictAddStr( args, "filename", myAdd.url.toString().toUtf8().constData() );
     336            break;
     337
     338        case AddData::FILENAME:
     339        case AddData::METAINFO: {
     340            const QByteArray b64 = myAdd.toBase64( );
     341            tr_bencDictAddRaw( args, "metainfo", b64.constData(), b64.size() );
     342            break;
     343        }
     344
     345        default:
     346            std::cerr << "unhandled AddData.type: " << myAdd.type << std::endl;
    294347    }
    295348
     
    330383
    331384    // maybe delete the source .torrent
    332     if( myTrashCheck->isChecked( ) ) {
    333         FileAdded * fileAdded = new FileAdded( tag, myFile );
    334         connect( &mySession, SIGNAL(executed(int64_t,const QString&, struct tr_benc*)),
    335                  fileAdded, SLOT(executed(int64_t,const QString&, struct tr_benc*)));
    336     }
     385    FileAdded * fileAdded = new FileAdded( tag, myAdd.readableName() );
     386    if( myTrashCheck->isChecked( ) && ( myAdd.type==AddData::FILENAME ) )
     387        fileAdded->setFileToDelete( myAdd.filename );
     388    connect( &mySession, SIGNAL(executed(int64_t,const QString&, struct tr_benc*)),
     389             fileAdded, SLOT(executed(int64_t,const QString&, struct tr_benc*)));
    337390
    338391//std::cerr << tr_bencToStr(&top,TR_FMT_JSON,NULL) << std::endl;
     
    346399Options :: onFilenameClicked( )
    347400{
    348     QFileDialog * d = new QFileDialog( this,
    349                                        tr( "Add Torrent" ),
    350                                        QFileInfo(myFile).absolutePath(),
    351                                        tr( "Torrent Files (*.torrent);;All Files (*.*)" ) );
    352     d->setFileMode( QFileDialog::ExistingFile );
    353     connect( d, SIGNAL(filesSelected(const QStringList&)), this, SLOT(onFilesSelected(const QStringList&)) );
    354     d->show( );
     401    if( myAdd.type == AddData::FILENAME )
     402    {
     403        QFileDialog * d = new QFileDialog( this,
     404                                           tr( "Add Torrent" ),
     405                                           QFileInfo(myAdd.filename).absolutePath(),
     406                                           tr( "Torrent Files (*.torrent);;All Files (*.*)" ) );
     407        d->setFileMode( QFileDialog::ExistingFile );
     408        connect( d, SIGNAL(filesSelected(const QStringList&)), this, SLOT(onFilesSelected(const QStringList&)) );
     409        d->show( );
     410    }
    355411}
    356412
     
    360416    if( files.size() == 1 )
    361417    {
    362         myFile = files.at( 0 );
     418        myAdd.set( files.at(0) );
    363419        refreshFileButton( );
    364420        reload( );
  • trunk/qt/options.h

    r10080 r11087  
    1414#define OPTIONS_DIALOG_H
    1515
     16#include <iostream>
     17
    1618#include <QDialog>
    1719#include <QEvent>
     
    2123#include <QMap>
    2224#include <QPushButton>
     25#include <QString>
    2326#include <QStringList>
    2427#include <QCryptographicHash>
     
    2629#include <QTimer>
    2730
    28 #include "file-tree.h"
     31#include "add-data.h" // AddData
     32#include "file-tree.h" // FileList
    2933
    3034class FileTreeView;
     
    4044        Q_OBJECT
    4145        const int64_t myTag;
     46        QString myName;
    4247        QString myDelFile;
    4348
    4449    public:
    45         FileAdded( int tag, const QString file ): myTag(tag), myDelFile(file) { }
     50        FileAdded( int tag, const QString& name ): myTag(tag), myName(name) { }
    4651        ~FileAdded( ) { }
     52        void setFileToDelete( const QString& file ) { myDelFile = file; }
    4753
    4854    public slots:
    49         void executed( int64_t tag, const QString& result, struct tr_benc * arguments ) {
    50             Q_UNUSED( arguments );
    51             if( tag == myTag ) {
    52                 if( result == "success" )
    53                     QFile( myDelFile ).remove( );
    54                 deleteLater();
    55             }
    56         }
     55        void executed( int64_t tag, const QString& result, struct tr_benc * arguments );
    5756};
    5857
     
    6261
    6362    public:
    64         Options( Session& session, const Prefs& prefs, const QString& filename, QWidget * parent = 0 );
     63        Options( Session& session, const Prefs& prefs, const AddData& addme, QWidget * parent = 0 );
    6564        ~Options( );
    6665
     
    7473    private:
    7574        Session& mySession;
    76         QString myFile;
     75        AddData myAdd;
    7776        QDir myDestination;
    7877        bool myHaveInfo;
  • trunk/qt/qtr.pro

    r11072 r11087  
    3131FORMS += mainwin.ui
    3232RESOURCES += application.qrc
    33 SOURCES += about.cc app.cc dbus-adaptor.cc details.cc favicon.cc file-tree.cc \
    34            filterbar.cc filters.cc formatter.cc hig.cc license.cc mainwin.cc \
    35            make-dialog.cc options.cc prefs.cc prefs-dialog.cc qticonloader.cc \
    36            relocate.cc session.cc session-dialog.cc squeezelabel.cc \
    37            stats-dialog.cc torrent.cc torrent-delegate.cc \
    38            torrent-delegate-min.cc torrent-filter.cc torrent-model.cc \
    39            tracker-delegate.cc tracker-model.cc tracker-model-filter.cc \
    40            triconpushbutton.cc utils.cc watchdir.cc
     33SOURCES += about.cc \
     34           add-data.cc \
     35           app.cc \
     36           dbus-adaptor.cc \
     37           details.cc \
     38           favicon.cc \
     39           file-tree.cc \
     40           filterbar.cc \
     41           filters.cc \
     42           formatter.cc \
     43           hig.cc \
     44           license.cc \
     45           mainwin.cc \
     46           make-dialog.cc \
     47           options.cc \
     48           prefs.cc \
     49           prefs-dialog.cc \
     50           qticonloader.cc \
     51           relocate.cc \
     52           session.cc \
     53           session-dialog.cc \
     54           squeezelabel.cc \
     55           stats-dialog.cc \
     56           torrent.cc torrent-delegate.cc \
     57           torrent-delegate-min.cc \
     58           torrent-filter.cc \
     59           torrent-model.cc \
     60           tracker-delegate.cc \
     61           tracker-model.cc \
     62           tracker-model-filter.cc \
     63           triconpushbutton.cc \
     64           utils.cc \
     65           watchdir.cc
    4166HEADERS += $$replace(SOURCES, .cc, .h)
    4267HEADERS += speed.h types.h
  • trunk/qt/session.cc

    r11059 r11087  
    3434#include <libtransmission/version.h> /* LONG_VERSION */
    3535
     36#include "add-data.h"
    3637#include "prefs.h"
    3738#include "qticonloader.h"
     
    926927
    927928void
    928 Session :: addTorrent( QString filename )
    929 {
    930     addTorrent( filename, myPrefs.getString( Prefs::DOWNLOAD_DIR ) );
    931 }
    932 
    933 namespace
    934 {
    935     bool isLink( const QString& str )
    936     {
    937         return Utils::isMagnetLink(str) || Utils::isURL(str);
    938     }
    939 }
    940 
    941 void
    942 Session :: addTorrent( QString key, QString localPath )
    943 {
     929Session :: addTorrent( const AddData& addMe )
     930{
     931    const QByteArray b64 = addMe.toBase64();
     932
     933    tr_benc top, *args;
     934    tr_bencInitDict( &top, 2 );
     935    tr_bencDictAddStr( &top, "method", "torrent-add" );
     936    args = tr_bencDictAddDict( &top, "arguments", 2 );
     937    tr_bencDictAddBool( args, "paused", !myPrefs.getBool( Prefs::START ) );
     938    switch( addMe.type ) {
     939        case AddData::MAGNET:   tr_bencDictAddStr( args, "filename", addMe.magnet.toUtf8().constData() ); break;
     940        case AddData::URL:      tr_bencDictAddStr( args, "filename", addMe.url.toString().toUtf8().constData() ); break;
     941        case AddData::FILENAME: /* fall-through */
     942        case AddData::METAINFO: tr_bencDictAddRaw( args, "metainfo", b64.constData(), b64.size() ); break;
     943        default: std::cerr << "Unhandled AddData type: " << addMe.type << std::endl;
     944    }
     945    exec( &top );
     946    tr_bencFree( &top );
     947}
     948
     949void
     950Session :: addNewlyCreatedTorrent( const QString& filename, const QString& localPath )
     951{
     952    const QByteArray b64 = AddData(filename).toBase64();
     953
    944954    tr_benc top, *args;
    945955    tr_bencInitDict( &top, 2 );
     
    948958    tr_bencDictAddStr( args, "download-dir", qPrintable(localPath) );
    949959    tr_bencDictAddBool( args, "paused", !myPrefs.getBool( Prefs::START ) );
    950 
    951     // figure out what to do with "key"....
    952     bool keyHandled = false;
    953     if( !keyHandled && isLink( key  )) {
    954         tr_bencDictAddStr( args, "filename", key.toUtf8().constData() );
    955         keyHandled = true; // it's a URL or magnet link...
    956     }
    957     if( !keyHandled ) {
    958         QFile file( key );
    959         file.open( QIODevice::ReadOnly );
    960         const QByteArray raw( file.readAll( ) );
    961         file.close( );
    962         if( !raw.isEmpty( ) ) {
    963             int b64len = 0;
    964             char * b64 = tr_base64_encode( raw.constData(), raw.size(), &b64len );
    965             tr_bencDictAddRaw( args, "metainfo", b64, b64len  );
    966             tr_free( b64 );
    967             keyHandled = true; // it's a local file...
    968         }
    969     }
    970     if( !keyHandled ) {
    971         const QByteArray tmp = key.toUtf8();
    972         tr_bencDictAddRaw( args, "metainfo", tmp.constData(), tmp.length() );
    973         keyHandled = true; // treat it as base64
    974     }
    975 
     960    tr_bencDictAddRaw( args, "metainfo", b64.constData(), b64.size() );
    976961    exec( &top );
    977962    tr_bencFree( &top );
  • trunk/qt/session.h

    r11059 r11087  
    2323
    2424class QStringList;
     25
     26class AddData;
    2527
    2628#include <libtransmission/transmission.h>
     
    113115        void refreshAllTorrents( );
    114116        void initTorrents( const QSet<int>& ids = QSet<int>() );
    115         void addTorrent( QString filename );
    116         void addTorrent( QString filename, QString localPath );
     117        void addNewlyCreatedTorrent( const QString& filename, const QString& localPath );
     118        void addTorrent( const AddData& addme );
    117119        void removeTorrents( const QSet<int>& torrentIds, bool deleteFiles=false );
    118120        void verifyTorrents( const QSet<int>& torrentIds );
Note: See TracChangeset for help on using the changeset viewer.