diff options
| author | 2015-11-25 16:48:49 -0500 | |
|---|---|---|
| committer | 2015-11-25 16:48:49 -0500 | |
| commit | 7412693e086a7eafaa7ea861164caf523943e5fa (patch) | |
| tree | 0aee322e40572df306b9813546c7a12b3093bcea /Plugins/DbAndroid/dbandroid.cpp | |
| parent | 640196993d31cf5d6fdf36386990ec05f473a048 (diff) | |
| parent | 8e640722c62692818ab840d50b3758f89a41a54e (diff) | |
Merge tag 'upstream/3.0.7'
Upstream version 3.0.7
# gpg: Signature made Wed 25 Nov 2015 04:48:48 PM EST using RSA key ID EBE9BD91
# gpg: Good signature from "Unit 193 <unit193@gmail.com>"
# gpg: aka "Unit 193 <unit193@ninthfloor.org>"
# gpg: aka "Unit 193 <unit193@ubuntu.com>"
# gpg: aka "Unit 193 <unit193@ninthfloor.com>"
Diffstat (limited to 'Plugins/DbAndroid/dbandroid.cpp')
| -rw-r--r-- | Plugins/DbAndroid/dbandroid.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/Plugins/DbAndroid/dbandroid.cpp b/Plugins/DbAndroid/dbandroid.cpp new file mode 100644 index 0000000..99150cd --- /dev/null +++ b/Plugins/DbAndroid/dbandroid.cpp @@ -0,0 +1,209 @@ +#include "adbmanager.h" +#include "dbandroid.h" +#include "dbandroidinstance.h" +#include "dbandroidpathdialog.h" +#include "mainwindow.h" +#include "services/notifymanager.h" +#include "uiconfig.h" +#include "statusfield.h" +#include "services/dbmanager.h" +#include "dbandroidconnectionfactory.h" +#include <QUrl> +#include <QDebug> +#include <QFileDialog> +#include <QMessageBox> +#include <QtConcurrent/QtConcurrent> + +DbAndroid::DbAndroid() +{ +} + +QString DbAndroid::getLabel() const +{ + return "Android SQLite"; +} + +bool DbAndroid::checkIfDbServedByPlugin(Db* db) const +{ + return (db && dynamic_cast<DbAndroidInstance*>(db)); +} + +Db* DbAndroid::getInstance(const QString& name, const QString& path, const QHash<QString, QVariant>& options, QString* errorMessage) +{ + DbAndroidUrl url(path); + if (!url.isValid()) + { + if (errorMessage) + *errorMessage = tr("Invalid or incomplete Android Database URL."); + + return nullptr; + } + + DbAndroidInstance* db = new DbAndroidInstance(this, name, path, options); + return db; +} + +QList<DbPluginOption> DbAndroid::getOptionsList() const +{ + QList<DbPluginOption> options; + + DbPluginOption customBrowseOpt; + customBrowseOpt.type = DbPluginOption::Type::CUSTOM_PATH_BROWSE; + customBrowseOpt.label = tr("Android database URL"); + customBrowseOpt.toolTip = tr("Select Android database"); + customBrowseOpt.customBrowseHandler = [this](const QString& initialPath) -> QString + { + DbAndroidPathDialog dialog(this, MAINWINDOW); + dialog.setUrl(initialPath); + if (!dialog.exec()) + return QString(); + + return dialog.getUrl().toUrlString(); + }; + options << customBrowseOpt; + + return options; +} + +QString DbAndroid::generateDbName(const QVariant& baseValue) +{ + // android://drgh:port/dbName + QUrl url(baseValue.toString()); + if (!url.isValid()) + return baseValue.toString(); + + return url.fileName(); +} + +bool DbAndroid::init() +{ + Q_INIT_RESOURCE(dbandroid); + + qRegisterMetaType<QList<AdbManager::Device>>("QList<Device>"); + + connect(this, SIGNAL(adbReady(bool)), this, SLOT(handleValidAdb(bool))); + connect(this, SIGNAL(invalidAdb()), this, SLOT(handleInvalidAdb())); + connect(MAINWINDOW->getStatusField(), SIGNAL(linkActivated(QString)), this, SLOT(statusFieldLinkClicked(QString))); + + connectionFactory = new DbAndroidConnectionFactory(this); + + adbManager = new AdbManager(this); + connect(adbManager, SIGNAL(deviceListChanged(QStringList)), this, SLOT(deviceListChanged())); + + if (adbManager->testCurrentAdb()) + { + qDebug() << "Using ADB binary:" << cfg.DbAndroid.AdbPath.get(); + adbValid = true; + adbManager->getDevices(true); + } + else + { + QtConcurrent::run(this, &DbAndroid::initAdb); + } + return true; +} + +void DbAndroid::deinit() +{ + safe_delete(connectionFactory); + safe_delete(adbManager); + Q_CLEANUP_RESOURCE(dbandroid); +} + +QString DbAndroid::getCurrentAdb() +{ + return cfg.DbAndroid.AdbPath.get(); +} + +void DbAndroid::initAdb() +{ + QString adbPath = adbManager->findAdb(); + if (!adbPath.isEmpty()) + { + cfg.DbAndroid.AdbPath.set(adbPath); + qDebug() << "Found ADB binary:" << cfg.DbAndroid.AdbPath.get(); + emit adbReady(true); + return; + } + + emit invalidAdb(); +} + +QString DbAndroid::askForAdbPath() +{ +#if defined(Q_OS_UNIX) + QString adbAppName = "adb"; +#elif defined(Q_OS_WIN32) + QString adbAppName = "adb.exe"; +#else + qCritical() << "Unsupported OS for DbAndroid."; + return QString(); +#endif + QString file = QFileDialog::getOpenFileName(MAINWINDOW, tr("Select ADB"), getFileDialogInitPath(), QString("Android Debug Bridge (%1)").arg(adbAppName)); + if (file.isEmpty()) + return file; + + setFileDialogInitPathByFile(file); + return file; +} + +bool DbAndroid::isAdbValid() const +{ + return adbValid; +} + +DbAndroidConnectionFactory*DbAndroid::getConnectionFactory() const +{ + return connectionFactory; +} + +void DbAndroid::handleValidAdb(bool showMessage) +{ + adbValid = true; + if (showMessage) + notifyInfo(tr("Using Android Debug Bridge: %1").arg(cfg.DbAndroid.AdbPath.get())); + + DBLIST->rescanInvalidDatabasesForPlugin(this); +} + +void DbAndroid::handleInvalidAdb() +{ + notifyError(tr("Could not find Android Debug Bridge application. <a href=\"%1\">Click here</a> to point out the location of the ADB application, " + "otherwise the %2 plugin will not support USB cable connections, only the network connection..").arg(SELECT_ADB_URL, getLabel())); +} + +void DbAndroid::statusFieldLinkClicked(const QString& link) +{ + if (link == SELECT_ADB_URL) + { + QString file = askForAdbPath(); + while (!file.isEmpty()) + { + if (adbManager->testAdb(file)) + { + cfg.DbAndroid.AdbPath.set(file); + emit adbReady(true); + return; + } + + int res = QMessageBox::warning(MAINWINDOW, tr("Invalid ADB"), tr("The selected ADB is incorrect.\n" + "Would you like to select another one, or leave it unconfigured?"), + tr("Select another ADB"), tr("Leave unconfigured")); + + if (res == 1) + return; + + file = askForAdbPath(); + } + } +} + +void DbAndroid::deviceListChanged() +{ + DBLIST->rescanInvalidDatabasesForPlugin(this); +} + +AdbManager* DbAndroid::getAdbManager() const +{ + return adbManager; +} |
