Changeset 11087
- Timestamp:
- Aug 1, 2010, 6:55:04 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gtk/tr-core-dbus.xml
r10717 r11087 5 5 <arg type="b" name="handled" direction="out"/> 6 6 <arg type="s" name="metainfo" direction="in"/> 7 <arg type="s" name="filename" direction="in"/>8 7 </method> 9 8 <method name="PresentWindow"> -
trunk/gtk/tr-core.c
r11086 r11087 1027 1027 tr_core_add_metainfo( TrCore * core, 1028 1028 const char * payload, 1029 const char * filename,1030 1029 gboolean * setme_handled, 1031 1030 GError ** gerr UNUSED ) … … 1042 1041 *setme_handled = TRUE; 1043 1042 } 1044 else 1045 { 1043 else /* base64-encoded metainfo */ 1044 { 1045 int file_length; 1046 1046 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 1051 1050 ctor = tr_ctorNew( session ); 1052 1051 tr_core_apply_defaults( ctor ); 1053 1052 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; 1076 1060 } 1077 1061 -
trunk/gtk/tr-core.h
r11086 r11087 118 118 /** @brief Add a torrent. */ 119 119 gboolean tr_core_add_metainfo( TrCore * core, 120 const char * payload, 121 const char * optional_filename, 120 const char * base64_metainfo, 122 121 gboolean * setme_success, 123 122 GError ** err ); -
trunk/gtk/util.c
r11060 r11087 587 587 dbus_g_proxy_call( proxy, "AddMetainfo", &err, 588 588 G_TYPE_STRING, payload, 589 G_TYPE_STRING, filename,590 589 G_TYPE_INVALID, 591 590 G_TYPE_BOOLEAN, &handled, -
trunk/qt/app.cc
r11085 r11087 31 31 #include <libtransmission/version.h> 32 32 33 #include "add-data.h" 33 34 #include "app.h" 34 35 #include "dbus-adaptor.h" … … 239 240 new TrDBusAdaptor( this ); 240 241 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; 247 246 } 248 247 … … 368 367 MyApp :: addTorrent( const QString& key ) 369 368 { 369 const AddData addme( key ); 370 371 if( addme.type != addme.NONE ) 372 addTorrent( addme ); 373 } 374 375 void 376 MyApp :: addTorrent( const AddData& addme ) 377 { 370 378 if( !myPrefs->getBool( Prefs :: OPTIONS_PROMPT ) ) 371 379 { 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 ); 377 389 o->show( ); 378 }379 else if( Utils::isURL( key ) )380 {381 myWindow->openURL( key );382 390 } 383 391 … … 441 449 for( int i=0, n=addme.size(); i<n; ++i ) 442 450 { 443 const QString key = addme[i];444 445 451 QDBusMessage request = QDBusMessage::createMethodCall( DBUS_SERVICE, 446 452 DBUS_OBJECT_PATH, … … 448 454 "AddMetainfo" ); 449 455 QList<QVariant> arguments; 450 arguments.push_back( QVariant( key) );456 arguments.push_back( AddData(addme[i]).toBase64().constData() ); 451 457 request.setArguments( arguments ); 452 458 453 459 QDBusMessage response = bus.call( request ); 460 //std::cerr << qPrintable(response.errorName()) << std::endl; 461 //std::cerr << qPrintable(response.errorMessage()) << std::endl; 454 462 arguments = response.arguments( ); 455 463 delegated |= (arguments.size()==1) && arguments[0].toBool(); -
trunk/qt/app.h
r11085 r11087 17 17 #include <QSet> 18 18 #include <QTimer> 19 19 20 #include "favicon.h" 20 21 22 class AddData; 21 23 class Prefs; 22 24 class Session; … … 61 63 public slots: 62 64 void addTorrent( const QString& ); 65 void addTorrent( const AddData& ); 63 66 64 67 private: -
trunk/qt/dbus-adaptor.cc
r10717 r11087 11 11 */ 12 12 13 #include <QFile>13 #include "add-data.h" 14 14 #include "app.h" 15 15 #include "dbus-adaptor.h" … … 29 29 30 30 bool 31 TrDBusAdaptor :: AddMetainfo( const QString& payload, const QString& filename)31 TrDBusAdaptor :: AddMetainfo( const QString& key ) 32 32 { 33 myApp->addTorrent( QFile(filename).exists() ? filename : payload ); 33 AddData addme( key ); 34 35 if( addme.type != addme.NONE ) 36 myApp->addTorrent( addme ); 37 34 38 return true; 35 39 } -
trunk/qt/dbus-adaptor.h
r10717 r11087 32 32 public slots: 33 33 bool PresentWindow(); 34 bool AddMetainfo( const QString& payload, const QString& filename);34 bool AddMetainfo( const QString& ); 35 35 }; 36 36 -
trunk/qt/make-dialog.cc
r10933 r11087 59 59 case QDialogButtonBox::Open: 60 60 std::cerr << "calling mySession.addTorrent( " << qPrintable(myTarget) << ", " << qPrintable(QFileInfo(myBuilder->top).dir().path()) << ')' << std::endl; 61 mySession.add Torrent( myTarget, QFileInfo(myBuilder->top).dir().path() );61 mySession.addNewlyCreatedTorrent( myTarget, QFileInfo(myBuilder->top).dir().path() ); 62 62 break; 63 63 case QDialogButtonBox::Abort: -
trunk/qt/options.cc
r10723 r11087 14 14 #include <iostream> 15 15 16 #include <QApplication> 16 17 #include <QCheckBox> 17 18 #include <QComboBox> … … 23 24 #include <QGridLayout> 24 25 #include <QLabel> 26 #include <QMessageBox> 25 27 #include <QPushButton> 26 28 #include <QResizeEvent> … … 33 35 #include <libtransmission/utils.h> /* mime64 */ 34 36 37 #include "add-data.h" 35 38 #include "file-tree.h" 36 39 #include "hig.h" … … 45 48 ***/ 46 49 47 Options :: Options( Session& session, const Prefs& prefs, const QString& filename, QWidget * parent ): 50 void 51 FileAdded :: 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 79 Options :: Options( Session& session, const Prefs& prefs, const AddData& addme, QWidget * parent ): 48 80 QDialog( parent, Qt::Dialog ), 49 81 mySession( session ), 50 my File( filename ),82 myAdd( addme ), 51 83 myHaveInfo( false ), 52 84 myDestinationButton( 0 ), … … 169 201 Options :: refreshFileButton( int width ) 170 202 { 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 ); 172 214 } 173 215 … … 216 258 217 259 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 } 222 267 223 268 const int err = tr_torrentParse( ctor, &myInfo ); … … 281 326 282 327 // "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; 294 347 } 295 348 … … 330 383 331 384 // 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*))); 337 390 338 391 //std::cerr << tr_bencToStr(&top,TR_FMT_JSON,NULL) << std::endl; … … 346 399 Options :: onFilenameClicked( ) 347 400 { 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 } 355 411 } 356 412 … … 360 416 if( files.size() == 1 ) 361 417 { 362 my File = files.at( 0);418 myAdd.set( files.at(0) ); 363 419 refreshFileButton( ); 364 420 reload( ); -
trunk/qt/options.h
r10080 r11087 14 14 #define OPTIONS_DIALOG_H 15 15 16 #include <iostream> 17 16 18 #include <QDialog> 17 19 #include <QEvent> … … 21 23 #include <QMap> 22 24 #include <QPushButton> 25 #include <QString> 23 26 #include <QStringList> 24 27 #include <QCryptographicHash> … … 26 29 #include <QTimer> 27 30 28 #include "file-tree.h" 31 #include "add-data.h" // AddData 32 #include "file-tree.h" // FileList 29 33 30 34 class FileTreeView; … … 40 44 Q_OBJECT 41 45 const int64_t myTag; 46 QString myName; 42 47 QString myDelFile; 43 48 44 49 public: 45 FileAdded( int tag, const QString file ): myTag(tag), myDelFile(file) { }50 FileAdded( int tag, const QString& name ): myTag(tag), myName(name) { } 46 51 ~FileAdded( ) { } 52 void setFileToDelete( const QString& file ) { myDelFile = file; } 47 53 48 54 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 ); 57 56 }; 58 57 … … 62 61 63 62 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 ); 65 64 ~Options( ); 66 65 … … 74 73 private: 75 74 Session& mySession; 76 QString myFile;75 AddData myAdd; 77 76 QDir myDestination; 78 77 bool myHaveInfo; -
trunk/qt/qtr.pro
r11072 r11087 31 31 FORMS += mainwin.ui 32 32 RESOURCES += 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 33 SOURCES += 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 41 66 HEADERS += $$replace(SOURCES, .cc, .h) 42 67 HEADERS += speed.h types.h -
trunk/qt/session.cc
r11059 r11087 34 34 #include <libtransmission/version.h> /* LONG_VERSION */ 35 35 36 #include "add-data.h" 36 37 #include "prefs.h" 37 38 #include "qticonloader.h" … … 926 927 927 928 void 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 { 929 Session :: 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 949 void 950 Session :: addNewlyCreatedTorrent( const QString& filename, const QString& localPath ) 951 { 952 const QByteArray b64 = AddData(filename).toBase64(); 953 944 954 tr_benc top, *args; 945 955 tr_bencInitDict( &top, 2 ); … … 948 958 tr_bencDictAddStr( args, "download-dir", qPrintable(localPath) ); 949 959 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() ); 976 961 exec( &top ); 977 962 tr_bencFree( &top ); -
trunk/qt/session.h
r11059 r11087 23 23 24 24 class QStringList; 25 26 class AddData; 25 27 26 28 #include <libtransmission/transmission.h> … … 113 115 void refreshAllTorrents( ); 114 116 void initTorrents( const QSet<int>& ids = QSet<int>() ); 115 void add Torrent( QString filename);116 void addTorrent( QString filename, QString localPath);117 void addNewlyCreatedTorrent( const QString& filename, const QString& localPath ); 118 void addTorrent( const AddData& addme ); 117 119 void removeTorrents( const QSet<int>& torrentIds, bool deleteFiles=false ); 118 120 void verifyTorrents( const QSet<int>& torrentIds );
Note: See TracChangeset
for help on using the changeset viewer.