diff options
-rw-r--r-- | qt-ui/subsurfacewebservices.cpp | 99 | ||||
-rw-r--r-- | qt-ui/subsurfacewebservices.h | 11 | ||||
-rw-r--r-- | qt-ui/subsurfacewebservices.ui | 2 | ||||
-rw-r--r-- | webservice.c | 60 | ||||
-rw-r--r-- | webservice.h | 13 |
5 files changed, 114 insertions, 71 deletions
diff --git a/qt-ui/subsurfacewebservices.cpp b/qt-ui/subsurfacewebservices.cpp index 48e56aa30..c6314bf03 100644 --- a/qt-ui/subsurfacewebservices.cpp +++ b/qt-ui/subsurfacewebservices.cpp @@ -1,8 +1,13 @@ #include "subsurfacewebservices.h" #include "ui_subsurfacewebservices.h" +#include "../webservice.h" + +#include <libxml/parser.h> + #include <QNetworkAccessManager> #include <QNetworkReply> #include <QDebug> +#include <qdesktopservices.h> SubsurfaceWebServices* SubsurfaceWebServices::instance() { @@ -15,45 +20,123 @@ SubsurfaceWebServices::SubsurfaceWebServices(QWidget* parent, Qt::WindowFlags f) ui->setupUi(this); connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); connect(ui->download, SIGNAL(clicked(bool)), this, SLOT(startDownload())); + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); } void SubsurfaceWebServices::buttonClicked(QAbstractButton* button) { - + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); + switch(ui->buttonBox->buttonRole(button)){ + case QDialogButtonBox::ApplyRole: + qDebug() << "Apply Clicked"; + break; + case QDialogButtonBox::RejectRole: + manager->deleteLater(); + reply->deleteLater(); + ui->progressBar->setMaximum(1); + break; + case QDialogButtonBox::HelpRole: + QDesktopServices::openUrl(QUrl("http://api.hohndel.org")); + break; + default: + break; + } } void SubsurfaceWebServices::startDownload() { QUrl url("http://api.hohndel.org/api/dive/get/"); url.setQueryItems( QList<QPair<QString,QString> >() << qMakePair(QString("login"), ui->userID->text())); - qDebug() << url; - - QNetworkAccessManager *manager = new QNetworkAccessManager(this); + + manager = new QNetworkAccessManager(this); QNetworkRequest request; request.setUrl(url); request.setRawHeader("Accept", "text/xml"); reply = manager->get(request); - ui->progressBar->setRange(0,0); + ui->progressBar->setRange(0,0); // this makes the progressbar do an 'infinite spin' + ui->download->setEnabled(false); + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); + connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished())); - connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); + connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), + this, SLOT(downloadError(QNetworkReply::NetworkError))); } void SubsurfaceWebServices::downloadFinished() { ui->progressBar->setRange(0,1); - QByteArray result = reply->readAll(); - qDebug() << result; + downloadedData = reply->readAll(); + + ui->download->setEnabled(true); ui->status->setText(tr("Download Finished")); + + uint resultCode = download_dialog_parse_response(downloadedData); + setStatusText(resultCode); + if (resultCode == DD_STATUS_OK){ + ui->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); + } + manager->deleteLater(); + reply->deleteLater(); } void SubsurfaceWebServices::downloadError(QNetworkReply::NetworkError error) { + ui->download->setEnabled(true); ui->progressBar->setRange(0,1); ui->status->setText(QString::number((int)QNetworkRequest::HttpStatusCodeAttribute)); + manager->deleteLater(); + reply->deleteLater(); } +void SubsurfaceWebServices::setStatusText(int status) +{ + QString text; + switch (status) { + case DD_STATUS_ERROR_CONNECT: text = tr("Connection Error: "); break; + case DD_STATUS_ERROR_ID: text = tr("Invalid user identifier!"); break; + case DD_STATUS_ERROR_PARSE: text = tr("Cannot parse response!"); break; + case DD_STATUS_OK: text = tr("Download Success!"); break; + } + ui->status->setText(text); +} void SubsurfaceWebServices::runDialog() { show(); } + +/* requires that there is a <download> or <error> tag under the <root> tag */ +void SubsurfaceWebServices::download_dialog_traverse_xml(xmlNodePtr node, unsigned int *download_status) +{ + xmlNodePtr cur_node; + for (cur_node = node; cur_node; cur_node = cur_node->next) { + if ((!strcmp((const char *)cur_node->name, (const char *)"download")) && + (!strcmp((const char *)xmlNodeGetContent(cur_node), (const char *)"ok"))) { + *download_status = DD_STATUS_OK; + return; + } else if (!strcmp((const char *)cur_node->name, (const char *)"error")) { + *download_status = DD_STATUS_ERROR_ID; + return; + } + } +} + +unsigned int SubsurfaceWebServices::download_dialog_parse_response(const QByteArray& xml) +{ + xmlNodePtr root; + xmlDocPtr doc = xmlParseMemory(xml.data(), xml.length()); + unsigned int status = DD_STATUS_ERROR_PARSE; + + if (!doc) + return DD_STATUS_ERROR_PARSE; + root = xmlDocGetRootElement(doc); + if (!root) { + status = DD_STATUS_ERROR_PARSE; + goto end; + } + if (root->children) + download_dialog_traverse_xml(root->children, &status); + end: + xmlFreeDoc(doc); + return status; +} diff --git a/qt-ui/subsurfacewebservices.h b/qt-ui/subsurfacewebservices.h index ffcc28f82..9e85db155 100644 --- a/qt-ui/subsurfacewebservices.h +++ b/qt-ui/subsurfacewebservices.h @@ -3,6 +3,7 @@ #include <QDialog> #include <QNetworkReply> +#include <libxml/tree.h> namespace Ui{ class SubsurfaceWebServices; @@ -23,9 +24,15 @@ private slots: void downloadError(QNetworkReply::NetworkError error); private: - explicit SubsurfaceWebServices(QWidget* parent = 0, Qt::WindowFlags f = 0); - Ui::SubsurfaceWebServices *ui; + void setStatusText(int status); + void download_dialog_traverse_xml(xmlNodePtr node, unsigned int *download_status); + unsigned int download_dialog_parse_response(const QByteArray& length); + + explicit SubsurfaceWebServices(QWidget* parent = 0, Qt::WindowFlags f = 0); + Ui::SubsurfaceWebServices *ui; QNetworkReply *reply; + QNetworkAccessManager *manager; + QByteArray downloadedData; }; #endif
\ No newline at end of file diff --git a/qt-ui/subsurfacewebservices.ui b/qt-ui/subsurfacewebservices.ui index e1232dc38..899eea909 100644 --- a/qt-ui/subsurfacewebservices.ui +++ b/qt-ui/subsurfacewebservices.ui @@ -27,7 +27,7 @@ <enum>Qt::Horizontal</enum> </property> <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set> + <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help</set> </property> </widget> </item> diff --git a/webservice.c b/webservice.c index f4f8baeb4..2ac19c85a 100644 --- a/webservice.c +++ b/webservice.c @@ -1,36 +1,16 @@ #include <libintl.h> #include <glib/gi18n.h> #include <libsoup/soup.h> -#include <libxml/tree.h> -#include <libxml/parser.h> + #include "dive.h" #include "divelist.h" #include "display-gtk.h" #include "file.h" +#include "webservice.h" struct dive_table gps_location_table; static gboolean merge_locations_into_dives(void); -enum { - DD_STATUS_OK, - DD_STATUS_ERROR_CONNECT, - DD_STATUS_ERROR_ID, - DD_STATUS_ERROR_PARSE, -}; - -static const gchar *download_dialog_status_text(const gint status) -{ - switch (status) { - case DD_STATUS_ERROR_CONNECT: - return _("Connection Error: "); - case DD_STATUS_ERROR_ID: - return _("Invalid user identifier!"); - case DD_STATUS_ERROR_PARSE: - return _("Cannot parse response!"); - } - return _("Download Success!"); -} - /* provides a state of the download dialog contents and the downloaded xml */ struct download_dialog_state { GtkWidget *uid; @@ -73,42 +53,6 @@ gboolean webservice_request_user_xml(const gchar *user_id, return ret; } -/* requires that there is a <download> or <error> tag under the <root> tag */ -static void download_dialog_traverse_xml(xmlNodePtr node, guint *download_status) -{ - xmlNodePtr cur_node; - for (cur_node = node; cur_node; cur_node = cur_node->next) { - if ((!strcmp((const char *)cur_node->name, (const char *)"download")) && - (!strcmp((const char *)xmlNodeGetContent(cur_node), (const char *)"ok"))) { - *download_status = DD_STATUS_OK; - return; - } else if (!strcmp((const char *)cur_node->name, (const char *)"error")) { - *download_status = DD_STATUS_ERROR_ID; - return; - } - } -} - -static guint download_dialog_parse_response(gchar *xmldata, guint len) -{ - xmlNodePtr root; - xmlDocPtr doc = xmlParseMemory(xmldata, len); - guint status = DD_STATUS_ERROR_PARSE; - - if (!doc) - return DD_STATUS_ERROR_PARSE; - root = xmlDocGetRootElement(doc); - if (!root) { - status = DD_STATUS_ERROR_PARSE; - goto end; - } - if (root->children) - download_dialog_traverse_xml(root->children, &status); - end: - xmlFreeDoc(doc); - return status; -} - static void download_dialog_connect_cb(GtkWidget *w, gpointer data) { struct download_dialog_state *state = (struct download_dialog_state *)data; diff --git a/webservice.h b/webservice.h index c1951acd1..739f1057e 100644 --- a/webservice.h +++ b/webservice.h @@ -2,9 +2,18 @@ extern "C" { #endif -extern void webservice_download_dialog(void); -extern gboolean webservice_request_user_xml(const gchar *, gchar **, guint *, guint *); +//extern void webservice_download_dialog(void); +//extern bool webservice_request_user_xml(const gchar *, gchar **, unsigned int *, unsigned int *); extern int divelogde_upload(char *fn, char **error); +extern unsigned int download_dialog_parse_response(char *xmldata, unsigned int len); + +enum { + DD_STATUS_OK, + DD_STATUS_ERROR_CONNECT, + DD_STATUS_ERROR_ID, + DD_STATUS_ERROR_PARSE, +}; + #ifdef __cplusplus } |