You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
8.2 KiB
282 lines
8.2 KiB
/*! @file |
|
|
|
@id $Id$ |
|
*/ |
|
// 1 2 3 4 5 6 7 8 |
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
|
|
|
#ifndef __SAVEORRUN_HXX__ |
|
#define __SAVEORRUN_HXX__ |
|
|
|
#include <qbrowserlib/log.hxx> |
|
#include <qbrowserlib/ui_saveorrun.hxx> |
|
#include <qbrowserlib/executor.hxx> |
|
|
|
#include <QtCore/QUrl> |
|
#include <QtNetwork/QNetworkReply> |
|
#include <QDialog> |
|
#include <QFileDialog> |
|
#include <QFileSystemModel> |
|
#include <QDialogButtonBox> |
|
#include <QMessageBox> |
|
#include <QDesktopServices> |
|
#include <memory> |
|
|
|
#include <cassert> |
|
|
|
//! @addtogroup qbrowserlib |
|
//! @{ |
|
|
|
namespace qbrowserlib { |
|
|
|
//! Ask User for Saving or Opening a Download |
|
class SaveOrRun: public QWidget, public Ui::SaveOrRun { |
|
Q_OBJECT; |
|
|
|
Q_SIGNALS: |
|
|
|
void accept(); |
|
|
|
public: |
|
|
|
SaveOrRun(QNetworkReply* reply, QString type, QString src, QWidget* p=0): |
|
QWidget(p), _reply(reply) { |
|
TRC; |
|
setupUi(this); |
|
QString obj(remoteFilename()); |
|
_rememberPath->setVisible(false); |
|
_rememberTool->setVisible(false); |
|
// _program->setText(QDesktopServices::storageLocation |
|
// (QDesktopServices::ApplicationsLocation)); |
|
delete _openInExternalApplication; _openInExternalApplication = 0; |
|
_object->setText(obj); |
|
_type->setText(type); |
|
_source->setText(src); |
|
_filename->setText(savePath()+QDir::separator()+obj); |
|
} |
|
|
|
//! Run configured application if mime type is preconfigured. |
|
bool handlePreconfigured() { |
|
TRC; |
|
QString filename(remoteFilename()); |
|
QStringList type |
|
(qbrowserlib::Settings::instance().mimetype |
|
(_reply->header(QNetworkRequest::ContentTypeHeader).toString(), |
|
filename)); |
|
if (!type.isEmpty()) { |
|
LOG<<"Start Application"; |
|
hide(); |
|
filename.replace(QRegExp("^(.*)\\."+type.at(0)+"$"), |
|
"\\1"); // remove extension |
|
assert(connect(&qbrowserlib::Executor::instance(), |
|
SIGNAL(applicationStarted()), |
|
SIGNAL(accept()))); |
|
qbrowserlib::Executor::instance().run |
|
(_reply, filename+"."+type.at(0), type.at(1)); |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
QString remoteFilename() { |
|
TRC; |
|
QString filename |
|
(QString::fromUtf8(_reply->rawHeader("Content-Disposition"))); |
|
if (filename.contains |
|
(QRegExp("^\\s*attachment\\s*;\\s*filename\\s*=\\s*\"[^\"]+\""))) { |
|
LOG<<"From Content-Disposition"; |
|
filename = filename.replace |
|
(QRegExp("^\\s*attachment\\s*;\\s*filename\\s*=\\s*\"([^\"]+)\".*"), |
|
"\\1"); |
|
} else { |
|
LOG<<"From path"; |
|
filename = |
|
QFileInfo(!_reply->url().toLocalFile().isEmpty() |
|
?_reply->url().toLocalFile() |
|
:_reply->url().path()).fileName(); |
|
} |
|
LOG<<"Filename:"<<filename; |
|
return filename; |
|
} |
|
|
|
QString filename() { |
|
TRC; |
|
return _filename->text(); |
|
} |
|
|
|
QString program() { |
|
TRC; |
|
return QString(); |
|
// return _program->text(); |
|
} |
|
|
|
public Q_SLOTS: |
|
|
|
void save() { |
|
TRC; |
|
QFile file(filename()); |
|
file.open(QIODevice::WriteOnly); |
|
file.write(_reply->readAll()); |
|
file.close(); |
|
accept(); |
|
} |
|
|
|
void open() { |
|
TRC; |
|
QFile file(filename()); |
|
file.open(QIODevice::WriteOnly); |
|
file.write(_reply->readAll()); |
|
file.close(); |
|
QDesktopServices::openUrl(QUrl::fromLocalFile(file.fileName())); |
|
accept(); |
|
} |
|
|
|
void run() { |
|
TRC; LOG<<program()<<filename(); |
|
qbrowserlib::Executor::instance().run |
|
(_reply, filename(), program()+" %1"); |
|
accept(); |
|
} |
|
|
|
protected Q_SLOTS: |
|
|
|
void on__saveFileAs_clicked(bool=true) { |
|
TRC; |
|
if (QFileInfo(filename()).exists() |
|
&& QMessageBox::question(this, tr("File Exists"), |
|
tr("File already exists:\n\n" |
|
"%1\n\n" |
|
"Overwrite?").arg(filename()), |
|
QMessageBox::Yes|QMessageBox::No) |
|
== QMessageBox::No) return; |
|
save(); |
|
} |
|
|
|
void on__openFolder_clicked(bool=true) { |
|
TRC; |
|
if (QFileInfo(filename()).exists() |
|
&& QMessageBox::question(this, tr("File Exists"), |
|
tr("File already exists:\n\n" |
|
"%1\n\n" |
|
"Overwrite?").arg(filename()), |
|
QMessageBox::Yes|QMessageBox::No) |
|
== QMessageBox::No) return; |
|
open(); |
|
} |
|
|
|
void on__openFileIn_clicked(bool=true) { |
|
TRC; |
|
if (!QFile::exists(program()) |
|
|| !QFileInfo(program()).isExecutable()) { |
|
QMessageBox::warning(this, tr("No Program"), |
|
tr("Not an executable Program:\n\n" |
|
"%1\n\n" |
|
"Specify full path to executable program") |
|
.arg(program())); |
|
return; |
|
} |
|
run(); |
|
} |
|
|
|
void on__browseSaveAs_clicked(bool) { |
|
TRC; |
|
QString saveFile |
|
(QFileDialog::getSaveFileName(this, tr("Save File As ..."), |
|
_filename->text(), QString(), 0, |
|
QFileDialog::DontConfirmOverwrite)); |
|
if (!saveFile.size()) return; |
|
if (QFileInfo(saveFile).isDir()) |
|
saveFile += QDir::separator()+_object->text(); |
|
_filename->setText(saveFile); |
|
on__saveFileAs_clicked(); |
|
} |
|
|
|
void on__browseOpenWith_clicked(bool) { |
|
TRC; |
|
QString openFile |
|
(QFileDialog::getOpenFileName(this, tr("Open File With ..."), |
|
program())); |
|
if (!openFile.size()) return; |
|
// _program->setText(openFile); |
|
on__openFileIn_clicked(); |
|
} |
|
|
|
QString savePath() { |
|
TRC; |
|
QString path(QDir::homePath()); |
|
QStringList defpaths; |
|
defpaths<<"downloads"<<"Downloads"<<"Documents" |
|
<<tr("Dokumente", "Documents folder in local language") |
|
<<"Desktop" |
|
<<tr("Arbeitsfläche", "Desktop folder in local language"); |
|
for (QStringList::iterator it(defpaths.begin()); it!=defpaths.end(); ++it) |
|
if (QFile::exists(QDir::homePath()+QDir::separator()+*it)) { |
|
path = QDir::homePath()+QDir::separator()+*it; |
|
break; |
|
} |
|
return path; |
|
} |
|
|
|
private: |
|
|
|
friend class SaveOrRunDialog; |
|
QNetworkReply* _reply; |
|
}; |
|
|
|
class SaveOrRunPlugin: public SaveOrRun { |
|
Q_OBJECT; |
|
|
|
public: |
|
|
|
SaveOrRunPlugin(QNetworkReply* reply, |
|
const QUrl& url, const QString& mime, |
|
bool kiosk=false, QWidget* p=0): |
|
SaveOrRun(reply, mime, url.toString(), p) { |
|
TRC; |
|
setAutoFillBackground(true); |
|
_type->setText(mime); |
|
_source->setText(url.host()); |
|
assert(connect(this, SIGNAL(accept()), SLOT(hide()))); |
|
} |
|
|
|
protected Q_SLOTS: |
|
|
|
void hide() { |
|
_stack->setCurrentIndex(1); |
|
} |
|
|
|
}; |
|
|
|
class SaveOrRunDialog: public QDialog { |
|
Q_OBJECT; |
|
|
|
public: |
|
|
|
SaveOrRunDialog(QNetworkReply* reply, QString type, QString src, |
|
bool kiosk=false, QWidget* p=0): |
|
QDialog(p), _sor(new SaveOrRun(reply, type, src)) { |
|
TRC; |
|
setWindowTitle(tr("Unknown File Type")); |
|
QVBoxLayout* l(new QVBoxLayout(this)); |
|
l->addWidget(_sor); |
|
l->addWidget(_buttons = new QDialogButtonBox(QDialogButtonBox::Cancel)); |
|
assert(connect(_sor, SIGNAL(accept()), SLOT(accept()))); |
|
assert(connect(_buttons, SIGNAL(rejected()), SLOT(reject()))); |
|
} |
|
|
|
bool handlePreconfigured() { |
|
return _sor->handlePreconfigured(); |
|
} |
|
|
|
protected: |
|
|
|
SaveOrRun* _sor; |
|
QDialogButtonBox* _buttons; |
|
|
|
}; |
|
|
|
} |
|
|
|
//! @} |
|
|
|
#endif
|
|
|