/* * Copyright (C) 2010 Ixonos Plc. * * This file is part of fosdem-schedule. * * fosdem-schedule 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. * * fosdem-schedule 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 * fosdem-schedule. If not, see . */ #include "importschedulewidget.h" #include #include #include #include #include #include #include #include #include #include // TODO: this is temporary #include #include "conference.h" #include "errormessage.h" // const QString SCHEDULE_URL = "http://fosdem.org/2010/schedule/xml"; const QString PROXY_USERNAME; const QString PROXY_PASSWD; ImportScheduleWidget::ImportScheduleWidget(QWidget *aParent) : QWidget(aParent) { setupUi(this); mXmlParser = new ScheduleXmlParser(this); connect(mXmlParser, SIGNAL(progressStatus(int)), SLOT(showParsingProgress(int))); connect(mXmlParser, SIGNAL(parsingSchedule(const QString &)), SLOT(parsingSchedule(const QString &))); connect(browse, SIGNAL(clicked()), SLOT(browseSchedule())); progressBar->hide(); cancel->hide(); connect(online, SIGNAL(clicked()), SLOT(downloadSchedule())); connect(changeUrl, SIGNAL(clicked()), SLOT(on_changeUrl())); connect(newConfFromUrl, SIGNAL(clicked()), SLOT(on_newFromUrl())); connect(delConf, SIGNAL(clicked()), SLOT(on_delete())); mNetworkAccessManager = new QNetworkAccessManager(this); connect(mNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkQueryFinished(QNetworkReply*))); mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy()); } ImportScheduleWidget::~ImportScheduleWidget() { if(mXmlParser) { delete mXmlParser; mXmlParser = NULL; } if(mNetworkAccessManager) { delete mNetworkAccessManager; mNetworkAccessManager = NULL; } } void ImportScheduleWidget::parsingSchedule(const QString &aTitle) { importScheduleLabel->setText("Importing: " + aTitle); } void ImportScheduleWidget::showParsingProgress(int progress) { progressBar->setValue(progress); } void ImportScheduleWidget::browseSchedule() { QString scheduleFileName = QFileDialog::getOpenFileName(this, tr("Select Conference Schedule"), QDir::homePath(), tr("Schedule Files (*.xml)")); if(QFile::exists(scheduleFileName)) { QFile file(scheduleFileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "can't open " << file.fileName(); return; } importData(file.readAll(), QString()); } else { progressBar->hide(); } } void ImportScheduleWidget::networkQueryFinished(QNetworkReply *aReply) { if ( aReply->error() != QNetworkReply::NoError ) { error_message(QString("Error occured during download: ") + aReply->errorString()); } else { importData(aReply->readAll(), aReply->url().toEncoded()); } } void ImportScheduleWidget::downloadSchedule() { // TODO: make a nicer GUI // basically, you have to do the following things: // 1. store schedule URL for each conteferce // 2. allow refreshing of the current conference schedule with "1 button click" // 3. allow changing of the URL for a conference; // run refresh together with it is ok and even justified by usability, // but it must not loose this change if refresh not available. // So it cannot be done as "do like #4 and rely on REPLACE". // 4. allow getting the new conference by URL // FIXME: it will throw // GUI should not show this button if there is no active conf importFromNetwork(Conference::getById(Conference::activeConference()).getUrl()); } void ImportScheduleWidget::on_changeUrl() { // FIXME: it will throw // GUI should not show this button if there is no active conf Conference active_conference = Conference::getById(Conference::activeConference()); bool ok = false; QString new_url = QInputDialog::getText(this, "URL request", "Enter the new URL for conference schedule" , QLineEdit::Normal , active_conference.getUrl() , &ok); if (ok) { active_conference.setUrl(new_url); } } void ImportScheduleWidget::on_newFromUrl() { bool ok = false; QString url = QInputDialog::getText(this, "URL request", "Put the schedule URL", QLineEdit::Normal, "", &ok); if (ok) { importFromNetwork(url); } } void ImportScheduleWidget::on_delete() { int active_id = Conference::activeConference(); Conference active_conference = Conference::getById(active_id); QMessageBox::StandardButton answer = QMessageBox::question(0 , "Deletion confirmation" , QString("Really delete the %1 conference").arg(active_conference.title()) , QMessageBox::Yes | QMessageBox::No , QMessageBox::No); if (answer == QMessageBox::Yes) { QString title = active_conference.title(); Conference::deleteConference(active_id); emit(scheduleDeleted(title)); } } void ImportScheduleWidget::importFromNetwork(const QString& url) { QNetworkRequest request; request.setUrl(QUrl(url)); mNetworkAccessManager->setProxy(QNetworkProxy::applicationProxy()); mNetworkAccessManager->get(request); } void ImportScheduleWidget::importData(const QByteArray &aData, const QString& url) { browse->hide(); online->hide(); progressBar->show(); // proxySettings->hide(); int confId = mXmlParser->parseData(aData, url); progressBar->hide(); browse->show(); online->show(); // proxySettings->show(); importScheduleLabel->setText("Schedule:"); if (confId > 0) { emit(scheduleImported(confId)); } }