X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fclient%2FMainWindow.cpp;h=8b89ae8a79cddc72a211470f17fa993220371114;hb=6ae61ea5faec84289c549193b680c32c9d0bf395;hp=5549bb951ff5b64d421f6f9ceb3b741c2ca1a6b3;hpb=55732cd61b5d6c85a5e90aee584f12cbca70e116;p=qtrapids diff --git a/src/client/MainWindow.cpp b/src/client/MainWindow.cpp index 5549bb9..8b89ae8 100644 --- a/src/client/MainWindow.cpp +++ b/src/client/MainWindow.cpp @@ -25,9 +25,10 @@ #include #include #include -#include -#include -#include +#include +#include +#include +#include #include "DownloadView.h" #include "SeedView.h" @@ -42,10 +43,11 @@ const QString ABOUT_TEXT = QString(QObject::trUtf8("QtRapids, a simple BitTorrent client based on" "\nQt and Libtorrent." "\n\nURL: http://qtrapids.garage.maemo.org/" - "\n\nAuthor(s):\nLassi Väätämöinen, lassi.vaatamoinen@ixonos.com" + "\n\nAuthors:\nLassi Väätämöinen, lassi.vaatamoinen@ixonos.com" "\nDenis Zalevskiy, denis.zalewsky@ixonos.com" "\n\nIxonos Plc, Finland\n")); +const QString PLUGINS_DIR = "plugins"; // Consturctor MainWindow::MainWindow() : @@ -53,9 +55,11 @@ MainWindow::MainWindow() : tabWidget_(NULL), dlView_(NULL), seedView_(NULL), + searchWidget_(NULL), preferencesDialog_(NULL), settings_(QCoreApplication::organizationName() , QCoreApplication::applicationName()), + pluginDirs_(), server_(QtRapidsServer::staticInterfaceName() , "/qtrapids", QDBusConnection::sessionBus()) // torrentHandles_(), @@ -88,6 +92,7 @@ MainWindow::MainWindow() : // TABWIDGET (central widget) tabWidget_ = new QTabWidget(); + tabWidget_->setTabsClosable(true); /// @todo Exception handling dlView_ = new DownloadView(this); @@ -114,21 +119,192 @@ MainWindow::MainWindow() : SLOT(setEnabled(bool))); connect(toolBar, SIGNAL(actionTriggered(QAction*)), this, SLOT(handleToolBarAction(QAction*))); + connect (tabWidget_, SIGNAL(tabCloseRequested(int)), this, SLOT(on_tabWidget_tabCloseRequested(int))); + connect(&server_, SIGNAL(alert(qtrapids::TorrentState, qtrapids::ParamsMap_t)), + this, SLOT(on_alert(qtrapids::TorrentState, qtrapids::ParamsMap_t))); + +// connect(&btSession_, SIGNAL(alert(std::auto_ptr)), +// this, SLOT(on_alert(std::auto_ptr))); + + + LoadPlugins(); + +} + + +MainWindow::~MainWindow() +{ + settings_.setValue("geometry", saveGeometry()); +} + +// ===================== Implements PluginInterface ========================= +/// @todo add PluginInterface parameter to request plugin name +bool MainWindow::setGui(QWidget* widget, PluginWidgetType type, qtrapids::PluginInterface* plugin) +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::setGui():" << dlView_->currentItem(); +#endif + + if (plugin && plugin->identifier() == "SearchPlugin") { + searchWidget_ = widget; + } else { + return false; + } + + tabWidget_->addTab(widget, tr("Search")); + return true; +} + +/// @todo Add PluginInterface parameter to check which plugin gives the widget, to handle appropriately +void MainWindow::addPluginWidget(QWidget* widget, PluginWidgetType type) +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::addPluginWidget():" << dlView_->currentItem(); +#endif + + if (type == qtrapids::PluginHostInterface::TAB_PAGE) { + int index = tabWidget_->addTab(widget, tr("Results")); + tabWidget_->setCurrentIndex(index); + //layout_->addWidget(widget); + } +} +void MainWindow::addToolbar(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addToolItem(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addMenu(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addMenuItem(QWidget* widget, PluginWidgetType type) +{ +} + +bool MainWindow::eventRequest(QVariant param, PluginRequest req) +{ + if (req == qtrapids::PluginHostInterface::OPEN_FILE) { + QString sourceFile = param.toString(); + + // Get the source files name from the full path: + QFileInfo fInfo(sourceFile); + QString targetFile = fInfo.fileName(); + targetFile = settings_.value("download/directory").toString() + "/" + targetFile; + + // Copy temoporary file to Downloads directory... + if (!QFile::copy(sourceFile, targetFile)) { + qDebug() << "File copying failed"; + return false; + } else { + // If copying was successful, remove the original temporary file. + QFile::remove(sourceFile); + } + + /// @todo Torrent bencoding validity should be checked before starting(?) + // ...and start the torrent: + on_torrentFileSelected(targetFile); + + } else if (req == qtrapids::PluginHostInterface::READ_BUFFER) { + // Create torrent information from char* buffer and start. + StartTorrentFromBufferData(param.toByteArray().constData(), param.toByteArray().size()); + } + + return true; +} + + +//=========================== PRIVATE ================================ + +void MainWindow::LoadPlugins() +{ + // Get plugin directories from + QStringList pluginDirsTmp = settings_.value("plugins/path").toStringList(); + QStringList nameFilters("*.so"); + + /// @todo enable "application directory" for plugin search in development/debug mode only. In release version + /// search plugins directory under $HOME/.qtrapids or system library paths + pluginDirsTmp << qApp->applicationDirPath(); + pluginDirsTmp.removeDuplicates(); + + foreach (QString dir, pluginDirsTmp) { + pluginDirs_.append(QDir(dir)); + } + + foreach (QDir dir, pluginDirs_) { + + if (dir.cd(PLUGINS_DIR)) { + + foreach (QString fileName, dir.entryList(nameFilters, QDir::Files)) { + QPluginLoader pluginLoader(dir.absoluteFilePath(fileName)); + + // If plugin not loaded from another directory, then load + if (!pluginFileNames_.contains(fileName) && QLibrary::isLibrary(fileName)) { + + if (pluginLoader.load()) { + qDebug() << "Plugin loaded: " << fileName; + } else { + qWarning() << "Plugin load failed: " << pluginLoader.errorString(); + } + + QObject *baseInstance = pluginLoader.instance(); + if (!baseInstance) { + qDebug() << "Base instance = NULL."; + } + + qtrapids::PluginInterface *plugin = qobject_cast(baseInstance); + + if (!plugin) { + qDebug() << "Cast failed."; + } else { + qtrapids::PluginInterface::Info info; + info.directory = dir.path(); + qDebug() << dir.path(); + plugin->initialize(this, info); + pluginFileNames_ += fileName; + } + } else { + qWarning() << "Plugin " + << fileName + << " already loaded from another directory, or not a valid library file"; + } + } + + } else { + qWarning() << PLUGINS_DIR << "directory not accessible or does not exist in " << dir.path(); + } + } +} + + +void MainWindow::RestoreSettings() +{ + + // Restore previous main window geometry: QVariant geometry(settings_.value("geometry")); if (!geometry.isNull()) { qDebug() << "restoring geometry"; restoreGeometry(geometry.toByteArray()); } + + // Restore torrent session settings to server: + qtrapids::ParamsMap_t options; + options["net/downloadRate"] = settings_.value("net/downloadRate").toString(); + options["net/uploadRate"] = settings_.value("net/uploadRate").toString(); + server_.setOptions(options); } -MainWindow::~MainWindow() +// Opens torrent information from buffer data and adds torrent to session +void MainWindow::StartTorrentFromBufferData(char const* data, int size) { - settings_.setValue("geometry", saveGeometry()); + } -// =========================== SLOTS ================================= +// =========================== PRIVATE SLOTS ================================= void MainWindow::on_openAction_clicked() { QFileDialog *dialog = new QFileDialog( this, "Open torrent file", QString(), tr("Torrent files (*.torrent)")); @@ -148,21 +324,25 @@ void MainWindow::on_removeAction_clicked() } } + void MainWindow::on_quitAction_clicked() { close(); } + void MainWindow::on_preferencesAction_clicked() { if (!preferencesDialog_) { - preferencesDialog_ = new PreferencesDialog(this); + preferencesDialog_ = new PreferencesDialog(this, 0, &server_); } + preferencesDialog_->show(); preferencesDialog_->raise(); preferencesDialog_->activateWindow(); } + void MainWindow::on_aboutAction_clicked() { QMessageBox::about(this, tr("About QtRapids"), ABOUT_TEXT); @@ -175,9 +355,27 @@ void MainWindow::on_aboutQtAction_clicked() } +void MainWindow::on_tabWidget_tabCloseRequested(int index) +{ + + int searchWidgetIndex = tabWidget_->indexOf(searchWidget_); + + // Allow closing other tabs than the first two + // TODO The first two may well be closable, just add "show tabs" action for these in the menu + if (index != 0 && index != 1 && index != searchWidgetIndex) { + QWidget *remove = tabWidget_->widget(index); + tabWidget_->removeTab(index); + delete remove; + remove = NULL; + } +} + + void MainWindow::on_downloadItemSelectionChanged() { +#ifdef QTRAPIDS_DEBUG qDebug() << "MainWindow::on_seedItemSelectionChanged():" << dlView_->currentItem(); +#endif if (dlView_->currentItem() != NULL) { emit(itemSelected(true)); } else { @@ -185,9 +383,12 @@ void MainWindow::on_downloadItemSelectionChanged() } } + void MainWindow::on_seedItemSelectionChanged() { +#ifdef QTRAPIDS_DEBUG qDebug() << "MainWindow::on_seedItemSelectionChanged():" << seedView_->currentItem(); +#endif if (seedView_->currentItem() != NULL) { emit(itemSelected(true)); } else { @@ -195,6 +396,7 @@ void MainWindow::on_seedItemSelectionChanged() } } + void MainWindow::handleToolBarAction(QAction* action) { if (action->text() == "Open") { @@ -204,9 +406,12 @@ void MainWindow::handleToolBarAction(QAction* action) } } + void MainWindow::on_torrentFileSelected(const QString& file) { +#ifdef QTRAPIDS_DEBUG qDebug() << " MainWindow::on_torrentFileSelected(): " << file; +#endif // Torrent filename empty, do nothing. if (file == "") { return; @@ -225,9 +430,11 @@ void MainWindow::on_torrentFileSelected(const QString& file) } -void MainWindow::alert(qtrapids::TorrentState info, qtrapids::ParamsMap_t other_info) +void MainWindow::on_alert(qtrapids::TorrentState info, qtrapids::ParamsMap_t other_info) { - std::cerr << "got alert" << std::endl; +#ifdef QTRAPIDS_DEBUG + qDebug() << "got alert"; +#endif dlView_->updateItem(info, other_info); }