From b4a662ba37a791302ad0f281e51d3523f423beca Mon Sep 17 00:00:00 2001 From: Mike Gelfand <mikedld@mikedld.com> Date: Mon, 1 Dec 2014 21:05:44 +0000 Subject: [PATCH] Create QDBusConnection after QApplication has been initialized Doing otherwise causes Qt warning "QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave." Also, don't try to do anything D-Bus-related if connection fails. --- qt/app.cc | 118 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 61 insertions(+), 57 deletions(-) diff --git a/qt/app.cc b/qt/app.cc index 9b04d275a..97cc0ce70 100644 --- a/qt/app.cc +++ b/qt/app.cc @@ -84,7 +84,12 @@ namespace MyApp :: MyApp (int& argc, char ** argv): QApplication (argc, argv), - myLastFullUpdateTime (0) + myLastFullUpdateTime (0), + myPrefs(nullptr), + mySession(nullptr), + myModel(nullptr), + myWindow(nullptr), + myWatchDir(nullptr) { const QString MY_CONFIG_NAME = QString::fromUtf8 ("transmission"); @@ -134,6 +139,44 @@ MyApp :: MyApp (int& argc, char ** argv): } } + // try to delegate the work to an existing copy of Transmission + // before starting ourselves... + QDBusConnection bus = QDBusConnection::sessionBus (); + if (bus.isConnected ()) + { + bool delegated = false; + for (int i=0, n=filenames.size (); i<n; ++i) + { + QDBusMessage request = QDBusMessage::createMethodCall (DBUS_SERVICE, + DBUS_OBJECT_PATH, + DBUS_INTERFACE, + QString::fromUtf8 ("AddMetainfo")); + QList<QVariant> arguments; + AddData a (filenames[i]); + switch (a.type) + { + case AddData::URL: arguments.push_back (a.url.toString ()); break; + case AddData::MAGNET: arguments.push_back (a.magnet); break; + case AddData::FILENAME: arguments.push_back (a.toBase64 ().constData ()); break; + case AddData::METAINFO: arguments.push_back (a.toBase64 ().constData ()); break; + default: break; + } + request.setArguments (arguments); + + QDBusMessage response = bus.call (request); + //std::cerr << qPrintable (response.errorName ()) << std::endl; + //std::cerr << qPrintable (response.errorMessage ()) << std::endl; + arguments = response.arguments (); + delegated |= (arguments.size ()==1) && arguments[0].toBool (); + } + + if (delegated) + { + QTimer::singleShot (0, this, SLOT (quit ())); + return; + } + } + // set the fallback config dir if (configDir == 0) configDir = tr_getDefaultConfigDir ("transmission"); @@ -249,12 +292,14 @@ MyApp :: MyApp (int& argc, char ** argv): addTorrent (*it); // register as the dbus handler for Transmission - new TrDBusAdaptor (this); - QDBusConnection bus = QDBusConnection::sessionBus (); - if (!bus.registerService (DBUS_SERVICE)) - std::cerr << "couldn't register " << qPrintable (DBUS_SERVICE) << std::endl; - if (!bus.registerObject (DBUS_OBJECT_PATH, this)) - std::cerr << "couldn't register " << qPrintable (DBUS_OBJECT_PATH) << std::endl; + if (bus.isConnected ()) + { + new TrDBusAdaptor (this); + if (!bus.registerService (DBUS_SERVICE)) + std::cerr << "couldn't register " << qPrintable (DBUS_SERVICE) << std::endl; + if (!bus.registerObject (DBUS_OBJECT_PATH, this)) + std::cerr << "couldn't register " << qPrintable (DBUS_OBJECT_PATH) << std::endl; + } } /* these functions are for popping up desktop notifications */ @@ -336,16 +381,19 @@ MyApp :: consentGiven () MyApp :: ~MyApp () { - const QRect mainwinRect (myWindow->geometry ()); + if (myPrefs != nullptr && myWindow != nullptr) + { + const QRect mainwinRect (myWindow->geometry ()); + myPrefs->set (Prefs :: MAIN_WINDOW_HEIGHT, std::max (100, mainwinRect.height ())); + myPrefs->set (Prefs :: MAIN_WINDOW_WIDTH, std::max (100, mainwinRect.width ())); + myPrefs->set (Prefs :: MAIN_WINDOW_X, mainwinRect.x ()); + myPrefs->set (Prefs :: MAIN_WINDOW_Y, mainwinRect.y ()); + } + delete myWatchDir; delete myWindow; delete myModel; delete mySession; - - myPrefs->set (Prefs :: MAIN_WINDOW_HEIGHT, std::max (100, mainwinRect.height ())); - myPrefs->set (Prefs :: MAIN_WINDOW_WIDTH, std::max (100, mainwinRect.width ())); - myPrefs->set (Prefs :: MAIN_WINDOW_X, mainwinRect.x ()); - myPrefs->set (Prefs :: MAIN_WINDOW_Y, mainwinRect.y ()); delete myPrefs; } @@ -489,54 +537,10 @@ MyApp :: notifyApp (const QString& title, const QString& body) const int main (int argc, char * argv[]) { - // find .torrents, URLs, magnet links, etc in the command-line args - int c; - QStringList addme; - const char * optarg; - char ** argvv; - #ifdef _WIN32 tr_win32_make_args_utf8 (&argc, &argv); #endif - argvv = argv; - while ( (c = tr_getopt (getUsage (), argc, (const char **)argvv, opts, &optarg))) - if (c == TR_OPT_UNK) - addme.append (optarg); - - // try to delegate the work to an existing copy of Transmission - // before starting ourselves... - bool delegated = false; - QDBusConnection bus = QDBusConnection::sessionBus (); - for (int i=0, n=addme.size (); i<n; ++i) - { - QDBusMessage request = QDBusMessage::createMethodCall (DBUS_SERVICE, - DBUS_OBJECT_PATH, - DBUS_INTERFACE, - QString::fromUtf8 ("AddMetainfo")); - QList<QVariant> arguments; - AddData a (addme[i]); - switch (a.type) - { - case AddData::URL: arguments.push_back (a.url.toString ()); break; - case AddData::MAGNET: arguments.push_back (a.magnet); break; - case AddData::FILENAME: arguments.push_back (a.toBase64 ().constData ()); break; - case AddData::METAINFO: arguments.push_back (a.toBase64 ().constData ()); break; - default: break; - } - request.setArguments (arguments); - - QDBusMessage response = bus.call (request); - //std::cerr << qPrintable (response.errorName ()) << std::endl; - //std::cerr << qPrintable (response.errorMessage ()) << std::endl; - arguments = response.arguments (); - delegated |= (arguments.size ()==1) && arguments[0].toBool (); - } - - if (delegated) - return 0; - - tr_optind = 1; MyApp app (argc, argv); return app.exec (); } -- 2.40.0