/*! @file @id $Id$ */ // 1 2 3 4 5 6 7 8 // 45678901234567890123456789012345678901234567890123456789012345678901234567890 #ifndef __SAVEORRUN_HXX__ #define __SAVEORRUN_HXX__ #include #include #include #include #include #include #include #include #include #include #include #include #include //! @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:"<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<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" <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