From ff9a281b72ac46f5d2d90e84c380488f6342daf8 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Sun, 18 Jan 2015 15:13:06 +0300 Subject: [PATCH 1/9] Change project directory structure. Change project directory structure according to application structure. Change 'nox' configuration option to something more meaningful 'nogui'. Rename 'Icons' folder to 'icons' (similar to other folders). Partially add 'nowebui' option support. Remove QConf project file. --- .tx/config | 2 +- AUTHORS | 16 +- configure | 31 +- configure.ac | 21 +- {src => dist}/mac/Info.plist | 0 {src => dist}/mac/qBitTorrentDocument.icns | Bin {src => dist}/mac/qbittorrent_mac.icns | Bin {src => dist}/mac/qt.conf | 0 {src => dist}/qt-translations/qt_ar.qm | Bin {src => dist}/qt-translations/qt_bg.qm | Bin {src => dist}/qt-translations/qt_ca.qm | Bin {src => dist}/qt-translations/qt_cs.qm | Bin {src => dist}/qt-translations/qt_da.qm | Bin {src => dist}/qt-translations/qt_de.qm | Bin {src => dist}/qt-translations/qt_es.qm | Bin {src => dist}/qt-translations/qt_eu.qm | Bin {src => dist}/qt-translations/qt_fi.qm | Bin {src => dist}/qt-translations/qt_fr.qm | Bin {src => dist}/qt-translations/qt_gl.qm | Bin {src => dist}/qt-translations/qt_he.qm | Bin {src => dist}/qt-translations/qt_hu.qm | Bin {src => dist}/qt-translations/qt_it.qm | Bin {src => dist}/qt-translations/qt_ja.qm | Bin {src => dist}/qt-translations/qt_ko.qm | Bin {src => dist}/qt-translations/qt_lt.qm | Bin {src => dist}/qt-translations/qt_nl.qm | Bin {src => dist}/qt-translations/qt_pl.qm | Bin {src => dist}/qt-translations/qt_pt.qm | Bin {src => dist}/qt-translations/qt_pt_BR.qm | Bin {src => dist}/qt-translations/qt_ru.qm | Bin {src => dist}/qt-translations/qt_sk.qm | Bin {src => dist}/qt-translations/qt_sv.qm | Bin {src => dist}/qt-translations/qt_tr.qm | Bin {src => dist}/qt-translations/qt_uk.qm | Bin {src => dist}/qt-translations/qt_zh_CN.qm | Bin {src => dist}/qt-translations/qt_zh_TW.qm | Bin .../menuicons/128x128/apps/qbittorrent.png | Bin .../menuicons/16x16/apps/qbittorrent.png | Bin .../menuicons/192x192/apps}/qbittorrent.png | Bin .../menuicons/22x22/apps/qbittorrent.png | Bin .../menuicons/24x24/apps/qbittorrent.png | Bin .../menuicons/32x32/apps/qbittorrent.png | Bin .../menuicons/36x36/apps/qbittorrent.png | Bin .../menuicons/48x48/apps/qbittorrent.png | Bin .../menuicons/64x64/apps/qbittorrent.png | Bin .../menuicons/72x72/apps/qbittorrent.png | Bin .../menuicons/96x96/apps/qbittorrent.png | Bin {src => dist}/windows/README.txt | 4 +- {src => dist}/windows/UAC.nsh | 0 .../installer-translations/afrikaans.nsi | 0 .../installer-translations/albanian.nsi | 0 .../windows/installer-translations/arabic.nsi | 0 .../windows/installer-translations/basque.nsi | 0 .../installer-translations/belarusian.nsi | 0 .../installer-translations/bosnian.nsi | 0 .../windows/installer-translations/breton.nsi | 0 .../installer-translations/bulgarian.nsi | 0 .../installer-translations/catalan.nsi | 0 .../installer-translations/croatian.nsi | 0 .../windows/installer-translations/czech.nsi | 0 .../windows/installer-translations/danish.nsi | 0 .../windows/installer-translations/dutch.nsi | 0 .../installer-translations/english.nsi | 0 .../installer-translations/esperanto.nsi | 0 .../installer-translations/estonian.nsi | 0 .../windows/installer-translations/farsi.nsi | 0 .../installer-translations/finnish.nsi | 0 .../windows/installer-translations/french.nsi | 0 .../installer-translations/galician.nsi | 0 .../windows/installer-translations/german.nsi | 0 .../windows/installer-translations/greek.nsi | 0 .../windows/installer-translations/hebrew.nsi | 0 .../installer-translations/hungarian.nsi | 0 .../installer-translations/icelandic.nsi | 0 .../installer-translations/indonesian.nsi | 0 .../windows/installer-translations/irish.nsi | 0 .../installer-translations/italian.nsi | 0 .../installer-translations/japanese.nsi | 0 .../windows/installer-translations/korean.nsi | 0 .../installer-translations/kurdish.nsi | 0 .../installer-translations/latvian.nsi | 0 .../installer-translations/lithuanian.nsi | 0 .../installer-translations/luxembourgish.nsi | 0 .../installer-translations/macedonian.nsi | 0 .../windows/installer-translations/malay.nsi | 0 .../installer-translations/mongolian.nsi | 0 .../installer-translations/norwegian.nsi | 0 .../norwegiannynorsk.nsi | 0 .../windows/installer-translations/polish.nsi | 0 .../installer-translations/portuguese.nsi | 0 .../installer-translations/portugueseBR.nsi | 0 .../installer-translations/romanian.nsi | 0 .../installer-translations/russian.nsi | 0 .../installer-translations/serbian.nsi | 0 .../installer-translations/serbianlatin.nsi | 0 .../installer-translations/simpchinese.nsi | 0 .../windows/installer-translations/slovak.nsi | 0 .../installer-translations/slovenian.nsi | 0 .../installer-translations/spanish.nsi | 0 .../spanishinternational.nsi | 0 .../installer-translations/swedish.nsi | 0 .../windows/installer-translations/thai.nsi | 0 .../installer-translations/tradchinese.nsi | 0 .../installer-translations/turkish.nsi | 0 .../installer-translations/ukrainian.nsi | 0 .../windows/installer-translations/uzbek.nsi | 0 .../windows/installer-translations/welsh.nsi | 0 {src => dist}/windows/installer.nsi | 0 .../nsis plugins/FindProc Unicode-source.zip | Bin .../nsis plugins/FindProcDLL Unicode bin.zip | Bin .../windows/nsis plugins/UAC Unicode.zip | Bin {src => dist}/windows/nsis plugins/UAC.zip | Bin .../windows/nsis plugins/nsisFirewall.zip | Bin {src => dist}/windows/options.nsi | 0 {src => dist}/windows/qbittorrent.nsi | 0 {src => dist}/windows/qt.conf | 0 {src => dist}/windows/translations.nsi | 0 {src => dist}/windows/uninstaller.nsi | 0 macxconf.pri | 66 +- os2conf.pri | 11 +- qbittorrent.qc | 25 - src/app/app.pri | 40 + src/{ => app}/application.cpp | 0 src/{ => app}/application.h | 0 src/{ => app}/headlessloader.h | 0 src/{ => app}/main.cpp | 2 +- src/{ => app}/qmacapplication.cpp | 0 src/{ => app}/qmacapplication.h | 0 .../qtsingleapplication}/QtLockedFile | 0 .../qtsingleapplication}/QtSingleApplication | 0 .../qtsingleapplication}/qtlocalpeer.cpp | 0 .../qtsingleapplication}/qtlocalpeer.h | 0 .../qtsingleapplication}/qtlockedfile.cpp | 0 .../qtsingleapplication}/qtlockedfile.h | 0 .../qtlockedfile_unix.cpp | 0 .../qtsingleapplication}/qtlockedfile_win.cpp | 0 .../qtsingleapplication.cpp | 0 .../qtsingleapplication.h | 0 .../qtsingleapplication.pri | 0 .../qtsinglecoreapplication.cpp | 0 .../qtsinglecoreapplication.h | 0 .../qtsinglecoreapplication.pri | 0 src/{ => app}/sessionapplication.cpp | 0 src/{ => app}/sessionapplication.h | 0 src/{ => app}/stacktrace.h | 0 src/{ => app}/stacktrace_win.h | 0 src/{ => app}/stacktrace_win_dlg.h | 0 src/{ => app}/stacktrace_win_dlg.ui | 0 src/core/core.pri | 35 + src/{ => core}/dnsupdater.cpp | 0 src/{ => core}/dnsupdater.h | 0 src/{ => core}/downloadthread.cpp | 0 src/{ => core}/downloadthread.h | 0 src/{ => core}/filesystemwatcher.h | 0 src/{ => core}/fs_utils.cpp | 0 src/{ => core}/fs_utils.h | 0 src/{webui => core}/httprequestparser.cpp | 0 src/{webui => core}/httprequestparser.h | 0 src/{webui => core}/httpresponsegenerator.cpp | 0 src/{webui => core}/httpresponsegenerator.h | 0 src/{webui => core}/httptypes.h | 0 src/{ => core}/logger.cpp | 0 src/{ => core}/logger.h | 0 src/{ => core}/misc.cpp | 0 src/{ => core}/misc.h | 0 src/{preferences => core}/preferences.cpp | 0 src/{preferences => core}/preferences.h | 0 src/{ => core}/qinisettings.h | 0 .../qtlibtorrent/alertdispatcher.cpp | 0 src/{ => core}/qtlibtorrent/alertdispatcher.h | 0 .../qtlibtorrent/bandwidthscheduler.h | 0 .../qtlibtorrent/filterparserthread.cpp | 0 .../qtlibtorrent/filterparserthread.h | 0 src/{ => core}/qtlibtorrent/qbtsession.cpp | 0 src/{ => core}/qtlibtorrent/qbtsession.h | 0 src/{ => core}/qtlibtorrent/qtlibtorrent.pri | 0 .../qtlibtorrent/qtorrenthandle.cpp | 0 src/{ => core}/qtlibtorrent/qtorrenthandle.h | 0 .../qtlibtorrent/shutdownconfirm.cpp | 0 src/{ => core}/qtlibtorrent/shutdownconfirm.h | 0 src/{ => core}/qtlibtorrent/torrentmodel.cpp | 16 +- src/{ => core}/qtlibtorrent/torrentmodel.h | 0 .../qtlibtorrent/torrentspeedmonitor.cpp | 0 .../qtlibtorrent/torrentspeedmonitor.h | 0 .../qtlibtorrent/torrentstatistics.cpp | 0 .../qtlibtorrent/torrentstatistics.h | 0 src/{ => core}/qtlibtorrent/trackerinfos.h | 0 src/{ => core}/qtnotify/notifications.cpp | 0 src/{ => core}/qtnotify/notifications.h | 0 src/{ => core}/qtnotify/notifications.xml | 0 src/{ => core}/qtnotify/qtnotify.pri | 0 src/{ => core}/scannedfoldersmodel.cpp | 0 src/{ => core}/scannedfoldersmodel.h | 0 src/{ => core}/smtp.cpp | 0 src/{ => core}/smtp.h | 0 src/{ => core}/torrentpersistentdata.cpp | 0 src/{ => core}/torrentpersistentdata.h | 0 src/{ => core}/tracker/qpeer.h | 0 src/{ => core}/tracker/qtracker.cpp | 0 src/{ => core}/tracker/qtracker.h | 0 src/{ => core}/tracker/tracker.pri | 0 .../tracker/trackerannouncerequest.h | 0 src/{ => gui}/about.qrc | 0 src/{ => gui}/about.ui | 2 +- src/{ => gui}/about_imp.h | 2 +- src/{ => gui}/addnewtorrentdialog.cpp | 0 src/{ => gui}/addnewtorrentdialog.h | 0 src/{ => gui}/addnewtorrentdialog.ui | 0 src/{preferences => gui}/advancedsettings.h | 0 src/{ => gui}/autoexpandabledialog.cpp | 0 src/{ => gui}/autoexpandabledialog.h | 0 src/{ => gui}/autoexpandabledialog.ui | 0 src/{ => gui}/bandwidth_limit.ui | 0 src/{ => gui}/confirmdeletiondlg.ui | 0 src/{ => gui}/deletionconfirmationdlg.h | 0 src/{ => gui}/downloadfromurldlg.h | 0 src/{ => gui}/downloadfromurldlg.ui | 0 src/{ => gui}/executionlog.cpp | 0 src/{ => gui}/executionlog.h | 0 src/{ => gui}/executionlog.ui | 0 src/gui/geoip/GeoIP.dat | Bin 0 -> 1115209 bytes src/{ => gui}/geoip/README | 0 src/{ => gui}/geoip/geoip.pri | 0 src/{ => gui}/geoip/geoip.qrc | 0 src/{ => gui}/geoip/geoipmanager.cpp | 2 +- src/{ => gui}/geoip/geoipmanager.h | 0 src/{ => gui}/gpl.html | 0 src/gui/gui.pri | 96 +++ src/{ => gui}/hidabletabwidget.h | 0 src/{ => gui}/ico.cpp | 0 src/{ => gui}/ico.h | 0 src/{ => gui}/iconprovider.cpp | 8 +- src/{ => gui}/iconprovider.h | 0 src/{ => gui}/lineedit/lineedit.pri | 0 .../lineedit/resources/lineeditimages.qrc | 0 .../resources/lineeditimages/clear_left.png | Bin .../resources/lineeditimages/search.png | Bin src/{ => gui}/lineedit/src/lineedit.cpp | 0 src/{ => gui}/lineedit/src/lineedit.h | 0 src/{ => gui}/login.ui | 0 src/{ => gui}/loglistwidget.cpp | 0 src/{ => gui}/loglistwidget.h | 0 src/{ => gui}/mainwindow.cpp | 26 +- src/{ => gui}/mainwindow.h | 0 src/{ => gui}/mainwindow.ui | 2 +- src/{ => gui}/messageboxraised.cpp | 0 src/{ => gui}/messageboxraised.h | 0 src/{preferences => gui}/options.ui | 4 +- src/{preferences => gui}/options_imp.cpp | 10 +- src/{preferences => gui}/options_imp.h | 0 .../powermanagement/powermanagement.cpp | 0 .../powermanagement/powermanagement.h | 0 .../powermanagement/powermanagement.pri | 0 .../powermanagement/powermanagement_x11.cpp | 0 .../powermanagement/powermanagement_x11.h | 0 src/{ => gui}/preview.ui | 0 src/{ => gui}/previewlistdelegate.h | 0 src/{ => gui}/previewselect.cpp | 0 src/{ => gui}/previewselect.h | 0 src/{ => gui}/programupdater.cpp | 0 src/{ => gui}/programupdater.h | 0 .../properties/downloadedpiecesbar.cpp | 0 .../properties/downloadedpiecesbar.h | 0 src/{ => gui}/properties/peer.ui | 0 src/{ => gui}/properties/peeraddition.h | 0 src/{ => gui}/properties/peerlistdelegate.h | 0 src/{ => gui}/properties/peerlistsortmodel.h | 0 src/{ => gui}/properties/peerlistwidget.cpp | 4 +- src/{ => gui}/properties/peerlistwidget.h | 0 .../properties/pieceavailabilitybar.cpp | 0 .../properties/pieceavailabilitybar.h | 0 src/{ => gui}/properties/properties.pri | 0 src/{ => gui}/properties/propertieswidget.cpp | 0 src/{ => gui}/properties/propertieswidget.h | 0 src/{ => gui}/properties/propertieswidget.ui | 0 src/{ => gui}/properties/proplistdelegate.h | 0 src/{ => gui}/properties/proptabbar.cpp | 0 src/{ => gui}/properties/proptabbar.h | 0 src/{ => gui}/properties/trackerlist.cpp | 0 src/{ => gui}/properties/trackerlist.h | 0 .../properties/trackersadditiondlg.h | 0 .../properties/trackersadditiondlg.ui | 0 src/{ => gui}/reverseresolution.h | 0 src/{ => gui}/rss/automatedrssdownloader.cpp | 0 src/{ => gui}/rss/automatedrssdownloader.h | 0 src/{ => gui}/rss/automatedrssdownloader.ui | 4 +- src/{ => gui}/rss/cookiesdlg.cpp | 0 src/{ => gui}/rss/cookiesdlg.h | 0 src/{ => gui}/rss/cookiesdlg.ui | 0 src/{ => gui}/rss/feedlistwidget.cpp | 0 src/{ => gui}/rss/feedlistwidget.h | 0 src/{ => gui}/rss/htmlbrowser.cpp | 0 src/{ => gui}/rss/htmlbrowser.h | 0 src/{ => gui}/rss/rss.pri | 0 src/{ => gui}/rss/rss.ui | 0 src/{ => gui}/rss/rss_imp.cpp | 12 +- src/{ => gui}/rss/rss_imp.h | 0 src/{ => gui}/rss/rssarticle.cpp | 0 src/{ => gui}/rss/rssarticle.h | 0 src/{ => gui}/rss/rssdownloadrule.cpp | 0 src/{ => gui}/rss/rssdownloadrule.h | 0 src/{ => gui}/rss/rssdownloadrulelist.cpp | 0 src/{ => gui}/rss/rssdownloadrulelist.h | 0 src/{ => gui}/rss/rssfeed.cpp | 4 +- src/{ => gui}/rss/rssfeed.h | 0 src/{ => gui}/rss/rssfile.cpp | 0 src/{ => gui}/rss/rssfile.h | 0 src/{ => gui}/rss/rssfolder.cpp | 0 src/{ => gui}/rss/rssfolder.h | 0 src/{ => gui}/rss/rssmanager.cpp | 0 src/{ => gui}/rss/rssmanager.h | 0 src/{ => gui}/rss/rssparser.cpp | 0 src/{ => gui}/rss/rssparser.h | 0 src/{ => gui}/rss/rsssettingsdlg.cpp | 0 src/{ => gui}/rss/rsssettingsdlg.h | 0 src/{ => gui}/rss/rsssettingsdlg.ui | 2 +- src/{ => gui}/searchengine/engineselect.ui | 0 .../searchengine/engineselectdlg.cpp | 0 src/{ => gui}/searchengine/engineselectdlg.h | 0 src/{ => gui}/searchengine/nova/__init__.py | 0 .../searchengine/nova/engines/__init__.py | 0 .../searchengine/nova/engines/btdigg.png | Bin .../searchengine/nova/engines/btdigg.py | 0 .../nova/engines/extratorrent.png | Bin .../searchengine/nova/engines/extratorrent.py | 0 .../nova/engines/kickasstorrents.png | Bin .../nova/engines/kickasstorrents.py | 0 .../nova/engines/legittorrents.png | Bin .../nova/engines/legittorrents.py | 0 .../searchengine/nova/engines/mininova.png | Bin .../searchengine/nova/engines/mininova.py | 0 .../searchengine/nova/engines/piratebay.png | Bin .../searchengine/nova/engines/piratebay.py | 0 .../nova/engines/torrentreactor.png | Bin .../nova/engines/torrentreactor.py | 0 .../searchengine/nova/engines/versions.txt | 0 .../searchengine/nova/fix_encoding.py | 0 src/{ => gui}/searchengine/nova/helpers.py | 0 src/{ => gui}/searchengine/nova/nova2.py | 0 src/{ => gui}/searchengine/nova/nova2dl.py | 0 .../searchengine/nova/novaprinter.py | 0 src/{ => gui}/searchengine/nova/socks.py | 0 src/{ => gui}/searchengine/nova3/__init__.py | 0 .../searchengine/nova3/engines/__init__.py | 0 .../searchengine/nova3/engines/btdigg.png | Bin .../searchengine/nova3/engines/btdigg.py | 0 .../nova3/engines/extratorrent.png | Bin .../nova3/engines/extratorrent.py | 0 .../nova3/engines/kickasstorrents.png | Bin .../nova3/engines/kickasstorrents.py | 0 .../nova3/engines/legittorrents.png | Bin .../nova3/engines/legittorrents.py | 0 .../searchengine/nova3/engines/mininova.png | Bin .../searchengine/nova3/engines/mininova.py | 0 .../searchengine/nova3/engines/piratebay.png | Bin .../searchengine/nova3/engines/piratebay.py | 0 .../nova3/engines/torrentreactor.png | Bin .../nova3/engines/torrentreactor.py | 0 .../searchengine/nova3/engines/versions.txt | 0 src/{ => gui}/searchengine/nova3/helpers.py | 0 src/{ => gui}/searchengine/nova3/nova2.py | 0 src/{ => gui}/searchengine/nova3/nova2dl.py | 0 .../searchengine/nova3/novaprinter.py | 0 src/{ => gui}/searchengine/nova3/sgmllib3.py | 0 src/{ => gui}/searchengine/nova3/socks.py | 0 src/{ => gui}/searchengine/pluginsource.h | 0 src/{ => gui}/searchengine/pluginsource.ui | 0 src/{ => gui}/searchengine/search.qrc | 0 src/{ => gui}/searchengine/search.ui | 0 src/{ => gui}/searchengine/searchengine.cpp | 0 src/{ => gui}/searchengine/searchengine.h | 0 src/{ => gui}/searchengine/searchengine.pri | 0 .../searchengine/searchlistdelegate.h | 0 src/{ => gui}/searchengine/searchsortmodel.h | 0 src/{ => gui}/searchengine/searchtab.cpp | 0 src/{ => gui}/searchengine/searchtab.h | 0 src/{ => gui}/searchengine/supportedengines.h | 0 src/{ => gui}/speedlimitdlg.cpp | 0 src/{ => gui}/speedlimitdlg.h | 0 src/{ => gui}/statsdialog.cpp | 0 src/{ => gui}/statsdialog.h | 0 src/{ => gui}/statsdialog.ui | 0 src/{ => gui}/statusbar.cpp | 18 +- src/{ => gui}/statusbar.h | 0 src/{ => gui}/torrentcontentfiltermodel.cpp | 0 src/{ => gui}/torrentcontentfiltermodel.h | 0 src/{ => gui}/torrentcontentmodel.cpp | 0 src/{ => gui}/torrentcontentmodel.h | 0 src/{ => gui}/torrentcontentmodelfile.cpp | 0 src/{ => gui}/torrentcontentmodelfile.h | 0 src/{ => gui}/torrentcontentmodelfolder.cpp | 0 src/{ => gui}/torrentcontentmodelfolder.h | 0 src/{ => gui}/torrentcontentmodelitem.cpp | 0 src/{ => gui}/torrentcontentmodelitem.h | 0 src/{ => gui}/torrentcontenttreeview.cpp | 0 src/{ => gui}/torrentcontenttreeview.h | 0 src/{ => gui}/torrentcreator/createtorrent.ui | 0 .../torrentcreator/torrentcreator.pri | 0 .../torrentcreator/torrentcreatordlg.cpp | 0 .../torrentcreator/torrentcreatordlg.h | 0 .../torrentcreator/torrentcreatorthread.cpp | 0 .../torrentcreator/torrentcreatorthread.h | 0 src/{ => gui}/torrentfilterenum.h | 0 src/{ => gui}/torrentimportdlg.cpp | 0 src/{ => gui}/torrentimportdlg.h | 0 src/{ => gui}/torrentimportdlg.ui | 0 src/{ => gui}/trackerlogin.cpp | 2 +- src/{ => gui}/trackerlogin.h | 0 src/{ => gui}/transferlistdelegate.cpp | 2 +- src/{ => gui}/transferlistdelegate.h | 0 src/{ => gui}/transferlistfilterswidget.cpp | 14 +- src/{ => gui}/transferlistfilterswidget.h | 0 src/{ => gui}/transferlistsortmodel.cpp | 0 src/{ => gui}/transferlistsortmodel.h | 0 src/{ => gui}/transferlistwidget.cpp | 8 +- src/{ => gui}/transferlistwidget.h | 0 src/{ => gui}/updownratiodlg.cpp | 0 src/{ => gui}/updownratiodlg.h | 0 src/{ => gui}/updownratiodlg.ui | 0 src/icons.qrc | 734 +++++++++--------- src/{Icons => icons}/3-state-checkbox.gif | Bin src/{Icons => icons}/L.gif | Bin src/{Icons => icons}/flags/ad.png | Bin src/{Icons => icons}/flags/ae.png | Bin src/{Icons => icons}/flags/af.png | Bin src/{Icons => icons}/flags/ag.png | Bin src/{Icons => icons}/flags/ai.png | Bin src/{Icons => icons}/flags/al.png | Bin src/{Icons => icons}/flags/am.png | Bin src/{Icons => icons}/flags/an.png | Bin src/{Icons => icons}/flags/ao.png | Bin src/{Icons => icons}/flags/ar.png | Bin src/{Icons => icons}/flags/as.png | Bin src/{Icons => icons}/flags/at.png | Bin src/{Icons => icons}/flags/au.png | Bin src/{Icons => icons}/flags/aw.png | Bin src/{Icons => icons}/flags/ax.png | Bin src/{Icons => icons}/flags/az.png | Bin src/{Icons => icons}/flags/ba.png | Bin src/{Icons => icons}/flags/bb.png | Bin src/{Icons => icons}/flags/bd.png | Bin src/{Icons => icons}/flags/be.png | Bin src/{Icons => icons}/flags/bf.png | Bin src/{Icons => icons}/flags/bg.png | Bin src/{Icons => icons}/flags/bh.png | Bin src/{Icons => icons}/flags/bi.png | Bin src/{Icons => icons}/flags/bj.png | Bin src/{Icons => icons}/flags/bm.png | Bin src/{Icons => icons}/flags/bn.png | Bin src/{Icons => icons}/flags/bo.png | Bin src/{Icons => icons}/flags/br.png | Bin src/{Icons => icons}/flags/bs.png | Bin src/{Icons => icons}/flags/bt.png | Bin src/{Icons => icons}/flags/bv.png | Bin src/{Icons => icons}/flags/bw.png | Bin src/{Icons => icons}/flags/by.png | Bin src/{Icons => icons}/flags/bz.png | Bin src/{Icons => icons}/flags/ca.png | Bin src/{Icons => icons}/flags/cc.png | Bin src/{Icons => icons}/flags/cd.png | Bin src/{Icons => icons}/flags/cf.png | Bin src/{Icons => icons}/flags/cg.png | Bin src/{Icons => icons}/flags/ch.png | Bin src/{Icons => icons}/flags/ci.png | Bin src/{Icons => icons}/flags/ck.png | Bin src/{Icons => icons}/flags/cl.png | Bin src/{Icons => icons}/flags/cm.png | Bin src/{Icons => icons}/flags/cn.png | Bin src/{Icons => icons}/flags/co.png | Bin src/{Icons => icons}/flags/cr.png | Bin src/{Icons => icons}/flags/cs.png | Bin src/{Icons => icons}/flags/cu.png | Bin src/{Icons => icons}/flags/cv.png | Bin src/{Icons => icons}/flags/cx.png | Bin src/{Icons => icons}/flags/cy.png | Bin src/{Icons => icons}/flags/cz.png | Bin src/{Icons => icons}/flags/de.png | Bin src/{Icons => icons}/flags/dj.png | Bin src/{Icons => icons}/flags/dk.png | Bin src/{Icons => icons}/flags/dm.png | Bin src/{Icons => icons}/flags/do.png | Bin src/{Icons => icons}/flags/dz.png | Bin src/{Icons => icons}/flags/ec.png | Bin src/{Icons => icons}/flags/ee.png | Bin src/{Icons => icons}/flags/eg.png | Bin src/{Icons => icons}/flags/eh.png | Bin src/{Icons => icons}/flags/er.png | Bin src/{Icons => icons}/flags/es.png | Bin src/{Icons => icons}/flags/et.png | Bin src/{Icons => icons}/flags/fi.png | Bin src/{Icons => icons}/flags/fj.png | Bin src/{Icons => icons}/flags/fk.png | Bin src/{Icons => icons}/flags/fm.png | Bin src/{Icons => icons}/flags/fo.png | Bin src/{Icons => icons}/flags/fr.png | Bin src/{Icons => icons}/flags/ga.png | Bin src/{Icons => icons}/flags/gb.png | Bin src/{Icons => icons}/flags/gd.png | Bin src/{Icons => icons}/flags/ge.png | Bin src/{Icons => icons}/flags/gf.png | Bin src/{Icons => icons}/flags/gh.png | Bin src/{Icons => icons}/flags/gi.png | Bin src/{Icons => icons}/flags/gl.png | Bin src/{Icons => icons}/flags/gm.png | Bin src/{Icons => icons}/flags/gn.png | Bin src/{Icons => icons}/flags/gp.png | Bin src/{Icons => icons}/flags/gq.png | Bin src/{Icons => icons}/flags/gr.png | Bin src/{Icons => icons}/flags/gs.png | Bin src/{Icons => icons}/flags/gt.png | Bin src/{Icons => icons}/flags/gu.png | Bin src/{Icons => icons}/flags/gw.png | Bin src/{Icons => icons}/flags/gy.png | Bin src/{Icons => icons}/flags/hk.png | Bin src/{Icons => icons}/flags/hm.png | Bin src/{Icons => icons}/flags/hn.png | Bin src/{Icons => icons}/flags/hr.png | Bin src/{Icons => icons}/flags/ht.png | Bin src/{Icons => icons}/flags/hu.png | Bin .../flags/icons-set-readme.txt | 0 src/{Icons => icons}/flags/id.png | Bin src/{Icons => icons}/flags/ie.png | Bin src/{Icons => icons}/flags/il.png | Bin src/{Icons => icons}/flags/in.png | Bin src/{Icons => icons}/flags/io.png | Bin src/{Icons => icons}/flags/iq.png | Bin src/{Icons => icons}/flags/ir.png | Bin src/{Icons => icons}/flags/is.png | Bin src/{Icons => icons}/flags/it.png | Bin src/{Icons => icons}/flags/jm.png | Bin src/{Icons => icons}/flags/jo.png | Bin src/{Icons => icons}/flags/jp.png | Bin src/{Icons => icons}/flags/ke.png | Bin src/{Icons => icons}/flags/kg.png | Bin src/{Icons => icons}/flags/kh.png | Bin src/{Icons => icons}/flags/ki.png | Bin src/{Icons => icons}/flags/km.png | Bin src/{Icons => icons}/flags/kn.png | Bin src/{Icons => icons}/flags/kp.png | Bin src/{Icons => icons}/flags/kr.png | Bin src/{Icons => icons}/flags/kw.png | Bin src/{Icons => icons}/flags/ky.png | Bin src/{Icons => icons}/flags/kz.png | Bin src/{Icons => icons}/flags/la.png | Bin src/{Icons => icons}/flags/lb.png | Bin src/{Icons => icons}/flags/lc.png | Bin src/{Icons => icons}/flags/li.png | Bin src/{Icons => icons}/flags/lk.png | Bin src/{Icons => icons}/flags/lr.png | Bin src/{Icons => icons}/flags/ls.png | Bin src/{Icons => icons}/flags/lt.png | Bin src/{Icons => icons}/flags/lu.png | Bin src/{Icons => icons}/flags/lv.png | Bin src/{Icons => icons}/flags/ly.png | Bin src/{Icons => icons}/flags/ma.png | Bin src/{Icons => icons}/flags/mc.png | Bin src/{Icons => icons}/flags/md.png | Bin src/{Icons => icons}/flags/me.png | Bin src/{Icons => icons}/flags/mg.png | Bin src/{Icons => icons}/flags/mh.png | Bin src/{Icons => icons}/flags/mk.png | Bin src/{Icons => icons}/flags/ml.png | Bin src/{Icons => icons}/flags/mm.png | Bin src/{Icons => icons}/flags/mn.png | Bin src/{Icons => icons}/flags/mo.png | Bin src/{Icons => icons}/flags/mp.png | Bin src/{Icons => icons}/flags/mq.png | Bin src/{Icons => icons}/flags/mr.png | Bin src/{Icons => icons}/flags/ms.png | Bin src/{Icons => icons}/flags/mt.png | Bin src/{Icons => icons}/flags/mu.png | Bin src/{Icons => icons}/flags/mv.png | Bin src/{Icons => icons}/flags/mw.png | Bin src/{Icons => icons}/flags/mx.png | Bin src/{Icons => icons}/flags/my.png | Bin src/{Icons => icons}/flags/mz.png | Bin src/{Icons => icons}/flags/na.png | Bin src/{Icons => icons}/flags/nc.png | Bin src/{Icons => icons}/flags/ne.png | Bin src/{Icons => icons}/flags/nf.png | Bin src/{Icons => icons}/flags/ng.png | Bin src/{Icons => icons}/flags/ni.png | Bin src/{Icons => icons}/flags/nl.png | Bin src/{Icons => icons}/flags/no.png | Bin src/{Icons => icons}/flags/np.png | Bin src/{Icons => icons}/flags/nr.png | Bin src/{Icons => icons}/flags/nu.png | Bin src/{Icons => icons}/flags/nz.png | Bin src/{Icons => icons}/flags/om.png | Bin src/{Icons => icons}/flags/pa.png | Bin src/{Icons => icons}/flags/pe.png | Bin src/{Icons => icons}/flags/pf.png | Bin src/{Icons => icons}/flags/pg.png | Bin src/{Icons => icons}/flags/ph.png | Bin src/{Icons => icons}/flags/pk.png | Bin src/{Icons => icons}/flags/pl.png | Bin src/{Icons => icons}/flags/pm.png | Bin src/{Icons => icons}/flags/pn.png | Bin src/{Icons => icons}/flags/pr.png | Bin src/{Icons => icons}/flags/ps.png | Bin src/{Icons => icons}/flags/pt.png | Bin src/{Icons => icons}/flags/pw.png | Bin src/{Icons => icons}/flags/py.png | Bin src/{Icons => icons}/flags/qa.png | Bin src/{Icons => icons}/flags/re.png | Bin src/{Icons => icons}/flags/ro.png | Bin src/{Icons => icons}/flags/rs.png | Bin src/{Icons => icons}/flags/ru.png | Bin src/{Icons => icons}/flags/rw.png | Bin src/{Icons => icons}/flags/sa.png | Bin src/{Icons => icons}/flags/sb.png | Bin src/{Icons => icons}/flags/sc.png | Bin src/{Icons => icons}/flags/sd.png | Bin src/{Icons => icons}/flags/se.png | Bin src/{Icons => icons}/flags/sg.png | Bin src/{Icons => icons}/flags/sh.png | Bin src/{Icons => icons}/flags/si.png | Bin src/{Icons => icons}/flags/sj.png | Bin src/{Icons => icons}/flags/sk.png | Bin src/{Icons => icons}/flags/sl.png | Bin src/{Icons => icons}/flags/sm.png | Bin src/{Icons => icons}/flags/sn.png | Bin src/{Icons => icons}/flags/so.png | Bin src/{Icons => icons}/flags/sr.png | Bin src/{Icons => icons}/flags/st.png | Bin src/{Icons => icons}/flags/sv.png | Bin src/{Icons => icons}/flags/sy.png | Bin src/{Icons => icons}/flags/sz.png | Bin src/{Icons => icons}/flags/tc.png | Bin src/{Icons => icons}/flags/td.png | Bin src/{Icons => icons}/flags/tf.png | Bin src/{Icons => icons}/flags/tg.png | Bin src/{Icons => icons}/flags/th.png | Bin src/{Icons => icons}/flags/tj.png | Bin src/{Icons => icons}/flags/tk.png | Bin src/{Icons => icons}/flags/tl.png | Bin src/{Icons => icons}/flags/tm.png | Bin src/{Icons => icons}/flags/tn.png | Bin src/{Icons => icons}/flags/to.png | Bin src/{Icons => icons}/flags/tr.png | Bin src/{Icons => icons}/flags/tt.png | Bin src/{Icons => icons}/flags/tv.png | Bin src/{Icons => icons}/flags/tw.png | Bin src/{Icons => icons}/flags/tz.png | Bin src/{Icons => icons}/flags/ua.png | Bin src/{Icons => icons}/flags/ug.png | Bin src/{Icons => icons}/flags/um.png | Bin src/{Icons => icons}/flags/us.png | Bin src/{Icons => icons}/flags/uy.png | Bin src/{Icons => icons}/flags/uz.png | Bin src/{Icons => icons}/flags/va.png | Bin src/{Icons => icons}/flags/vc.png | Bin src/{Icons => icons}/flags/ve.png | Bin src/{Icons => icons}/flags/vg.png | Bin src/{Icons => icons}/flags/vi.png | Bin src/{Icons => icons}/flags/vn.png | Bin src/{Icons => icons}/flags/vu.png | Bin src/{Icons => icons}/flags/wf.png | Bin src/{Icons => icons}/flags/ws.png | Bin src/{Icons => icons}/flags/ye.png | Bin src/{Icons => icons}/flags/yt.png | Bin src/{Icons => icons}/flags/za.png | Bin src/{Icons => icons}/flags/zm.png | Bin src/{Icons => icons}/flags/zw.png | Bin src/{Icons => icons}/loading.png | Bin src/{Icons => icons}/magnet.png | Bin .../oxygen/application-exit.png | Bin .../oxygen/application-rss+xml.png | Bin .../oxygen/application-x-mswinurl.png | Bin src/{Icons => icons}/oxygen/checked.png | Bin src/{Icons => icons}/oxygen/chronometer.png | Bin src/{Icons => icons}/oxygen/dialog-cancel.png | Bin .../oxygen/dialog-information.png | Bin .../oxygen/dialog-warning.png | Bin .../oxygen/document-edit-verify.png | Bin src/{Icons => icons}/oxygen/document-edit.png | Bin .../oxygen/document-encrypt.png | Bin .../oxygen/document-import.png | Bin src/{Icons => icons}/oxygen/document-new.png | Bin .../oxygen/document-properties.png | Bin src/{Icons => icons}/oxygen/document-save.png | Bin src/{Icons => icons}/oxygen/download.png | Bin .../oxygen/edit-clear-history.png | Bin src/{Icons => icons}/oxygen/edit-clear.png | Bin src/{Icons => icons}/oxygen/edit-copy.png | Bin src/{Icons => icons}/oxygen/edit-cut.png | Bin src/{Icons => icons}/oxygen/edit-delete.png | Bin .../oxygen/edit-find-user.png | Bin src/{Icons => icons}/oxygen/edit-find.png | Bin src/{Icons => icons}/oxygen/edit-paste.png | Bin src/{Icons => icons}/oxygen/edit-rename.png | Bin .../oxygen/folder-documents.png | Bin src/{Icons => icons}/oxygen/folder-new.png | Bin src/{Icons => icons}/oxygen/folder-remote.png | Bin src/{Icons => icons}/oxygen/gear.png | Bin src/{Icons => icons}/oxygen/gear32.png | Bin src/{Icons => icons}/oxygen/go-bottom.png | Bin src/{Icons => icons}/oxygen/go-down.png | Bin src/{Icons => icons}/oxygen/go-top.png | Bin src/{Icons => icons}/oxygen/go-up.png | Bin src/{Icons => icons}/oxygen/help-about.png | Bin src/{Icons => icons}/oxygen/help-contents.png | Bin .../oxygen/inode-directory.png | Bin src/{Icons => icons}/oxygen/insert-link.png | Bin src/{Icons => icons}/oxygen/list-add.png | Bin src/{Icons => icons}/oxygen/list-remove.png | Bin .../oxygen/mail-folder-inbox.png | Bin .../oxygen/mail-mark-read.png | Bin .../oxygen/media-playback-pause.png | Bin .../oxygen/media-playback-start.png | Bin .../oxygen/network-server.png | Bin src/{Icons => icons}/oxygen/network-wired.png | Bin src/{Icons => icons}/oxygen/object-locked.png | Bin .../oxygen/preferences-desktop.png | Bin .../oxygen/preferences-other.png | Bin .../oxygen/preferences-system-network.png | Bin .../oxygen/preferences-system.png | Bin .../preferences-web-browser-cookies.png | Bin src/{Icons => icons}/oxygen/security-high.png | Bin src/{Icons => icons}/oxygen/security-low.png | Bin src/{Icons => icons}/oxygen/services.png | Bin .../oxygen/system-log-out.png | Bin src/{Icons => icons}/oxygen/tab-close.png | Bin .../oxygen/task-attention.png | Bin src/{Icons => icons}/oxygen/text-plain.png | Bin .../oxygen/tools-report-bug.png | Bin src/{Icons => icons}/oxygen/unavailable.png | Bin .../oxygen/user-group-delete.png | Bin .../oxygen/user-group-new.png | Bin .../oxygen/view-calendar-journal.png | Bin .../oxygen/view-categories.png | Bin src/{Icons => icons}/oxygen/view-filter.png | Bin src/{Icons => icons}/oxygen/view-preview.png | Bin src/{Icons => icons}/oxygen/view-refresh.png | Bin .../oxygen/view-statistics.png | Bin src/{Icons => icons}/oxygen/wallet-open.png | Bin src/{Icons => icons}/oxygen/webui.png | Bin src/{Icons => icons}/qBittorrent.desktop | 0 .../192x192/apps => icons}/qbittorrent.png | Bin src/{Icons => icons}/skin/arrow-right.gif | Bin src/{Icons => icons}/skin/bg-dropdown.gif | Bin .../skin/bg-handle-horizontal.gif | Bin src/{Icons => icons}/skin/bg-header.gif | Bin src/{Icons => icons}/skin/bg-panel-header.gif | Bin src/{Icons => icons}/skin/checking.png | Bin src/{Icons => icons}/skin/collapse-expand.gif | Bin src/{Icons => icons}/skin/connected.png | Bin src/{Icons => icons}/skin/disconnected.png | Bin src/{Icons => icons}/skin/dock-tabs.gif | Bin src/{Icons => icons}/skin/download.png | Bin src/{Icons => icons}/skin/downloading.png | Bin src/{Icons => icons}/skin/error.png | Bin src/{Icons => icons}/skin/filteractive.png | Bin src/{Icons => icons}/skin/filterall.png | Bin src/{Icons => icons}/skin/filterinactive.png | Bin src/{Icons => icons}/skin/firewalled.png | Bin .../skin/handle-icon-horizontal.gif | Bin src/{Icons => icons}/skin/handle-icon.gif | Bin src/{Icons => icons}/skin/knob.gif | Bin src/{Icons => icons}/skin/logo-blank.gif | Bin src/{Icons => icons}/skin/logo.gif | Bin src/{Icons => icons}/skin/logo2.gif | Bin src/{Icons => icons}/skin/mascot.png | Bin src/{Icons => icons}/skin/paused.png | Bin src/{Icons => icons}/skin/qbittorrent16.png | Bin src/{Icons => icons}/skin/qbittorrent22.png | Bin src/{Icons => icons}/skin/qbittorrent32.png | Bin .../skin/qbittorrent_mono.svg | 0 .../skin/qbittorrent_mono_dark.png | Bin .../skin/qbittorrent_mono_light.png | Bin src/{Icons => icons}/skin/queued.png | Bin src/{Icons => icons}/skin/ratio.png | Bin src/{Icons => icons}/skin/resumed.png | Bin src/{Icons => icons}/skin/seeding.png | Bin src/{Icons => icons}/skin/slider-area.gif | Bin src/{Icons => icons}/skin/spacer.gif | Bin .../skin/spinner-placeholder.gif | Bin src/{Icons => icons}/skin/spinner.gif | Bin src/{Icons => icons}/skin/splash.png | Bin src/{Icons => icons}/skin/stalledDL.png | Bin src/{Icons => icons}/skin/stalledUP.png | Bin src/{Icons => icons}/skin/tabs.gif | Bin src/{Icons => icons}/skin/toolbox-divider.gif | Bin .../skin/toolbox-divider2.gif | Bin src/{Icons => icons}/skin/uploading.png | Bin src/{Icons => icons}/slow.png | Bin src/{Icons => icons}/slow_off.png | Bin src/{Icons => icons}/sphere.png | Bin src/{Icons => icons}/sphere2.png | Bin src/{Icons => icons}/url.png | Bin src/preferences/preferences.pri | 15 - src/src.pro | 297 ++----- src/update_qrc_files.py | 6 +- src/webui/requesthandler.cpp | 6 +- src/webui/webui.pri | 3 - unixconf.pri | 105 ++- winconf.pri | 11 +- 797 files changed, 840 insertions(+), 828 deletions(-) rename {src => dist}/mac/Info.plist (100%) rename {src => dist}/mac/qBitTorrentDocument.icns (100%) rename {src => dist}/mac/qbittorrent_mac.icns (100%) rename {src => dist}/mac/qt.conf (100%) rename {src => dist}/qt-translations/qt_ar.qm (100%) rename {src => dist}/qt-translations/qt_bg.qm (100%) rename {src => dist}/qt-translations/qt_ca.qm (100%) rename {src => dist}/qt-translations/qt_cs.qm (100%) rename {src => dist}/qt-translations/qt_da.qm (100%) rename {src => dist}/qt-translations/qt_de.qm (100%) rename {src => dist}/qt-translations/qt_es.qm (100%) rename {src => dist}/qt-translations/qt_eu.qm (100%) rename {src => dist}/qt-translations/qt_fi.qm (100%) rename {src => dist}/qt-translations/qt_fr.qm (100%) rename {src => dist}/qt-translations/qt_gl.qm (100%) rename {src => dist}/qt-translations/qt_he.qm (100%) rename {src => dist}/qt-translations/qt_hu.qm (100%) rename {src => dist}/qt-translations/qt_it.qm (100%) rename {src => dist}/qt-translations/qt_ja.qm (100%) rename {src => dist}/qt-translations/qt_ko.qm (100%) rename {src => dist}/qt-translations/qt_lt.qm (100%) rename {src => dist}/qt-translations/qt_nl.qm (100%) rename {src => dist}/qt-translations/qt_pl.qm (100%) rename {src => dist}/qt-translations/qt_pt.qm (100%) rename {src => dist}/qt-translations/qt_pt_BR.qm (100%) rename {src => dist}/qt-translations/qt_ru.qm (100%) rename {src => dist}/qt-translations/qt_sk.qm (100%) rename {src => dist}/qt-translations/qt_sv.qm (100%) rename {src => dist}/qt-translations/qt_tr.qm (100%) rename {src => dist}/qt-translations/qt_uk.qm (100%) rename {src => dist}/qt-translations/qt_zh_CN.qm (100%) rename {src => dist}/qt-translations/qt_zh_TW.qm (100%) rename {src => dist/unix}/menuicons/128x128/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/16x16/apps/qbittorrent.png (100%) rename {src/Icons => dist/unix/menuicons/192x192/apps}/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/22x22/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/24x24/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/32x32/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/36x36/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/48x48/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/64x64/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/72x72/apps/qbittorrent.png (100%) rename {src => dist/unix}/menuicons/96x96/apps/qbittorrent.png (100%) rename {src => dist}/windows/README.txt (95%) rename {src => dist}/windows/UAC.nsh (100%) rename {src => dist}/windows/installer-translations/afrikaans.nsi (100%) rename {src => dist}/windows/installer-translations/albanian.nsi (100%) rename {src => dist}/windows/installer-translations/arabic.nsi (100%) rename {src => dist}/windows/installer-translations/basque.nsi (100%) rename {src => dist}/windows/installer-translations/belarusian.nsi (100%) rename {src => dist}/windows/installer-translations/bosnian.nsi (100%) rename {src => dist}/windows/installer-translations/breton.nsi (100%) rename {src => dist}/windows/installer-translations/bulgarian.nsi (100%) rename {src => dist}/windows/installer-translations/catalan.nsi (100%) rename {src => dist}/windows/installer-translations/croatian.nsi (100%) rename {src => dist}/windows/installer-translations/czech.nsi (100%) rename {src => dist}/windows/installer-translations/danish.nsi (100%) rename {src => dist}/windows/installer-translations/dutch.nsi (100%) rename {src => dist}/windows/installer-translations/english.nsi (100%) rename {src => dist}/windows/installer-translations/esperanto.nsi (100%) rename {src => dist}/windows/installer-translations/estonian.nsi (100%) rename {src => dist}/windows/installer-translations/farsi.nsi (100%) rename {src => dist}/windows/installer-translations/finnish.nsi (100%) rename {src => dist}/windows/installer-translations/french.nsi (100%) rename {src => dist}/windows/installer-translations/galician.nsi (100%) rename {src => dist}/windows/installer-translations/german.nsi (100%) rename {src => dist}/windows/installer-translations/greek.nsi (100%) rename {src => dist}/windows/installer-translations/hebrew.nsi (100%) rename {src => dist}/windows/installer-translations/hungarian.nsi (100%) rename {src => dist}/windows/installer-translations/icelandic.nsi (100%) rename {src => dist}/windows/installer-translations/indonesian.nsi (100%) rename {src => dist}/windows/installer-translations/irish.nsi (100%) rename {src => dist}/windows/installer-translations/italian.nsi (100%) rename {src => dist}/windows/installer-translations/japanese.nsi (100%) rename {src => dist}/windows/installer-translations/korean.nsi (100%) rename {src => dist}/windows/installer-translations/kurdish.nsi (100%) rename {src => dist}/windows/installer-translations/latvian.nsi (100%) rename {src => dist}/windows/installer-translations/lithuanian.nsi (100%) rename {src => dist}/windows/installer-translations/luxembourgish.nsi (100%) rename {src => dist}/windows/installer-translations/macedonian.nsi (100%) rename {src => dist}/windows/installer-translations/malay.nsi (100%) rename {src => dist}/windows/installer-translations/mongolian.nsi (100%) rename {src => dist}/windows/installer-translations/norwegian.nsi (100%) rename {src => dist}/windows/installer-translations/norwegiannynorsk.nsi (100%) rename {src => dist}/windows/installer-translations/polish.nsi (100%) rename {src => dist}/windows/installer-translations/portuguese.nsi (100%) rename {src => dist}/windows/installer-translations/portugueseBR.nsi (100%) rename {src => dist}/windows/installer-translations/romanian.nsi (100%) rename {src => dist}/windows/installer-translations/russian.nsi (100%) rename {src => dist}/windows/installer-translations/serbian.nsi (100%) rename {src => dist}/windows/installer-translations/serbianlatin.nsi (100%) rename {src => dist}/windows/installer-translations/simpchinese.nsi (100%) rename {src => dist}/windows/installer-translations/slovak.nsi (100%) rename {src => dist}/windows/installer-translations/slovenian.nsi (100%) rename {src => dist}/windows/installer-translations/spanish.nsi (100%) rename {src => dist}/windows/installer-translations/spanishinternational.nsi (100%) rename {src => dist}/windows/installer-translations/swedish.nsi (100%) rename {src => dist}/windows/installer-translations/thai.nsi (100%) rename {src => dist}/windows/installer-translations/tradchinese.nsi (100%) rename {src => dist}/windows/installer-translations/turkish.nsi (100%) rename {src => dist}/windows/installer-translations/ukrainian.nsi (100%) rename {src => dist}/windows/installer-translations/uzbek.nsi (100%) rename {src => dist}/windows/installer-translations/welsh.nsi (100%) rename {src => dist}/windows/installer.nsi (100%) rename {src => dist}/windows/nsis plugins/FindProc Unicode-source.zip (100%) rename {src => dist}/windows/nsis plugins/FindProcDLL Unicode bin.zip (100%) rename {src => dist}/windows/nsis plugins/UAC Unicode.zip (100%) rename {src => dist}/windows/nsis plugins/UAC.zip (100%) rename {src => dist}/windows/nsis plugins/nsisFirewall.zip (100%) rename {src => dist}/windows/options.nsi (100%) rename {src => dist}/windows/qbittorrent.nsi (100%) rename {src => dist}/windows/qt.conf (100%) rename {src => dist}/windows/translations.nsi (100%) rename {src => dist}/windows/uninstaller.nsi (100%) delete mode 100644 qbittorrent.qc create mode 100644 src/app/app.pri rename src/{ => app}/application.cpp (100%) rename src/{ => app}/application.h (100%) rename src/{ => app}/headlessloader.h (100%) rename src/{ => app}/main.cpp (99%) rename src/{ => app}/qmacapplication.cpp (100%) rename src/{ => app}/qmacapplication.h (100%) rename src/{qtsingleapp => app/qtsingleapplication}/QtLockedFile (100%) rename src/{qtsingleapp => app/qtsingleapplication}/QtSingleApplication (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlocalpeer.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlocalpeer.h (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlockedfile.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlockedfile.h (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlockedfile_unix.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtlockedfile_win.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsingleapplication.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsingleapplication.h (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsingleapplication.pri (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsinglecoreapplication.cpp (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsinglecoreapplication.h (100%) rename src/{qtsingleapp => app/qtsingleapplication}/qtsinglecoreapplication.pri (100%) rename src/{ => app}/sessionapplication.cpp (100%) rename src/{ => app}/sessionapplication.h (100%) rename src/{ => app}/stacktrace.h (100%) rename src/{ => app}/stacktrace_win.h (100%) rename src/{ => app}/stacktrace_win_dlg.h (100%) rename src/{ => app}/stacktrace_win_dlg.ui (100%) create mode 100644 src/core/core.pri rename src/{ => core}/dnsupdater.cpp (100%) rename src/{ => core}/dnsupdater.h (100%) rename src/{ => core}/downloadthread.cpp (100%) rename src/{ => core}/downloadthread.h (100%) rename src/{ => core}/filesystemwatcher.h (100%) rename src/{ => core}/fs_utils.cpp (100%) rename src/{ => core}/fs_utils.h (100%) rename src/{webui => core}/httprequestparser.cpp (100%) rename src/{webui => core}/httprequestparser.h (100%) rename src/{webui => core}/httpresponsegenerator.cpp (100%) rename src/{webui => core}/httpresponsegenerator.h (100%) rename src/{webui => core}/httptypes.h (100%) rename src/{ => core}/logger.cpp (100%) rename src/{ => core}/logger.h (100%) rename src/{ => core}/misc.cpp (100%) rename src/{ => core}/misc.h (100%) rename src/{preferences => core}/preferences.cpp (100%) rename src/{preferences => core}/preferences.h (100%) mode change 100755 => 100644 rename src/{ => core}/qinisettings.h (100%) rename src/{ => core}/qtlibtorrent/alertdispatcher.cpp (100%) rename src/{ => core}/qtlibtorrent/alertdispatcher.h (100%) rename src/{ => core}/qtlibtorrent/bandwidthscheduler.h (100%) rename src/{ => core}/qtlibtorrent/filterparserthread.cpp (100%) rename src/{ => core}/qtlibtorrent/filterparserthread.h (100%) rename src/{ => core}/qtlibtorrent/qbtsession.cpp (100%) mode change 100755 => 100644 rename src/{ => core}/qtlibtorrent/qbtsession.h (100%) mode change 100755 => 100644 rename src/{ => core}/qtlibtorrent/qtlibtorrent.pri (100%) rename src/{ => core}/qtlibtorrent/qtorrenthandle.cpp (100%) rename src/{ => core}/qtlibtorrent/qtorrenthandle.h (100%) rename src/{ => core}/qtlibtorrent/shutdownconfirm.cpp (100%) rename src/{ => core}/qtlibtorrent/shutdownconfirm.h (100%) rename src/{ => core}/qtlibtorrent/torrentmodel.cpp (97%) rename src/{ => core}/qtlibtorrent/torrentmodel.h (100%) rename src/{ => core}/qtlibtorrent/torrentspeedmonitor.cpp (100%) rename src/{ => core}/qtlibtorrent/torrentspeedmonitor.h (100%) rename src/{ => core}/qtlibtorrent/torrentstatistics.cpp (100%) rename src/{ => core}/qtlibtorrent/torrentstatistics.h (100%) rename src/{ => core}/qtlibtorrent/trackerinfos.h (100%) rename src/{ => core}/qtnotify/notifications.cpp (100%) rename src/{ => core}/qtnotify/notifications.h (100%) rename src/{ => core}/qtnotify/notifications.xml (100%) rename src/{ => core}/qtnotify/qtnotify.pri (100%) rename src/{ => core}/scannedfoldersmodel.cpp (100%) rename src/{ => core}/scannedfoldersmodel.h (100%) rename src/{ => core}/smtp.cpp (100%) rename src/{ => core}/smtp.h (100%) rename src/{ => core}/torrentpersistentdata.cpp (100%) rename src/{ => core}/torrentpersistentdata.h (100%) rename src/{ => core}/tracker/qpeer.h (100%) rename src/{ => core}/tracker/qtracker.cpp (100%) rename src/{ => core}/tracker/qtracker.h (100%) rename src/{ => core}/tracker/tracker.pri (100%) rename src/{ => core}/tracker/trackerannouncerequest.h (100%) rename src/{ => gui}/about.qrc (100%) rename src/{ => gui}/about.ui (99%) rename src/{ => gui}/about_imp.h (99%) rename src/{ => gui}/addnewtorrentdialog.cpp (100%) rename src/{ => gui}/addnewtorrentdialog.h (100%) rename src/{ => gui}/addnewtorrentdialog.ui (100%) rename src/{preferences => gui}/advancedsettings.h (100%) rename src/{ => gui}/autoexpandabledialog.cpp (100%) rename src/{ => gui}/autoexpandabledialog.h (100%) rename src/{ => gui}/autoexpandabledialog.ui (100%) rename src/{ => gui}/bandwidth_limit.ui (100%) rename src/{ => gui}/confirmdeletiondlg.ui (100%) rename src/{ => gui}/deletionconfirmationdlg.h (100%) rename src/{ => gui}/downloadfromurldlg.h (100%) rename src/{ => gui}/downloadfromurldlg.ui (100%) rename src/{ => gui}/executionlog.cpp (100%) rename src/{ => gui}/executionlog.h (100%) rename src/{ => gui}/executionlog.ui (100%) create mode 100644 src/gui/geoip/GeoIP.dat rename src/{ => gui}/geoip/README (100%) rename src/{ => gui}/geoip/geoip.pri (100%) rename src/{ => gui}/geoip/geoip.qrc (100%) rename src/{ => gui}/geoip/geoipmanager.cpp (99%) rename src/{ => gui}/geoip/geoipmanager.h (100%) rename src/{ => gui}/gpl.html (100%) create mode 100644 src/gui/gui.pri rename src/{ => gui}/hidabletabwidget.h (100%) rename src/{ => gui}/ico.cpp (100%) rename src/{ => gui}/ico.h (100%) rename src/{ => gui}/iconprovider.cpp (94%) rename src/{ => gui}/iconprovider.h (100%) rename src/{ => gui}/lineedit/lineedit.pri (100%) rename src/{ => gui}/lineedit/resources/lineeditimages.qrc (100%) rename src/{ => gui}/lineedit/resources/lineeditimages/clear_left.png (100%) rename src/{ => gui}/lineedit/resources/lineeditimages/search.png (100%) rename src/{ => gui}/lineedit/src/lineedit.cpp (100%) rename src/{ => gui}/lineedit/src/lineedit.h (100%) rename src/{ => gui}/login.ui (100%) rename src/{ => gui}/loglistwidget.cpp (100%) rename src/{ => gui}/loglistwidget.h (100%) rename src/{ => gui}/mainwindow.cpp (98%) mode change 100755 => 100644 rename src/{ => gui}/mainwindow.h (100%) rename src/{ => gui}/mainwindow.ui (99%) rename src/{ => gui}/messageboxraised.cpp (100%) rename src/{ => gui}/messageboxraised.h (100%) rename src/{preferences => gui}/options.ui (99%) mode change 100755 => 100644 rename src/{preferences => gui}/options_imp.cpp (99%) mode change 100755 => 100644 rename src/{preferences => gui}/options_imp.h (100%) mode change 100755 => 100644 rename src/{ => gui}/powermanagement/powermanagement.cpp (100%) rename src/{ => gui}/powermanagement/powermanagement.h (100%) rename src/{ => gui}/powermanagement/powermanagement.pri (100%) rename src/{ => gui}/powermanagement/powermanagement_x11.cpp (100%) rename src/{ => gui}/powermanagement/powermanagement_x11.h (100%) rename src/{ => gui}/preview.ui (100%) rename src/{ => gui}/previewlistdelegate.h (100%) rename src/{ => gui}/previewselect.cpp (100%) rename src/{ => gui}/previewselect.h (100%) rename src/{ => gui}/programupdater.cpp (100%) rename src/{ => gui}/programupdater.h (100%) rename src/{ => gui}/properties/downloadedpiecesbar.cpp (100%) rename src/{ => gui}/properties/downloadedpiecesbar.h (100%) rename src/{ => gui}/properties/peer.ui (100%) rename src/{ => gui}/properties/peeraddition.h (100%) rename src/{ => gui}/properties/peerlistdelegate.h (100%) rename src/{ => gui}/properties/peerlistsortmodel.h (100%) rename src/{ => gui}/properties/peerlistwidget.cpp (99%) rename src/{ => gui}/properties/peerlistwidget.h (100%) rename src/{ => gui}/properties/pieceavailabilitybar.cpp (100%) rename src/{ => gui}/properties/pieceavailabilitybar.h (100%) rename src/{ => gui}/properties/properties.pri (100%) rename src/{ => gui}/properties/propertieswidget.cpp (100%) rename src/{ => gui}/properties/propertieswidget.h (100%) rename src/{ => gui}/properties/propertieswidget.ui (100%) rename src/{ => gui}/properties/proplistdelegate.h (100%) rename src/{ => gui}/properties/proptabbar.cpp (100%) rename src/{ => gui}/properties/proptabbar.h (100%) rename src/{ => gui}/properties/trackerlist.cpp (100%) rename src/{ => gui}/properties/trackerlist.h (100%) rename src/{ => gui}/properties/trackersadditiondlg.h (100%) rename src/{ => gui}/properties/trackersadditiondlg.ui (100%) rename src/{ => gui}/reverseresolution.h (100%) rename src/{ => gui}/rss/automatedrssdownloader.cpp (100%) rename src/{ => gui}/rss/automatedrssdownloader.h (100%) rename src/{ => gui}/rss/automatedrssdownloader.ui (99%) rename src/{ => gui}/rss/cookiesdlg.cpp (100%) rename src/{ => gui}/rss/cookiesdlg.h (100%) rename src/{ => gui}/rss/cookiesdlg.ui (100%) rename src/{ => gui}/rss/feedlistwidget.cpp (100%) rename src/{ => gui}/rss/feedlistwidget.h (100%) rename src/{ => gui}/rss/htmlbrowser.cpp (100%) rename src/{ => gui}/rss/htmlbrowser.h (100%) rename src/{ => gui}/rss/rss.pri (100%) rename src/{ => gui}/rss/rss.ui (100%) rename src/{ => gui}/rss/rss_imp.cpp (98%) rename src/{ => gui}/rss/rss_imp.h (100%) rename src/{ => gui}/rss/rssarticle.cpp (100%) rename src/{ => gui}/rss/rssarticle.h (100%) rename src/{ => gui}/rss/rssdownloadrule.cpp (100%) rename src/{ => gui}/rss/rssdownloadrule.h (100%) rename src/{ => gui}/rss/rssdownloadrulelist.cpp (100%) rename src/{ => gui}/rss/rssdownloadrulelist.h (100%) rename src/{ => gui}/rss/rssfeed.cpp (99%) rename src/{ => gui}/rss/rssfeed.h (100%) rename src/{ => gui}/rss/rssfile.cpp (100%) rename src/{ => gui}/rss/rssfile.h (100%) rename src/{ => gui}/rss/rssfolder.cpp (100%) rename src/{ => gui}/rss/rssfolder.h (100%) rename src/{ => gui}/rss/rssmanager.cpp (100%) rename src/{ => gui}/rss/rssmanager.h (100%) rename src/{ => gui}/rss/rssparser.cpp (100%) rename src/{ => gui}/rss/rssparser.h (100%) rename src/{ => gui}/rss/rsssettingsdlg.cpp (100%) rename src/{ => gui}/rss/rsssettingsdlg.h (100%) rename src/{ => gui}/rss/rsssettingsdlg.ui (98%) rename src/{ => gui}/searchengine/engineselect.ui (100%) rename src/{ => gui}/searchengine/engineselectdlg.cpp (100%) rename src/{ => gui}/searchengine/engineselectdlg.h (100%) rename src/{ => gui}/searchengine/nova/__init__.py (100%) rename src/{ => gui}/searchengine/nova/engines/__init__.py (100%) rename src/{ => gui}/searchengine/nova/engines/btdigg.png (100%) rename src/{ => gui}/searchengine/nova/engines/btdigg.py (100%) rename src/{ => gui}/searchengine/nova/engines/extratorrent.png (100%) rename src/{ => gui}/searchengine/nova/engines/extratorrent.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova/engines/kickasstorrents.png (100%) rename src/{ => gui}/searchengine/nova/engines/kickasstorrents.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova/engines/legittorrents.png (100%) rename src/{ => gui}/searchengine/nova/engines/legittorrents.py (100%) rename src/{ => gui}/searchengine/nova/engines/mininova.png (100%) rename src/{ => gui}/searchengine/nova/engines/mininova.py (100%) rename src/{ => gui}/searchengine/nova/engines/piratebay.png (100%) rename src/{ => gui}/searchengine/nova/engines/piratebay.py (100%) rename src/{ => gui}/searchengine/nova/engines/torrentreactor.png (100%) rename src/{ => gui}/searchengine/nova/engines/torrentreactor.py (100%) rename src/{ => gui}/searchengine/nova/engines/versions.txt (100%) rename src/{ => gui}/searchengine/nova/fix_encoding.py (100%) rename src/{ => gui}/searchengine/nova/helpers.py (100%) rename src/{ => gui}/searchengine/nova/nova2.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova/nova2dl.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova/novaprinter.py (100%) rename src/{ => gui}/searchengine/nova/socks.py (100%) rename src/{ => gui}/searchengine/nova3/__init__.py (100%) rename src/{ => gui}/searchengine/nova3/engines/__init__.py (100%) rename src/{ => gui}/searchengine/nova3/engines/btdigg.png (100%) rename src/{ => gui}/searchengine/nova3/engines/btdigg.py (100%) rename src/{ => gui}/searchengine/nova3/engines/extratorrent.png (100%) rename src/{ => gui}/searchengine/nova3/engines/extratorrent.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova3/engines/kickasstorrents.png (100%) rename src/{ => gui}/searchengine/nova3/engines/kickasstorrents.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova3/engines/legittorrents.png (100%) rename src/{ => gui}/searchengine/nova3/engines/legittorrents.py (100%) rename src/{ => gui}/searchengine/nova3/engines/mininova.png (100%) rename src/{ => gui}/searchengine/nova3/engines/mininova.py (100%) rename src/{ => gui}/searchengine/nova3/engines/piratebay.png (100%) rename src/{ => gui}/searchengine/nova3/engines/piratebay.py (100%) rename src/{ => gui}/searchengine/nova3/engines/torrentreactor.png (100%) rename src/{ => gui}/searchengine/nova3/engines/torrentreactor.py (100%) rename src/{ => gui}/searchengine/nova3/engines/versions.txt (100%) rename src/{ => gui}/searchengine/nova3/helpers.py (100%) rename src/{ => gui}/searchengine/nova3/nova2.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova3/nova2dl.py (100%) mode change 100755 => 100644 rename src/{ => gui}/searchengine/nova3/novaprinter.py (100%) rename src/{ => gui}/searchengine/nova3/sgmllib3.py (100%) rename src/{ => gui}/searchengine/nova3/socks.py (100%) rename src/{ => gui}/searchengine/pluginsource.h (100%) rename src/{ => gui}/searchengine/pluginsource.ui (100%) rename src/{ => gui}/searchengine/search.qrc (100%) rename src/{ => gui}/searchengine/search.ui (100%) rename src/{ => gui}/searchengine/searchengine.cpp (100%) rename src/{ => gui}/searchengine/searchengine.h (100%) rename src/{ => gui}/searchengine/searchengine.pri (100%) rename src/{ => gui}/searchengine/searchlistdelegate.h (100%) rename src/{ => gui}/searchengine/searchsortmodel.h (100%) rename src/{ => gui}/searchengine/searchtab.cpp (100%) rename src/{ => gui}/searchengine/searchtab.h (100%) rename src/{ => gui}/searchengine/supportedengines.h (100%) rename src/{ => gui}/speedlimitdlg.cpp (100%) rename src/{ => gui}/speedlimitdlg.h (100%) rename src/{ => gui}/statsdialog.cpp (100%) rename src/{ => gui}/statsdialog.h (100%) rename src/{ => gui}/statsdialog.ui (100%) rename src/{ => gui}/statusbar.cpp (95%) rename src/{ => gui}/statusbar.h (100%) rename src/{ => gui}/torrentcontentfiltermodel.cpp (100%) rename src/{ => gui}/torrentcontentfiltermodel.h (100%) rename src/{ => gui}/torrentcontentmodel.cpp (100%) rename src/{ => gui}/torrentcontentmodel.h (100%) rename src/{ => gui}/torrentcontentmodelfile.cpp (100%) rename src/{ => gui}/torrentcontentmodelfile.h (100%) rename src/{ => gui}/torrentcontentmodelfolder.cpp (100%) rename src/{ => gui}/torrentcontentmodelfolder.h (100%) rename src/{ => gui}/torrentcontentmodelitem.cpp (100%) rename src/{ => gui}/torrentcontentmodelitem.h (100%) rename src/{ => gui}/torrentcontenttreeview.cpp (100%) rename src/{ => gui}/torrentcontenttreeview.h (100%) rename src/{ => gui}/torrentcreator/createtorrent.ui (100%) rename src/{ => gui}/torrentcreator/torrentcreator.pri (100%) rename src/{ => gui}/torrentcreator/torrentcreatordlg.cpp (100%) rename src/{ => gui}/torrentcreator/torrentcreatordlg.h (100%) rename src/{ => gui}/torrentcreator/torrentcreatorthread.cpp (100%) rename src/{ => gui}/torrentcreator/torrentcreatorthread.h (100%) rename src/{ => gui}/torrentfilterenum.h (100%) rename src/{ => gui}/torrentimportdlg.cpp (100%) rename src/{ => gui}/torrentimportdlg.h (100%) rename src/{ => gui}/torrentimportdlg.ui (100%) rename src/{ => gui}/trackerlogin.cpp (97%) rename src/{ => gui}/trackerlogin.h (100%) rename src/{ => gui}/transferlistdelegate.cpp (99%) rename src/{ => gui}/transferlistdelegate.h (100%) rename src/{ => gui}/transferlistfilterswidget.cpp (97%) rename src/{ => gui}/transferlistfilterswidget.h (100%) rename src/{ => gui}/transferlistsortmodel.cpp (100%) rename src/{ => gui}/transferlistsortmodel.h (100%) rename src/{ => gui}/transferlistwidget.cpp (99%) rename src/{ => gui}/transferlistwidget.h (100%) rename src/{ => gui}/updownratiodlg.cpp (100%) rename src/{ => gui}/updownratiodlg.h (100%) rename src/{ => gui}/updownratiodlg.ui (100%) rename src/{Icons => icons}/3-state-checkbox.gif (100%) rename src/{Icons => icons}/L.gif (100%) rename src/{Icons => icons}/flags/ad.png (100%) rename src/{Icons => icons}/flags/ae.png (100%) rename src/{Icons => icons}/flags/af.png (100%) rename src/{Icons => icons}/flags/ag.png (100%) rename src/{Icons => icons}/flags/ai.png (100%) rename src/{Icons => icons}/flags/al.png (100%) rename src/{Icons => icons}/flags/am.png (100%) rename src/{Icons => icons}/flags/an.png (100%) rename src/{Icons => icons}/flags/ao.png (100%) rename src/{Icons => icons}/flags/ar.png (100%) rename src/{Icons => icons}/flags/as.png (100%) rename src/{Icons => icons}/flags/at.png (100%) rename src/{Icons => icons}/flags/au.png (100%) rename src/{Icons => icons}/flags/aw.png (100%) rename src/{Icons => icons}/flags/ax.png (100%) rename src/{Icons => icons}/flags/az.png (100%) rename src/{Icons => icons}/flags/ba.png (100%) rename src/{Icons => icons}/flags/bb.png (100%) rename src/{Icons => icons}/flags/bd.png (100%) rename src/{Icons => icons}/flags/be.png (100%) rename src/{Icons => icons}/flags/bf.png (100%) rename src/{Icons => icons}/flags/bg.png (100%) rename src/{Icons => icons}/flags/bh.png (100%) rename src/{Icons => icons}/flags/bi.png (100%) rename src/{Icons => icons}/flags/bj.png (100%) rename src/{Icons => icons}/flags/bm.png (100%) rename src/{Icons => icons}/flags/bn.png (100%) rename src/{Icons => icons}/flags/bo.png (100%) rename src/{Icons => icons}/flags/br.png (100%) rename src/{Icons => icons}/flags/bs.png (100%) rename src/{Icons => icons}/flags/bt.png (100%) rename src/{Icons => icons}/flags/bv.png (100%) rename src/{Icons => icons}/flags/bw.png (100%) rename src/{Icons => icons}/flags/by.png (100%) rename src/{Icons => icons}/flags/bz.png (100%) rename src/{Icons => icons}/flags/ca.png (100%) rename src/{Icons => icons}/flags/cc.png (100%) rename src/{Icons => icons}/flags/cd.png (100%) rename src/{Icons => icons}/flags/cf.png (100%) rename src/{Icons => icons}/flags/cg.png (100%) rename src/{Icons => icons}/flags/ch.png (100%) rename src/{Icons => icons}/flags/ci.png (100%) rename src/{Icons => icons}/flags/ck.png (100%) rename src/{Icons => icons}/flags/cl.png (100%) rename src/{Icons => icons}/flags/cm.png (100%) rename src/{Icons => icons}/flags/cn.png (100%) rename src/{Icons => icons}/flags/co.png (100%) rename src/{Icons => icons}/flags/cr.png (100%) rename src/{Icons => icons}/flags/cs.png (100%) rename src/{Icons => icons}/flags/cu.png (100%) rename src/{Icons => icons}/flags/cv.png (100%) rename src/{Icons => icons}/flags/cx.png (100%) rename src/{Icons => icons}/flags/cy.png (100%) rename src/{Icons => icons}/flags/cz.png (100%) rename src/{Icons => icons}/flags/de.png (100%) rename src/{Icons => icons}/flags/dj.png (100%) rename src/{Icons => icons}/flags/dk.png (100%) rename src/{Icons => icons}/flags/dm.png (100%) rename src/{Icons => icons}/flags/do.png (100%) rename src/{Icons => icons}/flags/dz.png (100%) rename src/{Icons => icons}/flags/ec.png (100%) rename src/{Icons => icons}/flags/ee.png (100%) rename src/{Icons => icons}/flags/eg.png (100%) rename src/{Icons => icons}/flags/eh.png (100%) rename src/{Icons => icons}/flags/er.png (100%) rename src/{Icons => icons}/flags/es.png (100%) rename src/{Icons => icons}/flags/et.png (100%) rename src/{Icons => icons}/flags/fi.png (100%) rename src/{Icons => icons}/flags/fj.png (100%) rename src/{Icons => icons}/flags/fk.png (100%) rename src/{Icons => icons}/flags/fm.png (100%) rename src/{Icons => icons}/flags/fo.png (100%) rename src/{Icons => icons}/flags/fr.png (100%) rename src/{Icons => icons}/flags/ga.png (100%) rename src/{Icons => icons}/flags/gb.png (100%) rename src/{Icons => icons}/flags/gd.png (100%) rename src/{Icons => icons}/flags/ge.png (100%) rename src/{Icons => icons}/flags/gf.png (100%) rename src/{Icons => icons}/flags/gh.png (100%) rename src/{Icons => icons}/flags/gi.png (100%) rename src/{Icons => icons}/flags/gl.png (100%) rename src/{Icons => icons}/flags/gm.png (100%) rename src/{Icons => icons}/flags/gn.png (100%) rename src/{Icons => icons}/flags/gp.png (100%) rename src/{Icons => icons}/flags/gq.png (100%) rename src/{Icons => icons}/flags/gr.png (100%) rename src/{Icons => icons}/flags/gs.png (100%) rename src/{Icons => icons}/flags/gt.png (100%) rename src/{Icons => icons}/flags/gu.png (100%) rename src/{Icons => icons}/flags/gw.png (100%) rename src/{Icons => icons}/flags/gy.png (100%) rename src/{Icons => icons}/flags/hk.png (100%) rename src/{Icons => icons}/flags/hm.png (100%) rename src/{Icons => icons}/flags/hn.png (100%) rename src/{Icons => icons}/flags/hr.png (100%) rename src/{Icons => icons}/flags/ht.png (100%) rename src/{Icons => icons}/flags/hu.png (100%) rename src/{Icons => icons}/flags/icons-set-readme.txt (100%) rename src/{Icons => icons}/flags/id.png (100%) rename src/{Icons => icons}/flags/ie.png (100%) rename src/{Icons => icons}/flags/il.png (100%) rename src/{Icons => icons}/flags/in.png (100%) rename src/{Icons => icons}/flags/io.png (100%) rename src/{Icons => icons}/flags/iq.png (100%) rename src/{Icons => icons}/flags/ir.png (100%) rename src/{Icons => icons}/flags/is.png (100%) rename src/{Icons => icons}/flags/it.png (100%) rename src/{Icons => icons}/flags/jm.png (100%) rename src/{Icons => icons}/flags/jo.png (100%) rename src/{Icons => icons}/flags/jp.png (100%) rename src/{Icons => icons}/flags/ke.png (100%) rename src/{Icons => icons}/flags/kg.png (100%) rename src/{Icons => icons}/flags/kh.png (100%) rename src/{Icons => icons}/flags/ki.png (100%) rename src/{Icons => icons}/flags/km.png (100%) rename src/{Icons => icons}/flags/kn.png (100%) rename src/{Icons => icons}/flags/kp.png (100%) rename src/{Icons => icons}/flags/kr.png (100%) rename src/{Icons => icons}/flags/kw.png (100%) rename src/{Icons => icons}/flags/ky.png (100%) rename src/{Icons => icons}/flags/kz.png (100%) rename src/{Icons => icons}/flags/la.png (100%) rename src/{Icons => icons}/flags/lb.png (100%) rename src/{Icons => icons}/flags/lc.png (100%) rename src/{Icons => icons}/flags/li.png (100%) rename src/{Icons => icons}/flags/lk.png (100%) rename src/{Icons => icons}/flags/lr.png (100%) rename src/{Icons => icons}/flags/ls.png (100%) rename src/{Icons => icons}/flags/lt.png (100%) rename src/{Icons => icons}/flags/lu.png (100%) rename src/{Icons => icons}/flags/lv.png (100%) rename src/{Icons => icons}/flags/ly.png (100%) rename src/{Icons => icons}/flags/ma.png (100%) rename src/{Icons => icons}/flags/mc.png (100%) rename src/{Icons => icons}/flags/md.png (100%) rename src/{Icons => icons}/flags/me.png (100%) rename src/{Icons => icons}/flags/mg.png (100%) rename src/{Icons => icons}/flags/mh.png (100%) rename src/{Icons => icons}/flags/mk.png (100%) rename src/{Icons => icons}/flags/ml.png (100%) rename src/{Icons => icons}/flags/mm.png (100%) rename src/{Icons => icons}/flags/mn.png (100%) rename src/{Icons => icons}/flags/mo.png (100%) rename src/{Icons => icons}/flags/mp.png (100%) rename src/{Icons => icons}/flags/mq.png (100%) rename src/{Icons => icons}/flags/mr.png (100%) rename src/{Icons => icons}/flags/ms.png (100%) rename src/{Icons => icons}/flags/mt.png (100%) rename src/{Icons => icons}/flags/mu.png (100%) rename src/{Icons => icons}/flags/mv.png (100%) rename src/{Icons => icons}/flags/mw.png (100%) rename src/{Icons => icons}/flags/mx.png (100%) rename src/{Icons => icons}/flags/my.png (100%) rename src/{Icons => icons}/flags/mz.png (100%) rename src/{Icons => icons}/flags/na.png (100%) rename src/{Icons => icons}/flags/nc.png (100%) rename src/{Icons => icons}/flags/ne.png (100%) rename src/{Icons => icons}/flags/nf.png (100%) rename src/{Icons => icons}/flags/ng.png (100%) rename src/{Icons => icons}/flags/ni.png (100%) rename src/{Icons => icons}/flags/nl.png (100%) rename src/{Icons => icons}/flags/no.png (100%) rename src/{Icons => icons}/flags/np.png (100%) rename src/{Icons => icons}/flags/nr.png (100%) rename src/{Icons => icons}/flags/nu.png (100%) rename src/{Icons => icons}/flags/nz.png (100%) rename src/{Icons => icons}/flags/om.png (100%) rename src/{Icons => icons}/flags/pa.png (100%) rename src/{Icons => icons}/flags/pe.png (100%) rename src/{Icons => icons}/flags/pf.png (100%) rename src/{Icons => icons}/flags/pg.png (100%) rename src/{Icons => icons}/flags/ph.png (100%) rename src/{Icons => icons}/flags/pk.png (100%) rename src/{Icons => icons}/flags/pl.png (100%) rename src/{Icons => icons}/flags/pm.png (100%) rename src/{Icons => icons}/flags/pn.png (100%) rename src/{Icons => icons}/flags/pr.png (100%) rename src/{Icons => icons}/flags/ps.png (100%) rename src/{Icons => icons}/flags/pt.png (100%) rename src/{Icons => icons}/flags/pw.png (100%) rename src/{Icons => icons}/flags/py.png (100%) rename src/{Icons => icons}/flags/qa.png (100%) rename src/{Icons => icons}/flags/re.png (100%) rename src/{Icons => icons}/flags/ro.png (100%) rename src/{Icons => icons}/flags/rs.png (100%) rename src/{Icons => icons}/flags/ru.png (100%) rename src/{Icons => icons}/flags/rw.png (100%) rename src/{Icons => icons}/flags/sa.png (100%) rename src/{Icons => icons}/flags/sb.png (100%) rename src/{Icons => icons}/flags/sc.png (100%) rename src/{Icons => icons}/flags/sd.png (100%) rename src/{Icons => icons}/flags/se.png (100%) rename src/{Icons => icons}/flags/sg.png (100%) rename src/{Icons => icons}/flags/sh.png (100%) rename src/{Icons => icons}/flags/si.png (100%) rename src/{Icons => icons}/flags/sj.png (100%) rename src/{Icons => icons}/flags/sk.png (100%) rename src/{Icons => icons}/flags/sl.png (100%) rename src/{Icons => icons}/flags/sm.png (100%) rename src/{Icons => icons}/flags/sn.png (100%) rename src/{Icons => icons}/flags/so.png (100%) rename src/{Icons => icons}/flags/sr.png (100%) rename src/{Icons => icons}/flags/st.png (100%) rename src/{Icons => icons}/flags/sv.png (100%) rename src/{Icons => icons}/flags/sy.png (100%) rename src/{Icons => icons}/flags/sz.png (100%) rename src/{Icons => icons}/flags/tc.png (100%) rename src/{Icons => icons}/flags/td.png (100%) rename src/{Icons => icons}/flags/tf.png (100%) rename src/{Icons => icons}/flags/tg.png (100%) rename src/{Icons => icons}/flags/th.png (100%) rename src/{Icons => icons}/flags/tj.png (100%) rename src/{Icons => icons}/flags/tk.png (100%) rename src/{Icons => icons}/flags/tl.png (100%) rename src/{Icons => icons}/flags/tm.png (100%) rename src/{Icons => icons}/flags/tn.png (100%) rename src/{Icons => icons}/flags/to.png (100%) rename src/{Icons => icons}/flags/tr.png (100%) rename src/{Icons => icons}/flags/tt.png (100%) rename src/{Icons => icons}/flags/tv.png (100%) rename src/{Icons => icons}/flags/tw.png (100%) rename src/{Icons => icons}/flags/tz.png (100%) rename src/{Icons => icons}/flags/ua.png (100%) rename src/{Icons => icons}/flags/ug.png (100%) rename src/{Icons => icons}/flags/um.png (100%) rename src/{Icons => icons}/flags/us.png (100%) rename src/{Icons => icons}/flags/uy.png (100%) rename src/{Icons => icons}/flags/uz.png (100%) rename src/{Icons => icons}/flags/va.png (100%) rename src/{Icons => icons}/flags/vc.png (100%) rename src/{Icons => icons}/flags/ve.png (100%) rename src/{Icons => icons}/flags/vg.png (100%) rename src/{Icons => icons}/flags/vi.png (100%) rename src/{Icons => icons}/flags/vn.png (100%) rename src/{Icons => icons}/flags/vu.png (100%) rename src/{Icons => icons}/flags/wf.png (100%) rename src/{Icons => icons}/flags/ws.png (100%) rename src/{Icons => icons}/flags/ye.png (100%) rename src/{Icons => icons}/flags/yt.png (100%) rename src/{Icons => icons}/flags/za.png (100%) rename src/{Icons => icons}/flags/zm.png (100%) rename src/{Icons => icons}/flags/zw.png (100%) rename src/{Icons => icons}/loading.png (100%) rename src/{Icons => icons}/magnet.png (100%) rename src/{Icons => icons}/oxygen/application-exit.png (100%) rename src/{Icons => icons}/oxygen/application-rss+xml.png (100%) rename src/{Icons => icons}/oxygen/application-x-mswinurl.png (100%) rename src/{Icons => icons}/oxygen/checked.png (100%) rename src/{Icons => icons}/oxygen/chronometer.png (100%) rename src/{Icons => icons}/oxygen/dialog-cancel.png (100%) rename src/{Icons => icons}/oxygen/dialog-information.png (100%) rename src/{Icons => icons}/oxygen/dialog-warning.png (100%) rename src/{Icons => icons}/oxygen/document-edit-verify.png (100%) rename src/{Icons => icons}/oxygen/document-edit.png (100%) rename src/{Icons => icons}/oxygen/document-encrypt.png (100%) rename src/{Icons => icons}/oxygen/document-import.png (100%) rename src/{Icons => icons}/oxygen/document-new.png (100%) rename src/{Icons => icons}/oxygen/document-properties.png (100%) rename src/{Icons => icons}/oxygen/document-save.png (100%) rename src/{Icons => icons}/oxygen/download.png (100%) rename src/{Icons => icons}/oxygen/edit-clear-history.png (100%) rename src/{Icons => icons}/oxygen/edit-clear.png (100%) rename src/{Icons => icons}/oxygen/edit-copy.png (100%) rename src/{Icons => icons}/oxygen/edit-cut.png (100%) rename src/{Icons => icons}/oxygen/edit-delete.png (100%) rename src/{Icons => icons}/oxygen/edit-find-user.png (100%) rename src/{Icons => icons}/oxygen/edit-find.png (100%) rename src/{Icons => icons}/oxygen/edit-paste.png (100%) rename src/{Icons => icons}/oxygen/edit-rename.png (100%) rename src/{Icons => icons}/oxygen/folder-documents.png (100%) rename src/{Icons => icons}/oxygen/folder-new.png (100%) rename src/{Icons => icons}/oxygen/folder-remote.png (100%) rename src/{Icons => icons}/oxygen/gear.png (100%) rename src/{Icons => icons}/oxygen/gear32.png (100%) rename src/{Icons => icons}/oxygen/go-bottom.png (100%) rename src/{Icons => icons}/oxygen/go-down.png (100%) rename src/{Icons => icons}/oxygen/go-top.png (100%) rename src/{Icons => icons}/oxygen/go-up.png (100%) rename src/{Icons => icons}/oxygen/help-about.png (100%) rename src/{Icons => icons}/oxygen/help-contents.png (100%) rename src/{Icons => icons}/oxygen/inode-directory.png (100%) rename src/{Icons => icons}/oxygen/insert-link.png (100%) rename src/{Icons => icons}/oxygen/list-add.png (100%) rename src/{Icons => icons}/oxygen/list-remove.png (100%) rename src/{Icons => icons}/oxygen/mail-folder-inbox.png (100%) rename src/{Icons => icons}/oxygen/mail-mark-read.png (100%) rename src/{Icons => icons}/oxygen/media-playback-pause.png (100%) rename src/{Icons => icons}/oxygen/media-playback-start.png (100%) rename src/{Icons => icons}/oxygen/network-server.png (100%) rename src/{Icons => icons}/oxygen/network-wired.png (100%) rename src/{Icons => icons}/oxygen/object-locked.png (100%) rename src/{Icons => icons}/oxygen/preferences-desktop.png (100%) rename src/{Icons => icons}/oxygen/preferences-other.png (100%) rename src/{Icons => icons}/oxygen/preferences-system-network.png (100%) rename src/{Icons => icons}/oxygen/preferences-system.png (100%) rename src/{Icons => icons}/oxygen/preferences-web-browser-cookies.png (100%) rename src/{Icons => icons}/oxygen/security-high.png (100%) rename src/{Icons => icons}/oxygen/security-low.png (100%) rename src/{Icons => icons}/oxygen/services.png (100%) rename src/{Icons => icons}/oxygen/system-log-out.png (100%) rename src/{Icons => icons}/oxygen/tab-close.png (100%) rename src/{Icons => icons}/oxygen/task-attention.png (100%) rename src/{Icons => icons}/oxygen/text-plain.png (100%) rename src/{Icons => icons}/oxygen/tools-report-bug.png (100%) rename src/{Icons => icons}/oxygen/unavailable.png (100%) rename src/{Icons => icons}/oxygen/user-group-delete.png (100%) rename src/{Icons => icons}/oxygen/user-group-new.png (100%) rename src/{Icons => icons}/oxygen/view-calendar-journal.png (100%) rename src/{Icons => icons}/oxygen/view-categories.png (100%) rename src/{Icons => icons}/oxygen/view-filter.png (100%) rename src/{Icons => icons}/oxygen/view-preview.png (100%) rename src/{Icons => icons}/oxygen/view-refresh.png (100%) rename src/{Icons => icons}/oxygen/view-statistics.png (100%) rename src/{Icons => icons}/oxygen/wallet-open.png (100%) rename src/{Icons => icons}/oxygen/webui.png (100%) rename src/{Icons => icons}/qBittorrent.desktop (100%) rename src/{menuicons/192x192/apps => icons}/qbittorrent.png (100%) rename src/{Icons => icons}/skin/arrow-right.gif (100%) rename src/{Icons => icons}/skin/bg-dropdown.gif (100%) rename src/{Icons => icons}/skin/bg-handle-horizontal.gif (100%) rename src/{Icons => icons}/skin/bg-header.gif (100%) rename src/{Icons => icons}/skin/bg-panel-header.gif (100%) rename src/{Icons => icons}/skin/checking.png (100%) rename src/{Icons => icons}/skin/collapse-expand.gif (100%) rename src/{Icons => icons}/skin/connected.png (100%) rename src/{Icons => icons}/skin/disconnected.png (100%) rename src/{Icons => icons}/skin/dock-tabs.gif (100%) rename src/{Icons => icons}/skin/download.png (100%) rename src/{Icons => icons}/skin/downloading.png (100%) rename src/{Icons => icons}/skin/error.png (100%) rename src/{Icons => icons}/skin/filteractive.png (100%) rename src/{Icons => icons}/skin/filterall.png (100%) rename src/{Icons => icons}/skin/filterinactive.png (100%) rename src/{Icons => icons}/skin/firewalled.png (100%) rename src/{Icons => icons}/skin/handle-icon-horizontal.gif (100%) rename src/{Icons => icons}/skin/handle-icon.gif (100%) rename src/{Icons => icons}/skin/knob.gif (100%) rename src/{Icons => icons}/skin/logo-blank.gif (100%) rename src/{Icons => icons}/skin/logo.gif (100%) rename src/{Icons => icons}/skin/logo2.gif (100%) rename src/{Icons => icons}/skin/mascot.png (100%) rename src/{Icons => icons}/skin/paused.png (100%) rename src/{Icons => icons}/skin/qbittorrent16.png (100%) rename src/{Icons => icons}/skin/qbittorrent22.png (100%) rename src/{Icons => icons}/skin/qbittorrent32.png (100%) rename src/{Icons => icons}/skin/qbittorrent_mono.svg (100%) rename src/{Icons => icons}/skin/qbittorrent_mono_dark.png (100%) rename src/{Icons => icons}/skin/qbittorrent_mono_light.png (100%) rename src/{Icons => icons}/skin/queued.png (100%) rename src/{Icons => icons}/skin/ratio.png (100%) rename src/{Icons => icons}/skin/resumed.png (100%) rename src/{Icons => icons}/skin/seeding.png (100%) rename src/{Icons => icons}/skin/slider-area.gif (100%) rename src/{Icons => icons}/skin/spacer.gif (100%) rename src/{Icons => icons}/skin/spinner-placeholder.gif (100%) rename src/{Icons => icons}/skin/spinner.gif (100%) rename src/{Icons => icons}/skin/splash.png (100%) rename src/{Icons => icons}/skin/stalledDL.png (100%) rename src/{Icons => icons}/skin/stalledUP.png (100%) rename src/{Icons => icons}/skin/tabs.gif (100%) rename src/{Icons => icons}/skin/toolbox-divider.gif (100%) rename src/{Icons => icons}/skin/toolbox-divider2.gif (100%) rename src/{Icons => icons}/skin/uploading.png (100%) rename src/{Icons => icons}/slow.png (100%) rename src/{Icons => icons}/slow_off.png (100%) rename src/{Icons => icons}/sphere.png (100%) rename src/{Icons => icons}/sphere2.png (100%) rename src/{Icons => icons}/url.png (100%) delete mode 100644 src/preferences/preferences.pri diff --git a/.tx/config b/.tx/config index 4192cea9a..52bed83f3 100644 --- a/.tx/config +++ b/.tx/config @@ -11,7 +11,7 @@ mode = developer [qbittorrent.qbittorrentdesktop_master] -source_file = src/Icons/qBittorrent.desktop +source_file = src/icons/qBittorrent.desktop source_lang = en type = DESKTOP minimum_perc = 23 diff --git a/AUTHORS b/AUTHORS index f4db303d9..e93cb50fa 100644 --- a/AUTHORS +++ b/AUTHORS @@ -17,7 +17,7 @@ Contributors: * Nick Tiskov Code from other projects: -* files src/qtsingleapp/* src/lineedit/* +* files src/qtsingleapplication/* src/lineedit/* copyright: Nokia Corporation license: LGPL @@ -34,7 +34,7 @@ Code from other projects: license: GPLv2/3 Images Authors: -* files: src/Icons/*.png +* files: src/icons/*.png copyright: Gnome Icon Theme license: GPLv2 url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme @@ -44,21 +44,21 @@ Images Authors: license: LGPL url: http://www.oxygen-icons.org -* files: src/Icons/flags/*.png +* files: src/icons/flags/*.png copyright: Mark James license: Public Domain url: http://www.famfamfam.com -* files: src/Icons/skin/*.png +* files: src/icons/skin/*.png files: src/menuicons/YYxYY/*.png copyright: Mateusz Tobola license: GPLv2 -* file: src/Icons/skin/tabs.gif +* file: src/icons/skin/tabs.gif copyright: Greg Houston license: MIT -* file: src/Icons/skin/qbittorrent_mono* +* file: src/icons/skin/qbittorrent_mono* copyright: Daniel Eguren license: LGPL @@ -77,12 +77,12 @@ Images Authors: * file: src/search_engine/engines/torrentreactor.png copyright: Downloaded from torrentreactor.net -* file: src/Icons/oxygen/checked.png +* file: src/icons/oxygen/checked.png copyright: Victor Buinsky Translations authors: * files: src/lang/*.ts -* file: src/Icons/qBittorrent.desktop +* file: src/icons/qBittorrent.desktop copyright: - Arabic: SDERAWI (abz8868@msn.com), sn51234 (nesseyan@gmail.com) and Ibrahim Saed ibraheem_alex(Transifex) - Armenian: Hrant Ohanyan (hrantohanyan@mail.am) diff --git a/configure b/configure index f81f0a200..d42059295 100755 --- a/configure +++ b/configure @@ -717,6 +717,7 @@ with_geoip_database_embedded with_qtsingleapplication enable_debug enable_gui +enable_webui enable_qt_dbus with_boost with_boost_libdir @@ -1367,6 +1368,7 @@ Optional Features: --disable-silent-rules verbose build output (undo: "make V=0") --enable-debug Enable debug build --disable-gui Disable the GUI for headless running. Disables + --disable-webui Disable the WebUI. QtDBus and the GeoIP Database. --disable-qt-dbus Disable use of QtDBus (GUI only) @@ -4199,6 +4201,14 @@ else fi +# Check whether --enable-webui was given. +if test "${enable_webui+set}" = set; then : + enableval=$enable_webui; +else + enable_webui=yes +fi + + # Check whether --enable-qt-dbus was given. if test "${enable_qt_dbus+set}" = set; then : enableval=$enable_qt_dbus; @@ -4370,19 +4380,36 @@ case "x$enable_gui" in #( "xyes") : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nox" ;; #( + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nogui" ;; #( "xno") : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_qt_dbus=no enable_geoip_database=no - QBT_ADD_CONFIG="$QBT_ADD_CONFIG nox" ;; #( + QBT_ADD_CONFIG="$QBT_ADD_CONFIG nogui" ;; #( *) : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gui" >&5 $as_echo "$enable_gui" >&6; } as_fn_error $? "Unknown option \"$enable_gui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the WebUI" >&5 +$as_echo_n "checking whether to enable the WebUI... " >&6; } +case "x$enable_webui" in #( + "xyes") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nowebui" ;; #( + "xno") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + QBT_ADD_CONFIG="$QBT_ADD_CONFIG nowebui" ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_webui" >&5 +$as_echo "$enable_webui" >&6; } + as_fn_error $? "Unknown option \"$enable_webui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Qt5 should be enabled" >&5 $as_echo_n "checking whether Qt5 should be enabled... " >&6; } case "x$with_qt5" in #( diff --git a/configure.ac b/configure.ac index 0ffdf7065..a358587da 100644 --- a/configure.ac +++ b/configure.ac @@ -42,6 +42,12 @@ AC_ARG_ENABLE(gui, [], [enable_gui=yes]) +AC_ARG_ENABLE(webui, + [AS_HELP_STRING([--disable-webui], + [Disable the WebUI.])], + [], + [enable_webui=yes]) + AC_ARG_ENABLE(qt-dbus, [AS_HELP_STRING([--disable-qt-dbus], [Disable use of QtDBus (GUI only)])], @@ -78,15 +84,26 @@ AC_MSG_CHECKING([whether to enable the GUI]) AS_CASE(["x$enable_gui"], ["xyes"], [AC_MSG_RESULT([yes]) - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nox"], + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nogui"], ["xno"], [AC_MSG_RESULT([no]) enable_qt_dbus=[no] enable_geoip_database=[no] - QBT_ADD_CONFIG="$QBT_ADD_CONFIG nox"], + QBT_ADD_CONFIG="$QBT_ADD_CONFIG nogui"], [AC_MSG_RESULT([$enable_gui]) AC_MSG_ERROR([Unknown option "$enable_gui". Use either "yes" or "no".])]) +AC_MSG_CHECKING([whether to enable the WebUI]) +AS_CASE(["x$enable_webui"], + ["xyes"], + [AC_MSG_RESULT([yes]) + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG nowebui"], + ["xno"], + [AC_MSG_RESULT([no]) + QBT_ADD_CONFIG="$QBT_ADD_CONFIG nowebui"], + [AC_MSG_RESULT([$enable_webui]) + AC_MSG_ERROR([Unknown option "$enable_webui". Use either "yes" or "no".])]) + AC_MSG_CHECKING([whether Qt5 should be enabled]) AS_CASE(["x$with_qt5"], ["xno"], diff --git a/src/mac/Info.plist b/dist/mac/Info.plist similarity index 100% rename from src/mac/Info.plist rename to dist/mac/Info.plist diff --git a/src/mac/qBitTorrentDocument.icns b/dist/mac/qBitTorrentDocument.icns similarity index 100% rename from src/mac/qBitTorrentDocument.icns rename to dist/mac/qBitTorrentDocument.icns diff --git a/src/mac/qbittorrent_mac.icns b/dist/mac/qbittorrent_mac.icns similarity index 100% rename from src/mac/qbittorrent_mac.icns rename to dist/mac/qbittorrent_mac.icns diff --git a/src/mac/qt.conf b/dist/mac/qt.conf similarity index 100% rename from src/mac/qt.conf rename to dist/mac/qt.conf diff --git a/src/qt-translations/qt_ar.qm b/dist/qt-translations/qt_ar.qm similarity index 100% rename from src/qt-translations/qt_ar.qm rename to dist/qt-translations/qt_ar.qm diff --git a/src/qt-translations/qt_bg.qm b/dist/qt-translations/qt_bg.qm similarity index 100% rename from src/qt-translations/qt_bg.qm rename to dist/qt-translations/qt_bg.qm diff --git a/src/qt-translations/qt_ca.qm b/dist/qt-translations/qt_ca.qm similarity index 100% rename from src/qt-translations/qt_ca.qm rename to dist/qt-translations/qt_ca.qm diff --git a/src/qt-translations/qt_cs.qm b/dist/qt-translations/qt_cs.qm similarity index 100% rename from src/qt-translations/qt_cs.qm rename to dist/qt-translations/qt_cs.qm diff --git a/src/qt-translations/qt_da.qm b/dist/qt-translations/qt_da.qm similarity index 100% rename from src/qt-translations/qt_da.qm rename to dist/qt-translations/qt_da.qm diff --git a/src/qt-translations/qt_de.qm b/dist/qt-translations/qt_de.qm similarity index 100% rename from src/qt-translations/qt_de.qm rename to dist/qt-translations/qt_de.qm diff --git a/src/qt-translations/qt_es.qm b/dist/qt-translations/qt_es.qm similarity index 100% rename from src/qt-translations/qt_es.qm rename to dist/qt-translations/qt_es.qm diff --git a/src/qt-translations/qt_eu.qm b/dist/qt-translations/qt_eu.qm similarity index 100% rename from src/qt-translations/qt_eu.qm rename to dist/qt-translations/qt_eu.qm diff --git a/src/qt-translations/qt_fi.qm b/dist/qt-translations/qt_fi.qm similarity index 100% rename from src/qt-translations/qt_fi.qm rename to dist/qt-translations/qt_fi.qm diff --git a/src/qt-translations/qt_fr.qm b/dist/qt-translations/qt_fr.qm similarity index 100% rename from src/qt-translations/qt_fr.qm rename to dist/qt-translations/qt_fr.qm diff --git a/src/qt-translations/qt_gl.qm b/dist/qt-translations/qt_gl.qm similarity index 100% rename from src/qt-translations/qt_gl.qm rename to dist/qt-translations/qt_gl.qm diff --git a/src/qt-translations/qt_he.qm b/dist/qt-translations/qt_he.qm similarity index 100% rename from src/qt-translations/qt_he.qm rename to dist/qt-translations/qt_he.qm diff --git a/src/qt-translations/qt_hu.qm b/dist/qt-translations/qt_hu.qm similarity index 100% rename from src/qt-translations/qt_hu.qm rename to dist/qt-translations/qt_hu.qm diff --git a/src/qt-translations/qt_it.qm b/dist/qt-translations/qt_it.qm similarity index 100% rename from src/qt-translations/qt_it.qm rename to dist/qt-translations/qt_it.qm diff --git a/src/qt-translations/qt_ja.qm b/dist/qt-translations/qt_ja.qm similarity index 100% rename from src/qt-translations/qt_ja.qm rename to dist/qt-translations/qt_ja.qm diff --git a/src/qt-translations/qt_ko.qm b/dist/qt-translations/qt_ko.qm similarity index 100% rename from src/qt-translations/qt_ko.qm rename to dist/qt-translations/qt_ko.qm diff --git a/src/qt-translations/qt_lt.qm b/dist/qt-translations/qt_lt.qm similarity index 100% rename from src/qt-translations/qt_lt.qm rename to dist/qt-translations/qt_lt.qm diff --git a/src/qt-translations/qt_nl.qm b/dist/qt-translations/qt_nl.qm similarity index 100% rename from src/qt-translations/qt_nl.qm rename to dist/qt-translations/qt_nl.qm diff --git a/src/qt-translations/qt_pl.qm b/dist/qt-translations/qt_pl.qm similarity index 100% rename from src/qt-translations/qt_pl.qm rename to dist/qt-translations/qt_pl.qm diff --git a/src/qt-translations/qt_pt.qm b/dist/qt-translations/qt_pt.qm similarity index 100% rename from src/qt-translations/qt_pt.qm rename to dist/qt-translations/qt_pt.qm diff --git a/src/qt-translations/qt_pt_BR.qm b/dist/qt-translations/qt_pt_BR.qm similarity index 100% rename from src/qt-translations/qt_pt_BR.qm rename to dist/qt-translations/qt_pt_BR.qm diff --git a/src/qt-translations/qt_ru.qm b/dist/qt-translations/qt_ru.qm similarity index 100% rename from src/qt-translations/qt_ru.qm rename to dist/qt-translations/qt_ru.qm diff --git a/src/qt-translations/qt_sk.qm b/dist/qt-translations/qt_sk.qm similarity index 100% rename from src/qt-translations/qt_sk.qm rename to dist/qt-translations/qt_sk.qm diff --git a/src/qt-translations/qt_sv.qm b/dist/qt-translations/qt_sv.qm similarity index 100% rename from src/qt-translations/qt_sv.qm rename to dist/qt-translations/qt_sv.qm diff --git a/src/qt-translations/qt_tr.qm b/dist/qt-translations/qt_tr.qm similarity index 100% rename from src/qt-translations/qt_tr.qm rename to dist/qt-translations/qt_tr.qm diff --git a/src/qt-translations/qt_uk.qm b/dist/qt-translations/qt_uk.qm similarity index 100% rename from src/qt-translations/qt_uk.qm rename to dist/qt-translations/qt_uk.qm diff --git a/src/qt-translations/qt_zh_CN.qm b/dist/qt-translations/qt_zh_CN.qm similarity index 100% rename from src/qt-translations/qt_zh_CN.qm rename to dist/qt-translations/qt_zh_CN.qm diff --git a/src/qt-translations/qt_zh_TW.qm b/dist/qt-translations/qt_zh_TW.qm similarity index 100% rename from src/qt-translations/qt_zh_TW.qm rename to dist/qt-translations/qt_zh_TW.qm diff --git a/src/menuicons/128x128/apps/qbittorrent.png b/dist/unix/menuicons/128x128/apps/qbittorrent.png similarity index 100% rename from src/menuicons/128x128/apps/qbittorrent.png rename to dist/unix/menuicons/128x128/apps/qbittorrent.png diff --git a/src/menuicons/16x16/apps/qbittorrent.png b/dist/unix/menuicons/16x16/apps/qbittorrent.png similarity index 100% rename from src/menuicons/16x16/apps/qbittorrent.png rename to dist/unix/menuicons/16x16/apps/qbittorrent.png diff --git a/src/Icons/qbittorrent.png b/dist/unix/menuicons/192x192/apps/qbittorrent.png similarity index 100% rename from src/Icons/qbittorrent.png rename to dist/unix/menuicons/192x192/apps/qbittorrent.png diff --git a/src/menuicons/22x22/apps/qbittorrent.png b/dist/unix/menuicons/22x22/apps/qbittorrent.png similarity index 100% rename from src/menuicons/22x22/apps/qbittorrent.png rename to dist/unix/menuicons/22x22/apps/qbittorrent.png diff --git a/src/menuicons/24x24/apps/qbittorrent.png b/dist/unix/menuicons/24x24/apps/qbittorrent.png similarity index 100% rename from src/menuicons/24x24/apps/qbittorrent.png rename to dist/unix/menuicons/24x24/apps/qbittorrent.png diff --git a/src/menuicons/32x32/apps/qbittorrent.png b/dist/unix/menuicons/32x32/apps/qbittorrent.png similarity index 100% rename from src/menuicons/32x32/apps/qbittorrent.png rename to dist/unix/menuicons/32x32/apps/qbittorrent.png diff --git a/src/menuicons/36x36/apps/qbittorrent.png b/dist/unix/menuicons/36x36/apps/qbittorrent.png similarity index 100% rename from src/menuicons/36x36/apps/qbittorrent.png rename to dist/unix/menuicons/36x36/apps/qbittorrent.png diff --git a/src/menuicons/48x48/apps/qbittorrent.png b/dist/unix/menuicons/48x48/apps/qbittorrent.png similarity index 100% rename from src/menuicons/48x48/apps/qbittorrent.png rename to dist/unix/menuicons/48x48/apps/qbittorrent.png diff --git a/src/menuicons/64x64/apps/qbittorrent.png b/dist/unix/menuicons/64x64/apps/qbittorrent.png similarity index 100% rename from src/menuicons/64x64/apps/qbittorrent.png rename to dist/unix/menuicons/64x64/apps/qbittorrent.png diff --git a/src/menuicons/72x72/apps/qbittorrent.png b/dist/unix/menuicons/72x72/apps/qbittorrent.png similarity index 100% rename from src/menuicons/72x72/apps/qbittorrent.png rename to dist/unix/menuicons/72x72/apps/qbittorrent.png diff --git a/src/menuicons/96x96/apps/qbittorrent.png b/dist/unix/menuicons/96x96/apps/qbittorrent.png similarity index 100% rename from src/menuicons/96x96/apps/qbittorrent.png rename to dist/unix/menuicons/96x96/apps/qbittorrent.png diff --git a/src/windows/README.txt b/dist/windows/README.txt similarity index 95% rename from src/windows/README.txt rename to dist/windows/README.txt index 7cce83eff..d1299df41 100644 --- a/src/windows/README.txt +++ b/dist/windows/README.txt @@ -41,7 +41,7 @@ installer-translations translations qt_ar.qm ... - (all the .qm files found in src/qt-translations in every source release) + (all the .qm files found in dist/qt-translations in every source release) qt_zh_TW.qm installer.nsi license.txt @@ -54,7 +54,7 @@ uninstaller.nsi 5. "license.txt" is a text file that contains the text rendered - from src\gpl.html or the text contained in COPYING + from src\gui\gpl.html or the text contained in COPYING 6. "qbittorrent.exe" is the compiled binary file. SCRIPT HACKERS: diff --git a/src/windows/UAC.nsh b/dist/windows/UAC.nsh similarity index 100% rename from src/windows/UAC.nsh rename to dist/windows/UAC.nsh diff --git a/src/windows/installer-translations/afrikaans.nsi b/dist/windows/installer-translations/afrikaans.nsi similarity index 100% rename from src/windows/installer-translations/afrikaans.nsi rename to dist/windows/installer-translations/afrikaans.nsi diff --git a/src/windows/installer-translations/albanian.nsi b/dist/windows/installer-translations/albanian.nsi similarity index 100% rename from src/windows/installer-translations/albanian.nsi rename to dist/windows/installer-translations/albanian.nsi diff --git a/src/windows/installer-translations/arabic.nsi b/dist/windows/installer-translations/arabic.nsi similarity index 100% rename from src/windows/installer-translations/arabic.nsi rename to dist/windows/installer-translations/arabic.nsi diff --git a/src/windows/installer-translations/basque.nsi b/dist/windows/installer-translations/basque.nsi similarity index 100% rename from src/windows/installer-translations/basque.nsi rename to dist/windows/installer-translations/basque.nsi diff --git a/src/windows/installer-translations/belarusian.nsi b/dist/windows/installer-translations/belarusian.nsi similarity index 100% rename from src/windows/installer-translations/belarusian.nsi rename to dist/windows/installer-translations/belarusian.nsi diff --git a/src/windows/installer-translations/bosnian.nsi b/dist/windows/installer-translations/bosnian.nsi similarity index 100% rename from src/windows/installer-translations/bosnian.nsi rename to dist/windows/installer-translations/bosnian.nsi diff --git a/src/windows/installer-translations/breton.nsi b/dist/windows/installer-translations/breton.nsi similarity index 100% rename from src/windows/installer-translations/breton.nsi rename to dist/windows/installer-translations/breton.nsi diff --git a/src/windows/installer-translations/bulgarian.nsi b/dist/windows/installer-translations/bulgarian.nsi similarity index 100% rename from src/windows/installer-translations/bulgarian.nsi rename to dist/windows/installer-translations/bulgarian.nsi diff --git a/src/windows/installer-translations/catalan.nsi b/dist/windows/installer-translations/catalan.nsi similarity index 100% rename from src/windows/installer-translations/catalan.nsi rename to dist/windows/installer-translations/catalan.nsi diff --git a/src/windows/installer-translations/croatian.nsi b/dist/windows/installer-translations/croatian.nsi similarity index 100% rename from src/windows/installer-translations/croatian.nsi rename to dist/windows/installer-translations/croatian.nsi diff --git a/src/windows/installer-translations/czech.nsi b/dist/windows/installer-translations/czech.nsi similarity index 100% rename from src/windows/installer-translations/czech.nsi rename to dist/windows/installer-translations/czech.nsi diff --git a/src/windows/installer-translations/danish.nsi b/dist/windows/installer-translations/danish.nsi similarity index 100% rename from src/windows/installer-translations/danish.nsi rename to dist/windows/installer-translations/danish.nsi diff --git a/src/windows/installer-translations/dutch.nsi b/dist/windows/installer-translations/dutch.nsi similarity index 100% rename from src/windows/installer-translations/dutch.nsi rename to dist/windows/installer-translations/dutch.nsi diff --git a/src/windows/installer-translations/english.nsi b/dist/windows/installer-translations/english.nsi similarity index 100% rename from src/windows/installer-translations/english.nsi rename to dist/windows/installer-translations/english.nsi diff --git a/src/windows/installer-translations/esperanto.nsi b/dist/windows/installer-translations/esperanto.nsi similarity index 100% rename from src/windows/installer-translations/esperanto.nsi rename to dist/windows/installer-translations/esperanto.nsi diff --git a/src/windows/installer-translations/estonian.nsi b/dist/windows/installer-translations/estonian.nsi similarity index 100% rename from src/windows/installer-translations/estonian.nsi rename to dist/windows/installer-translations/estonian.nsi diff --git a/src/windows/installer-translations/farsi.nsi b/dist/windows/installer-translations/farsi.nsi similarity index 100% rename from src/windows/installer-translations/farsi.nsi rename to dist/windows/installer-translations/farsi.nsi diff --git a/src/windows/installer-translations/finnish.nsi b/dist/windows/installer-translations/finnish.nsi similarity index 100% rename from src/windows/installer-translations/finnish.nsi rename to dist/windows/installer-translations/finnish.nsi diff --git a/src/windows/installer-translations/french.nsi b/dist/windows/installer-translations/french.nsi similarity index 100% rename from src/windows/installer-translations/french.nsi rename to dist/windows/installer-translations/french.nsi diff --git a/src/windows/installer-translations/galician.nsi b/dist/windows/installer-translations/galician.nsi similarity index 100% rename from src/windows/installer-translations/galician.nsi rename to dist/windows/installer-translations/galician.nsi diff --git a/src/windows/installer-translations/german.nsi b/dist/windows/installer-translations/german.nsi similarity index 100% rename from src/windows/installer-translations/german.nsi rename to dist/windows/installer-translations/german.nsi diff --git a/src/windows/installer-translations/greek.nsi b/dist/windows/installer-translations/greek.nsi similarity index 100% rename from src/windows/installer-translations/greek.nsi rename to dist/windows/installer-translations/greek.nsi diff --git a/src/windows/installer-translations/hebrew.nsi b/dist/windows/installer-translations/hebrew.nsi similarity index 100% rename from src/windows/installer-translations/hebrew.nsi rename to dist/windows/installer-translations/hebrew.nsi diff --git a/src/windows/installer-translations/hungarian.nsi b/dist/windows/installer-translations/hungarian.nsi similarity index 100% rename from src/windows/installer-translations/hungarian.nsi rename to dist/windows/installer-translations/hungarian.nsi diff --git a/src/windows/installer-translations/icelandic.nsi b/dist/windows/installer-translations/icelandic.nsi similarity index 100% rename from src/windows/installer-translations/icelandic.nsi rename to dist/windows/installer-translations/icelandic.nsi diff --git a/src/windows/installer-translations/indonesian.nsi b/dist/windows/installer-translations/indonesian.nsi similarity index 100% rename from src/windows/installer-translations/indonesian.nsi rename to dist/windows/installer-translations/indonesian.nsi diff --git a/src/windows/installer-translations/irish.nsi b/dist/windows/installer-translations/irish.nsi similarity index 100% rename from src/windows/installer-translations/irish.nsi rename to dist/windows/installer-translations/irish.nsi diff --git a/src/windows/installer-translations/italian.nsi b/dist/windows/installer-translations/italian.nsi similarity index 100% rename from src/windows/installer-translations/italian.nsi rename to dist/windows/installer-translations/italian.nsi diff --git a/src/windows/installer-translations/japanese.nsi b/dist/windows/installer-translations/japanese.nsi similarity index 100% rename from src/windows/installer-translations/japanese.nsi rename to dist/windows/installer-translations/japanese.nsi diff --git a/src/windows/installer-translations/korean.nsi b/dist/windows/installer-translations/korean.nsi similarity index 100% rename from src/windows/installer-translations/korean.nsi rename to dist/windows/installer-translations/korean.nsi diff --git a/src/windows/installer-translations/kurdish.nsi b/dist/windows/installer-translations/kurdish.nsi similarity index 100% rename from src/windows/installer-translations/kurdish.nsi rename to dist/windows/installer-translations/kurdish.nsi diff --git a/src/windows/installer-translations/latvian.nsi b/dist/windows/installer-translations/latvian.nsi similarity index 100% rename from src/windows/installer-translations/latvian.nsi rename to dist/windows/installer-translations/latvian.nsi diff --git a/src/windows/installer-translations/lithuanian.nsi b/dist/windows/installer-translations/lithuanian.nsi similarity index 100% rename from src/windows/installer-translations/lithuanian.nsi rename to dist/windows/installer-translations/lithuanian.nsi diff --git a/src/windows/installer-translations/luxembourgish.nsi b/dist/windows/installer-translations/luxembourgish.nsi similarity index 100% rename from src/windows/installer-translations/luxembourgish.nsi rename to dist/windows/installer-translations/luxembourgish.nsi diff --git a/src/windows/installer-translations/macedonian.nsi b/dist/windows/installer-translations/macedonian.nsi similarity index 100% rename from src/windows/installer-translations/macedonian.nsi rename to dist/windows/installer-translations/macedonian.nsi diff --git a/src/windows/installer-translations/malay.nsi b/dist/windows/installer-translations/malay.nsi similarity index 100% rename from src/windows/installer-translations/malay.nsi rename to dist/windows/installer-translations/malay.nsi diff --git a/src/windows/installer-translations/mongolian.nsi b/dist/windows/installer-translations/mongolian.nsi similarity index 100% rename from src/windows/installer-translations/mongolian.nsi rename to dist/windows/installer-translations/mongolian.nsi diff --git a/src/windows/installer-translations/norwegian.nsi b/dist/windows/installer-translations/norwegian.nsi similarity index 100% rename from src/windows/installer-translations/norwegian.nsi rename to dist/windows/installer-translations/norwegian.nsi diff --git a/src/windows/installer-translations/norwegiannynorsk.nsi b/dist/windows/installer-translations/norwegiannynorsk.nsi similarity index 100% rename from src/windows/installer-translations/norwegiannynorsk.nsi rename to dist/windows/installer-translations/norwegiannynorsk.nsi diff --git a/src/windows/installer-translations/polish.nsi b/dist/windows/installer-translations/polish.nsi similarity index 100% rename from src/windows/installer-translations/polish.nsi rename to dist/windows/installer-translations/polish.nsi diff --git a/src/windows/installer-translations/portuguese.nsi b/dist/windows/installer-translations/portuguese.nsi similarity index 100% rename from src/windows/installer-translations/portuguese.nsi rename to dist/windows/installer-translations/portuguese.nsi diff --git a/src/windows/installer-translations/portugueseBR.nsi b/dist/windows/installer-translations/portugueseBR.nsi similarity index 100% rename from src/windows/installer-translations/portugueseBR.nsi rename to dist/windows/installer-translations/portugueseBR.nsi diff --git a/src/windows/installer-translations/romanian.nsi b/dist/windows/installer-translations/romanian.nsi similarity index 100% rename from src/windows/installer-translations/romanian.nsi rename to dist/windows/installer-translations/romanian.nsi diff --git a/src/windows/installer-translations/russian.nsi b/dist/windows/installer-translations/russian.nsi similarity index 100% rename from src/windows/installer-translations/russian.nsi rename to dist/windows/installer-translations/russian.nsi diff --git a/src/windows/installer-translations/serbian.nsi b/dist/windows/installer-translations/serbian.nsi similarity index 100% rename from src/windows/installer-translations/serbian.nsi rename to dist/windows/installer-translations/serbian.nsi diff --git a/src/windows/installer-translations/serbianlatin.nsi b/dist/windows/installer-translations/serbianlatin.nsi similarity index 100% rename from src/windows/installer-translations/serbianlatin.nsi rename to dist/windows/installer-translations/serbianlatin.nsi diff --git a/src/windows/installer-translations/simpchinese.nsi b/dist/windows/installer-translations/simpchinese.nsi similarity index 100% rename from src/windows/installer-translations/simpchinese.nsi rename to dist/windows/installer-translations/simpchinese.nsi diff --git a/src/windows/installer-translations/slovak.nsi b/dist/windows/installer-translations/slovak.nsi similarity index 100% rename from src/windows/installer-translations/slovak.nsi rename to dist/windows/installer-translations/slovak.nsi diff --git a/src/windows/installer-translations/slovenian.nsi b/dist/windows/installer-translations/slovenian.nsi similarity index 100% rename from src/windows/installer-translations/slovenian.nsi rename to dist/windows/installer-translations/slovenian.nsi diff --git a/src/windows/installer-translations/spanish.nsi b/dist/windows/installer-translations/spanish.nsi similarity index 100% rename from src/windows/installer-translations/spanish.nsi rename to dist/windows/installer-translations/spanish.nsi diff --git a/src/windows/installer-translations/spanishinternational.nsi b/dist/windows/installer-translations/spanishinternational.nsi similarity index 100% rename from src/windows/installer-translations/spanishinternational.nsi rename to dist/windows/installer-translations/spanishinternational.nsi diff --git a/src/windows/installer-translations/swedish.nsi b/dist/windows/installer-translations/swedish.nsi similarity index 100% rename from src/windows/installer-translations/swedish.nsi rename to dist/windows/installer-translations/swedish.nsi diff --git a/src/windows/installer-translations/thai.nsi b/dist/windows/installer-translations/thai.nsi similarity index 100% rename from src/windows/installer-translations/thai.nsi rename to dist/windows/installer-translations/thai.nsi diff --git a/src/windows/installer-translations/tradchinese.nsi b/dist/windows/installer-translations/tradchinese.nsi similarity index 100% rename from src/windows/installer-translations/tradchinese.nsi rename to dist/windows/installer-translations/tradchinese.nsi diff --git a/src/windows/installer-translations/turkish.nsi b/dist/windows/installer-translations/turkish.nsi similarity index 100% rename from src/windows/installer-translations/turkish.nsi rename to dist/windows/installer-translations/turkish.nsi diff --git a/src/windows/installer-translations/ukrainian.nsi b/dist/windows/installer-translations/ukrainian.nsi similarity index 100% rename from src/windows/installer-translations/ukrainian.nsi rename to dist/windows/installer-translations/ukrainian.nsi diff --git a/src/windows/installer-translations/uzbek.nsi b/dist/windows/installer-translations/uzbek.nsi similarity index 100% rename from src/windows/installer-translations/uzbek.nsi rename to dist/windows/installer-translations/uzbek.nsi diff --git a/src/windows/installer-translations/welsh.nsi b/dist/windows/installer-translations/welsh.nsi similarity index 100% rename from src/windows/installer-translations/welsh.nsi rename to dist/windows/installer-translations/welsh.nsi diff --git a/src/windows/installer.nsi b/dist/windows/installer.nsi similarity index 100% rename from src/windows/installer.nsi rename to dist/windows/installer.nsi diff --git a/src/windows/nsis plugins/FindProc Unicode-source.zip b/dist/windows/nsis plugins/FindProc Unicode-source.zip similarity index 100% rename from src/windows/nsis plugins/FindProc Unicode-source.zip rename to dist/windows/nsis plugins/FindProc Unicode-source.zip diff --git a/src/windows/nsis plugins/FindProcDLL Unicode bin.zip b/dist/windows/nsis plugins/FindProcDLL Unicode bin.zip similarity index 100% rename from src/windows/nsis plugins/FindProcDLL Unicode bin.zip rename to dist/windows/nsis plugins/FindProcDLL Unicode bin.zip diff --git a/src/windows/nsis plugins/UAC Unicode.zip b/dist/windows/nsis plugins/UAC Unicode.zip similarity index 100% rename from src/windows/nsis plugins/UAC Unicode.zip rename to dist/windows/nsis plugins/UAC Unicode.zip diff --git a/src/windows/nsis plugins/UAC.zip b/dist/windows/nsis plugins/UAC.zip similarity index 100% rename from src/windows/nsis plugins/UAC.zip rename to dist/windows/nsis plugins/UAC.zip diff --git a/src/windows/nsis plugins/nsisFirewall.zip b/dist/windows/nsis plugins/nsisFirewall.zip similarity index 100% rename from src/windows/nsis plugins/nsisFirewall.zip rename to dist/windows/nsis plugins/nsisFirewall.zip diff --git a/src/windows/options.nsi b/dist/windows/options.nsi similarity index 100% rename from src/windows/options.nsi rename to dist/windows/options.nsi diff --git a/src/windows/qbittorrent.nsi b/dist/windows/qbittorrent.nsi similarity index 100% rename from src/windows/qbittorrent.nsi rename to dist/windows/qbittorrent.nsi diff --git a/src/windows/qt.conf b/dist/windows/qt.conf similarity index 100% rename from src/windows/qt.conf rename to dist/windows/qt.conf diff --git a/src/windows/translations.nsi b/dist/windows/translations.nsi similarity index 100% rename from src/windows/translations.nsi rename to dist/windows/translations.nsi diff --git a/src/windows/uninstaller.nsi b/dist/windows/uninstaller.nsi similarity index 100% rename from src/windows/uninstaller.nsi rename to dist/windows/uninstaller.nsi diff --git a/macxconf.pri b/macxconf.pri index 653a9ec43..c4261d742 100644 --- a/macxconf.pri +++ b/macxconf.pri @@ -12,46 +12,50 @@ exists($$OUT_PWD/../conf.pri) { LIBS += -framework Carbon -framework IOKit CONFIG += c++11 +QT_LANG_PATH = ../dist/qt-translations +DIST_PATH = ../dist/mac + document_icon.path = Contents/Resources -document_icon.files = mac/qBitTorrentDocument.icns +document_icon.files = $$DIST_PATH/qBitTorrentDocument.icns QMAKE_BUNDLE_DATA += document_icon qt_conf.path = Contents/Resources -qt_conf.files = mac/qt.conf +qt_conf.files = $$DIST_PATH/qt.conf QMAKE_BUNDLE_DATA += qt_conf qt_translations.path = Contents/translations -qt_translations.files = qt-translations/qt_ar.qm \ - qt-translations/qt_bg.qm \ - qt-translations/qt_ca.qm \ - qt-translations/qt_cs.qm \ - qt-translations/qt_da.qm \ - qt-translations/qt_de.qm \ - qt-translations/qt_es.qm \ - qt-translations/qt_fi.qm \ - qt-translations/qt_fr.qm \ - qt-translations/qt_gl.qm \ - qt-translations/qt_he.qm \ - qt-translations/qt_hu.qm \ - qt-translations/qt_it.qm \ - qt-translations/qt_ja.qm \ - qt-translations/qt_ko.qm \ - qt-translations/qt_lt.qm \ - qt-translations/qt_nl.qm \ - qt-translations/qt_pl.qm \ - qt-translations/qt_pt.qm \ - qt-translations/qt_pt_BR.qm \ - qt-translations/qt_ru.qm \ - qt-translations/qt_sk.qm \ - qt-translations/qt_sv.qm \ - qt-translations/qt_tr.qm \ - qt-translations/qt_uk.qm \ - qt-translations/qt_zh_CN.qm \ - qt-translations/qt_zh_TW.qm +qt_translations.files = \ + $$QT_LANG_PATH/qt_ar.qm \ + $$QT_LANG_PATH/qt_bg.qm \ + $$QT_LANG_PATH/qt_ca.qm \ + $$QT_LANG_PATH/qt_cs.qm \ + $$QT_LANG_PATH/qt_da.qm \ + $$QT_LANG_PATH/qt_de.qm \ + $$QT_LANG_PATH/qt_es.qm \ + $$QT_LANG_PATH/qt_fi.qm \ + $$QT_LANG_PATH/qt_fr.qm \ + $$QT_LANG_PATH/qt_gl.qm \ + $$QT_LANG_PATH/qt_he.qm \ + $$QT_LANG_PATH/qt_hu.qm \ + $$QT_LANG_PATH/qt_it.qm \ + $$QT_LANG_PATH/qt_ja.qm \ + $$QT_LANG_PATH/qt_ko.qm \ + $$QT_LANG_PATH/qt_lt.qm \ + $$QT_LANG_PATH/qt_nl.qm \ + $$QT_LANG_PATH/qt_pl.qm \ + $$QT_LANG_PATH/qt_pt.qm \ + $$QT_LANG_PATH/qt_pt_BR.qm \ + $$QT_LANG_PATH/qt_ru.qm \ + $$QT_LANG_PATH/qt_sk.qm \ + $$QT_LANG_PATH/qt_sv.qm \ + $$QT_LANG_PATH/qt_tr.qm \ + $$QT_LANG_PATH/qt_uk.qm \ + $$QT_LANG_PATH/qt_zh_CN.qm \ + $$QT_LANG_PATH/qt_zh_TW.qm QMAKE_BUNDLE_DATA += qt_translations -ICON = mac/qbittorrent_mac.icns -QMAKE_INFO_PLIST = mac/Info.plist +ICON = $$DIST_PATH/qbittorrent_mac.icns +QMAKE_INFO_PLIST = $$DIST_PATH/Info.plist DEFINES += WITH_GEOIP_EMBEDDED message("On Mac OS X, GeoIP database must be embedded.") diff --git a/os2conf.pri b/os2conf.pri index 2e49504e8..b0678d4ff 100644 --- a/os2conf.pri +++ b/os2conf.pri @@ -3,11 +3,12 @@ exists(conf.pri) { include(conf.pri) } -LIBS += -ltorrent-rasterbar \ - -lboost_thread \ - -lboost_system \ - -lboost_filesystem \ - -lssl -lcrypto -lidn -lpthread -lz +LIBS += \ + -ltorrent-rasterbar \ + -lboost_thread \ + -lboost_system \ + -lboost_filesystem \ + -lssl -lcrypto -lidn -lpthread -lz RC_FILE = qbittorrent_os2.rc diff --git a/qbittorrent.qc b/qbittorrent.qc deleted file mode 100644 index 6f10673f4..000000000 --- a/qbittorrent.qc +++ /dev/null @@ -1,25 +0,0 @@ - - qbittorrent - qbittorrent.pro - qcm - - - - - - - - - - - - - - - - - - - - - diff --git a/src/app/app.pri b/src/app/app.pri new file mode 100644 index 000000000..6ffe7be19 --- /dev/null +++ b/src/app/app.pri @@ -0,0 +1,40 @@ +INCLUDEPATH += $$PWD + +usesystemqtsingleapplication { + nogui { + CONFIG += qtsinglecoreapplication + } else { + CONFIG += qtsingleapplication + } +} else { + nogui { + include(qtsingleapplication/qtsinglecoreapplication.pri) + } else { + include(qtsingleapplication/qtsingleapplication.pri) + } +} + +!nogui { + macx { + HEADERS += $$PWD/qmacapplication.h + SOURCES += $$PWD/qmacapplication.cpp + } + HEADERS += $$PWD/sessionapplication.h + SOURCES += $$PWD/sessionapplication.cpp +} + +HEADERS += $$PWD/application.h +SOURCES += $$PWD/application.cpp + +nogui: HEADERS += $$PWD/headlessloader.h + +unix: HEADERS += $$PWD/stacktrace.h +strace_win { + HEADERS += $$PWD/stacktrace_win.h + !nogui { + HEADERS += $$PWD/stacktrace_win_dlg.h + FORMS += $$PWD/stacktrace_win_dlg.ui + } +} + +SOURCES += $$PWD/main.cpp diff --git a/src/application.cpp b/src/app/application.cpp similarity index 100% rename from src/application.cpp rename to src/app/application.cpp diff --git a/src/application.h b/src/app/application.h similarity index 100% rename from src/application.h rename to src/app/application.h diff --git a/src/headlessloader.h b/src/app/headlessloader.h similarity index 100% rename from src/headlessloader.h rename to src/app/headlessloader.h diff --git a/src/main.cpp b/src/app/main.cpp similarity index 99% rename from src/main.cpp rename to src/app/main.cpp index b26a6f1e9..2ddde2853 100644 --- a/src/main.cpp +++ b/src/app/main.cpp @@ -404,7 +404,7 @@ void sigabrtHandler(int) #ifndef DISABLE_GUI void showSplashScreen() { - QPixmap splash_img(":/Icons/skin/splash.png"); + QPixmap splash_img(":/icons/skin/splash.png"); QPainter painter(&splash_img); QString version = VERSION; painter.setPen(QPen(Qt::white)); diff --git a/src/qmacapplication.cpp b/src/app/qmacapplication.cpp similarity index 100% rename from src/qmacapplication.cpp rename to src/app/qmacapplication.cpp diff --git a/src/qmacapplication.h b/src/app/qmacapplication.h similarity index 100% rename from src/qmacapplication.h rename to src/app/qmacapplication.h diff --git a/src/qtsingleapp/QtLockedFile b/src/app/qtsingleapplication/QtLockedFile similarity index 100% rename from src/qtsingleapp/QtLockedFile rename to src/app/qtsingleapplication/QtLockedFile diff --git a/src/qtsingleapp/QtSingleApplication b/src/app/qtsingleapplication/QtSingleApplication similarity index 100% rename from src/qtsingleapp/QtSingleApplication rename to src/app/qtsingleapplication/QtSingleApplication diff --git a/src/qtsingleapp/qtlocalpeer.cpp b/src/app/qtsingleapplication/qtlocalpeer.cpp similarity index 100% rename from src/qtsingleapp/qtlocalpeer.cpp rename to src/app/qtsingleapplication/qtlocalpeer.cpp diff --git a/src/qtsingleapp/qtlocalpeer.h b/src/app/qtsingleapplication/qtlocalpeer.h similarity index 100% rename from src/qtsingleapp/qtlocalpeer.h rename to src/app/qtsingleapplication/qtlocalpeer.h diff --git a/src/qtsingleapp/qtlockedfile.cpp b/src/app/qtsingleapplication/qtlockedfile.cpp similarity index 100% rename from src/qtsingleapp/qtlockedfile.cpp rename to src/app/qtsingleapplication/qtlockedfile.cpp diff --git a/src/qtsingleapp/qtlockedfile.h b/src/app/qtsingleapplication/qtlockedfile.h similarity index 100% rename from src/qtsingleapp/qtlockedfile.h rename to src/app/qtsingleapplication/qtlockedfile.h diff --git a/src/qtsingleapp/qtlockedfile_unix.cpp b/src/app/qtsingleapplication/qtlockedfile_unix.cpp similarity index 100% rename from src/qtsingleapp/qtlockedfile_unix.cpp rename to src/app/qtsingleapplication/qtlockedfile_unix.cpp diff --git a/src/qtsingleapp/qtlockedfile_win.cpp b/src/app/qtsingleapplication/qtlockedfile_win.cpp similarity index 100% rename from src/qtsingleapp/qtlockedfile_win.cpp rename to src/app/qtsingleapplication/qtlockedfile_win.cpp diff --git a/src/qtsingleapp/qtsingleapplication.cpp b/src/app/qtsingleapplication/qtsingleapplication.cpp similarity index 100% rename from src/qtsingleapp/qtsingleapplication.cpp rename to src/app/qtsingleapplication/qtsingleapplication.cpp diff --git a/src/qtsingleapp/qtsingleapplication.h b/src/app/qtsingleapplication/qtsingleapplication.h similarity index 100% rename from src/qtsingleapp/qtsingleapplication.h rename to src/app/qtsingleapplication/qtsingleapplication.h diff --git a/src/qtsingleapp/qtsingleapplication.pri b/src/app/qtsingleapplication/qtsingleapplication.pri similarity index 100% rename from src/qtsingleapp/qtsingleapplication.pri rename to src/app/qtsingleapplication/qtsingleapplication.pri diff --git a/src/qtsingleapp/qtsinglecoreapplication.cpp b/src/app/qtsingleapplication/qtsinglecoreapplication.cpp similarity index 100% rename from src/qtsingleapp/qtsinglecoreapplication.cpp rename to src/app/qtsingleapplication/qtsinglecoreapplication.cpp diff --git a/src/qtsingleapp/qtsinglecoreapplication.h b/src/app/qtsingleapplication/qtsinglecoreapplication.h similarity index 100% rename from src/qtsingleapp/qtsinglecoreapplication.h rename to src/app/qtsingleapplication/qtsinglecoreapplication.h diff --git a/src/qtsingleapp/qtsinglecoreapplication.pri b/src/app/qtsingleapplication/qtsinglecoreapplication.pri similarity index 100% rename from src/qtsingleapp/qtsinglecoreapplication.pri rename to src/app/qtsingleapplication/qtsinglecoreapplication.pri diff --git a/src/sessionapplication.cpp b/src/app/sessionapplication.cpp similarity index 100% rename from src/sessionapplication.cpp rename to src/app/sessionapplication.cpp diff --git a/src/sessionapplication.h b/src/app/sessionapplication.h similarity index 100% rename from src/sessionapplication.h rename to src/app/sessionapplication.h diff --git a/src/stacktrace.h b/src/app/stacktrace.h similarity index 100% rename from src/stacktrace.h rename to src/app/stacktrace.h diff --git a/src/stacktrace_win.h b/src/app/stacktrace_win.h similarity index 100% rename from src/stacktrace_win.h rename to src/app/stacktrace_win.h diff --git a/src/stacktrace_win_dlg.h b/src/app/stacktrace_win_dlg.h similarity index 100% rename from src/stacktrace_win_dlg.h rename to src/app/stacktrace_win_dlg.h diff --git a/src/stacktrace_win_dlg.ui b/src/app/stacktrace_win_dlg.ui similarity index 100% rename from src/stacktrace_win_dlg.ui rename to src/app/stacktrace_win_dlg.ui diff --git a/src/core/core.pri b/src/core/core.pri new file mode 100644 index 000000000..006e147b3 --- /dev/null +++ b/src/core/core.pri @@ -0,0 +1,35 @@ +INCLUDEPATH += $$PWD + +unix:!macx:dbus: include(qtnotify/qtnotify.pri) + +include(qtlibtorrent/qtlibtorrent.pri) +include(tracker/tracker.pri) + +HEADERS += \ + $$PWD/misc.h \ + $$PWD/fs_utils.h \ + $$PWD/downloadthread.h \ + $$PWD/torrentpersistentdata.h \ + $$PWD/filesystemwatcher.h \ + $$PWD/scannedfoldersmodel.h \ + $$PWD/qinisettings.h \ + $$PWD/smtp.h \ + $$PWD/dnsupdater.h \ + $$PWD/logger.h \ + $$PWD/httptypes.h \ + $$PWD/httprequestparser.h \ + $$PWD/httpresponsegenerator.h \ + $$PWD/preferences.h + +SOURCES += \ + $$PWD/downloadthread.cpp \ + $$PWD/scannedfoldersmodel.cpp \ + $$PWD/torrentpersistentdata.cpp \ + $$PWD/misc.cpp \ + $$PWD/fs_utils.cpp \ + $$PWD/smtp.cpp \ + $$PWD/dnsupdater.cpp \ + $$PWD/logger.cpp \ + $$PWD/httprequestparser.cpp \ + $$PWD/httpresponsegenerator.cpp \ + $$PWD/preferences.cpp diff --git a/src/dnsupdater.cpp b/src/core/dnsupdater.cpp similarity index 100% rename from src/dnsupdater.cpp rename to src/core/dnsupdater.cpp diff --git a/src/dnsupdater.h b/src/core/dnsupdater.h similarity index 100% rename from src/dnsupdater.h rename to src/core/dnsupdater.h diff --git a/src/downloadthread.cpp b/src/core/downloadthread.cpp similarity index 100% rename from src/downloadthread.cpp rename to src/core/downloadthread.cpp diff --git a/src/downloadthread.h b/src/core/downloadthread.h similarity index 100% rename from src/downloadthread.h rename to src/core/downloadthread.h diff --git a/src/filesystemwatcher.h b/src/core/filesystemwatcher.h similarity index 100% rename from src/filesystemwatcher.h rename to src/core/filesystemwatcher.h diff --git a/src/fs_utils.cpp b/src/core/fs_utils.cpp similarity index 100% rename from src/fs_utils.cpp rename to src/core/fs_utils.cpp diff --git a/src/fs_utils.h b/src/core/fs_utils.h similarity index 100% rename from src/fs_utils.h rename to src/core/fs_utils.h diff --git a/src/webui/httprequestparser.cpp b/src/core/httprequestparser.cpp similarity index 100% rename from src/webui/httprequestparser.cpp rename to src/core/httprequestparser.cpp diff --git a/src/webui/httprequestparser.h b/src/core/httprequestparser.h similarity index 100% rename from src/webui/httprequestparser.h rename to src/core/httprequestparser.h diff --git a/src/webui/httpresponsegenerator.cpp b/src/core/httpresponsegenerator.cpp similarity index 100% rename from src/webui/httpresponsegenerator.cpp rename to src/core/httpresponsegenerator.cpp diff --git a/src/webui/httpresponsegenerator.h b/src/core/httpresponsegenerator.h similarity index 100% rename from src/webui/httpresponsegenerator.h rename to src/core/httpresponsegenerator.h diff --git a/src/webui/httptypes.h b/src/core/httptypes.h similarity index 100% rename from src/webui/httptypes.h rename to src/core/httptypes.h diff --git a/src/logger.cpp b/src/core/logger.cpp similarity index 100% rename from src/logger.cpp rename to src/core/logger.cpp diff --git a/src/logger.h b/src/core/logger.h similarity index 100% rename from src/logger.h rename to src/core/logger.h diff --git a/src/misc.cpp b/src/core/misc.cpp similarity index 100% rename from src/misc.cpp rename to src/core/misc.cpp diff --git a/src/misc.h b/src/core/misc.h similarity index 100% rename from src/misc.h rename to src/core/misc.h diff --git a/src/preferences/preferences.cpp b/src/core/preferences.cpp similarity index 100% rename from src/preferences/preferences.cpp rename to src/core/preferences.cpp diff --git a/src/preferences/preferences.h b/src/core/preferences.h old mode 100755 new mode 100644 similarity index 100% rename from src/preferences/preferences.h rename to src/core/preferences.h diff --git a/src/qinisettings.h b/src/core/qinisettings.h similarity index 100% rename from src/qinisettings.h rename to src/core/qinisettings.h diff --git a/src/qtlibtorrent/alertdispatcher.cpp b/src/core/qtlibtorrent/alertdispatcher.cpp similarity index 100% rename from src/qtlibtorrent/alertdispatcher.cpp rename to src/core/qtlibtorrent/alertdispatcher.cpp diff --git a/src/qtlibtorrent/alertdispatcher.h b/src/core/qtlibtorrent/alertdispatcher.h similarity index 100% rename from src/qtlibtorrent/alertdispatcher.h rename to src/core/qtlibtorrent/alertdispatcher.h diff --git a/src/qtlibtorrent/bandwidthscheduler.h b/src/core/qtlibtorrent/bandwidthscheduler.h similarity index 100% rename from src/qtlibtorrent/bandwidthscheduler.h rename to src/core/qtlibtorrent/bandwidthscheduler.h diff --git a/src/qtlibtorrent/filterparserthread.cpp b/src/core/qtlibtorrent/filterparserthread.cpp similarity index 100% rename from src/qtlibtorrent/filterparserthread.cpp rename to src/core/qtlibtorrent/filterparserthread.cpp diff --git a/src/qtlibtorrent/filterparserthread.h b/src/core/qtlibtorrent/filterparserthread.h similarity index 100% rename from src/qtlibtorrent/filterparserthread.h rename to src/core/qtlibtorrent/filterparserthread.h diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/core/qtlibtorrent/qbtsession.cpp old mode 100755 new mode 100644 similarity index 100% rename from src/qtlibtorrent/qbtsession.cpp rename to src/core/qtlibtorrent/qbtsession.cpp diff --git a/src/qtlibtorrent/qbtsession.h b/src/core/qtlibtorrent/qbtsession.h old mode 100755 new mode 100644 similarity index 100% rename from src/qtlibtorrent/qbtsession.h rename to src/core/qtlibtorrent/qbtsession.h diff --git a/src/qtlibtorrent/qtlibtorrent.pri b/src/core/qtlibtorrent/qtlibtorrent.pri similarity index 100% rename from src/qtlibtorrent/qtlibtorrent.pri rename to src/core/qtlibtorrent/qtlibtorrent.pri diff --git a/src/qtlibtorrent/qtorrenthandle.cpp b/src/core/qtlibtorrent/qtorrenthandle.cpp similarity index 100% rename from src/qtlibtorrent/qtorrenthandle.cpp rename to src/core/qtlibtorrent/qtorrenthandle.cpp diff --git a/src/qtlibtorrent/qtorrenthandle.h b/src/core/qtlibtorrent/qtorrenthandle.h similarity index 100% rename from src/qtlibtorrent/qtorrenthandle.h rename to src/core/qtlibtorrent/qtorrenthandle.h diff --git a/src/qtlibtorrent/shutdownconfirm.cpp b/src/core/qtlibtorrent/shutdownconfirm.cpp similarity index 100% rename from src/qtlibtorrent/shutdownconfirm.cpp rename to src/core/qtlibtorrent/shutdownconfirm.cpp diff --git a/src/qtlibtorrent/shutdownconfirm.h b/src/core/qtlibtorrent/shutdownconfirm.h similarity index 100% rename from src/qtlibtorrent/shutdownconfirm.h rename to src/core/qtlibtorrent/shutdownconfirm.h diff --git a/src/qtlibtorrent/torrentmodel.cpp b/src/core/qtlibtorrent/torrentmodel.cpp similarity index 97% rename from src/qtlibtorrent/torrentmodel.cpp rename to src/core/qtlibtorrent/torrentmodel.cpp index 5df8298bc..25973828a 100644 --- a/src/qtlibtorrent/torrentmodel.cpp +++ b/src/core/qtlibtorrent/torrentmodel.cpp @@ -41,42 +41,42 @@ using namespace libtorrent; namespace { QIcon get_paused_icon() { - static QIcon cached = QIcon(":/Icons/skin/paused.png"); + static QIcon cached = QIcon(":/icons/skin/paused.png"); return cached; } QIcon get_queued_icon() { - static QIcon cached = QIcon(":/Icons/skin/queued.png"); + static QIcon cached = QIcon(":/icons/skin/queued.png"); return cached; } QIcon get_downloading_icon() { - static QIcon cached = QIcon(":/Icons/skin/downloading.png"); + static QIcon cached = QIcon(":/icons/skin/downloading.png"); return cached; } QIcon get_stalled_downloading_icon() { - static QIcon cached = QIcon(":/Icons/skin/stalledDL.png"); + static QIcon cached = QIcon(":/icons/skin/stalledDL.png"); return cached; } QIcon get_uploading_icon() { - static QIcon cached = QIcon(":/Icons/skin/uploading.png"); + static QIcon cached = QIcon(":/icons/skin/uploading.png"); return cached; } QIcon get_stalled_uploading_icon() { - static QIcon cached = QIcon(":/Icons/skin/stalledUP.png"); + static QIcon cached = QIcon(":/icons/skin/stalledUP.png"); return cached; } QIcon get_checking_icon() { - static QIcon cached = QIcon(":/Icons/skin/checking.png"); + static QIcon cached = QIcon(":/icons/skin/checking.png"); return cached; } QIcon get_error_icon() { - static QIcon cached = QIcon(":/Icons/skin/error.png"); + static QIcon cached = QIcon(":/icons/skin/error.png"); return cached; } } diff --git a/src/qtlibtorrent/torrentmodel.h b/src/core/qtlibtorrent/torrentmodel.h similarity index 100% rename from src/qtlibtorrent/torrentmodel.h rename to src/core/qtlibtorrent/torrentmodel.h diff --git a/src/qtlibtorrent/torrentspeedmonitor.cpp b/src/core/qtlibtorrent/torrentspeedmonitor.cpp similarity index 100% rename from src/qtlibtorrent/torrentspeedmonitor.cpp rename to src/core/qtlibtorrent/torrentspeedmonitor.cpp diff --git a/src/qtlibtorrent/torrentspeedmonitor.h b/src/core/qtlibtorrent/torrentspeedmonitor.h similarity index 100% rename from src/qtlibtorrent/torrentspeedmonitor.h rename to src/core/qtlibtorrent/torrentspeedmonitor.h diff --git a/src/qtlibtorrent/torrentstatistics.cpp b/src/core/qtlibtorrent/torrentstatistics.cpp similarity index 100% rename from src/qtlibtorrent/torrentstatistics.cpp rename to src/core/qtlibtorrent/torrentstatistics.cpp diff --git a/src/qtlibtorrent/torrentstatistics.h b/src/core/qtlibtorrent/torrentstatistics.h similarity index 100% rename from src/qtlibtorrent/torrentstatistics.h rename to src/core/qtlibtorrent/torrentstatistics.h diff --git a/src/qtlibtorrent/trackerinfos.h b/src/core/qtlibtorrent/trackerinfos.h similarity index 100% rename from src/qtlibtorrent/trackerinfos.h rename to src/core/qtlibtorrent/trackerinfos.h diff --git a/src/qtnotify/notifications.cpp b/src/core/qtnotify/notifications.cpp similarity index 100% rename from src/qtnotify/notifications.cpp rename to src/core/qtnotify/notifications.cpp diff --git a/src/qtnotify/notifications.h b/src/core/qtnotify/notifications.h similarity index 100% rename from src/qtnotify/notifications.h rename to src/core/qtnotify/notifications.h diff --git a/src/qtnotify/notifications.xml b/src/core/qtnotify/notifications.xml similarity index 100% rename from src/qtnotify/notifications.xml rename to src/core/qtnotify/notifications.xml diff --git a/src/qtnotify/qtnotify.pri b/src/core/qtnotify/qtnotify.pri similarity index 100% rename from src/qtnotify/qtnotify.pri rename to src/core/qtnotify/qtnotify.pri diff --git a/src/scannedfoldersmodel.cpp b/src/core/scannedfoldersmodel.cpp similarity index 100% rename from src/scannedfoldersmodel.cpp rename to src/core/scannedfoldersmodel.cpp diff --git a/src/scannedfoldersmodel.h b/src/core/scannedfoldersmodel.h similarity index 100% rename from src/scannedfoldersmodel.h rename to src/core/scannedfoldersmodel.h diff --git a/src/smtp.cpp b/src/core/smtp.cpp similarity index 100% rename from src/smtp.cpp rename to src/core/smtp.cpp diff --git a/src/smtp.h b/src/core/smtp.h similarity index 100% rename from src/smtp.h rename to src/core/smtp.h diff --git a/src/torrentpersistentdata.cpp b/src/core/torrentpersistentdata.cpp similarity index 100% rename from src/torrentpersistentdata.cpp rename to src/core/torrentpersistentdata.cpp diff --git a/src/torrentpersistentdata.h b/src/core/torrentpersistentdata.h similarity index 100% rename from src/torrentpersistentdata.h rename to src/core/torrentpersistentdata.h diff --git a/src/tracker/qpeer.h b/src/core/tracker/qpeer.h similarity index 100% rename from src/tracker/qpeer.h rename to src/core/tracker/qpeer.h diff --git a/src/tracker/qtracker.cpp b/src/core/tracker/qtracker.cpp similarity index 100% rename from src/tracker/qtracker.cpp rename to src/core/tracker/qtracker.cpp diff --git a/src/tracker/qtracker.h b/src/core/tracker/qtracker.h similarity index 100% rename from src/tracker/qtracker.h rename to src/core/tracker/qtracker.h diff --git a/src/tracker/tracker.pri b/src/core/tracker/tracker.pri similarity index 100% rename from src/tracker/tracker.pri rename to src/core/tracker/tracker.pri diff --git a/src/tracker/trackerannouncerequest.h b/src/core/tracker/trackerannouncerequest.h similarity index 100% rename from src/tracker/trackerannouncerequest.h rename to src/core/tracker/trackerannouncerequest.h diff --git a/src/about.qrc b/src/gui/about.qrc similarity index 100% rename from src/about.qrc rename to src/gui/about.qrc diff --git a/src/about.ui b/src/gui/about.ui similarity index 99% rename from src/about.ui rename to src/gui/about.ui index b08cf2a1b..8dd7d07d3 100644 --- a/src/about.ui +++ b/src/gui/about.ui @@ -89,7 +89,7 @@ - :/Icons/skin/mascot.png + :/icons/skin/mascot.png diff --git a/src/about_imp.h b/src/gui/about_imp.h similarity index 99% rename from src/about_imp.h rename to src/gui/about_imp.h index 4990f528a..3972e5c09 100644 --- a/src/about_imp.h +++ b/src/gui/about_imp.h @@ -67,7 +67,7 @@ class about : public QDialog, private Ui::AboutDlg{ "

"); lb_about->setText(aboutText); // Set icons - logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/qbittorrent22.png"))); + logo->setPixmap(QPixmap(QString::fromUtf8(":/icons/skin/qbittorrent22.png"))); //Title lb_name->setText(QString::fromUtf8("

qBittorrent")+QString::fromUtf8(" " VERSION"

")); // Thanks diff --git a/src/addnewtorrentdialog.cpp b/src/gui/addnewtorrentdialog.cpp similarity index 100% rename from src/addnewtorrentdialog.cpp rename to src/gui/addnewtorrentdialog.cpp diff --git a/src/addnewtorrentdialog.h b/src/gui/addnewtorrentdialog.h similarity index 100% rename from src/addnewtorrentdialog.h rename to src/gui/addnewtorrentdialog.h diff --git a/src/addnewtorrentdialog.ui b/src/gui/addnewtorrentdialog.ui similarity index 100% rename from src/addnewtorrentdialog.ui rename to src/gui/addnewtorrentdialog.ui diff --git a/src/preferences/advancedsettings.h b/src/gui/advancedsettings.h similarity index 100% rename from src/preferences/advancedsettings.h rename to src/gui/advancedsettings.h diff --git a/src/autoexpandabledialog.cpp b/src/gui/autoexpandabledialog.cpp similarity index 100% rename from src/autoexpandabledialog.cpp rename to src/gui/autoexpandabledialog.cpp diff --git a/src/autoexpandabledialog.h b/src/gui/autoexpandabledialog.h similarity index 100% rename from src/autoexpandabledialog.h rename to src/gui/autoexpandabledialog.h diff --git a/src/autoexpandabledialog.ui b/src/gui/autoexpandabledialog.ui similarity index 100% rename from src/autoexpandabledialog.ui rename to src/gui/autoexpandabledialog.ui diff --git a/src/bandwidth_limit.ui b/src/gui/bandwidth_limit.ui similarity index 100% rename from src/bandwidth_limit.ui rename to src/gui/bandwidth_limit.ui diff --git a/src/confirmdeletiondlg.ui b/src/gui/confirmdeletiondlg.ui similarity index 100% rename from src/confirmdeletiondlg.ui rename to src/gui/confirmdeletiondlg.ui diff --git a/src/deletionconfirmationdlg.h b/src/gui/deletionconfirmationdlg.h similarity index 100% rename from src/deletionconfirmationdlg.h rename to src/gui/deletionconfirmationdlg.h diff --git a/src/downloadfromurldlg.h b/src/gui/downloadfromurldlg.h similarity index 100% rename from src/downloadfromurldlg.h rename to src/gui/downloadfromurldlg.h diff --git a/src/downloadfromurldlg.ui b/src/gui/downloadfromurldlg.ui similarity index 100% rename from src/downloadfromurldlg.ui rename to src/gui/downloadfromurldlg.ui diff --git a/src/executionlog.cpp b/src/gui/executionlog.cpp similarity index 100% rename from src/executionlog.cpp rename to src/gui/executionlog.cpp diff --git a/src/executionlog.h b/src/gui/executionlog.h similarity index 100% rename from src/executionlog.h rename to src/gui/executionlog.h diff --git a/src/executionlog.ui b/src/gui/executionlog.ui similarity index 100% rename from src/executionlog.ui rename to src/gui/executionlog.ui diff --git a/src/gui/geoip/GeoIP.dat b/src/gui/geoip/GeoIP.dat new file mode 100644 index 0000000000000000000000000000000000000000..44eb02eb79b16ab09b35d69d811d8adfd96f36ac GIT binary patch literal 1115209 zcmZU63HVLb7xsJS>CER|QsyZ$rHo0EDH@ECp%5~rLI_EU%%Qwbx#I?X~yW_uO-TB0v;~0db&L%g9A7BMBf09Bhk2 zZIJ@fzUtZCSBc9=N7hte|2=VI^T@A$zO>R1JAG zS)-6mY5+BXVZ|bgR}_o2fjTrU`*neO(rh4|_lw2)(i|Y=hQM3&zgVO{yuL0L8>=%o@g(Q~%eL{XQ&{w>luzx5Y0BkE3Y4B1>1_}p-wUl2bK14WFI81oCu%tNx z7|E0?7KhRl@Jz8d8W_XC0%KMDuvp}EB`^UXxk^ZKH84)RX|XsSAX3PN#7V$pU@9<8 z9!@S6uLY(6k8yy-;+A5Oy>R#~qPDqvd5b0_dXTx2Obc4 zQ23Crr0}pf_4fjg0FSD;33vh6$w;dBIPe7Ur1)0hQ^Kc(&j@K@Gq6Sc*-&yvvG|<$ zwotMicwTμ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 z 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

jIqZ|pynf1o>wA;z&*5i@ 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 - setWindowIcon(QIcon::fromTheme("qbittorrent", QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")))); + setWindowIcon(QIcon::fromTheme("qbittorrent", QIcon(QString::fromUtf8(":/icons/skin/qbittorrent32.png")))); else #endif - setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png"))); + setWindowIcon(QIcon(QString::fromUtf8(":/icons/skin/qbittorrent32.png"))); addToolbarContextMenu(); actionOpen->setIcon(IconProvider::instance()->getIcon("list-add")); actionDownload_from_URL->setIcon(IconProvider::instance()->getIcon("insert-link")); - actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); - actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png"))); - actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); - actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png"))); + actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/icons/skin/seeding.png"))); + actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/icons/skin/download.png"))); + actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/icons/skin/seeding.png"))); + actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/icons/skin/download.png"))); actionCreate_torrent->setIcon(IconProvider::instance()->getIcon("document-edit")); actionAbout->setIcon(IconProvider::instance()->getIcon("help-about")); actionStatistics->setIcon(IconProvider::instance()->getIcon("view-statistics")); @@ -1311,10 +1311,10 @@ void MainWindow::updateGUI() html += "qBittorrent"; html += ""; html += "

"; html += "
"; - html += " " + tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(misc::accurateDoubleToString(QBtSession::instance()->getPayloadUploadRate() / 1024., 1)); + html += " " + tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(misc::accurateDoubleToString(QBtSession::instance()->getPayloadUploadRate() / 1024., 1)); html += "
"; #else // OSes such as Windows do not support html here @@ -1653,9 +1653,9 @@ QIcon MainWindow::getSystrayIcon() const TrayIcon::Style style = Preferences::instance()->trayIconStyle(); switch(style) { case TrayIcon::MONO_DARK: - return QIcon(":/Icons/skin/qbittorrent_mono_dark.png"); + return QIcon(":/icons/skin/qbittorrent_mono_dark.png"); case TrayIcon::MONO_LIGHT: - return QIcon(":/Icons/skin/qbittorrent_mono_light.png"); + return QIcon(":/icons/skin/qbittorrent_mono_light.png"); default: break; } @@ -1667,9 +1667,9 @@ QIcon MainWindow::getSystrayIcon() const #endif if (icon.isNull()) { - icon.addFile(":/Icons/skin/qbittorrent22.png", QSize(22, 22)); - icon.addFile(":/Icons/skin/qbittorrent16.png", QSize(16, 16)); - icon.addFile(":/Icons/skin/qbittorrent32.png", QSize(32, 32)); + icon.addFile(":/icons/skin/qbittorrent22.png", QSize(22, 22)); + icon.addFile(":/icons/skin/qbittorrent16.png", QSize(16, 16)); + icon.addFile(":/icons/skin/qbittorrent32.png", QSize(32, 32)); } return icon; } diff --git a/src/mainwindow.h b/src/gui/mainwindow.h similarity index 100% rename from src/mainwindow.h rename to src/gui/mainwindow.h diff --git a/src/mainwindow.ui b/src/gui/mainwindow.ui similarity index 99% rename from src/mainwindow.ui rename to src/gui/mainwindow.ui index 358976a8a..76e98190b 100644 --- a/src/mainwindow.ui +++ b/src/gui/mainwindow.ui @@ -197,7 +197,7 @@ - :/Icons/skin/qbittorrent32.png:/Icons/skin/qbittorrent32.png + :/icons/skin/qbittorrent32.png:/icons/skin/qbittorrent32.png Visit &Website diff --git a/src/messageboxraised.cpp b/src/gui/messageboxraised.cpp similarity index 100% rename from src/messageboxraised.cpp rename to src/gui/messageboxraised.cpp diff --git a/src/messageboxraised.h b/src/gui/messageboxraised.h similarity index 100% rename from src/messageboxraised.h rename to src/gui/messageboxraised.h diff --git a/src/preferences/options.ui b/src/gui/options.ui old mode 100755 new mode 100644 similarity index 99% rename from src/preferences/options.ui rename to src/gui/options.ui index 7247112c4..1b50886af --- a/src/preferences/options.ui +++ b/src/gui/options.ui @@ -1555,7 +1555,7 @@ - :/Icons/slow_off.png + :/icons/slow_off.png @@ -1707,7 +1707,7 @@ - :/Icons/slow.png + :/icons/slow.png false diff --git a/src/preferences/options_imp.cpp b/src/gui/options_imp.cpp old mode 100755 new mode 100644 similarity index 99% rename from src/preferences/options_imp.cpp rename to src/gui/options_imp.cpp index d0db28536..18f394ff4 --- a/src/preferences/options_imp.cpp +++ b/src/gui/options_imp.cpp @@ -275,7 +275,7 @@ void options_imp::initializeLanguageCombo() localeStr.chop(3); // Remove ".qm" QLocale locale(localeStr); QString language_name = languageToLocalizedString(locale); - comboI18n->addItem(/*QIcon(":/Icons/flags/"+country+".png"), */language_name, localeStr); + comboI18n->addItem(/*QIcon(":/icons/flags/"+country+".png"), */language_name, localeStr); qDebug() << "Supported locale:" << localeStr; } } @@ -1327,10 +1327,10 @@ void options_imp::setSslKey(const QByteArray &key, bool interactive) { #ifndef QT_NO_OPENSSL if (!key.isEmpty() && !QSslKey(key, QSsl::Rsa).isNull()) { - lblSslKeyStatus->setPixmap(QPixmap(":/Icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); + lblSslKeyStatus->setPixmap(QPixmap(":/icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); m_sslKey = key; } else { - lblSslKeyStatus->setPixmap(QPixmap(":/Icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); + lblSslKeyStatus->setPixmap(QPixmap(":/icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); m_sslKey.clear(); if (interactive) QMessageBox::warning(this, tr("Invalid key"), tr("This is not a valid SSL key.")); @@ -1342,10 +1342,10 @@ void options_imp::setSslCertificate(const QByteArray &cert, bool interactive) { #ifndef QT_NO_OPENSSL if (!cert.isEmpty() && !QSslCertificate(cert).isNull()) { - lblSslCertStatus->setPixmap(QPixmap(":/Icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); + lblSslCertStatus->setPixmap(QPixmap(":/icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); m_sslCert = cert; } else { - lblSslCertStatus->setPixmap(QPixmap(":/Icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); + lblSslCertStatus->setPixmap(QPixmap(":/icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); m_sslCert.clear(); if (interactive) QMessageBox::warning(this, tr("Invalid certificate"), tr("This is not a valid SSL certificate.")); diff --git a/src/preferences/options_imp.h b/src/gui/options_imp.h old mode 100755 new mode 100644 similarity index 100% rename from src/preferences/options_imp.h rename to src/gui/options_imp.h diff --git a/src/powermanagement/powermanagement.cpp b/src/gui/powermanagement/powermanagement.cpp similarity index 100% rename from src/powermanagement/powermanagement.cpp rename to src/gui/powermanagement/powermanagement.cpp diff --git a/src/powermanagement/powermanagement.h b/src/gui/powermanagement/powermanagement.h similarity index 100% rename from src/powermanagement/powermanagement.h rename to src/gui/powermanagement/powermanagement.h diff --git a/src/powermanagement/powermanagement.pri b/src/gui/powermanagement/powermanagement.pri similarity index 100% rename from src/powermanagement/powermanagement.pri rename to src/gui/powermanagement/powermanagement.pri diff --git a/src/powermanagement/powermanagement_x11.cpp b/src/gui/powermanagement/powermanagement_x11.cpp similarity index 100% rename from src/powermanagement/powermanagement_x11.cpp rename to src/gui/powermanagement/powermanagement_x11.cpp diff --git a/src/powermanagement/powermanagement_x11.h b/src/gui/powermanagement/powermanagement_x11.h similarity index 100% rename from src/powermanagement/powermanagement_x11.h rename to src/gui/powermanagement/powermanagement_x11.h diff --git a/src/preview.ui b/src/gui/preview.ui similarity index 100% rename from src/preview.ui rename to src/gui/preview.ui diff --git a/src/previewlistdelegate.h b/src/gui/previewlistdelegate.h similarity index 100% rename from src/previewlistdelegate.h rename to src/gui/previewlistdelegate.h diff --git a/src/previewselect.cpp b/src/gui/previewselect.cpp similarity index 100% rename from src/previewselect.cpp rename to src/gui/previewselect.cpp diff --git a/src/previewselect.h b/src/gui/previewselect.h similarity index 100% rename from src/previewselect.h rename to src/gui/previewselect.h diff --git a/src/programupdater.cpp b/src/gui/programupdater.cpp similarity index 100% rename from src/programupdater.cpp rename to src/gui/programupdater.cpp diff --git a/src/programupdater.h b/src/gui/programupdater.h similarity index 100% rename from src/programupdater.h rename to src/gui/programupdater.h diff --git a/src/properties/downloadedpiecesbar.cpp b/src/gui/properties/downloadedpiecesbar.cpp similarity index 100% rename from src/properties/downloadedpiecesbar.cpp rename to src/gui/properties/downloadedpiecesbar.cpp diff --git a/src/properties/downloadedpiecesbar.h b/src/gui/properties/downloadedpiecesbar.h similarity index 100% rename from src/properties/downloadedpiecesbar.h rename to src/gui/properties/downloadedpiecesbar.h diff --git a/src/properties/peer.ui b/src/gui/properties/peer.ui similarity index 100% rename from src/properties/peer.ui rename to src/gui/properties/peer.ui diff --git a/src/properties/peeraddition.h b/src/gui/properties/peeraddition.h similarity index 100% rename from src/properties/peeraddition.h rename to src/gui/properties/peeraddition.h diff --git a/src/properties/peerlistdelegate.h b/src/gui/properties/peerlistdelegate.h similarity index 100% rename from src/properties/peerlistdelegate.h rename to src/gui/properties/peerlistdelegate.h diff --git a/src/properties/peerlistsortmodel.h b/src/gui/properties/peerlistsortmodel.h similarity index 100% rename from src/properties/peerlistsortmodel.h rename to src/gui/properties/peerlistsortmodel.h diff --git a/src/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp similarity index 99% rename from src/properties/peerlistwidget.cpp rename to src/gui/properties/peerlistwidget.cpp index a1ad8d5c2..69ebfd355 100644 --- a/src/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -178,8 +178,8 @@ void PeerListWidget::showPeerListMenu(const QPoint&) copyPeerAct = menu.addAction(IconProvider::instance()->getIcon("edit-copy"), tr("Copy selected")); menu.addSeparator(); #if LIBTORRENT_VERSION_NUM < 10000 - dlLimitAct = menu.addAction(QIcon(":/Icons/skin/download.png"), tr("Limit download rate...")); - upLimitAct = menu.addAction(QIcon(":/Icons/skin/seeding.png"), tr("Limit upload rate...")); + dlLimitAct = menu.addAction(QIcon(":/icons/skin/download.png"), tr("Limit download rate...")); + upLimitAct = menu.addAction(QIcon(":/icons/skin/seeding.png"), tr("Limit upload rate...")); menu.addSeparator(); #endif banAct = menu.addAction(IconProvider::instance()->getIcon("user-group-delete"), tr("Ban peer permanently")); diff --git a/src/properties/peerlistwidget.h b/src/gui/properties/peerlistwidget.h similarity index 100% rename from src/properties/peerlistwidget.h rename to src/gui/properties/peerlistwidget.h diff --git a/src/properties/pieceavailabilitybar.cpp b/src/gui/properties/pieceavailabilitybar.cpp similarity index 100% rename from src/properties/pieceavailabilitybar.cpp rename to src/gui/properties/pieceavailabilitybar.cpp diff --git a/src/properties/pieceavailabilitybar.h b/src/gui/properties/pieceavailabilitybar.h similarity index 100% rename from src/properties/pieceavailabilitybar.h rename to src/gui/properties/pieceavailabilitybar.h diff --git a/src/properties/properties.pri b/src/gui/properties/properties.pri similarity index 100% rename from src/properties/properties.pri rename to src/gui/properties/properties.pri diff --git a/src/properties/propertieswidget.cpp b/src/gui/properties/propertieswidget.cpp similarity index 100% rename from src/properties/propertieswidget.cpp rename to src/gui/properties/propertieswidget.cpp diff --git a/src/properties/propertieswidget.h b/src/gui/properties/propertieswidget.h similarity index 100% rename from src/properties/propertieswidget.h rename to src/gui/properties/propertieswidget.h diff --git a/src/properties/propertieswidget.ui b/src/gui/properties/propertieswidget.ui similarity index 100% rename from src/properties/propertieswidget.ui rename to src/gui/properties/propertieswidget.ui diff --git a/src/properties/proplistdelegate.h b/src/gui/properties/proplistdelegate.h similarity index 100% rename from src/properties/proplistdelegate.h rename to src/gui/properties/proplistdelegate.h diff --git a/src/properties/proptabbar.cpp b/src/gui/properties/proptabbar.cpp similarity index 100% rename from src/properties/proptabbar.cpp rename to src/gui/properties/proptabbar.cpp diff --git a/src/properties/proptabbar.h b/src/gui/properties/proptabbar.h similarity index 100% rename from src/properties/proptabbar.h rename to src/gui/properties/proptabbar.h diff --git a/src/properties/trackerlist.cpp b/src/gui/properties/trackerlist.cpp similarity index 100% rename from src/properties/trackerlist.cpp rename to src/gui/properties/trackerlist.cpp diff --git a/src/properties/trackerlist.h b/src/gui/properties/trackerlist.h similarity index 100% rename from src/properties/trackerlist.h rename to src/gui/properties/trackerlist.h diff --git a/src/properties/trackersadditiondlg.h b/src/gui/properties/trackersadditiondlg.h similarity index 100% rename from src/properties/trackersadditiondlg.h rename to src/gui/properties/trackersadditiondlg.h diff --git a/src/properties/trackersadditiondlg.ui b/src/gui/properties/trackersadditiondlg.ui similarity index 100% rename from src/properties/trackersadditiondlg.ui rename to src/gui/properties/trackersadditiondlg.ui diff --git a/src/reverseresolution.h b/src/gui/reverseresolution.h similarity index 100% rename from src/reverseresolution.h rename to src/gui/reverseresolution.h diff --git a/src/rss/automatedrssdownloader.cpp b/src/gui/rss/automatedrssdownloader.cpp similarity index 100% rename from src/rss/automatedrssdownloader.cpp rename to src/gui/rss/automatedrssdownloader.cpp diff --git a/src/rss/automatedrssdownloader.h b/src/gui/rss/automatedrssdownloader.h similarity index 100% rename from src/rss/automatedrssdownloader.h rename to src/gui/rss/automatedrssdownloader.h diff --git a/src/rss/automatedrssdownloader.ui b/src/gui/rss/automatedrssdownloader.ui similarity index 99% rename from src/rss/automatedrssdownloader.ui rename to src/gui/rss/automatedrssdownloader.ui index 4a10460de..41ce6742c 100644 --- a/src/rss/automatedrssdownloader.ui +++ b/src/gui/rss/automatedrssdownloader.ui @@ -331,7 +331,7 @@ - + @@ -395,7 +395,7 @@ - + diff --git a/src/rss/cookiesdlg.cpp b/src/gui/rss/cookiesdlg.cpp similarity index 100% rename from src/rss/cookiesdlg.cpp rename to src/gui/rss/cookiesdlg.cpp diff --git a/src/rss/cookiesdlg.h b/src/gui/rss/cookiesdlg.h similarity index 100% rename from src/rss/cookiesdlg.h rename to src/gui/rss/cookiesdlg.h diff --git a/src/rss/cookiesdlg.ui b/src/gui/rss/cookiesdlg.ui similarity index 100% rename from src/rss/cookiesdlg.ui rename to src/gui/rss/cookiesdlg.ui diff --git a/src/rss/feedlistwidget.cpp b/src/gui/rss/feedlistwidget.cpp similarity index 100% rename from src/rss/feedlistwidget.cpp rename to src/gui/rss/feedlistwidget.cpp diff --git a/src/rss/feedlistwidget.h b/src/gui/rss/feedlistwidget.h similarity index 100% rename from src/rss/feedlistwidget.h rename to src/gui/rss/feedlistwidget.h diff --git a/src/rss/htmlbrowser.cpp b/src/gui/rss/htmlbrowser.cpp similarity index 100% rename from src/rss/htmlbrowser.cpp rename to src/gui/rss/htmlbrowser.cpp diff --git a/src/rss/htmlbrowser.h b/src/gui/rss/htmlbrowser.h similarity index 100% rename from src/rss/htmlbrowser.h rename to src/gui/rss/htmlbrowser.h diff --git a/src/rss/rss.pri b/src/gui/rss/rss.pri similarity index 100% rename from src/rss/rss.pri rename to src/gui/rss/rss.pri diff --git a/src/rss/rss.ui b/src/gui/rss/rss.ui similarity index 100% rename from src/rss/rss.ui rename to src/gui/rss/rss.ui diff --git a/src/rss/rss_imp.cpp b/src/gui/rss/rss_imp.cpp similarity index 98% rename from src/rss/rss_imp.cpp rename to src/gui/rss/rss_imp.cpp index 38d3d5e24..f99a6e52b 100644 --- a/src/rss/rss_imp.cpp +++ b/src/gui/rss/rss_imp.cpp @@ -327,7 +327,7 @@ void RSSImp::saveFoldersOpenState() void RSSImp::refreshAllFeeds() { foreach (QTreeWidgetItem* item, m_feedList->getAllFeedItems()) - item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); m_rssManager->refresh(); } @@ -417,12 +417,12 @@ void RSSImp::refreshSelectedItems() continue; // Update UI if (qSharedPointerDynamicCast(file)) { - item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); } else if (qSharedPointerDynamicCast(file)) { // Update feeds in the folder foreach (QTreeWidgetItem *feed, m_feedList->getAllFeedItems(item)) - feed->setData(0, Qt::DecorationRole, QVariant(QIcon(":/Icons/loading.png"))); + feed->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); } } } @@ -497,11 +497,11 @@ QListWidgetItem* RSSImp::createArticleListItem(const RssArticlePtr& article) item->setData(Article::IdRole, article->guid()); if (article->isRead()) { item->setData(Article::ColorRole, QVariant(QColor("grey"))); - item->setData(Article::IconRole, QVariant(QIcon(":/Icons/sphere.png"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); } else { item->setData(Article::ColorRole, QVariant(QColor("blue"))); - item->setData(Article::IconRole, QVariant(QIcon(":/Icons/sphere2.png"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere2.png"))); } return item; @@ -604,7 +604,7 @@ void RSSImp::refreshTextBrowser() textBrowser->setHtml(html); article->markAsRead(); item->setData(Article::ColorRole, QVariant(QColor("grey"))); - item->setData(Article::IconRole, QVariant(QIcon(":/Icons/sphere.png"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); // Decrement feed nb unread news updateItemInfos(m_feedList->stickyUnreadItem()); updateItemInfos(m_feedList->getTreeItemFromUrl(item->data(Article::FeedUrlRole).toString())); diff --git a/src/rss/rss_imp.h b/src/gui/rss/rss_imp.h similarity index 100% rename from src/rss/rss_imp.h rename to src/gui/rss/rss_imp.h diff --git a/src/rss/rssarticle.cpp b/src/gui/rss/rssarticle.cpp similarity index 100% rename from src/rss/rssarticle.cpp rename to src/gui/rss/rssarticle.cpp diff --git a/src/rss/rssarticle.h b/src/gui/rss/rssarticle.h similarity index 100% rename from src/rss/rssarticle.h rename to src/gui/rss/rssarticle.h diff --git a/src/rss/rssdownloadrule.cpp b/src/gui/rss/rssdownloadrule.cpp similarity index 100% rename from src/rss/rssdownloadrule.cpp rename to src/gui/rss/rssdownloadrule.cpp diff --git a/src/rss/rssdownloadrule.h b/src/gui/rss/rssdownloadrule.h similarity index 100% rename from src/rss/rssdownloadrule.h rename to src/gui/rss/rssdownloadrule.h diff --git a/src/rss/rssdownloadrulelist.cpp b/src/gui/rss/rssdownloadrulelist.cpp similarity index 100% rename from src/rss/rssdownloadrulelist.cpp rename to src/gui/rss/rssdownloadrulelist.cpp diff --git a/src/rss/rssdownloadrulelist.h b/src/gui/rss/rssdownloadrulelist.h similarity index 100% rename from src/rss/rssdownloadrulelist.h rename to src/gui/rss/rssdownloadrulelist.h diff --git a/src/rss/rssfeed.cpp b/src/gui/rss/rssfeed.cpp similarity index 99% rename from src/rss/rssfeed.cpp rename to src/gui/rss/rssfeed.cpp index a33215fe9..63b23e92f 100644 --- a/src/rss/rssfeed.cpp +++ b/src/gui/rss/rssfeed.cpp @@ -52,7 +52,7 @@ RssFeed::RssFeed(RssManager* manager, RssFolder* parent, const QString& url): m_manager(manager), m_parent(parent), m_url (QUrl::fromEncoded(url.toUtf8()).toString()), - m_icon(":/Icons/oxygen/application-rss+xml.png"), + m_icon(":/icons/oxygen/application-rss+xml.png"), m_unreadCount(0), m_dirty(false), m_inErrorState(false), @@ -232,7 +232,7 @@ QString RssFeed::url() const QIcon RssFeed::icon() const { if (m_inErrorState) - return QIcon(":/Icons/oxygen/unavailable.png"); + return QIcon(":/icons/oxygen/unavailable.png"); return QIcon(m_icon); } diff --git a/src/rss/rssfeed.h b/src/gui/rss/rssfeed.h similarity index 100% rename from src/rss/rssfeed.h rename to src/gui/rss/rssfeed.h diff --git a/src/rss/rssfile.cpp b/src/gui/rss/rssfile.cpp similarity index 100% rename from src/rss/rssfile.cpp rename to src/gui/rss/rssfile.cpp diff --git a/src/rss/rssfile.h b/src/gui/rss/rssfile.h similarity index 100% rename from src/rss/rssfile.h rename to src/gui/rss/rssfile.h diff --git a/src/rss/rssfolder.cpp b/src/gui/rss/rssfolder.cpp similarity index 100% rename from src/rss/rssfolder.cpp rename to src/gui/rss/rssfolder.cpp diff --git a/src/rss/rssfolder.h b/src/gui/rss/rssfolder.h similarity index 100% rename from src/rss/rssfolder.h rename to src/gui/rss/rssfolder.h diff --git a/src/rss/rssmanager.cpp b/src/gui/rss/rssmanager.cpp similarity index 100% rename from src/rss/rssmanager.cpp rename to src/gui/rss/rssmanager.cpp diff --git a/src/rss/rssmanager.h b/src/gui/rss/rssmanager.h similarity index 100% rename from src/rss/rssmanager.h rename to src/gui/rss/rssmanager.h diff --git a/src/rss/rssparser.cpp b/src/gui/rss/rssparser.cpp similarity index 100% rename from src/rss/rssparser.cpp rename to src/gui/rss/rssparser.cpp diff --git a/src/rss/rssparser.h b/src/gui/rss/rssparser.h similarity index 100% rename from src/rss/rssparser.h rename to src/gui/rss/rssparser.h diff --git a/src/rss/rsssettingsdlg.cpp b/src/gui/rss/rsssettingsdlg.cpp similarity index 100% rename from src/rss/rsssettingsdlg.cpp rename to src/gui/rss/rsssettingsdlg.cpp diff --git a/src/rss/rsssettingsdlg.h b/src/gui/rss/rsssettingsdlg.h similarity index 100% rename from src/rss/rsssettingsdlg.h rename to src/gui/rss/rsssettingsdlg.h diff --git a/src/rss/rsssettingsdlg.ui b/src/gui/rss/rsssettingsdlg.ui similarity index 98% rename from src/rss/rsssettingsdlg.ui rename to src/gui/rss/rsssettingsdlg.ui index 956685e39..a6e39f45e 100644 --- a/src/rss/rsssettingsdlg.ui +++ b/src/gui/rss/rsssettingsdlg.ui @@ -34,7 +34,7 @@ - :/Icons/oxygen/application-rss+xml.png + :/icons/oxygen/application-rss+xml.png true diff --git a/src/searchengine/engineselect.ui b/src/gui/searchengine/engineselect.ui similarity index 100% rename from src/searchengine/engineselect.ui rename to src/gui/searchengine/engineselect.ui diff --git a/src/searchengine/engineselectdlg.cpp b/src/gui/searchengine/engineselectdlg.cpp similarity index 100% rename from src/searchengine/engineselectdlg.cpp rename to src/gui/searchengine/engineselectdlg.cpp diff --git a/src/searchengine/engineselectdlg.h b/src/gui/searchengine/engineselectdlg.h similarity index 100% rename from src/searchengine/engineselectdlg.h rename to src/gui/searchengine/engineselectdlg.h diff --git a/src/searchengine/nova/__init__.py b/src/gui/searchengine/nova/__init__.py similarity index 100% rename from src/searchengine/nova/__init__.py rename to src/gui/searchengine/nova/__init__.py diff --git a/src/searchengine/nova/engines/__init__.py b/src/gui/searchengine/nova/engines/__init__.py similarity index 100% rename from src/searchengine/nova/engines/__init__.py rename to src/gui/searchengine/nova/engines/__init__.py diff --git a/src/searchengine/nova/engines/btdigg.png b/src/gui/searchengine/nova/engines/btdigg.png similarity index 100% rename from src/searchengine/nova/engines/btdigg.png rename to src/gui/searchengine/nova/engines/btdigg.png diff --git a/src/searchengine/nova/engines/btdigg.py b/src/gui/searchengine/nova/engines/btdigg.py similarity index 100% rename from src/searchengine/nova/engines/btdigg.py rename to src/gui/searchengine/nova/engines/btdigg.py diff --git a/src/searchengine/nova/engines/extratorrent.png b/src/gui/searchengine/nova/engines/extratorrent.png similarity index 100% rename from src/searchengine/nova/engines/extratorrent.png rename to src/gui/searchengine/nova/engines/extratorrent.png diff --git a/src/searchengine/nova/engines/extratorrent.py b/src/gui/searchengine/nova/engines/extratorrent.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova/engines/extratorrent.py rename to src/gui/searchengine/nova/engines/extratorrent.py diff --git a/src/searchengine/nova/engines/kickasstorrents.png b/src/gui/searchengine/nova/engines/kickasstorrents.png similarity index 100% rename from src/searchengine/nova/engines/kickasstorrents.png rename to src/gui/searchengine/nova/engines/kickasstorrents.png diff --git a/src/searchengine/nova/engines/kickasstorrents.py b/src/gui/searchengine/nova/engines/kickasstorrents.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova/engines/kickasstorrents.py rename to src/gui/searchengine/nova/engines/kickasstorrents.py diff --git a/src/searchengine/nova/engines/legittorrents.png b/src/gui/searchengine/nova/engines/legittorrents.png similarity index 100% rename from src/searchengine/nova/engines/legittorrents.png rename to src/gui/searchengine/nova/engines/legittorrents.png diff --git a/src/searchengine/nova/engines/legittorrents.py b/src/gui/searchengine/nova/engines/legittorrents.py similarity index 100% rename from src/searchengine/nova/engines/legittorrents.py rename to src/gui/searchengine/nova/engines/legittorrents.py diff --git a/src/searchengine/nova/engines/mininova.png b/src/gui/searchengine/nova/engines/mininova.png similarity index 100% rename from src/searchengine/nova/engines/mininova.png rename to src/gui/searchengine/nova/engines/mininova.png diff --git a/src/searchengine/nova/engines/mininova.py b/src/gui/searchengine/nova/engines/mininova.py similarity index 100% rename from src/searchengine/nova/engines/mininova.py rename to src/gui/searchengine/nova/engines/mininova.py diff --git a/src/searchengine/nova/engines/piratebay.png b/src/gui/searchengine/nova/engines/piratebay.png similarity index 100% rename from src/searchengine/nova/engines/piratebay.png rename to src/gui/searchengine/nova/engines/piratebay.png diff --git a/src/searchengine/nova/engines/piratebay.py b/src/gui/searchengine/nova/engines/piratebay.py similarity index 100% rename from src/searchengine/nova/engines/piratebay.py rename to src/gui/searchengine/nova/engines/piratebay.py diff --git a/src/searchengine/nova/engines/torrentreactor.png b/src/gui/searchengine/nova/engines/torrentreactor.png similarity index 100% rename from src/searchengine/nova/engines/torrentreactor.png rename to src/gui/searchengine/nova/engines/torrentreactor.png diff --git a/src/searchengine/nova/engines/torrentreactor.py b/src/gui/searchengine/nova/engines/torrentreactor.py similarity index 100% rename from src/searchengine/nova/engines/torrentreactor.py rename to src/gui/searchengine/nova/engines/torrentreactor.py diff --git a/src/searchengine/nova/engines/versions.txt b/src/gui/searchengine/nova/engines/versions.txt similarity index 100% rename from src/searchengine/nova/engines/versions.txt rename to src/gui/searchengine/nova/engines/versions.txt diff --git a/src/searchengine/nova/fix_encoding.py b/src/gui/searchengine/nova/fix_encoding.py similarity index 100% rename from src/searchengine/nova/fix_encoding.py rename to src/gui/searchengine/nova/fix_encoding.py diff --git a/src/searchengine/nova/helpers.py b/src/gui/searchengine/nova/helpers.py similarity index 100% rename from src/searchengine/nova/helpers.py rename to src/gui/searchengine/nova/helpers.py diff --git a/src/searchengine/nova/nova2.py b/src/gui/searchengine/nova/nova2.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova/nova2.py rename to src/gui/searchengine/nova/nova2.py diff --git a/src/searchengine/nova/nova2dl.py b/src/gui/searchengine/nova/nova2dl.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova/nova2dl.py rename to src/gui/searchengine/nova/nova2dl.py diff --git a/src/searchengine/nova/novaprinter.py b/src/gui/searchengine/nova/novaprinter.py similarity index 100% rename from src/searchengine/nova/novaprinter.py rename to src/gui/searchengine/nova/novaprinter.py diff --git a/src/searchengine/nova/socks.py b/src/gui/searchengine/nova/socks.py similarity index 100% rename from src/searchengine/nova/socks.py rename to src/gui/searchengine/nova/socks.py diff --git a/src/searchengine/nova3/__init__.py b/src/gui/searchengine/nova3/__init__.py similarity index 100% rename from src/searchengine/nova3/__init__.py rename to src/gui/searchengine/nova3/__init__.py diff --git a/src/searchengine/nova3/engines/__init__.py b/src/gui/searchengine/nova3/engines/__init__.py similarity index 100% rename from src/searchengine/nova3/engines/__init__.py rename to src/gui/searchengine/nova3/engines/__init__.py diff --git a/src/searchengine/nova3/engines/btdigg.png b/src/gui/searchengine/nova3/engines/btdigg.png similarity index 100% rename from src/searchengine/nova3/engines/btdigg.png rename to src/gui/searchengine/nova3/engines/btdigg.png diff --git a/src/searchengine/nova3/engines/btdigg.py b/src/gui/searchengine/nova3/engines/btdigg.py similarity index 100% rename from src/searchengine/nova3/engines/btdigg.py rename to src/gui/searchengine/nova3/engines/btdigg.py diff --git a/src/searchengine/nova3/engines/extratorrent.png b/src/gui/searchengine/nova3/engines/extratorrent.png similarity index 100% rename from src/searchengine/nova3/engines/extratorrent.png rename to src/gui/searchengine/nova3/engines/extratorrent.png diff --git a/src/searchengine/nova3/engines/extratorrent.py b/src/gui/searchengine/nova3/engines/extratorrent.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova3/engines/extratorrent.py rename to src/gui/searchengine/nova3/engines/extratorrent.py diff --git a/src/searchengine/nova3/engines/kickasstorrents.png b/src/gui/searchengine/nova3/engines/kickasstorrents.png similarity index 100% rename from src/searchengine/nova3/engines/kickasstorrents.png rename to src/gui/searchengine/nova3/engines/kickasstorrents.png diff --git a/src/searchengine/nova3/engines/kickasstorrents.py b/src/gui/searchengine/nova3/engines/kickasstorrents.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova3/engines/kickasstorrents.py rename to src/gui/searchengine/nova3/engines/kickasstorrents.py diff --git a/src/searchengine/nova3/engines/legittorrents.png b/src/gui/searchengine/nova3/engines/legittorrents.png similarity index 100% rename from src/searchengine/nova3/engines/legittorrents.png rename to src/gui/searchengine/nova3/engines/legittorrents.png diff --git a/src/searchengine/nova3/engines/legittorrents.py b/src/gui/searchengine/nova3/engines/legittorrents.py similarity index 100% rename from src/searchengine/nova3/engines/legittorrents.py rename to src/gui/searchengine/nova3/engines/legittorrents.py diff --git a/src/searchengine/nova3/engines/mininova.png b/src/gui/searchengine/nova3/engines/mininova.png similarity index 100% rename from src/searchengine/nova3/engines/mininova.png rename to src/gui/searchengine/nova3/engines/mininova.png diff --git a/src/searchengine/nova3/engines/mininova.py b/src/gui/searchengine/nova3/engines/mininova.py similarity index 100% rename from src/searchengine/nova3/engines/mininova.py rename to src/gui/searchengine/nova3/engines/mininova.py diff --git a/src/searchengine/nova3/engines/piratebay.png b/src/gui/searchengine/nova3/engines/piratebay.png similarity index 100% rename from src/searchengine/nova3/engines/piratebay.png rename to src/gui/searchengine/nova3/engines/piratebay.png diff --git a/src/searchengine/nova3/engines/piratebay.py b/src/gui/searchengine/nova3/engines/piratebay.py similarity index 100% rename from src/searchengine/nova3/engines/piratebay.py rename to src/gui/searchengine/nova3/engines/piratebay.py diff --git a/src/searchengine/nova3/engines/torrentreactor.png b/src/gui/searchengine/nova3/engines/torrentreactor.png similarity index 100% rename from src/searchengine/nova3/engines/torrentreactor.png rename to src/gui/searchengine/nova3/engines/torrentreactor.png diff --git a/src/searchengine/nova3/engines/torrentreactor.py b/src/gui/searchengine/nova3/engines/torrentreactor.py similarity index 100% rename from src/searchengine/nova3/engines/torrentreactor.py rename to src/gui/searchengine/nova3/engines/torrentreactor.py diff --git a/src/searchengine/nova3/engines/versions.txt b/src/gui/searchengine/nova3/engines/versions.txt similarity index 100% rename from src/searchengine/nova3/engines/versions.txt rename to src/gui/searchengine/nova3/engines/versions.txt diff --git a/src/searchengine/nova3/helpers.py b/src/gui/searchengine/nova3/helpers.py similarity index 100% rename from src/searchengine/nova3/helpers.py rename to src/gui/searchengine/nova3/helpers.py diff --git a/src/searchengine/nova3/nova2.py b/src/gui/searchengine/nova3/nova2.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova3/nova2.py rename to src/gui/searchengine/nova3/nova2.py diff --git a/src/searchengine/nova3/nova2dl.py b/src/gui/searchengine/nova3/nova2dl.py old mode 100755 new mode 100644 similarity index 100% rename from src/searchengine/nova3/nova2dl.py rename to src/gui/searchengine/nova3/nova2dl.py diff --git a/src/searchengine/nova3/novaprinter.py b/src/gui/searchengine/nova3/novaprinter.py similarity index 100% rename from src/searchengine/nova3/novaprinter.py rename to src/gui/searchengine/nova3/novaprinter.py diff --git a/src/searchengine/nova3/sgmllib3.py b/src/gui/searchengine/nova3/sgmllib3.py similarity index 100% rename from src/searchengine/nova3/sgmllib3.py rename to src/gui/searchengine/nova3/sgmllib3.py diff --git a/src/searchengine/nova3/socks.py b/src/gui/searchengine/nova3/socks.py similarity index 100% rename from src/searchengine/nova3/socks.py rename to src/gui/searchengine/nova3/socks.py diff --git a/src/searchengine/pluginsource.h b/src/gui/searchengine/pluginsource.h similarity index 100% rename from src/searchengine/pluginsource.h rename to src/gui/searchengine/pluginsource.h diff --git a/src/searchengine/pluginsource.ui b/src/gui/searchengine/pluginsource.ui similarity index 100% rename from src/searchengine/pluginsource.ui rename to src/gui/searchengine/pluginsource.ui diff --git a/src/searchengine/search.qrc b/src/gui/searchengine/search.qrc similarity index 100% rename from src/searchengine/search.qrc rename to src/gui/searchengine/search.qrc diff --git a/src/searchengine/search.ui b/src/gui/searchengine/search.ui similarity index 100% rename from src/searchengine/search.ui rename to src/gui/searchengine/search.ui diff --git a/src/searchengine/searchengine.cpp b/src/gui/searchengine/searchengine.cpp similarity index 100% rename from src/searchengine/searchengine.cpp rename to src/gui/searchengine/searchengine.cpp diff --git a/src/searchengine/searchengine.h b/src/gui/searchengine/searchengine.h similarity index 100% rename from src/searchengine/searchengine.h rename to src/gui/searchengine/searchengine.h diff --git a/src/searchengine/searchengine.pri b/src/gui/searchengine/searchengine.pri similarity index 100% rename from src/searchengine/searchengine.pri rename to src/gui/searchengine/searchengine.pri diff --git a/src/searchengine/searchlistdelegate.h b/src/gui/searchengine/searchlistdelegate.h similarity index 100% rename from src/searchengine/searchlistdelegate.h rename to src/gui/searchengine/searchlistdelegate.h diff --git a/src/searchengine/searchsortmodel.h b/src/gui/searchengine/searchsortmodel.h similarity index 100% rename from src/searchengine/searchsortmodel.h rename to src/gui/searchengine/searchsortmodel.h diff --git a/src/searchengine/searchtab.cpp b/src/gui/searchengine/searchtab.cpp similarity index 100% rename from src/searchengine/searchtab.cpp rename to src/gui/searchengine/searchtab.cpp diff --git a/src/searchengine/searchtab.h b/src/gui/searchengine/searchtab.h similarity index 100% rename from src/searchengine/searchtab.h rename to src/gui/searchengine/searchtab.h diff --git a/src/searchengine/supportedengines.h b/src/gui/searchengine/supportedengines.h similarity index 100% rename from src/searchengine/supportedengines.h rename to src/gui/searchengine/supportedengines.h diff --git a/src/speedlimitdlg.cpp b/src/gui/speedlimitdlg.cpp similarity index 100% rename from src/speedlimitdlg.cpp rename to src/gui/speedlimitdlg.cpp diff --git a/src/speedlimitdlg.h b/src/gui/speedlimitdlg.h similarity index 100% rename from src/speedlimitdlg.h rename to src/gui/speedlimitdlg.h diff --git a/src/statsdialog.cpp b/src/gui/statsdialog.cpp similarity index 100% rename from src/statsdialog.cpp rename to src/gui/statsdialog.cpp diff --git a/src/statsdialog.h b/src/gui/statsdialog.h similarity index 100% rename from src/statsdialog.h rename to src/gui/statsdialog.h diff --git a/src/statsdialog.ui b/src/gui/statsdialog.ui similarity index 100% rename from src/statsdialog.ui rename to src/gui/statsdialog.ui diff --git a/src/statusbar.cpp b/src/gui/statusbar.cpp similarity index 95% rename from src/statusbar.cpp rename to src/gui/statusbar.cpp index 29d2264ad..d775d068a 100644 --- a/src/statusbar.cpp +++ b/src/gui/statusbar.cpp @@ -57,17 +57,17 @@ StatusBar::StatusBar(QStatusBar *bar) connecStatusLblIcon->setFlat(true); connecStatusLblIcon->setFocusPolicy(Qt::NoFocus); connecStatusLblIcon->setCursor(Qt::PointingHandCursor); - connecStatusLblIcon->setIcon(QIcon(":/Icons/skin/firewalled.png")); + connecStatusLblIcon->setIcon(QIcon(":/icons/skin/firewalled.png")); connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); dlSpeedLbl = new QPushButton(bar); - dlSpeedLbl->setIcon(QIcon(":/Icons/skin/download.png")); + dlSpeedLbl->setIcon(QIcon(":/icons/skin/download.png")); connect(dlSpeedLbl, SIGNAL(clicked()), this, SLOT(capDownloadSpeed())); dlSpeedLbl->setFlat(true); dlSpeedLbl->setFocusPolicy(Qt::NoFocus); dlSpeedLbl->setCursor(Qt::PointingHandCursor); upSpeedLbl = new QPushButton(bar); - upSpeedLbl->setIcon(QIcon(":/Icons/skin/seeding.png")); + upSpeedLbl->setIcon(QIcon(":/icons/skin/seeding.png")); connect(upSpeedLbl, SIGNAL(clicked()), this, SLOT(capUploadSpeed())); upSpeedLbl->setFlat(true); upSpeedLbl->setFocusPolicy(Qt::NoFocus); @@ -142,7 +142,7 @@ void StatusBar::showRestartRequired() { // Restart required notification const QString restart_text = tr("qBittorrent needs to be restarted"); QLabel *restartIconLbl = new QLabel(m_bar); - restartIconLbl->setPixmap(QPixmap(":/Icons/oxygen/dialog-warning.png").scaled(QSize(24,24))); + restartIconLbl->setPixmap(QPixmap(":/icons/oxygen/dialog-warning.png").scaled(QSize(24,24))); restartIconLbl->setToolTip(restart_text); m_bar->insertWidget(0,restartIconLbl); QLabel *restartLbl = new QLabel(m_bar); @@ -161,15 +161,15 @@ void StatusBar::refreshStatusBar() { // Update connection status const libtorrent::session_status sessionStatus = QBtSession::instance()->getSessionStatus(); if (!QBtSession::instance()->getSession()->is_listening()) { - connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/disconnected.png"))); + connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/icons/skin/disconnected.png"))); connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections.")); } else { if (sessionStatus.has_incoming_connections) { // Connection OK - connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/connected.png"))); + connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/icons/skin/connected.png"))); connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); }else{ - connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setIcon(QIcon(QString::fromUtf8(":/icons/skin/firewalled.png"))); connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); } } @@ -197,11 +197,11 @@ void StatusBar::refreshStatusBar() { void StatusBar::updateAltSpeedsBtn(bool alternative) { if (alternative) { - altSpeedsBtn->setIcon(QIcon(":/Icons/slow.png")); + altSpeedsBtn->setIcon(QIcon(":/icons/slow.png")); altSpeedsBtn->setToolTip(tr("Click to switch to regular speed limits")); altSpeedsBtn->setDown(true); } else { - altSpeedsBtn->setIcon(QIcon(":/Icons/slow_off.png")); + altSpeedsBtn->setIcon(QIcon(":/icons/slow_off.png")); altSpeedsBtn->setToolTip(tr("Click to switch to alternative speed limits")); altSpeedsBtn->setDown(false); } diff --git a/src/statusbar.h b/src/gui/statusbar.h similarity index 100% rename from src/statusbar.h rename to src/gui/statusbar.h diff --git a/src/torrentcontentfiltermodel.cpp b/src/gui/torrentcontentfiltermodel.cpp similarity index 100% rename from src/torrentcontentfiltermodel.cpp rename to src/gui/torrentcontentfiltermodel.cpp diff --git a/src/torrentcontentfiltermodel.h b/src/gui/torrentcontentfiltermodel.h similarity index 100% rename from src/torrentcontentfiltermodel.h rename to src/gui/torrentcontentfiltermodel.h diff --git a/src/torrentcontentmodel.cpp b/src/gui/torrentcontentmodel.cpp similarity index 100% rename from src/torrentcontentmodel.cpp rename to src/gui/torrentcontentmodel.cpp diff --git a/src/torrentcontentmodel.h b/src/gui/torrentcontentmodel.h similarity index 100% rename from src/torrentcontentmodel.h rename to src/gui/torrentcontentmodel.h diff --git a/src/torrentcontentmodelfile.cpp b/src/gui/torrentcontentmodelfile.cpp similarity index 100% rename from src/torrentcontentmodelfile.cpp rename to src/gui/torrentcontentmodelfile.cpp diff --git a/src/torrentcontentmodelfile.h b/src/gui/torrentcontentmodelfile.h similarity index 100% rename from src/torrentcontentmodelfile.h rename to src/gui/torrentcontentmodelfile.h diff --git a/src/torrentcontentmodelfolder.cpp b/src/gui/torrentcontentmodelfolder.cpp similarity index 100% rename from src/torrentcontentmodelfolder.cpp rename to src/gui/torrentcontentmodelfolder.cpp diff --git a/src/torrentcontentmodelfolder.h b/src/gui/torrentcontentmodelfolder.h similarity index 100% rename from src/torrentcontentmodelfolder.h rename to src/gui/torrentcontentmodelfolder.h diff --git a/src/torrentcontentmodelitem.cpp b/src/gui/torrentcontentmodelitem.cpp similarity index 100% rename from src/torrentcontentmodelitem.cpp rename to src/gui/torrentcontentmodelitem.cpp diff --git a/src/torrentcontentmodelitem.h b/src/gui/torrentcontentmodelitem.h similarity index 100% rename from src/torrentcontentmodelitem.h rename to src/gui/torrentcontentmodelitem.h diff --git a/src/torrentcontenttreeview.cpp b/src/gui/torrentcontenttreeview.cpp similarity index 100% rename from src/torrentcontenttreeview.cpp rename to src/gui/torrentcontenttreeview.cpp diff --git a/src/torrentcontenttreeview.h b/src/gui/torrentcontenttreeview.h similarity index 100% rename from src/torrentcontenttreeview.h rename to src/gui/torrentcontenttreeview.h diff --git a/src/torrentcreator/createtorrent.ui b/src/gui/torrentcreator/createtorrent.ui similarity index 100% rename from src/torrentcreator/createtorrent.ui rename to src/gui/torrentcreator/createtorrent.ui diff --git a/src/torrentcreator/torrentcreator.pri b/src/gui/torrentcreator/torrentcreator.pri similarity index 100% rename from src/torrentcreator/torrentcreator.pri rename to src/gui/torrentcreator/torrentcreator.pri diff --git a/src/torrentcreator/torrentcreatordlg.cpp b/src/gui/torrentcreator/torrentcreatordlg.cpp similarity index 100% rename from src/torrentcreator/torrentcreatordlg.cpp rename to src/gui/torrentcreator/torrentcreatordlg.cpp diff --git a/src/torrentcreator/torrentcreatordlg.h b/src/gui/torrentcreator/torrentcreatordlg.h similarity index 100% rename from src/torrentcreator/torrentcreatordlg.h rename to src/gui/torrentcreator/torrentcreatordlg.h diff --git a/src/torrentcreator/torrentcreatorthread.cpp b/src/gui/torrentcreator/torrentcreatorthread.cpp similarity index 100% rename from src/torrentcreator/torrentcreatorthread.cpp rename to src/gui/torrentcreator/torrentcreatorthread.cpp diff --git a/src/torrentcreator/torrentcreatorthread.h b/src/gui/torrentcreator/torrentcreatorthread.h similarity index 100% rename from src/torrentcreator/torrentcreatorthread.h rename to src/gui/torrentcreator/torrentcreatorthread.h diff --git a/src/torrentfilterenum.h b/src/gui/torrentfilterenum.h similarity index 100% rename from src/torrentfilterenum.h rename to src/gui/torrentfilterenum.h diff --git a/src/torrentimportdlg.cpp b/src/gui/torrentimportdlg.cpp similarity index 100% rename from src/torrentimportdlg.cpp rename to src/gui/torrentimportdlg.cpp diff --git a/src/torrentimportdlg.h b/src/gui/torrentimportdlg.h similarity index 100% rename from src/torrentimportdlg.h rename to src/gui/torrentimportdlg.h diff --git a/src/torrentimportdlg.ui b/src/gui/torrentimportdlg.ui similarity index 100% rename from src/torrentimportdlg.ui rename to src/gui/torrentimportdlg.ui diff --git a/src/trackerlogin.cpp b/src/gui/trackerlogin.cpp similarity index 97% rename from src/trackerlogin.cpp rename to src/gui/trackerlogin.cpp index d0ab212b7..fabcc9572 100644 --- a/src/trackerlogin.cpp +++ b/src/gui/trackerlogin.cpp @@ -36,7 +36,7 @@ trackerLogin::trackerLogin(QWidget *parent, QTorrentHandle h) { setupUi(this); setAttribute(Qt::WA_DeleteOnClose); - login_logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/oxygen/encrypted.png"))); + login_logo->setPixmap(QPixmap(QString::fromUtf8(":/icons/oxygen/encrypted.png"))); tracker_url->setText(h.current_tracker()); connect(this, SIGNAL(trackerLoginCancelled(QPair)), parent, SLOT(addUnauthenticatedTracker(QPair))); show(); diff --git a/src/trackerlogin.h b/src/gui/trackerlogin.h similarity index 100% rename from src/trackerlogin.h rename to src/gui/trackerlogin.h diff --git a/src/transferlistdelegate.cpp b/src/gui/transferlistdelegate.cpp similarity index 99% rename from src/transferlistdelegate.cpp rename to src/gui/transferlistdelegate.cpp index a4d306aec..2098fd054 100644 --- a/src/transferlistdelegate.cpp +++ b/src/gui/transferlistdelegate.cpp @@ -236,7 +236,7 @@ QSize TransferListDelegate::sizeHint(const QStyleOptionViewItem & option, const static int icon_height = -1; if (icon_height == -1) { - QIcon icon(":/Icons/skin/downloading.png"); + QIcon icon(":/icons/skin/downloading.png"); QList ic_sizes(icon.availableSizes()); icon_height = ic_sizes[0].height(); } diff --git a/src/transferlistdelegate.h b/src/gui/transferlistdelegate.h similarity index 100% rename from src/transferlistdelegate.h rename to src/gui/transferlistdelegate.h diff --git a/src/transferlistfilterswidget.cpp b/src/gui/transferlistfilterswidget.cpp similarity index 97% rename from src/transferlistfilterswidget.cpp rename to src/gui/transferlistfilterswidget.cpp index b6b84cb01..fa0ba662f 100644 --- a/src/transferlistfilterswidget.cpp +++ b/src/gui/transferlistfilterswidget.cpp @@ -184,25 +184,25 @@ TransferListFiltersWidget::TransferListFiltersWidget(QWidget *parent, TransferLi // Add status filters QListWidgetItem *all = new QListWidgetItem(statusFilters); all->setData(Qt::DisplayRole, QVariant(tr("All") + " (0)")); - all->setData(Qt::DecorationRole, QIcon(":/Icons/skin/filterall.png")); + all->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterall.png")); QListWidgetItem *downloading = new QListWidgetItem(statusFilters); downloading->setData(Qt::DisplayRole, QVariant(tr("Downloading") + " (0)")); - downloading->setData(Qt::DecorationRole, QIcon(":/Icons/skin/downloading.png")); + downloading->setData(Qt::DecorationRole, QIcon(":/icons/skin/downloading.png")); QListWidgetItem *completed = new QListWidgetItem(statusFilters); completed->setData(Qt::DisplayRole, QVariant(tr("Completed") + " (0)")); - completed->setData(Qt::DecorationRole, QIcon(":/Icons/skin/uploading.png")); + completed->setData(Qt::DecorationRole, QIcon(":/icons/skin/uploading.png")); QListWidgetItem *paused = new QListWidgetItem(statusFilters); paused->setData(Qt::DisplayRole, QVariant(tr("Paused") + " (0)")); - paused->setData(Qt::DecorationRole, QIcon(":/Icons/skin/paused.png")); + paused->setData(Qt::DecorationRole, QIcon(":/icons/skin/paused.png")); QListWidgetItem *resumed = new QListWidgetItem(statusFilters); resumed->setData(Qt::DisplayRole, QVariant(tr("Resumed") + " (0)")); - resumed->setData(Qt::DecorationRole, QIcon(":/Icons/skin/resumed.png")); + resumed->setData(Qt::DecorationRole, QIcon(":/icons/skin/resumed.png")); QListWidgetItem *active = new QListWidgetItem(statusFilters); active->setData(Qt::DisplayRole, QVariant(tr("Active") + " (0)")); - active->setData(Qt::DecorationRole, QIcon(":/Icons/skin/filteractive.png")); + active->setData(Qt::DecorationRole, QIcon(":/icons/skin/filteractive.png")); QListWidgetItem *inactive = new QListWidgetItem(statusFilters); inactive->setData(Qt::DisplayRole, QVariant(tr("Inactive") + " (0)")); - inactive->setData(Qt::DecorationRole, QIcon(":/Icons/skin/filterinactive.png")); + inactive->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterinactive.png")); // SIGNAL/SLOT connect(statusFilters, SIGNAL(currentRowChanged(int)), transferList, SLOT(applyStatusFilter(int))); diff --git a/src/transferlistfilterswidget.h b/src/gui/transferlistfilterswidget.h similarity index 100% rename from src/transferlistfilterswidget.h rename to src/gui/transferlistfilterswidget.h diff --git a/src/transferlistsortmodel.cpp b/src/gui/transferlistsortmodel.cpp similarity index 100% rename from src/transferlistsortmodel.cpp rename to src/gui/transferlistsortmodel.cpp diff --git a/src/transferlistsortmodel.h b/src/gui/transferlistsortmodel.h similarity index 100% rename from src/transferlistsortmodel.h rename to src/gui/transferlistsortmodel.h diff --git a/src/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp similarity index 99% rename from src/transferlistwidget.cpp rename to src/gui/transferlistwidget.cpp index f1df423fc..4fd03ee6a 100644 --- a/src/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -719,11 +719,11 @@ void TransferListWidget::displayListMenu(const QPoint&) connect(&actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelectedTorrents())); QAction actionPreview_file(IconProvider::instance()->getIcon("view-preview"), tr("Preview file..."), 0); connect(&actionPreview_file, SIGNAL(triggered()), this, SLOT(previewSelectedTorrents())); - QAction actionSet_max_ratio(QIcon(QString::fromUtf8(":/Icons/skin/ratio.png")), tr("Limit share ratio..."), 0); + QAction actionSet_max_ratio(QIcon(QString::fromUtf8(":/icons/skin/ratio.png")), tr("Limit share ratio..."), 0); connect(&actionSet_max_ratio, SIGNAL(triggered()), this, SLOT(setMaxRatioSelectedTorrents())); - QAction actionSet_upload_limit(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")), tr("Limit upload rate..."), 0); + QAction actionSet_upload_limit(QIcon(QString::fromUtf8(":/icons/skin/seeding.png")), tr("Limit upload rate..."), 0); connect(&actionSet_upload_limit, SIGNAL(triggered()), this, SLOT(setUpLimitSelectedTorrents())); - QAction actionSet_download_limit(QIcon(QString::fromUtf8(":/Icons/skin/download.png")), tr("Limit download rate..."), 0); + QAction actionSet_download_limit(QIcon(QString::fromUtf8(":/icons/skin/download.png")), tr("Limit download rate..."), 0); connect(&actionSet_download_limit, SIGNAL(triggered()), this, SLOT(setDlLimitSelectedTorrents())); QAction actionOpen_destination_folder(IconProvider::instance()->getIcon("inode-directory"), tr("Open destination folder"), 0); connect(&actionOpen_destination_folder, SIGNAL(triggered()), this, SLOT(openSelectedTorrentsFolder())); @@ -739,7 +739,7 @@ void TransferListWidget::displayListMenu(const QPoint&) connect(&actionSetTorrentPath, SIGNAL(triggered()), this, SLOT(setSelectedTorrentsLocation())); QAction actionForce_recheck(IconProvider::instance()->getIcon("document-edit-verify"), tr("Force recheck"), 0); connect(&actionForce_recheck, SIGNAL(triggered()), this, SLOT(recheckSelectedTorrents())); - QAction actionCopy_magnet_link(QIcon(":/Icons/magnet.png"), tr("Copy magnet link"), 0); + QAction actionCopy_magnet_link(QIcon(":/icons/magnet.png"), tr("Copy magnet link"), 0); connect(&actionCopy_magnet_link, SIGNAL(triggered()), this, SLOT(copySelectedMagnetURIs())); QAction actionSuper_seeding_mode(tr("Super seeding mode"), 0); actionSuper_seeding_mode.setCheckable(true); diff --git a/src/transferlistwidget.h b/src/gui/transferlistwidget.h similarity index 100% rename from src/transferlistwidget.h rename to src/gui/transferlistwidget.h diff --git a/src/updownratiodlg.cpp b/src/gui/updownratiodlg.cpp similarity index 100% rename from src/updownratiodlg.cpp rename to src/gui/updownratiodlg.cpp diff --git a/src/updownratiodlg.h b/src/gui/updownratiodlg.h similarity index 100% rename from src/updownratiodlg.h rename to src/gui/updownratiodlg.h diff --git a/src/updownratiodlg.ui b/src/gui/updownratiodlg.ui similarity index 100% rename from src/updownratiodlg.ui rename to src/gui/updownratiodlg.ui diff --git a/src/icons.qrc b/src/icons.qrc index 8628ef1f4..5548f8a0f 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -1,371 +1,371 @@ - Icons/qbittorrent.png - Icons/3-state-checkbox.gif - Icons/L.gif - Icons/loading.png - Icons/magnet.png - Icons/slow.png - Icons/slow_off.png - Icons/sphere.png - Icons/sphere2.png - Icons/url.png - Icons/flags/ad.png - Icons/flags/ae.png - Icons/flags/af.png - Icons/flags/ag.png - Icons/flags/ai.png - Icons/flags/al.png - Icons/flags/am.png - Icons/flags/an.png - Icons/flags/ao.png - Icons/flags/ar.png - Icons/flags/as.png - Icons/flags/at.png - Icons/flags/au.png - Icons/flags/aw.png - Icons/flags/ax.png - Icons/flags/az.png - Icons/flags/ba.png - Icons/flags/bb.png - Icons/flags/bd.png - Icons/flags/be.png - Icons/flags/bf.png - Icons/flags/bg.png - Icons/flags/bh.png - Icons/flags/bi.png - Icons/flags/bj.png - Icons/flags/bm.png - Icons/flags/bn.png - Icons/flags/bo.png - Icons/flags/br.png - Icons/flags/bs.png - Icons/flags/bt.png - Icons/flags/bv.png - Icons/flags/bw.png - Icons/flags/by.png - Icons/flags/bz.png - Icons/flags/ca.png - Icons/flags/cc.png - Icons/flags/cd.png - Icons/flags/cf.png - Icons/flags/cg.png - Icons/flags/ch.png - Icons/flags/ci.png - Icons/flags/ck.png - Icons/flags/cl.png - Icons/flags/cm.png - Icons/flags/cn.png - Icons/flags/co.png - Icons/flags/cr.png - Icons/flags/cs.png - Icons/flags/cu.png - Icons/flags/cv.png - Icons/flags/cx.png - Icons/flags/cy.png - Icons/flags/cz.png - Icons/flags/de.png - Icons/flags/dj.png - Icons/flags/dk.png - Icons/flags/dm.png - Icons/flags/do.png - Icons/flags/dz.png - Icons/flags/ec.png - Icons/flags/ee.png - Icons/flags/eg.png - Icons/flags/eh.png - Icons/flags/er.png - Icons/flags/es.png - Icons/flags/et.png - Icons/flags/fi.png - Icons/flags/fj.png - Icons/flags/fk.png - Icons/flags/fm.png - Icons/flags/fo.png - Icons/flags/fr.png - Icons/flags/ga.png - Icons/flags/gb.png - Icons/flags/gd.png - Icons/flags/ge.png - Icons/flags/gf.png - Icons/flags/gh.png - Icons/flags/gi.png - Icons/flags/gl.png - Icons/flags/gm.png - Icons/flags/gn.png - Icons/flags/gp.png - Icons/flags/gq.png - Icons/flags/gr.png - Icons/flags/gs.png - Icons/flags/gt.png - Icons/flags/gu.png - Icons/flags/gw.png - Icons/flags/gy.png - Icons/flags/hk.png - Icons/flags/hm.png - Icons/flags/hn.png - Icons/flags/hr.png - Icons/flags/ht.png - Icons/flags/hu.png - Icons/flags/id.png - Icons/flags/ie.png - Icons/flags/il.png - Icons/flags/in.png - Icons/flags/io.png - Icons/flags/iq.png - Icons/flags/ir.png - Icons/flags/is.png - Icons/flags/it.png - Icons/flags/jm.png - Icons/flags/jo.png - Icons/flags/jp.png - Icons/flags/ke.png - Icons/flags/kg.png - Icons/flags/kh.png - Icons/flags/ki.png - Icons/flags/km.png - Icons/flags/kn.png - Icons/flags/kp.png - Icons/flags/kr.png - Icons/flags/kw.png - Icons/flags/ky.png - Icons/flags/kz.png - Icons/flags/la.png - Icons/flags/lb.png - Icons/flags/lc.png - Icons/flags/li.png - Icons/flags/lk.png - Icons/flags/lr.png - Icons/flags/ls.png - Icons/flags/lt.png - Icons/flags/lu.png - Icons/flags/lv.png - Icons/flags/ly.png - Icons/flags/ma.png - Icons/flags/mc.png - Icons/flags/md.png - Icons/flags/me.png - Icons/flags/mg.png - Icons/flags/mh.png - Icons/flags/mk.png - Icons/flags/ml.png - Icons/flags/mm.png - Icons/flags/mn.png - Icons/flags/mo.png - Icons/flags/mp.png - Icons/flags/mq.png - Icons/flags/mr.png - Icons/flags/ms.png - Icons/flags/mt.png - Icons/flags/mu.png - Icons/flags/mv.png - Icons/flags/mw.png - Icons/flags/mx.png - Icons/flags/my.png - Icons/flags/mz.png - Icons/flags/na.png - Icons/flags/nc.png - Icons/flags/ne.png - Icons/flags/nf.png - Icons/flags/ng.png - Icons/flags/ni.png - Icons/flags/nl.png - Icons/flags/no.png - Icons/flags/np.png - Icons/flags/nr.png - Icons/flags/nu.png - Icons/flags/nz.png - Icons/flags/om.png - Icons/flags/pa.png - Icons/flags/pe.png - Icons/flags/pf.png - Icons/flags/pg.png - Icons/flags/ph.png - Icons/flags/pk.png - Icons/flags/pl.png - Icons/flags/pm.png - Icons/flags/pn.png - Icons/flags/pr.png - Icons/flags/ps.png - Icons/flags/pt.png - Icons/flags/pw.png - Icons/flags/py.png - Icons/flags/qa.png - Icons/flags/re.png - Icons/flags/ro.png - Icons/flags/rs.png - Icons/flags/ru.png - Icons/flags/rw.png - Icons/flags/sa.png - Icons/flags/sb.png - Icons/flags/sc.png - Icons/flags/sd.png - Icons/flags/se.png - Icons/flags/sg.png - Icons/flags/sh.png - Icons/flags/si.png - Icons/flags/sj.png - Icons/flags/sk.png - Icons/flags/sl.png - Icons/flags/sm.png - Icons/flags/sn.png - Icons/flags/so.png - Icons/flags/sr.png - Icons/flags/st.png - Icons/flags/sv.png - Icons/flags/sy.png - Icons/flags/sz.png - Icons/flags/tc.png - Icons/flags/td.png - Icons/flags/tf.png - Icons/flags/tg.png - Icons/flags/th.png - Icons/flags/tj.png - Icons/flags/tk.png - Icons/flags/tl.png - Icons/flags/tm.png - Icons/flags/tn.png - Icons/flags/to.png - Icons/flags/tr.png - Icons/flags/tt.png - Icons/flags/tv.png - Icons/flags/tw.png - Icons/flags/tz.png - Icons/flags/ua.png - Icons/flags/ug.png - Icons/flags/um.png - Icons/flags/us.png - Icons/flags/uy.png - Icons/flags/uz.png - Icons/flags/va.png - Icons/flags/vc.png - Icons/flags/ve.png - Icons/flags/vg.png - Icons/flags/vi.png - Icons/flags/vn.png - Icons/flags/vu.png - Icons/flags/wf.png - Icons/flags/ws.png - Icons/flags/ye.png - Icons/flags/yt.png - Icons/flags/za.png - Icons/flags/zm.png - Icons/flags/zw.png - Icons/oxygen/application-exit.png - Icons/oxygen/application-rss+xml.png - Icons/oxygen/application-x-mswinurl.png - Icons/oxygen/chronometer.png - Icons/oxygen/dialog-cancel.png - Icons/oxygen/dialog-information.png - Icons/oxygen/dialog-warning.png - Icons/oxygen/document-edit-verify.png - Icons/oxygen/document-edit.png - Icons/oxygen/document-encrypt.png - Icons/oxygen/document-import.png - Icons/oxygen/document-new.png - Icons/oxygen/document-properties.png - Icons/oxygen/document-save.png - Icons/oxygen/download.png - Icons/oxygen/edit-clear-history.png - Icons/oxygen/edit-clear.png - Icons/oxygen/edit-copy.png - Icons/oxygen/edit-cut.png - Icons/oxygen/edit-delete.png - Icons/oxygen/edit-find-user.png - Icons/oxygen/edit-find.png - Icons/oxygen/edit-paste.png - Icons/oxygen/edit-rename.png - Icons/oxygen/folder-documents.png - Icons/oxygen/folder-new.png - Icons/oxygen/folder-remote.png - Icons/oxygen/gear.png - Icons/oxygen/gear32.png - Icons/oxygen/go-down.png - Icons/oxygen/go-up.png - Icons/oxygen/help-about.png - Icons/oxygen/help-contents.png - Icons/oxygen/inode-directory.png - Icons/oxygen/insert-link.png - Icons/oxygen/list-add.png - Icons/oxygen/list-remove.png - Icons/oxygen/mail-folder-inbox.png - Icons/oxygen/mail-mark-read.png - Icons/oxygen/media-playback-pause.png - Icons/oxygen/media-playback-start.png - Icons/oxygen/network-server.png - Icons/oxygen/network-wired.png - Icons/oxygen/object-locked.png - Icons/oxygen/preferences-desktop.png - Icons/oxygen/preferences-other.png - Icons/oxygen/preferences-system-network.png - Icons/oxygen/preferences-system.png - Icons/oxygen/preferences-web-browser-cookies.png - Icons/oxygen/security-high.png - Icons/oxygen/security-low.png - Icons/oxygen/services.png - Icons/oxygen/tab-close.png - Icons/oxygen/task-attention.png - Icons/oxygen/text-plain.png - Icons/oxygen/tools-report-bug.png - Icons/oxygen/unavailable.png - Icons/oxygen/user-group-delete.png - Icons/oxygen/user-group-new.png - Icons/oxygen/view-calendar-journal.png - Icons/oxygen/view-categories.png - Icons/oxygen/view-filter.png - Icons/oxygen/view-preview.png - Icons/oxygen/view-refresh.png - Icons/oxygen/view-statistics.png - Icons/oxygen/wallet-open.png - Icons/oxygen/webui.png - Icons/skin/arrow-right.gif - Icons/skin/bg-dropdown.gif - Icons/skin/bg-handle-horizontal.gif - Icons/skin/bg-header.gif - Icons/skin/bg-panel-header.gif - Icons/skin/checking.png - Icons/skin/collapse-expand.gif - Icons/skin/connected.png - Icons/skin/disconnected.png - Icons/skin/dock-tabs.gif - Icons/skin/download.png - Icons/skin/downloading.png - Icons/skin/error.png - Icons/skin/filteractive.png - Icons/skin/filterall.png - Icons/skin/filterinactive.png - Icons/skin/firewalled.png - Icons/skin/handle-icon-horizontal.gif - Icons/skin/handle-icon.gif - Icons/skin/knob.gif - Icons/skin/logo-blank.gif - Icons/skin/logo.gif - Icons/skin/logo2.gif - Icons/skin/mascot.png - Icons/skin/paused.png - Icons/skin/qbittorrent16.png - Icons/skin/qbittorrent22.png - Icons/skin/qbittorrent32.png - Icons/skin/qbittorrent_mono_dark.png - Icons/skin/qbittorrent_mono_light.png - Icons/skin/queued.png - Icons/skin/ratio.png - Icons/skin/seeding.png - Icons/skin/slider-area.gif - Icons/skin/spacer.gif - Icons/skin/spinner-placeholder.gif - Icons/skin/spinner.gif - Icons/skin/splash.png - Icons/skin/stalledDL.png - Icons/skin/stalledUP.png - Icons/skin/tabs.gif - Icons/skin/toolbox-divider.gif - Icons/skin/toolbox-divider2.gif - Icons/skin/resumed.png - Icons/skin/uploading.png - Icons/oxygen/system-log-out.png - Icons/oxygen/go-bottom.png - Icons/oxygen/go-top.png - Icons/oxygen/checked.png + icons/qbittorrent.png + icons/3-state-checkbox.gif + icons/L.gif + icons/loading.png + icons/magnet.png + icons/slow.png + icons/slow_off.png + icons/sphere.png + icons/sphere2.png + icons/url.png + icons/flags/ad.png + icons/flags/ae.png + icons/flags/af.png + icons/flags/ag.png + icons/flags/ai.png + icons/flags/al.png + icons/flags/am.png + icons/flags/an.png + icons/flags/ao.png + icons/flags/ar.png + icons/flags/as.png + icons/flags/at.png + icons/flags/au.png + icons/flags/aw.png + icons/flags/ax.png + icons/flags/az.png + icons/flags/ba.png + icons/flags/bb.png + icons/flags/bd.png + icons/flags/be.png + icons/flags/bf.png + icons/flags/bg.png + icons/flags/bh.png + icons/flags/bi.png + icons/flags/bj.png + icons/flags/bm.png + icons/flags/bn.png + icons/flags/bo.png + icons/flags/br.png + icons/flags/bs.png + icons/flags/bt.png + icons/flags/bv.png + icons/flags/bw.png + icons/flags/by.png + icons/flags/bz.png + icons/flags/ca.png + icons/flags/cc.png + icons/flags/cd.png + icons/flags/cf.png + icons/flags/cg.png + icons/flags/ch.png + icons/flags/ci.png + icons/flags/ck.png + icons/flags/cl.png + icons/flags/cm.png + icons/flags/cn.png + icons/flags/co.png + icons/flags/cr.png + icons/flags/cs.png + icons/flags/cu.png + icons/flags/cv.png + icons/flags/cx.png + icons/flags/cy.png + icons/flags/cz.png + icons/flags/de.png + icons/flags/dj.png + icons/flags/dk.png + icons/flags/dm.png + icons/flags/do.png + icons/flags/dz.png + icons/flags/ec.png + icons/flags/ee.png + icons/flags/eg.png + icons/flags/eh.png + icons/flags/er.png + icons/flags/es.png + icons/flags/et.png + icons/flags/fi.png + icons/flags/fj.png + icons/flags/fk.png + icons/flags/fm.png + icons/flags/fo.png + icons/flags/fr.png + icons/flags/ga.png + icons/flags/gb.png + icons/flags/gd.png + icons/flags/ge.png + icons/flags/gf.png + icons/flags/gh.png + icons/flags/gi.png + icons/flags/gl.png + icons/flags/gm.png + icons/flags/gn.png + icons/flags/gp.png + icons/flags/gq.png + icons/flags/gr.png + icons/flags/gs.png + icons/flags/gt.png + icons/flags/gu.png + icons/flags/gw.png + icons/flags/gy.png + icons/flags/hk.png + icons/flags/hm.png + icons/flags/hn.png + icons/flags/hr.png + icons/flags/ht.png + icons/flags/hu.png + icons/flags/id.png + icons/flags/ie.png + icons/flags/il.png + icons/flags/in.png + icons/flags/io.png + icons/flags/iq.png + icons/flags/ir.png + icons/flags/is.png + icons/flags/it.png + icons/flags/jm.png + icons/flags/jo.png + icons/flags/jp.png + icons/flags/ke.png + icons/flags/kg.png + icons/flags/kh.png + icons/flags/ki.png + icons/flags/km.png + icons/flags/kn.png + icons/flags/kp.png + icons/flags/kr.png + icons/flags/kw.png + icons/flags/ky.png + icons/flags/kz.png + icons/flags/la.png + icons/flags/lb.png + icons/flags/lc.png + icons/flags/li.png + icons/flags/lk.png + icons/flags/lr.png + icons/flags/ls.png + icons/flags/lt.png + icons/flags/lu.png + icons/flags/lv.png + icons/flags/ly.png + icons/flags/ma.png + icons/flags/mc.png + icons/flags/md.png + icons/flags/me.png + icons/flags/mg.png + icons/flags/mh.png + icons/flags/mk.png + icons/flags/ml.png + icons/flags/mm.png + icons/flags/mn.png + icons/flags/mo.png + icons/flags/mp.png + icons/flags/mq.png + icons/flags/mr.png + icons/flags/ms.png + icons/flags/mt.png + icons/flags/mu.png + icons/flags/mv.png + icons/flags/mw.png + icons/flags/mx.png + icons/flags/my.png + icons/flags/mz.png + icons/flags/na.png + icons/flags/nc.png + icons/flags/ne.png + icons/flags/nf.png + icons/flags/ng.png + icons/flags/ni.png + icons/flags/nl.png + icons/flags/no.png + icons/flags/np.png + icons/flags/nr.png + icons/flags/nu.png + icons/flags/nz.png + icons/flags/om.png + icons/flags/pa.png + icons/flags/pe.png + icons/flags/pf.png + icons/flags/pg.png + icons/flags/ph.png + icons/flags/pk.png + icons/flags/pl.png + icons/flags/pm.png + icons/flags/pn.png + icons/flags/pr.png + icons/flags/ps.png + icons/flags/pt.png + icons/flags/pw.png + icons/flags/py.png + icons/flags/qa.png + icons/flags/re.png + icons/flags/ro.png + icons/flags/rs.png + icons/flags/ru.png + icons/flags/rw.png + icons/flags/sa.png + icons/flags/sb.png + icons/flags/sc.png + icons/flags/sd.png + icons/flags/se.png + icons/flags/sg.png + icons/flags/sh.png + icons/flags/si.png + icons/flags/sj.png + icons/flags/sk.png + icons/flags/sl.png + icons/flags/sm.png + icons/flags/sn.png + icons/flags/so.png + icons/flags/sr.png + icons/flags/st.png + icons/flags/sv.png + icons/flags/sy.png + icons/flags/sz.png + icons/flags/tc.png + icons/flags/td.png + icons/flags/tf.png + icons/flags/tg.png + icons/flags/th.png + icons/flags/tj.png + icons/flags/tk.png + icons/flags/tl.png + icons/flags/tm.png + icons/flags/tn.png + icons/flags/to.png + icons/flags/tr.png + icons/flags/tt.png + icons/flags/tv.png + icons/flags/tw.png + icons/flags/tz.png + icons/flags/ua.png + icons/flags/ug.png + icons/flags/um.png + icons/flags/us.png + icons/flags/uy.png + icons/flags/uz.png + icons/flags/va.png + icons/flags/vc.png + icons/flags/ve.png + icons/flags/vg.png + icons/flags/vi.png + icons/flags/vn.png + icons/flags/vu.png + icons/flags/wf.png + icons/flags/ws.png + icons/flags/ye.png + icons/flags/yt.png + icons/flags/za.png + icons/flags/zm.png + icons/flags/zw.png + icons/oxygen/application-exit.png + icons/oxygen/application-rss+xml.png + icons/oxygen/application-x-mswinurl.png + icons/oxygen/chronometer.png + icons/oxygen/dialog-cancel.png + icons/oxygen/dialog-information.png + icons/oxygen/dialog-warning.png + icons/oxygen/document-edit-verify.png + icons/oxygen/document-edit.png + icons/oxygen/document-encrypt.png + icons/oxygen/document-import.png + icons/oxygen/document-new.png + icons/oxygen/document-properties.png + icons/oxygen/document-save.png + icons/oxygen/download.png + icons/oxygen/edit-clear-history.png + icons/oxygen/edit-clear.png + icons/oxygen/edit-copy.png + icons/oxygen/edit-cut.png + icons/oxygen/edit-delete.png + icons/oxygen/edit-find-user.png + icons/oxygen/edit-find.png + icons/oxygen/edit-paste.png + icons/oxygen/edit-rename.png + icons/oxygen/folder-documents.png + icons/oxygen/folder-new.png + icons/oxygen/folder-remote.png + icons/oxygen/gear.png + icons/oxygen/gear32.png + icons/oxygen/go-down.png + icons/oxygen/go-up.png + icons/oxygen/help-about.png + icons/oxygen/help-contents.png + icons/oxygen/inode-directory.png + icons/oxygen/insert-link.png + icons/oxygen/list-add.png + icons/oxygen/list-remove.png + icons/oxygen/mail-folder-inbox.png + icons/oxygen/mail-mark-read.png + icons/oxygen/media-playback-pause.png + icons/oxygen/media-playback-start.png + icons/oxygen/network-server.png + icons/oxygen/network-wired.png + icons/oxygen/object-locked.png + icons/oxygen/preferences-desktop.png + icons/oxygen/preferences-other.png + icons/oxygen/preferences-system-network.png + icons/oxygen/preferences-system.png + icons/oxygen/preferences-web-browser-cookies.png + icons/oxygen/security-high.png + icons/oxygen/security-low.png + icons/oxygen/services.png + icons/oxygen/tab-close.png + icons/oxygen/task-attention.png + icons/oxygen/text-plain.png + icons/oxygen/tools-report-bug.png + icons/oxygen/unavailable.png + icons/oxygen/user-group-delete.png + icons/oxygen/user-group-new.png + icons/oxygen/view-calendar-journal.png + icons/oxygen/view-categories.png + icons/oxygen/view-filter.png + icons/oxygen/view-preview.png + icons/oxygen/view-refresh.png + icons/oxygen/view-statistics.png + icons/oxygen/wallet-open.png + icons/oxygen/webui.png + icons/skin/arrow-right.gif + icons/skin/bg-dropdown.gif + icons/skin/bg-handle-horizontal.gif + icons/skin/bg-header.gif + icons/skin/bg-panel-header.gif + icons/skin/checking.png + icons/skin/collapse-expand.gif + icons/skin/connected.png + icons/skin/disconnected.png + icons/skin/dock-tabs.gif + icons/skin/download.png + icons/skin/downloading.png + icons/skin/error.png + icons/skin/filteractive.png + icons/skin/filterall.png + icons/skin/filterinactive.png + icons/skin/firewalled.png + icons/skin/handle-icon-horizontal.gif + icons/skin/handle-icon.gif + icons/skin/knob.gif + icons/skin/logo-blank.gif + icons/skin/logo.gif + icons/skin/logo2.gif + icons/skin/mascot.png + icons/skin/paused.png + icons/skin/qbittorrent16.png + icons/skin/qbittorrent22.png + icons/skin/qbittorrent32.png + icons/skin/qbittorrent_mono_dark.png + icons/skin/qbittorrent_mono_light.png + icons/skin/queued.png + icons/skin/ratio.png + icons/skin/seeding.png + icons/skin/slider-area.gif + icons/skin/spacer.gif + icons/skin/spinner-placeholder.gif + icons/skin/spinner.gif + icons/skin/splash.png + icons/skin/stalledDL.png + icons/skin/stalledUP.png + icons/skin/tabs.gif + icons/skin/toolbox-divider.gif + icons/skin/toolbox-divider2.gif + icons/skin/resumed.png + icons/skin/uploading.png + icons/oxygen/system-log-out.png + icons/oxygen/go-bottom.png + icons/oxygen/go-top.png + icons/oxygen/checked.png diff --git a/src/Icons/3-state-checkbox.gif b/src/icons/3-state-checkbox.gif similarity index 100% rename from src/Icons/3-state-checkbox.gif rename to src/icons/3-state-checkbox.gif diff --git a/src/Icons/L.gif b/src/icons/L.gif similarity index 100% rename from src/Icons/L.gif rename to src/icons/L.gif diff --git a/src/Icons/flags/ad.png b/src/icons/flags/ad.png similarity index 100% rename from src/Icons/flags/ad.png rename to src/icons/flags/ad.png diff --git a/src/Icons/flags/ae.png b/src/icons/flags/ae.png similarity index 100% rename from src/Icons/flags/ae.png rename to src/icons/flags/ae.png diff --git a/src/Icons/flags/af.png b/src/icons/flags/af.png similarity index 100% rename from src/Icons/flags/af.png rename to src/icons/flags/af.png diff --git a/src/Icons/flags/ag.png b/src/icons/flags/ag.png similarity index 100% rename from src/Icons/flags/ag.png rename to src/icons/flags/ag.png diff --git a/src/Icons/flags/ai.png b/src/icons/flags/ai.png similarity index 100% rename from src/Icons/flags/ai.png rename to src/icons/flags/ai.png diff --git a/src/Icons/flags/al.png b/src/icons/flags/al.png similarity index 100% rename from src/Icons/flags/al.png rename to src/icons/flags/al.png diff --git a/src/Icons/flags/am.png b/src/icons/flags/am.png similarity index 100% rename from src/Icons/flags/am.png rename to src/icons/flags/am.png diff --git a/src/Icons/flags/an.png b/src/icons/flags/an.png similarity index 100% rename from src/Icons/flags/an.png rename to src/icons/flags/an.png diff --git a/src/Icons/flags/ao.png b/src/icons/flags/ao.png similarity index 100% rename from src/Icons/flags/ao.png rename to src/icons/flags/ao.png diff --git a/src/Icons/flags/ar.png b/src/icons/flags/ar.png similarity index 100% rename from src/Icons/flags/ar.png rename to src/icons/flags/ar.png diff --git a/src/Icons/flags/as.png b/src/icons/flags/as.png similarity index 100% rename from src/Icons/flags/as.png rename to src/icons/flags/as.png diff --git a/src/Icons/flags/at.png b/src/icons/flags/at.png similarity index 100% rename from src/Icons/flags/at.png rename to src/icons/flags/at.png diff --git a/src/Icons/flags/au.png b/src/icons/flags/au.png similarity index 100% rename from src/Icons/flags/au.png rename to src/icons/flags/au.png diff --git a/src/Icons/flags/aw.png b/src/icons/flags/aw.png similarity index 100% rename from src/Icons/flags/aw.png rename to src/icons/flags/aw.png diff --git a/src/Icons/flags/ax.png b/src/icons/flags/ax.png similarity index 100% rename from src/Icons/flags/ax.png rename to src/icons/flags/ax.png diff --git a/src/Icons/flags/az.png b/src/icons/flags/az.png similarity index 100% rename from src/Icons/flags/az.png rename to src/icons/flags/az.png diff --git a/src/Icons/flags/ba.png b/src/icons/flags/ba.png similarity index 100% rename from src/Icons/flags/ba.png rename to src/icons/flags/ba.png diff --git a/src/Icons/flags/bb.png b/src/icons/flags/bb.png similarity index 100% rename from src/Icons/flags/bb.png rename to src/icons/flags/bb.png diff --git a/src/Icons/flags/bd.png b/src/icons/flags/bd.png similarity index 100% rename from src/Icons/flags/bd.png rename to src/icons/flags/bd.png diff --git a/src/Icons/flags/be.png b/src/icons/flags/be.png similarity index 100% rename from src/Icons/flags/be.png rename to src/icons/flags/be.png diff --git a/src/Icons/flags/bf.png b/src/icons/flags/bf.png similarity index 100% rename from src/Icons/flags/bf.png rename to src/icons/flags/bf.png diff --git a/src/Icons/flags/bg.png b/src/icons/flags/bg.png similarity index 100% rename from src/Icons/flags/bg.png rename to src/icons/flags/bg.png diff --git a/src/Icons/flags/bh.png b/src/icons/flags/bh.png similarity index 100% rename from src/Icons/flags/bh.png rename to src/icons/flags/bh.png diff --git a/src/Icons/flags/bi.png b/src/icons/flags/bi.png similarity index 100% rename from src/Icons/flags/bi.png rename to src/icons/flags/bi.png diff --git a/src/Icons/flags/bj.png b/src/icons/flags/bj.png similarity index 100% rename from src/Icons/flags/bj.png rename to src/icons/flags/bj.png diff --git a/src/Icons/flags/bm.png b/src/icons/flags/bm.png similarity index 100% rename from src/Icons/flags/bm.png rename to src/icons/flags/bm.png diff --git a/src/Icons/flags/bn.png b/src/icons/flags/bn.png similarity index 100% rename from src/Icons/flags/bn.png rename to src/icons/flags/bn.png diff --git a/src/Icons/flags/bo.png b/src/icons/flags/bo.png similarity index 100% rename from src/Icons/flags/bo.png rename to src/icons/flags/bo.png diff --git a/src/Icons/flags/br.png b/src/icons/flags/br.png similarity index 100% rename from src/Icons/flags/br.png rename to src/icons/flags/br.png diff --git a/src/Icons/flags/bs.png b/src/icons/flags/bs.png similarity index 100% rename from src/Icons/flags/bs.png rename to src/icons/flags/bs.png diff --git a/src/Icons/flags/bt.png b/src/icons/flags/bt.png similarity index 100% rename from src/Icons/flags/bt.png rename to src/icons/flags/bt.png diff --git a/src/Icons/flags/bv.png b/src/icons/flags/bv.png similarity index 100% rename from src/Icons/flags/bv.png rename to src/icons/flags/bv.png diff --git a/src/Icons/flags/bw.png b/src/icons/flags/bw.png similarity index 100% rename from src/Icons/flags/bw.png rename to src/icons/flags/bw.png diff --git a/src/Icons/flags/by.png b/src/icons/flags/by.png similarity index 100% rename from src/Icons/flags/by.png rename to src/icons/flags/by.png diff --git a/src/Icons/flags/bz.png b/src/icons/flags/bz.png similarity index 100% rename from src/Icons/flags/bz.png rename to src/icons/flags/bz.png diff --git a/src/Icons/flags/ca.png b/src/icons/flags/ca.png similarity index 100% rename from src/Icons/flags/ca.png rename to src/icons/flags/ca.png diff --git a/src/Icons/flags/cc.png b/src/icons/flags/cc.png similarity index 100% rename from src/Icons/flags/cc.png rename to src/icons/flags/cc.png diff --git a/src/Icons/flags/cd.png b/src/icons/flags/cd.png similarity index 100% rename from src/Icons/flags/cd.png rename to src/icons/flags/cd.png diff --git a/src/Icons/flags/cf.png b/src/icons/flags/cf.png similarity index 100% rename from src/Icons/flags/cf.png rename to src/icons/flags/cf.png diff --git a/src/Icons/flags/cg.png b/src/icons/flags/cg.png similarity index 100% rename from src/Icons/flags/cg.png rename to src/icons/flags/cg.png diff --git a/src/Icons/flags/ch.png b/src/icons/flags/ch.png similarity index 100% rename from src/Icons/flags/ch.png rename to src/icons/flags/ch.png diff --git a/src/Icons/flags/ci.png b/src/icons/flags/ci.png similarity index 100% rename from src/Icons/flags/ci.png rename to src/icons/flags/ci.png diff --git a/src/Icons/flags/ck.png b/src/icons/flags/ck.png similarity index 100% rename from src/Icons/flags/ck.png rename to src/icons/flags/ck.png diff --git a/src/Icons/flags/cl.png b/src/icons/flags/cl.png similarity index 100% rename from src/Icons/flags/cl.png rename to src/icons/flags/cl.png diff --git a/src/Icons/flags/cm.png b/src/icons/flags/cm.png similarity index 100% rename from src/Icons/flags/cm.png rename to src/icons/flags/cm.png diff --git a/src/Icons/flags/cn.png b/src/icons/flags/cn.png similarity index 100% rename from src/Icons/flags/cn.png rename to src/icons/flags/cn.png diff --git a/src/Icons/flags/co.png b/src/icons/flags/co.png similarity index 100% rename from src/Icons/flags/co.png rename to src/icons/flags/co.png diff --git a/src/Icons/flags/cr.png b/src/icons/flags/cr.png similarity index 100% rename from src/Icons/flags/cr.png rename to src/icons/flags/cr.png diff --git a/src/Icons/flags/cs.png b/src/icons/flags/cs.png similarity index 100% rename from src/Icons/flags/cs.png rename to src/icons/flags/cs.png diff --git a/src/Icons/flags/cu.png b/src/icons/flags/cu.png similarity index 100% rename from src/Icons/flags/cu.png rename to src/icons/flags/cu.png diff --git a/src/Icons/flags/cv.png b/src/icons/flags/cv.png similarity index 100% rename from src/Icons/flags/cv.png rename to src/icons/flags/cv.png diff --git a/src/Icons/flags/cx.png b/src/icons/flags/cx.png similarity index 100% rename from src/Icons/flags/cx.png rename to src/icons/flags/cx.png diff --git a/src/Icons/flags/cy.png b/src/icons/flags/cy.png similarity index 100% rename from src/Icons/flags/cy.png rename to src/icons/flags/cy.png diff --git a/src/Icons/flags/cz.png b/src/icons/flags/cz.png similarity index 100% rename from src/Icons/flags/cz.png rename to src/icons/flags/cz.png diff --git a/src/Icons/flags/de.png b/src/icons/flags/de.png similarity index 100% rename from src/Icons/flags/de.png rename to src/icons/flags/de.png diff --git a/src/Icons/flags/dj.png b/src/icons/flags/dj.png similarity index 100% rename from src/Icons/flags/dj.png rename to src/icons/flags/dj.png diff --git a/src/Icons/flags/dk.png b/src/icons/flags/dk.png similarity index 100% rename from src/Icons/flags/dk.png rename to src/icons/flags/dk.png diff --git a/src/Icons/flags/dm.png b/src/icons/flags/dm.png similarity index 100% rename from src/Icons/flags/dm.png rename to src/icons/flags/dm.png diff --git a/src/Icons/flags/do.png b/src/icons/flags/do.png similarity index 100% rename from src/Icons/flags/do.png rename to src/icons/flags/do.png diff --git a/src/Icons/flags/dz.png b/src/icons/flags/dz.png similarity index 100% rename from src/Icons/flags/dz.png rename to src/icons/flags/dz.png diff --git a/src/Icons/flags/ec.png b/src/icons/flags/ec.png similarity index 100% rename from src/Icons/flags/ec.png rename to src/icons/flags/ec.png diff --git a/src/Icons/flags/ee.png b/src/icons/flags/ee.png similarity index 100% rename from src/Icons/flags/ee.png rename to src/icons/flags/ee.png diff --git a/src/Icons/flags/eg.png b/src/icons/flags/eg.png similarity index 100% rename from src/Icons/flags/eg.png rename to src/icons/flags/eg.png diff --git a/src/Icons/flags/eh.png b/src/icons/flags/eh.png similarity index 100% rename from src/Icons/flags/eh.png rename to src/icons/flags/eh.png diff --git a/src/Icons/flags/er.png b/src/icons/flags/er.png similarity index 100% rename from src/Icons/flags/er.png rename to src/icons/flags/er.png diff --git a/src/Icons/flags/es.png b/src/icons/flags/es.png similarity index 100% rename from src/Icons/flags/es.png rename to src/icons/flags/es.png diff --git a/src/Icons/flags/et.png b/src/icons/flags/et.png similarity index 100% rename from src/Icons/flags/et.png rename to src/icons/flags/et.png diff --git a/src/Icons/flags/fi.png b/src/icons/flags/fi.png similarity index 100% rename from src/Icons/flags/fi.png rename to src/icons/flags/fi.png diff --git a/src/Icons/flags/fj.png b/src/icons/flags/fj.png similarity index 100% rename from src/Icons/flags/fj.png rename to src/icons/flags/fj.png diff --git a/src/Icons/flags/fk.png b/src/icons/flags/fk.png similarity index 100% rename from src/Icons/flags/fk.png rename to src/icons/flags/fk.png diff --git a/src/Icons/flags/fm.png b/src/icons/flags/fm.png similarity index 100% rename from src/Icons/flags/fm.png rename to src/icons/flags/fm.png diff --git a/src/Icons/flags/fo.png b/src/icons/flags/fo.png similarity index 100% rename from src/Icons/flags/fo.png rename to src/icons/flags/fo.png diff --git a/src/Icons/flags/fr.png b/src/icons/flags/fr.png similarity index 100% rename from src/Icons/flags/fr.png rename to src/icons/flags/fr.png diff --git a/src/Icons/flags/ga.png b/src/icons/flags/ga.png similarity index 100% rename from src/Icons/flags/ga.png rename to src/icons/flags/ga.png diff --git a/src/Icons/flags/gb.png b/src/icons/flags/gb.png similarity index 100% rename from src/Icons/flags/gb.png rename to src/icons/flags/gb.png diff --git a/src/Icons/flags/gd.png b/src/icons/flags/gd.png similarity index 100% rename from src/Icons/flags/gd.png rename to src/icons/flags/gd.png diff --git a/src/Icons/flags/ge.png b/src/icons/flags/ge.png similarity index 100% rename from src/Icons/flags/ge.png rename to src/icons/flags/ge.png diff --git a/src/Icons/flags/gf.png b/src/icons/flags/gf.png similarity index 100% rename from src/Icons/flags/gf.png rename to src/icons/flags/gf.png diff --git a/src/Icons/flags/gh.png b/src/icons/flags/gh.png similarity index 100% rename from src/Icons/flags/gh.png rename to src/icons/flags/gh.png diff --git a/src/Icons/flags/gi.png b/src/icons/flags/gi.png similarity index 100% rename from src/Icons/flags/gi.png rename to src/icons/flags/gi.png diff --git a/src/Icons/flags/gl.png b/src/icons/flags/gl.png similarity index 100% rename from src/Icons/flags/gl.png rename to src/icons/flags/gl.png diff --git a/src/Icons/flags/gm.png b/src/icons/flags/gm.png similarity index 100% rename from src/Icons/flags/gm.png rename to src/icons/flags/gm.png diff --git a/src/Icons/flags/gn.png b/src/icons/flags/gn.png similarity index 100% rename from src/Icons/flags/gn.png rename to src/icons/flags/gn.png diff --git a/src/Icons/flags/gp.png b/src/icons/flags/gp.png similarity index 100% rename from src/Icons/flags/gp.png rename to src/icons/flags/gp.png diff --git a/src/Icons/flags/gq.png b/src/icons/flags/gq.png similarity index 100% rename from src/Icons/flags/gq.png rename to src/icons/flags/gq.png diff --git a/src/Icons/flags/gr.png b/src/icons/flags/gr.png similarity index 100% rename from src/Icons/flags/gr.png rename to src/icons/flags/gr.png diff --git a/src/Icons/flags/gs.png b/src/icons/flags/gs.png similarity index 100% rename from src/Icons/flags/gs.png rename to src/icons/flags/gs.png diff --git a/src/Icons/flags/gt.png b/src/icons/flags/gt.png similarity index 100% rename from src/Icons/flags/gt.png rename to src/icons/flags/gt.png diff --git a/src/Icons/flags/gu.png b/src/icons/flags/gu.png similarity index 100% rename from src/Icons/flags/gu.png rename to src/icons/flags/gu.png diff --git a/src/Icons/flags/gw.png b/src/icons/flags/gw.png similarity index 100% rename from src/Icons/flags/gw.png rename to src/icons/flags/gw.png diff --git a/src/Icons/flags/gy.png b/src/icons/flags/gy.png similarity index 100% rename from src/Icons/flags/gy.png rename to src/icons/flags/gy.png diff --git a/src/Icons/flags/hk.png b/src/icons/flags/hk.png similarity index 100% rename from src/Icons/flags/hk.png rename to src/icons/flags/hk.png diff --git a/src/Icons/flags/hm.png b/src/icons/flags/hm.png similarity index 100% rename from src/Icons/flags/hm.png rename to src/icons/flags/hm.png diff --git a/src/Icons/flags/hn.png b/src/icons/flags/hn.png similarity index 100% rename from src/Icons/flags/hn.png rename to src/icons/flags/hn.png diff --git a/src/Icons/flags/hr.png b/src/icons/flags/hr.png similarity index 100% rename from src/Icons/flags/hr.png rename to src/icons/flags/hr.png diff --git a/src/Icons/flags/ht.png b/src/icons/flags/ht.png similarity index 100% rename from src/Icons/flags/ht.png rename to src/icons/flags/ht.png diff --git a/src/Icons/flags/hu.png b/src/icons/flags/hu.png similarity index 100% rename from src/Icons/flags/hu.png rename to src/icons/flags/hu.png diff --git a/src/Icons/flags/icons-set-readme.txt b/src/icons/flags/icons-set-readme.txt similarity index 100% rename from src/Icons/flags/icons-set-readme.txt rename to src/icons/flags/icons-set-readme.txt diff --git a/src/Icons/flags/id.png b/src/icons/flags/id.png similarity index 100% rename from src/Icons/flags/id.png rename to src/icons/flags/id.png diff --git a/src/Icons/flags/ie.png b/src/icons/flags/ie.png similarity index 100% rename from src/Icons/flags/ie.png rename to src/icons/flags/ie.png diff --git a/src/Icons/flags/il.png b/src/icons/flags/il.png similarity index 100% rename from src/Icons/flags/il.png rename to src/icons/flags/il.png diff --git a/src/Icons/flags/in.png b/src/icons/flags/in.png similarity index 100% rename from src/Icons/flags/in.png rename to src/icons/flags/in.png diff --git a/src/Icons/flags/io.png b/src/icons/flags/io.png similarity index 100% rename from src/Icons/flags/io.png rename to src/icons/flags/io.png diff --git a/src/Icons/flags/iq.png b/src/icons/flags/iq.png similarity index 100% rename from src/Icons/flags/iq.png rename to src/icons/flags/iq.png diff --git a/src/Icons/flags/ir.png b/src/icons/flags/ir.png similarity index 100% rename from src/Icons/flags/ir.png rename to src/icons/flags/ir.png diff --git a/src/Icons/flags/is.png b/src/icons/flags/is.png similarity index 100% rename from src/Icons/flags/is.png rename to src/icons/flags/is.png diff --git a/src/Icons/flags/it.png b/src/icons/flags/it.png similarity index 100% rename from src/Icons/flags/it.png rename to src/icons/flags/it.png diff --git a/src/Icons/flags/jm.png b/src/icons/flags/jm.png similarity index 100% rename from src/Icons/flags/jm.png rename to src/icons/flags/jm.png diff --git a/src/Icons/flags/jo.png b/src/icons/flags/jo.png similarity index 100% rename from src/Icons/flags/jo.png rename to src/icons/flags/jo.png diff --git a/src/Icons/flags/jp.png b/src/icons/flags/jp.png similarity index 100% rename from src/Icons/flags/jp.png rename to src/icons/flags/jp.png diff --git a/src/Icons/flags/ke.png b/src/icons/flags/ke.png similarity index 100% rename from src/Icons/flags/ke.png rename to src/icons/flags/ke.png diff --git a/src/Icons/flags/kg.png b/src/icons/flags/kg.png similarity index 100% rename from src/Icons/flags/kg.png rename to src/icons/flags/kg.png diff --git a/src/Icons/flags/kh.png b/src/icons/flags/kh.png similarity index 100% rename from src/Icons/flags/kh.png rename to src/icons/flags/kh.png diff --git a/src/Icons/flags/ki.png b/src/icons/flags/ki.png similarity index 100% rename from src/Icons/flags/ki.png rename to src/icons/flags/ki.png diff --git a/src/Icons/flags/km.png b/src/icons/flags/km.png similarity index 100% rename from src/Icons/flags/km.png rename to src/icons/flags/km.png diff --git a/src/Icons/flags/kn.png b/src/icons/flags/kn.png similarity index 100% rename from src/Icons/flags/kn.png rename to src/icons/flags/kn.png diff --git a/src/Icons/flags/kp.png b/src/icons/flags/kp.png similarity index 100% rename from src/Icons/flags/kp.png rename to src/icons/flags/kp.png diff --git a/src/Icons/flags/kr.png b/src/icons/flags/kr.png similarity index 100% rename from src/Icons/flags/kr.png rename to src/icons/flags/kr.png diff --git a/src/Icons/flags/kw.png b/src/icons/flags/kw.png similarity index 100% rename from src/Icons/flags/kw.png rename to src/icons/flags/kw.png diff --git a/src/Icons/flags/ky.png b/src/icons/flags/ky.png similarity index 100% rename from src/Icons/flags/ky.png rename to src/icons/flags/ky.png diff --git a/src/Icons/flags/kz.png b/src/icons/flags/kz.png similarity index 100% rename from src/Icons/flags/kz.png rename to src/icons/flags/kz.png diff --git a/src/Icons/flags/la.png b/src/icons/flags/la.png similarity index 100% rename from src/Icons/flags/la.png rename to src/icons/flags/la.png diff --git a/src/Icons/flags/lb.png b/src/icons/flags/lb.png similarity index 100% rename from src/Icons/flags/lb.png rename to src/icons/flags/lb.png diff --git a/src/Icons/flags/lc.png b/src/icons/flags/lc.png similarity index 100% rename from src/Icons/flags/lc.png rename to src/icons/flags/lc.png diff --git a/src/Icons/flags/li.png b/src/icons/flags/li.png similarity index 100% rename from src/Icons/flags/li.png rename to src/icons/flags/li.png diff --git a/src/Icons/flags/lk.png b/src/icons/flags/lk.png similarity index 100% rename from src/Icons/flags/lk.png rename to src/icons/flags/lk.png diff --git a/src/Icons/flags/lr.png b/src/icons/flags/lr.png similarity index 100% rename from src/Icons/flags/lr.png rename to src/icons/flags/lr.png diff --git a/src/Icons/flags/ls.png b/src/icons/flags/ls.png similarity index 100% rename from src/Icons/flags/ls.png rename to src/icons/flags/ls.png diff --git a/src/Icons/flags/lt.png b/src/icons/flags/lt.png similarity index 100% rename from src/Icons/flags/lt.png rename to src/icons/flags/lt.png diff --git a/src/Icons/flags/lu.png b/src/icons/flags/lu.png similarity index 100% rename from src/Icons/flags/lu.png rename to src/icons/flags/lu.png diff --git a/src/Icons/flags/lv.png b/src/icons/flags/lv.png similarity index 100% rename from src/Icons/flags/lv.png rename to src/icons/flags/lv.png diff --git a/src/Icons/flags/ly.png b/src/icons/flags/ly.png similarity index 100% rename from src/Icons/flags/ly.png rename to src/icons/flags/ly.png diff --git a/src/Icons/flags/ma.png b/src/icons/flags/ma.png similarity index 100% rename from src/Icons/flags/ma.png rename to src/icons/flags/ma.png diff --git a/src/Icons/flags/mc.png b/src/icons/flags/mc.png similarity index 100% rename from src/Icons/flags/mc.png rename to src/icons/flags/mc.png diff --git a/src/Icons/flags/md.png b/src/icons/flags/md.png similarity index 100% rename from src/Icons/flags/md.png rename to src/icons/flags/md.png diff --git a/src/Icons/flags/me.png b/src/icons/flags/me.png similarity index 100% rename from src/Icons/flags/me.png rename to src/icons/flags/me.png diff --git a/src/Icons/flags/mg.png b/src/icons/flags/mg.png similarity index 100% rename from src/Icons/flags/mg.png rename to src/icons/flags/mg.png diff --git a/src/Icons/flags/mh.png b/src/icons/flags/mh.png similarity index 100% rename from src/Icons/flags/mh.png rename to src/icons/flags/mh.png diff --git a/src/Icons/flags/mk.png b/src/icons/flags/mk.png similarity index 100% rename from src/Icons/flags/mk.png rename to src/icons/flags/mk.png diff --git a/src/Icons/flags/ml.png b/src/icons/flags/ml.png similarity index 100% rename from src/Icons/flags/ml.png rename to src/icons/flags/ml.png diff --git a/src/Icons/flags/mm.png b/src/icons/flags/mm.png similarity index 100% rename from src/Icons/flags/mm.png rename to src/icons/flags/mm.png diff --git a/src/Icons/flags/mn.png b/src/icons/flags/mn.png similarity index 100% rename from src/Icons/flags/mn.png rename to src/icons/flags/mn.png diff --git a/src/Icons/flags/mo.png b/src/icons/flags/mo.png similarity index 100% rename from src/Icons/flags/mo.png rename to src/icons/flags/mo.png diff --git a/src/Icons/flags/mp.png b/src/icons/flags/mp.png similarity index 100% rename from src/Icons/flags/mp.png rename to src/icons/flags/mp.png diff --git a/src/Icons/flags/mq.png b/src/icons/flags/mq.png similarity index 100% rename from src/Icons/flags/mq.png rename to src/icons/flags/mq.png diff --git a/src/Icons/flags/mr.png b/src/icons/flags/mr.png similarity index 100% rename from src/Icons/flags/mr.png rename to src/icons/flags/mr.png diff --git a/src/Icons/flags/ms.png b/src/icons/flags/ms.png similarity index 100% rename from src/Icons/flags/ms.png rename to src/icons/flags/ms.png diff --git a/src/Icons/flags/mt.png b/src/icons/flags/mt.png similarity index 100% rename from src/Icons/flags/mt.png rename to src/icons/flags/mt.png diff --git a/src/Icons/flags/mu.png b/src/icons/flags/mu.png similarity index 100% rename from src/Icons/flags/mu.png rename to src/icons/flags/mu.png diff --git a/src/Icons/flags/mv.png b/src/icons/flags/mv.png similarity index 100% rename from src/Icons/flags/mv.png rename to src/icons/flags/mv.png diff --git a/src/Icons/flags/mw.png b/src/icons/flags/mw.png similarity index 100% rename from src/Icons/flags/mw.png rename to src/icons/flags/mw.png diff --git a/src/Icons/flags/mx.png b/src/icons/flags/mx.png similarity index 100% rename from src/Icons/flags/mx.png rename to src/icons/flags/mx.png diff --git a/src/Icons/flags/my.png b/src/icons/flags/my.png similarity index 100% rename from src/Icons/flags/my.png rename to src/icons/flags/my.png diff --git a/src/Icons/flags/mz.png b/src/icons/flags/mz.png similarity index 100% rename from src/Icons/flags/mz.png rename to src/icons/flags/mz.png diff --git a/src/Icons/flags/na.png b/src/icons/flags/na.png similarity index 100% rename from src/Icons/flags/na.png rename to src/icons/flags/na.png diff --git a/src/Icons/flags/nc.png b/src/icons/flags/nc.png similarity index 100% rename from src/Icons/flags/nc.png rename to src/icons/flags/nc.png diff --git a/src/Icons/flags/ne.png b/src/icons/flags/ne.png similarity index 100% rename from src/Icons/flags/ne.png rename to src/icons/flags/ne.png diff --git a/src/Icons/flags/nf.png b/src/icons/flags/nf.png similarity index 100% rename from src/Icons/flags/nf.png rename to src/icons/flags/nf.png diff --git a/src/Icons/flags/ng.png b/src/icons/flags/ng.png similarity index 100% rename from src/Icons/flags/ng.png rename to src/icons/flags/ng.png diff --git a/src/Icons/flags/ni.png b/src/icons/flags/ni.png similarity index 100% rename from src/Icons/flags/ni.png rename to src/icons/flags/ni.png diff --git a/src/Icons/flags/nl.png b/src/icons/flags/nl.png similarity index 100% rename from src/Icons/flags/nl.png rename to src/icons/flags/nl.png diff --git a/src/Icons/flags/no.png b/src/icons/flags/no.png similarity index 100% rename from src/Icons/flags/no.png rename to src/icons/flags/no.png diff --git a/src/Icons/flags/np.png b/src/icons/flags/np.png similarity index 100% rename from src/Icons/flags/np.png rename to src/icons/flags/np.png diff --git a/src/Icons/flags/nr.png b/src/icons/flags/nr.png similarity index 100% rename from src/Icons/flags/nr.png rename to src/icons/flags/nr.png diff --git a/src/Icons/flags/nu.png b/src/icons/flags/nu.png similarity index 100% rename from src/Icons/flags/nu.png rename to src/icons/flags/nu.png diff --git a/src/Icons/flags/nz.png b/src/icons/flags/nz.png similarity index 100% rename from src/Icons/flags/nz.png rename to src/icons/flags/nz.png diff --git a/src/Icons/flags/om.png b/src/icons/flags/om.png similarity index 100% rename from src/Icons/flags/om.png rename to src/icons/flags/om.png diff --git a/src/Icons/flags/pa.png b/src/icons/flags/pa.png similarity index 100% rename from src/Icons/flags/pa.png rename to src/icons/flags/pa.png diff --git a/src/Icons/flags/pe.png b/src/icons/flags/pe.png similarity index 100% rename from src/Icons/flags/pe.png rename to src/icons/flags/pe.png diff --git a/src/Icons/flags/pf.png b/src/icons/flags/pf.png similarity index 100% rename from src/Icons/flags/pf.png rename to src/icons/flags/pf.png diff --git a/src/Icons/flags/pg.png b/src/icons/flags/pg.png similarity index 100% rename from src/Icons/flags/pg.png rename to src/icons/flags/pg.png diff --git a/src/Icons/flags/ph.png b/src/icons/flags/ph.png similarity index 100% rename from src/Icons/flags/ph.png rename to src/icons/flags/ph.png diff --git a/src/Icons/flags/pk.png b/src/icons/flags/pk.png similarity index 100% rename from src/Icons/flags/pk.png rename to src/icons/flags/pk.png diff --git a/src/Icons/flags/pl.png b/src/icons/flags/pl.png similarity index 100% rename from src/Icons/flags/pl.png rename to src/icons/flags/pl.png diff --git a/src/Icons/flags/pm.png b/src/icons/flags/pm.png similarity index 100% rename from src/Icons/flags/pm.png rename to src/icons/flags/pm.png diff --git a/src/Icons/flags/pn.png b/src/icons/flags/pn.png similarity index 100% rename from src/Icons/flags/pn.png rename to src/icons/flags/pn.png diff --git a/src/Icons/flags/pr.png b/src/icons/flags/pr.png similarity index 100% rename from src/Icons/flags/pr.png rename to src/icons/flags/pr.png diff --git a/src/Icons/flags/ps.png b/src/icons/flags/ps.png similarity index 100% rename from src/Icons/flags/ps.png rename to src/icons/flags/ps.png diff --git a/src/Icons/flags/pt.png b/src/icons/flags/pt.png similarity index 100% rename from src/Icons/flags/pt.png rename to src/icons/flags/pt.png diff --git a/src/Icons/flags/pw.png b/src/icons/flags/pw.png similarity index 100% rename from src/Icons/flags/pw.png rename to src/icons/flags/pw.png diff --git a/src/Icons/flags/py.png b/src/icons/flags/py.png similarity index 100% rename from src/Icons/flags/py.png rename to src/icons/flags/py.png diff --git a/src/Icons/flags/qa.png b/src/icons/flags/qa.png similarity index 100% rename from src/Icons/flags/qa.png rename to src/icons/flags/qa.png diff --git a/src/Icons/flags/re.png b/src/icons/flags/re.png similarity index 100% rename from src/Icons/flags/re.png rename to src/icons/flags/re.png diff --git a/src/Icons/flags/ro.png b/src/icons/flags/ro.png similarity index 100% rename from src/Icons/flags/ro.png rename to src/icons/flags/ro.png diff --git a/src/Icons/flags/rs.png b/src/icons/flags/rs.png similarity index 100% rename from src/Icons/flags/rs.png rename to src/icons/flags/rs.png diff --git a/src/Icons/flags/ru.png b/src/icons/flags/ru.png similarity index 100% rename from src/Icons/flags/ru.png rename to src/icons/flags/ru.png diff --git a/src/Icons/flags/rw.png b/src/icons/flags/rw.png similarity index 100% rename from src/Icons/flags/rw.png rename to src/icons/flags/rw.png diff --git a/src/Icons/flags/sa.png b/src/icons/flags/sa.png similarity index 100% rename from src/Icons/flags/sa.png rename to src/icons/flags/sa.png diff --git a/src/Icons/flags/sb.png b/src/icons/flags/sb.png similarity index 100% rename from src/Icons/flags/sb.png rename to src/icons/flags/sb.png diff --git a/src/Icons/flags/sc.png b/src/icons/flags/sc.png similarity index 100% rename from src/Icons/flags/sc.png rename to src/icons/flags/sc.png diff --git a/src/Icons/flags/sd.png b/src/icons/flags/sd.png similarity index 100% rename from src/Icons/flags/sd.png rename to src/icons/flags/sd.png diff --git a/src/Icons/flags/se.png b/src/icons/flags/se.png similarity index 100% rename from src/Icons/flags/se.png rename to src/icons/flags/se.png diff --git a/src/Icons/flags/sg.png b/src/icons/flags/sg.png similarity index 100% rename from src/Icons/flags/sg.png rename to src/icons/flags/sg.png diff --git a/src/Icons/flags/sh.png b/src/icons/flags/sh.png similarity index 100% rename from src/Icons/flags/sh.png rename to src/icons/flags/sh.png diff --git a/src/Icons/flags/si.png b/src/icons/flags/si.png similarity index 100% rename from src/Icons/flags/si.png rename to src/icons/flags/si.png diff --git a/src/Icons/flags/sj.png b/src/icons/flags/sj.png similarity index 100% rename from src/Icons/flags/sj.png rename to src/icons/flags/sj.png diff --git a/src/Icons/flags/sk.png b/src/icons/flags/sk.png similarity index 100% rename from src/Icons/flags/sk.png rename to src/icons/flags/sk.png diff --git a/src/Icons/flags/sl.png b/src/icons/flags/sl.png similarity index 100% rename from src/Icons/flags/sl.png rename to src/icons/flags/sl.png diff --git a/src/Icons/flags/sm.png b/src/icons/flags/sm.png similarity index 100% rename from src/Icons/flags/sm.png rename to src/icons/flags/sm.png diff --git a/src/Icons/flags/sn.png b/src/icons/flags/sn.png similarity index 100% rename from src/Icons/flags/sn.png rename to src/icons/flags/sn.png diff --git a/src/Icons/flags/so.png b/src/icons/flags/so.png similarity index 100% rename from src/Icons/flags/so.png rename to src/icons/flags/so.png diff --git a/src/Icons/flags/sr.png b/src/icons/flags/sr.png similarity index 100% rename from src/Icons/flags/sr.png rename to src/icons/flags/sr.png diff --git a/src/Icons/flags/st.png b/src/icons/flags/st.png similarity index 100% rename from src/Icons/flags/st.png rename to src/icons/flags/st.png diff --git a/src/Icons/flags/sv.png b/src/icons/flags/sv.png similarity index 100% rename from src/Icons/flags/sv.png rename to src/icons/flags/sv.png diff --git a/src/Icons/flags/sy.png b/src/icons/flags/sy.png similarity index 100% rename from src/Icons/flags/sy.png rename to src/icons/flags/sy.png diff --git a/src/Icons/flags/sz.png b/src/icons/flags/sz.png similarity index 100% rename from src/Icons/flags/sz.png rename to src/icons/flags/sz.png diff --git a/src/Icons/flags/tc.png b/src/icons/flags/tc.png similarity index 100% rename from src/Icons/flags/tc.png rename to src/icons/flags/tc.png diff --git a/src/Icons/flags/td.png b/src/icons/flags/td.png similarity index 100% rename from src/Icons/flags/td.png rename to src/icons/flags/td.png diff --git a/src/Icons/flags/tf.png b/src/icons/flags/tf.png similarity index 100% rename from src/Icons/flags/tf.png rename to src/icons/flags/tf.png diff --git a/src/Icons/flags/tg.png b/src/icons/flags/tg.png similarity index 100% rename from src/Icons/flags/tg.png rename to src/icons/flags/tg.png diff --git a/src/Icons/flags/th.png b/src/icons/flags/th.png similarity index 100% rename from src/Icons/flags/th.png rename to src/icons/flags/th.png diff --git a/src/Icons/flags/tj.png b/src/icons/flags/tj.png similarity index 100% rename from src/Icons/flags/tj.png rename to src/icons/flags/tj.png diff --git a/src/Icons/flags/tk.png b/src/icons/flags/tk.png similarity index 100% rename from src/Icons/flags/tk.png rename to src/icons/flags/tk.png diff --git a/src/Icons/flags/tl.png b/src/icons/flags/tl.png similarity index 100% rename from src/Icons/flags/tl.png rename to src/icons/flags/tl.png diff --git a/src/Icons/flags/tm.png b/src/icons/flags/tm.png similarity index 100% rename from src/Icons/flags/tm.png rename to src/icons/flags/tm.png diff --git a/src/Icons/flags/tn.png b/src/icons/flags/tn.png similarity index 100% rename from src/Icons/flags/tn.png rename to src/icons/flags/tn.png diff --git a/src/Icons/flags/to.png b/src/icons/flags/to.png similarity index 100% rename from src/Icons/flags/to.png rename to src/icons/flags/to.png diff --git a/src/Icons/flags/tr.png b/src/icons/flags/tr.png similarity index 100% rename from src/Icons/flags/tr.png rename to src/icons/flags/tr.png diff --git a/src/Icons/flags/tt.png b/src/icons/flags/tt.png similarity index 100% rename from src/Icons/flags/tt.png rename to src/icons/flags/tt.png diff --git a/src/Icons/flags/tv.png b/src/icons/flags/tv.png similarity index 100% rename from src/Icons/flags/tv.png rename to src/icons/flags/tv.png diff --git a/src/Icons/flags/tw.png b/src/icons/flags/tw.png similarity index 100% rename from src/Icons/flags/tw.png rename to src/icons/flags/tw.png diff --git a/src/Icons/flags/tz.png b/src/icons/flags/tz.png similarity index 100% rename from src/Icons/flags/tz.png rename to src/icons/flags/tz.png diff --git a/src/Icons/flags/ua.png b/src/icons/flags/ua.png similarity index 100% rename from src/Icons/flags/ua.png rename to src/icons/flags/ua.png diff --git a/src/Icons/flags/ug.png b/src/icons/flags/ug.png similarity index 100% rename from src/Icons/flags/ug.png rename to src/icons/flags/ug.png diff --git a/src/Icons/flags/um.png b/src/icons/flags/um.png similarity index 100% rename from src/Icons/flags/um.png rename to src/icons/flags/um.png diff --git a/src/Icons/flags/us.png b/src/icons/flags/us.png similarity index 100% rename from src/Icons/flags/us.png rename to src/icons/flags/us.png diff --git a/src/Icons/flags/uy.png b/src/icons/flags/uy.png similarity index 100% rename from src/Icons/flags/uy.png rename to src/icons/flags/uy.png diff --git a/src/Icons/flags/uz.png b/src/icons/flags/uz.png similarity index 100% rename from src/Icons/flags/uz.png rename to src/icons/flags/uz.png diff --git a/src/Icons/flags/va.png b/src/icons/flags/va.png similarity index 100% rename from src/Icons/flags/va.png rename to src/icons/flags/va.png diff --git a/src/Icons/flags/vc.png b/src/icons/flags/vc.png similarity index 100% rename from src/Icons/flags/vc.png rename to src/icons/flags/vc.png diff --git a/src/Icons/flags/ve.png b/src/icons/flags/ve.png similarity index 100% rename from src/Icons/flags/ve.png rename to src/icons/flags/ve.png diff --git a/src/Icons/flags/vg.png b/src/icons/flags/vg.png similarity index 100% rename from src/Icons/flags/vg.png rename to src/icons/flags/vg.png diff --git a/src/Icons/flags/vi.png b/src/icons/flags/vi.png similarity index 100% rename from src/Icons/flags/vi.png rename to src/icons/flags/vi.png diff --git a/src/Icons/flags/vn.png b/src/icons/flags/vn.png similarity index 100% rename from src/Icons/flags/vn.png rename to src/icons/flags/vn.png diff --git a/src/Icons/flags/vu.png b/src/icons/flags/vu.png similarity index 100% rename from src/Icons/flags/vu.png rename to src/icons/flags/vu.png diff --git a/src/Icons/flags/wf.png b/src/icons/flags/wf.png similarity index 100% rename from src/Icons/flags/wf.png rename to src/icons/flags/wf.png diff --git a/src/Icons/flags/ws.png b/src/icons/flags/ws.png similarity index 100% rename from src/Icons/flags/ws.png rename to src/icons/flags/ws.png diff --git a/src/Icons/flags/ye.png b/src/icons/flags/ye.png similarity index 100% rename from src/Icons/flags/ye.png rename to src/icons/flags/ye.png diff --git a/src/Icons/flags/yt.png b/src/icons/flags/yt.png similarity index 100% rename from src/Icons/flags/yt.png rename to src/icons/flags/yt.png diff --git a/src/Icons/flags/za.png b/src/icons/flags/za.png similarity index 100% rename from src/Icons/flags/za.png rename to src/icons/flags/za.png diff --git a/src/Icons/flags/zm.png b/src/icons/flags/zm.png similarity index 100% rename from src/Icons/flags/zm.png rename to src/icons/flags/zm.png diff --git a/src/Icons/flags/zw.png b/src/icons/flags/zw.png similarity index 100% rename from src/Icons/flags/zw.png rename to src/icons/flags/zw.png diff --git a/src/Icons/loading.png b/src/icons/loading.png similarity index 100% rename from src/Icons/loading.png rename to src/icons/loading.png diff --git a/src/Icons/magnet.png b/src/icons/magnet.png similarity index 100% rename from src/Icons/magnet.png rename to src/icons/magnet.png diff --git a/src/Icons/oxygen/application-exit.png b/src/icons/oxygen/application-exit.png similarity index 100% rename from src/Icons/oxygen/application-exit.png rename to src/icons/oxygen/application-exit.png diff --git a/src/Icons/oxygen/application-rss+xml.png b/src/icons/oxygen/application-rss+xml.png similarity index 100% rename from src/Icons/oxygen/application-rss+xml.png rename to src/icons/oxygen/application-rss+xml.png diff --git a/src/Icons/oxygen/application-x-mswinurl.png b/src/icons/oxygen/application-x-mswinurl.png similarity index 100% rename from src/Icons/oxygen/application-x-mswinurl.png rename to src/icons/oxygen/application-x-mswinurl.png diff --git a/src/Icons/oxygen/checked.png b/src/icons/oxygen/checked.png similarity index 100% rename from src/Icons/oxygen/checked.png rename to src/icons/oxygen/checked.png diff --git a/src/Icons/oxygen/chronometer.png b/src/icons/oxygen/chronometer.png similarity index 100% rename from src/Icons/oxygen/chronometer.png rename to src/icons/oxygen/chronometer.png diff --git a/src/Icons/oxygen/dialog-cancel.png b/src/icons/oxygen/dialog-cancel.png similarity index 100% rename from src/Icons/oxygen/dialog-cancel.png rename to src/icons/oxygen/dialog-cancel.png diff --git a/src/Icons/oxygen/dialog-information.png b/src/icons/oxygen/dialog-information.png similarity index 100% rename from src/Icons/oxygen/dialog-information.png rename to src/icons/oxygen/dialog-information.png diff --git a/src/Icons/oxygen/dialog-warning.png b/src/icons/oxygen/dialog-warning.png similarity index 100% rename from src/Icons/oxygen/dialog-warning.png rename to src/icons/oxygen/dialog-warning.png diff --git a/src/Icons/oxygen/document-edit-verify.png b/src/icons/oxygen/document-edit-verify.png similarity index 100% rename from src/Icons/oxygen/document-edit-verify.png rename to src/icons/oxygen/document-edit-verify.png diff --git a/src/Icons/oxygen/document-edit.png b/src/icons/oxygen/document-edit.png similarity index 100% rename from src/Icons/oxygen/document-edit.png rename to src/icons/oxygen/document-edit.png diff --git a/src/Icons/oxygen/document-encrypt.png b/src/icons/oxygen/document-encrypt.png similarity index 100% rename from src/Icons/oxygen/document-encrypt.png rename to src/icons/oxygen/document-encrypt.png diff --git a/src/Icons/oxygen/document-import.png b/src/icons/oxygen/document-import.png similarity index 100% rename from src/Icons/oxygen/document-import.png rename to src/icons/oxygen/document-import.png diff --git a/src/Icons/oxygen/document-new.png b/src/icons/oxygen/document-new.png similarity index 100% rename from src/Icons/oxygen/document-new.png rename to src/icons/oxygen/document-new.png diff --git a/src/Icons/oxygen/document-properties.png b/src/icons/oxygen/document-properties.png similarity index 100% rename from src/Icons/oxygen/document-properties.png rename to src/icons/oxygen/document-properties.png diff --git a/src/Icons/oxygen/document-save.png b/src/icons/oxygen/document-save.png similarity index 100% rename from src/Icons/oxygen/document-save.png rename to src/icons/oxygen/document-save.png diff --git a/src/Icons/oxygen/download.png b/src/icons/oxygen/download.png similarity index 100% rename from src/Icons/oxygen/download.png rename to src/icons/oxygen/download.png diff --git a/src/Icons/oxygen/edit-clear-history.png b/src/icons/oxygen/edit-clear-history.png similarity index 100% rename from src/Icons/oxygen/edit-clear-history.png rename to src/icons/oxygen/edit-clear-history.png diff --git a/src/Icons/oxygen/edit-clear.png b/src/icons/oxygen/edit-clear.png similarity index 100% rename from src/Icons/oxygen/edit-clear.png rename to src/icons/oxygen/edit-clear.png diff --git a/src/Icons/oxygen/edit-copy.png b/src/icons/oxygen/edit-copy.png similarity index 100% rename from src/Icons/oxygen/edit-copy.png rename to src/icons/oxygen/edit-copy.png diff --git a/src/Icons/oxygen/edit-cut.png b/src/icons/oxygen/edit-cut.png similarity index 100% rename from src/Icons/oxygen/edit-cut.png rename to src/icons/oxygen/edit-cut.png diff --git a/src/Icons/oxygen/edit-delete.png b/src/icons/oxygen/edit-delete.png similarity index 100% rename from src/Icons/oxygen/edit-delete.png rename to src/icons/oxygen/edit-delete.png diff --git a/src/Icons/oxygen/edit-find-user.png b/src/icons/oxygen/edit-find-user.png similarity index 100% rename from src/Icons/oxygen/edit-find-user.png rename to src/icons/oxygen/edit-find-user.png diff --git a/src/Icons/oxygen/edit-find.png b/src/icons/oxygen/edit-find.png similarity index 100% rename from src/Icons/oxygen/edit-find.png rename to src/icons/oxygen/edit-find.png diff --git a/src/Icons/oxygen/edit-paste.png b/src/icons/oxygen/edit-paste.png similarity index 100% rename from src/Icons/oxygen/edit-paste.png rename to src/icons/oxygen/edit-paste.png diff --git a/src/Icons/oxygen/edit-rename.png b/src/icons/oxygen/edit-rename.png similarity index 100% rename from src/Icons/oxygen/edit-rename.png rename to src/icons/oxygen/edit-rename.png diff --git a/src/Icons/oxygen/folder-documents.png b/src/icons/oxygen/folder-documents.png similarity index 100% rename from src/Icons/oxygen/folder-documents.png rename to src/icons/oxygen/folder-documents.png diff --git a/src/Icons/oxygen/folder-new.png b/src/icons/oxygen/folder-new.png similarity index 100% rename from src/Icons/oxygen/folder-new.png rename to src/icons/oxygen/folder-new.png diff --git a/src/Icons/oxygen/folder-remote.png b/src/icons/oxygen/folder-remote.png similarity index 100% rename from src/Icons/oxygen/folder-remote.png rename to src/icons/oxygen/folder-remote.png diff --git a/src/Icons/oxygen/gear.png b/src/icons/oxygen/gear.png similarity index 100% rename from src/Icons/oxygen/gear.png rename to src/icons/oxygen/gear.png diff --git a/src/Icons/oxygen/gear32.png b/src/icons/oxygen/gear32.png similarity index 100% rename from src/Icons/oxygen/gear32.png rename to src/icons/oxygen/gear32.png diff --git a/src/Icons/oxygen/go-bottom.png b/src/icons/oxygen/go-bottom.png similarity index 100% rename from src/Icons/oxygen/go-bottom.png rename to src/icons/oxygen/go-bottom.png diff --git a/src/Icons/oxygen/go-down.png b/src/icons/oxygen/go-down.png similarity index 100% rename from src/Icons/oxygen/go-down.png rename to src/icons/oxygen/go-down.png diff --git a/src/Icons/oxygen/go-top.png b/src/icons/oxygen/go-top.png similarity index 100% rename from src/Icons/oxygen/go-top.png rename to src/icons/oxygen/go-top.png diff --git a/src/Icons/oxygen/go-up.png b/src/icons/oxygen/go-up.png similarity index 100% rename from src/Icons/oxygen/go-up.png rename to src/icons/oxygen/go-up.png diff --git a/src/Icons/oxygen/help-about.png b/src/icons/oxygen/help-about.png similarity index 100% rename from src/Icons/oxygen/help-about.png rename to src/icons/oxygen/help-about.png diff --git a/src/Icons/oxygen/help-contents.png b/src/icons/oxygen/help-contents.png similarity index 100% rename from src/Icons/oxygen/help-contents.png rename to src/icons/oxygen/help-contents.png diff --git a/src/Icons/oxygen/inode-directory.png b/src/icons/oxygen/inode-directory.png similarity index 100% rename from src/Icons/oxygen/inode-directory.png rename to src/icons/oxygen/inode-directory.png diff --git a/src/Icons/oxygen/insert-link.png b/src/icons/oxygen/insert-link.png similarity index 100% rename from src/Icons/oxygen/insert-link.png rename to src/icons/oxygen/insert-link.png diff --git a/src/Icons/oxygen/list-add.png b/src/icons/oxygen/list-add.png similarity index 100% rename from src/Icons/oxygen/list-add.png rename to src/icons/oxygen/list-add.png diff --git a/src/Icons/oxygen/list-remove.png b/src/icons/oxygen/list-remove.png similarity index 100% rename from src/Icons/oxygen/list-remove.png rename to src/icons/oxygen/list-remove.png diff --git a/src/Icons/oxygen/mail-folder-inbox.png b/src/icons/oxygen/mail-folder-inbox.png similarity index 100% rename from src/Icons/oxygen/mail-folder-inbox.png rename to src/icons/oxygen/mail-folder-inbox.png diff --git a/src/Icons/oxygen/mail-mark-read.png b/src/icons/oxygen/mail-mark-read.png similarity index 100% rename from src/Icons/oxygen/mail-mark-read.png rename to src/icons/oxygen/mail-mark-read.png diff --git a/src/Icons/oxygen/media-playback-pause.png b/src/icons/oxygen/media-playback-pause.png similarity index 100% rename from src/Icons/oxygen/media-playback-pause.png rename to src/icons/oxygen/media-playback-pause.png diff --git a/src/Icons/oxygen/media-playback-start.png b/src/icons/oxygen/media-playback-start.png similarity index 100% rename from src/Icons/oxygen/media-playback-start.png rename to src/icons/oxygen/media-playback-start.png diff --git a/src/Icons/oxygen/network-server.png b/src/icons/oxygen/network-server.png similarity index 100% rename from src/Icons/oxygen/network-server.png rename to src/icons/oxygen/network-server.png diff --git a/src/Icons/oxygen/network-wired.png b/src/icons/oxygen/network-wired.png similarity index 100% rename from src/Icons/oxygen/network-wired.png rename to src/icons/oxygen/network-wired.png diff --git a/src/Icons/oxygen/object-locked.png b/src/icons/oxygen/object-locked.png similarity index 100% rename from src/Icons/oxygen/object-locked.png rename to src/icons/oxygen/object-locked.png diff --git a/src/Icons/oxygen/preferences-desktop.png b/src/icons/oxygen/preferences-desktop.png similarity index 100% rename from src/Icons/oxygen/preferences-desktop.png rename to src/icons/oxygen/preferences-desktop.png diff --git a/src/Icons/oxygen/preferences-other.png b/src/icons/oxygen/preferences-other.png similarity index 100% rename from src/Icons/oxygen/preferences-other.png rename to src/icons/oxygen/preferences-other.png diff --git a/src/Icons/oxygen/preferences-system-network.png b/src/icons/oxygen/preferences-system-network.png similarity index 100% rename from src/Icons/oxygen/preferences-system-network.png rename to src/icons/oxygen/preferences-system-network.png diff --git a/src/Icons/oxygen/preferences-system.png b/src/icons/oxygen/preferences-system.png similarity index 100% rename from src/Icons/oxygen/preferences-system.png rename to src/icons/oxygen/preferences-system.png diff --git a/src/Icons/oxygen/preferences-web-browser-cookies.png b/src/icons/oxygen/preferences-web-browser-cookies.png similarity index 100% rename from src/Icons/oxygen/preferences-web-browser-cookies.png rename to src/icons/oxygen/preferences-web-browser-cookies.png diff --git a/src/Icons/oxygen/security-high.png b/src/icons/oxygen/security-high.png similarity index 100% rename from src/Icons/oxygen/security-high.png rename to src/icons/oxygen/security-high.png diff --git a/src/Icons/oxygen/security-low.png b/src/icons/oxygen/security-low.png similarity index 100% rename from src/Icons/oxygen/security-low.png rename to src/icons/oxygen/security-low.png diff --git a/src/Icons/oxygen/services.png b/src/icons/oxygen/services.png similarity index 100% rename from src/Icons/oxygen/services.png rename to src/icons/oxygen/services.png diff --git a/src/Icons/oxygen/system-log-out.png b/src/icons/oxygen/system-log-out.png similarity index 100% rename from src/Icons/oxygen/system-log-out.png rename to src/icons/oxygen/system-log-out.png diff --git a/src/Icons/oxygen/tab-close.png b/src/icons/oxygen/tab-close.png similarity index 100% rename from src/Icons/oxygen/tab-close.png rename to src/icons/oxygen/tab-close.png diff --git a/src/Icons/oxygen/task-attention.png b/src/icons/oxygen/task-attention.png similarity index 100% rename from src/Icons/oxygen/task-attention.png rename to src/icons/oxygen/task-attention.png diff --git a/src/Icons/oxygen/text-plain.png b/src/icons/oxygen/text-plain.png similarity index 100% rename from src/Icons/oxygen/text-plain.png rename to src/icons/oxygen/text-plain.png diff --git a/src/Icons/oxygen/tools-report-bug.png b/src/icons/oxygen/tools-report-bug.png similarity index 100% rename from src/Icons/oxygen/tools-report-bug.png rename to src/icons/oxygen/tools-report-bug.png diff --git a/src/Icons/oxygen/unavailable.png b/src/icons/oxygen/unavailable.png similarity index 100% rename from src/Icons/oxygen/unavailable.png rename to src/icons/oxygen/unavailable.png diff --git a/src/Icons/oxygen/user-group-delete.png b/src/icons/oxygen/user-group-delete.png similarity index 100% rename from src/Icons/oxygen/user-group-delete.png rename to src/icons/oxygen/user-group-delete.png diff --git a/src/Icons/oxygen/user-group-new.png b/src/icons/oxygen/user-group-new.png similarity index 100% rename from src/Icons/oxygen/user-group-new.png rename to src/icons/oxygen/user-group-new.png diff --git a/src/Icons/oxygen/view-calendar-journal.png b/src/icons/oxygen/view-calendar-journal.png similarity index 100% rename from src/Icons/oxygen/view-calendar-journal.png rename to src/icons/oxygen/view-calendar-journal.png diff --git a/src/Icons/oxygen/view-categories.png b/src/icons/oxygen/view-categories.png similarity index 100% rename from src/Icons/oxygen/view-categories.png rename to src/icons/oxygen/view-categories.png diff --git a/src/Icons/oxygen/view-filter.png b/src/icons/oxygen/view-filter.png similarity index 100% rename from src/Icons/oxygen/view-filter.png rename to src/icons/oxygen/view-filter.png diff --git a/src/Icons/oxygen/view-preview.png b/src/icons/oxygen/view-preview.png similarity index 100% rename from src/Icons/oxygen/view-preview.png rename to src/icons/oxygen/view-preview.png diff --git a/src/Icons/oxygen/view-refresh.png b/src/icons/oxygen/view-refresh.png similarity index 100% rename from src/Icons/oxygen/view-refresh.png rename to src/icons/oxygen/view-refresh.png diff --git a/src/Icons/oxygen/view-statistics.png b/src/icons/oxygen/view-statistics.png similarity index 100% rename from src/Icons/oxygen/view-statistics.png rename to src/icons/oxygen/view-statistics.png diff --git a/src/Icons/oxygen/wallet-open.png b/src/icons/oxygen/wallet-open.png similarity index 100% rename from src/Icons/oxygen/wallet-open.png rename to src/icons/oxygen/wallet-open.png diff --git a/src/Icons/oxygen/webui.png b/src/icons/oxygen/webui.png similarity index 100% rename from src/Icons/oxygen/webui.png rename to src/icons/oxygen/webui.png diff --git a/src/Icons/qBittorrent.desktop b/src/icons/qBittorrent.desktop similarity index 100% rename from src/Icons/qBittorrent.desktop rename to src/icons/qBittorrent.desktop diff --git a/src/menuicons/192x192/apps/qbittorrent.png b/src/icons/qbittorrent.png similarity index 100% rename from src/menuicons/192x192/apps/qbittorrent.png rename to src/icons/qbittorrent.png diff --git a/src/Icons/skin/arrow-right.gif b/src/icons/skin/arrow-right.gif similarity index 100% rename from src/Icons/skin/arrow-right.gif rename to src/icons/skin/arrow-right.gif diff --git a/src/Icons/skin/bg-dropdown.gif b/src/icons/skin/bg-dropdown.gif similarity index 100% rename from src/Icons/skin/bg-dropdown.gif rename to src/icons/skin/bg-dropdown.gif diff --git a/src/Icons/skin/bg-handle-horizontal.gif b/src/icons/skin/bg-handle-horizontal.gif similarity index 100% rename from src/Icons/skin/bg-handle-horizontal.gif rename to src/icons/skin/bg-handle-horizontal.gif diff --git a/src/Icons/skin/bg-header.gif b/src/icons/skin/bg-header.gif similarity index 100% rename from src/Icons/skin/bg-header.gif rename to src/icons/skin/bg-header.gif diff --git a/src/Icons/skin/bg-panel-header.gif b/src/icons/skin/bg-panel-header.gif similarity index 100% rename from src/Icons/skin/bg-panel-header.gif rename to src/icons/skin/bg-panel-header.gif diff --git a/src/Icons/skin/checking.png b/src/icons/skin/checking.png similarity index 100% rename from src/Icons/skin/checking.png rename to src/icons/skin/checking.png diff --git a/src/Icons/skin/collapse-expand.gif b/src/icons/skin/collapse-expand.gif similarity index 100% rename from src/Icons/skin/collapse-expand.gif rename to src/icons/skin/collapse-expand.gif diff --git a/src/Icons/skin/connected.png b/src/icons/skin/connected.png similarity index 100% rename from src/Icons/skin/connected.png rename to src/icons/skin/connected.png diff --git a/src/Icons/skin/disconnected.png b/src/icons/skin/disconnected.png similarity index 100% rename from src/Icons/skin/disconnected.png rename to src/icons/skin/disconnected.png diff --git a/src/Icons/skin/dock-tabs.gif b/src/icons/skin/dock-tabs.gif similarity index 100% rename from src/Icons/skin/dock-tabs.gif rename to src/icons/skin/dock-tabs.gif diff --git a/src/Icons/skin/download.png b/src/icons/skin/download.png similarity index 100% rename from src/Icons/skin/download.png rename to src/icons/skin/download.png diff --git a/src/Icons/skin/downloading.png b/src/icons/skin/downloading.png similarity index 100% rename from src/Icons/skin/downloading.png rename to src/icons/skin/downloading.png diff --git a/src/Icons/skin/error.png b/src/icons/skin/error.png similarity index 100% rename from src/Icons/skin/error.png rename to src/icons/skin/error.png diff --git a/src/Icons/skin/filteractive.png b/src/icons/skin/filteractive.png similarity index 100% rename from src/Icons/skin/filteractive.png rename to src/icons/skin/filteractive.png diff --git a/src/Icons/skin/filterall.png b/src/icons/skin/filterall.png similarity index 100% rename from src/Icons/skin/filterall.png rename to src/icons/skin/filterall.png diff --git a/src/Icons/skin/filterinactive.png b/src/icons/skin/filterinactive.png similarity index 100% rename from src/Icons/skin/filterinactive.png rename to src/icons/skin/filterinactive.png diff --git a/src/Icons/skin/firewalled.png b/src/icons/skin/firewalled.png similarity index 100% rename from src/Icons/skin/firewalled.png rename to src/icons/skin/firewalled.png diff --git a/src/Icons/skin/handle-icon-horizontal.gif b/src/icons/skin/handle-icon-horizontal.gif similarity index 100% rename from src/Icons/skin/handle-icon-horizontal.gif rename to src/icons/skin/handle-icon-horizontal.gif diff --git a/src/Icons/skin/handle-icon.gif b/src/icons/skin/handle-icon.gif similarity index 100% rename from src/Icons/skin/handle-icon.gif rename to src/icons/skin/handle-icon.gif diff --git a/src/Icons/skin/knob.gif b/src/icons/skin/knob.gif similarity index 100% rename from src/Icons/skin/knob.gif rename to src/icons/skin/knob.gif diff --git a/src/Icons/skin/logo-blank.gif b/src/icons/skin/logo-blank.gif similarity index 100% rename from src/Icons/skin/logo-blank.gif rename to src/icons/skin/logo-blank.gif diff --git a/src/Icons/skin/logo.gif b/src/icons/skin/logo.gif similarity index 100% rename from src/Icons/skin/logo.gif rename to src/icons/skin/logo.gif diff --git a/src/Icons/skin/logo2.gif b/src/icons/skin/logo2.gif similarity index 100% rename from src/Icons/skin/logo2.gif rename to src/icons/skin/logo2.gif diff --git a/src/Icons/skin/mascot.png b/src/icons/skin/mascot.png similarity index 100% rename from src/Icons/skin/mascot.png rename to src/icons/skin/mascot.png diff --git a/src/Icons/skin/paused.png b/src/icons/skin/paused.png similarity index 100% rename from src/Icons/skin/paused.png rename to src/icons/skin/paused.png diff --git a/src/Icons/skin/qbittorrent16.png b/src/icons/skin/qbittorrent16.png similarity index 100% rename from src/Icons/skin/qbittorrent16.png rename to src/icons/skin/qbittorrent16.png diff --git a/src/Icons/skin/qbittorrent22.png b/src/icons/skin/qbittorrent22.png similarity index 100% rename from src/Icons/skin/qbittorrent22.png rename to src/icons/skin/qbittorrent22.png diff --git a/src/Icons/skin/qbittorrent32.png b/src/icons/skin/qbittorrent32.png similarity index 100% rename from src/Icons/skin/qbittorrent32.png rename to src/icons/skin/qbittorrent32.png diff --git a/src/Icons/skin/qbittorrent_mono.svg b/src/icons/skin/qbittorrent_mono.svg similarity index 100% rename from src/Icons/skin/qbittorrent_mono.svg rename to src/icons/skin/qbittorrent_mono.svg diff --git a/src/Icons/skin/qbittorrent_mono_dark.png b/src/icons/skin/qbittorrent_mono_dark.png similarity index 100% rename from src/Icons/skin/qbittorrent_mono_dark.png rename to src/icons/skin/qbittorrent_mono_dark.png diff --git a/src/Icons/skin/qbittorrent_mono_light.png b/src/icons/skin/qbittorrent_mono_light.png similarity index 100% rename from src/Icons/skin/qbittorrent_mono_light.png rename to src/icons/skin/qbittorrent_mono_light.png diff --git a/src/Icons/skin/queued.png b/src/icons/skin/queued.png similarity index 100% rename from src/Icons/skin/queued.png rename to src/icons/skin/queued.png diff --git a/src/Icons/skin/ratio.png b/src/icons/skin/ratio.png similarity index 100% rename from src/Icons/skin/ratio.png rename to src/icons/skin/ratio.png diff --git a/src/Icons/skin/resumed.png b/src/icons/skin/resumed.png similarity index 100% rename from src/Icons/skin/resumed.png rename to src/icons/skin/resumed.png diff --git a/src/Icons/skin/seeding.png b/src/icons/skin/seeding.png similarity index 100% rename from src/Icons/skin/seeding.png rename to src/icons/skin/seeding.png diff --git a/src/Icons/skin/slider-area.gif b/src/icons/skin/slider-area.gif similarity index 100% rename from src/Icons/skin/slider-area.gif rename to src/icons/skin/slider-area.gif diff --git a/src/Icons/skin/spacer.gif b/src/icons/skin/spacer.gif similarity index 100% rename from src/Icons/skin/spacer.gif rename to src/icons/skin/spacer.gif diff --git a/src/Icons/skin/spinner-placeholder.gif b/src/icons/skin/spinner-placeholder.gif similarity index 100% rename from src/Icons/skin/spinner-placeholder.gif rename to src/icons/skin/spinner-placeholder.gif diff --git a/src/Icons/skin/spinner.gif b/src/icons/skin/spinner.gif similarity index 100% rename from src/Icons/skin/spinner.gif rename to src/icons/skin/spinner.gif diff --git a/src/Icons/skin/splash.png b/src/icons/skin/splash.png similarity index 100% rename from src/Icons/skin/splash.png rename to src/icons/skin/splash.png diff --git a/src/Icons/skin/stalledDL.png b/src/icons/skin/stalledDL.png similarity index 100% rename from src/Icons/skin/stalledDL.png rename to src/icons/skin/stalledDL.png diff --git a/src/Icons/skin/stalledUP.png b/src/icons/skin/stalledUP.png similarity index 100% rename from src/Icons/skin/stalledUP.png rename to src/icons/skin/stalledUP.png diff --git a/src/Icons/skin/tabs.gif b/src/icons/skin/tabs.gif similarity index 100% rename from src/Icons/skin/tabs.gif rename to src/icons/skin/tabs.gif diff --git a/src/Icons/skin/toolbox-divider.gif b/src/icons/skin/toolbox-divider.gif similarity index 100% rename from src/Icons/skin/toolbox-divider.gif rename to src/icons/skin/toolbox-divider.gif diff --git a/src/Icons/skin/toolbox-divider2.gif b/src/icons/skin/toolbox-divider2.gif similarity index 100% rename from src/Icons/skin/toolbox-divider2.gif rename to src/icons/skin/toolbox-divider2.gif diff --git a/src/Icons/skin/uploading.png b/src/icons/skin/uploading.png similarity index 100% rename from src/Icons/skin/uploading.png rename to src/icons/skin/uploading.png diff --git a/src/Icons/slow.png b/src/icons/slow.png similarity index 100% rename from src/Icons/slow.png rename to src/icons/slow.png diff --git a/src/Icons/slow_off.png b/src/icons/slow_off.png similarity index 100% rename from src/Icons/slow_off.png rename to src/icons/slow_off.png diff --git a/src/Icons/sphere.png b/src/icons/sphere.png similarity index 100% rename from src/Icons/sphere.png rename to src/icons/sphere.png diff --git a/src/Icons/sphere2.png b/src/icons/sphere2.png similarity index 100% rename from src/Icons/sphere2.png rename to src/icons/sphere2.png diff --git a/src/Icons/url.png b/src/icons/url.png similarity index 100% rename from src/Icons/url.png rename to src/icons/url.png diff --git a/src/preferences/preferences.pri b/src/preferences/preferences.pri deleted file mode 100644 index 7b9c3e777..000000000 --- a/src/preferences/preferences.pri +++ /dev/null @@ -1,15 +0,0 @@ -INCLUDEPATH += $$PWD - -!contains(DEFINES, DISABLE_GUI) { - - HEADERS += $$PWD/options_imp.h \ - $$PWD/advancedsettings.h - - SOURCES += $$PWD/options_imp.cpp - - FORMS += $$PWD/options.ui -} - -HEADERS += $$PWD/preferences.h - -SOURCES += $$PWD/preferences.cpp diff --git a/src/src.pro b/src/src.pro index 17fc838a5..902b0231a 100644 --- a/src/src.pro +++ b/src/src.pro @@ -3,52 +3,44 @@ TEMPLATE = app CONFIG += qt thread # Windows specific configuration -win32 { - include(../winconf.pri) -} +win32: include(../winconf.pri) # Mac specific configuration -macx { - include(../macxconf.pri) -} +macx: include(../macxconf.pri) # Unix specific configuration -unix:!macx { - include(../unixconf.pri) -} +unix:!macx: include(../unixconf.pri) # eCS(OS/2) specific configuration -os2 { - include(../os2conf.pri) -} +os2: include(../os2conf.pri) -nox { - QT -= gui - TARGET = qbittorrent-nox - DEFINES += DISABLE_GUI +nogui { + QT -= gui + DEFINES += DISABLE_GUI + TARGET = qbittorrent-nox } else { - QT += xml - CONFIG(static) { - DEFINES += QBT_STATIC_QT - QTPLUGIN += qico - } - TARGET = qbittorrent + QT += xml + CONFIG(static) { + DEFINES += QBT_STATIC_QT + QTPLUGIN += qico + } + TARGET = qbittorrent } +nowebui: DEFINES += DISABLE_WEBUI +strace_win: DEFINES += STACKTRACE_WIN QT += network - greaterThan(QT_MAJOR_VERSION, 4): QT += widgets # Vars LANG_PATH = lang -ICONS_PATH = Icons -CONFIG(debug, debug|release):message(Project is built in DEBUG mode.) -CONFIG(release, debug|release):message(Project is built in RELEASE mode.) +CONFIG(debug, debug|release): message(Project is built in DEBUG mode.) +CONFIG(release, debug|release): message(Project is built in RELEASE mode.) # Disable debug output in release mode CONFIG(release, debug|release) { - message(Disabling debug output.) - DEFINES += QT_NO_DEBUG_OUTPUT + message(Disabling debug output.) + DEFINES += QT_NO_DEBUG_OUTPUT } # VERSION DEFINES @@ -62,208 +54,59 @@ DEFINES += QT_USE_FAST_CONCATENATION QT_USE_FAST_OPERATOR_PLUS # filesystem v3 is the default. DEFINES += BOOST_FILESYSTEM_VERSION=2 -INCLUDEPATH += $$PWD +win32: DEFINES += NOMINMAX +include(app/app.pri) +include(core/core.pri) +!nowebui: include(webui/webui.pri) +!nogui: include(gui/gui.pri) # Resource files -RESOURCES += icons.qrc \ - lang.qrc \ - about.qrc - -# Source code -usesystemqtsingleapplication { - nox { - CONFIG += qtsinglecoreapplication - } else { - CONFIG += qtsingleapplication - } -} else { - nox { - include(qtsingleapp/qtsinglecoreapplication.pri) - } else { - include(qtsingleapp/qtsingleapplication.pri) - } -} - -include(qtlibtorrent/qtlibtorrent.pri) -include(webui/webui.pri) -include(tracker/tracker.pri) -include(preferences/preferences.pri) - -!nox { - include(lineedit/lineedit.pri) - include(properties/properties.pri) - include(searchengine/searchengine.pri) - include(rss/rss.pri) - include(torrentcreator/torrentcreator.pri) - include(geoip/geoip.pri) - include(powermanagement/powermanagement.pri) -} - -HEADERS += misc.h \ - fs_utils.h \ - downloadthread.h \ - stacktrace.h \ - torrentpersistentdata.h \ - filesystemwatcher.h \ - scannedfoldersmodel.h \ - qinisettings.h \ - smtp.h \ - dnsupdater.h \ - application.h \ - logger.h +RESOURCES += \ + icons.qrc \ + lang.qrc -SOURCES += main.cpp \ - downloadthread.cpp \ - scannedfoldersmodel.cpp \ - torrentpersistentdata.cpp \ - misc.cpp \ - fs_utils.cpp \ - smtp.cpp \ - dnsupdater.cpp \ - application.cpp \ - logger.cpp - -nox { - HEADERS += headlessloader.h -} else { - HEADERS += mainwindow.h\ - transferlistwidget.h \ - transferlistdelegate.h \ - transferlistfilterswidget.h \ - transferlistsortmodel.h \ - torrentcontentmodel.h \ - torrentcontentmodelitem.h \ - torrentcontentmodelfolder.h \ - torrentcontentmodelfile.h \ - torrentcontentfiltermodel.h \ - torrentcontenttreeview.h \ - deletionconfirmationdlg.h \ - statusbar.h \ - reverseresolution.h \ - ico.h \ - speedlimitdlg.h \ - about_imp.h \ - previewselect.h \ - previewlistdelegate.h \ - downloadfromurldlg.h \ - trackerlogin.h \ - hidabletabwidget.h \ - sessionapplication.h \ - torrentimportdlg.h \ - executionlog.h \ - iconprovider.h \ - updownratiodlg.h \ - loglistwidget.h \ - addnewtorrentdialog.h \ - autoexpandabledialog.h \ - statsdialog.h \ - messageboxraised.h \ - torrentfilterenum.h - - SOURCES += mainwindow.cpp \ - ico.cpp \ - transferlistwidget.cpp \ - transferlistsortmodel.cpp \ - transferlistdelegate.cpp \ - transferlistfilterswidget.cpp \ - torrentcontentmodel.cpp \ - torrentcontentmodelitem.cpp \ - torrentcontentmodelfolder.cpp \ - torrentcontentmodelfile.cpp \ - torrentcontentfiltermodel.cpp \ - torrentcontenttreeview.cpp \ - sessionapplication.cpp \ - torrentimportdlg.cpp \ - executionlog.cpp \ - previewselect.cpp \ - iconprovider.cpp \ - updownratiodlg.cpp \ - loglistwidget.cpp \ - addnewtorrentdialog.cpp \ - autoexpandabledialog.cpp \ - statsdialog.cpp \ - messageboxraised.cpp \ - statusbar.cpp \ - trackerlogin.cpp \ - speedlimitdlg.cpp - - win32 { - HEADERS += programupdater.h - SOURCES += programupdater.cpp - DEFINES += NOMINMAX - } - - macx { - HEADERS += qmacapplication.h \ - programupdater.h - - SOURCES += qmacapplication.cpp \ - programupdater.cpp - } - - FORMS += mainwindow.ui \ - about.ui \ - preview.ui \ - login.ui \ - downloadfromurldlg.ui \ - bandwidth_limit.ui \ - updownratiodlg.ui \ - confirmdeletiondlg.ui \ - torrentimportdlg.ui \ - executionlog.ui \ - addnewtorrentdialog.ui \ - autoexpandabledialog.ui \ - statsdialog.ui -} +# Translations +TRANSLATIONS = \ + $$LANG_PATH/qbittorrent_fr.ts \ + $$LANG_PATH/qbittorrent_zh.ts \ + $$LANG_PATH/qbittorrent_zh_TW.ts \ + $$LANG_PATH/qbittorrent_en.ts \ + $$LANG_PATH/qbittorrent_en_AU.ts \ + $$LANG_PATH/qbittorrent_en_GB.ts \ + $$LANG_PATH/qbittorrent_ca.ts \ + $$LANG_PATH/qbittorrent_es.ts \ + $$LANG_PATH/qbittorrent_pl.ts \ + $$LANG_PATH/qbittorrent_ko.ts \ + $$LANG_PATH/qbittorrent_de.ts \ + $$LANG_PATH/qbittorrent_nl.ts \ + $$LANG_PATH/qbittorrent_tr.ts \ + $$LANG_PATH/qbittorrent_sv.ts \ + $$LANG_PATH/qbittorrent_el.ts \ + $$LANG_PATH/qbittorrent_ru.ts \ + $$LANG_PATH/qbittorrent_uk.ts \ + $$LANG_PATH/qbittorrent_bg.ts \ + $$LANG_PATH/qbittorrent_it.ts \ + $$LANG_PATH/qbittorrent_sk.ts \ + $$LANG_PATH/qbittorrent_ro.ts \ + $$LANG_PATH/qbittorrent_pt.ts \ + $$LANG_PATH/qbittorrent_nb.ts \ + $$LANG_PATH/qbittorrent_fi.ts \ + $$LANG_PATH/qbittorrent_da.ts \ + $$LANG_PATH/qbittorrent_ja.ts \ + $$LANG_PATH/qbittorrent_hu.ts \ + $$LANG_PATH/qbittorrent_pt_BR.ts \ + $$LANG_PATH/qbittorrent_cs.ts \ + $$LANG_PATH/qbittorrent_sr.ts \ + $$LANG_PATH/qbittorrent_ar.ts \ + $$LANG_PATH/qbittorrent_hr.ts \ + $$LANG_PATH/qbittorrent_gl.ts \ + $$LANG_PATH/qbittorrent_hy.ts \ + $$LANG_PATH/qbittorrent_lt.ts \ + $$LANG_PATH/qbittorrent_ka.ts \ + $$LANG_PATH/qbittorrent_be.ts \ + $$LANG_PATH/qbittorrent_eu.ts \ + $$LANG_PATH/qbittorrent_he.ts \ + $$LANG_PATH/qbittorrent_vi.ts DESTDIR = . - -# OS specific config -OTHER_FILES += ../winconf.pri ../macxconf.pri ../unixconf.pri ../os2conf.pri -# compiler specific config -OTHER_FILES += ../winconf-mingw.pri ../winconf-msvc.pri -# version file -OTHER_FILES += ../version.pri - -# Translations -TRANSLATIONS = $$LANG_PATH/qbittorrent_fr.ts \ - $$LANG_PATH/qbittorrent_zh.ts \ - $$LANG_PATH/qbittorrent_zh_TW.ts \ - $$LANG_PATH/qbittorrent_en.ts \ - $$LANG_PATH/qbittorrent_en_AU.ts \ - $$LANG_PATH/qbittorrent_en_GB.ts \ - $$LANG_PATH/qbittorrent_ca.ts \ - $$LANG_PATH/qbittorrent_es.ts \ - $$LANG_PATH/qbittorrent_pl.ts \ - $$LANG_PATH/qbittorrent_ko.ts \ - $$LANG_PATH/qbittorrent_de.ts \ - $$LANG_PATH/qbittorrent_nl.ts \ - $$LANG_PATH/qbittorrent_tr.ts \ - $$LANG_PATH/qbittorrent_sv.ts \ - $$LANG_PATH/qbittorrent_el.ts \ - $$LANG_PATH/qbittorrent_ru.ts \ - $$LANG_PATH/qbittorrent_uk.ts \ - $$LANG_PATH/qbittorrent_bg.ts \ - $$LANG_PATH/qbittorrent_it.ts \ - $$LANG_PATH/qbittorrent_sk.ts \ - $$LANG_PATH/qbittorrent_ro.ts \ - $$LANG_PATH/qbittorrent_pt.ts \ - $$LANG_PATH/qbittorrent_nb.ts \ - $$LANG_PATH/qbittorrent_fi.ts \ - $$LANG_PATH/qbittorrent_da.ts \ - $$LANG_PATH/qbittorrent_ja.ts \ - $$LANG_PATH/qbittorrent_hu.ts \ - $$LANG_PATH/qbittorrent_pt_BR.ts \ - $$LANG_PATH/qbittorrent_cs.ts \ - $$LANG_PATH/qbittorrent_sr.ts \ - $$LANG_PATH/qbittorrent_ar.ts \ - $$LANG_PATH/qbittorrent_hr.ts \ - $$LANG_PATH/qbittorrent_gl.ts \ - $$LANG_PATH/qbittorrent_hy.ts \ - $$LANG_PATH/qbittorrent_lt.ts \ - $$LANG_PATH/qbittorrent_ka.ts \ - $$LANG_PATH/qbittorrent_be.ts \ - $$LANG_PATH/qbittorrent_eu.ts \ - $$LANG_PATH/qbittorrent_he.ts \ - $$LANG_PATH/qbittorrent_vi.ts diff --git a/src/update_qrc_files.py b/src/update_qrc_files.py index 813ff1a05..8fda40e4e 100755 --- a/src/update_qrc_files.py +++ b/src/update_qrc_files.py @@ -45,7 +45,7 @@ lang_file.write(output) lang_file.close() # update search_engine directory -os.chdir('searchengine') +os.chdir('gui/searchengine') search_list = [] for nova_folder in ['nova/', 'nova3']: for root, dirs, files in os.walk(nova_folder): @@ -67,11 +67,11 @@ search_file = open('search.qrc', 'w') search_file.write(output) search_file.close() -os.chdir('..'); +os.chdir('../..'); # update icons files directory icons_list = [] -for root, dirs, files in os.walk('Icons'): +for root, dirs, files in os.walk('icons'): if 'skin_unused' in dirs: dirs.remove('skin_unused') for file in files: diff --git a/src/webui/requesthandler.cpp b/src/webui/requesthandler.cpp index 8f7eaf068..595eb5382 100644 --- a/src/webui/requesthandler.cpp +++ b/src/webui/requesthandler.cpp @@ -145,7 +145,7 @@ void RequestHandler::action_public_index() if (!args_.isEmpty()) { if (args_.back() == "favicon.ico") - path = ":/Icons/skin/qbittorrent16.png"; + path = ":/icons/skin/qbittorrent16.png"; else path = WWW_FOLDER + args_.join("/"); } @@ -198,7 +198,7 @@ void RequestHandler::action_public_theme() } #ifdef DISABLE_GUI - QString url = ":/Icons/oxygen/" + args_.front() + ".png"; + QString url = ":/icons/oxygen/" + args_.front() + ".png"; #else QString url = IconProvider::instance()->getIconPath(args_.front()); #endif @@ -210,7 +210,7 @@ void RequestHandler::action_public_theme() void RequestHandler::action_public_images() { - const QString path = ":/Icons/" + args_.join("/"); + const QString path = ":/icons/" + args_.join("/"); printFile(path); header(HEADER_CACHE_CONTROL, MAX_AGE_MONTH); } diff --git a/src/webui/webui.pri b/src/webui/webui.pri index 26c009443..ba94e2297 100644 --- a/src/webui/webui.pri +++ b/src/webui/webui.pri @@ -2,12 +2,9 @@ INCLUDEPATH += $$PWD HEADERS += $$PWD/httpserver.h \ $$PWD/httpconnection.h \ - $$PWD/httprequestparser.h \ - $$PWD/httpresponsegenerator.h \ $$PWD/btjson.h \ $$PWD/prefjson.h \ $$PWD/jsonutils.h \ - $$PWD/httptypes.h \ $$PWD/extra_translations.h \ $$PWD/webapplication.h \ $$PWD/abstractrequesthandler.h \ diff --git a/unixconf.pri b/unixconf.pri index 6e1cfffa9..a93f50c93 100644 --- a/unixconf.pri +++ b/unixconf.pri @@ -10,17 +10,17 @@ exists($$OUT_PWD/../conf.pri) { } # COMPILATION SPECIFIC -!nox:dbus { - QT += dbus +!nogui:dbus { + QT += dbus } QMAKE_CXXFLAGS += -Wformat -Wformat-security !haiku { - QMAKE_LFLAGS_APP += -rdynamic + QMAKE_LFLAGS_APP += -rdynamic } # Man page -nox { +nogui { man.files = ../doc/qbittorrent-nox.1 } else { man.files = ../doc/qbittorrent.1 @@ -29,62 +29,61 @@ nox { man.path = $$MANPREFIX/man1 INSTALLS += man +DIST_PATH = ../dist/unix + # Menu Icon -!nox { - menuicon.files = Icons/qBittorrent.desktop - menuicon.path = $$PREFIX/share/applications/ - INSTALLS += menuicon - icon16.files = menuicons/16x16/apps/qbittorrent.png - icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps/ - icon22.files = menuicons/22x22/apps/qbittorrent.png - icon22.path = $$PREFIX/share/icons/hicolor/22x22/apps/ - icon24.files = menuicons/24x24/apps/qbittorrent.png - icon24.path = $$PREFIX/share/icons/hicolor/24x24/apps/ - icon32.files = menuicons/32x32/apps/qbittorrent.png - icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps/ - icon36.files = menuicons/36x36/apps/qbittorrent.png - icon36.path = $$PREFIX/share/icons/hicolor/36x36/apps/ - icon48.files = menuicons/48x48/apps/qbittorrent.png - icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps/ - icon64.files = menuicons/64x64/apps/qbittorrent.png - icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps/ - icon72.files = menuicons/72x72/apps/qbittorrent.png - icon72.path = $$PREFIX/share/icons/hicolor/72x72/apps/ - icon96.files = menuicons/96x96/apps/qbittorrent.png - icon96.path = $$PREFIX/share/icons/hicolor/96x96/apps/ - icon128.files = menuicons/128x128/apps/qbittorrent.png - icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps/ - icon192.files = menuicons/192x192/apps/qbittorrent.png - icon192.path = $$PREFIX/share/icons/hicolor/192x192/apps/ +!nogui { + menuicon.files = icons/qBittorrent.desktop + menuicon.path = $$PREFIX/share/applications/ + INSTALLS += menuicon - INSTALLS += icon16 \ - icon22 \ - icon24 \ - icon32 \ - icon36 \ - icon48 \ - icon64 \ - icon72 \ - icon96 \ - icon128 \ - icon192 + icon16.files = $$DIST_PATH/menuicons/16x16/apps/qbittorrent.png + icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps/ + icon22.files = $$DIST_PATH/menuicons/22x22/apps/qbittorrent.png + icon22.path = $$PREFIX/share/icons/hicolor/22x22/apps/ + icon24.files = $$DIST_PATH/menuicons/24x24/apps/qbittorrent.png + icon24.path = $$PREFIX/share/icons/hicolor/24x24/apps/ + icon32.files = $$DIST_PATH/menuicons/32x32/apps/qbittorrent.png + icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps/ + icon36.files = $$DIST_PATH/menuicons/36x36/apps/qbittorrent.png + icon36.path = $$PREFIX/share/icons/hicolor/36x36/apps/ + icon48.files = $$DIST_PATH/menuicons/48x48/apps/qbittorrent.png + icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps/ + icon64.files = $$DIST_PATH/menuicons/64x64/apps/qbittorrent.png + icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps/ + icon72.files = $$DIST_PATH/menuicons/72x72/apps/qbittorrent.png + icon72.path = $$PREFIX/share/icons/hicolor/72x72/apps/ + icon96.files = $$DIST_PATH/menuicons/96x96/apps/qbittorrent.png + icon96.path = $$PREFIX/share/icons/hicolor/96x96/apps/ + icon128.files = $$DIST_PATH/menuicons/128x128/apps/qbittorrent.png + icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps/ + icon192.files = $$DIST_PATH/menuicons/192x192/apps/qbittorrent.png + icon192.path = $$PREFIX/share/icons/hicolor/192x192/apps/ + INSTALLS += \ + icon16 \ + icon22 \ + icon24 \ + icon32 \ + icon36 \ + icon48 \ + icon64 \ + icon72 \ + icon96 \ + icon128 \ + icon192 - pixmap.files = menuicons/128x128/apps/qbittorrent.png - pixmap.path = $$PREFIX/share/pixmaps/ - INSTALLS += pixmap + pixmap.files = $$DIST_PATH/menuicons/128x128/apps/qbittorrent.png + pixmap.path = $$PREFIX/share/pixmaps/ + INSTALLS += pixmap } # INSTALL target.path = $$PREFIX/bin/ INSTALLS += target -dbus { - include(src/qtnotify/qtnotify.pri) -} - -!nox { - # DEFINE added by configure - contains(DEFINES, WITH_GEOIP_EMBEDDED) { - message("You chose to embed GeoIP database in qBittorrent executable.") - } +!nogui { + # DEFINE added by configure + contains(DEFINES, WITH_GEOIP_EMBEDDED) { + message("You chose to embed GeoIP database in qBittorrent executable.") + } } diff --git a/winconf.pri b/winconf.pri index ec3b98fc1..0cc074f83 100644 --- a/winconf.pri +++ b/winconf.pri @@ -43,18 +43,11 @@ CONFIG(debug, debug|release) { #Enable backtrace support CONFIG += strace_win -strace_win:{ - DEFINES += STACKTRACE_WIN - FORMS += stacktrace_win_dlg.ui - HEADERS += stacktrace_win.h \ - stacktrace_win_dlg.h -} - win32-g++ { - include(winconf-mingw.pri) + include(winconf-mingw.pri) } else { - include(winconf-msvc.pri) + include(winconf-msvc.pri) } DEFINES += WITH_GEOIP_EMBEDDED From e52a8fb0b034e73516335f99a0cd875140a7ef5a Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Tue, 20 Jan 2015 17:54:41 +0300 Subject: [PATCH 2/9] Fix misc::getUserIDString() on Windows. Return current user name now (and not constant "0"). Also use Unicode version of GetUserName(). --- src/core/misc.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/misc.cpp b/src/core/misc.cpp index c11b68636..16995e322 100644 --- a/src/core/misc.cpp +++ b/src/core/misc.cpp @@ -444,10 +444,10 @@ QString misc::getUserIDString() { QString uid = "0"; #ifdef Q_OS_WIN - char buffer[UNLEN + 1] = {0}; - DWORD buffer_len = UNLEN + 1; - if (!GetUserNameA(buffer, &buffer_len)) - uid = QString(buffer); + WCHAR buffer[UNLEN + 1] = {0}; + DWORD buffer_len = sizeof(buffer)/sizeof(*buffer); + if (GetUserNameW(buffer, &buffer_len)) + uid = QString::fromWCharArray(buffer); #else uid = QString::number(getuid()); #endif From 2dd473eb284f2d6e70492790df9513983555db28 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Tue, 20 Jan 2015 18:00:37 +0300 Subject: [PATCH 3/9] Use unmodified QtSingleApplication on Windows. Get running application instance PID without QtSingleApplication modification. --- src/app/application.cpp | 47 +++++++++++++++---- src/app/application.h | 17 +++---- src/app/main.cpp | 12 +---- src/app/qtsingleapplication/qtlocalpeer.cpp | 47 ------------------- src/app/qtsingleapplication/qtlocalpeer.h | 3 -- .../qtsingleapplication.cpp | 6 --- .../qtsingleapplication/qtsingleapplication.h | 4 -- 7 files changed, 47 insertions(+), 89 deletions(-) diff --git a/src/app/application.cpp b/src/app/application.cpp index b547efeba..2d2e776c5 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -32,6 +32,10 @@ #include #include #include +#ifdef Q_OS_WIN +#include +#include +#endif #if (!defined(DISABLE_GUI) && defined(Q_OS_MAC)) #include @@ -41,11 +45,7 @@ #include "preferences.h" Application::Application(const QString &id, int &argc, char **argv) -#ifndef DISABLE_GUI - : SessionApplication(id, argc, argv) -#else - : QtSingleCoreApplication(id, argc, argv) -#endif + : BaseApplication(id, argc, argv) { #if defined(Q_OS_MACX) && !defined(DISABLE_GUI) if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { @@ -62,6 +62,33 @@ Application::Application(const QString &id, int &argc, char **argv) #endif } +#ifdef Q_OS_WIN +bool Application::isRunning() +{ + bool running = BaseApplication::isRunning(); + QSharedMemory *sharedMem = new QSharedMemory(id() + QLatin1String("-shared-memory-key"), this); + if (!running) { + // First instance creates shared memory and store PID + if (sharedMem->create(sizeof(DWORD)) && sharedMem->lock()) { + *(static_cast(sharedMem->data())) = ::GetCurrentProcessId(); + sharedMem->unlock(); + } + } + else { + // Later instances attach to shared memory and retrieve PID + if (sharedMem->attach() && sharedMem->lock()) { + ::AllowSetForegroundWindow(*(static_cast(sharedMem->data()))); + sharedMem->unlock(); + } + } + + if (!sharedMem->isAttached()) + qWarning() << "Failed to initialize shared memory: " << sharedMem->errorString(); + + return running; +} +#endif + void Application::initializeTranslation() { Preferences* const pref = Preferences::instance(); @@ -72,10 +99,10 @@ void Application::initializeTranslation() pref->setLocale(locale); } - if (qtTranslator_.load( + if (m_qtTranslator.load( #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QString::fromUtf8("qtbase_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) || - qtTranslator_.load( + m_qtTranslator.load( #endif QString::fromUtf8("qt_") + locale, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { qDebug("Qt %s locale recognized, using translation.", qPrintable(locale)); @@ -83,15 +110,15 @@ void Application::initializeTranslation() else { qDebug("Qt %s locale unrecognized, using default (en).", qPrintable(locale)); } - installTranslator(&qtTranslator_); + installTranslator(&m_qtTranslator); - if (translator_.load(QString::fromUtf8(":/lang/qbittorrent_") + locale)) { + if (m_translator.load(QString::fromUtf8(":/lang/qbittorrent_") + locale)) { qDebug("%s locale recognized, using translation.", qPrintable(locale)); } else { qDebug("%s locale unrecognized, using default (en).", qPrintable(locale)); } - installTranslator(&translator_); + installTranslator(&m_translator); #ifndef DISABLE_GUI if (locale.startsWith("ar") || locale.startsWith("he")) { diff --git a/src/app/application.h b/src/app/application.h index 7047faa09..1a98dc256 100644 --- a/src/app/application.h +++ b/src/app/application.h @@ -35,23 +35,24 @@ #ifndef DISABLE_GUI #include "sessionapplication.h" +typedef SessionApplication BaseApplication; #else #include "qtsinglecoreapplication.h" +typedef QtSingleCoreApplication BaseApplication; #endif -class Application -#ifndef DISABLE_GUI - : public SessionApplication -#else - : public QtSingleCoreApplication -#endif +class Application : public BaseApplication { public: Application(const QString &id, int &argc, char **argv); +#ifdef Q_OS_WIN + bool isRunning(); +#endif + private: - QTranslator qtTranslator_; - QTranslator translator_; + QTranslator m_qtTranslator; + QTranslator m_translator; void initializeTranslation(); }; diff --git a/src/app/main.cpp b/src/app/main.cpp index 2ddde2853..a2469e730 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -90,10 +90,6 @@ public: #include "main.moc" -#if defined(Q_OS_WIN) && !defined(QBT_HAS_GETCURRENTPID) -#error You seem to have updated QtSingleApplication without porting our custom QtSingleApplication::getRunningPid() function. Please see previous version to understate how it works. -#endif - // Signal handlers #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) void sigintHandler(int); @@ -217,14 +213,8 @@ int main(int argc, char *argv[]) #else qDebug("qBittorrent is already running for this user."); #endif + misc::msleep(300); -#ifdef Q_OS_WIN - DWORD pid = (DWORD)app->getRunningPid(); - if (pid > 0) { - BOOL b = AllowSetForegroundWindow(pid); - qDebug("AllowSetForegroundWindow() returns %s", b ? "TRUE" : "FALSE"); - } -#endif if (!params.torrents.isEmpty()) { QString message = params.torrents.join("|"); qDebug("Passing program parameters to running instance..."); diff --git a/src/app/qtsingleapplication/qtlocalpeer.cpp b/src/app/qtsingleapplication/qtlocalpeer.cpp index effa0a016..332b0643f 100644 --- a/src/app/qtsingleapplication/qtlocalpeer.cpp +++ b/src/app/qtsingleapplication/qtlocalpeer.cpp @@ -195,56 +195,9 @@ void QtLocalPeer::receiveConnection() return; } QString message(QString::fromUtf8(uMsg)); -#ifdef Q_OS_WIN - if (message == "qbt://pid") { - qint64 pid = GetCurrentProcessId(); - socket->write((const char *)&pid, sizeof pid); - } else { - socket->write(ack, qstrlen(ack)); - } -#else socket->write(ack, qstrlen(ack)); -#endif socket->waitForBytesWritten(1000); socket->waitForDisconnected(1000); // make sure client reads ack delete socket; -#ifdef Q_OS_WIN - if (message == "qbt://pid") - return; -#endif emit messageReceived(message); //### (might take a long time to return) } - -#ifdef Q_OS_WIN -qint64 QtLocalPeer::getRunningPid() { - if (!isClient()) - return 0; - - QLocalSocket socket; - bool connOk = false; - for (int i = 0; i < 2; i++) { - // Try twice, in case the other instance is just starting up - socket.connectToServer(socketName); - connOk = socket.waitForConnected(5000/2); - if (connOk || i) - break; - Sleep(250); - } - if (!connOk) return -1; - - const char* msg = "qbt://pid"; - QDataStream ds(&socket); - ds.writeBytes(msg, qstrlen(msg)); - bool res = socket.waitForBytesWritten(5000) && socket.waitForReadyRead(5000); - if (!res) return -1; - - DWORD pid; - qint64 pid_size = sizeof pid; - while (socket.bytesAvailable() < pid_size) - socket.waitForReadyRead(); - if (socket.read((char *)&pid, pid_size) < pid_size) - return -1; - - return pid; -} -#endif diff --git a/src/app/qtsingleapplication/qtlocalpeer.h b/src/app/qtsingleapplication/qtlocalpeer.h index ebe185445..1b533b1ab 100644 --- a/src/app/qtsingleapplication/qtlocalpeer.h +++ b/src/app/qtsingleapplication/qtlocalpeer.h @@ -57,9 +57,6 @@ public: bool sendMessage(const QString &message, int timeout); QString applicationId() const { return id; } -#ifdef Q_OS_WIN - qint64 getRunningPid(); -#endif Q_SIGNALS: void messageReceived(const QString &message); diff --git a/src/app/qtsingleapplication/qtsingleapplication.cpp b/src/app/qtsingleapplication/qtsingleapplication.cpp index 8a4c7f74d..d0fb15d76 100644 --- a/src/app/qtsingleapplication/qtsingleapplication.cpp +++ b/src/app/qtsingleapplication/qtsingleapplication.cpp @@ -345,9 +345,3 @@ void QtSingleApplication::activateWindow() \obsolete */ - -#ifdef Q_OS_WIN -qint64 QtSingleApplication::getRunningPid() { - return peer->getRunningPid(); -} -#endif diff --git a/src/app/qtsingleapplication/qtsingleapplication.h b/src/app/qtsingleapplication/qtsingleapplication.h index 80fe0d21e..049406f72 100644 --- a/src/app/qtsingleapplication/qtsingleapplication.h +++ b/src/app/qtsingleapplication/qtsingleapplication.h @@ -86,10 +86,6 @@ public: // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } -#ifdef Q_OS_WIN -#define QBT_HAS_GETCURRENTPID - qint64 getRunningPid(); -#endif public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); From 8b95bb233d63ece85ab7edb23855daef9277dbeb Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Wed, 21 Jan 2015 20:30:24 +0300 Subject: [PATCH 4/9] Fix main(). --- src/app/main.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index a2469e730..518ede3ee 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -146,7 +146,8 @@ int main(int argc, char *argv[]) bool isOneArg = (argc == 2); // Create Application - QScopedPointer app(new Application("qBittorrent-" + misc::getUserIDString(), argc, argv)); + QString appId = QLatin1String("qBittorrent-") + misc::getUserIDString(); + QScopedPointer app(new Application(appId, argc, argv)); MessagesCollector* messagesCollector = new MessagesCollector(); QObject::connect(app.data(), SIGNAL(messageReceived(const QString &)), @@ -210,9 +211,9 @@ int main(int argc, char *argv[]) .arg(QLatin1String("-d (or --daemon)"))); return EXIT_FAILURE; } -#else - qDebug("qBittorrent is already running for this user."); + else #endif + qDebug("qBittorrent is already running for this user."); misc::msleep(300); if (!params.torrents.isEmpty()) { @@ -233,7 +234,7 @@ int main(int argc, char *argv[]) if (params.shouldDaemonize) { app.reset(); // Destroy current application if ((daemon(1, 0) == 0)) { - app.reset(new Application("qBittorrent-" + misc::getUserIDString(), argc, argv)); + app.reset(new Application(appId, argc, argv)); if (app->isRunning()) { // Another instance had time to start. return EXIT_FAILURE; @@ -266,7 +267,7 @@ int main(int argc, char *argv[]) delete messagesCollector; app->setActivationWindow(&window); #ifdef Q_OS_MAC - static_cast(app.data())->setReadyToProcessEvents(); + app->setReadyToProcessEvents(); #endif // Q_OS_MAC #else // Load Headless class From 0c50a8b98b55dceb0c918072e5d034122738e639 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Thu, 22 Jan 2015 15:56:16 +0300 Subject: [PATCH 5/9] Put all application logic into Application class. Application process message and split it into params list itself (this prevents code duplication). Application store params unless other components ready to process them. Application incapsulate all QMacApplication and SessionApplication logic (this is too small to have separate classes). --- src/app/app.pri | 11 --- src/app/application.cpp | 169 ++++++++++++++++++++++++++++++++- src/app/application.h | 31 +++++- src/app/headlessloader.h | 117 ----------------------- src/app/main.cpp | 64 +------------ src/app/qmacapplication.cpp | 72 -------------- src/app/qmacapplication.h | 54 ----------- src/app/sessionapplication.cpp | 50 ---------- src/app/sessionapplication.h | 60 ------------ src/gui/mainwindow.cpp | 63 +++--------- src/gui/mainwindow.h | 5 +- 11 files changed, 210 insertions(+), 486 deletions(-) delete mode 100644 src/app/headlessloader.h delete mode 100644 src/app/qmacapplication.cpp delete mode 100644 src/app/qmacapplication.h delete mode 100644 src/app/sessionapplication.cpp delete mode 100644 src/app/sessionapplication.h diff --git a/src/app/app.pri b/src/app/app.pri index 6ffe7be19..22a4d859e 100644 --- a/src/app/app.pri +++ b/src/app/app.pri @@ -14,20 +14,9 @@ usesystemqtsingleapplication { } } -!nogui { - macx { - HEADERS += $$PWD/qmacapplication.h - SOURCES += $$PWD/qmacapplication.cpp - } - HEADERS += $$PWD/sessionapplication.h - SOURCES += $$PWD/sessionapplication.cpp -} - HEADERS += $$PWD/application.h SOURCES += $$PWD/application.cpp -nogui: HEADERS += $$PWD/headlessloader.h - unix: HEADERS += $$PWD/stacktrace.h strace_win { HEADERS += $$PWD/stacktrace_win.h diff --git a/src/app/application.cpp b/src/app/application.cpp index 2d2e776c5..4052c69a9 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -32,10 +32,20 @@ #include #include #include +#ifndef DISABLE_GUI #ifdef Q_OS_WIN #include #include -#endif +#endif // Q_OS_WIN +#ifdef Q_OS_MAC +#include +#include +#endif // Q_OS_MAC +#include "mainwindow.h" +#include "addnewtorrentdialog.h" +#else // DISABLE_GUI +#include +#endif // DISABLE_GUI #if (!defined(DISABLE_GUI) && defined(Q_OS_MAC)) #include @@ -43,9 +53,17 @@ #include "application.h" #include "preferences.h" +#include "qbtsession.h" +#include "logger.h" + +static const char PARAMS_SEPARATOR[] = "|"; Application::Application(const QString &id, int &argc, char **argv) : BaseApplication(id, argc, argv) +#ifndef DISABLE_GUI + , m_window(0) +#endif + , m_running(false) { #if defined(Q_OS_MACX) && !defined(DISABLE_GUI) if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { @@ -60,8 +78,118 @@ Application::Application(const QString &id, int &argc, char **argv) setStyleSheet("QStatusBar::item { border-width: 0; }"); setQuitOnLastWindowClosed(false); #endif + + connect(this, SIGNAL(messageReceived(const QString &)), SLOT(processMessage(const QString &))); +} + +Application::~Application() +{ + qDebug() << Q_FUNC_INFO; + QBtSession::drop(); + Preferences::drop(); + Logger::drop(); +} + +void Application::processMessage(const QString &message) +{ + QStringList params = message.split(QLatin1String(PARAMS_SEPARATOR), QString::SkipEmptyParts); + // If Application is not running (i.e., other + // components are not ready) store params + if (m_running) + processParams(params); + else + m_paramsQueue.append(params); +} + +bool Application::sendParams(const QStringList ¶ms) +{ + return sendMessage(params.join(QLatin1String(PARAMS_SEPARATOR))); +} + +// As program parameters, we can get paths or urls. +// This function parse the parameters and call +// the right addTorrent function, considering +// the parameter type. +void Application::processParams(const QStringList ¶ms) +{ +#ifndef DISABLE_GUI + if (params.isEmpty()) { + m_window->activate(); // show UI + return; + } + + const bool useTorrentAdditionDialog = Preferences::instance()->useAdditionDialog(); +#endif + + foreach (QString param, params) { + param = param.trimmed(); + if (misc::isUrl(param)) { + QBtSession::instance()->downloadFromUrl(param); + } + else { + if (param.startsWith("bc://bt/", Qt::CaseInsensitive)) { + qDebug("Converting bc link to magnet link"); + param = misc::bcLinkToMagnet(param); + } + + if (param.startsWith("magnet:", Qt::CaseInsensitive)) { +#ifndef DISABLE_GUI + if (useTorrentAdditionDialog) + AddNewTorrentDialog::showMagnet(param, m_window); + else +#endif + QBtSession::instance()->addMagnetUri(param); + } + else { +#ifndef DISABLE_GUI + if (useTorrentAdditionDialog) + AddNewTorrentDialog::showTorrent(param, QString(), m_window); + else +#endif + QBtSession::instance()->addTorrent(param); + } + } + } +} + +int Application::exec(const QStringList ¶ms) +{ + // Resume unfinished torrents + QBtSession::instance()->startUpTorrents(); + +#ifdef DISABLE_GUI + Preferences* const pref = Preferences::instance(); + if (pref->isWebUiEnabled()) { + // Display some information to the user + std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl; + std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref->getWebUiPort()))) << std::endl; + std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername())) << std::endl; + qDebug() << "Password:" << pref->getWebUiPassword(); + if (pref->getWebUiPassword() == "f6fdffe48c908deb0f4c3bd36c032e72") { + std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl; + std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; + } + } +#else + m_window = new MainWindow; +#endif + + m_running = true; + m_paramsQueue = params + m_paramsQueue; + if (!m_paramsQueue.isEmpty()) { + processParams(m_paramsQueue); + m_paramsQueue.clear(); + } + + int res = BaseApplication::exec(); +#ifndef DISABLE_GUI + delete m_window; +#endif + qDebug("Application has exited"); + return res; } +#ifndef DISABLE_GUI #ifdef Q_OS_WIN bool Application::isRunning() { @@ -87,7 +215,42 @@ bool Application::isRunning() return running; } -#endif +#endif // Q_OS_WIN + +#ifdef Q_OS_MAC +bool Application::event(QEvent *ev) +{ + if (ev->type() == QEvent::FileOpen) { + QString path = static_cast(ev)->file(); + if (path.isEmpty()) + // Get the url instead + path = static_cast(ev)->url().toString(); + qDebug("Received a mac file open event: %s", qPrintable(path)); + if (running_) + processParams(QStringList(path)); + else + paramsQueue_.append(path); + return true; + } + else { + return BaseApplication::event(ev); + } +} +#endif // Q_OS_MAC + +bool Application::notify(QObject *receiver, QEvent *event) +{ + try { + return QApplication::notify(receiver, event); + } + catch (const std::exception &e) { + qCritical() << "Exception thrown:" << e.what() << ", receiver: " << receiver->objectName(); + receiver->dumpObjectInfo(); + } + + return false; +} +#endif // DISABLE_GUI void Application::initializeTranslation() { diff --git a/src/app/application.h b/src/app/application.h index 1a98dc256..783817302 100644 --- a/src/app/application.h +++ b/src/app/application.h @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -34,8 +34,9 @@ #include #ifndef DISABLE_GUI -#include "sessionapplication.h" -typedef SessionApplication BaseApplication; +#include "qtsingleapplication.h" +typedef QtSingleApplication BaseApplication; +class MainWindow; #else #include "qtsinglecoreapplication.h" typedef QtSingleCoreApplication BaseApplication; @@ -43,18 +44,40 @@ typedef QtSingleCoreApplication BaseApplication; class Application : public BaseApplication { + Q_OBJECT + public: Application(const QString &id, int &argc, char **argv); + ~Application(); -#ifdef Q_OS_WIN + #if (defined(Q_OS_WIN) && !defined(DISABLE_GUI)) bool isRunning(); #endif + int exec(const QStringList ¶ms); + bool sendParams(const QStringList ¶ms); + +protected: +#ifndef DISABLE_GUI +#ifdef Q_OS_MAC + bool event(QEvent *); +#endif + bool notify(QObject* receiver, QEvent* event); +#endif + +private slots: + void processMessage(const QString &message); private: + bool m_running; +#ifndef DISABLE_GUI + MainWindow *m_window; +#endif QTranslator m_qtTranslator; QTranslator m_translator; + QStringList m_paramsQueue; void initializeTranslation(); + void processParams(const QStringList ¶ms); }; #endif // APPLICATION_H diff --git a/src/app/headlessloader.h b/src/app/headlessloader.h deleted file mode 100644 index 5bbc2c3c2..000000000 --- a/src/app/headlessloader.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Frédéric Lassabe - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : chris@qbittorrent.org - */ - -#ifndef HEADLESSLOADER_H -#define HEADLESSLOADER_H - -#include -#include -#include -#include "preferences.h" -#include "qbtsession.h" -#include "fs_utils.h" -#include "misc.h" -#include "logger.h" -#include "torrentpersistentdata.h" - -class HeadlessLoader: public QObject { - Q_OBJECT - -public: - HeadlessLoader(const QStringList &torrentCmdLine) { - connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(shutdownCleanUp()), Qt::DirectConnection); - Preferences* const pref = Preferences::instance(); - // Enable Web UI - pref->setWebUiEnabled(true); - // Instanciate Bittorrent Object - connect(QBtSession::instance(), SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString))); - // Resume unfinished torrents - QBtSession::instance()->startUpTorrents(); - // Process command line parameters - processParams(torrentCmdLine); - // Display some information to the user - std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl; - std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref->getWebUiPort()))) << std::endl; - std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername())) << std::endl; - qDebug() << "Password:" << pref->getWebUiPassword(); - if (pref->getWebUiPassword() == "f6fdffe48c908deb0f4c3bd36c032e72") { - std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl; - std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; - } - } - -public slots: - void shutdownCleanUp() { - QBtSession::drop(); - TorrentPersistentData::drop(); - Preferences::drop(); - Logger::drop(); - } - - // Call this function to exit qBittorrent headless loader - // and return to prompt (object will be deleted by main) - void exit() { - qApp->quit(); - } - - void displayConsoleMessage(const QString &msg) { - std::cout << qPrintable(msg) << std::endl; - } - - void processParams(const QString& params_str) { - processParams(params_str.split(" ", QString::SkipEmptyParts)); - } - - // As program parameters, we can get paths or urls. - // This function parse the parameters and call - // the right addTorrent function, considering - // the parameter type. - void processParams(const QStringList& params) { - foreach (QString param, params) { - param = fsutils::fromNativePath(param).trimmed(); - if (param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { - QBtSession::instance()->downloadFromUrl(param); - }else{ - if (param.startsWith("bc://bt/", Qt::CaseInsensitive)) { - qDebug("Converting bc link to magnet link"); - param = misc::bcLinkToMagnet(param); - } - if (param.startsWith("magnet:", Qt::CaseInsensitive)) { - QBtSession::instance()->addMagnetUri(param); - } else { - QBtSession::instance()->addTorrent(param); - } - } - } - } - -}; - -#endif diff --git a/src/app/main.cpp b/src/app/main.cpp index 518ede3ee..90a4fe739 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -39,8 +39,6 @@ #include #include #include -#include -#include #ifdef QBT_STATIC_QT #include #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) @@ -49,12 +47,9 @@ Q_IMPORT_PLUGIN(QICOPlugin) Q_IMPORT_PLUGIN(qico) #endif #endif // QBT_STATIC_QT -#include "mainwindow.h" -#include "ico.h" #else // DISABLE_GUI +#include #include -#include -#include "headlessloader.h" #endif // DISABLE_GUI #include "application.h" @@ -71,25 +66,11 @@ Q_IMPORT_PLUGIN(qico) #include "stacktrace_win_dlg.h" #endif //STACKTRACE_WIN -#include +#include #include "misc.h" #include "preferences.h" #include "logger.h" -class MessagesCollector : public QObject -{ - Q_OBJECT -public slots: - void collectMessage(const QString& message) - { - messages.append(message.split("|", QString::SkipEmptyParts)); - } -public: - QStringList messages; -}; - -#include "main.moc" - // Signal handlers #if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) void sigintHandler(int); @@ -149,10 +130,6 @@ int main(int argc, char *argv[]) QString appId = QLatin1String("qBittorrent-") + misc::getUserIDString(); QScopedPointer app(new Application(appId, argc, argv)); - MessagesCollector* messagesCollector = new MessagesCollector(); - QObject::connect(app.data(), SIGNAL(messageReceived(const QString &)), - messagesCollector, SLOT(collectMessage(const QString &))); - const QBtCommandLineParameters params = parseCommandLine(); if (!params.unknownParameter.isEmpty()) { @@ -216,15 +193,7 @@ int main(int argc, char *argv[]) qDebug("qBittorrent is already running for this user."); misc::msleep(300); - if (!params.torrents.isEmpty()) { - QString message = params.torrents.join("|"); - qDebug("Passing program parameters to running instance..."); - qDebug("Message: %s", qPrintable(message)); - app->sendMessage(message); - } - else { // Raise main window - app->sendMessage("qbt://show"); - } + app->sendParams(params.torrents); return EXIT_SUCCESS; } @@ -257,32 +226,7 @@ int main(int argc, char *argv[]) signal(SIGSEGV, sigsegvHandler); #endif -#ifndef DISABLE_GUI - MainWindow window(0, params.torrents); - QObject::connect(app.data(), SIGNAL(messageReceived(const QString &)), - &window, SLOT(processParams(const QString &))); - QObject::disconnect(app.data(), SIGNAL(messageReceived(const QString &)), - messagesCollector, SLOT(collectMessage(const QString &))); - window.processParams(messagesCollector->messages); - delete messagesCollector; - app->setActivationWindow(&window); -#ifdef Q_OS_MAC - app->setReadyToProcessEvents(); -#endif // Q_OS_MAC -#else - // Load Headless class - HeadlessLoader loader(params.torrents); - QObject::connect(app.data(), SIGNAL(messageReceived(const QString &)), - &loader, SLOT(processParams(const QString &))); - QObject::disconnect(app.data(), SIGNAL(messageReceived(const QString &)), - messagesCollector, SLOT(collectMessage(const QString &))); - loader.processParams(messagesCollector->messages); - delete messagesCollector; -#endif - - int ret = app->exec(); - qDebug("Application has exited"); - return ret; + return app->exec(params.torrents); } QBtCommandLineParameters parseCommandLine() diff --git a/src/app/qmacapplication.cpp b/src/app/qmacapplication.cpp deleted file mode 100644 index 1361db949..000000000 --- a/src/app/qmacapplication.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2010 Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : chris@qbittorrent.org - */ - -#include -#include -#include -#include "qmacapplication.h" - -QMacApplication::QMacApplication(QString appid, int &argc, char** argv) : - QtSingleApplication(appid, argc, argv), - m_readyToProcessEvents(false) -{ - qDebug("Constructing a QMacApplication to receive file open events"); -} - -void QMacApplication::setReadyToProcessEvents() -{ - m_readyToProcessEvents = true; - if (!m_torrentsQueue.isEmpty()) { - emit newFileOpenMacEvent(m_torrentsQueue.join("|")); - m_torrentsQueue.clear(); - } -} - -bool QMacApplication::event(QEvent * ev) { - switch (ev->type()) { - case QEvent::FileOpen: - { - QString path = static_cast(ev)->file(); - if (path.isEmpty()) { - // Get the url instead - path = static_cast(ev)->url().toString(); - } - qDebug("Received a mac file open event: %s", qPrintable(path)); - if (m_readyToProcessEvents) - emit newFileOpenMacEvent(path); - else - m_torrentsQueue.append(path); - return true; - } - default: - return QtSingleApplication::event(ev); - } -} - diff --git a/src/app/qmacapplication.h b/src/app/qmacapplication.h deleted file mode 100644 index 8148a4e13..000000000 --- a/src/app/qmacapplication.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2010 Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : chris@qbittorrent.org - */ -#ifndef QMACAPPLICATION_H -#define QMACAPPLICATION_H - -#include "qtsingleapplication.h" -#include - -class QMacApplication : public QtSingleApplication -{ - Q_OBJECT -public: - explicit QMacApplication(QString appid, int &argc, char** argv); - void setReadyToProcessEvents(); - -signals: - void newFileOpenMacEvent(const QString &path); - -protected: - bool event(QEvent *); - -private: - bool m_readyToProcessEvents; - QStringList m_torrentsQueue; -}; - -#endif // QMACAPPLICATION_H diff --git a/src/app/sessionapplication.cpp b/src/app/sessionapplication.cpp deleted file mode 100644 index fb834cece..000000000 --- a/src/app/sessionapplication.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2010 Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : chris@qbittorrent.org - */ - -#include -#include "sessionapplication.h" - -SessionApplication::SessionApplication(const QString &id, int &argc, char **argv) : -#ifdef Q_OS_MAC -QMacApplication(id, argc, argv) -#else -QtSingleApplication(id, argc, argv) -#endif -{} - -bool SessionApplication::notify(QObject* receiver, QEvent* event) { - try { - return QApplication::notify(receiver, event); - } catch(const std::exception& e) { - qCritical() << "Exception thrown:" << e.what() << ", receiver: " << receiver->objectName(); - receiver->dumpObjectInfo(); - } - return false; -} diff --git a/src/app/sessionapplication.h b/src/app/sessionapplication.h deleted file mode 100644 index 3ad8d4e93..000000000 --- a/src/app/sessionapplication.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2010 Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - * Contact : chris@qbittorrent.org - */ - -#ifndef SESSIONAPPLICATION_H -#define SESSIONAPPLICATION_H - -#include - -#ifdef Q_OS_MAC -#include "qmacapplication.h" -#else -#include "qtsingleapplication.h" -#endif - -#include - -class SessionApplication : -#ifdef Q_OS_MAC - public QMacApplication -#else - public QtSingleApplication -#endif -{ - Q_OBJECT - -public: - SessionApplication(const QString &id, int &argc, char **argv); - -protected: - virtual bool notify(QObject* receiver, QEvent* event); -}; - -#endif // SESSIONAPPLICATION_H diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 40aa3bedd..b724968b7 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -77,11 +77,10 @@ #include "autoexpandabledialog.h" #endif #ifdef Q_OS_MAC -#include "qmacapplication.h" void qt_mac_set_dock_menu(QMenu *menu); #endif #include "lineedit.h" -#include "sessionapplication.h" +#include "application.h" #if defined(Q_OS_WIN) || defined(Q_OS_MAC) #include "programupdater.h" #endif @@ -104,7 +103,11 @@ using namespace libtorrent; *****************************************************/ // Constructor -MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine): QMainWindow(parent), m_posInitialized(false), force_exit(false), unlockDlgShowing(false) +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , m_posInitialized(false) + , force_exit(false) + , unlockDlgShowing(false) #ifdef Q_OS_WIN , has_python(false) #endif @@ -175,9 +178,6 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine): QMai connect(QBtSession::instance(), SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString))); connect(QBtSession::instance(), SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool))); connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle))); -#ifdef Q_OS_MAC - connect(static_cast(qApp), SIGNAL(newFileOpenMacEvent(QString)), this, SLOT(processParams(QString))); -#endif qDebug("create tabWidget"); tabs = new HidableTabWidget(); @@ -316,8 +316,6 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine): QMai // Resume unfinished torrents QBtSession::instance()->startUpTorrents(); - // Add torrent given on command line - processParams(torrentCmdLine); // Populate the transfer list transferList->getSourceModel()->populate(); @@ -1105,51 +1103,12 @@ void MainWindow::on_actionOpen_triggered() } } -// As program parameters, we can get paths or urls. -// This function parse the parameters and call -// the right addTorrent function, considering -// the parameter type. -void MainWindow::processParams(const QString& params_str) -{ - processParams(params_str.split("|", QString::SkipEmptyParts)); -} - -void MainWindow::processParams(const QStringList& params) +void MainWindow::activate() { - Preferences* const pref = Preferences::instance(); - const bool useTorrentAdditionDialog = pref->useAdditionDialog(); - foreach (QString param, params) { - param = param.trimmed(); - if (misc::isUrl(param)) { - QBtSession::instance()->downloadFromUrl(param); - } - else { - if(param.startsWith("qbt://show")) { - if(ui_locked) - if(!unlockUI()) - return; - show(); - activateWindow(); - raise(); - return; // Do not process more params - } - if (param.startsWith("bc://bt/", Qt::CaseInsensitive)) { - qDebug("Converting bc link to magnet link"); - param = misc::bcLinkToMagnet(param); - } - if (param.startsWith("magnet:", Qt::CaseInsensitive)) { - if (useTorrentAdditionDialog) - AddNewTorrentDialog::showMagnet(param, this); - else - QBtSession::instance()->addMagnetUri(param); - } - else { - if (useTorrentAdditionDialog) - AddNewTorrentDialog::showTorrent(param, QString(), this); - else - QBtSession::instance()->addTorrent(param); - } - } + if (!ui_locked || unlockUI()) { + show(); + activateWindow(); + raise(); } } diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index b18559ba1..d28ec7a2c 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -72,7 +72,7 @@ class MainWindow: public QMainWindow, private Ui::MainWindow public: // Construct / Destruct - MainWindow(QWidget *parent = 0, const QStringList& torrentCmdLine = QStringList()); + explicit MainWindow(QWidget *parent = 0); // Methods QWidget* getCurrentTabWidget() const; TransferListWidget* getTransferList() const { return transferList; } @@ -87,7 +87,7 @@ public slots: void updateAltSpeedsBtn(bool alternative); void updateNbTorrents(); void shutdownCleanUp(); - void processParams(const QStringList& params); + void activate(); protected slots: // GUI related slots @@ -128,7 +128,6 @@ protected slots: void on_actionOpen_triggered(); void updateGUI(); void loadPreferences(bool configure_session = true); - void processParams(const QString& params); void addTorrent(QString path); void addUnauthenticatedTracker(const QPair &tracker); void processDownloadedFiles(QString path, QString url); From 458b216b74e1d5a76983f78bd26a68b5dc6dc908 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Mon, 26 Jan 2015 17:00:23 +0300 Subject: [PATCH 6/9] MainWindow cleanups. All MainWindow child widgets use constructors with 'parent' parameter that allows parent widget to delete them at its destruction. Some other MainWindow cleanup code replaced to destructor. Application manages MainWindow instance and remove it when aboutToQuit() signal emitted. --- src/app/application.cpp | 33 +++++------ src/app/application.h | 4 +- src/gui/hidabletabwidget.h | 36 ++++++------ src/gui/mainwindow.cpp | 112 +++++++++++-------------------------- src/gui/mainwindow.h | 16 ++---- 5 files changed, 70 insertions(+), 131 deletions(-) diff --git a/src/app/application.cpp b/src/app/application.cpp index 4052c69a9..640f90985 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -52,17 +52,15 @@ #endif #include "application.h" +#include "logger.h" #include "preferences.h" #include "qbtsession.h" -#include "logger.h" +#include "torrentpersistentdata.h" static const char PARAMS_SEPARATOR[] = "|"; Application::Application(const QString &id, int &argc, char **argv) : BaseApplication(id, argc, argv) -#ifndef DISABLE_GUI - , m_window(0) -#endif , m_running(false) { #if defined(Q_OS_MACX) && !defined(DISABLE_GUI) @@ -80,14 +78,7 @@ Application::Application(const QString &id, int &argc, char **argv) #endif connect(this, SIGNAL(messageReceived(const QString &)), SLOT(processMessage(const QString &))); -} - -Application::~Application() -{ - qDebug() << Q_FUNC_INFO; - QBtSession::drop(); - Preferences::drop(); - Logger::drop(); + connect(this, SIGNAL(aboutToQuit()), SLOT(cleanup())); } void Application::processMessage(const QString &message) @@ -101,6 +92,17 @@ void Application::processMessage(const QString &message) m_paramsQueue.append(params); } +void Application::cleanup() +{ +#ifndef DISABLE_GUI + delete m_window; +#endif + QBtSession::drop(); + TorrentPersistentData::drop(); + Preferences::drop(); + Logger::drop(); +} + bool Application::sendParams(const QStringList ¶ms) { return sendMessage(params.join(QLatin1String(PARAMS_SEPARATOR))); @@ -181,12 +183,7 @@ int Application::exec(const QStringList ¶ms) m_paramsQueue.clear(); } - int res = BaseApplication::exec(); -#ifndef DISABLE_GUI - delete m_window; -#endif - qDebug("Application has exited"); - return res; + return BaseApplication::exec(); } #ifndef DISABLE_GUI diff --git a/src/app/application.h b/src/app/application.h index 783817302..a3a0ba340 100644 --- a/src/app/application.h +++ b/src/app/application.h @@ -48,7 +48,6 @@ class Application : public BaseApplication public: Application(const QString &id, int &argc, char **argv); - ~Application(); #if (defined(Q_OS_WIN) && !defined(DISABLE_GUI)) bool isRunning(); @@ -66,11 +65,12 @@ protected: private slots: void processMessage(const QString &message); + void cleanup(); private: bool m_running; #ifndef DISABLE_GUI - MainWindow *m_window; + QPointer m_window; #endif QTranslator m_qtTranslator; QTranslator m_translator; diff --git a/src/gui/hidabletabwidget.h b/src/gui/hidabletabwidget.h index 9d87e850e..654556f9a 100644 --- a/src/gui/hidabletabwidget.h +++ b/src/gui/hidabletabwidget.h @@ -1,5 +1,5 @@ /* - * Bittorrent Client using Qt4 and libtorrent. + * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -34,31 +34,27 @@ #include #include -class HidableTabWidget : public QTabWidget { +class HidableTabWidget : public QTabWidget +{ public: - - void showTabBar(bool show) { - tabBar()->setVisible(show); - } + explicit HidableTabWidget(QWidget *parent = 0) + : QTabWidget(parent) + { + } protected: - void tabInserted(int index) { - QTabWidget::tabInserted(index); - if (count() == 1) { - showTabBar(false); - } else { - showTabBar(true); + void tabInserted(int index) + { + QTabWidget::tabInserted(index); + tabBar()->setVisible(count() != 1); } - } - void tabRemoved(int index) { - QTabWidget::tabInserted(index); - if (count() == 1) { - showTabBar(false); - } else { - showTabBar(true); + void tabRemoved(int index) + { + //QTabWidget::tabInserted(index); + QTabWidget::tabRemoved(index); + tabBar()->setVisible(count() != 1); } - } }; #endif // HIDABLETABWIDGET_H diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index b724968b7..a8eb3170c 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -169,6 +169,7 @@ MainWindow::MainWindow(QWidget *parent) QAction *clearUiLockPasswdAct = lockMenu->addAction(tr("Clear the password")); connect(clearUiLockPasswdAct, SIGNAL(triggered()), this, SLOT(clearUILockPassword())); actionLock_qBittorrent->setMenu(lockMenu); + // Creating Bittorrent session connect(QBtSession::instance(), SIGNAL(fullDiskError(QTorrentHandle, QString)), this, SLOT(fullDiskError(QTorrentHandle, QString))); connect(QBtSession::instance(), SIGNAL(finishedTorrent(QTorrentHandle)), this, SLOT(finishedTorrent(QTorrentHandle))); @@ -180,19 +181,22 @@ MainWindow::MainWindow(QWidget *parent) connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle))); qDebug("create tabWidget"); - tabs = new HidableTabWidget(); + tabs = new HidableTabWidget(this); connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int))); - vSplitter = new QSplitter(Qt::Horizontal); + + vSplitter = new QSplitter(Qt::Horizontal, this); //vSplitter->setChildrenCollapsible(false); - hSplitter = new QSplitter(Qt::Vertical); + + hSplitter = new QSplitter(Qt::Vertical, this); hSplitter->setChildrenCollapsible(false); hSplitter->setContentsMargins(0, 4, 0, 0); // Name filter - search_filter = new LineEdit(); + search_filter = new LineEdit(this); searchFilterAct = toolBar->insertWidget(actionLock_qBittorrent, search_filter); search_filter->setPlaceholderText(tr("Filter torrent list...")); search_filter->setFixedWidth(200); + QWidget *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); toolBar->insertWidget(searchFilterAct, spacer); @@ -275,7 +279,7 @@ MainWindow::MainWindow(QWidget *parent) QTimer::singleShot(0, this, SLOT(on_actionSearch_engine_triggered())); // Auto shutdown actions - QActionGroup * autoShutdownGroup = new QActionGroup(this); + QActionGroup *autoShutdownGroup = new QActionGroup(this); autoShutdownGroup->setExclusive(true); autoShutdownGroup->addAction(actionAutoShutdown_Disabled); autoShutdownGroup->addAction(actionAutoExit_qBittorrent); @@ -310,13 +314,10 @@ MainWindow::MainWindow(QWidget *parent) properties->readSettings(); // Start watching the executable for updates - executable_watcher = new QFileSystemWatcher(); + executable_watcher = new QFileSystemWatcher(this); connect(executable_watcher, SIGNAL(fileChanged(QString)), this, SLOT(notifyOfUpdate(QString))); executable_watcher->addPath(qApp->applicationFilePath()); - // Resume unfinished torrents - QBtSession::instance()->startUpTorrents(); - // Populate the transfer list transferList->getSourceModel()->populate(); transferList->setFocus(); @@ -357,6 +358,16 @@ MainWindow::MainWindow(QWidget *parent) } } +MainWindow::~MainWindow() +{ + // Save window size, columns size + writeSettings(); +#ifdef Q_OS_MAC + // Workaround to avoid bug http://bugreports.qt.nokia.com/browse/QTBUG-7305 + setUnifiedTitleAndToolBarOnMac(false); +#endif +} + void MainWindow::addToolbarContextMenu() { const Preferences* const pref = Preferences::instance(); @@ -448,68 +459,6 @@ void MainWindow::toolbarFollowSystem() Preferences::instance()->setToolbarTextPosition(Qt::ToolButtonFollowStyle); } -void MainWindow::shutdownCleanUp() -{ - qDebug("GUI destruction"); - hide(); - guiUpdater->stop(); - status_bar->stopTimer(); - m_pwr->setActivityState(false); - QBtSession::drop(); - // Save window size, columns size - writeSettings(); -#ifdef Q_OS_MAC - // Workaround to avoid bug http://bugreports.qt.nokia.com/browse/QTBUG-7305 - setUnifiedTitleAndToolBarOnMac(false); -#endif - disconnect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int))); - // Delete other GUI objects - if (executable_watcher) - delete executable_watcher; - delete status_bar; - delete search_filter; - delete transferList; - delete guiUpdater; - if (createTorrentDlg) - delete createTorrentDlg; - if (m_executionLog) - delete m_executionLog; - if (aboutDlg) - delete aboutDlg; - if (statsDlg) - delete statsDlg; - if (options) - delete options; - if (downloadFromURLDialog) - delete downloadFromURLDialog; - if (rssWidget) - delete rssWidget; - if (searchEngine) - delete searchEngine; - delete transferListFilters; - delete properties; - delete hSplitter; - delete vSplitter; - if (systrayCreator) - delete systrayCreator; - if (systrayIcon) - delete systrayIcon; - if (myTrayIconMenu) - delete myTrayIconMenu; - delete tabs; - // Keyboard shortcuts - delete switchSearchShortcut; - delete switchSearchShortcut2; - delete switchTransferShortcut; - delete switchRSSShortcut; - delete toolbarMenu; - IconProvider::drop(); - TorrentPersistentData::drop(); - Preferences::drop(); - Logger::drop(); - qDebug("Finished GUI destruction"); -} - void MainWindow::defineUILockPassword() { QString old_pass_md5 = Preferences::instance()->getUILockPasswordMD5(); @@ -563,8 +512,9 @@ void MainWindow::displayRSSTab(bool enable) tabs->setTabIcon(index_tab, IconProvider::instance()->getIcon("application-rss+xml")); } } - else if (rssWidget) + else if (rssWidget) { delete rssWidget; + } } @@ -578,8 +528,9 @@ void MainWindow::displaySearchTab(bool enable) tabs->insertTab(1, searchEngine, IconProvider::instance()->getIcon("edit-find"), tr("Search")); } } - else if (searchEngine) + else if (searchEngine) { delete searchEngine; + } } @@ -684,14 +635,16 @@ void MainWindow::createKeyboardShortcuts() actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O"))); actionDownload_from_URL->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+O"))); actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q"))); - switchTransferShortcut = new QShortcut(QKeySequence("Alt+1"), this); + + QShortcut *switchTransferShortcut = new QShortcut(QKeySequence("Alt+1"), this); connect(switchTransferShortcut, SIGNAL(activated()), this, SLOT(displayTransferTab())); - switchSearchShortcut = new QShortcut(QKeySequence("Alt+2"), this); + QShortcut *switchSearchShortcut = new QShortcut(QKeySequence("Alt+2"), this); connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab())); - switchSearchShortcut2 = new QShortcut(QKeySequence("Ctrl+F"), this); + QShortcut *switchSearchShortcut2 = new QShortcut(QKeySequence("Ctrl+F"), this); connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab())); - switchRSSShortcut = new QShortcut(QKeySequence("Alt+3"), this); + QShortcut *switchRSSShortcut = new QShortcut(QKeySequence("Alt+3"), this); connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab())); + actionDocumentation->setShortcut(QKeySequence("F1")); actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O"))); actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S"))); @@ -1147,7 +1100,7 @@ void MainWindow::loadPreferences(bool configure_session) const Preferences* const pref = Preferences::instance(); const bool newSystrayIntegration = pref->systrayIntegration(); actionLock_qBittorrent->setVisible(newSystrayIntegration); - if (newSystrayIntegration != (systrayIcon!=0)) { + if (newSystrayIntegration != (systrayIcon != 0)) { if (newSystrayIntegration) { // create the trayicon if (!QSystemTrayIcon::isSystemTrayAvailable()) { @@ -1572,8 +1525,9 @@ void MainWindow::on_actionExecution_Logs_triggered(bool checked) int index_tab = tabs->addTab(m_executionLog, tr("Execution Log")); tabs->setTabIcon(index_tab, IconProvider::instance()->getIcon("view-calendar-journal")); } - else if (m_executionLog) + else if (m_executionLog) { delete m_executionLog; + } Preferences::instance()->setExecutionLogEnabled(checked); } diff --git a/src/gui/mainwindow.h b/src/gui/mainwindow.h index d28ec7a2c..f7a9b9d69 100644 --- a/src/gui/mainwindow.h +++ b/src/gui/mainwindow.h @@ -48,11 +48,9 @@ class TransferListWidget; class TransferListFiltersWidget; class PropertiesWidget; class StatusBar; -class consoleDlg; class about; class TorrentCreatorDlg; class downloadFromURL; -class HidableTabWidget; class LineEdit; class ExecutionLog; class PowerManagement; @@ -73,6 +71,7 @@ class MainWindow: public QMainWindow, private Ui::MainWindow public: // Construct / Destruct explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); // Methods QWidget* getCurrentTabWidget() const; TransferListWidget* getTransferList() const { return transferList; } @@ -86,13 +85,10 @@ public slots: void downloadFromURLList(const QStringList& urls); void updateAltSpeedsBtn(bool alternative); void updateNbTorrents(); - void shutdownCleanUp(); void activate(); protected slots: // GUI related slots - void dropEvent(QDropEvent *event); - void dragEnterEvent(QDragEnterEvent *event); void toggleVisibility(QSystemTrayIcon::ActivationReason e = QSystemTrayIcon::Trigger); void on_actionAbout_triggered(); void on_actionStatistics_triggered(); @@ -144,6 +140,8 @@ protected slots: #endif protected: + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); void closeEvent(QCloseEvent *); void showEvent(QShowEvent *); bool event(QEvent * event); @@ -169,10 +167,9 @@ private: // GUI related bool m_posInitialized; QTimer *guiUpdater; - HidableTabWidget *tabs; + QTabWidget *tabs; StatusBar *status_bar; QPointer options; - QPointer console; QPointer aboutDlg; QPointer statsDlg; QPointer createTorrentDlg; @@ -189,11 +186,6 @@ private: bool unlockDlgShowing; LineEdit *search_filter; QAction *searchFilterAct; - // Keyboard shortcuts - QShortcut *switchSearchShortcut; - QShortcut *switchSearchShortcut2; - QShortcut *switchTransferShortcut; - QShortcut *switchRSSShortcut; // Widgets QAction *prioSeparator; QAction *prioSeparatorMenu; From 8e1698d563f558f57f230958e68ad02b1200b4b1 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Wed, 28 Jan 2015 11:50:49 +0300 Subject: [PATCH 7/9] Implement Preferences::changed() signal. --- src/core/preferences.cpp | 2 ++ src/core/preferences.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/core/preferences.cpp b/src/core/preferences.cpp index 22ca38016..e22f8de2f 100644 --- a/src/core/preferences.cpp +++ b/src/core/preferences.cpp @@ -165,6 +165,8 @@ void Preferences::save() { #else delete settings; #endif + + emit changed(); } const QVariant Preferences::value(const QString &key, const QVariant &defaultValue) const { diff --git a/src/core/preferences.h b/src/core/preferences.h index 806755bce..0c3d2d97c 100644 --- a/src/core/preferences.h +++ b/src/core/preferences.h @@ -33,7 +33,6 @@ #ifndef PREFERENCES_H #define PREFERENCES_H - #include #include #include @@ -70,6 +69,9 @@ private: const QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; void setValue(const QString &key, const QVariant &value); +signals: + void changed(); + public slots: void save(); From 2707f5205fcdcd91fa2be4373296b0b949f420e0 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Wed, 28 Jan 2015 12:03:22 +0300 Subject: [PATCH 8/9] Fix prefjson::setPreferences() doesn't actually save. --- src/app/application.cpp | 39 +- src/app/application.h | 11 + src/app/main.cpp | 5 +- src/core/core.pri | 24 +- .../http/connection.cpp} | 49 +- .../http/connection.h} | 31 +- src/core/http/irequesthandler.h | 47 + .../requestparser.cpp} | 58 +- .../requestparser.h} | 25 +- src/core/http/responsebuilder.cpp | 74 ++ src/core/http/responsebuilder.h | 60 ++ .../responsegenerator.cpp} | 6 +- .../responsegenerator.h} | 17 +- .../httpserver.cpp => core/http/server.cpp} | 21 +- .../httpserver.h => core/http/server.h} | 23 +- src/core/{httptypes.h => http/types.h} | 53 +- src/core/qtlibtorrent/qbtsession.cpp | 69 +- src/core/qtlibtorrent/qbtsession.h | 9 +- src/core/{tracker => }/qtracker.cpp | 196 ++-- src/core/{tracker => }/qtracker.h | 52 +- src/core/tracker/qpeer.h | 35 - src/core/tracker/tracker.pri | 9 - src/core/tracker/trackerannouncerequest.h | 15 - src/gui/mainwindow.cpp | 3 - src/gui/options_imp.cpp | 6 + src/webui/abstractrequesthandler.cpp | 167 ---- src/webui/abstractwebapplication.cpp | 413 +++++++++ ...uesthandler.h => abstractwebapplication.h} | 89 +- src/webui/prefjson.cpp | 4 +- src/webui/requesthandler.cpp | 716 --------------- src/webui/requesthandler.h | 108 --- src/webui/webapplication.cpp | 842 +++++++++++++----- src/webui/webapplication.h | 112 ++- src/webui/websessiondata.h | 41 + src/webui/webui.cpp | 102 +++ src/webui/webui.h | 55 ++ src/webui/webui.pri | 41 +- 37 files changed, 1918 insertions(+), 1709 deletions(-) rename src/{webui/httpconnection.cpp => core/http/connection.cpp} (73%) rename src/{webui/httpconnection.h => core/http/connection.h} (79%) create mode 100644 src/core/http/irequesthandler.h rename src/core/{httprequestparser.cpp => http/requestparser.cpp} (82%) rename src/core/{httprequestparser.h => http/requestparser.h} (83%) create mode 100644 src/core/http/responsebuilder.cpp create mode 100644 src/core/http/responsebuilder.h rename src/core/{httpresponsegenerator.cpp => http/responsegenerator.cpp} (97%) rename src/core/{httpresponsegenerator.h => http/responsegenerator.h} (87%) rename src/{webui/httpserver.cpp => core/http/server.cpp} (84%) rename src/{webui/httpserver.h => core/http/server.h} (87%) rename src/core/{httptypes.h => http/types.h} (75%) rename src/core/{tracker => }/qtracker.cpp (54%) rename src/core/{tracker => }/qtracker.h (64%) delete mode 100644 src/core/tracker/qpeer.h delete mode 100644 src/core/tracker/tracker.pri delete mode 100644 src/core/tracker/trackerannouncerequest.h delete mode 100644 src/webui/abstractrequesthandler.cpp create mode 100644 src/webui/abstractwebapplication.cpp rename src/webui/{abstractrequesthandler.h => abstractwebapplication.h} (51%) delete mode 100644 src/webui/requesthandler.cpp delete mode 100644 src/webui/requesthandler.h create mode 100644 src/webui/websessiondata.h create mode 100644 src/webui/webui.cpp create mode 100644 src/webui/webui.h diff --git a/src/app/application.cpp b/src/app/application.cpp index 640f90985..73470159f 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -32,6 +32,7 @@ #include #include #include + #ifndef DISABLE_GUI #ifdef Q_OS_WIN #include @@ -39,6 +40,7 @@ #endif // Q_OS_WIN #ifdef Q_OS_MAC #include +#include #include #endif // Q_OS_MAC #include "mainwindow.h" @@ -47,8 +49,8 @@ #include #endif // DISABLE_GUI -#if (!defined(DISABLE_GUI) && defined(Q_OS_MAC)) -#include +#ifndef DISABLE_WEBUI +#include "webui.h" #endif #include "application.h" @@ -92,17 +94,6 @@ void Application::processMessage(const QString &message) m_paramsQueue.append(params); } -void Application::cleanup() -{ -#ifndef DISABLE_GUI - delete m_window; -#endif - QBtSession::drop(); - TorrentPersistentData::drop(); - Preferences::drop(); - Logger::drop(); -} - bool Application::sendParams(const QStringList ¶ms) { return sendMessage(params.join(QLatin1String(PARAMS_SEPARATOR))); @@ -159,7 +150,12 @@ int Application::exec(const QStringList ¶ms) // Resume unfinished torrents QBtSession::instance()->startUpTorrents(); +#ifndef DISABLE_WEBUI + m_webui = new WebUI; +#endif + #ifdef DISABLE_GUI +#ifndef DISABLE_WEBUI Preferences* const pref = Preferences::instance(); if (pref->isWebUiEnabled()) { // Display some information to the user @@ -172,9 +168,10 @@ int Application::exec(const QStringList ¶ms) std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; } } +#endif // DISABLE_WEBUI #else m_window = new MainWindow; -#endif +#endif // DISABLE_GUI m_running = true; m_paramsQueue = params + m_paramsQueue; @@ -290,3 +287,17 @@ void Application::initializeTranslation() } #endif } + +void Application::cleanup() +{ +#ifndef DISABLE_GUI + delete m_window; +#endif +#ifndef DISABLE_WEBUI + delete m_webui; +#endif + QBtSession::drop(); + TorrentPersistentData::drop(); + Preferences::drop(); + Logger::drop(); +} diff --git a/src/app/application.h b/src/app/application.h index a3a0ba340..6dd03ac74 100644 --- a/src/app/application.h +++ b/src/app/application.h @@ -30,6 +30,7 @@ #ifndef APPLICATION_H #define APPLICATION_H +#include #include #include @@ -42,6 +43,10 @@ class MainWindow; typedef QtSingleCoreApplication BaseApplication; #endif +#ifndef DISABLE_WEBUI +class WebUI; +#endif + class Application : public BaseApplication { Q_OBJECT @@ -69,9 +74,15 @@ private slots: private: bool m_running; + #ifndef DISABLE_GUI QPointer m_window; #endif + +#ifndef DISABLE_WEBUI + QPointer m_webui; +#endif + QTranslator m_qtTranslator; QTranslator m_translator; QStringList m_paramsQueue; diff --git a/src/app/main.cpp b/src/app/main.cpp index 90a4fe739..26605d8a7 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -49,11 +49,8 @@ Q_IMPORT_PLUGIN(qico) #endif // QBT_STATIC_QT #else // DISABLE_GUI #include -#include #endif // DISABLE_GUI -#include "application.h" - #ifdef Q_OS_UNIX #include #include @@ -67,6 +64,8 @@ Q_IMPORT_PLUGIN(qico) #endif //STACKTRACE_WIN #include +#include +#include "application.h" #include "misc.h" #include "preferences.h" #include "logger.h" diff --git a/src/core/core.pri b/src/core/core.pri index 006e147b3..19707a885 100644 --- a/src/core/core.pri +++ b/src/core/core.pri @@ -3,7 +3,6 @@ INCLUDEPATH += $$PWD unix:!macx:dbus: include(qtnotify/qtnotify.pri) include(qtlibtorrent/qtlibtorrent.pri) -include(tracker/tracker.pri) HEADERS += \ $$PWD/misc.h \ @@ -16,10 +15,15 @@ HEADERS += \ $$PWD/smtp.h \ $$PWD/dnsupdater.h \ $$PWD/logger.h \ - $$PWD/httptypes.h \ - $$PWD/httprequestparser.h \ - $$PWD/httpresponsegenerator.h \ - $$PWD/preferences.h + $$PWD/preferences.h \ + $$PWD/qtracker.h \ + $$PWD/http/irequesthandler.h \ + $$PWD/http/connection.h \ + $$PWD/http/requestparser.h \ + $$PWD/http/responsegenerator.h \ + $$PWD/http/server.h \ + $$PWD/http/types.h \ + $$PWD/http/responsebuilder.h SOURCES += \ $$PWD/downloadthread.cpp \ @@ -30,6 +34,10 @@ SOURCES += \ $$PWD/smtp.cpp \ $$PWD/dnsupdater.cpp \ $$PWD/logger.cpp \ - $$PWD/httprequestparser.cpp \ - $$PWD/httpresponsegenerator.cpp \ - $$PWD/preferences.cpp + $$PWD/preferences.cpp \ + $$PWD/qtracker.cpp \ + $$PWD/http/connection.cpp \ + $$PWD/http/requestparser.cpp \ + $$PWD/http/responsegenerator.cpp \ + $$PWD/http/server.cpp \ + $$PWD/http/responsebuilder.cpp diff --git a/src/webui/httpconnection.cpp b/src/core/http/connection.cpp similarity index 73% rename from src/webui/httpconnection.cpp rename to src/core/http/connection.cpp index 3a6208bdb..435d2e73c 100644 --- a/src/webui/httpconnection.cpp +++ b/src/core/http/connection.cpp @@ -31,59 +31,60 @@ #include #include -#include "httptypes.h" -#include "httpserver.h" -#include "httprequestparser.h" -#include "httpresponsegenerator.h" -#include "webapplication.h" -#include "requesthandler.h" -#include "httpconnection.h" +#include "types.h" +#include "requestparser.h" +#include "responsegenerator.h" +#include "irequesthandler.h" +#include "connection.h" -HttpConnection::HttpConnection(QTcpSocket *socket, HttpServer *httpserver) - : QObject(httpserver), m_socket(socket) +using namespace Http; + +Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent) + : QObject(parent) + , m_socket(socket) + , m_requestHandler(requestHandler) { m_socket->setParent(this); connect(m_socket, SIGNAL(readyRead()), SLOT(read())); connect(m_socket, SIGNAL(disconnected()), SLOT(deleteLater())); } -HttpConnection::~HttpConnection() +Connection::~Connection() { - delete m_socket; } -void HttpConnection::read() +void Connection::read() { m_receivedData.append(m_socket->readAll()); - HttpRequest request; - HttpRequestParser::ErrorCode err = HttpRequestParser::parse(m_receivedData, request); + Request request; + RequestParser::ErrorCode err = RequestParser::parse(m_receivedData, request); switch (err) { - case HttpRequestParser::IncompleteRequest: + case RequestParser::IncompleteRequest: // Partial request waiting for the rest break; - case HttpRequestParser::BadRequest: - write(HttpResponse(400, "Bad Request")); + case RequestParser::BadRequest: + sendResponse(Response(400, "Bad Request")); break; - case HttpRequestParser::NoError: - HttpEnvironment env; + case RequestParser::NoError: + Environment env; env.clientAddress = m_socket->peerAddress(); - HttpResponse response = RequestHandler(request, env, WebApplication::instance()).run(); + Response response = m_requestHandler->processRequest(request, env); if (acceptsGzipEncoding(request.headers["accept-encoding"])) response.headers[HEADER_CONTENT_ENCODING] = "gzip"; - write(response); + sendResponse(response); break; } } -void HttpConnection::write(const HttpResponse& response) +void Connection::sendResponse(const Response &response) { - m_socket->write(HttpResponseGenerator::generate(response)); + m_socket->write(ResponseGenerator::generate(response)); m_socket->disconnectFromHost(); } -bool HttpConnection::acceptsGzipEncoding(const QString& encoding) +bool Connection::acceptsGzipEncoding(const QString &encoding) { int pos = encoding.indexOf("gzip", 0, Qt::CaseInsensitive); if (pos == -1) diff --git a/src/webui/httpconnection.h b/src/core/http/connection.h similarity index 79% rename from src/webui/httpconnection.h rename to src/core/http/connection.h index 0b768276a..4d3b28243 100644 --- a/src/webui/httpconnection.h +++ b/src/core/http/connection.h @@ -30,37 +30,42 @@ */ -#ifndef HTTPCONNECTION_H -#define HTTPCONNECTION_H +#ifndef HTTP_CONNECTION_H +#define HTTP_CONNECTION_H #include -#include "httptypes.h" - -class HttpServer; +#include "types.h" QT_BEGIN_NAMESPACE class QTcpSocket; QT_END_NAMESPACE -class HttpConnection : public QObject +namespace Http +{ + +class IRequestHandler; + +class Connection : public QObject { Q_OBJECT - Q_DISABLE_COPY(HttpConnection) + Q_DISABLE_COPY(Connection) public: - HttpConnection(QTcpSocket* socket, HttpServer* httpserver); - ~HttpConnection(); + Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = 0); + ~Connection(); private slots: void read(); private: - void write(const HttpResponse& response); - - static bool acceptsGzipEncoding(const QString& encoding); + static bool acceptsGzipEncoding(const QString &encoding); + void sendResponse(const Response &response); QTcpSocket *m_socket; + IRequestHandler *m_requestHandler; QByteArray m_receivedData; }; -#endif +} + +#endif // HTTP_CONNECTION_H diff --git a/src/core/http/irequesthandler.h b/src/core/http/irequesthandler.h new file mode 100644 index 000000000..2fab8d5c6 --- /dev/null +++ b/src/core/http/irequesthandler.h @@ -0,0 +1,47 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#ifndef HTTP_IREQUESTHANDLER_H +#define HTTP_IREQUESTHANDLER_H + +#include "types.h" + +namespace Http +{ + +class IRequestHandler +{ +public: + virtual ~IRequestHandler() {} + virtual Response processRequest(const Request &request, const Environment &env) = 0; +}; + +} + +#endif // HTTP_IREQUESTHANDLER_H + diff --git a/src/core/httprequestparser.cpp b/src/core/http/requestparser.cpp similarity index 82% rename from src/core/httprequestparser.cpp rename to src/core/http/requestparser.cpp index 8d0894d32..d056aa539 100644 --- a/src/core/httprequestparser.cpp +++ b/src/core/http/requestparser.cpp @@ -38,7 +38,7 @@ #include #include #include -#include "httprequestparser.h" +#include "requestparser.h" const QByteArray EOL("\r\n"); const QByteArray EOH("\r\n\r\n"); @@ -51,19 +51,21 @@ inline QString unquoted(const QString& str) return str; } -HttpRequestParser::ErrorCode HttpRequestParser::parse(const QByteArray& data, HttpRequest& request, uint maxContentLength) +using namespace Http; + +RequestParser::ErrorCode RequestParser::parse(const QByteArray& data, Request& request, uint maxContentLength) { - return HttpRequestParser(maxContentLength).parseHttpRequest(data, request); + return RequestParser(maxContentLength).parseHttpRequest(data, request); } -HttpRequestParser::HttpRequestParser(uint maxContentLength) - : maxContentLength_(maxContentLength) +RequestParser::RequestParser(uint maxContentLength) + : m_maxContentLength(maxContentLength) { } -HttpRequestParser::ErrorCode HttpRequestParser::parseHttpRequest(const QByteArray& data, HttpRequest& request) +RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data, Request& request) { - request_ = HttpRequest(); + m_request = Request(); // Parse HTTP request header const int header_end = data.indexOf(EOH); @@ -81,10 +83,10 @@ HttpRequestParser::ErrorCode HttpRequestParser::parseHttpRequest(const QByteArra // Parse HTTP request message int content_length = 0; - if (request_.headers.contains("content-length")) + if (m_request.headers.contains("content-length")) { - content_length = request_.headers["content-length"].toInt(); - if (content_length > static_cast(maxContentLength_)) + content_length = m_request.headers["content-length"].toInt(); + if (content_length > static_cast(m_maxContentLength)) { qWarning() << Q_FUNC_INFO << "bad request: message too long"; return BadRequest; @@ -108,20 +110,20 @@ HttpRequestParser::ErrorCode HttpRequestParser::parseHttpRequest(const QByteArra // qDebug() << "HTTP Request header:"; // qDebug() << data.left(header_end) << "\n"; - request = request_; + request = m_request; return NoError; } -bool HttpRequestParser::parseStartingLine(const QString &line) +bool RequestParser::parseStartingLine(const QString &line) { const QRegExp rx("^([A-Z]+)\\s+(\\S+)\\s+HTTP/\\d\\.\\d$"); if (rx.indexIn(line.trimmed()) >= 0) { - request_.method = rx.cap(1); + m_request.method = rx.cap(1); QUrl url = QUrl::fromEncoded(rx.cap(2).toLatin1()); - request_.path = url.path(); // Path + m_request.path = url.path(); // Path // Parse GET parameters #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) @@ -132,7 +134,7 @@ bool HttpRequestParser::parseStartingLine(const QString &line) while (i.hasNext()) { QPair pair = i.next(); - request_.gets[pair.first] = pair.second; + m_request.gets[pair.first] = pair.second; } return true; @@ -142,7 +144,7 @@ bool HttpRequestParser::parseStartingLine(const QString &line) return false; } -bool HttpRequestParser::parseHeaderLine(const QString &line, QPair& out) +bool RequestParser::parseHeaderLine(const QString &line, QPair& out) { int i = line.indexOf(QLatin1Char(':')); if (i == -1) @@ -155,7 +157,7 @@ bool HttpRequestParser::parseHeaderLine(const QString &line, QPair HttpRequestParser::splitMultipartData(const QByteArray& data, const QByteArray& boundary) +QList RequestParser::splitMultipartData(const QByteArray& data, const QByteArray& boundary) { QList ret; QByteArray sep = boundary + EOL; @@ -223,14 +225,14 @@ QList HttpRequestParser::splitMultipartData(const QByteArray& data, return ret; } -bool HttpRequestParser::parseContent(const QByteArray& data) +bool RequestParser::parseContent(const QByteArray& data) { // Parse message content - qDebug() << Q_FUNC_INFO << "Content-Length: " << request_.headers["content-length"]; + qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"]; qDebug() << Q_FUNC_INFO << "data.size(): " << data.size(); // Parse url-encoded POST data - if (request_.headers["content-type"].startsWith("application/x-www-form-urlencoded")) + if (m_request.headers["content-type"].startsWith("application/x-www-form-urlencoded")) { QUrl url; #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) @@ -243,7 +245,7 @@ bool HttpRequestParser::parseContent(const QByteArray& data) while (i.hasNext()) { QPair pair = i.next(); - request_.posts[pair.first.toLower()] = pair.second; + m_request.posts[pair.first.toLower()] = pair.second; } return true; @@ -268,7 +270,7 @@ Content-Disposition: form-data; name=\"Upload\" Submit Query --cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5-- **/ - QString content_type = request_.headers["content-type"]; + QString content_type = m_request.headers["content-type"]; if (content_type.startsWith("multipart/form-data")) { const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\""); @@ -309,7 +311,7 @@ Submit Query return false; } -bool HttpRequestParser::parseFormData(const QByteArray& data) +bool RequestParser::parseFormData(const QByteArray& data) { // Parse form data header const int header_end = data.indexOf(EOH); @@ -347,17 +349,17 @@ bool HttpRequestParser::parseFormData(const QByteArray& data) ufile.type = disposition["content-type"]; ufile.data = data.mid(header_end + EOH.length()); - request_.files[disposition["name"]] = ufile; + m_request.files[disposition["name"]] = ufile; } else { - request_.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length())); + m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length())); } return true; } -bool HttpRequestParser::parseHeaderValue(const QString& value, QStringMap& out) +bool RequestParser::parseHeaderValue(const QString& value, QStringMap& out) { QStringList items = value.split(QLatin1Char(';')); out[""] = items[0]; diff --git a/src/core/httprequestparser.h b/src/core/http/requestparser.h similarity index 83% rename from src/core/httprequestparser.h rename to src/core/http/requestparser.h index 9169c040f..01ddb7176 100644 --- a/src/core/httprequestparser.h +++ b/src/core/http/requestparser.h @@ -29,24 +29,27 @@ * Contact : chris@qbittorrent.org */ -#ifndef HTTPREQUESTPARSER_H -#define HTTPREQUESTPARSER_H +#ifndef HTTP_REQUESTPARSER_H +#define HTTP_REQUESTPARSER_H -#include "httptypes.h" +#include "types.h" -class HttpRequestParser +namespace Http +{ + +class RequestParser { public: enum ErrorCode { NoError = 0, IncompleteRequest, BadRequest }; // when result != NoError parsed request is undefined // Warning! Header names are converted to lower-case. - static ErrorCode parse(const QByteArray& data, HttpRequest& request, uint maxContentLength = 10000000 /* ~10MB */); + static ErrorCode parse(const QByteArray& data, Request& request, uint maxContentLength = 10000000 /* ~10MB */); private: - HttpRequestParser(uint maxContentLength); + RequestParser(uint maxContentLength); - ErrorCode parseHttpRequest(const QByteArray& data, HttpRequest& request); + ErrorCode parseHttpRequest(const QByteArray& data, Request& request); bool parseHttpHeader(const QByteArray& data); bool parseStartingLine(const QString &line); @@ -57,8 +60,10 @@ private: static bool parseHeaderLine(const QString& line, QPair& out); static bool parseHeaderValue(const QString& value, QStringMap& out); - const uint maxContentLength_; - HttpRequest request_; + const uint m_maxContentLength; + Request m_request; }; -#endif +} + +#endif // HTTP_REQUESTPARSER_H diff --git a/src/core/http/responsebuilder.cpp b/src/core/http/responsebuilder.cpp new file mode 100644 index 000000000..954ed05b5 --- /dev/null +++ b/src/core/http/responsebuilder.cpp @@ -0,0 +1,74 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include "responsebuilder.h" + +using namespace Http; + +ResponseBuilder::ResponseBuilder(QObject *parent) + : QObject(parent) +{ +} + +void ResponseBuilder::status(uint code, const QString &text) +{ + m_response.status = ResponseStatus(code, text); +} + +void ResponseBuilder::header(const QString &name, const QString &value) +{ + m_response.headers[name] = value; +} + +void ResponseBuilder::print(const QString &text, const QString &type) +{ + print_impl(text.toUtf8(), type); +} + +void ResponseBuilder::print(const QByteArray &data, const QString &type) +{ + print_impl(data, type); +} + +void ResponseBuilder::clear() +{ + m_response = Response(); +} + +Response ResponseBuilder::response() const +{ + return m_response; +} + +void ResponseBuilder::print_impl(const QByteArray &data, const QString &type) +{ + if (!m_response.headers.contains(HEADER_CONTENT_TYPE)) + m_response.headers[HEADER_CONTENT_TYPE] = type; + + m_response.content += data; +} diff --git a/src/core/http/responsebuilder.h b/src/core/http/responsebuilder.h new file mode 100644 index 000000000..0a3b0d8f1 --- /dev/null +++ b/src/core/http/responsebuilder.h @@ -0,0 +1,60 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#ifndef HTTP_RESPONSEBUILDER_H +#define HTTP_RESPONSEBUILDER_H + +#include +#include "types.h" + +namespace Http +{ + +class ResponseBuilder : public QObject +{ +public: + explicit ResponseBuilder(QObject *parent = 0); + +protected: + void status(uint code = 200, const QString &text = QLatin1String("OK")); + void header(const QString &name, const QString &value); + void print(const QString &text, const QString &type = CONTENT_TYPE_HTML); + void print(const QByteArray &data, const QString &type = CONTENT_TYPE_HTML); + void clear(); + + Response response() const; + +private: + void print_impl(const QByteArray &data, const QString &type); + + Response m_response; +}; + +} + +#endif // HTTP_RESPONSEBUILDER_H diff --git a/src/core/httpresponsegenerator.cpp b/src/core/http/responsegenerator.cpp similarity index 97% rename from src/core/httpresponsegenerator.cpp rename to src/core/http/responsegenerator.cpp index 02842c514..64f0ffbf7 100644 --- a/src/core/httpresponsegenerator.cpp +++ b/src/core/http/responsegenerator.cpp @@ -30,11 +30,13 @@ */ #include -#include "httpresponsegenerator.h" +#include "responsegenerator.h" bool gCompress(QByteArray data, QByteArray& dest_buffer); -QByteArray HttpResponseGenerator::generate(HttpResponse response) +using namespace Http; + +QByteArray ResponseGenerator::generate(Response response) { if (response.headers[HEADER_CONTENT_ENCODING] == "gzip") { diff --git a/src/core/httpresponsegenerator.h b/src/core/http/responsegenerator.h similarity index 87% rename from src/core/httpresponsegenerator.h rename to src/core/http/responsegenerator.h index d06e134c0..43d73d709 100644 --- a/src/core/httpresponsegenerator.h +++ b/src/core/http/responsegenerator.h @@ -30,15 +30,20 @@ */ -#ifndef HTTPRESPONSEGENERATOR_H -#define HTTPRESPONSEGENERATOR_H +#ifndef HTTP_RESPONSEGENERATOR_H +#define HTTP_RESPONSEGENERATOR_H -#include "httptypes.h" +#include "types.h" -class HttpResponseGenerator +namespace Http +{ + +class ResponseGenerator { public: - static QByteArray generate(HttpResponse response); + static QByteArray generate(Response response); }; -#endif +} + +#endif // HTTP_RESPONSEGENERATOR_H diff --git a/src/webui/httpserver.cpp b/src/core/http/server.cpp similarity index 84% rename from src/webui/httpserver.cpp rename to src/core/http/server.cpp index c37c5301c..6430f9745 100644 --- a/src/webui/httpserver.cpp +++ b/src/core/http/server.cpp @@ -33,30 +33,33 @@ #else #include #endif -#include "httpconnection.h" -#include "httpserver.h" +#include "connection.h" +#include "server.h" -HttpServer::HttpServer(QObject* parent) +using namespace Http; + +Server::Server(IRequestHandler *requestHandler, QObject* parent) : QTcpServer(parent) + , m_requestHandler(requestHandler) #ifndef QT_NO_OPENSSL , m_https(false) #endif { } -HttpServer::~HttpServer() +Server::~Server() { } #ifndef QT_NO_OPENSSL -void HttpServer::enableHttps(const QSslCertificate &certificate, const QSslKey &key) +void Server::enableHttps(const QSslCertificate &certificate, const QSslKey &key) { m_certificate = certificate; m_key = key; m_https = true; } -void HttpServer::disableHttps() +void Server::disableHttps() { m_https = false; m_certificate.clear(); @@ -65,9 +68,9 @@ void HttpServer::disableHttps() #endif #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) -void HttpServer::incomingConnection(qintptr socketDescriptor) +void Server::incomingConnection(qintptr socketDescriptor) #else -void HttpServer::incomingConnection(int socketDescriptor) +void Server::incomingConnection(int socketDescriptor) #endif { QTcpSocket *serverSocket; @@ -88,7 +91,7 @@ void HttpServer::incomingConnection(int socketDescriptor) static_cast(serverSocket)->startServerEncryption(); } #endif - new HttpConnection(serverSocket, this); + new Connection(serverSocket, m_requestHandler, this); } else { diff --git a/src/webui/httpserver.h b/src/core/http/server.h similarity index 87% rename from src/webui/httpserver.h rename to src/core/http/server.h index d68728f75..5ee591421 100644 --- a/src/webui/httpserver.h +++ b/src/core/http/server.h @@ -30,8 +30,8 @@ */ -#ifndef HTTPSERVER_H -#define HTTPSERVER_H +#ifndef HTTP_SERVER_H +#define HTTP_SERVER_H #include #ifndef QT_NO_OPENSSL @@ -39,14 +39,20 @@ #include #endif -class HttpServer : public QTcpServer +namespace Http +{ + +class IRequestHandler; +class Connection; + +class Server : public QTcpServer { Q_OBJECT - Q_DISABLE_COPY(HttpServer) + Q_DISABLE_COPY(Server) public: - HttpServer(QObject* parent = 0); - ~HttpServer(); + Server(IRequestHandler *requestHandler, QObject *parent = 0); + ~Server(); #ifndef QT_NO_OPENSSL void enableHttps(const QSslCertificate &certificate, const QSslKey &key); @@ -61,6 +67,7 @@ private: #endif private: + IRequestHandler *m_requestHandler; #ifndef QT_NO_OPENSSL bool m_https; QSslCertificate m_certificate; @@ -68,4 +75,6 @@ private: #endif }; -#endif +} + +#endif // HTTP_SERVER_H diff --git a/src/core/httptypes.h b/src/core/http/types.h similarity index 75% rename from src/core/httptypes.h rename to src/core/http/types.h index 7fd95c310..5857031bb 100644 --- a/src/core/httptypes.h +++ b/src/core/http/types.h @@ -26,8 +26,8 @@ * exception statement from your version. */ -#ifndef HTTPTYPES_H -#define HTTPTYPES_H +#ifndef HTTP_TYPES_H +#define HTTP_TYPES_H #include #include @@ -35,6 +35,9 @@ typedef QMap QStringMap; +namespace Http +{ + const QString HEADER_SET_COOKIE = "Set-Cookie"; const QString HEADER_CONTENT_TYPE = "Content-Type"; const QString HEADER_CONTENT_ENCODING = "Content-Encoding"; @@ -48,43 +51,45 @@ const QString CONTENT_TYPE_JS = "text/javascript; charset=UTF-8"; const QString CONTENT_TYPE_PNG = "image/png"; const QString CONTENT_TYPE_TXT = "text/plain; charset=UTF-8"; -struct HttpEnvironment +struct Environment { - QHostAddress clientAddress; + QHostAddress clientAddress; }; struct UploadedFile { - QString filename; // original filename - QString type; // MIME type - QByteArray data; // File data + QString filename; // original filename + QString type; // MIME type + QByteArray data; // File data }; -struct HttpRequest +struct Request { - QString method; - QString path; - QStringMap headers; - QStringMap gets; - QStringMap posts; - QMap files; + QString method; + QString path; + QStringMap headers; + QStringMap gets; + QStringMap posts; + QMap files; }; -struct HttpResponseStatus +struct ResponseStatus { - uint code; - QString text; + uint code; + QString text; - HttpResponseStatus(uint code = 200, const QString& text = "OK"): code(code), text(text) {} + ResponseStatus(uint code = 200, const QString& text = "OK"): code(code), text(text) {} }; -struct HttpResponse +struct Response { - HttpResponseStatus status; - QStringMap headers; - QByteArray content; + ResponseStatus status; + QStringMap headers; + QByteArray content; - HttpResponse(uint code = 200, const QString& text = "OK"): status(code, text) {} + Response(uint code = 200, const QString& text = "OK"): status(code, text) {} }; -#endif // HTTPTYPES_H +} + +#endif // HTTP_TYPES_H diff --git a/src/core/qtlibtorrent/qbtsession.cpp b/src/core/qtlibtorrent/qbtsession.cpp index cd46234aa..05aff6a20 100644 --- a/src/core/qtlibtorrent/qbtsession.cpp +++ b/src/core/qtlibtorrent/qbtsession.cpp @@ -57,7 +57,6 @@ #include "geoipmanager.h" #endif #include "torrentpersistentdata.h" -#include "httpserver.h" #include "bandwidthscheduler.h" #include #include @@ -79,7 +78,6 @@ #include #include #include -#include "dnsupdater.h" #if LIBTORRENT_VERSION_NUM < 10000 #include @@ -117,7 +115,6 @@ QBtSession::QBtSession() #if LIBTORRENT_VERSION_NUM < 10000 , m_upnp(0), m_natpmp(0) #endif - , m_dynDNSUpdater(0) , m_alertDispatcher(0) { BigRatioTimer = new QTimer(this); @@ -159,6 +156,7 @@ QBtSession::QBtSession() connect(m_scanFolders, SIGNAL(torrentsAdded(QStringList&)), SLOT(addTorrentsFromScanFolder(QStringList&))); // Apply user settings to Bittorrent session configureSession(); + connect(pref, SIGNAL(changed()), SLOT(configureSession())); // Torrent speed monitor m_speedMonitor = new TorrentSpeedMonitor(this); m_torrentStatistics = new TorrentStatistics(this, this); @@ -191,9 +189,6 @@ QBtSession::~QBtSession() { delete downloader; if (bd_scheduler) delete bd_scheduler; - // HTTP Server - if (httpServer) - delete httpServer; delete m_alertDispatcher; delete m_torrentStatistics; qDebug("Deleting the session"); @@ -583,9 +578,6 @@ void QBtSession::configureSession() { }else{ disableIPFilter(); } - // Update Web UI - // Use a QTimer because the function can be called from qBtSession constructor - QTimer::singleShot(0, this, SLOT(initWebUi())); // * Proxy settings proxy_settings proxySettings; if (pref->isProxyEnabled()) { @@ -655,64 +647,6 @@ void QBtSession::configureSession() { qDebug("Session configured"); } -void QBtSession::initWebUi() { - Preferences* const pref = Preferences::instance(); - if (pref->isWebUiEnabled()) { - const quint16 port = pref->getWebUiPort(); - - if (httpServer) { - if (httpServer->serverPort() != port) { - httpServer->close(); - } - } else { - httpServer = new HttpServer(this); - } - -#ifndef QT_NO_OPENSSL - if (pref->isWebUiHttpsEnabled()) { - QSslCertificate cert(pref->getWebUiHttpsCertificate()); - QSslKey key; - const QByteArray raw_key = pref->getWebUiHttpsKey(); - key = QSslKey(raw_key, QSsl::Rsa); - if (!cert.isNull() && !key.isNull()) - httpServer->enableHttps(cert, key); - else - httpServer->disableHttps(); - } else { - httpServer->disableHttps(); - } -#endif - - if (!httpServer->isListening()) { - Logger* const logger = Logger::instance(); - bool success = httpServer->listen(QHostAddress::Any, port); - if (success) - logger->addMessage(tr("The Web UI is listening on port %1").arg(port)); - else - logger->addMessage(tr("Web User Interface Error - Unable to bind Web UI to port %1").arg(port), Log::CRITICAL); - } - // DynDNS - if (pref->isDynDNSEnabled()) { - if (!m_dynDNSUpdater) - m_dynDNSUpdater = new DNSUpdater(this); - else - m_dynDNSUpdater->updateCredentials(); - } else { - if (m_dynDNSUpdater) { - delete m_dynDNSUpdater; - m_dynDNSUpdater = 0; - } - } - } else { - if (httpServer) - delete httpServer; - if (m_dynDNSUpdater) { - delete m_dynDNSUpdater; - m_dynDNSUpdater = 0; - } - } -} - void QBtSession::useAlternativeSpeedsLimit(bool alternative) { qDebug() << Q_FUNC_INFO << alternative; // Save new state to remember it on startup @@ -1495,6 +1429,7 @@ void QBtSession::enableUPnP(bool b) { s->start_upnp(); s->start_natpmp(); #endif + // TODO: Remove dependency from WebUI // Use UPnP/NAT-PMP for Web UI too if (pref->isWebUiEnabled() && pref->useUPnPForWebUIPort()) { const qint16 port = pref->getWebUiPort(); diff --git a/src/core/qtlibtorrent/qbtsession.h b/src/core/qtlibtorrent/qbtsession.h index e856519d1..3edbe6a38 100644 --- a/src/core/qtlibtorrent/qbtsession.h +++ b/src/core/qtlibtorrent/qbtsession.h @@ -90,12 +90,10 @@ namespace libtorrent { class DownloadThread; class FilterParserThread; -class HttpServer; class BandwidthScheduler; class ScanFoldersModel; class TorrentSpeedMonitor; class TorrentStatistics; -class DNSUpdater; class QAlertDispatcher; enum TorrentExportFolder { @@ -209,7 +207,6 @@ public slots: #endif void addMagnetInteractive(const QString& uri); void downloadFromURLList(const QStringList& urls); - void configureSession(); void banIP(QString ip); void recursiveTorrentDownload(const QTorrentHandle &h); void unhideMagnet(const QString &hash); @@ -264,9 +261,9 @@ private slots: void mergeTorrents(QTorrentHandle& h_ex, boost::intrusive_ptr t); void mergeTorrents(QTorrentHandle& h_ex, const QString& magnet_uri); void exportTorrentFile(const QTorrentHandle &h, TorrentExportFolder folder = RegularTorrentExportFolder); - void initWebUi(); void handleIPFilterParsed(int ruleCount); void handleIPFilterError(); + void configureSession(); signals: void addedTorrent(const QTorrentHandle& h); @@ -327,8 +324,6 @@ private: // IP filtering QPointer filterParser; QString filterPath; - // Web UI - QPointer httpServer; QList url_skippingDlg; // GeoIP #ifndef DISABLE_GUI @@ -344,8 +339,6 @@ private: libtorrent::upnp *m_upnp; libtorrent::natpmp *m_natpmp; #endif - // DynDNS - DNSUpdater *m_dynDNSUpdater; QAlertDispatcher* m_alertDispatcher; TorrentStatistics* m_torrentStatistics; }; diff --git a/src/core/tracker/qtracker.cpp b/src/core/qtracker.cpp similarity index 54% rename from src/core/tracker/qtracker.cpp rename to src/core/qtracker.cpp index 0e334ccda..5afad0d50 100644 --- a/src/core/tracker/qtracker.cpp +++ b/src/core/qtracker.cpp @@ -1,5 +1,6 @@ /* * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -28,163 +29,171 @@ * Contact : chris@qbittorrent.org */ -#include - +#include #include -#include -#include "qtracker.h" #include "preferences.h" -#include "httpresponsegenerator.h" -#include "httprequestparser.h" +#include "http/server.h" +#include "qtracker.h" -#include +// QPeer +bool QPeer::operator!=(const QPeer &other) const +{ + return qhash() != other.qhash(); +} -using namespace libtorrent; +bool QPeer::operator==(const QPeer &other) const +{ + return qhash() == other.qhash(); +} -QTracker::QTracker(QObject *parent) : - QTcpServer(parent) +QString QPeer::qhash() const { - Q_ASSERT(Preferences::instance()->isTrackerEnabled()); - connect(this, SIGNAL(newConnection()), this, SLOT(handlePeerConnection())); + return ip + ":" + QString::number(port); } -QTracker::~QTracker() { - if (isListening()) { - qDebug("Shutting down the embedded tracker..."); - close(); - } - // TODO: Store the torrent list +libtorrent::entry QPeer::toEntry(bool no_peer_id) const +{ + libtorrent::entry::dictionary_type peer_map; + if (!no_peer_id) + peer_map["id"] = libtorrent::entry(peer_id.toStdString()); + peer_map["ip"] = libtorrent::entry(ip.toStdString()); + peer_map["port"] = libtorrent::entry(port); + + return libtorrent::entry(peer_map); } -void QTracker::handlePeerConnection() +// QTracker + +QTracker::QTracker(QObject *parent) + : Http::ResponseBuilder(parent) + , m_server(new Http::Server(this, this)) { - QTcpSocket *socket; - while((socket = nextPendingConnection())) - { - qDebug("QTracker: New peer connection"); - connect(socket, SIGNAL(readyRead()), SLOT(readRequest())); - } +} + +QTracker::~QTracker() +{ + if (m_server->isListening()) + qDebug("Shutting down the embedded tracker..."); + // TODO: Store the torrent list } bool QTracker::start() { const int listen_port = Preferences::instance()->getTrackerPort(); - // - if (isListening()) { - if (serverPort() == listen_port) { + + if (m_server->isListening()) { + if (m_server->serverPort() == listen_port) { // Already listening on the right port, just return return true; } // Wrong port, closing the server - close(); + m_server->close(); } + qDebug("Starting the embedded tracker..."); // Listen on the predefined port - return listen(QHostAddress::Any, listen_port); + return m_server->listen(QHostAddress::Any, listen_port); } -void QTracker::readRequest() +Http::Response QTracker::processRequest(const Http::Request &request, const Http::Environment &env) { - QTcpSocket *socket = static_cast(sender()); - QByteArray input = socket->readAll(); - //qDebug("QTracker: Raw request:\n%s", input.data()); - HttpRequest request; - if (HttpRequestParser::parse(input, request) != HttpRequestParser::NoError) { - qDebug("QTracker: Invalid HTTP Request:\n %s", qPrintable(input)); - respondInvalidRequest(socket, 100, "Invalid request type"); - return; - } - //qDebug("QTracker received the following request:\n%s", qPrintable(parser.toString())); - // Request is correct, is it a GET request? - if (request.method != "GET") { - qDebug("QTracker: Unsupported HTTP request: %s", qPrintable(request.method)); - respondInvalidRequest(socket, 100, "Invalid request type"); - return; - } - if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) { - qDebug("QTracker: Unrecognized path: %s", qPrintable(request.path)); - respondInvalidRequest(socket, 100, "Invalid request type"); - return; - } + clear(); // clear response - // OK, this is a GET request - respondToAnnounceRequest(socket, request.gets); -} + //qDebug("QTracker received the following request:\n%s", qPrintable(parser.toString())); + // Is request a GET request? + if (request.method != "GET") { + qDebug("QTracker: Unsupported HTTP request: %s", qPrintable(request.method)); + status(100, "Invalid request type"); + } + else if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) { + qDebug("QTracker: Unrecognized path: %s", qPrintable(request.path)); + status(100, "Invalid request type"); + } + else { + // OK, this is a GET request + m_request = request; + m_env = env; + respondToAnnounceRequest(); + } -void QTracker::respondInvalidRequest(QTcpSocket *socket, int code, QString msg) -{ - HttpResponse response(code, msg); - socket->write(HttpResponseGenerator::generate(response)); - socket->disconnectFromHost(); + return response(); } -void QTracker::respondToAnnounceRequest(QTcpSocket *socket, - const QMap& get_parameters) +void QTracker::respondToAnnounceRequest() { + const QStringMap &gets = m_request.gets; TrackerAnnounceRequest annonce_req; + // IP - annonce_req.peer.ip = socket->peerAddress().toString(); + annonce_req.peer.ip = m_env.clientAddress.toString(); + // 1. Get info_hash - if (!get_parameters.contains("info_hash")) { + if (!gets.contains("info_hash")) { qDebug("QTracker: Missing info_hash"); - respondInvalidRequest(socket, 101, "Missing info_hash"); + status(101, "Missing info_hash"); return; } - annonce_req.info_hash = get_parameters.value("info_hash"); + annonce_req.info_hash = gets.value("info_hash"); // info_hash cannot be longer than 20 bytes /*if (annonce_req.info_hash.toLatin1().length() > 20) { qDebug("QTracker: Info_hash is not 20 byte long: %s (%d)", qPrintable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length()); - respondInvalidRequest(socket, 150, "Invalid infohash"); + status(150, "Invalid infohash"); return; }*/ + // 2. Get peer ID - if (!get_parameters.contains("peer_id")) { + if (!gets.contains("peer_id")) { qDebug("QTracker: Missing peer_id"); - respondInvalidRequest(socket, 102, "Missing peer_id"); + status(102, "Missing peer_id"); return; } - annonce_req.peer.peer_id = get_parameters.value("peer_id"); + annonce_req.peer.peer_id = gets.value("peer_id"); // peer_id cannot be longer than 20 bytes /*if (annonce_req.peer.peer_id.length() > 20) { qDebug("QTracker: peer_id is not 20 byte long: %s", qPrintable(annonce_req.peer.peer_id)); - respondInvalidRequest(socket, 151, "Invalid peerid"); + status(151, "Invalid peerid"); return; }*/ + // 3. Get port - if (!get_parameters.contains("port")) { + if (!gets.contains("port")) { qDebug("QTracker: Missing port"); - respondInvalidRequest(socket, 103, "Missing port"); + status(103, "Missing port"); return; } bool ok = false; - annonce_req.peer.port = get_parameters.value("port").toInt(&ok); + annonce_req.peer.port = gets.value("port").toInt(&ok); if (!ok || annonce_req.peer.port < 1 || annonce_req.peer.port > 65535) { qDebug("QTracker: Invalid port number (%d)", annonce_req.peer.port); - respondInvalidRequest(socket, 103, "Missing port"); + status(103, "Missing port"); return; } + // 4. Get event annonce_req.event = ""; - if (get_parameters.contains("event")) { - annonce_req.event = get_parameters.value("event"); + if (gets.contains("event")) { + annonce_req.event = gets.value("event"); qDebug("QTracker: event is %s", qPrintable(annonce_req.event)); } + // 5. Get numwant annonce_req.numwant = 50; - if (get_parameters.contains("numwant")) { - int tmp = get_parameters.value("numwant").toInt(); + if (gets.contains("numwant")) { + int tmp = gets.value("numwant").toInt(); if (tmp > 0) { - qDebug("QTracker: numwant=%d", tmp); + qDebug("QTracker: numwant = %d", tmp); annonce_req.numwant = tmp; } } + // 6. no_peer_id (extension) annonce_req.no_peer_id = false; - if (get_parameters.contains("no_peer_id")) { + if (gets.contains("no_peer_id")) annonce_req.no_peer_id = true; - } + // 7. TODO: support "compact" extension + // Done parsing, now let's reply if (m_torrents.contains(annonce_req.info_hash)) { if (annonce_req.event == "stopped") { @@ -207,33 +216,32 @@ void QTracker::respondToAnnounceRequest(QTcpSocket *socket, } peers[annonce_req.peer.qhash()] = annonce_req.peer; m_torrents[annonce_req.info_hash] = peers; + // Reply - ReplyWithPeerList(socket, annonce_req); + replyWithPeerList(annonce_req); } -void QTracker::ReplyWithPeerList(QTcpSocket *socket, const TrackerAnnounceRequest &annonce_req) +void QTracker::replyWithPeerList(const TrackerAnnounceRequest &annonce_req) { // Prepare the entry for bencoding - entry::dictionary_type reply_dict; - reply_dict["interval"] = entry(ANNOUNCE_INTERVAL); + libtorrent::entry::dictionary_type reply_dict; + reply_dict["interval"] = libtorrent::entry(ANNOUNCE_INTERVAL); QList peers = m_torrents.value(annonce_req.info_hash).values(); - entry::list_type peer_list; + libtorrent::entry::list_type peer_list; foreach (const QPeer & p, peers) { //if (p != annonce_req.peer) peer_list.push_back(p.toEntry(annonce_req.no_peer_id)); } - reply_dict["peers"] = entry(peer_list); - entry reply_entry(reply_dict); + reply_dict["peers"] = libtorrent::entry(peer_list); + libtorrent::entry reply_entry(reply_dict); // bencode std::vector buf; - bencode(std::back_inserter(buf), reply_entry); + libtorrent::bencode(std::back_inserter(buf), reply_entry); QByteArray reply(&buf[0], static_cast(buf.size())); qDebug("QTracker: reply with the following bencoded data:\n %s", reply.constData()); + // HTTP reply - HttpResponse response(200, "OK"); - response.content = reply; - socket->write(HttpResponseGenerator::generate(response)); - socket->disconnectFromHost(); + print(reply, Http::CONTENT_TYPE_TXT); } diff --git a/src/core/tracker/qtracker.h b/src/core/qtracker.h similarity index 64% rename from src/core/tracker/qtracker.h rename to src/core/qtracker.h index bf313ba18..520480d78 100644 --- a/src/core/tracker/qtracker.h +++ b/src/core/qtracker.h @@ -1,5 +1,6 @@ /* - * Bittorrent Client using Qt4 and libtorrent. + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -31,11 +32,33 @@ #ifndef QTRACKER_H #define QTRACKER_H -#include +#include #include +#include "http/types.h" +#include "http/responsebuilder.h" +#include "http/irequesthandler.h" -#include "trackerannouncerequest.h" -#include "qpeer.h" +struct QPeer +{ + QString ip; + QString peer_id; + int port; + + bool operator!=(const QPeer &other) const; + bool operator==(const QPeer &other) const; + QString qhash() const; + libtorrent::entry toEntry(bool no_peer_id) const; +}; + +struct TrackerAnnounceRequest +{ + QString info_hash; + QString event; + int numwant; + QPeer peer; + // Extensions + bool no_peer_id; +}; // static limits const int MAX_TORRENTS = 100; @@ -45,9 +68,11 @@ const int ANNOUNCE_INTERVAL = 1800; // 30min typedef QHash PeerList; typedef QHash TorrentList; -/* Basic Bittorrent tracker implementation in Qt4 */ +namespace Http { class Server; } + +/* Basic Bittorrent tracker implementation in Qt */ /* Following http://wiki.theory.org/BitTorrent_Tracker_Protocol */ -class QTracker : public QTcpServer +class QTracker : public Http::ResponseBuilder, public Http::IRequestHandler { Q_OBJECT Q_DISABLE_COPY(QTracker) @@ -55,18 +80,19 @@ class QTracker : public QTcpServer public: explicit QTracker(QObject *parent = 0); ~QTracker(); - bool start(); -protected slots: - void readRequest(); - void handlePeerConnection(); - void respondInvalidRequest(QTcpSocket *socket, int code, QString msg); - void respondToAnnounceRequest(QTcpSocket *socket, const QMap& get_parameters); - void ReplyWithPeerList(QTcpSocket *socket, const TrackerAnnounceRequest &annonce_req); + bool start(); + Http::Response processRequest(const Http::Request &request, const Http::Environment &env); private: + void respondToAnnounceRequest(); + void replyWithPeerList(const TrackerAnnounceRequest &annonce_req); + + Http::Server *m_server; TorrentList m_torrents; + Http::Request m_request; + Http::Environment m_env; }; #endif // QTRACKER_H diff --git a/src/core/tracker/qpeer.h b/src/core/tracker/qpeer.h deleted file mode 100644 index 05073ee0f..000000000 --- a/src/core/tracker/qpeer.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef QPEER_H -#define QPEER_H - -#include -#include - -struct QPeer { - - bool operator!=(const QPeer &other) const { - return qhash() != other.qhash(); - } - - bool operator==(const QPeer &other) const { - return qhash() == other.qhash(); - } - - QString qhash() const { - return ip+":"+QString::number(port); - } - - libtorrent::entry toEntry(bool no_peer_id) const { - libtorrent::entry::dictionary_type peer_map; - if (!no_peer_id) - peer_map["id"] = libtorrent::entry(peer_id.toStdString()); - peer_map["ip"] = libtorrent::entry(ip.toStdString()); - peer_map["port"] = libtorrent::entry(port); - return libtorrent::entry(peer_map); - } - - QString ip; - QString peer_id; - int port; -}; - -#endif // QPEER_H diff --git a/src/core/tracker/tracker.pri b/src/core/tracker/tracker.pri deleted file mode 100644 index 5b5809a86..000000000 --- a/src/core/tracker/tracker.pri +++ /dev/null @@ -1,9 +0,0 @@ -INCLUDEPATH += $$PWD - -HEADERS += \ - $$PWD/qtracker.h \ - $$PWD/trackerannouncerequest.h \ - $$PWD/qpeer.h - -SOURCES += \ - $$PWD/qtracker.cpp diff --git a/src/core/tracker/trackerannouncerequest.h b/src/core/tracker/trackerannouncerequest.h deleted file mode 100644 index 273ced385..000000000 --- a/src/core/tracker/trackerannouncerequest.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef TRACKERANNOUNCEREQUEST_H -#define TRACKERANNOUNCEREQUEST_H - -#include - -struct TrackerAnnounceRequest { - QString info_hash; - QString event; - int numwant; - QPeer peer; - // Extensions - bool no_peer_id; -}; - -#endif // TRACKERANNOUNCEREQUEST_H diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index a8eb3170c..1adc167bd 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -1185,9 +1185,6 @@ void MainWindow::loadPreferences(bool configure_session) IconProvider::instance()->useSystemIconTheme(pref->useSystemIconTheme()); #endif - if (configure_session) - QBtSession::instance()->configureSession(); - #if defined(Q_OS_WIN) || defined(Q_OS_MAC) if (pref->isUpdateCheckEnabled()) checkProgramUpdate(); diff --git a/src/gui/options_imp.cpp b/src/gui/options_imp.cpp index 18f394ff4..cbfa62c8a 100644 --- a/src/gui/options_imp.cpp +++ b/src/gui/options_imp.cpp @@ -70,7 +70,11 @@ options_imp::options_imp(QWidget *parent): tabSelection->item(TAB_CONNECTION)->setIcon(IconProvider::instance()->getIcon("network-wired")); tabSelection->item(TAB_DOWNLOADS)->setIcon(IconProvider::instance()->getIcon("download")); tabSelection->item(TAB_SPEED)->setIcon(IconProvider::instance()->getIcon("chronometer")); +#ifndef DISABLE_WEBUI tabSelection->item(TAB_WEBUI)->setIcon(IconProvider::instance()->getIcon("network-server")); +#else + tabSelection->item(TAB_WEBUI)->setHidden(true); +#endif tabSelection->item(TAB_ADVANCED)->setIcon(IconProvider::instance()->getIcon("preferences-other")); IpFilterRefreshBtn->setIcon(IconProvider::instance()->getIcon("view-refresh")); @@ -229,6 +233,7 @@ options_imp::options_imp(QWidget *parent): connect(spinMaxActiveUploads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); connect(spinMaxActiveTorrents, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); connect(checkIgnoreSlowTorrentsForQueueing, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); +#ifndef DISABLE_WEBUI // Web UI tab connect(checkWebUi, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); connect(spinWebUiPort, SIGNAL(valueChanged(int)), this, SLOT(enableApplyButton())); @@ -244,6 +249,7 @@ options_imp::options_imp(QWidget *parent): connect(domainNameTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); connect(DNSUsernameTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); connect(DNSPasswordTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); +#endif // Disable apply Button applyButton->setEnabled(false); // Tab selection mecanism diff --git a/src/webui/abstractrequesthandler.cpp b/src/webui/abstractrequesthandler.cpp deleted file mode 100644 index 8753e9409..000000000 --- a/src/webui/abstractrequesthandler.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2012, Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include -#include -#include -#include -#include "preferences.h" -#include "webapplication.h" -#include "abstractrequesthandler.h" - -AbstractRequestHandler::AbstractRequestHandler(const HttpRequest &request, const HttpEnvironment &env, WebApplication *app) - : app_(app), session_(0), request_(request), env_(env) -{ - sessionInitialize(); - if (!sessionActive() && !isAuthNeeded()) - sessionStart(); -} - -HttpResponse AbstractRequestHandler::run() -{ - if (isBanned()) { - status(403, "Forbidden"); - print(QObject::tr("Your IP address has been banned after too many failed authentication attempts."), CONTENT_TYPE_TXT); - } - else { - processRequest(); - } - - return response_; -} - -bool AbstractRequestHandler::isAuthNeeded() -{ - return - ( - env_.clientAddress != QHostAddress::LocalHost && - env_.clientAddress != QHostAddress::LocalHostIPv6 - ) || Preferences::instance()->isWebUiLocalAuthEnabled(); -} - -void AbstractRequestHandler::status(uint code, const QString& text) -{ - response_.status = HttpResponseStatus(code, text); -} - -void AbstractRequestHandler::header(const QString& name, const QString& value) -{ - response_.headers[name] = value; -} - -void AbstractRequestHandler::print(const QString& text, const QString& type) -{ - print_impl(text.toUtf8(), type); -} - -void AbstractRequestHandler::print(const QByteArray& data, const QString& type) -{ - print_impl(data, type); -} - -void AbstractRequestHandler::print_impl(const QByteArray& data, const QString& type) -{ - if (!response_.headers.contains(HEADER_CONTENT_TYPE)) - response_.headers[HEADER_CONTENT_TYPE] = type; - - response_.content += data; -} - -void AbstractRequestHandler::printFile(const QString& path) -{ - QByteArray data; - QString type; - - if (!app_->readFile(path, data, type)) { - status(404, "Not Found"); - return; - } - - print(data, type); -} - -void AbstractRequestHandler::sessionInitialize() -{ - app_->sessionInitialize(this); -} - -void AbstractRequestHandler::sessionStart() -{ - if (app_->sessionStart(this)) { - QNetworkCookie cookie(C_SID.toUtf8(), session_->id.toUtf8()); - cookie.setPath("/"); - header(HEADER_SET_COOKIE, cookie.toRawForm()); - } -} - -void AbstractRequestHandler::sessionEnd() -{ - if (sessionActive()) { - QNetworkCookie cookie(C_SID.toUtf8(), session_->id.toUtf8()); - cookie.setPath("/"); - cookie.setExpirationDate(QDateTime::currentDateTime()); - - if (app_->sessionEnd(this)) - header(HEADER_SET_COOKIE, cookie.toRawForm()); - } -} - -bool AbstractRequestHandler::isBanned() const -{ - return app_->isBanned(this); -} - -int AbstractRequestHandler::failedAttempts() const -{ - return app_->failedAttempts(this); -} - -void AbstractRequestHandler::resetFailedAttempts() -{ - app_->resetFailedAttempts(this); -} - -void AbstractRequestHandler::increaseFailedAttempts() -{ - app_->increaseFailedAttempts(this); -} - -QString AbstractRequestHandler::saveTmpFile(const QByteArray &data) -{ - QTemporaryFile tmpfile(QDir::temp().absoluteFilePath("qBT-XXXXXX.torrent")); - tmpfile.setAutoRemove(false); - if (tmpfile.open()) { - tmpfile.write(data); - tmpfile.close(); - return tmpfile.fileName(); - } - - qWarning() << "I/O Error: Could not create temporary file"; - return QString(); -} diff --git a/src/webui/abstractwebapplication.cpp b/src/webui/abstractwebapplication.cpp new file mode 100644 index 000000000..be73940f9 --- /dev/null +++ b/src/webui/abstractwebapplication.cpp @@ -0,0 +1,413 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2014 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "preferences.h" +#include "websessiondata.h" +#include "abstractwebapplication.h" + +// UnbanTimer + +class UnbanTimer: public QTimer +{ +public: + UnbanTimer(const QHostAddress& peer_ip, QObject *parent) + : QTimer(parent), m_peerIp(peer_ip) + { + setSingleShot(true); + setInterval(BAN_TIME); + } + + inline const QHostAddress& peerIp() const { return m_peerIp; } + +private: + QHostAddress m_peerIp; +}; + +// WebSession + +struct WebSession +{ + const QString id; + uint timestamp; + WebSessionData data; + + WebSession(const QString& id) + : id(id) + { + } + + void updateTimestamp() + { + timestamp = QDateTime::currentDateTime().toTime_t(); + } +}; + +// AbstractWebApplication + +AbstractWebApplication::AbstractWebApplication(QObject *parent) + : Http::ResponseBuilder(parent) + , session_(0) +{ + QTimer *timer = new QTimer(this); + timer->setInterval(60000); // 1 min. + connect(timer, SIGNAL(timeout()), SLOT(removeInactiveSessions())); +} + +AbstractWebApplication::~AbstractWebApplication() +{ + // cleanup sessions data + qDeleteAll(sessions_); +} + +Http::Response AbstractWebApplication::processRequest(const Http::Request &request, const Http::Environment &env) +{ + request_ = request; + env_ = env; + + clear(); // clear response + + sessionInitialize(); + if (!sessionActive() && !isAuthNeeded()) + sessionStart(); + + if (isBanned()) { + status(403, "Forbidden"); + print(QObject::tr("Your IP address has been banned after too many failed authentication attempts."), Http::CONTENT_TYPE_TXT); + } + else { + processRequest(); + } + + return response(); +} + +void AbstractWebApplication::UnbanTimerEvent() +{ + UnbanTimer* ubantimer = static_cast(sender()); + qDebug("Ban period has expired for %s", qPrintable(ubantimer->peerIp().toString())); + clientFailedAttempts_.remove(ubantimer->peerIp()); + ubantimer->deleteLater(); +} + +void AbstractWebApplication::removeInactiveSessions() +{ + const uint now = QDateTime::currentDateTime().toTime_t(); + + foreach (const QString &id, sessions_.keys()) { + if ((now - sessions_[id]->timestamp) > INACTIVE_TIME) + delete sessions_.take(id); + } +} + +bool AbstractWebApplication::sessionInitialize() +{ + static const QString SID_START = QLatin1String(C_SID) + QLatin1String("="); + + if (session_ == 0) + { + QString cookie = request_.headers.value("cookie"); + //qDebug() << Q_FUNC_INFO << "cookie: " << cookie; + + QString sessionId; + int pos = cookie.indexOf(SID_START); + if (pos >= 0) + { + pos += SID_START.length(); + int end = cookie.indexOf(QRegExp("[,;]"), pos); + sessionId = cookie.mid(pos, end >= 0 ? end - pos : end); + } + + // TODO: Additional session check + + if (!sessionId.isNull()) + { + if (sessions_.contains(sessionId)) + { + session_ = sessions_[sessionId]; + session_->updateTimestamp(); + return true; + } + else + { + qDebug() << Q_FUNC_INFO << "session does not exist!"; + } + } + } + + return false; +} + +bool AbstractWebApplication::readFile(const QString& path, QByteArray &data, QString &type) +{ + QString ext = ""; + int index = path.lastIndexOf('.') + 1; + if (index > 0) + ext = path.mid(index); + + // find translated file in cache + if (translatedFiles_.contains(path)) + { + data = translatedFiles_[path]; + } + else + { + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) + { + qDebug("File %s was not found!", qPrintable(path)); + return false; + } + + data = file.readAll(); + file.close(); + + // Translate the file + if ((ext == "html") || ((ext == "js") && !path.endsWith("excanvas-compressed.js"))) + { + QString dataStr = QString::fromUtf8(data.constData()); + translateDocument(dataStr); + + if (path.endsWith("about.html")) + { + dataStr.replace("${VERSION}", VERSION); + } + + data = dataStr.toUtf8(); + translatedFiles_[path] = data; // cashing translated file + } + } + + type = CONTENT_TYPE_BY_EXT[ext]; + return true; +} + +WebSessionData *AbstractWebApplication::session() +{ + Q_ASSERT(session_ != 0); + return &session_->data; +} + + +QString AbstractWebApplication::generateSid() +{ + QString sid; + + qsrand(QDateTime::currentDateTime().toTime_t()); + do + { + const size_t size = 6; + quint32 tmp[size]; + + for (size_t i = 0; i < size; ++i) + tmp[i] = qrand(); + + sid = QByteArray::fromRawData(reinterpret_cast(tmp), sizeof(quint32) * size).toBase64(); + } + while (sessions_.contains(sid)); + + return sid; +} + +void AbstractWebApplication::translateDocument(QString& data) +{ + const QRegExp regex("QBT_TR\\((([^\\)]|\\)(?!QBT_TR))+)\\)QBT_TR"); + const QRegExp mnemonic("\\(?&([a-zA-Z]?\\))?"); + const std::string contexts[] = { + "TransferListFiltersWidget", "TransferListWidget", "PropertiesWidget", + "HttpServer", "confirmDeletionDlg", "TrackerList", "TorrentFilesModel", + "options_imp", "Preferences", "TrackersAdditionDlg", "ScanFoldersModel", + "PropTabBar", "TorrentModel", "downloadFromURL", "MainWindow", "misc", + "StatusBar" + }; + const size_t context_count = sizeof(contexts) / sizeof(contexts[0]); + int i = 0; + bool found = true; + + const QString locale = Preferences::instance()->getLocale(); + bool isTranslationNeeded = !locale.startsWith("en") || locale.startsWith("en_AU") || locale.startsWith("en_GB"); + + while(i < data.size() && found) + { + i = regex.indexIn(data, i); + if (i >= 0) + { + //qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data()); + QByteArray word = regex.cap(1).toUtf8(); + + QString translation = word; + if (isTranslationNeeded) + { + size_t context_index = 0; + while ((context_index < context_count) && (translation == word)) + { +#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) + translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, QCoreApplication::UnicodeUTF8, 1); +#else + translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, 1); +#endif + ++context_index; + } + } + // Remove keyboard shortcuts + translation.replace(mnemonic, ""); + + data.replace(i, regex.matchedLength(), translation); + i += translation.length(); + } + else + { + found = false; // no more translatable strings + } + } +} + +bool AbstractWebApplication::isBanned() const +{ + return clientFailedAttempts_.value(env_.clientAddress, 0) >= MAX_AUTH_FAILED_ATTEMPTS; +} + +int AbstractWebApplication::failedAttempts() const +{ + return clientFailedAttempts_.value(env_.clientAddress, 0); +} + +void AbstractWebApplication::resetFailedAttempts() +{ + clientFailedAttempts_.remove(env_.clientAddress); +} + +void AbstractWebApplication::increaseFailedAttempts() +{ + const int nb_fail = clientFailedAttempts_.value(env_.clientAddress, 0) + 1; + + clientFailedAttempts_[env_.clientAddress] = nb_fail; + if (nb_fail == MAX_AUTH_FAILED_ATTEMPTS) + { + // Max number of failed attempts reached + // Start ban period + UnbanTimer* ubantimer = new UnbanTimer(env_.clientAddress, this); + connect(ubantimer, SIGNAL(timeout()), SLOT(UnbanTimerEvent())); + ubantimer->start(); + } +} + +bool AbstractWebApplication::isAuthNeeded() +{ + return (env_.clientAddress != QHostAddress::LocalHost + && env_.clientAddress != QHostAddress::LocalHostIPv6) + || Preferences::instance()->isWebUiLocalAuthEnabled(); +} + +void AbstractWebApplication::printFile(const QString& path) +{ + QByteArray data; + QString type; + + if (!readFile(path, data, type)) { + status(404, "Not Found"); + return; + } + + print(data, type); +} + +bool AbstractWebApplication::sessionStart() +{ + if (session_ == 0) + { + session_ = new WebSession(generateSid()); + session_->updateTimestamp(); + sessions_[session_->id] = session_; + + QNetworkCookie cookie(C_SID, session_->id.toUtf8()); + cookie.setPath(QLatin1String("/")); + header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); + + return true; + } + + return false; +} + +bool AbstractWebApplication::sessionEnd() +{ + if ((session_ != 0) && (sessions_.contains(session_->id))) + { + QNetworkCookie cookie(C_SID, session_->id.toUtf8()); + cookie.setPath(QLatin1String("/")); + cookie.setExpirationDate(QDateTime::currentDateTime()); + + sessions_.remove(session_->id); + delete session_; + session_ = 0; + + header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); + return true; + } + + return false; +} + +QString AbstractWebApplication::saveTmpFile(const QByteArray &data) +{ + QTemporaryFile tmpfile(QDir::temp().absoluteFilePath("qBT-XXXXXX.torrent")); + tmpfile.setAutoRemove(false); + if (tmpfile.open()) { + tmpfile.write(data); + tmpfile.close(); + return tmpfile.fileName(); + } + + qWarning() << "I/O Error: Could not create temporary file"; + return QString(); +} + +QStringMap AbstractWebApplication::initializeContentTypeByExtMap() +{ + QStringMap map; + + map["htm"] = Http::CONTENT_TYPE_HTML; + map["html"] = Http::CONTENT_TYPE_HTML; + map["css"] = Http::CONTENT_TYPE_CSS; + map["gif"] = Http::CONTENT_TYPE_GIF; + map["png"] = Http::CONTENT_TYPE_PNG; + map["js"] = Http::CONTENT_TYPE_JS; + + return map; +} + +const QStringMap AbstractWebApplication::CONTENT_TYPE_BY_EXT = AbstractWebApplication::initializeContentTypeByExtMap(); diff --git a/src/webui/abstractrequesthandler.h b/src/webui/abstractwebapplication.h similarity index 51% rename from src/webui/abstractrequesthandler.h rename to src/webui/abstractwebapplication.h index b279d1272..bac977fca 100644 --- a/src/webui/abstractrequesthandler.h +++ b/src/webui/abstractwebapplication.h @@ -26,64 +26,83 @@ * exception statement from your version. */ -#ifndef ABSTRACTREQUESTHANDLER_H -#define ABSTRACTREQUESTHANDLER_H +#ifndef ABSTRACTWEBAPPLICATION_H +#define ABSTRACTWEBAPPLICATION_H -#include -#include "httptypes.h" +#include +#include +#include +#include "http/types.h" +#include "http/responsebuilder.h" +#include "http/irequesthandler.h" -class WebApplication; struct WebSession; +struct WebSessionData; -class AbstractRequestHandler +const char C_SID[] = "SID"; // name of session id cookie +const int BAN_TIME = 3600000; // 1 hour +const int INACTIVE_TIME = 900; // Session inactive time (in secs = 15 min.) +const int MAX_AUTH_FAILED_ATTEMPTS = 5; + +class AbstractWebApplication : public Http::ResponseBuilder, public Http::IRequestHandler { - friend class WebApplication; + Q_OBJECT + Q_DISABLE_COPY(AbstractWebApplication) public: - AbstractRequestHandler( - const HttpRequest& request, const HttpEnvironment& env, - WebApplication* app); + explicit AbstractWebApplication(QObject *parent = 0); + virtual ~AbstractWebApplication(); - HttpResponse run(); + Http::Response processRequest(const Http::Request &request, const Http::Environment &env); protected: virtual void processRequest() = 0; - void status(uint code, const QString& text); - void header(const QString& name, const QString& value); - void print(const QString& text, const QString& type = CONTENT_TYPE_HTML); - void print(const QByteArray& data, const QString& type = CONTENT_TYPE_HTML); - void printFile(const QString& path); - - // Session management - bool sessionActive() const { return session_ != 0; } - void sessionInitialize(); - void sessionStart(); - void sessionEnd(); - - // Ban management bool isBanned() const; int failedAttempts() const; void resetFailedAttempts(); void increaseFailedAttempts(); + void printFile(const QString &path); + + // Session management + bool sessionActive() const { return session_ != 0; } + bool sessionStart(); + bool sessionEnd(); + bool isAuthNeeded(); + bool readFile(const QString &path, QByteArray &data, QString &type); + // save data to temporary file on disk and return its name (or empty string if fails) - static QString saveTmpFile(const QByteArray& data); + static QString saveTmpFile(const QByteArray &data); + + WebSessionData *session(); + Http::Request request() const { return request_; } + Http::Environment env() const { return env_; } - inline WebSession* session() { return session_; } - inline HttpRequest request() const { return request_; } - inline HttpEnvironment env() const { return env_; } +private slots: + void UnbanTimerEvent(); + void removeInactiveSessions(); private: - WebApplication* app_; - WebSession* session_; - const HttpRequest request_; - const HttpEnvironment env_; - HttpResponse response_; + // Persistent data + QMap sessions_; + QHash clientFailedAttempts_; + QMap translatedFiles_; + + // Current data + WebSession *session_; + Http::Request request_; + Http::Environment env_; + + QString generateSid(); + bool sessionInitialize(); + + static void translateDocument(QString &data); - void print_impl(const QByteArray& data, const QString& type); + static const QStringMap CONTENT_TYPE_BY_EXT; + static QStringMap initializeContentTypeByExtMap(); }; -#endif // ABSTRACTREQUESTHANDLER_H +#endif // ABSTRACTWEBAPPLICATION_H diff --git a/src/webui/prefjson.cpp b/src/webui/prefjson.cpp index 23c2f7e59..61e52a3a2 100644 --- a/src/webui/prefjson.cpp +++ b/src/webui/prefjson.cpp @@ -333,6 +333,6 @@ void prefjson::setPreferences(const QString& json) pref->setDynDNSPassword(m["dyndns_password"].toString()); if (m.contains("dyndns_domain")) pref->setDynDomainName(m["dyndns_domain"].toString()); - // Reload preferences - QBtSession::instance()->configureSession(); + // Save preferences + pref->save(); } diff --git a/src/webui/requesthandler.cpp b/src/webui/requesthandler.cpp deleted file mode 100644 index 595eb5382..000000000 --- a/src/webui/requesthandler.cpp +++ /dev/null @@ -1,716 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2012, Christophe Dumez - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include -#ifdef DISABLE_GUI -#include -#else -#include -#endif -#include -#include -#include -#include -#include -#ifndef DISABLE_GUI -#include "iconprovider.h" -#endif -#include "misc.h" -#include "fs_utils.h" -#include "preferences.h" -#include "btjson.h" -#include "prefjson.h" -#include "qbtsession.h" -#include "requesthandler.h" -#include "webapplication.h" - -using namespace libtorrent; - -static const int API_VERSION = 2; -static const int API_VERSION_MIN = 2; - -const QString WWW_FOLDER = ":/www/public/"; -const QString PRIVATE_FOLDER = ":/www/private/"; -const QString DEFAULT_SCOPE = "public"; -const QString SCOPE_IMAGES = "images"; -const QString SCOPE_THEME = "theme"; -const QString DEFAULT_ACTION = "index"; -const QString WEBUI_ACTION = "webui"; -const QString VERSION_INFO = "version"; -const QString MAX_AGE_MONTH = "public, max-age=2592000"; - -#define ADD_ACTION(scope, action) actions[#scope][#action] = &RequestHandler::action_##scope##_##action - -QMap > RequestHandler::initializeActions() -{ - QMap > actions; - - ADD_ACTION(public, webui); - ADD_ACTION(public, index); - ADD_ACTION(public, login); - ADD_ACTION(public, logout); - ADD_ACTION(public, theme); - ADD_ACTION(public, images); - ADD_ACTION(query, torrents); - ADD_ACTION(query, preferences); - ADD_ACTION(query, transferInfo); - ADD_ACTION(query, propertiesGeneral); - ADD_ACTION(query, propertiesTrackers); - ADD_ACTION(query, propertiesFiles); - ADD_ACTION(sync, maindata); - ADD_ACTION(command, shutdown); - ADD_ACTION(command, download); - ADD_ACTION(command, upload); - ADD_ACTION(command, addTrackers); - ADD_ACTION(command, resumeAll); - ADD_ACTION(command, pauseAll); - ADD_ACTION(command, resume); - ADD_ACTION(command, pause); - ADD_ACTION(command, setPreferences); - ADD_ACTION(command, setFilePrio); - ADD_ACTION(command, getGlobalUpLimit); - ADD_ACTION(command, getGlobalDlLimit); - ADD_ACTION(command, setGlobalUpLimit); - ADD_ACTION(command, setGlobalDlLimit); - ADD_ACTION(command, getTorrentUpLimit); - ADD_ACTION(command, getTorrentDlLimit); - ADD_ACTION(command, setTorrentUpLimit); - ADD_ACTION(command, setTorrentDlLimit); - ADD_ACTION(command, alternativeSpeedLimitsEnabled); - ADD_ACTION(command, toggleAlternativeSpeedLimits); - ADD_ACTION(command, toggleSequentialDownload); - ADD_ACTION(command, toggleFirstLastPiecePrio); - ADD_ACTION(command, delete); - ADD_ACTION(command, deletePerm); - ADD_ACTION(command, increasePrio); - ADD_ACTION(command, decreasePrio); - ADD_ACTION(command, topPrio); - ADD_ACTION(command, bottomPrio); - ADD_ACTION(command, recheck); - ADD_ACTION(version, api); - ADD_ACTION(version, api_min); - ADD_ACTION(version, qbittorrent); - - return actions; -} - -#define CHECK_URI(ARGS_NUM) \ - if (args_.size() != ARGS_NUM) { \ - status(404, "Not Found"); \ - return; \ - } -#define CHECK_PARAMETERS(PARAMETERS) \ - QStringList parameters; \ - parameters << PARAMETERS; \ - if (parameters.size() != request().posts.size()) { \ - status(400, "Bad Request"); \ - return; \ - } \ - foreach (QString key, request().posts.keys()) { \ - if (!parameters.contains(key, Qt::CaseInsensitive)) { \ - status(400, "Bad Request"); \ - return; \ - } \ - } - -void RequestHandler::action_public_index() -{ - QString path; - - if (!args_.isEmpty()) { - if (args_.back() == "favicon.ico") - path = ":/icons/skin/qbittorrent16.png"; - else - path = WWW_FOLDER + args_.join("/"); - } - - printFile(path); -} - -void RequestHandler::action_public_webui() -{ - if (!sessionActive()) - printFile(PRIVATE_FOLDER + "login.html"); - else - printFile(PRIVATE_FOLDER + "index.html"); -} - -void RequestHandler::action_public_login() -{ - const Preferences* const pref = Preferences::instance(); - QCryptographicHash md5(QCryptographicHash::Md5); - - md5.addData(request().posts["password"].toLocal8Bit()); - QString pass = md5.result().toHex(); - - bool equalUser = misc::slowEquals(request().posts["username"].toUtf8(), pref->getWebUiUsername().toUtf8()); - bool equalPass = misc::slowEquals(pass.toUtf8(), pref->getWebUiPassword().toUtf8()); - - if (equalUser && equalPass) { - sessionStart(); - print(QByteArray("Ok."), CONTENT_TYPE_TXT); - } - else { - QString addr = env().clientAddress.toString(); - increaseFailedAttempts(); - qDebug("client IP: %s (%d failed attempts)", qPrintable(addr), failedAttempts()); - print(QByteArray("Fails."), CONTENT_TYPE_TXT); - } -} - -void RequestHandler::action_public_logout() -{ - CHECK_URI(0); - sessionEnd(); -} - -void RequestHandler::action_public_theme() -{ - if (args_.size() != 1) { - status(404, "Not Found"); - return; - } - -#ifdef DISABLE_GUI - QString url = ":/icons/oxygen/" + args_.front() + ".png"; -#else - QString url = IconProvider::instance()->getIconPath(args_.front()); -#endif - qDebug() << Q_FUNC_INFO << "There icon:" << url; - - printFile(url); - header(HEADER_CACHE_CONTROL, MAX_AGE_MONTH); -} - -void RequestHandler::action_public_images() -{ - const QString path = ":/icons/" + args_.join("/"); - printFile(path); - header(HEADER_CACHE_CONTROL, MAX_AGE_MONTH); -} - -// GET params: -// - filter (string): all, downloading, completed, paused, active, inactive -// - label (string): torrent label for filtering by it (empty string means "unlabeled"; no "label" param presented means "any label") -// - sort (string): name of column for sorting by its value -// - reverse (bool): enable reverse sorting -// - limit (int): set limit number of torrents returned (if greater than 0, otherwise - unlimited) -// - offset (int): set offset (if less than 0 - offset from end) -void RequestHandler::action_query_torrents() -{ - CHECK_URI(0); - const QStringMap& gets = request().gets; - - print(btjson::getTorrents( - gets["filter"], gets["label"], gets["sort"], gets["reverse"] == "true", - gets["limit"].toInt(), gets["offset"].toInt() - ), CONTENT_TYPE_JS); -} - -void RequestHandler::action_query_preferences() -{ - CHECK_URI(0); - print(prefjson::getPreferences(), CONTENT_TYPE_JS); -} - -void RequestHandler::action_query_transferInfo() -{ - CHECK_URI(0); - print(btjson::getTransferInfo(), CONTENT_TYPE_JS); -} - -void RequestHandler::action_query_propertiesGeneral() -{ - CHECK_URI(1); - print(btjson::getPropertiesForTorrent(args_.front()), CONTENT_TYPE_JS); -} - -void RequestHandler::action_query_propertiesTrackers() -{ - CHECK_URI(1); - print(btjson::getTrackersForTorrent(args_.front()), CONTENT_TYPE_JS); -} - -void RequestHandler::action_query_propertiesFiles() -{ - CHECK_URI(1); - print(btjson::getFilesForTorrent(args_.front()), CONTENT_TYPE_JS); -} - -// GET param: -// - rid (int): last response id -void RequestHandler::action_sync_maindata() -{ - CHECK_URI(0); - print(btjson::getSyncMainData(request().gets["rid"].toInt(), session()->syncMainDataLastResponse, session()->syncMainDataLastAcceptedResponse)); -} - -void RequestHandler::action_version_api() -{ - CHECK_URI(0); - print(QString::number(API_VERSION), CONTENT_TYPE_TXT); -} - -void RequestHandler::action_version_api_min() -{ - CHECK_URI(0); - print(QString::number(API_VERSION_MIN), CONTENT_TYPE_TXT); -} - -void RequestHandler::action_version_qbittorrent() -{ - CHECK_URI(0); - print(QString(VERSION), CONTENT_TYPE_TXT); -} - -void RequestHandler::action_command_shutdown() -{ - qDebug() << "Shutdown request from Web UI"; - // Special case handling for shutdown, we - // need to reply to the Web UI before - // actually shutting down. - - CHECK_URI(0); - QTimer::singleShot(0, qApp, SLOT(quit())); -} - -void RequestHandler::action_command_download() -{ - CHECK_URI(0); - CHECK_PARAMETERS("urls"); - QString urls = request().posts["urls"]; - QStringList list = urls.split('\n'); - - foreach (QString url, list) { - url = url.trimmed(); - if (!url.isEmpty()) { - if (url.startsWith("bc://bt/", Qt::CaseInsensitive)) { - qDebug("Converting bc link to magnet link"); - url = misc::bcLinkToMagnet(url); - } - else if (url.startsWith("magnet:", Qt::CaseInsensitive)) { - QBtSession::instance()->addMagnetSkipAddDlg(url); - } - else { - qDebug("Downloading url: %s", qPrintable(url)); - QBtSession::instance()->downloadUrlAndSkipDialog(url); - } - } - } -} - -void RequestHandler::action_command_upload() -{ - qDebug() << Q_FUNC_INFO; - CHECK_URI(0); - - foreach(const UploadedFile& torrent, request().files) { - QString filePath = saveTmpFile(torrent.data); - - if (!filePath.isEmpty()) { - QTorrentHandle h = QBtSession::instance()->addTorrent(filePath); - if (!h.is_valid()) { - status(415, "Internal Server Error"); - print(QObject::tr("Error: '%1' is not a valid torrent file.\n").arg(torrent.filename), CONTENT_TYPE_TXT); - } - // Clean up - fsutils::forceRemove(filePath); - } - else { - qWarning() << "I/O Error: Could not create temporary file"; - status(500, "Internal Server Error"); - print(QObject::tr("I/O Error: Could not create temporary file."), CONTENT_TYPE_TXT); - } - } -} - -void RequestHandler::action_command_addTrackers() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash" << "urls"); - QString hash = request().posts["hash"]; - - if (!hash.isEmpty()) { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid() && h.has_metadata()) { - QString urls = request().posts["urls"]; - QStringList list = urls.split('\n'); - - foreach (const QString& url, list) { - announce_entry e(url.toStdString()); - h.add_tracker(e); - } - } - } -} - -void RequestHandler::action_command_resumeAll() -{ - CHECK_URI(0); - QBtSession::instance()->resumeAllTorrents(); -} - -void RequestHandler::action_command_pauseAll() -{ - CHECK_URI(0); - QBtSession::instance()->pauseAllTorrents(); -} - -void RequestHandler::action_command_resume() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash"); - QBtSession::instance()->resumeTorrent(request().posts["hash"]); -} - -void RequestHandler::action_command_pause() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash"); - QBtSession::instance()->pauseTorrent(request().posts["hash"]); -} - -void RequestHandler::action_command_setPreferences() -{ - CHECK_URI(0); - CHECK_PARAMETERS("json"); - prefjson::setPreferences(request().posts["json"]); -} - -void RequestHandler::action_command_setFilePrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash" << "id" << "priority"); - QString hash = request().posts["hash"]; - int file_id = request().posts["id"].toInt(); - int priority = request().posts["priority"].toInt(); - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid() && h.has_metadata()) - h.file_priority(file_id, priority); -} - -void RequestHandler::action_command_getGlobalUpLimit() -{ - CHECK_URI(0); - print(QByteArray::number(QBtSession::instance()->getSession()->settings().upload_rate_limit)); -} - -void RequestHandler::action_command_getGlobalDlLimit() -{ - CHECK_URI(0); - print(QByteArray::number(QBtSession::instance()->getSession()->settings().download_rate_limit)); -} - -void RequestHandler::action_command_setGlobalUpLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("limit"); - qlonglong limit = request().posts["limit"].toLongLong(); - if (limit == 0) limit = -1; - - QBtSession::instance()->setUploadRateLimit(limit); - if (Preferences::instance()->isAltBandwidthEnabled()) - Preferences::instance()->setAltGlobalUploadLimit(limit / 1024.); - else - Preferences::instance()->setGlobalUploadLimit(limit / 1024.); -} - -void RequestHandler::action_command_setGlobalDlLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("limit"); - qlonglong limit = request().posts["limit"].toLongLong(); - if (limit == 0) limit = -1; - - QBtSession::instance()->setDownloadRateLimit(limit); - if (Preferences::instance()->isAltBandwidthEnabled()) - Preferences::instance()->setAltGlobalDownloadLimit(limit / 1024.); - else - Preferences::instance()->setGlobalDownloadLimit(limit / 1024.); -} - -void RequestHandler::action_command_getTorrentUpLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash"); - QString hash = request().posts["hash"]; - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid()) - print(QByteArray::number(h.upload_limit())); -} - -void RequestHandler::action_command_getTorrentDlLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash"); - QString hash = request().posts["hash"]; - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid()) - print(QByteArray::number(h.download_limit())); -} - -void RequestHandler::action_command_setTorrentUpLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash" << "limit"); - QString hash = request().posts["hash"]; - qlonglong limit = request().posts["limit"].toLongLong(); - if (limit == 0) limit = -1; - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid()) - h.set_upload_limit(limit); -} - -void RequestHandler::action_command_setTorrentDlLimit() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash" << "limit"); - QString hash = request().posts["hash"]; - qlonglong limit = request().posts["limit"].toLongLong(); - if (limit == 0) limit = -1; - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (h.is_valid()) - h.set_download_limit(limit); -} - -void RequestHandler::action_command_toggleAlternativeSpeedLimits() -{ - CHECK_URI(0); - QBtSession::instance()->useAlternativeSpeedsLimit(!Preferences::instance()->isAltBandwidthEnabled()); -} - -void RequestHandler::action_command_alternativeSpeedLimitsEnabled() -{ - CHECK_URI(0); - print(QByteArray::number(Preferences::instance()->isAltBandwidthEnabled())); -} - -void RequestHandler::action_command_toggleSequentialDownload() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - foreach (const QString &hash, hashes) { - try { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - h.toggleSequentialDownload(); - } - catch(invalid_handle&) {} - } -} - -void RequestHandler::action_command_toggleFirstLastPiecePrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - foreach (const QString &hash, hashes) { - try { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - h.toggleFirstLastPiecePrio(); - } - catch(invalid_handle&) {} - } -} - -void RequestHandler::action_command_delete() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - foreach (const QString &hash, hashes) - QBtSession::instance()->deleteTorrent(hash, false); -} - -void RequestHandler::action_command_deletePerm() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - foreach (const QString &hash, hashes) - QBtSession::instance()->deleteTorrent(hash, true); -} - -void RequestHandler::action_command_increasePrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - - std::priority_queue, - std::vector >, - std::greater > > torrent_queue; - - // Sort torrents by priority - foreach (const QString &hash, hashes) { - try { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - if (!h.is_seed()) - torrent_queue.push(qMakePair(h.queue_position(), h)); - } - catch(invalid_handle&) {} - } - - // Increase torrents priority (starting with the ones with highest priority) - while(!torrent_queue.empty()) { - QTorrentHandle h = torrent_queue.top().second; - - try { - h.queue_position_up(); - } - catch(invalid_handle&) {} - - torrent_queue.pop(); - } -} - -void RequestHandler::action_command_decreasePrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - QStringList hashes = request().posts["hashes"].split("|"); - - std::priority_queue, - std::vector >, - std::less > > torrent_queue; - - // Sort torrents by priority - foreach (const QString &hash, hashes) { - try { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - - if (!h.is_seed()) - torrent_queue.push(qMakePair(h.queue_position(), h)); - } - catch(invalid_handle&) {} - } - - // Decrease torrents priority (starting with the ones with lowest priority) - while(!torrent_queue.empty()) { - QTorrentHandle h = torrent_queue.top().second; - - try { - h.queue_position_down(); - } - catch(invalid_handle&) {} - - torrent_queue.pop(); - } -} - -void RequestHandler::action_command_topPrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - foreach (const QString &hash, request().posts["hashes"].split("|")) { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - if (h.is_valid()) h.queue_position_top(); - } -} - -void RequestHandler::action_command_bottomPrio() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hashes"); - foreach (const QString &hash, request().posts["hashes"].split("|")) { - QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); - if (h.is_valid()) h.queue_position_bottom(); - } -} - -void RequestHandler::action_command_recheck() -{ - CHECK_URI(0); - CHECK_PARAMETERS("hash"); - QBtSession::instance()->recheckTorrent(request().posts["hash"]); -} - -bool RequestHandler::isPublicScope() -{ - return (scope_ == DEFAULT_SCOPE || scope_ == VERSION_INFO); -} - -void RequestHandler::processRequest() -{ - if (args_.contains(".") || args_.contains("..")) { - qDebug() << Q_FUNC_INFO << "Invalid path:" << request().path; - status(404, "Not Found"); - return; - } - - if (!isPublicScope() && !sessionActive()) { - status(403, "Forbidden"); - return; - } - - if (actions_.value(scope_).value(action_) != 0) { - (this->*(actions_[scope_][action_]))(); - } - else { - status(404, "Not Found"); - qDebug() << Q_FUNC_INFO << "Resource not found:" << request().path; - } -} - -void RequestHandler::parsePath() -{ - if(request().path == "/") action_ = WEBUI_ACTION; - - // check action for requested path - QStringList pathItems = request().path.split('/', QString::SkipEmptyParts); - if (!pathItems.empty()) { - if (actions_.contains(pathItems.front())) { - scope_ = pathItems.front(); - pathItems.pop_front(); - } - } - - if (!pathItems.empty()) { - if (actions_[scope_].contains(pathItems.front())) { - action_ = pathItems.front(); - pathItems.pop_front(); - } - } - - args_ = pathItems; -} - -RequestHandler::RequestHandler(const HttpRequest &request, const HttpEnvironment &env, WebApplication *app) - : AbstractRequestHandler(request, env, app), scope_(DEFAULT_SCOPE), action_(DEFAULT_ACTION) -{ - parsePath(); -} - -QMap > RequestHandler::actions_ = RequestHandler::initializeActions(); diff --git a/src/webui/requesthandler.h b/src/webui/requesthandler.h deleted file mode 100644 index 015f245e8..000000000 --- a/src/webui/requesthandler.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Vladimir Golovnev - * - * 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. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef REQUESTHANDLER_H -#define REQUESTHANDLER_H - -#include -#include "httptypes.h" -#include "abstractrequesthandler.h" - -class WebApplication; - -class RequestHandler: public AbstractRequestHandler -{ -public: - RequestHandler( - const HttpRequest& request, const HttpEnvironment& env, - WebApplication* app); - -private: - // Actions - void action_public_webui(); - void action_public_index(); - void action_public_login(); - void action_public_logout(); - void action_public_theme(); - void action_public_images(); - void action_query_torrents(); - void action_query_preferences(); - void action_query_transferInfo(); - void action_query_propertiesGeneral(); - void action_query_propertiesTrackers(); - void action_query_propertiesFiles(); - void action_sync_maindata(); - void action_command_shutdown(); - void action_command_download(); - void action_command_upload(); - void action_command_addTrackers(); - void action_command_resumeAll(); - void action_command_pauseAll(); - void action_command_resume(); - void action_command_pause(); - void action_command_setPreferences(); - void action_command_setFilePrio(); - void action_command_getGlobalUpLimit(); - void action_command_getGlobalDlLimit(); - void action_command_setGlobalUpLimit(); - void action_command_setGlobalDlLimit(); - void action_command_getTorrentUpLimit(); - void action_command_getTorrentDlLimit(); - void action_command_setTorrentUpLimit(); - void action_command_setTorrentDlLimit(); - void action_command_alternativeSpeedLimitsEnabled(); - void action_command_toggleAlternativeSpeedLimits(); - void action_command_toggleSequentialDownload(); - void action_command_toggleFirstLastPiecePrio(); - void action_command_delete(); - void action_command_deletePerm(); - void action_command_increasePrio(); - void action_command_decreasePrio(); - void action_command_topPrio(); - void action_command_bottomPrio(); - void action_command_recheck(); - void action_version_api(); - void action_version_api_min(); - void action_version_qbittorrent(); - - typedef void (RequestHandler::*Action)(); - - QString scope_; - QString action_; - QStringList args_; - - void processRequest(); - - bool isPublicScope(); - void parsePath(); - - static QMap > initializeActions(); - static QMap > actions_; -}; - -#endif // REQUESTHANDLER_H diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp index 67ce61421..f7140e96c 100644 --- a/src/webui/webapplication.cpp +++ b/src/webui/webapplication.cpp @@ -26,285 +26,691 @@ * exception statement from your version. */ -#ifdef DISABLE_GUI +#include #include -#else -#include -#endif -#include #include -#include -#include +#include +#include +#include +#include +#ifndef DISABLE_GUI +// TODO: Drop GUI dependency! +#include "iconprovider.h" +#endif +#include "misc.h" +#include "fs_utils.h" #include "preferences.h" -#include "requesthandler.h" +#include "btjson.h" +#include "prefjson.h" +#include "qbtsession.h" +#include "websessiondata.h" #include "webapplication.h" -// UnbanTimer +using namespace libtorrent; -class UnbanTimer: public QTimer +static const int API_VERSION = 2; +static const int API_VERSION_MIN = 2; + +const QString WWW_FOLDER = ":/www/public/"; +const QString PRIVATE_FOLDER = ":/www/private/"; +const QString DEFAULT_SCOPE = "public"; +const QString SCOPE_IMAGES = "images"; +const QString SCOPE_THEME = "theme"; +const QString DEFAULT_ACTION = "index"; +const QString WEBUI_ACTION = "webui"; +const QString VERSION_INFO = "version"; +const QString MAX_AGE_MONTH = "public, max-age=2592000"; + +#define ADD_ACTION(scope, action) actions[#scope][#action] = &WebApplication::action_##scope##_##action + +QMap > WebApplication::initializeActions() { -public: - UnbanTimer(const QHostAddress& peer_ip, QObject *parent) - : QTimer(parent), m_peerIp(peer_ip) - { - setSingleShot(true); - setInterval(BAN_TIME); - } + QMap > actions; + + ADD_ACTION(public, webui); + ADD_ACTION(public, index); + ADD_ACTION(public, login); + ADD_ACTION(public, logout); + ADD_ACTION(public, theme); + ADD_ACTION(public, images); + ADD_ACTION(query, torrents); + ADD_ACTION(query, preferences); + ADD_ACTION(query, transferInfo); + ADD_ACTION(query, propertiesGeneral); + ADD_ACTION(query, propertiesTrackers); + ADD_ACTION(query, propertiesFiles); + ADD_ACTION(sync, maindata); + ADD_ACTION(command, shutdown); + ADD_ACTION(command, download); + ADD_ACTION(command, upload); + ADD_ACTION(command, addTrackers); + ADD_ACTION(command, resumeAll); + ADD_ACTION(command, pauseAll); + ADD_ACTION(command, resume); + ADD_ACTION(command, pause); + ADD_ACTION(command, setPreferences); + ADD_ACTION(command, setFilePrio); + ADD_ACTION(command, getGlobalUpLimit); + ADD_ACTION(command, getGlobalDlLimit); + ADD_ACTION(command, setGlobalUpLimit); + ADD_ACTION(command, setGlobalDlLimit); + ADD_ACTION(command, getTorrentUpLimit); + ADD_ACTION(command, getTorrentDlLimit); + ADD_ACTION(command, setTorrentUpLimit); + ADD_ACTION(command, setTorrentDlLimit); + ADD_ACTION(command, alternativeSpeedLimitsEnabled); + ADD_ACTION(command, toggleAlternativeSpeedLimits); + ADD_ACTION(command, toggleSequentialDownload); + ADD_ACTION(command, toggleFirstLastPiecePrio); + ADD_ACTION(command, delete); + ADD_ACTION(command, deletePerm); + ADD_ACTION(command, increasePrio); + ADD_ACTION(command, decreasePrio); + ADD_ACTION(command, topPrio); + ADD_ACTION(command, bottomPrio); + ADD_ACTION(command, recheck); + ADD_ACTION(version, api); + ADD_ACTION(version, api_min); + ADD_ACTION(version, qbittorrent); + + return actions; +} - inline const QHostAddress& peerIp() const { return m_peerIp; } +#define CHECK_URI(ARGS_NUM) \ + if (args_.size() != ARGS_NUM) { \ + status(404, "Not Found"); \ + return; \ + } +#define CHECK_PARAMETERS(PARAMETERS) \ + QStringList parameters; \ + parameters << PARAMETERS; \ + if (parameters.size() != request().posts.size()) { \ + status(400, "Bad Request"); \ + return; \ + } \ + foreach (QString key, request().posts.keys()) { \ + if (!parameters.contains(key, Qt::CaseInsensitive)) { \ + status(400, "Bad Request"); \ + return; \ + } \ + } -private: - QHostAddress m_peerIp; -}; +void WebApplication::action_public_index() +{ + QString path; -// WebApplication + if (!args_.isEmpty()) { + if (args_.back() == "favicon.ico") + path = ":/icons/skin/qbittorrent16.png"; + else + path = WWW_FOLDER + args_.join("/"); + } -WebApplication::WebApplication(QObject *parent) - : QObject(parent) + printFile(path); +} + +void WebApplication::action_public_webui() { + if (!sessionActive()) + printFile(PRIVATE_FOLDER + "login.html"); + else + printFile(PRIVATE_FOLDER + "index.html"); } -WebApplication::~WebApplication() +void WebApplication::action_public_login() { - // cleanup sessions data - foreach (WebSession* session, sessions_.values()) - delete session; + const Preferences* const pref = Preferences::instance(); + QCryptographicHash md5(QCryptographicHash::Md5); + + md5.addData(request().posts["password"].toLocal8Bit()); + QString pass = md5.result().toHex(); + + bool equalUser = misc::slowEquals(request().posts["username"].toUtf8(), pref->getWebUiUsername().toUtf8()); + bool equalPass = misc::slowEquals(pass.toUtf8(), pref->getWebUiPassword().toUtf8()); + + if (equalUser && equalPass) { + sessionStart(); + print(QByteArray("Ok."), Http::CONTENT_TYPE_TXT); + } + else { + QString addr = env().clientAddress.toString(); + increaseFailedAttempts(); + qDebug("client IP: %s (%d failed attempts)", qPrintable(addr), failedAttempts()); + print(QByteArray("Fails."), Http::CONTENT_TYPE_TXT); + } } -WebApplication *WebApplication::instance() +void WebApplication::action_public_logout() { - static WebApplication inst; - return &inst; + CHECK_URI(0); + sessionEnd(); } -void WebApplication::UnbanTimerEvent() +void WebApplication::action_public_theme() { - UnbanTimer* ubantimer = static_cast(sender()); - qDebug("Ban period has expired for %s", qPrintable(ubantimer->peerIp().toString())); - clientFailedAttempts_.remove(ubantimer->peerIp()); - ubantimer->deleteLater(); + if (args_.size() != 1) { + status(404, "Not Found"); + return; + } + +#ifdef DISABLE_GUI + QString url = ":/icons/oxygen/" + args_.front() + ".png"; +#else + QString url = IconProvider::instance()->getIconPath(args_.front()); +#endif + qDebug() << Q_FUNC_INFO << "There icon:" << url; + + printFile(url); + header(Http::HEADER_CACHE_CONTROL, MAX_AGE_MONTH); } -bool WebApplication::sessionInitialize(AbstractRequestHandler* _this) +void WebApplication::action_public_images() { - if (_this->session_ == 0) - { - QString cookie = _this->request_.headers.value("cookie"); - //qDebug() << Q_FUNC_INFO << "cookie: " << cookie; + const QString path = ":/icons/" + args_.join("/"); + printFile(path); + header(Http::HEADER_CACHE_CONTROL, MAX_AGE_MONTH); +} - QString sessionId; - const QString SID_START = C_SID + "="; - int pos = cookie.indexOf(SID_START); - if (pos >= 0) - { - pos += SID_START.length(); - int end = cookie.indexOf(QRegExp("[,;]"), pos); - sessionId = cookie.mid(pos, end >= 0 ? end - pos : end); - } +// GET params: +// - filter (string): all, downloading, completed, paused, active, inactive +// - label (string): torrent label for filtering by it (empty string means "unlabeled"; no "label" param presented means "any label") +// - sort (string): name of column for sorting by its value +// - reverse (bool): enable reverse sorting +// - limit (int): set limit number of torrents returned (if greater than 0, otherwise - unlimited) +// - offset (int): set offset (if less than 0 - offset from end) +void WebApplication::action_query_torrents() +{ + CHECK_URI(0); + const QStringMap& gets = request().gets; - // TODO: Additional session check - - if (!sessionId.isNull()) - { - if (sessions_.contains(sessionId)) - { - _this->session_ = sessions_[sessionId]; - return true; - } - else - { - qDebug() << Q_FUNC_INFO << "session does not exist!"; - } - } - } - - return false; -} - -bool WebApplication::readFile(const QString& path, QByteArray &data, QString &type) -{ - QString ext = ""; - int index = path.lastIndexOf('.') + 1; - if (index > 0) - ext = path.mid(index); - - // find translated file in cache - if (translatedFiles_.contains(path)) - { - data = translatedFiles_[path]; - } - else - { - QFile file(path); - if (!file.open(QIODevice::ReadOnly)) - { - qDebug("File %s was not found!", qPrintable(path)); - return false; - } + print(btjson::getTorrents( + gets["filter"], gets["label"], gets["sort"], gets["reverse"] == "true", + gets["limit"].toInt(), gets["offset"].toInt() + ), Http::CONTENT_TYPE_JS); +} + +void WebApplication::action_query_preferences() +{ + CHECK_URI(0); + print(prefjson::getPreferences(), Http::CONTENT_TYPE_JS); +} + +void WebApplication::action_query_transferInfo() +{ + CHECK_URI(0); + print(btjson::getTransferInfo(), Http::CONTENT_TYPE_JS); +} + +void WebApplication::action_query_propertiesGeneral() +{ + CHECK_URI(1); + print(btjson::getPropertiesForTorrent(args_.front()), Http::CONTENT_TYPE_JS); +} + +void WebApplication::action_query_propertiesTrackers() +{ + CHECK_URI(1); + print(btjson::getTrackersForTorrent(args_.front()), Http::CONTENT_TYPE_JS); +} + +void WebApplication::action_query_propertiesFiles() +{ + CHECK_URI(1); + print(btjson::getFilesForTorrent(args_.front()), Http::CONTENT_TYPE_JS); +} - data = file.readAll(); - file.close(); +// GET param: +// - rid (int): last response id +void WebApplication::action_sync_maindata() +{ + CHECK_URI(0); + print(btjson::getSyncMainData(request().gets["rid"].toInt(), session()->syncMainDataLastResponse, session()->syncMainDataLastAcceptedResponse)); +} - // Translate the file - if ((ext == "html") || ((ext == "js") && !path.endsWith("excanvas-compressed.js"))) - { - QString dataStr = QString::fromUtf8(data.constData()); - translateDocument(dataStr); +void WebApplication::action_version_api() +{ + CHECK_URI(0); + print(QString::number(API_VERSION), Http::CONTENT_TYPE_TXT); +} - if (path.endsWith("about.html")) - { - dataStr.replace("${VERSION}", VERSION); - } +void WebApplication::action_version_api_min() +{ + CHECK_URI(0); + print(QString::number(API_VERSION_MIN), Http::CONTENT_TYPE_TXT); +} - data = dataStr.toUtf8(); - translatedFiles_[path] = data; // cashing translated file +void WebApplication::action_version_qbittorrent() +{ + CHECK_URI(0); + print(QString(VERSION), Http::CONTENT_TYPE_TXT); +} + +void WebApplication::action_command_shutdown() +{ + qDebug() << "Shutdown request from Web UI"; + // Special case handling for shutdown, we + // need to reply to the Web UI before + // actually shutting down. + + CHECK_URI(0); + QTimer::singleShot(0, qApp, SLOT(quit())); +} + +void WebApplication::action_command_download() +{ + CHECK_URI(0); + CHECK_PARAMETERS("urls"); + QString urls = request().posts["urls"]; + QStringList list = urls.split('\n'); + + foreach (QString url, list) { + url = url.trimmed(); + if (!url.isEmpty()) { + if (url.startsWith("bc://bt/", Qt::CaseInsensitive)) { + qDebug("Converting bc link to magnet link"); + url = misc::bcLinkToMagnet(url); + } + else if (url.startsWith("magnet:", Qt::CaseInsensitive)) { + QBtSession::instance()->addMagnetSkipAddDlg(url); + } + else { + qDebug("Downloading url: %s", qPrintable(url)); + QBtSession::instance()->downloadUrlAndSkipDialog(url); + } + } } - } - - type = CONTENT_TYPE_BY_EXT[ext]; - return true; -} - -QString WebApplication::generateSid() -{ - QString sid; - - qsrand(QDateTime::currentDateTime().toTime_t()); - do - { - const size_t size = 6; - quint32 tmp[size]; - - for (size_t i = 0; i < size; ++i) - tmp[i] = qrand(); - - sid = QByteArray::fromRawData(reinterpret_cast(tmp), sizeof(quint32) * size).toBase64(); - } - while (sessions_.contains(sid)); - - return sid; -} - -void WebApplication::translateDocument(QString& data) -{ - const QRegExp regex("QBT_TR\\((([^\\)]|\\)(?!QBT_TR))+)\\)QBT_TR"); - const QRegExp mnemonic("\\(?&([a-zA-Z]?\\))?"); - const std::string contexts[] = { - "TransferListFiltersWidget", "TransferListWidget", "PropertiesWidget", - "HttpServer", "confirmDeletionDlg", "TrackerList", "TorrentFilesModel", - "options_imp", "Preferences", "TrackersAdditionDlg", "ScanFoldersModel", - "PropTabBar", "TorrentModel", "downloadFromURL", "MainWindow", "misc", - "StatusBar" - }; - const size_t context_count = sizeof(contexts) / sizeof(contexts[0]); - int i = 0; - bool found = true; - - const QString locale = Preferences::instance()->getLocale(); - bool isTranslationNeeded = !locale.startsWith("en") || locale.startsWith("en_AU") || locale.startsWith("en_GB"); - - while(i < data.size() && found) - { - i = regex.indexIn(data, i); - if (i >= 0) - { - //qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data()); - QByteArray word = regex.cap(1).toUtf8(); - - QString translation = word; - if (isTranslationNeeded) - { - size_t context_index = 0; - while ((context_index < context_count) && (translation == word)) - { -#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) - translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, QCoreApplication::UnicodeUTF8, 1); -#else - translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, 1); -#endif - ++context_index; +} + +void WebApplication::action_command_upload() +{ + qDebug() << Q_FUNC_INFO; + CHECK_URI(0); + + foreach(const Http::UploadedFile& torrent, request().files) { + QString filePath = saveTmpFile(torrent.data); + + if (!filePath.isEmpty()) { + QTorrentHandle h = QBtSession::instance()->addTorrent(filePath); + if (!h.is_valid()) { + status(415, "Internal Server Error"); + print(QObject::tr("Error: '%1' is not a valid torrent file.\n").arg(torrent.filename), Http::CONTENT_TYPE_TXT); + } + // Clean up + fsutils::forceRemove(filePath); + } + else { + qWarning() << "I/O Error: Could not create temporary file"; + status(500, "Internal Server Error"); + print(QObject::tr("I/O Error: Could not create temporary file."), Http::CONTENT_TYPE_TXT); } - } - // Remove keyboard shortcuts - translation.replace(mnemonic, ""); + } +} - data.replace(i, regex.matchedLength(), translation); - i += translation.length(); +void WebApplication::action_command_addTrackers() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash" << "urls"); + QString hash = request().posts["hash"]; + + if (!hash.isEmpty()) { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid() && h.has_metadata()) { + QString urls = request().posts["urls"]; + QStringList list = urls.split('\n'); + + foreach (const QString& url, list) { + announce_entry e(url.toStdString()); + h.add_tracker(e); + } + } } +} + +void WebApplication::action_command_resumeAll() +{ + CHECK_URI(0); + QBtSession::instance()->resumeAllTorrents(); +} + +void WebApplication::action_command_pauseAll() +{ + CHECK_URI(0); + QBtSession::instance()->pauseAllTorrents(); +} + +void WebApplication::action_command_resume() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash"); + QBtSession::instance()->resumeTorrent(request().posts["hash"]); +} + +void WebApplication::action_command_pause() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash"); + QBtSession::instance()->pauseTorrent(request().posts["hash"]); +} + +void WebApplication::action_command_setPreferences() +{ + CHECK_URI(0); + CHECK_PARAMETERS("json"); + prefjson::setPreferences(request().posts["json"]); +} + +void WebApplication::action_command_setFilePrio() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash" << "id" << "priority"); + QString hash = request().posts["hash"]; + int file_id = request().posts["id"].toInt(); + int priority = request().posts["priority"].toInt(); + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid() && h.has_metadata()) + h.file_priority(file_id, priority); +} + +void WebApplication::action_command_getGlobalUpLimit() +{ + CHECK_URI(0); + print(QByteArray::number(QBtSession::instance()->getSession()->settings().upload_rate_limit)); +} + +void WebApplication::action_command_getGlobalDlLimit() +{ + CHECK_URI(0); + print(QByteArray::number(QBtSession::instance()->getSession()->settings().download_rate_limit)); +} + +void WebApplication::action_command_setGlobalUpLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("limit"); + qlonglong limit = request().posts["limit"].toLongLong(); + if (limit == 0) limit = -1; + + QBtSession::instance()->setUploadRateLimit(limit); + if (Preferences::instance()->isAltBandwidthEnabled()) + Preferences::instance()->setAltGlobalUploadLimit(limit / 1024.); else - { - found = false; // no more translatable strings + Preferences::instance()->setGlobalUploadLimit(limit / 1024.); +} + +void WebApplication::action_command_setGlobalDlLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("limit"); + qlonglong limit = request().posts["limit"].toLongLong(); + if (limit == 0) limit = -1; + + QBtSession::instance()->setDownloadRateLimit(limit); + if (Preferences::instance()->isAltBandwidthEnabled()) + Preferences::instance()->setAltGlobalDownloadLimit(limit / 1024.); + else + Preferences::instance()->setGlobalDownloadLimit(limit / 1024.); +} + +void WebApplication::action_command_getTorrentUpLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash"); + QString hash = request().posts["hash"]; + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid()) + print(QByteArray::number(h.upload_limit())); +} + +void WebApplication::action_command_getTorrentDlLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash"); + QString hash = request().posts["hash"]; + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid()) + print(QByteArray::number(h.download_limit())); +} + +void WebApplication::action_command_setTorrentUpLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash" << "limit"); + QString hash = request().posts["hash"]; + qlonglong limit = request().posts["limit"].toLongLong(); + if (limit == 0) limit = -1; + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid()) + h.set_upload_limit(limit); +} + +void WebApplication::action_command_setTorrentDlLimit() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hash" << "limit"); + QString hash = request().posts["hash"]; + qlonglong limit = request().posts["limit"].toLongLong(); + if (limit == 0) limit = -1; + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (h.is_valid()) + h.set_download_limit(limit); +} + +void WebApplication::action_command_toggleAlternativeSpeedLimits() +{ + CHECK_URI(0); + QBtSession::instance()->useAlternativeSpeedsLimit(!Preferences::instance()->isAltBandwidthEnabled()); +} + +void WebApplication::action_command_alternativeSpeedLimitsEnabled() +{ + CHECK_URI(0); + print(QByteArray::number(Preferences::instance()->isAltBandwidthEnabled())); +} + +void WebApplication::action_command_toggleSequentialDownload() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + foreach (const QString &hash, hashes) { + try { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + h.toggleSequentialDownload(); + } + catch(invalid_handle&) {} } - } } -bool WebApplication::isBanned(const AbstractRequestHandler *_this) const +void WebApplication::action_command_toggleFirstLastPiecePrio() { - return clientFailedAttempts_.value(_this->env_.clientAddress, 0) >= MAX_AUTH_FAILED_ATTEMPTS; + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + foreach (const QString &hash, hashes) { + try { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + h.toggleFirstLastPiecePrio(); + } + catch(invalid_handle&) {} + } } -int WebApplication::failedAttempts(const AbstractRequestHandler* _this) const +void WebApplication::action_command_delete() { - return clientFailedAttempts_.value(_this->env_.clientAddress, 0); + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + foreach (const QString &hash, hashes) + QBtSession::instance()->deleteTorrent(hash, false); } -void WebApplication::resetFailedAttempts(AbstractRequestHandler* _this) +void WebApplication::action_command_deletePerm() { - clientFailedAttempts_.remove(_this->env_.clientAddress); + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + foreach (const QString &hash, hashes) + QBtSession::instance()->deleteTorrent(hash, true); } -void WebApplication::increaseFailedAttempts(AbstractRequestHandler* _this) +void WebApplication::action_command_increasePrio() { - const int nb_fail = clientFailedAttempts_.value(_this->env_.clientAddress, 0) + 1; + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + + std::priority_queue, + std::vector >, + std::greater > > torrent_queue; + + // Sort torrents by priority + foreach (const QString &hash, hashes) { + try { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + if (!h.is_seed()) + torrent_queue.push(qMakePair(h.queue_position(), h)); + } + catch(invalid_handle&) {} + } + + // Increase torrents priority (starting with the ones with highest priority) + while(!torrent_queue.empty()) { + QTorrentHandle h = torrent_queue.top().second; + + try { + h.queue_position_up(); + } + catch(invalid_handle&) {} + + torrent_queue.pop(); + } +} + +void WebApplication::action_command_decreasePrio() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + QStringList hashes = request().posts["hashes"].split("|"); + + std::priority_queue, + std::vector >, + std::less > > torrent_queue; + + // Sort torrents by priority + foreach (const QString &hash, hashes) { + try { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + + if (!h.is_seed()) + torrent_queue.push(qMakePair(h.queue_position(), h)); + } + catch(invalid_handle&) {} + } + + // Decrease torrents priority (starting with the ones with lowest priority) + while(!torrent_queue.empty()) { + QTorrentHandle h = torrent_queue.top().second; + + try { + h.queue_position_down(); + } + catch(invalid_handle&) {} + + torrent_queue.pop(); + } +} + +void WebApplication::action_command_topPrio() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + foreach (const QString &hash, request().posts["hashes"].split("|")) { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + if (h.is_valid()) h.queue_position_top(); + } +} - clientFailedAttempts_[_this->env_.clientAddress] = nb_fail; - if (nb_fail == MAX_AUTH_FAILED_ATTEMPTS) - { - // Max number of failed attempts reached - // Start ban period - UnbanTimer* ubantimer = new UnbanTimer(_this->env_.clientAddress, this); - connect(ubantimer, SIGNAL(timeout()), SLOT(UnbanTimerEvent())); - ubantimer->start(); - } +void WebApplication::action_command_bottomPrio() +{ + CHECK_URI(0); + CHECK_PARAMETERS("hashes"); + foreach (const QString &hash, request().posts["hashes"].split("|")) { + QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); + if (h.is_valid()) h.queue_position_bottom(); + } } -bool WebApplication::sessionStart(AbstractRequestHandler *_this) +void WebApplication::action_command_recheck() { - if (_this->session_ == 0) - { - _this->session_ = new WebSession(generateSid()); - sessions_[_this->session_->id] = _this->session_; - return true; - } + CHECK_URI(0); + CHECK_PARAMETERS("hash"); + QBtSession::instance()->recheckTorrent(request().posts["hash"]); +} - return false; +bool WebApplication::isPublicScope() +{ + return (scope_ == DEFAULT_SCOPE || scope_ == VERSION_INFO); } -bool WebApplication::sessionEnd(AbstractRequestHandler *_this) +void WebApplication::processRequest() { - if ((_this->session_ != 0) && (sessions_.contains(_this->session_->id))) - { - sessions_.remove(_this->session_->id); - delete _this->session_; - _this->session_ = 0; - return true; - } + scope_ = DEFAULT_SCOPE; + action_ = DEFAULT_ACTION; + + parsePath(); + + if (args_.contains(".") || args_.contains("..")) { + qDebug() << Q_FUNC_INFO << "Invalid path:" << request().path; + status(404, "Not Found"); + return; + } + + if (!isPublicScope() && !sessionActive()) { + status(403, "Forbidden"); + return; + } - return false; + if (actions_.value(scope_).value(action_) != 0) { + (this->*(actions_[scope_][action_]))(); + } + else { + status(404, "Not Found"); + qDebug() << Q_FUNC_INFO << "Resource not found:" << request().path; + } } -QStringMap WebApplication::initializeContentTypeByExtMap() +void WebApplication::parsePath() { - QStringMap map; + if(request().path == "/") action_ = WEBUI_ACTION; + + // check action for requested path + QStringList pathItems = request().path.split('/', QString::SkipEmptyParts); + if (!pathItems.empty()) { + if (actions_.contains(pathItems.front())) { + scope_ = pathItems.front(); + pathItems.pop_front(); + } + } - map["htm"] = CONTENT_TYPE_HTML; - map["html"] = CONTENT_TYPE_HTML; - map["css"] = CONTENT_TYPE_CSS; - map["gif"] = CONTENT_TYPE_GIF; - map["png"] = CONTENT_TYPE_PNG; - map["js"] = CONTENT_TYPE_JS; + if (!pathItems.empty()) { + if (actions_[scope_].contains(pathItems.front())) { + action_ = pathItems.front(); + pathItems.pop_front(); + } + } + + args_ = pathItems; +} - return map; +WebApplication::WebApplication(QObject *parent) + : AbstractWebApplication(parent) +{ } -const QStringMap WebApplication::CONTENT_TYPE_BY_EXT = WebApplication::initializeContentTypeByExtMap(); +QMap > WebApplication::actions_ = WebApplication::initializeActions(); diff --git a/src/webui/webapplication.h b/src/webui/webapplication.h index f35f67009..b4b6b9b3f 100644 --- a/src/webui/webapplication.h +++ b/src/webui/webapplication.h @@ -29,61 +29,77 @@ #ifndef WEBAPPLICATION_H #define WEBAPPLICATION_H -#include -#include -#include -#include "httptypes.h" -#include +#include +#include "abstractwebapplication.h" -struct WebSession +class WebApplication: public AbstractWebApplication { - const QString id; - QVariantMap syncMainDataLastResponse; - QVariantMap syncMainDataLastAcceptedResponse; - WebSession(const QString& id): id(id) {} -}; - -const QString C_SID = "SID"; // name of session id cookie -const int BAN_TIME = 3600000; // 1 hour -const int MAX_AUTH_FAILED_ATTEMPTS = 5; - -class AbstractRequestHandler; - -class WebApplication: public QObject -{ - Q_OBJECT Q_DISABLE_COPY(WebApplication) public: - WebApplication(QObject* parent = 0); - virtual ~WebApplication(); - - static WebApplication* instance(); - - bool isBanned(const AbstractRequestHandler* _this) const; - int failedAttempts(const AbstractRequestHandler *_this) const; - void resetFailedAttempts(AbstractRequestHandler* _this); - void increaseFailedAttempts(AbstractRequestHandler* _this); - - bool sessionStart(AbstractRequestHandler* _this); - bool sessionEnd(AbstractRequestHandler* _this); - bool sessionInitialize(AbstractRequestHandler* _this); - - bool readFile(const QString &path, QByteArray& data, QString& type); - -private slots: - void UnbanTimerEvent(); + explicit WebApplication(QObject* parent = 0); private: - QMap sessions_; - QHash clientFailedAttempts_; - QMap translatedFiles_; - - QString generateSid(); - static void translateDocument(QString& data); - - static const QStringMap CONTENT_TYPE_BY_EXT; - static QStringMap initializeContentTypeByExtMap(); + // Actions + void action_public_webui(); + void action_public_index(); + void action_public_login(); + void action_public_logout(); + void action_public_theme(); + void action_public_images(); + void action_query_torrents(); + void action_query_preferences(); + void action_query_transferInfo(); + void action_query_propertiesGeneral(); + void action_query_propertiesTrackers(); + void action_query_propertiesFiles(); + void action_sync_maindata(); + void action_command_shutdown(); + void action_command_download(); + void action_command_upload(); + void action_command_addTrackers(); + void action_command_resumeAll(); + void action_command_pauseAll(); + void action_command_resume(); + void action_command_pause(); + void action_command_setPreferences(); + void action_command_setFilePrio(); + void action_command_getGlobalUpLimit(); + void action_command_getGlobalDlLimit(); + void action_command_setGlobalUpLimit(); + void action_command_setGlobalDlLimit(); + void action_command_getTorrentUpLimit(); + void action_command_getTorrentDlLimit(); + void action_command_setTorrentUpLimit(); + void action_command_setTorrentDlLimit(); + void action_command_alternativeSpeedLimitsEnabled(); + void action_command_toggleAlternativeSpeedLimits(); + void action_command_toggleSequentialDownload(); + void action_command_toggleFirstLastPiecePrio(); + void action_command_delete(); + void action_command_deletePerm(); + void action_command_increasePrio(); + void action_command_decreasePrio(); + void action_command_topPrio(); + void action_command_bottomPrio(); + void action_command_recheck(); + void action_version_api(); + void action_version_api_min(); + void action_version_qbittorrent(); + + typedef void (WebApplication::*Action)(); + + QString scope_; + QString action_; + QStringList args_; + + void processRequest(); + + bool isPublicScope(); + void parsePath(); + + static QMap > initializeActions(); + static QMap > actions_; }; #endif // WEBAPPLICATION_H diff --git a/src/webui/websessiondata.h b/src/webui/websessiondata.h new file mode 100644 index 000000000..fe7b4eeec --- /dev/null +++ b/src/webui/websessiondata.h @@ -0,0 +1,41 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#ifndef WEBSESSIONDATA +#define WEBSESSIONDATA + +#include + +struct WebSessionData +{ + QVariantMap syncMainDataLastResponse; + QVariantMap syncMainDataLastAcceptedResponse; +}; + +#endif // WEBSESSIONDATA + diff --git a/src/webui/webui.cpp b/src/webui/webui.cpp new file mode 100644 index 000000000..6cafe0b4b --- /dev/null +++ b/src/webui/webui.cpp @@ -0,0 +1,102 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include "webui.h" +#include "http/server.h" +#include "webapplication.h" +#include "dnsupdater.h" +#include "preferences.h" +#include "logger.h" + +WebUI::WebUI(QObject *parent) : QObject(parent) +{ + init(); + connect(Preferences::instance(), SIGNAL(changed()), SLOT(init())); +} + +void WebUI::init() +{ + Preferences* const pref = Preferences::instance(); + Logger* const logger = Logger::instance(); + + if (pref->isWebUiEnabled()) { + const quint16 port = pref->getWebUiPort(); + + if (httpServer_) { + if (httpServer_->serverPort() != port) + httpServer_->close(); + } + else { + webapp_ = new WebApplication(this); + httpServer_ = new Http::Server(webapp_, this); + } + +#ifndef QT_NO_OPENSSL + if (pref->isWebUiHttpsEnabled()) { + QSslCertificate cert(pref->getWebUiHttpsCertificate()); + QSslKey key; + key = QSslKey(pref->getWebUiHttpsKey(), QSsl::Rsa); + if (!cert.isNull() && !key.isNull()) + httpServer_->enableHttps(cert, key); + else + httpServer_->disableHttps(); + } + else { + httpServer_->disableHttps(); + } +#endif + + if (!httpServer_->isListening()) { + bool success = httpServer_->listen(QHostAddress::Any, port); + if (success) + logger->addMessage(tr("The Web UI is listening on port %1").arg(port)); + else + logger->addMessage(tr("Web User Interface Error - Unable to bind Web UI to port %1").arg(port), Log::CRITICAL); + } + + // DynDNS + if (pref->isDynDNSEnabled()) { + if (!dynDNSUpdater_) + dynDNSUpdater_ = new DNSUpdater(this); + else + dynDNSUpdater_->updateCredentials(); + } + else { + if (dynDNSUpdater_) + delete dynDNSUpdater_; + } + } + else { + if (httpServer_) + delete httpServer_; + if (webapp_) + delete webapp_; + if (dynDNSUpdater_) + delete dynDNSUpdater_; + } +} diff --git a/src/webui/webui.h b/src/webui/webui.h new file mode 100644 index 000000000..2abc6b924 --- /dev/null +++ b/src/webui/webui.h @@ -0,0 +1,55 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * 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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#ifndef WEBUI_H +#define WEBUI_H + +#include +#include + +namespace Http { class Server; } +class DNSUpdater; +class AbstractWebApplication; + +class WebUI : public QObject +{ + Q_OBJECT + +public: + explicit WebUI(QObject *parent = 0); + +private slots: + void init(); + +private: + QPointer httpServer_; + QPointer dynDNSUpdater_; + QPointer webapp_; +}; + +#endif // WEBUI_H diff --git a/src/webui/webui.pri b/src/webui/webui.pri index ba94e2297..1c36c4a9c 100644 --- a/src/webui/webui.pri +++ b/src/webui/webui.pri @@ -1,30 +1,25 @@ INCLUDEPATH += $$PWD -HEADERS += $$PWD/httpserver.h \ - $$PWD/httpconnection.h \ - $$PWD/btjson.h \ - $$PWD/prefjson.h \ - $$PWD/jsonutils.h \ - $$PWD/extra_translations.h \ - $$PWD/webapplication.h \ - $$PWD/abstractrequesthandler.h \ - $$PWD/requesthandler.h \ - $$PWD/qtorrentfilter.h +HEADERS += \ + $$PWD/webui.h \ + $$PWD/btjson.h \ + $$PWD/prefjson.h \ + $$PWD/jsonutils.h \ + $$PWD/extra_translations.h \ + $$PWD/webapplication.h \ + $$PWD/qtorrentfilter.h \ + $$PWD/websessiondata.h \ + $$PWD/abstractwebapplication.h -SOURCES += $$PWD/httpserver.cpp \ - $$PWD/httpconnection.cpp \ - $$PWD/httprequestparser.cpp \ - $$PWD/httpresponsegenerator.cpp \ - $$PWD/btjson.cpp \ - $$PWD/prefjson.cpp \ - $$PWD/webapplication.cpp \ - $$PWD/abstractrequesthandler.cpp \ - $$PWD/requesthandler.cpp \ - $$PWD/qtorrentfilter.cpp +SOURCES += \ + $$PWD/webui.cpp \ + $$PWD/btjson.cpp \ + $$PWD/prefjson.cpp \ + $$PWD/webapplication.cpp \ + $$PWD/qtorrentfilter.cpp \ + $$PWD/abstractwebapplication.cpp # QJson JSON parser/serializer for using with Qt4 -lessThan(QT_MAJOR_VERSION, 5) { - include(qjson/qjson.pri) -} +lessThan(QT_MAJOR_VERSION, 5): include(qjson/qjson.pri) RESOURCES += $$PWD/webui.qrc From 898d454b78385643a583f7680e32e6c63b671ac8 Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Thu, 5 Feb 2015 19:54:15 +0300 Subject: [PATCH 9/9] Follow project coding style (Issue #2192). --- src/core/http/connection.cpp | 89 +++--- src/core/http/connection.h | 20 +- src/core/http/requestparser.cpp | 441 +++++++++++++-------------- src/core/http/requestparser.h | 35 ++- src/core/http/responsegenerator.cpp | 145 +++++---- src/core/http/server.cpp | 54 ++-- src/core/http/server.h | 24 +- src/core/qtracker.cpp | 259 ++++++++-------- src/core/qtracker.h | 24 +- src/webui/abstractwebapplication.cpp | 333 ++++++++++---------- src/webui/extra_translations.h | 70 ++--- 11 files changed, 719 insertions(+), 775 deletions(-) diff --git a/src/core/http/connection.cpp b/src/core/http/connection.cpp index 435d2e73c..84985e895 100644 --- a/src/core/http/connection.cpp +++ b/src/core/http/connection.cpp @@ -40,13 +40,13 @@ using namespace Http; Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent) - : QObject(parent) - , m_socket(socket) - , m_requestHandler(requestHandler) + : QObject(parent) + , m_socket(socket) + , m_requestHandler(requestHandler) { - m_socket->setParent(this); - connect(m_socket, SIGNAL(readyRead()), SLOT(read())); - connect(m_socket, SIGNAL(disconnected()), SLOT(deleteLater())); + m_socket->setParent(this); + connect(m_socket, SIGNAL(readyRead()), SLOT(read())); + connect(m_socket, SIGNAL(disconnected()), SLOT(deleteLater())); } Connection::~Connection() @@ -55,57 +55,56 @@ Connection::~Connection() void Connection::read() { - m_receivedData.append(m_socket->readAll()); + m_receivedData.append(m_socket->readAll()); - Request request; - RequestParser::ErrorCode err = RequestParser::parse(m_receivedData, request); - switch (err) - { - case RequestParser::IncompleteRequest: - // Partial request waiting for the rest - break; - case RequestParser::BadRequest: - sendResponse(Response(400, "Bad Request")); - break; - case RequestParser::NoError: - Environment env; - env.clientAddress = m_socket->peerAddress(); - Response response = m_requestHandler->processRequest(request, env); - if (acceptsGzipEncoding(request.headers["accept-encoding"])) - response.headers[HEADER_CONTENT_ENCODING] = "gzip"; - sendResponse(response); - break; - } + Request request; + RequestParser::ErrorCode err = RequestParser::parse(m_receivedData, request); + switch (err) { + case RequestParser::IncompleteRequest: + // Partial request waiting for the rest + break; + case RequestParser::BadRequest: + sendResponse(Response(400, "Bad Request")); + break; + case RequestParser::NoError: + Environment env; + env.clientAddress = m_socket->peerAddress(); + Response response = m_requestHandler->processRequest(request, env); + if (acceptsGzipEncoding(request.headers["accept-encoding"])) + response.headers[HEADER_CONTENT_ENCODING] = "gzip"; + sendResponse(response); + break; + } } void Connection::sendResponse(const Response &response) { - m_socket->write(ResponseGenerator::generate(response)); - m_socket->disconnectFromHost(); + m_socket->write(ResponseGenerator::generate(response)); + m_socket->disconnectFromHost(); } bool Connection::acceptsGzipEncoding(const QString &encoding) { - int pos = encoding.indexOf("gzip", 0, Qt::CaseInsensitive); - if (pos == -1) - return false; + int pos = encoding.indexOf("gzip", 0, Qt::CaseInsensitive); + if (pos == -1) + return false; - // Let's see if there's a qvalue of 0.0 following - if (encoding[pos + 4] != ';') //there isn't, so it accepts gzip anyway - return true; + // Let's see if there's a qvalue of 0.0 following + if (encoding[pos + 4] != ';') //there isn't, so it accepts gzip anyway + return true; - //So let's find = and the next comma - pos = encoding.indexOf("=", pos + 4, Qt::CaseInsensitive); - int comma_pos = encoding.indexOf(",", pos, Qt::CaseInsensitive); + //So let's find = and the next comma + pos = encoding.indexOf("=", pos + 4, Qt::CaseInsensitive); + int comma_pos = encoding.indexOf(",", pos, Qt::CaseInsensitive); - QString value; - if (comma_pos == -1) - value = encoding.mid(pos + 1, comma_pos); - else - value = encoding.mid(pos + 1, comma_pos - (pos + 1)); + QString value; + if (comma_pos == -1) + value = encoding.mid(pos + 1, comma_pos); + else + value = encoding.mid(pos + 1, comma_pos - (pos + 1)); - if (value.toDouble() == 0.0) - return false; + if (value.toDouble() == 0.0) + return false; - return true; + return true; } diff --git a/src/core/http/connection.h b/src/core/http/connection.h index 4d3b28243..19c8acb6a 100644 --- a/src/core/http/connection.h +++ b/src/core/http/connection.h @@ -47,23 +47,23 @@ class IRequestHandler; class Connection : public QObject { - Q_OBJECT - Q_DISABLE_COPY(Connection) + Q_OBJECT + Q_DISABLE_COPY(Connection) public: - Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = 0); - ~Connection(); + Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = 0); + ~Connection(); private slots: - void read(); + void read(); private: - static bool acceptsGzipEncoding(const QString &encoding); - void sendResponse(const Response &response); + static bool acceptsGzipEncoding(const QString &encoding); + void sendResponse(const Response &response); - QTcpSocket *m_socket; - IRequestHandler *m_requestHandler; - QByteArray m_receivedData; + QTcpSocket *m_socket; + IRequestHandler *m_requestHandler; + QByteArray m_receivedData; }; } diff --git a/src/core/http/requestparser.cpp b/src/core/http/requestparser.cpp index d056aa539..4a766a900 100644 --- a/src/core/http/requestparser.cpp +++ b/src/core/http/requestparser.cpp @@ -31,7 +31,6 @@ #include #include -//#include #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) #include #endif @@ -45,214 +44,196 @@ const QByteArray EOH("\r\n\r\n"); inline QString unquoted(const QString& str) { - if ((str[0] == '\"') && (str[str.length() - 1] == '\"')) - return str.mid(1, str.length() - 2); + if ((str[0] == '\"') && (str[str.length() - 1] == '\"')) + return str.mid(1, str.length() - 2); - return str; + return str; } using namespace Http; RequestParser::ErrorCode RequestParser::parse(const QByteArray& data, Request& request, uint maxContentLength) { - return RequestParser(maxContentLength).parseHttpRequest(data, request); + return RequestParser(maxContentLength).parseHttpRequest(data, request); } RequestParser::RequestParser(uint maxContentLength) - : m_maxContentLength(maxContentLength) + : m_maxContentLength(maxContentLength) { } RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data, Request& request) { - m_request = Request(); - - // Parse HTTP request header - const int header_end = data.indexOf(EOH); - if (header_end < 0) - { - qDebug() << Q_FUNC_INFO << "incomplete request"; - return IncompleteRequest; - } - - if (!parseHttpHeader(data.left(header_end))) - { - qWarning() << Q_FUNC_INFO << "header parsing error"; - return BadRequest; - } - - // Parse HTTP request message - int content_length = 0; - if (m_request.headers.contains("content-length")) - { - content_length = m_request.headers["content-length"].toInt(); - if (content_length > static_cast(m_maxContentLength)) - { - qWarning() << Q_FUNC_INFO << "bad request: message too long"; - return BadRequest; + m_request = Request(); + + // Parse HTTP request header + const int header_end = data.indexOf(EOH); + if (header_end < 0) { + qDebug() << Q_FUNC_INFO << "incomplete request"; + return IncompleteRequest; } - QByteArray content = data.mid(header_end + EOH.length(), content_length); - if (content.length() < content_length) - { - qDebug() << Q_FUNC_INFO << "incomplete request"; - return IncompleteRequest; + if (!parseHttpHeader(data.left(header_end))) { + qWarning() << Q_FUNC_INFO << "header parsing error"; + return BadRequest; } - if (!parseContent(content)) - { - qWarning() << Q_FUNC_INFO << "message parsing error"; - return BadRequest; + // Parse HTTP request message + int content_length = 0; + if (m_request.headers.contains("content-length")) { + content_length = m_request.headers["content-length"].toInt(); + if (content_length > static_cast(m_maxContentLength)) { + qWarning() << Q_FUNC_INFO << "bad request: message too long"; + return BadRequest; + } + + QByteArray content = data.mid(header_end + EOH.length(), content_length); + if (content.length() < content_length) { + qDebug() << Q_FUNC_INFO << "incomplete request"; + return IncompleteRequest; + } + + if (!parseContent(content)) { + qWarning() << Q_FUNC_INFO << "message parsing error"; + return BadRequest; + } } - } - -// qDebug() << Q_FUNC_INFO; -// qDebug() << "HTTP Request header:"; -// qDebug() << data.left(header_end) << "\n"; - - request = m_request; - return NoError; + + // qDebug() << Q_FUNC_INFO; + // qDebug() << "HTTP Request header:"; + // qDebug() << data.left(header_end) << "\n"; + + request = m_request; + return NoError; } bool RequestParser::parseStartingLine(const QString &line) { - const QRegExp rx("^([A-Z]+)\\s+(\\S+)\\s+HTTP/\\d\\.\\d$"); + const QRegExp rx("^([A-Z]+)\\s+(\\S+)\\s+HTTP/\\d\\.\\d$"); - if (rx.indexIn(line.trimmed()) >= 0) - { - m_request.method = rx.cap(1); + if (rx.indexIn(line.trimmed()) >= 0) { + m_request.method = rx.cap(1); - QUrl url = QUrl::fromEncoded(rx.cap(2).toLatin1()); - m_request.path = url.path(); // Path + QUrl url = QUrl::fromEncoded(rx.cap(2).toLatin1()); + m_request.path = url.path(); // Path - // Parse GET parameters + // Parse GET parameters #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) - QListIterator > i(url.queryItems()); + QListIterator > i(url.queryItems()); #else - QListIterator > i(QUrlQuery(url).queryItems()); + QListIterator > i(QUrlQuery(url).queryItems()); #endif - while (i.hasNext()) - { - QPair pair = i.next(); - m_request.gets[pair.first] = pair.second; - } + while (i.hasNext()) { + QPair pair = i.next(); + m_request.gets[pair.first] = pair.second; + } - return true; - } + return true; + } - qWarning() << Q_FUNC_INFO << "invalid http header:" << line; - return false; + qWarning() << Q_FUNC_INFO << "invalid http header:" << line; + return false; } bool RequestParser::parseHeaderLine(const QString &line, QPair& out) { - int i = line.indexOf(QLatin1Char(':')); - if (i == -1) - { - qWarning() << Q_FUNC_INFO << "invalid http header:" << line; - return false; - } + int i = line.indexOf(QLatin1Char(':')); + if (i == -1) { + qWarning() << Q_FUNC_INFO << "invalid http header:" << line; + return false; + } - out = qMakePair(line.left(i).trimmed().toLower(), line.mid(i + 1).trimmed()); - return true; + out = qMakePair(line.left(i).trimmed().toLower(), line.mid(i + 1).trimmed()); + return true; } bool RequestParser::parseHttpHeader(const QByteArray &data) { - QString str = QString::fromUtf8(data); - QStringList lines = str.trimmed().split(EOL); - - QStringList headerLines; - foreach (const QString& line, lines) - { - if (line[0].isSpace()) // header line continuation - { - if (!headerLines.isEmpty()) // really continuation - { - headerLines.last() += QLatin1Char(' '); - headerLines.last() += line.trimmed(); - } - } - else - { - headerLines.append(line); + QString str = QString::fromUtf8(data); + QStringList lines = str.trimmed().split(EOL); + + QStringList headerLines; + foreach (const QString& line, lines) { + if (line[0].isSpace()) { // header line continuation + if (!headerLines.isEmpty()) { // really continuation + headerLines.last() += QLatin1Char(' '); + headerLines.last() += line.trimmed(); + } + } + else { + headerLines.append(line); + } } - } - if (headerLines.isEmpty()) - return false; // Empty header + if (headerLines.isEmpty()) + return false; // Empty header - QStringList::Iterator it = headerLines.begin(); - if (!parseStartingLine(*it)) - return false; + QStringList::Iterator it = headerLines.begin(); + if (!parseStartingLine(*it)) + return false; - ++it; - for (; it != headerLines.end(); ++it) - { - QPair header; - if (!parseHeaderLine(*it, header)) - return false; + ++it; + for (; it != headerLines.end(); ++it) { + QPair header; + if (!parseHeaderLine(*it, header)) + return false; - m_request.headers[header.first] = header.second; - } + m_request.headers[header.first] = header.second; + } - return true; + return true; } QList RequestParser::splitMultipartData(const QByteArray& data, const QByteArray& boundary) { - QList ret; - QByteArray sep = boundary + EOL; - const int sepLength = sep.size(); - - int start = 0, end = 0; - if ((end = data.indexOf(sep, start)) >= 0) - { - start = end + sepLength; // skip first boundary - - while ((end = data.indexOf(sep, start)) >= 0) - { - ret << data.mid(start, end - start); - start = end + sepLength; + QList ret; + QByteArray sep = boundary + EOL; + const int sepLength = sep.size(); + + int start = 0, end = 0; + if ((end = data.indexOf(sep, start)) >= 0) { + start = end + sepLength; // skip first boundary + + while ((end = data.indexOf(sep, start)) >= 0) { + ret << data.mid(start, end - start); + start = end + sepLength; + } + + // last or single part + sep = boundary + "--" + EOL; + if ((end = data.indexOf(sep, start)) >= 0) + ret << data.mid(start, end - start); } - // last or single part - sep = boundary + "--" + EOL; - if ((end = data.indexOf(sep, start)) >= 0) - ret << data.mid(start, end - start); - } - - return ret; + return ret; } bool RequestParser::parseContent(const QByteArray& data) { - // Parse message content - qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"]; - qDebug() << Q_FUNC_INFO << "data.size(): " << data.size(); - - // Parse url-encoded POST data - if (m_request.headers["content-type"].startsWith("application/x-www-form-urlencoded")) - { - QUrl url; + // Parse message content + qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"]; + qDebug() << Q_FUNC_INFO << "data.size(): " << data.size(); + + // Parse url-encoded POST data + if (m_request.headers["content-type"].startsWith("application/x-www-form-urlencoded")) { + QUrl url; #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) - url.setEncodedQuery(data); - QListIterator > i(url.queryItems()); + url.setEncodedQuery(data); + QListIterator > i(url.queryItems()); #else - url.setQuery(data); - QListIterator > i(QUrlQuery(url).queryItems(QUrl::FullyDecoded)); + url.setQuery(data); + QListIterator > i(QUrlQuery(url).queryItems(QUrl::FullyDecoded)); #endif - while (i.hasNext()) - { - QPair pair = i.next(); - m_request.posts[pair.first.toLower()] = pair.second; - } + while (i.hasNext()) { + QPair pair = i.next(); + m_request.posts[pair.first.toLower()] = pair.second; + } - return true; - } + return true; + } - // Parse multipart/form data (torrent file) - /** + // Parse multipart/form data (torrent file) + /** data has the following format (if boundary is "cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5") --cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5 @@ -270,108 +251,96 @@ Content-Disposition: form-data; name=\"Upload\" Submit Query --cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5-- **/ - QString content_type = m_request.headers["content-type"]; - if (content_type.startsWith("multipart/form-data")) - { - const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\""); - const QRegExp boundaryRegexNotQuoted("boundary=([\\w'()+,-\\./:=\\?]+)"); - - QByteArray boundary; - if (boundaryRegexQuoted.indexIn(content_type) < 0) - { - if (boundaryRegexNotQuoted.indexIn(content_type) < 0) - { - qWarning() << "Could not find boundary in multipart/form-data header!"; - return false; - } - else - { - boundary = "--" + boundaryRegexNotQuoted.cap(1).toLatin1(); - } + QString content_type = m_request.headers["content-type"]; + if (content_type.startsWith("multipart/form-data")) { + const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\""); + const QRegExp boundaryRegexNotQuoted("boundary=([\\w'()+,-\\./:=\\?]+)"); + + QByteArray boundary; + if (boundaryRegexQuoted.indexIn(content_type) < 0) { + if (boundaryRegexNotQuoted.indexIn(content_type) < 0) { + qWarning() << "Could not find boundary in multipart/form-data header!"; + return false; + } + else { + boundary = "--" + boundaryRegexNotQuoted.cap(1).toLatin1(); + } + } + else { + boundary = "--" + boundaryRegexQuoted.cap(1).toLatin1(); + } + + qDebug() << "Boundary is " << boundary; + QList parts = splitMultipartData(data, boundary); + qDebug() << parts.size() << "parts in data"; + + foreach (const QByteArray& part, parts) { + if (!parseFormData(part)) + return false; + } + + return true; } - else - { - boundary = "--" + boundaryRegexQuoted.cap(1).toLatin1(); + + qWarning() << Q_FUNC_INFO << "unknown content type:" << qPrintable(content_type); + return false; +} + +bool RequestParser::parseFormData(const QByteArray& data) +{ + // Parse form data header + const int header_end = data.indexOf(EOH); + if (header_end < 0) { + qDebug() << "Invalid form data: \n" << data; + return false; } - qDebug() << "Boundary is " << boundary; - QList parts = splitMultipartData(data, boundary); - qDebug() << parts.size() << "parts in data"; + QString header_str = QString::fromUtf8(data.left(header_end)); + QStringList lines = header_str.trimmed().split(EOL); + QStringMap headers; + foreach (const QString& line, lines) { + QPair header; + if (!parseHeaderLine(line, header)) + return false; - foreach (const QByteArray& part, parts) - { - if (!parseFormData(part)) + headers[header.first] = header.second; + } + + QStringMap disposition; + if (!headers.contains("content-disposition") + || !parseHeaderValue(headers["content-disposition"], disposition) + || !disposition.contains("name")) { + qDebug() << "Invalid form data header: \n" << header_str; return false; } - - return true; - } - qWarning() << Q_FUNC_INFO << "unknown content type:" << qPrintable(content_type); - return false; -} + if (disposition.contains("filename")) { + UploadedFile ufile; + ufile.filename = disposition["filename"]; + ufile.type = disposition["content-type"]; + ufile.data = data.mid(header_end + EOH.length()); -bool RequestParser::parseFormData(const QByteArray& data) -{ - // Parse form data header - const int header_end = data.indexOf(EOH); - if (header_end < 0) - { - qDebug() << "Invalid form data: \n" << data; - return false; - } - - QString header_str = QString::fromUtf8(data.left(header_end)); - QStringList lines = header_str.trimmed().split(EOL); - QStringMap headers; - foreach (const QString& line, lines) - { - QPair header; - if (!parseHeaderLine(line, header)) - return false; - - headers[header.first] = header.second; - } - - QStringMap disposition; - if (!headers.contains("content-disposition") || - !parseHeaderValue(headers["content-disposition"], disposition) || - !disposition.contains("name")) - { - qDebug() << "Invalid form data header: \n" << header_str; - return false; - } - - if (disposition.contains("filename")) - { - UploadedFile ufile; - ufile.filename = disposition["filename"]; - ufile.type = disposition["content-type"]; - ufile.data = data.mid(header_end + EOH.length()); - - m_request.files[disposition["name"]] = ufile; - } - else - { - m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length())); - } - - return true; + m_request.files[disposition["name"]] = ufile; + } + else { + m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length())); + } + + return true; } bool RequestParser::parseHeaderValue(const QString& value, QStringMap& out) { - QStringList items = value.split(QLatin1Char(';')); - out[""] = items[0]; + QStringList items = value.split(QLatin1Char(';')); + out[""] = items[0]; - for (QStringList::size_type i = 1; i < items.size(); ++i) - { - int pos = items[i].indexOf("="); - if (pos < 0) - return false; + for (QStringList::size_type i = 1; i < items.size(); ++i) { + int pos = items[i].indexOf("="); + if (pos < 0) + return false; - out[items[i].left(pos).trimmed()] = unquoted(items[i].mid(pos + 1).trimmed()); - } + out[items[i].left(pos).trimmed()] = unquoted(items[i].mid(pos + 1).trimmed()); + } - return true; + return true; } diff --git a/src/core/http/requestparser.h b/src/core/http/requestparser.h index 01ddb7176..ec8265e38 100644 --- a/src/core/http/requestparser.h +++ b/src/core/http/requestparser.h @@ -40,28 +40,33 @@ namespace Http class RequestParser { public: - enum ErrorCode { NoError = 0, IncompleteRequest, BadRequest }; + enum ErrorCode + { + NoError = 0, + IncompleteRequest, + BadRequest + }; - // when result != NoError parsed request is undefined - // Warning! Header names are converted to lower-case. - static ErrorCode parse(const QByteArray& data, Request& request, uint maxContentLength = 10000000 /* ~10MB */); + // when result != NoError parsed request is undefined + // Warning! Header names are converted to lower-case. + static ErrorCode parse(const QByteArray &data, Request &request, uint maxContentLength = 10000000 /* ~10MB */); private: - RequestParser(uint maxContentLength); + RequestParser(uint maxContentLength); - ErrorCode parseHttpRequest(const QByteArray& data, Request& request); + ErrorCode parseHttpRequest(const QByteArray &data, Request &request); - bool parseHttpHeader(const QByteArray& data); - bool parseStartingLine(const QString &line); - bool parseContent(const QByteArray& data); - bool parseFormData(const QByteArray& data); - QList splitMultipartData(const QByteArray& data, const QByteArray& boundary); + bool parseHttpHeader(const QByteArray &data); + bool parseStartingLine(const QString &line); + bool parseContent(const QByteArray &data); + bool parseFormData(const QByteArray &data); + QList splitMultipartData(const QByteArray &data, const QByteArray &boundary); - static bool parseHeaderLine(const QString& line, QPair& out); - static bool parseHeaderValue(const QString& value, QStringMap& out); + static bool parseHeaderLine(const QString &line, QPair &out); + static bool parseHeaderValue(const QString &value, QStringMap &out); - const uint m_maxContentLength; - Request m_request; + const uint m_maxContentLength; + Request m_request; }; } diff --git a/src/core/http/responsegenerator.cpp b/src/core/http/responsegenerator.cpp index 64f0ffbf7..f6aad3afa 100644 --- a/src/core/http/responsegenerator.cpp +++ b/src/core/http/responsegenerator.cpp @@ -38,96 +38,87 @@ using namespace Http; QByteArray ResponseGenerator::generate(Response response) { - if (response.headers[HEADER_CONTENT_ENCODING] == "gzip") - { - // A gzip seems to have 23 bytes overhead. - // Also "Content-Encoding: gzip\r\n" is 26 bytes long - // So we only benefit from gzip if the message is bigger than 23+26 = 49 - // If the message is smaller than 49 bytes we actually send MORE data if we gzip - QByteArray dest_buf; - if ((response.content.size() > 49) && (gCompress(response.content, dest_buf))) - { - response.content = dest_buf; + if (response.headers[HEADER_CONTENT_ENCODING] == "gzip") { + // A gzip seems to have 23 bytes overhead. + // Also "Content-Encoding: gzip\r\n" is 26 bytes long + // So we only benefit from gzip if the message is bigger than 23+26 = 49 + // If the message is smaller than 49 bytes we actually send MORE data if we gzip + QByteArray dest_buf; + if ((response.content.size() > 49) && (gCompress(response.content, dest_buf))) + response.content = dest_buf; + else + response.headers.remove(HEADER_CONTENT_ENCODING); } - else - { - response.headers.remove(HEADER_CONTENT_ENCODING); - } - } - if (response.content.length() > 0) - response.headers[HEADER_CONTENT_LENGTH] = QString::number(response.content.length()); + if (response.content.length() > 0) + response.headers[HEADER_CONTENT_LENGTH] = QString::number(response.content.length()); + + QString ret(QLatin1String("HTTP/1.1 %1 %2\r\n%3\r\n")); - QString ret(QLatin1String("HTTP/1.1 %1 %2\r\n%3\r\n")); + QString header; + foreach (const QString& key, response.headers.keys()) + header += QString("%1: %2\r\n").arg(key).arg(response.headers[key]); - QString header; - foreach (const QString& key, response.headers.keys()) - header += QString("%1: %2\r\n").arg(key).arg(response.headers[key]); + ret = ret.arg(response.status.code).arg(response.status.text).arg(header); - ret = ret.arg(response.status.code).arg(response.status.text).arg(header); - -// qDebug() << Q_FUNC_INFO; -// qDebug() << "HTTP Response header:"; -// qDebug() << ret; - - return ret.toUtf8() + response.content; + // qDebug() << Q_FUNC_INFO; + // qDebug() << "HTTP Response header:"; + // qDebug() << ret; + + return ret.toUtf8() + response.content; } bool gCompress(QByteArray data, QByteArray& dest_buffer) { - static const int BUFSIZE = 128 * 1024; - char tmp_buf[BUFSIZE]; - int ret; - - z_stream strm; - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - strm.next_in = reinterpret_cast(data.data()); - strm.avail_in = data.length(); - strm.next_out = reinterpret_cast(tmp_buf); - strm.avail_out = BUFSIZE; - - //windowBits = 15+16 to enable gzip - //From the zlib manual: windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits - //to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. - ret = deflateInit2(&strm, Z_BEST_COMPRESSION, Z_DEFLATED, 15+16, 8, Z_DEFAULT_STRATEGY); - - if (ret != Z_OK) - return false; - - while (strm.avail_in != 0) - { - ret = deflate(&strm, Z_NO_FLUSH); - if (ret != Z_OK) - return false; + static const int BUFSIZE = 128 * 1024; + char tmp_buf[BUFSIZE]; + int ret; + + z_stream strm; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.next_in = reinterpret_cast(data.data()); + strm.avail_in = data.length(); + strm.next_out = reinterpret_cast(tmp_buf); + strm.avail_out = BUFSIZE; + + //windowBits = 15+16 to enable gzip + //From the zlib manual: windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits + //to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. + ret = deflateInit2(&strm, Z_BEST_COMPRESSION, Z_DEFLATED, 15 + 16, 8, Z_DEFAULT_STRATEGY); - if (strm.avail_out == 0) - { - dest_buffer.append(tmp_buf, BUFSIZE); - strm.next_out = reinterpret_cast(tmp_buf); - strm.avail_out = BUFSIZE; - } - } - - int deflate_res = Z_OK; - while (deflate_res == Z_OK) - { - if (strm.avail_out == 0) - { - dest_buffer.append(tmp_buf, BUFSIZE); - strm.next_out = reinterpret_cast(tmp_buf); - strm.avail_out = BUFSIZE; + if (ret != Z_OK) + return false; + + while (strm.avail_in != 0) { + ret = deflate(&strm, Z_NO_FLUSH); + if (ret != Z_OK) + return false; + + if (strm.avail_out == 0) { + dest_buffer.append(tmp_buf, BUFSIZE); + strm.next_out = reinterpret_cast(tmp_buf); + strm.avail_out = BUFSIZE; + } } - deflate_res = deflate(&strm, Z_FINISH); - } + int deflate_res = Z_OK; + while (deflate_res == Z_OK) { + if (strm.avail_out == 0) { + dest_buffer.append(tmp_buf, BUFSIZE); + strm.next_out = reinterpret_cast(tmp_buf); + strm.avail_out = BUFSIZE; + } + + deflate_res = deflate(&strm, Z_FINISH); + } - if (deflate_res != Z_STREAM_END) - return false; + if (deflate_res != Z_STREAM_END) + return false; - dest_buffer.append(tmp_buf, BUFSIZE - strm.avail_out); - deflateEnd(&strm); + dest_buffer.append(tmp_buf, BUFSIZE - strm.avail_out); + deflateEnd(&strm); - return true; + return true; } diff --git a/src/core/http/server.cpp b/src/core/http/server.cpp index 6430f9745..8bf905fec 100644 --- a/src/core/http/server.cpp +++ b/src/core/http/server.cpp @@ -39,8 +39,8 @@ using namespace Http; Server::Server(IRequestHandler *requestHandler, QObject* parent) - : QTcpServer(parent) - , m_requestHandler(requestHandler) + : QTcpServer(parent) + , m_requestHandler(requestHandler) #ifndef QT_NO_OPENSSL , m_https(false) #endif @@ -54,16 +54,16 @@ Server::~Server() #ifndef QT_NO_OPENSSL void Server::enableHttps(const QSslCertificate &certificate, const QSslKey &key) { - m_certificate = certificate; - m_key = key; - m_https = true; + m_certificate = certificate; + m_key = key; + m_https = true; } void Server::disableHttps() { - m_https = false; - m_certificate.clear(); - m_key.clear(); + m_https = false; + m_certificate.clear(); + m_key.clear(); } #endif @@ -73,28 +73,26 @@ void Server::incomingConnection(qintptr socketDescriptor) void Server::incomingConnection(int socketDescriptor) #endif { - QTcpSocket *serverSocket; + QTcpSocket *serverSocket; #ifndef QT_NO_OPENSSL - if (m_https) - serverSocket = new QSslSocket(this); - else + if (m_https) + serverSocket = new QSslSocket(this); + else #endif - serverSocket = new QTcpSocket(this); - if (serverSocket->setSocketDescriptor(socketDescriptor)) - { + serverSocket = new QTcpSocket(this); + + if (serverSocket->setSocketDescriptor(socketDescriptor)) { #ifndef QT_NO_OPENSSL - if (m_https) - { - static_cast(serverSocket)->setProtocol(QSsl::AnyProtocol); - static_cast(serverSocket)->setPrivateKey(m_key); - static_cast(serverSocket)->setLocalCertificate(m_certificate); - static_cast(serverSocket)->startServerEncryption(); - } + if (m_https) { + static_cast(serverSocket)->setProtocol(QSsl::AnyProtocol); + static_cast(serverSocket)->setPrivateKey(m_key); + static_cast(serverSocket)->setLocalCertificate(m_certificate); + static_cast(serverSocket)->startServerEncryption(); + } #endif - new Connection(serverSocket, m_requestHandler, this); - } - else - { - serverSocket->deleteLater(); - } + new Connection(serverSocket, m_requestHandler, this); + } + else { + serverSocket->deleteLater(); + } } diff --git a/src/core/http/server.h b/src/core/http/server.h index 5ee591421..c8cb774c3 100644 --- a/src/core/http/server.h +++ b/src/core/http/server.h @@ -47,31 +47,31 @@ class Connection; class Server : public QTcpServer { - Q_OBJECT - Q_DISABLE_COPY(Server) + Q_OBJECT + Q_DISABLE_COPY(Server) public: - Server(IRequestHandler *requestHandler, QObject *parent = 0); - ~Server(); + Server(IRequestHandler *requestHandler, QObject *parent = 0); + ~Server(); #ifndef QT_NO_OPENSSL - void enableHttps(const QSslCertificate &certificate, const QSslKey &key); - void disableHttps(); + void enableHttps(const QSslCertificate &certificate, const QSslKey &key); + void disableHttps(); #endif private: #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) - void incomingConnection(qintptr socketDescriptor); + void incomingConnection(qintptr socketDescriptor); #else - void incomingConnection(int socketDescriptor); + void incomingConnection(int socketDescriptor); #endif private: - IRequestHandler *m_requestHandler; + IRequestHandler *m_requestHandler; #ifndef QT_NO_OPENSSL - bool m_https; - QSslCertificate m_certificate; - QSslKey m_key; + bool m_https; + QSslCertificate m_certificate; + QSslKey m_key; #endif }; diff --git a/src/core/qtracker.cpp b/src/core/qtracker.cpp index 5afad0d50..cc7146861 100644 --- a/src/core/qtracker.cpp +++ b/src/core/qtracker.cpp @@ -73,27 +73,27 @@ QTracker::QTracker(QObject *parent) QTracker::~QTracker() { - if (m_server->isListening()) - qDebug("Shutting down the embedded tracker..."); - // TODO: Store the torrent list + if (m_server->isListening()) + qDebug("Shutting down the embedded tracker..."); + // TODO: Store the torrent list } bool QTracker::start() { - const int listen_port = Preferences::instance()->getTrackerPort(); - - if (m_server->isListening()) { - if (m_server->serverPort() == listen_port) { - // Already listening on the right port, just return - return true; + const int listen_port = Preferences::instance()->getTrackerPort(); + + if (m_server->isListening()) { + if (m_server->serverPort() == listen_port) { + // Already listening on the right port, just return + return true; + } + // Wrong port, closing the server + m_server->close(); } - // Wrong port, closing the server - m_server->close(); - } - qDebug("Starting the embedded tracker..."); - // Listen on the predefined port - return m_server->listen(QHostAddress::Any, listen_port); + qDebug("Starting the embedded tracker..."); + // Listen on the predefined port + return m_server->listen(QHostAddress::Any, listen_port); } Http::Response QTracker::processRequest(const Http::Request &request, const Http::Environment &env) @@ -103,12 +103,12 @@ Http::Response QTracker::processRequest(const Http::Request &request, const Http //qDebug("QTracker received the following request:\n%s", qPrintable(parser.toString())); // Is request a GET request? if (request.method != "GET") { - qDebug("QTracker: Unsupported HTTP request: %s", qPrintable(request.method)); - status(100, "Invalid request type"); + qDebug("QTracker: Unsupported HTTP request: %s", qPrintable(request.method)); + status(100, "Invalid request type"); } else if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) { - qDebug("QTracker: Unrecognized path: %s", qPrintable(request.path)); - status(100, "Invalid request type"); + qDebug("QTracker: Unrecognized path: %s", qPrintable(request.path)); + status(100, "Invalid request type"); } else { // OK, this is a GET request @@ -122,126 +122,127 @@ Http::Response QTracker::processRequest(const Http::Request &request, const Http void QTracker::respondToAnnounceRequest() { - const QStringMap &gets = m_request.gets; - TrackerAnnounceRequest annonce_req; - - // IP - annonce_req.peer.ip = m_env.clientAddress.toString(); - - // 1. Get info_hash - if (!gets.contains("info_hash")) { - qDebug("QTracker: Missing info_hash"); - status(101, "Missing info_hash"); - return; - } - annonce_req.info_hash = gets.value("info_hash"); - // info_hash cannot be longer than 20 bytes - /*if (annonce_req.info_hash.toLatin1().length() > 20) { - qDebug("QTracker: Info_hash is not 20 byte long: %s (%d)", qPrintable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length()); - status(150, "Invalid infohash"); - return; - }*/ - - // 2. Get peer ID - if (!gets.contains("peer_id")) { - qDebug("QTracker: Missing peer_id"); - status(102, "Missing peer_id"); - return; - } - annonce_req.peer.peer_id = gets.value("peer_id"); - // peer_id cannot be longer than 20 bytes - /*if (annonce_req.peer.peer_id.length() > 20) { - qDebug("QTracker: peer_id is not 20 byte long: %s", qPrintable(annonce_req.peer.peer_id)); - status(151, "Invalid peerid"); - return; - }*/ - - // 3. Get port - if (!gets.contains("port")) { - qDebug("QTracker: Missing port"); - status(103, "Missing port"); - return; - } - bool ok = false; - annonce_req.peer.port = gets.value("port").toInt(&ok); - if (!ok || annonce_req.peer.port < 1 || annonce_req.peer.port > 65535) { - qDebug("QTracker: Invalid port number (%d)", annonce_req.peer.port); - status(103, "Missing port"); - return; - } - - // 4. Get event - annonce_req.event = ""; - if (gets.contains("event")) { - annonce_req.event = gets.value("event"); - qDebug("QTracker: event is %s", qPrintable(annonce_req.event)); - } - - // 5. Get numwant - annonce_req.numwant = 50; - if (gets.contains("numwant")) { - int tmp = gets.value("numwant").toInt(); - if (tmp > 0) { - qDebug("QTracker: numwant = %d", tmp); - annonce_req.numwant = tmp; + const QStringMap &gets = m_request.gets; + TrackerAnnounceRequest annonce_req; + + // IP + annonce_req.peer.ip = m_env.clientAddress.toString(); + + // 1. Get info_hash + if (!gets.contains("info_hash")) { + qDebug("QTracker: Missing info_hash"); + status(101, "Missing info_hash"); + return; + } + annonce_req.info_hash = gets.value("info_hash"); + // info_hash cannot be longer than 20 bytes + /*if (annonce_req.info_hash.toLatin1().length() > 20) { + qDebug("QTracker: Info_hash is not 20 byte long: %s (%d)", qPrintable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length()); + status(150, "Invalid infohash"); + return; + }*/ + + // 2. Get peer ID + if (!gets.contains("peer_id")) { + qDebug("QTracker: Missing peer_id"); + status(102, "Missing peer_id"); + return; + } + annonce_req.peer.peer_id = gets.value("peer_id"); + // peer_id cannot be longer than 20 bytes + /*if (annonce_req.peer.peer_id.length() > 20) { + qDebug("QTracker: peer_id is not 20 byte long: %s", qPrintable(annonce_req.peer.peer_id)); + status(151, "Invalid peerid"); + return; + }*/ + + // 3. Get port + if (!gets.contains("port")) { + qDebug("QTracker: Missing port"); + status(103, "Missing port"); + return; + } + bool ok = false; + annonce_req.peer.port = gets.value("port").toInt(&ok); + if (!ok || annonce_req.peer.port < 1 || annonce_req.peer.port > 65535) { + qDebug("QTracker: Invalid port number (%d)", annonce_req.peer.port); + status(103, "Missing port"); + return; + } + + // 4. Get event + annonce_req.event = ""; + if (gets.contains("event")) { + annonce_req.event = gets.value("event"); + qDebug("QTracker: event is %s", qPrintable(annonce_req.event)); + } + + // 5. Get numwant + annonce_req.numwant = 50; + if (gets.contains("numwant")) { + int tmp = gets.value("numwant").toInt(); + if (tmp > 0) { + qDebug("QTracker: numwant = %d", tmp); + annonce_req.numwant = tmp; + } } - } - // 6. no_peer_id (extension) - annonce_req.no_peer_id = false; - if (gets.contains("no_peer_id")) - annonce_req.no_peer_id = true; + // 6. no_peer_id (extension) + annonce_req.no_peer_id = false; + if (gets.contains("no_peer_id")) + annonce_req.no_peer_id = true; - // 7. TODO: support "compact" extension + // 7. TODO: support "compact" extension - // Done parsing, now let's reply - if (m_torrents.contains(annonce_req.info_hash)) { - if (annonce_req.event == "stopped") { - qDebug("QTracker: Peer stopped downloading, deleting it from the list"); - m_torrents[annonce_req.info_hash].remove(annonce_req.peer.qhash()); - return; + // Done parsing, now let's reply + if (m_torrents.contains(annonce_req.info_hash)) { + if (annonce_req.event == "stopped") { + qDebug("QTracker: Peer stopped downloading, deleting it from the list"); + m_torrents[annonce_req.info_hash].remove(annonce_req.peer.qhash()); + return; + } } - } else { - // Unknown torrent - if (m_torrents.size() == MAX_TORRENTS) { - // Reached max size, remove a random torrent - m_torrents.erase(m_torrents.begin()); + else { + // Unknown torrent + if (m_torrents.size() == MAX_TORRENTS) { + // Reached max size, remove a random torrent + m_torrents.erase(m_torrents.begin()); + } } - } - // Register the user - PeerList peers = m_torrents.value(annonce_req.info_hash); - if (peers.size() == MAX_PEERS_PER_TORRENT) { - // Too many peers, remove a random one - peers.erase(peers.begin()); - } - peers[annonce_req.peer.qhash()] = annonce_req.peer; - m_torrents[annonce_req.info_hash] = peers; - - // Reply - replyWithPeerList(annonce_req); + // Register the user + PeerList peers = m_torrents.value(annonce_req.info_hash); + if (peers.size() == MAX_PEERS_PER_TORRENT) { + // Too many peers, remove a random one + peers.erase(peers.begin()); + } + peers[annonce_req.peer.qhash()] = annonce_req.peer; + m_torrents[annonce_req.info_hash] = peers; + + // Reply + replyWithPeerList(annonce_req); } void QTracker::replyWithPeerList(const TrackerAnnounceRequest &annonce_req) { - // Prepare the entry for bencoding - libtorrent::entry::dictionary_type reply_dict; - reply_dict["interval"] = libtorrent::entry(ANNOUNCE_INTERVAL); - QList peers = m_torrents.value(annonce_req.info_hash).values(); - libtorrent::entry::list_type peer_list; - foreach (const QPeer & p, peers) { - //if (p != annonce_req.peer) - peer_list.push_back(p.toEntry(annonce_req.no_peer_id)); - } - reply_dict["peers"] = libtorrent::entry(peer_list); - libtorrent::entry reply_entry(reply_dict); - // bencode - std::vector buf; - libtorrent::bencode(std::back_inserter(buf), reply_entry); - QByteArray reply(&buf[0], static_cast(buf.size())); - qDebug("QTracker: reply with the following bencoded data:\n %s", reply.constData()); - - // HTTP reply - print(reply, Http::CONTENT_TYPE_TXT); + // Prepare the entry for bencoding + libtorrent::entry::dictionary_type reply_dict; + reply_dict["interval"] = libtorrent::entry(ANNOUNCE_INTERVAL); + QList peers = m_torrents.value(annonce_req.info_hash).values(); + libtorrent::entry::list_type peer_list; + foreach (const QPeer &p, peers) { + //if (p != annonce_req.peer) + peer_list.push_back(p.toEntry(annonce_req.no_peer_id)); + } + reply_dict["peers"] = libtorrent::entry(peer_list); + libtorrent::entry reply_entry(reply_dict); + // bencode + std::vector buf; + libtorrent::bencode(std::back_inserter(buf), reply_entry); + QByteArray reply(&buf[0], static_cast(buf.size())); + qDebug("QTracker: reply with the following bencoded data:\n %s", reply.constData()); + + // HTTP reply + print(reply, Http::CONTENT_TYPE_TXT); } diff --git a/src/core/qtracker.h b/src/core/qtracker.h index 520480d78..3c1484f7a 100644 --- a/src/core/qtracker.h +++ b/src/core/qtracker.h @@ -74,25 +74,25 @@ namespace Http { class Server; } /* Following http://wiki.theory.org/BitTorrent_Tracker_Protocol */ class QTracker : public Http::ResponseBuilder, public Http::IRequestHandler { - Q_OBJECT - Q_DISABLE_COPY(QTracker) + Q_OBJECT + Q_DISABLE_COPY(QTracker) public: - explicit QTracker(QObject *parent = 0); - ~QTracker(); + explicit QTracker(QObject *parent = 0); + ~QTracker(); - bool start(); - Http::Response processRequest(const Http::Request &request, const Http::Environment &env); + bool start(); + Http::Response processRequest(const Http::Request &request, const Http::Environment &env); private: - void respondToAnnounceRequest(); - void replyWithPeerList(const TrackerAnnounceRequest &annonce_req); + void respondToAnnounceRequest(); + void replyWithPeerList(const TrackerAnnounceRequest &annonce_req); - Http::Server *m_server; - TorrentList m_torrents; + Http::Server *m_server; + TorrentList m_torrents; - Http::Request m_request; - Http::Environment m_env; + Http::Request m_request; + Http::Environment m_env; }; #endif // QTRACKER_H diff --git a/src/webui/abstractwebapplication.cpp b/src/webui/abstractwebapplication.cpp index be73940f9..1e13e1318 100644 --- a/src/webui/abstractwebapplication.cpp +++ b/src/webui/abstractwebapplication.cpp @@ -44,17 +44,17 @@ class UnbanTimer: public QTimer { public: - UnbanTimer(const QHostAddress& peer_ip, QObject *parent) - : QTimer(parent), m_peerIp(peer_ip) - { - setSingleShot(true); - setInterval(BAN_TIME); - } + UnbanTimer(const QHostAddress& peer_ip, QObject *parent) + : QTimer(parent), m_peerIp(peer_ip) + { + setSingleShot(true); + setInterval(BAN_TIME); + } - inline const QHostAddress& peerIp() const { return m_peerIp; } + inline const QHostAddress& peerIp() const { return m_peerIp; } private: - QHostAddress m_peerIp; + QHostAddress m_peerIp; }; // WebSession @@ -79,8 +79,8 @@ struct WebSession // AbstractWebApplication AbstractWebApplication::AbstractWebApplication(QObject *parent) - : Http::ResponseBuilder(parent) - , session_(0) + : Http::ResponseBuilder(parent) + , session_(0) { QTimer *timer = new QTimer(this); timer->setInterval(60000); // 1 min. @@ -89,7 +89,7 @@ AbstractWebApplication::AbstractWebApplication(QObject *parent) AbstractWebApplication::~AbstractWebApplication() { - // cleanup sessions data + // cleanup sessions data qDeleteAll(sessions_); } @@ -117,10 +117,10 @@ Http::Response AbstractWebApplication::processRequest(const Http::Request &reque void AbstractWebApplication::UnbanTimerEvent() { - UnbanTimer* ubantimer = static_cast(sender()); - qDebug("Ban period has expired for %s", qPrintable(ubantimer->peerIp().toString())); - clientFailedAttempts_.remove(ubantimer->peerIp()); - ubantimer->deleteLater(); + UnbanTimer* ubantimer = static_cast(sender()); + qDebug("Ban period has expired for %s", qPrintable(ubantimer->peerIp().toString())); + clientFailedAttempts_.remove(ubantimer->peerIp()); + ubantimer->deleteLater(); } void AbstractWebApplication::removeInactiveSessions() @@ -135,84 +135,74 @@ void AbstractWebApplication::removeInactiveSessions() bool AbstractWebApplication::sessionInitialize() { - static const QString SID_START = QLatin1String(C_SID) + QLatin1String("="); + static const QString SID_START = QLatin1String(C_SID) + QLatin1String("="); - if (session_ == 0) - { - QString cookie = request_.headers.value("cookie"); - //qDebug() << Q_FUNC_INFO << "cookie: " << cookie; - - QString sessionId; - int pos = cookie.indexOf(SID_START); - if (pos >= 0) + if (session_ == 0) { - pos += SID_START.length(); - int end = cookie.indexOf(QRegExp("[,;]"), pos); - sessionId = cookie.mid(pos, end >= 0 ? end - pos : end); - } - - // TODO: Additional session check + QString cookie = request_.headers.value("cookie"); + //qDebug() << Q_FUNC_INFO << "cookie: " << cookie; + + QString sessionId; + int pos = cookie.indexOf(SID_START); + if (pos >= 0) { + pos += SID_START.length(); + int end = cookie.indexOf(QRegExp("[,;]"), pos); + sessionId = cookie.mid(pos, end >= 0 ? end - pos : end); + } - if (!sessionId.isNull()) - { - if (sessions_.contains(sessionId)) - { - session_ = sessions_[sessionId]; - session_->updateTimestamp(); - return true; - } - else - { - qDebug() << Q_FUNC_INFO << "session does not exist!"; - } + // TODO: Additional session check + + if (!sessionId.isNull()) { + if (sessions_.contains(sessionId)) { + session_ = sessions_[sessionId]; + session_->updateTimestamp(); + return true; + } + else { + qDebug() << Q_FUNC_INFO << "session does not exist!"; + } + } } - } - return false; + return false; } bool AbstractWebApplication::readFile(const QString& path, QByteArray &data, QString &type) { - QString ext = ""; - int index = path.lastIndexOf('.') + 1; - if (index > 0) - ext = path.mid(index); - - // find translated file in cache - if (translatedFiles_.contains(path)) - { - data = translatedFiles_[path]; - } - else - { - QFile file(path); - if (!file.open(QIODevice::ReadOnly)) - { - qDebug("File %s was not found!", qPrintable(path)); - return false; + QString ext = ""; + int index = path.lastIndexOf('.') + 1; + if (index > 0) + ext = path.mid(index); + + // find translated file in cache + if (translatedFiles_.contains(path)) { + data = translatedFiles_[path]; } + else { + QFile file(path); + if (!file.open(QIODevice::ReadOnly)) { + qDebug("File %s was not found!", qPrintable(path)); + return false; + } - data = file.readAll(); - file.close(); + data = file.readAll(); + file.close(); - // Translate the file - if ((ext == "html") || ((ext == "js") && !path.endsWith("excanvas-compressed.js"))) - { - QString dataStr = QString::fromUtf8(data.constData()); - translateDocument(dataStr); + // Translate the file + if ((ext == "html") || ((ext == "js") && !path.endsWith("excanvas-compressed.js"))) { + QString dataStr = QString::fromUtf8(data.constData()); + translateDocument(dataStr); - if (path.endsWith("about.html")) - { - dataStr.replace("${VERSION}", VERSION); - } + if (path.endsWith("about.html")) + dataStr.replace("${VERSION}", VERSION); - data = dataStr.toUtf8(); - translatedFiles_[path] = data; // cashing translated file + data = dataStr.toUtf8(); + translatedFiles_[path] = data; // cashing translated file + } } - } - type = CONTENT_TYPE_BY_EXT[ext]; - return true; + type = CONTENT_TYPE_BY_EXT[ext]; + return true; } WebSessionData *AbstractWebApplication::session() @@ -227,102 +217,95 @@ QString AbstractWebApplication::generateSid() QString sid; qsrand(QDateTime::currentDateTime().toTime_t()); - do - { - const size_t size = 6; - quint32 tmp[size]; + do { + const size_t size = 6; + quint32 tmp[size]; - for (size_t i = 0; i < size; ++i) - tmp[i] = qrand(); + for (size_t i = 0; i < size; ++i) + tmp[i] = qrand(); - sid = QByteArray::fromRawData(reinterpret_cast(tmp), sizeof(quint32) * size).toBase64(); - } - while (sessions_.contains(sid)); + sid = QByteArray::fromRawData(reinterpret_cast(tmp), sizeof(quint32) * size).toBase64(); + } + while (sessions_.contains(sid)); - return sid; + return sid; } void AbstractWebApplication::translateDocument(QString& data) { - const QRegExp regex("QBT_TR\\((([^\\)]|\\)(?!QBT_TR))+)\\)QBT_TR"); - const QRegExp mnemonic("\\(?&([a-zA-Z]?\\))?"); - const std::string contexts[] = { - "TransferListFiltersWidget", "TransferListWidget", "PropertiesWidget", - "HttpServer", "confirmDeletionDlg", "TrackerList", "TorrentFilesModel", - "options_imp", "Preferences", "TrackersAdditionDlg", "ScanFoldersModel", - "PropTabBar", "TorrentModel", "downloadFromURL", "MainWindow", "misc", - "StatusBar" - }; - const size_t context_count = sizeof(contexts) / sizeof(contexts[0]); - int i = 0; - bool found = true; - - const QString locale = Preferences::instance()->getLocale(); - bool isTranslationNeeded = !locale.startsWith("en") || locale.startsWith("en_AU") || locale.startsWith("en_GB"); - - while(i < data.size() && found) - { - i = regex.indexIn(data, i); - if (i >= 0) - { - //qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data()); - QByteArray word = regex.cap(1).toUtf8(); - - QString translation = word; - if (isTranslationNeeded) - { - size_t context_index = 0; - while ((context_index < context_count) && (translation == word)) - { + const QRegExp regex("QBT_TR\\((([^\\)]|\\)(?!QBT_TR))+)\\)QBT_TR"); + const QRegExp mnemonic("\\(?&([a-zA-Z]?\\))?"); + const std::string contexts[] = { + "TransferListFiltersWidget", "TransferListWidget", "PropertiesWidget", + "HttpServer", "confirmDeletionDlg", "TrackerList", "TorrentFilesModel", + "options_imp", "Preferences", "TrackersAdditionDlg", "ScanFoldersModel", + "PropTabBar", "TorrentModel", "downloadFromURL", "MainWindow", "misc", + "StatusBar" + }; + const size_t context_count = sizeof(contexts) / sizeof(contexts[0]); + int i = 0; + bool found = true; + + const QString locale = Preferences::instance()->getLocale(); + bool isTranslationNeeded = !locale.startsWith("en") || locale.startsWith("en_AU") || locale.startsWith("en_GB"); + + while(i < data.size() && found) { + i = regex.indexIn(data, i); + if (i >= 0) { + //qDebug("Found translatable string: %s", regex.cap(1).toUtf8().data()); + QByteArray word = regex.cap(1).toUtf8(); + + QString translation = word; + if (isTranslationNeeded) { + size_t context_index = 0; + while ((context_index < context_count) && (translation == word)) { #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) - translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, QCoreApplication::UnicodeUTF8, 1); + translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, QCoreApplication::UnicodeUTF8, 1); #else - translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, 1); + translation = qApp->translate(contexts[context_index].c_str(), word.constData(), 0, 1); #endif - ++context_index; + ++context_index; + } + } + // Remove keyboard shortcuts + translation.replace(mnemonic, ""); + + data.replace(i, regex.matchedLength(), translation); + i += translation.length(); + } + else { + found = false; // no more translatable strings } - } - // Remove keyboard shortcuts - translation.replace(mnemonic, ""); - - data.replace(i, regex.matchedLength(), translation); - i += translation.length(); - } - else - { - found = false; // no more translatable strings } - } } bool AbstractWebApplication::isBanned() const { - return clientFailedAttempts_.value(env_.clientAddress, 0) >= MAX_AUTH_FAILED_ATTEMPTS; + return clientFailedAttempts_.value(env_.clientAddress, 0) >= MAX_AUTH_FAILED_ATTEMPTS; } int AbstractWebApplication::failedAttempts() const { - return clientFailedAttempts_.value(env_.clientAddress, 0); + return clientFailedAttempts_.value(env_.clientAddress, 0); } void AbstractWebApplication::resetFailedAttempts() { - clientFailedAttempts_.remove(env_.clientAddress); + clientFailedAttempts_.remove(env_.clientAddress); } void AbstractWebApplication::increaseFailedAttempts() { - const int nb_fail = clientFailedAttempts_.value(env_.clientAddress, 0) + 1; - - clientFailedAttempts_[env_.clientAddress] = nb_fail; - if (nb_fail == MAX_AUTH_FAILED_ATTEMPTS) - { - // Max number of failed attempts reached - // Start ban period - UnbanTimer* ubantimer = new UnbanTimer(env_.clientAddress, this); - connect(ubantimer, SIGNAL(timeout()), SLOT(UnbanTimerEvent())); - ubantimer->start(); - } + const int nb_fail = clientFailedAttempts_.value(env_.clientAddress, 0) + 1; + + clientFailedAttempts_[env_.clientAddress] = nb_fail; + if (nb_fail == MAX_AUTH_FAILED_ATTEMPTS) { + // Max number of failed attempts reached + // Start ban period + UnbanTimer* ubantimer = new UnbanTimer(env_.clientAddress, this); + connect(ubantimer, SIGNAL(timeout()), SLOT(UnbanTimerEvent())); + ubantimer->start(); + } } bool AbstractWebApplication::isAuthNeeded() @@ -347,39 +330,37 @@ void AbstractWebApplication::printFile(const QString& path) bool AbstractWebApplication::sessionStart() { - if (session_ == 0) - { - session_ = new WebSession(generateSid()); - session_->updateTimestamp(); - sessions_[session_->id] = session_; + if (session_ == 0) { + session_ = new WebSession(generateSid()); + session_->updateTimestamp(); + sessions_[session_->id] = session_; - QNetworkCookie cookie(C_SID, session_->id.toUtf8()); - cookie.setPath(QLatin1String("/")); - header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); + QNetworkCookie cookie(C_SID, session_->id.toUtf8()); + cookie.setPath(QLatin1String("/")); + header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); - return true; - } + return true; + } - return false; + return false; } bool AbstractWebApplication::sessionEnd() { - if ((session_ != 0) && (sessions_.contains(session_->id))) - { - QNetworkCookie cookie(C_SID, session_->id.toUtf8()); - cookie.setPath(QLatin1String("/")); - cookie.setExpirationDate(QDateTime::currentDateTime()); + if ((session_ != 0) && (sessions_.contains(session_->id))) { + QNetworkCookie cookie(C_SID, session_->id.toUtf8()); + cookie.setPath(QLatin1String("/")); + cookie.setExpirationDate(QDateTime::currentDateTime()); - sessions_.remove(session_->id); - delete session_; - session_ = 0; + sessions_.remove(session_->id); + delete session_; + session_ = 0; - header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); - return true; - } + header(Http::HEADER_SET_COOKIE, cookie.toRawForm()); + return true; + } - return false; + return false; } QString AbstractWebApplication::saveTmpFile(const QByteArray &data) @@ -398,16 +379,16 @@ QString AbstractWebApplication::saveTmpFile(const QByteArray &data) QStringMap AbstractWebApplication::initializeContentTypeByExtMap() { - QStringMap map; + QStringMap map; - map["htm"] = Http::CONTENT_TYPE_HTML; - map["html"] = Http::CONTENT_TYPE_HTML; - map["css"] = Http::CONTENT_TYPE_CSS; - map["gif"] = Http::CONTENT_TYPE_GIF; - map["png"] = Http::CONTENT_TYPE_PNG; - map["js"] = Http::CONTENT_TYPE_JS; + map["htm"] = Http::CONTENT_TYPE_HTML; + map["html"] = Http::CONTENT_TYPE_HTML; + map["css"] = Http::CONTENT_TYPE_CSS; + map["gif"] = Http::CONTENT_TYPE_GIF; + map["png"] = Http::CONTENT_TYPE_PNG; + map["js"] = Http::CONTENT_TYPE_JS; - return map; + return map; } const QStringMap AbstractWebApplication::CONTENT_TYPE_BY_EXT = AbstractWebApplication::initializeContentTypeByExtMap(); diff --git a/src/webui/extra_translations.h b/src/webui/extra_translations.h index 840228afe..460531152 100644 --- a/src/webui/extra_translations.h +++ b/src/webui/extra_translations.h @@ -33,44 +33,44 @@ // Additional translations for Web UI static const char *__TRANSLATIONS__[] = { - QT_TRANSLATE_NOOP("HttpServer", "File"), - QT_TRANSLATE_NOOP("HttpServer", "Edit"), - QT_TRANSLATE_NOOP("HttpServer", "Help"), - QT_TRANSLATE_NOOP("HttpServer", "Download Torrents from their URL or Magnet link"), - QT_TRANSLATE_NOOP("HttpServer", "Only one link per line"), - QT_TRANSLATE_NOOP("HttpServer", "Download local torrent"), - QT_TRANSLATE_NOOP("HttpServer", "Torrent files were correctly added to download list."), - QT_TRANSLATE_NOOP("HttpServer", "Point to torrent file"), - QT_TRANSLATE_NOOP("HttpServer", "Download"), - QT_TRANSLATE_NOOP("HttpServer", "Are you sure you want to delete the selected torrents from the transfer list and hard disk?"), - QT_TRANSLATE_NOOP("HttpServer", "Download rate limit must be greater than 0 or disabled."), - QT_TRANSLATE_NOOP("HttpServer", "Upload rate limit must be greater than 0 or disabled."), - QT_TRANSLATE_NOOP("HttpServer", "Maximum number of connections limit must be greater than 0 or disabled."), - QT_TRANSLATE_NOOP("HttpServer", "Maximum number of connections per torrent limit must be greater than 0 or disabled."), - QT_TRANSLATE_NOOP("HttpServer", "Maximum number of upload slots per torrent limit must be greater than 0 or disabled."), - QT_TRANSLATE_NOOP("HttpServer", "Unable to save program preferences, qBittorrent is probably unreachable."), - QT_TRANSLATE_NOOP("HttpServer", "Language"), - QT_TRANSLATE_NOOP("HttpServer", "The port used for incoming connections must be greater than 1024 and less than 65535."), - QT_TRANSLATE_NOOP("HttpServer", "The port used for the Web UI must be greater than 1024 and less than 65535."), - QT_TRANSLATE_NOOP("HttpServer", "The Web UI username must be at least 3 characters long."), - QT_TRANSLATE_NOOP("HttpServer", "The Web UI password must be at least 3 characters long."), - QT_TRANSLATE_NOOP("HttpServer", "Save"), - QT_TRANSLATE_NOOP("HttpServer", "qBittorrent client is not reachable"), - QT_TRANSLATE_NOOP("HttpServer", "HTTP Server"), - QT_TRANSLATE_NOOP("HttpServer", "The following parameters are supported:"), - QT_TRANSLATE_NOOP("HttpServer", "Torrent path"), - QT_TRANSLATE_NOOP("HttpServer", "Torrent name"), - QT_TRANSLATE_NOOP("HttpServer", "qBittorrent has been shutdown."), - QT_TRANSLATE_NOOP("HttpServer", "Unable to log in, qBittorrent is probably unreachable."), - QT_TRANSLATE_NOOP("HttpServer", "Invalid Username or Password."), - QT_TRANSLATE_NOOP("HttpServer", "Password"), - QT_TRANSLATE_NOOP("HttpServer", "Login"), - QT_TRANSLATE_NOOP("HttpServer", "qBittorrent web User Interface"), - QT_TRANSLATE_NOOP("HttpServer", "Upload Failed!") + QT_TRANSLATE_NOOP("HttpServer", "File"), + QT_TRANSLATE_NOOP("HttpServer", "Edit"), + QT_TRANSLATE_NOOP("HttpServer", "Help"), + QT_TRANSLATE_NOOP("HttpServer", "Download Torrents from their URL or Magnet link"), + QT_TRANSLATE_NOOP("HttpServer", "Only one link per line"), + QT_TRANSLATE_NOOP("HttpServer", "Download local torrent"), + QT_TRANSLATE_NOOP("HttpServer", "Torrent files were correctly added to download list."), + QT_TRANSLATE_NOOP("HttpServer", "Point to torrent file"), + QT_TRANSLATE_NOOP("HttpServer", "Download"), + QT_TRANSLATE_NOOP("HttpServer", "Are you sure you want to delete the selected torrents from the transfer list and hard disk?"), + QT_TRANSLATE_NOOP("HttpServer", "Download rate limit must be greater than 0 or disabled."), + QT_TRANSLATE_NOOP("HttpServer", "Upload rate limit must be greater than 0 or disabled."), + QT_TRANSLATE_NOOP("HttpServer", "Maximum number of connections limit must be greater than 0 or disabled."), + QT_TRANSLATE_NOOP("HttpServer", "Maximum number of connections per torrent limit must be greater than 0 or disabled."), + QT_TRANSLATE_NOOP("HttpServer", "Maximum number of upload slots per torrent limit must be greater than 0 or disabled."), + QT_TRANSLATE_NOOP("HttpServer", "Unable to save program preferences, qBittorrent is probably unreachable."), + QT_TRANSLATE_NOOP("HttpServer", "Language"), + QT_TRANSLATE_NOOP("HttpServer", "The port used for incoming connections must be greater than 1024 and less than 65535."), + QT_TRANSLATE_NOOP("HttpServer", "The port used for the Web UI must be greater than 1024 and less than 65535."), + QT_TRANSLATE_NOOP("HttpServer", "The Web UI username must be at least 3 characters long."), + QT_TRANSLATE_NOOP("HttpServer", "The Web UI password must be at least 3 characters long."), + QT_TRANSLATE_NOOP("HttpServer", "Save"), + QT_TRANSLATE_NOOP("HttpServer", "qBittorrent client is not reachable"), + QT_TRANSLATE_NOOP("HttpServer", "HTTP Server"), + QT_TRANSLATE_NOOP("HttpServer", "The following parameters are supported:"), + QT_TRANSLATE_NOOP("HttpServer", "Torrent path"), + QT_TRANSLATE_NOOP("HttpServer", "Torrent name"), + QT_TRANSLATE_NOOP("HttpServer", "qBittorrent has been shutdown."), + QT_TRANSLATE_NOOP("HttpServer", "Unable to log in, qBittorrent is probably unreachable."), + QT_TRANSLATE_NOOP("HttpServer", "Invalid Username or Password."), + QT_TRANSLATE_NOOP("HttpServer", "Password"), + QT_TRANSLATE_NOOP("HttpServer", "Login"), + QT_TRANSLATE_NOOP("HttpServer", "qBittorrent web User Interface"), + QT_TRANSLATE_NOOP("HttpServer", "Upload Failed!") }; static const struct { const char *source; const char *comment; } __COMMENTED_TRANSLATIONS__[] = { - QT_TRANSLATE_NOOP3("HttpServer", "Downloaded", "Is the file downloaded or not?") + QT_TRANSLATE_NOOP3("HttpServer", "Downloaded", "Is the file downloaded or not?") }; #endif // EXTRA_TRANSLATIONS_H

vnHjD$e!1ZlhBD(-&br!A@mXT8 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