diff options
Diffstat (limited to 'plugins/scanfolder')
-rw-r--r-- | plugins/scanfolder/Makefile.am | 31 | ||||
-rw-r--r-- | plugins/scanfolder/ktscanfolderplugin.desktop | 26 | ||||
-rw-r--r-- | plugins/scanfolder/ktscanfolderplugin.kcfg | 53 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolder.cpp | 273 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolder.h | 111 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderplugin.cpp | 187 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderplugin.h | 61 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderpluginsettings.kcfgc | 7 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderprefpage.cpp | 66 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderprefpage.h | 53 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderprefpagewidget.cpp | 107 | ||||
-rw-r--r-- | plugins/scanfolder/scanfolderprefpagewidget.h | 36 | ||||
-rw-r--r-- | plugins/scanfolder/sfprefwidgetbase.ui | 272 |
13 files changed, 1283 insertions, 0 deletions
diff --git a/plugins/scanfolder/Makefile.am b/plugins/scanfolder/Makefile.am new file mode 100644 index 0000000..eb8cc52 --- /dev/null +++ b/plugins/scanfolder/Makefile.am @@ -0,0 +1,31 @@ +INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes) +METASOURCES = AUTO +kde_module_LTLIBRARIES = ktscanfolderplugin.la + + +# LD flags for the plugin +# -module says: this is a module, i.e. something you're going to dlopen +# so e.g. it has no version number like a normal shared lib would have. +ktscanfolderplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) + +# rc file containing the GUI for the plugin +# pluginsdir = $(kde_datadir)/ktscanfolderplugin +# plugins_DATA = ktscanfolderpluginui.rc + +# Install the desktop file needed to detect the plugin + +rcdir = $(kde_datadir)/ktorrent + +kde_kcfg_DATA = ktscanfolderplugin.kcfg +kde_services_DATA = ktscanfolderplugin.desktop + +noinst_HEADERS = scanfolderplugin.h scanfolderprefpage.h \ + scanfolderprefpagewidget.h scanfolder.h +ktscanfolderplugin_la_SOURCES = scanfolderplugin.cpp \ + scanfolderpluginsettings.kcfgc scanfolderprefpage.cpp sfprefwidgetbase.ui scanfolderprefpagewidget.cpp \ + scanfolder.cpp +ktscanfolderplugin_la_LIBADD = $(LIB_KPARTS) ../../libktorrent/libktorrent.la \ + $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE) + + +KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI) diff --git a/plugins/scanfolder/ktscanfolderplugin.desktop b/plugins/scanfolder/ktscanfolderplugin.desktop new file mode 100644 index 0000000..b6180de --- /dev/null +++ b/plugins/scanfolder/ktscanfolderplugin.desktop @@ -0,0 +1,26 @@ +[Desktop Entry] +Name=ScanFolderPlugin +Name[bg]=Приставка за сканиране +Name[cs]=Modul prohledávání složek +Name[da]=Plugin for mappesøgning +Name[de]=Ordner-Durchsuchen-Modul +Name[el]=Πρόσθετο σάρωσης φακέλων +Name[et]=Kataloogi uurimise plugin +Name[it]=Plugin scansione cartella +Name[nb]=Katalogundersøkingsmdoul +Name[nds]=Moduul för't Dörkieken vun Ornern +Name[nl]=Mapscanplugin +Name[pl]=Wtyczka przeszukiwania katalogów +Name[pt_BR]=Plugins de Busca +Name[sk]=ScanFolder Plugin +Name[sr]=Прикључак прегледа фасцикле +Name[sr@Latn]=Priključak pregleda fascikle +Name[sv]=Insticksprogram för katalogsökning +Name[tr]=Dizin Tarama Eklentisi +Name[uk]=Втулок сканування тек +Name[xx]=xxScanFolderPluginxx +Name[zh_CN]=扫描文件夹插件 +Name[zh_TW]=掃描資料夾外掛程式 +ServiceTypes=KTorrent/Plugin +Type=Service +X-KDE-Library=ktscanfolderplugin diff --git a/plugins/scanfolder/ktscanfolderplugin.kcfg b/plugins/scanfolder/ktscanfolderplugin.kcfg new file mode 100644 index 0000000..f9b919f --- /dev/null +++ b/plugins/scanfolder/ktscanfolderplugin.kcfg @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 + http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" > + + <group name="general"> + <entry name="useFolder1" type="Bool"> + <label>Enable scanning of folder1?</label> + <default>FALSE</default> + </entry> + + <entry name="useFolder2" type="Bool"> + <label>Enable scanning of folder2?</label> + <default>FALSE</default> + </entry> + + <entry name="useFolder3" type="Bool"> + <label>Enable scanning of folder3?</label> + <default>FALSE</default> + </entry> + + <entry name="folder1" type="String"> + <label>Folder1 path</label> + <default></default> + </entry> + + <entry name="folder2" type="String"> + <label>Folder2 path</label> + <default></default> + </entry> + + <entry name="folder3" type="String"> + <label>Folder3 path</label> + <default></default> + </entry> + + <entry name="openSilently" type="Bool"> + <label>Whether to open torrent silently or not.</label> + <default>FALSE</default> + </entry> + + <entry name="actionDelete" type="Bool"> + <label>Delete action checked.</label> + <default>FALSE</default> + </entry> + + <entry name="actionMove" type="Bool"> + <label>Move action checked.</label> + <default>FALSE</default> + </entry> + </group> +</kcfg> diff --git a/plugins/scanfolder/scanfolder.cpp b/plugins/scanfolder/scanfolder.cpp new file mode 100644 index 0000000..3c30299 --- /dev/null +++ b/plugins/scanfolder/scanfolder.cpp @@ -0,0 +1,273 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "scanfolder.h" + +#include <kdirlister.h> +#include <kfileitem.h> +#include <klocale.h> +#include <kio/job.h> + +#include <qstring.h> +#include <qobject.h> +#include <qfile.h> +#include <qvaluelist.h> + +#include <torrent/globals.h> +#include <util/log.h> +#include <util/fileops.h> +#include <util/functions.h> +#include <util/constants.h> + +#include <torrent/bnode.h> +#include <torrent/bdecoder.h> + +#include <interfaces/coreinterface.h> + +using namespace bt; + +namespace kt +{ + + ScanFolder::ScanFolder(CoreInterface* core, QString& dir, LoadedTorrentAction action, bool openSilently) + : m_core(core), m_dir(0), m_loadedAction(action), m_openSilently(openSilently) + { + m_dir = new KDirLister(); + + if(!m_dir->openURL(dir)) { + m_valid = false; + return; + } else + m_valid = true; + + m_dir->setShowingDotFiles(true); + + connect(m_dir, SIGNAL(newItems( const KFileItemList& )), this, SLOT(onNewItems( const KFileItemList& ))); + connect(m_core, SIGNAL(loadingFinished( const KURL&, bool, bool )), this, SLOT(onLoadingFinished( const KURL&, bool, bool ))); + connect(&m_incomplePollingTimer,SIGNAL(timeout()),this,SLOT(onIncompletePollingTimeout())); + } + + + ScanFolder::~ScanFolder() + { +// Out() << "UNLOADING SCANFOLDER: " << m_dir->url().path() << endl; + delete m_dir; + } + + void ScanFolder::onNewItems(const KFileItemList& items) + { + KFileItemList list = items; + KFileItem* file; + for(file=list.first(); file; file=list.next()) + { + QString name = file->name(); + QString dirname = m_dir->url().path(); + QString filename = dirname + bt::DirSeparator() + name; + + if(!name.endsWith(".torrent")) + continue; + + if(name.startsWith(".")) + { + //Check if corresponding torrent exists + if(!QFile::exists(m_dir->url().path() + bt::DirSeparator() + name.right(name.length() - 1)) && (m_loadedAction == defaultAction)) + QFile::remove(filename); + + continue; + } + + KURL source; + source.setPath(filename); + + //If torrent has it's hidden complement - skip it. + if(QFile::exists(dirname + "/." + name)) + continue; + + if (incomplete(source)) + { + // incomplete file, try this again in 10 seconds + bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : incomplete file " << source << endl; + m_incompleteURLs.append(source); + if (m_incompleteURLs.count() == 1) + { + // first URL so start the poll timer + // lets poll every 10 seconds + m_incomplePollingTimer.start(10000,false); + } + } + else + { + bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : found " << source << endl; + //Add pending entry... + m_pendingURLs.push_back(source); + + //Load torrent + if(m_openSilently) + m_core->loadSilently(source); + else + m_core->load(source); + } + } + } + + void ScanFolder::onLoadingFinished(const KURL & url, bool success, bool canceled) + { + if(m_pendingURLs.empty() || !success) + return; + + //search for entry + QValueList<KURL>::iterator it = m_pendingURLs.find(url); + + //if no entry is found than this torrent was not started by this plugin so - quit + if(it == m_pendingURLs.end()) + return; + + //remove this entry + m_pendingURLs.erase(it); + + if(canceled) + return; + + QString name = url.filename(false); + QString dirname = m_dir->url().path(); + QString filename = dirname + "/" + name; + KURL destination(dirname + "/" + i18n("loaded") + "/" + name); + + switch(m_loadedAction) { + case deleteAction: + //If torrent has it's hidden complement - remove it too. + if(QFile::exists(dirname + "/." + name)) + QFile::remove(dirname + "/." + name); + // Out() << "Deleting: " << name.ascii() << endl; + QFile::remove(filename); + break; + case moveAction: + // Out() << "Moving: " << name.ascii() << endl; + //If torrent has it's hidden complement - remove it too. + if(QFile::exists(dirname + "/." + name)) + QFile::remove(dirname + "/." + name); + + // NetAccess considered harmfull !!! + KIO::file_move(url, destination); + break; + case defaultAction: + QFile f(dirname + "/." + name); + f.open(IO_WriteOnly); + f.close(); + break; + } + } + + void ScanFolder::setOpenSilently(bool theValue) + { + m_openSilently = theValue; + } + + void ScanFolder::setLoadedAction(const LoadedTorrentAction& theValue) + { + m_loadedAction = theValue; + + QDir tmp(m_dir->url().path()); + + if( (m_loadedAction == moveAction) && !tmp.exists(i18n("loaded"), false)) + tmp.mkdir(i18n("loaded"), false); + } + + void ScanFolder::setFolderUrl(QString& url) + { + if(!m_dir->openURL(url)) { + m_valid = false; + return; + } else + m_valid = true; + } + + bool ScanFolder::incomplete(const KURL & src) + { + // try to decode file, if it is syntactically correct, we can try to load it + QFile fptr(src.path()); + if (!fptr.open(IO_ReadOnly)) + return false; + + try + { + QByteArray data(fptr.size()); + fptr.readBlock(data.data(),fptr.size()); + bt::BDecoder dec(data,false); + bt::BNode* n = dec.decode(); + if (n) + { + // valid node, so file is complete + delete n; + return false; + } + else + { + // decoding failed so incomplete + return true; + } + } + catch (...) + { + // any error means shit happened and the file is incomplete + return true; + } + return false; + } + + void ScanFolder::onIncompletePollingTimeout() + { + bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : checking incomplete files" << endl; + for (QValueList<KURL>::iterator i = m_incompleteURLs.begin(); i != m_incompleteURLs.end();) + { + KURL source = *i; + if (!bt::Exists(source.path())) + { + // doesn't exist anymore, so throw out of list + i = m_incompleteURLs.erase(i); + } + else if (!incomplete(source)) + { + bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : incomplete file " << source << " appears to be completed " << endl; + //Add pending entry... + m_pendingURLs.push_back(source); + + //Load torrent + if(m_openSilently) + m_core->loadSilently(source); + else + m_core->load(source); + + // remove from incomplete list + i = m_incompleteURLs.erase(i); + } + else + { + bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : still incomplete : " << source << endl; + i++; + } + } + + // stop timer when no incomple URL's are left + if (m_incompleteURLs.count() == 0) + m_incomplePollingTimer.stop(); + } +} + +#include "scanfolder.moc" diff --git a/plugins/scanfolder/scanfolder.h b/plugins/scanfolder/scanfolder.h new file mode 100644 index 0000000..8e8c27c --- /dev/null +++ b/plugins/scanfolder/scanfolder.h @@ -0,0 +1,111 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef SCANFOLDER_H +#define SCANFOLDER_H + +#include <kdirlister.h> +#include <kfileitem.h> +#include <qstring.h> +#include <qobject.h> +#include <qdir.h> +#include <qvaluelist.h> +#include <qtimer.h> +#include <kurl.h> + +namespace kt +{ + ///Action to perform after loading torrent. + enum LoadedTorrentAction + { + deleteAction, + moveAction, + defaultAction + }; + + class CoreInterface; + + /** + * @brief Scanned folder class. + * @author Ivan Vasić <ivasic@gmail.com> + * + * It will monitor m_dir directory for changes and automatically pass new torrents to core for loading. + * After loading, it will perform specified action which can be: + * 1. Deleting torrent in question + * 2. Moving torrent to 'loaded' subdirectory + * 3. Default action (neither 1. nor 2.) + * @see LoadedTorrentAction + * + */ + class ScanFolder : public QObject + { + Q_OBJECT + public: + + /** + * Default constructor. + * @param core Pointer to core interface + * @param dir Full directory path + * @param action Action to perform on loaded torrents. + * @param openSilently Wheather to open torrent silently or not. + */ + ScanFolder(CoreInterface* core, QString& dir, LoadedTorrentAction action = defaultAction, bool openSilently = true); + ~ScanFolder(); + + ///Accessor method for m_openSilently. + bool openSilently() const { return m_openSilently; } + ///Accessor method for m_openSilently + void setOpenSilently(bool theValue); + + ///Accessor method for m_loadedAction. + void setLoadedAction(const LoadedTorrentAction& theValue); + ///Accessor method for m_loadedAction. + LoadedTorrentAction loadedAction() const { return m_loadedAction; } + + ///Returns true if this object is valid, that is - weather directory is valid and this object does its work. + bool isValid() const { return m_valid; } + + ///Sets directory path + void setFolderUrl(QString& url); + + public slots: + void onNewItems(const KFileItemList &items); + void onLoadingFinished(const KURL & url,bool success,bool canceled); + void onIncompletePollingTimeout(); + + private: + /// Check if the URL is a complete file + bool incomplete(const KURL & src); + + private: + CoreInterface* m_core; + + bool m_valid; + KDirLister* m_dir; + + LoadedTorrentAction m_loadedAction; + bool m_openSilently; + + QValueList<KURL> m_pendingURLs; + QValueList<KURL> m_incompleteURLs; + + QTimer m_incomplePollingTimer; + }; +} +#endif diff --git a/plugins/scanfolder/scanfolderplugin.cpp b/plugins/scanfolder/scanfolderplugin.cpp new file mode 100644 index 0000000..a994243 --- /dev/null +++ b/plugins/scanfolder/scanfolderplugin.cpp @@ -0,0 +1,187 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include <kgenericfactory.h> + +#include <interfaces/coreinterface.h> +#include <interfaces/guiinterface.h> +#include <interfaces/plugin.h> +#include <util/constants.h> +#include <util/log.h> + +#include <qstring.h> +#include <qfile.h> + +#include <kmessagebox.h> +#include <klocale.h> +#include <kglobal.h> + +#include "scanfolder.h" +#include "scanfolderplugin.h" +#include "scanfolderprefpage.h" +#include "scanfolderpluginsettings.h" + +using namespace bt; + +K_EXPORT_COMPONENT_FACTORY(ktscanfolderplugin,KGenericFactory<kt::ScanFolderPlugin>("scanfolderplugin")) + +namespace kt +{ + const QString NAME = "Scan Folder"; + const QString AUTHOR = "Ivan Vasic"; + const QString EMAIL = "ivasic@gmail.com"; + const QString DESCRIPTION = i18n("Automatically scans directories for torrent files and loads them."); + + ScanFolderPlugin::ScanFolderPlugin(QObject* parent, const char* name, const QStringList& args) + : Plugin(parent, name, args,NAME,i18n("Scan Folder"),AUTHOR,EMAIL,DESCRIPTION,"view_sidetree") + { +// setXMLFile("ktscanfolderpluginui.rc"); + m_sf1 = 0; + m_sf2 = 0; + m_sf3 = 0; + } + + + ScanFolderPlugin::~ScanFolderPlugin() + { + } + + void ScanFolderPlugin::load() + { + pref = new ScanFolderPrefPage(this); + getGUI()->addPrefPage(pref); + updateScanFolders(); + } + + void ScanFolderPlugin::unload() + { + getGUI()->removePrefPage(pref); + delete pref; + pref = 0; + + if(m_sf1) + delete m_sf1; + m_sf1 = 0; + + if(m_sf2) + delete m_sf2; + m_sf2 = 0; + + if(m_sf3) + delete m_sf3; + m_sf3 = 0; + } + + void ScanFolderPlugin::updateScanFolders() + { + QString sfPath1 = ScanFolderPluginSettings::folder1(); + QString sfPath2 = ScanFolderPluginSettings::folder2(); + QString sfPath3 = ScanFolderPluginSettings::folder3(); + + bool valid1 = QFile::exists(sfPath1); + bool valid2 = QFile::exists(sfPath2); + bool valid3 = QFile::exists(sfPath3); + + bool usesf1 = ScanFolderPluginSettings::useFolder1() && valid1; + bool usesf2 = ScanFolderPluginSettings::useFolder2() && valid2; + bool usesf3 = ScanFolderPluginSettings::useFolder3() && valid3; + + bool silently = ScanFolderPluginSettings::openSilently(); + + LoadedTorrentAction action; + + if(ScanFolderPluginSettings::actionDelete()) + action = deleteAction; + else if(ScanFolderPluginSettings::actionMove()) + action = moveAction; + else + action = defaultAction; + + + if(usesf1) + { + if(!m_sf1) + m_sf1 = new ScanFolder(getCore(), sfPath1, action, silently); + else + { + m_sf1->setFolderUrl(sfPath1); + m_sf1->setLoadedAction(action); + m_sf1->setOpenSilently(silently); + } + } + else + { + if(m_sf1) + delete m_sf1; + m_sf1 = 0; + } + + if(usesf2) + { + if(!m_sf2) + m_sf2 = new ScanFolder(getCore(), sfPath1, action, silently); + else + { + m_sf2->setFolderUrl(sfPath1); + m_sf2->setLoadedAction(action); + m_sf2->setOpenSilently(silently); + } + } + else + { + if(m_sf2) + delete m_sf2; + m_sf2 = 0; + } + + if(usesf3) + { + if(!m_sf3) + m_sf3 = new ScanFolder(getCore(), sfPath1, action, silently); + else + { + m_sf3->setFolderUrl(sfPath1); + m_sf3->setLoadedAction(action); + m_sf3->setOpenSilently(silently); + } + } + else + { + if(m_sf3) + delete m_sf3; + m_sf3 = 0; + } + + //update config file + if(!valid1) + ScanFolderPluginSettings::setUseFolder1(false); + if(!valid2) + ScanFolderPluginSettings::setUseFolder2(false); + if(!valid3) + ScanFolderPluginSettings::setUseFolder3(false); + + ScanFolderPluginSettings::writeConfig(); + + } + + bool ScanFolderPlugin::versionCheck(const QString & version) const + { + return version == KT_VERSION_MACRO; + } +} diff --git a/plugins/scanfolder/scanfolderplugin.h b/plugins/scanfolder/scanfolderplugin.h new file mode 100644 index 0000000..2ef50c1 --- /dev/null +++ b/plugins/scanfolder/scanfolderplugin.h @@ -0,0 +1,61 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef KTSCANFOLDERPLUGIN_H +#define KTSCANFOLDERPLUGIN_H + +#include <interfaces/plugin.h> + +class QString; + + +namespace kt +{ + class ScanFolder; + class ScanFolderPrefPage; + + /** + * @author Ivan Vasic <ivasic@gmail.com> + * @brief KTorrent ScanFolder plugin + * Automatically scans selected folder for torrent files and loads them. + */ + class ScanFolderPlugin : public Plugin + { + Q_OBJECT + public: + ScanFolderPlugin(QObject* parent, const char* name, const QStringList& args); + virtual ~ScanFolderPlugin(); + + virtual void load(); + virtual void unload(); + virtual bool versionCheck(const QString& version) const; + + void updateScanFolders(); + + private: + ScanFolder* m_sf1; + ScanFolder* m_sf2; + ScanFolder* m_sf3; + + ScanFolderPrefPage* pref; + }; + +} + +#endif diff --git a/plugins/scanfolder/scanfolderpluginsettings.kcfgc b/plugins/scanfolder/scanfolderpluginsettings.kcfgc new file mode 100644 index 0000000..af1ebbc --- /dev/null +++ b/plugins/scanfolder/scanfolderpluginsettings.kcfgc @@ -0,0 +1,7 @@ +# Code generation options for kconfig_compiler +File=ktscanfolderplugin.kcfg +ClassName=ScanFolderPluginSettings +Namespace=kt +Singleton=true +Mutators=true +# will create the necessary code for setting those variables
\ No newline at end of file diff --git a/plugins/scanfolder/scanfolderprefpage.cpp b/plugins/scanfolder/scanfolderprefpage.cpp new file mode 100644 index 0000000..9abbf0d --- /dev/null +++ b/plugins/scanfolder/scanfolderprefpage.cpp @@ -0,0 +1,66 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "scanfolderplugin.h" +#include "scanfolderprefpage.h" + +#include <klocale.h> +#include <kglobal.h> +#include <kstandarddirs.h> +#include <kiconloader.h> + + + +namespace kt +{ + + ScanFolderPrefPage::ScanFolderPrefPage(ScanFolderPlugin* plugin) + : PrefPageInterface(i18n("ScanFolder"), i18n("ScanFolder Options"), + KGlobal::iconLoader()->loadIcon("view_sidetree",KIcon::NoGroup)), m_plugin(plugin) + {} + + + ScanFolderPrefPage::~ScanFolderPrefPage() + {} + + bool ScanFolderPrefPage::apply() + { + if(m_widget) + m_widget->apply(); + + m_plugin->updateScanFolders(); + + return true; + } + + void ScanFolderPrefPage::createWidget(QWidget* parent) + { + m_widget = new ScanFolderPrefPageWidget(parent); + } + + void ScanFolderPrefPage::updateData() + { + } + + void ScanFolderPrefPage::deleteWidget() + { + delete m_widget; + } + +} diff --git a/plugins/scanfolder/scanfolderprefpage.h b/plugins/scanfolder/scanfolderprefpage.h new file mode 100644 index 0000000..539a5fe --- /dev/null +++ b/plugins/scanfolder/scanfolderprefpage.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef KTSCANFOLDERPREFPAGE_H +#define KTSCANFOLDERPREFPAGE_H + +#include <interfaces/prefpageinterface.h> + +#include "scanfolderplugin.h" +#include "scanfolderprefpagewidget.h" + +namespace kt +{ + + /** + * ScanFolder plugin preferences page + * @author Ivan Vasić <ivasic@gmail.com> + */ + class ScanFolderPrefPage : public PrefPageInterface + { + public: + ScanFolderPrefPage(ScanFolderPlugin* plugin); + virtual ~ScanFolderPrefPage(); + + virtual bool apply(); + virtual void createWidget(QWidget* parent); + virtual void updateData(); + virtual void deleteWidget(); + + private: + ScanFolderPlugin* m_plugin; + ScanFolderPrefPageWidget* m_widget; + }; + +} + +#endif diff --git a/plugins/scanfolder/scanfolderprefpagewidget.cpp b/plugins/scanfolder/scanfolderprefpagewidget.cpp new file mode 100644 index 0000000..b577a88 --- /dev/null +++ b/plugins/scanfolder/scanfolderprefpagewidget.cpp @@ -0,0 +1,107 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "scanfolderprefpagewidget.h" +#include "scanfolderpluginsettings.h" + +#include <qwidget.h> +#include <qstring.h> +#include <qcheckbox.h> +#include <qfile.h> + +#include <kglobal.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kurlrequester.h> + +namespace kt +{ + ScanFolderPrefPageWidget::ScanFolderPrefPageWidget(QWidget *parent, const char *name) + :SfPrefPageWidgetBase(parent, name) + { + use1->setChecked(ScanFolderPluginSettings::useFolder1()); + use2->setChecked(ScanFolderPluginSettings::useFolder2()); + use3->setChecked(ScanFolderPluginSettings::useFolder3()); + + url1->setURL(ScanFolderPluginSettings::folder1()); + url2->setURL(ScanFolderPluginSettings::folder2()); + url3->setURL(ScanFolderPluginSettings::folder3()); + + openSilently->setChecked(ScanFolderPluginSettings::openSilently()); + deleteCheck->setChecked(ScanFolderPluginSettings::actionDelete()); + moveCheck->setChecked(ScanFolderPluginSettings::actionMove()); + + url1->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly); + url2->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly); + url3->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly); + } + + void ScanFolderPrefPageWidget::apply() + { + bool usesf1 = use1->isChecked(); + bool usesf2 = use2->isChecked(); + bool usesf3 = use3->isChecked(); + + QString sfPath1 = url1->url(); + QString sfPath2 = url2->url(); + QString sfPath3 = url3->url(); + + bool silently = openSilently->isChecked(); + bool deleteChecked = deleteCheck->isChecked(); + bool moveChecked = moveCheck->isChecked(); + + ScanFolderPluginSettings::setOpenSilently(silently); + ScanFolderPluginSettings::setActionDelete(deleteChecked); + ScanFolderPluginSettings::setActionMove(moveChecked); + + QString message = i18n( "ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a valid directory." ); + if(!QFile::exists(sfPath1) && usesf1) + { + KMessageBox::sorry(0, message.arg( 1 ) ); + usesf1 = false; + } + else + ScanFolderPluginSettings::setFolder1(sfPath1); + + if(!QFile::exists(sfPath2) && usesf2) + { + KMessageBox::sorry(0, message.arg( 2 ) ); + usesf2 = false; + } + else + ScanFolderPluginSettings::setFolder2(sfPath2); + + if(!QFile::exists(sfPath3) && usesf3) + { + KMessageBox::sorry(0, message.arg( 3 ) ); + usesf3 = false; + } + else + ScanFolderPluginSettings::setFolder3(sfPath3); + + + ScanFolderPluginSettings::setUseFolder1(usesf1); + ScanFolderPluginSettings::setUseFolder2(usesf2); + ScanFolderPluginSettings::setUseFolder3(usesf3); + + ScanFolderPluginSettings::writeConfig(); + } + +} +#include "scanfolderprefpagewidget.moc" diff --git a/plugins/scanfolder/scanfolderprefpagewidget.h b/plugins/scanfolder/scanfolderprefpagewidget.h new file mode 100644 index 0000000..480b3b0 --- /dev/null +++ b/plugins/scanfolder/scanfolderprefpagewidget.h @@ -0,0 +1,36 @@ +/*************************************************************************** + * Copyright (C) 2006 by Ivan Vasić * + * ivasic@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#ifndef SCANFOLDERPREFPAGEWIDGET_H +#define SCANFOLDERPREFPAGEWIDGET_H + +#include "sfprefwidgetbase.h" + +namespace kt +{ + class ScanFolderPrefPageWidget: public SfPrefPageWidgetBase + { + Q_OBJECT + public: + ScanFolderPrefPageWidget(QWidget *parent = 0, const char *name = 0); + + void apply(); + }; +} +#endif diff --git a/plugins/scanfolder/sfprefwidgetbase.ui b/plugins/scanfolder/sfprefwidgetbase.ui new file mode 100644 index 0000000..8b2c83a --- /dev/null +++ b/plugins/scanfolder/sfprefwidgetbase.ui @@ -0,0 +1,272 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>SfPrefPageWidgetBase</class> +<widget class="QWidget"> + <property name="name"> + <cstring>SfPrefPageWidgetBase</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>546</width> + <height>480</height> + </rect> + </property> + <property name="caption"> + <string>ScanFolder Preferences</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget" row="0" column="0"> + <property name="name"> + <cstring>layout16</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox"> + <property name="name"> + <cstring>use1</cstring> + </property> + <property name="text"> + <string>Scan folder &1</string> + </property> + <property name="accel"> + <string>Alt+1</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>use2</cstring> + </property> + <property name="text"> + <string>Scan folder &2</string> + </property> + <property name="accel"> + <string>Alt+2</string> + </property> + </widget> + <widget class="QCheckBox"> + <property name="name"> + <cstring>use3</cstring> + </property> + <property name="text"> + <string>Scan folder &3</string> + </property> + <property name="accel"> + <string>Alt+3</string> + </property> + </widget> + </vbox> + </widget> + <widget class="QButtonGroup" row="3" column="0"> + <property name="name"> + <cstring>buttonGroup1</cstring> + </property> + <property name="title"> + <string>Options</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="2" column="0"> + <property name="name"> + <cstring>moveCheck</cstring> + </property> + <property name="text"> + <string>Move to "loaded" directory &after loading</string> + </property> + <property name="toolTip" stdset="0"> + <string>Move torrent to "loaded" directory after loading it</string> + </property> + </widget> + <widget class="QCheckBox" row="0" column="0"> + <property name="name"> + <cstring>openSilently</cstring> + </property> + <property name="text"> + <string>Open torrents silentl&y</string> + </property> + <property name="toolTip" stdset="0"> + <string>Do not show 'Select files to download' dialog</string> + </property> + </widget> + <widget class="QCheckBox" row="1" column="0"> + <property name="name"> + <cstring>deleteCheck</cstring> + </property> + <property name="text"> + <string>Delete after loadin&g</string> + </property> + <property name="toolTip" stdset="0"> + <string>Deletes torrent after loading</string> + </property> + </widget> + </grid> + </widget> + <widget class="QGroupBox" row="2" column="0"> + <property name="name"> + <cstring>groupBox9</cstring> + </property> + <property name="title"> + <string>Folders to scan</string> + </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="KURLRequester" row="0" column="1"> + <property name="name"> + <cstring>url1</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KURLRequester" row="1" column="1"> + <property name="name"> + <cstring>url2</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="KURLRequester" row="2" column="1"> + <property name="name"> + <cstring>url3</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + </widget> + <widget class="QLabel" row="0" column="0"> + <property name="name"> + <cstring>textLabel1</cstring> + </property> + <property name="text"> + <string>Folder 1:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>kURLRequester1</cstring> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel2</cstring> + </property> + <property name="text"> + <string>Folder 2:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>kURLRequester4</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel3</cstring> + </property> + <property name="text"> + <string>Folder 3:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>kURLRequester5</cstring> + </property> + </widget> + </grid> + </widget> + <spacer row="1" column="0"> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Fixed</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <spacer row="4" column="0"> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>90</height> + </size> + </property> + </spacer> + </grid> +</widget> +<connections> + <connection> + <sender>use1</sender> + <signal>toggled(bool)</signal> + <receiver>url1</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>use2</sender> + <signal>toggled(bool)</signal> + <receiver>url2</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>use3</sender> + <signal>toggled(bool)</signal> + <receiver>url3</receiver> + <slot>setEnabled(bool)</slot> + </connection> + <connection> + <sender>deleteCheck</sender> + <signal>toggled(bool)</signal> + <receiver>moveCheck</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>moveCheck</sender> + <signal>toggled(bool)</signal> + <receiver>deleteCheck</receiver> + <slot>setDisabled(bool)</slot> + </connection> +</connections> +<tabstops> + <tabstop>use1</tabstop> + <tabstop>use2</tabstop> + <tabstop>use3</tabstop> + <tabstop>url1</tabstop> + <tabstop>url2</tabstop> + <tabstop>url3</tabstop> + <tabstop>openSilently</tabstop> + <tabstop>deleteCheck</tabstop> + <tabstop>moveCheck</tabstop> +</tabstops> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> + <includehint>kurlrequester.h</includehint> + <includehint>klineedit.h</includehint> + <includehint>kpushbutton.h</includehint> +</includehints> +</UI> |