1
mirror of https://invent.kde.org/network/falkon.git synced 2024-11-11 01:22:10 +01:00

Hopefully fixed one crash and one possible crash in download manager

This commit is contained in:
nowrep 2011-09-30 19:22:50 +02:00
parent d699f4b32b
commit 8e29818bb3
14 changed files with 282 additions and 270 deletions

Binary file not shown.

View File

@ -134,7 +134,8 @@ SOURCES += main.cpp\
preferences/thememanager.cpp \
network/qupzillaschemehandler.cpp \
tools/globalfunctions.cpp \
other/pagescreen.cpp
other/pagescreen.cpp \
downloads/downloadfilehelper.cpp
HEADERS += \
3rdparty/qtwin.h \
@ -229,7 +230,8 @@ HEADERS += \
preferences/thememanager.h \
network/qupzillaschemehandler.h \
tools/globalfunctions.h \
other/pagescreen.h
other/pagescreen.h \
downloads/downloadfilehelper.h
FORMS += \
preferences/autofillmanager.ui \
@ -294,3 +296,5 @@ win32:LIBS += User32.lib Ole32.lib Shell32.lib ShlWapi.lib Gdi32.lib ComCtl32.li

View File

@ -1,46 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="en-us" />
<title>CSS Rounded Corners + Liquid + Images</title>
<meta name="description" content="css rounded corners" />
<meta name="keywords" content="Search Engine Optimization,Internet Marketing,Website Promotion,SEO,SEO Articles,Web Site Promotion,Search Engine Marketing" />
<style type="text/css">
.cssbox, .cssbox_body, .cssbox_head, .cssbox_head h2{
background: transparent url(box-border.png) no-repeat bottom right}
.cssbox{
width:335px !important;
width: 320px;
padding-right:15px;
margin:20px auto}
.cssbox_head{background-position:top right;
margin-right:-15px;
padding-right:40px}
.cssbox_head h2{
background-position:top left;
margin:0;
border:0;
padding:25px 0 15px 40px;
height:auto !important;}
.cssbox_body{
background-position:bottom left;
margin-right:25px;
padding:15px 0 15px 40px}
</style>
</head>
<body>
<div class="cssbox">
<div class="cssbox_head">
<h2>This is a header</h2>
</div>
<div class="cssbox_body">
<p>This is for your content.</p>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,190 @@
#include "downloadfilehelper.h"
#include "webpage.h"
#include "webview.h"
#include "downloadoptionsdialog.h"
#include "mainapplication.h"
#include "qupzilla.h"
#include "downloaditem.h"
#include "downloadmanager.h"
DownloadFileHelper::DownloadFileHelper(const QString &lastDownloadPath, const QString &downloadPath, bool useNativeDialog)
: QObject()
, m_lastDownloadPath(lastDownloadPath)
, m_downloadPath(downloadPath)
, m_useNativeDialog(useNativeDialog)
, m_reply(0)
, m_openFileChoosed(false)
, m_iconProvider(new QFileIconProvider)
{
}
//////////////////////////////////////////////////////
//// Getting where to download requested file
//// in 3 functions, as we are using non blocking
//// dialogs ( this is important to make secure downloading
//// on windows working properly )
//////////////////////////////////////////////////////
void DownloadFileHelper::handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo)
{
m_timer = new QTime();
m_timer->start();
m_h_fileName = getFileName(reply);
m_reply = reply;
QFileInfo info(reply->url().toString());
QTemporaryFile tempFile("XXXXXX."+info.suffix());
tempFile.open();
QFileInfo tempInfo(tempFile.fileName());
m_fileIcon = m_iconProvider->icon(tempInfo).pixmap(30,30);
QString mimeType = m_iconProvider->type(tempInfo);
//Get Download Page and Close Empty Tab
QNetworkRequest request = m_reply->request();
QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100));
WebPage* webPage = (WebPage*)(v.value<void*>());
if (webPage) {
if (!webPage->mainFrame()->url().isEmpty())
m_downloadPage = webPage->mainFrame()->url();
else if (webPage->history()->canGoBack())
m_downloadPage = webPage->history()->backItem().url();
else if (webPage->history()->count() == 0)
webPage->getView()->closeTab();
}
if (askWhatToDo) {
DownloadOptionsDialog* dialog = new DownloadOptionsDialog(m_h_fileName, m_fileIcon, mimeType, reply->url(), mApp->activeWindow());
dialog->show();
connect(dialog, SIGNAL(dialogFinished(int)), this, SLOT(optionsDialogAccepted(int)));
} else
optionsDialogAccepted(2);
}
void DownloadFileHelper::optionsDialogAccepted(int finish)
{
m_openFileChoosed = false;
switch (finish) {
case 0: //Cancelled
if (m_timer)
delete m_timer;
return;
break;
case 1: //Open
m_openFileChoosed = true;
break;
case 2: //Save
break;
}
if (!m_openFileChoosed) {
if (m_downloadPath.isEmpty()) {
if (m_useNativeDialog) {
fileNameChoosed(QFileDialog::getSaveFileName(mApp->getWindow(), tr("Save file as..."), m_lastDownloadPath + m_h_fileName));
} else {
QFileDialog* dialog = new QFileDialog(mApp->getWindow());
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowTitle(tr("Save file as..."));
dialog->setDirectory(m_lastDownloadPath);
dialog->selectFile(m_h_fileName);
dialog->show();
connect(dialog, SIGNAL(fileSelected(QString)), this, SLOT(fileNameChoosed(QString)));
}
}
else
fileNameChoosed(m_downloadPath + m_h_fileName, true);
} else
fileNameChoosed(QDir::tempPath() + "/" + m_h_fileName, true);
}
void DownloadFileHelper::fileNameChoosed(const QString &name, bool fileNameAutoGenerated)
{
m_userFileName = name;
if (m_userFileName.isEmpty()) {
m_reply->abort();
if (m_timer)
delete m_timer;
return;
}
int pos = m_userFileName.lastIndexOf("/");
if (pos != -1) {
int size = m_userFileName.size();
m_path = m_userFileName.left(pos+1);
m_fileName = m_userFileName.right(size-pos-1);
}
if (fileNameAutoGenerated && QFile::exists(m_userFileName)) {
QString _tmpFileName = m_fileName;
int i = 1;
while (QFile::exists(m_path + "/" + _tmpFileName)) {
_tmpFileName = m_fileName;
int index = _tmpFileName.lastIndexOf(".");
if (index == -1) {
_tmpFileName.append("("+QString::number(i)+")");
} else {
_tmpFileName = _tmpFileName.mid(0, index) + "("+QString::number(i)+")" + _tmpFileName.mid(index);
}
i++;
}
m_fileName = _tmpFileName;
}
if (!m_path.contains(QDir::tempPath()))
m_lastDownloadPath = m_path;
QSettings settings(mApp->getActiveProfilPath()+"settings.ini", QSettings::IniFormat);
settings.beginGroup("DownloadManager");
settings.setValue("lastDownloadPath", m_lastDownloadPath);
settings.endGroup();
QListWidgetItem* item = new QListWidgetItem(m_listWidget);
DownloadItem* downItem = new DownloadItem(item, m_reply, m_path, m_fileName, m_fileIcon, m_timer, m_openFileChoosed, m_downloadPage);
emit itemCreated(item, downItem);
}
//////////////////////////////////////////////////////
//// End here
//////////////////////////////////////////////////////
QString DownloadFileHelper::getFileName(QNetworkReply* reply)
{
QString path;
if (reply->hasRawHeader("Content-Disposition")) {
QString value = reply->rawHeader("Content-Disposition");
int pos = value.indexOf("filename=");
if (pos!=-1) {
QString name = value.mid(pos + 9);
if (name.startsWith('"') && name.endsWith('"'))
name = name.mid(1, name.size() - 2);
path = name;
}
}
if (path.isEmpty())
path = reply->url().path();
QFileInfo info(path);
QString baseName = info.completeBaseName();
QString endName = info.suffix();
if (baseName.isEmpty()) {
baseName = tr("NoNameDownload");
}
if (!endName.isEmpty())
endName="."+endName;
QString name = baseName+endName;
if (name.startsWith("\""))
name = name.mid(1);
if (name.endsWith("\";"))
name.remove("\";");
return name;
}
DownloadFileHelper::~DownloadFileHelper()
{
delete m_iconProvider;
}

View File

@ -0,0 +1,54 @@
#ifndef DOWNLOADFILEHELPER_H
#define DOWNLOADFILEHELPER_H
#include <QObject>
#include <QTime>
#include <QNetworkReply>
#include <QPixmap>
#include <QListWidget>
#include <QFileInfo>
#include <QTemporaryFile>
#include <QFileIconProvider>
#include <QFileDialog>
class DownloadItem;
class DownloadFileHelper : public QObject
{
Q_OBJECT
public:
explicit DownloadFileHelper(const QString &lastDownloadPath, const QString &downloadPath, bool useNativeDialog);
~DownloadFileHelper();
void setListWidget(QListWidget* tw) { m_listWidget = tw; }
void handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo);
signals:
void itemCreated(QListWidgetItem* item, DownloadItem* downItem);
private slots:
void optionsDialogAccepted(int finish);
void fileNameChoosed(const QString &name, bool fileNameAutoGenerated = false);
private:
QString getFileName(QNetworkReply* reply);
QString m_lastDownloadPath;
QString m_downloadPath;
bool m_useNativeDialog;
QTime* m_timer;
QString m_path;
QString m_fileName;
QString m_userFileName;
QString m_h_fileName;
QNetworkReply* m_reply;
QPixmap m_fileIcon;
QUrl m_downloadPage;
bool m_openFileChoosed;
QListWidget* m_listWidget;
QFileIconProvider* m_iconProvider;
};
#endif // DOWNLOADFILEHELPER_H

View File

@ -25,18 +25,18 @@
//#define DOWNMANAGER_DEBUG
DownloadItem::DownloadItem(QListWidgetItem* item, QNetworkReply* reply, QString path, QString fileName, QPixmap fileIcon, QTime* timer, bool openAfterFinishedDownload, QWidget* parent)
: QWidget(parent)
,ui(new Ui::DownloadItem)
,m_item(item)
,m_reply(reply)
,m_path(path)
,m_fileName(fileName)
,m_downTimer(timer)
,m_downUrl(reply->url())
,m_downloadPage(QUrl())
,m_downloading(false)
,m_openAfterFinish(openAfterFinishedDownload)
DownloadItem::DownloadItem(QListWidgetItem* item, QNetworkReply* reply, const QString &path, const QString &fileName, const QPixmap &fileIcon, QTime* timer, bool openAfterFinishedDownload, const QUrl &downloadPage)
: QWidget()
, ui(new Ui::DownloadItem)
, m_item(item)
, m_reply(reply)
, m_path(path)
, m_fileName(fileName)
, m_downTimer(timer)
, m_downUrl(reply->url())
, m_downloadPage(downloadPage)
, m_downloading(false)
, m_openAfterFinish(openAfterFinishedDownload)
{
#ifdef DOWNMANAGER_DEBUG
qDebug() << __FUNCTION__ << item << reply << path << fileName;
@ -85,19 +85,6 @@ DownloadItem::DownloadItem(QListWidgetItem* item, QNetworkReply* reply, QString
error(m_reply->error());
}
show();
//Get Download Page
QNetworkRequest request = m_reply->request();
QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100));
WebPage* webPage = (WebPage*)(v.value<void*>());
if (webPage) {
if (!webPage->mainFrame()->url().isEmpty())
m_downloadPage = webPage->mainFrame()->url();
else if (webPage->history()->canGoBack())
m_downloadPage = webPage->history()->backItem().url();
// else if (webPage->history()->count() == 0)
// webPage->getView()->closeTab();
}
}
void DownloadItem::parentResized(const QSize &size)

View File

@ -42,7 +42,7 @@ class DownloadItem : public QWidget
Q_OBJECT
public:
explicit DownloadItem(QListWidgetItem* item, QNetworkReply* reply, QString path, QString fileName, QPixmap fileIcon, QTime* timer, bool openAfterFinishedDownload, QWidget* parent = 0);
explicit DownloadItem(QListWidgetItem* item, QNetworkReply* reply, const QString &path, const QString &fileName, const QPixmap &fileIcon, QTime* timer, bool openAfterFinishedDownload, const QUrl &downloadPage);
bool isDownloading() { return m_downloading; }
bool isCancelled();
QTime remainingTime() { return m_remTime; }

View File

@ -26,6 +26,7 @@
#include "desktopnotificationsfactory.h"
#include "globalfunctions.h"
#include "webpage.h"
#include "downloadfilehelper.h"
DownloadManager::DownloadManager(QWidget* parent) :
QWidget(parent)
@ -41,7 +42,6 @@ DownloadManager::DownloadManager(QWidget* parent) :
ui->clearButton->setIcon(QIcon::fromTheme("edit-clear"));
qz_centerWidgetOnScreen(this);
m_iconProvider = new QFileIconProvider();
m_networkManager = mApp->networkManager();
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clearList()));
@ -154,140 +154,27 @@ void DownloadManager::download(const QNetworkRequest &request, bool askWhatToDo)
handleUnsupportedContent(m_networkManager->get(request), askWhatToDo);
}
//////////////////////////////////////////////////////
//// Getting where to download requested file
//// in 3 functions, as we are using non blocking
//// dialogs ( this is important to make secured downloading
//// on windows working properly )
//////////////////////////////////////////////////////
void DownloadManager::handleUnsupportedContent(QNetworkReply* reply, bool askWhatToDo)
{
m_htimer = new QTime();
m_htimer->start();
m_h_fileName = getFileName(reply);
m_hreply = reply;
DownloadFileHelper* h = new DownloadFileHelper(m_lastDownloadPath, m_downloadPath, m_useNativeDialog);
h->setListWidget(ui->list);
h->handleUnsupportedContent(reply, askWhatToDo);
QFileInfo info(reply->url().toString());
QTemporaryFile tempFile("XXXXXX."+info.suffix());
tempFile.open();
QFileInfo tempInfo(tempFile.fileName());
m_hfileIcon = m_iconProvider->icon(tempInfo).pixmap(30,30);
QString mimeType = m_iconProvider->type(tempInfo);
//Get Download Page and Close Empty Tab
QNetworkRequest request = m_hreply->request();
QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100));
WebPage* webPage = (WebPage*)(v.value<void*>());
if (webPage && webPage->mainFrame()->url().isEmpty() && !webPage->history()->canGoBack() && webPage->history()->count() == 0)
webPage->getView()->closeTab();
if (askWhatToDo) {
DownloadOptionsDialog* dialog = new DownloadOptionsDialog(m_h_fileName, m_hfileIcon, mimeType, reply->url(), mApp->activeWindow());
dialog->show();
connect(dialog, SIGNAL(dialogFinished(int)), this, SLOT(optionsDialogAccepted(int)));
} else
optionsDialogAccepted(2);
connect(h, SIGNAL(itemCreated(QListWidgetItem*,DownloadItem*)), this, SLOT(itemCreated(QListWidgetItem*,DownloadItem*)));
}
void DownloadManager::optionsDialogAccepted(int finish)
void DownloadManager::itemCreated(QListWidgetItem *item, DownloadItem *downItem)
{
m_hOpenFileChoosed = false;
switch (finish) {
case 0: //Cancelled
if (m_htimer)
delete m_htimer;
return;
break;
case 1: //Open
m_hOpenFileChoosed = true;
break;
case 2: //Save
break;
}
if (!m_hOpenFileChoosed) {
if (m_downloadPath.isEmpty()) {
if (m_useNativeDialog) {
fileNameChoosed(QFileDialog::getSaveFileName(mApp->getWindow(), tr("Save file as..."), m_lastDownloadPath + m_h_fileName));
} else {
QFileDialog* dialog = new QFileDialog(mApp->getWindow());
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setWindowTitle(tr("Save file as..."));
dialog->setDirectory(m_lastDownloadPath);
dialog->selectFile(m_h_fileName);
dialog->show();
connect(dialog, SIGNAL(fileSelected(QString)), this, SLOT(fileNameChoosed(QString)));
}
}
else
fileNameChoosed(m_downloadPath + m_h_fileName, true);
} else
fileNameChoosed(QDir::tempPath() + "/" + m_h_fileName, true);
}
void DownloadManager::fileNameChoosed(const QString &name, bool fileNameAutoGenerated)
{
m_huserFileName = name;
if (m_huserFileName.isEmpty()) {
m_hreply->abort();
if (m_htimer)
delete m_htimer;
return;
}
int pos = m_huserFileName.lastIndexOf("/");
if (pos != -1) {
int size = m_huserFileName.size();
m_hpath = m_huserFileName.left(pos+1);
m_hfileName = m_huserFileName.right(size-pos-1);
}
if (fileNameAutoGenerated && QFile::exists(m_huserFileName)) {
QString _tmpFileName = m_hfileName;
int i = 1;
while (QFile::exists(m_hpath + "/" + _tmpFileName)) {
_tmpFileName = m_hfileName;
int index = _tmpFileName.lastIndexOf(".");
if (index == -1) {
_tmpFileName.append("("+QString::number(i)+")");
} else {
_tmpFileName = _tmpFileName.mid(0, index) + "("+QString::number(i)+")" + _tmpFileName.mid(index);
}
i++;
}
m_hfileName = _tmpFileName;
}
if (!m_hpath.contains(QDir::tempPath()))
m_lastDownloadPath = m_hpath;
QSettings settings(mApp->getActiveProfilPath()+"settings.ini", QSettings::IniFormat);
settings.beginGroup("DownloadManager");
settings.setValue("lastDownloadPath",m_lastDownloadPath);
settings.endGroup();
QListWidgetItem* item = new QListWidgetItem(ui->list);
DownloadItem* downItem = new DownloadItem(item, m_hreply, m_hpath, m_hfileName, m_hfileIcon, m_htimer, m_hOpenFileChoosed, this);
downItem->setParent(this);
connect(downItem, SIGNAL(deleteItem(DownloadItem*)), this, SLOT(deleteItem(DownloadItem*)));
connect(downItem, SIGNAL(downloadFinished(bool)), this, SLOT(downloadFinished(bool)));
ui->list->setItemWidget(item, downItem);
item->setSizeHint(downItem->sizeHint());
show();
activateWindow();
//Negating all used variables
m_hpath.clear();
m_hfileName.clear();
m_huserFileName.clear();
m_h_fileName.clear();
m_hreply = 0;
m_hfileIcon = QPixmap();
m_hOpenFileChoosed = false;
}
//////////////////////////////////////////////////////
//// End here
//////////////////////////////////////////////////////
void DownloadManager::downloadFinished(bool success)
{
@ -322,42 +209,6 @@ void DownloadManager::deleteItem(DownloadItem* item)
delete item;
}
QString DownloadManager::getFileName(QNetworkReply* reply)
{
QString path;
if (reply->hasRawHeader("Content-Disposition")) {
QString value = reply->rawHeader("Content-Disposition");
int pos = value.indexOf("filename=");
if (pos!=-1) {
QString name = value.mid(pos + 9);
if (name.startsWith('"') && name.endsWith('"'))
name = name.mid(1, name.size() - 2);
path = name;
}
}
if (path.isEmpty())
path = reply->url().path();
QFileInfo info(path);
QString baseName = info.completeBaseName();
QString endName = info.suffix();
if (baseName.isEmpty()) {
baseName = tr("NoNameDownload");
}
if (!endName.isEmpty())
endName="."+endName;
QString name = baseName+endName;
if (name.startsWith("\""))
name = name.mid(1);
if (name.endsWith("\";"))
name.remove("\";");
return name;
}
bool DownloadManager::canClose()
{
if (m_isClosing)
@ -398,5 +249,4 @@ DownloadManager::~DownloadManager()
{
delete ui;
delete m_networkManager;
delete m_iconProvider;
}

View File

@ -20,13 +20,10 @@
#include <QDialog>
#include <QLabel>
#include <QFileIconProvider>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QDebug>
#include <QFileDialog>
#include <QFile>
#include <QTime>
#include <QDateTime>
#include <QDesktopServices>
#include <QCloseEvent>
@ -34,6 +31,7 @@
#include <QSettings>
#include <QTimer>
#include <QNetworkReply>
#include <QListWidgetItem>
#include "ecwin7.h"
@ -68,12 +66,10 @@ protected:
private slots:
void clearList();
void deleteItem(DownloadItem* item);
void itemCreated(QListWidgetItem* item, DownloadItem* downItem);
void downloadFinished(bool success);
void optionsDialogAccepted(int finish);
void fileNameChoosed(const QString &name, bool fileNameAutoGenerated = false);
signals:
void resized(QSize);
@ -82,31 +78,17 @@ private:
EcWin7 win7;
#endif
void timerEvent(QTimerEvent* event);
QString getFileName(QNetworkReply* reply);
void closeEvent(QCloseEvent* e);
void resizeEvent(QResizeEvent *e);
Ui::DownloadManager* ui;
NetworkManager* m_networkManager;
QFileIconProvider* m_iconProvider;
QBasicTimer m_timer;
QString m_lastDownloadPath;
QString m_downloadPath;
bool m_useNativeDialog;
QBasicTimer m_timer;
bool m_isClosing;
// Variables used by HandleUnsupportContent:
QTime* m_htimer;
QString m_hpath;
QString m_hfileName;
QString m_huserFileName;
QString m_h_fileName;
QNetworkReply* m_hreply;
QPixmap m_hfileIcon;
bool m_hOpenFileChoosed;
};
#endif // DOWNLOADMANAGER_H

View File

@ -23,18 +23,9 @@
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<property name="margin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<widget class="QListWidget" name="list">
<property name="horizontalScrollBarPolicy">

View File

@ -18,7 +18,7 @@
#include "downloadoptionsdialog.h"
#include "ui_downloadoptionsdialog.h"
DownloadOptionsDialog::DownloadOptionsDialog(QString fileName, QPixmap fileIcon, QString mimeType, QUrl url, QWidget *parent)
DownloadOptionsDialog::DownloadOptionsDialog(const QString &fileName, const QPixmap &fileIcon, const QString &mimeType, const QUrl &url, QWidget* parent)
: QDialog(parent)
, ui(new Ui::DownloadOptionsDialog)
{

View File

@ -31,7 +31,7 @@ class DownloadOptionsDialog : public QDialog
Q_OBJECT
public:
explicit DownloadOptionsDialog(QString fileName, QPixmap fileIcon, QString mimeType, QUrl url, QWidget* parent = 0);
explicit DownloadOptionsDialog(const QString &fileName, const QPixmap &fileIcon, const QString &mimeType, const QUrl &url, QWidget* parent = 0);
~DownloadOptionsDialog();
private slots:

View File

@ -1035,7 +1035,7 @@ nebyl nalezen!</translation>
<translation>Správce stahování</translation>
</message>
<message>
<location filename="../src/downloads/downloadmanager.ui" line="82"/>
<location filename="../src/downloads/downloadmanager.ui" line="73"/>
<source>Clear</source>
<translation>Vyčistit</translation>
</message>

View File

@ -1038,7 +1038,7 @@ p, li { white-space: pre-wrap; }
<translation>Správca sťahovania</translation>
</message>
<message>
<location filename="../src/downloads/downloadmanager.ui" line="82"/>
<location filename="../src/downloads/downloadmanager.ui" line="73"/>
<source>Clear</source>
<translation>Vyčistiť</translation>
</message>
@ -1063,7 +1063,7 @@ p, li { white-space: pre-wrap; }
<message>
<location filename="../src/downloads/downloadoptionsdialog.ui" line="107"/>
<source>What should QupZilla do with this file?</source>
<translation type="unfinished"></translation>
<translation>Čo by mala QupZilla urobiť s tímto súborom?</translation>
</message>
<message>
<location filename="../src/downloads/downloadoptionsdialog.ui" line="32"/>