/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * netcom.cc * * Mon Aug 18 09:33:26 CEST 2008 * Copyright 2008 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro 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. * * Pracro 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 Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "netcom.h" #include #include #include #include #include "widgets/widget.h" #ifdef USE_SSL #include #include #include #include #ifdef QT_NO_OPENSSL #error "QT not compiled with SSL support." #endif #endif NetCom::NetCom(QString host, quint16 port, QString user, QString cpr) { this->user = user; this->cpr = cpr; connect(&http, SIGNAL(readyRead(const QHttpResponseHeader &)), this, SLOT(readyRead(const QHttpResponseHeader &))); connect(&http, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int))); #ifdef USE_SSL connect(&http, SIGNAL(sslErrors(const QList &)), this, SLOT(sslError(const QList &))); http.setHost(host, QHttp::ConnectionModeHttps, port); #else http.setHost(host, QHttp::ConnectionModeHttp, port); #endif transfering = false; QHttpRequestHeader h("HTTP 1.1", "/"); http.request(h, ""); transfering = true; buffer = ""; do { qApp->processEvents(QEventLoop::WaitForMoreEvents); } while(transfering); sessionid = http.lastResponse().value("SessionID"); printf("SESSION ID: %s\n", sessionid.toStdString().c_str()); } NetCom::~NetCom() { QHttpRequestHeader h("HTTP 1.1", "/"); h.setValue("SessionCommit", ""); h.setValue("SessionID", sessionid); http.request(h, ""); transfering = true; buffer = ""; do { qApp->processEvents(QEventLoop::WaitForMoreEvents); } while(transfering); } QDomDocument NetCom::send(QString templ, QString macro, bool lockgui) { if(lockgui && qApp->activeWindow()) qApp->activeWindow()->setEnabled(false); if(lockgui) QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); doc.appendChild(header); QDomElement pracro_elem = doc.createElement("pracro"); pracro_elem.setAttribute("version", "1.0"); pracro_elem.setAttribute("cpr", cpr); pracro_elem.setAttribute("user", user); doc.appendChild(pracro_elem); QDomElement request_elem = doc.createElement("request"); request_elem.setAttribute("template", templ); if(macro != "") request_elem.setAttribute("macro", macro); pracro_elem.appendChild(request_elem); printf("\nSending request:\n%s", doc.toString().toStdString().c_str()); QHttpRequestHeader h("HTTP 1.1", "/"); h.setValue("SessionID", sessionid); http.request(h, doc.toByteArray()); QDomDocument res_doc; transfering = true; buffer = ""; do { qApp->processEvents(QEventLoop::WaitForMoreEvents); } while(transfering); res_doc.setContent(buffer); QDomElement elem = res_doc.documentElement(); printf("\nRecieved request:\n%s", res_doc.toString().toStdString().c_str()); if(lockgui) QApplication::restoreOverrideCursor(); if(lockgui && qApp->activeWindow()) qApp->activeWindow()->setEnabled(true); return res_doc; } void NetCom::send(QVector< Widget* > widgets, QString templ, QString macro, QString version) { QDomDocument doc; QDomProcessingInstruction header = doc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); doc.appendChild(header); QDomElement pracro_elem = doc.createElement("pracro"); pracro_elem.setAttribute("version", "1.0"); pracro_elem.setAttribute("cpr", cpr); pracro_elem.setAttribute("user", user); doc.appendChild(pracro_elem); QDomElement commit_elem = doc.createElement("commit"); commit_elem.setAttribute("template", templ); commit_elem.setAttribute("macro", macro); commit_elem.setAttribute("version", version); pracro_elem.appendChild(commit_elem); // Iterate the different entries, and append their results to the commit string QVector< Widget* >::iterator i = widgets.begin(); while (i != widgets.end()) { Widget* w = *i; if(!w->isDisabled() && w->getName() != "") { QDomElement field_elem = doc.createElement("field"); field_elem.setAttribute("name", w->getName()); field_elem.setAttribute("value", w->getValue()); commit_elem.appendChild(field_elem); } i++; } if(qApp->activeWindow()) qApp->activeWindow()->setEnabled(false); printf("\nSending commit:\n%s", doc.toString().toStdString().c_str()); QHttpRequestHeader h("HTTP 1.1", "/"); h.setValue("SessionID", sessionid); http.request(h, doc.toByteArray()); transfering = true; buffer = ""; do { qApp->processEvents(QEventLoop::WaitForMoreEvents); } while(transfering); QApplication::restoreOverrideCursor(); if(qApp->activeWindow()) qApp->activeWindow()->setEnabled(true); } void NetCom::readyRead(const QHttpResponseHeader &) { // printf("STATE: readyRead\n"); buffer += http.readAll(); } void NetCom::stateChanged(int state) { // printf("STATE: %d\n", state); if(transfering && state == QHttp::Connected) transfering = false; } #ifdef USE_SSL void NetCom::sslError(const QList &errlst) { QList::const_iterator i = errlst.begin(); while(i != errlst.end()) { QMessageBox::warning(qApp->activeWindow(), "SSL Error", i->errorString()); i++; } http.ignoreSslErrors(); } #endif