From 29b92e2906823878a7c516dc454d9ae8654de8fb Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 12 Oct 2011 08:08:15 +0200 Subject: Initial work on pcp viewer including a new Praxisd class based on Qt-only components. --- client/praxisd.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 client/praxisd.cc (limited to 'client/praxisd.cc') diff --git a/client/praxisd.cc b/client/praxisd.cc new file mode 100644 index 0000000..2367eb1 --- /dev/null +++ b/client/praxisd.cc @@ -0,0 +1,46 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * praxisd.cc + * + * Tue Oct 11 15:20:18 CEST 2011 + * Copyright 2011 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 "praxisd.h" + +#ifdef TEST_PRAXISD +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" + +TEST_BEGIN; + +// TODO: Put some testcode here (see test.h for usable macros). +TEST_TRUE(false, "No tests yet!"); + +TEST_END; + +#endif/*TEST_PRAXISD*/ -- cgit v1.2.3 From ffc19fdcd0845dbd85c2bba990c590fcc5fba670 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 12 Oct 2011 12:09:50 +0200 Subject: Finalised the praxisd communination code. Still untested though... --- client/praxisd.cc | 336 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 323 insertions(+), 13 deletions(-) (limited to 'client/praxisd.cc') diff --git a/client/praxisd.cc b/client/praxisd.cc index 2367eb1..d8b3444 100644 --- a/client/praxisd.cc +++ b/client/praxisd.cc @@ -27,20 +27,330 @@ */ #include "praxisd.h" -#ifdef TEST_PRAXISD -//Additional dependency files -//deps: -//Required cflags (autoconf vars may be used) -//cflags: -//Required link options (autoconf vars may be used) -//libs: -#include "test.h" +#include -TEST_BEGIN; +#include -// TODO: Put some testcode here (see test.h for usable macros). -TEST_TRUE(false, "No tests yet!"); +#define DOCAVE(x) if(element.tagName() == #x) cave.x = element.text() +static QVector getCaveList(QByteArray data) +{ + QDomDocument doc; + doc.setContent(data); -TEST_END; + QVector cavelist; -#endif/*TEST_PRAXISD*/ + QDomNode praxisd = doc.documentElement().firstChild(); + QDomNodeList nodes = praxisd.childNodes(); + for(int i = 0; i < nodes.count(); i++) { + QDomNode node = nodes.at(i); + QDomElement element = node.toElement(); + if(element.tagName() == "div_cave") { + + Praxisd::cave_t cave; + cave.sogenr = element.attribute("sogenr"); + + QDomNodeList nodes = element.childNodes(); + for(int j = 0; j < nodes.count(); j++) { + QDomNode node = nodes.at(j); + QDomElement element = node.toElement(); + DOCAVE(cave); + DOCAVE(bemaerkning1); + DOCAVE(bemaerkning2); + DOCAVE(bemaerkning3); + } + + cavelist.push_back(cave); + } + } + + return cavelist; +} + +#define DOPATIENT(x) if(element.tagName() == #x) patient.x = element.text() +static Praxisd::patient_t getPatient(QByteArray data) +{ + QDomDocument doc; + doc.setContent(data); + + Praxisd::patient_t patient; + + QDomNode praxisd = doc.documentElement().firstChild(); + QDomNode patnode = praxisd.firstChild(); + + QDomElement patelement = patnode.toElement(); + patient.cpr = patelement.attribute("cpr"); + + QDomNodeList nodes = patnode.childNodes(); + for(int i = 0; i < nodes.count(); i++) { + QDomNode node = nodes.at(i); + QDomElement element = node.toElement(); + + DOPATIENT(fornavne); + DOPATIENT(efternavn); + DOPATIENT(stilling); + DOPATIENT(gade); + DOPATIENT(by); + DOPATIENT(telefonnumre); + DOPATIENT(sikringsgr); + DOPATIENT(amtsnr); + DOPATIENT(sygekontor); + DOPATIENT(henvnr); + DOPATIENT(frilinie1); + DOPATIENT(frilinie2); + DOPATIENT(frilinie3); + DOPATIENT(frilinie4); + DOPATIENT(frilinie5); + + if(element.tagName() == "sogeords") { + Praxisd::sogeord_t sogeord; + + QDomNodeList nodes = element.childNodes(); + for(int j = 0; j < nodes.count(); j++) { + QDomNode node = nodes.at(j); + QDomElement element = node.toElement(); + sogeord.sogenr = element.attribute("sogenr"); + sogeord.sogedato = element.attribute("sogedato"); + sogeord.sogetxt = element.text(); + } + + patient.sogeord.push_back(sogeord); + } + + DOPATIENT(ydernr); + DOPATIENT(created); + DOPATIENT(donottouch); + DOPATIENT(visus); + DOPATIENT(labkort); + DOPATIENT(medkort); + DOPATIENT(jlock); + DOPATIENT(unknown1); + DOPATIENT(henvdato); + DOPATIENT(aarhund); + DOPATIENT(fakturadato); + DOPATIENT(fakturabelob); + DOPATIENT(betaldato); + DOPATIENT(betalbelob); + DOPATIENT(jdato); + DOPATIENT(unknown250); + DOPATIENT(unknown251); + DOPATIENT(jtime); + } + + return patient; +} + +#define DODOKMENU(x) if(element.tagName() == #x) dokmenu.x = element.text() +QVector getDokMenu(QByteArray data) +{ + QDomDocument doc; + doc.setContent(data); + + QVector dokmenus; + + QDomNode praxisd = doc.documentElement().firstChild(); + QDomNodeList nodes = praxisd.childNodes(); + for(int i = 0; i < nodes.count(); i++) { + QDomNode node = nodes.at(i); + QDomElement element = node.toElement(); + if(element.tagName() == "dokmenu") { + + Praxisd::dokmenu_t dokmenu; + dokmenu.cpr = element.attribute("cpr"); + + QDomNodeList nodes = element.childNodes(); + for(int j = 0; j < nodes.count(); j++) { + QDomNode node = nodes.at(j); + QDomElement element = node.toElement(); + DODOKMENU(group); + DODOKMENU(subject); + if(element.tagName() == "filename") { + dokmenu.filename = element.text(); + dokmenu.filesize = element.attribute("filesize").toUInt(); + dokmenu.date = element.attribute("date"); + } + } + + dokmenus.push_back(dokmenu); + } + } + + return dokmenus; +} + +Praxisd::Praxisd(QString host, unsigned short int port) +{ + QUrl url; + url.setHost(host); + url.setPort(port); + url.setScheme("http"); + + request.setUrl(url); + + manager = new QNetworkAccessManager(this); + connect(manager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(replyFinished(QNetworkReply*))); +} + +void Praxisd::replyFinished(QNetworkReply *reply) +{ + if(reply->error() == QNetworkReply::NoError) { + + reply_t type = replytypes[reply]; + switch(type) { + case journal: + emit gotJournal(reply->readAll()); + break; + + case cavelist: + emit gotCave(getCaveList(reply->readAll())); + break; + + case patient: + emit gotPatient(getPatient(reply->readAll())); + break; + + case dokmenu: + emit gotDokMenu(getDokMenu(reply->readAll())); + break; + + case dokmenufile: + emit gotDokMenuFile(reply->readAll()); + break; + } + } else { + emit networkError(reply->errorString()); + } + replytypes.erase(replytypes.find(reply)); +} + +void Praxisd::makeTransfer(reply_t t, QString uri, + QMap params) +{ + request.setRawHeader("User-Agent", "Pracro Client v"VERSION); + + QUrl url; + url.setHost(request.url().host()); + url.setPort(request.url().port()); + url.setScheme(request.url().scheme()); + + url.setPath(uri); + + QMap::iterator i = params.begin(); + while(i != params.end()) { + url.addQueryItem(i.key(), i.value()); + i++; + } + + request.setUrl(url); + + QNetworkReply* r = manager->get(request); + replytypes[r] = t; +} + +void Praxisd::journal_get_by_cpr(QString cpr) +{ + QMap params; + params["cpr"] = cpr; + makeTransfer(journal, "/praxisd/1.0/journal/get_by_cpr", params); +} + +void Praxisd::diverse_get_cave(QString sogenr) +{ + QMap params; + params["sogenr"] = sogenr; + makeTransfer(cavelist, "/praxisd/1.0/diverse/get_all_by_sogenr", params); +} + +void Praxisd::patient_get_by_cpr(QString cpr) +{ + QMap params; + params["cpr"] = cpr; + makeTransfer(patient, "/praxisd/1.0/patient/get_by_cpr", params); +} + +void Praxisd::dokmenu_get_all_by_cpr(QString cpr) +{ + QMap params; + params["cpr"] = cpr; + makeTransfer(dokmenu, "/praxisd/1.0/dokmenu/get_all_by_cpr", params); +} + +void Praxisd::dokmenu_get_by_cpr_and_name(QString cpr, QString name) +{ + cpr = cpr; + name = name; + // uri = host + "/praxisd/1.0/dokmenu/get_by_cpr_and_name?cpr=" + cpr + "&name=" + name; + QMap params; + params["cpr"] = cpr; + params["name"] = name; + makeTransfer(dokmenufile, "/praxisd/1.0/dokmenu/get_by_cpr_and_name", params); +} + +PraxisdSync::PraxisdSync(QString host, unsigned short int port) + : praxisd(host, port) +{ + connect(&praxisd, SIGNAL(gotCaveList(QVector)), + this, SLOT(gotCaveList(QVector))); + + start(); +} + +void PraxisdSync::run() +{ + while(true) { + wsem.acquire(); + + switch(request_type) { + case Praxisd::journal: + break; + case Praxisd::cavelist: + praxisd.diverse_get_cave(request_sogenr); + break; + case Praxisd::patient: + break; + case Praxisd::dokmenu: + break; + case Praxisd::dokmenufile: + break; + } + } +} + +void PraxisdSync::gotCaveList(QVector cl) +{ + cavelist = cl; + rsem.release(); +} + +QString PraxisdSync::journal_get_by_cpr(QString cpr) +{ + return cpr; +} + +QVector PraxisdSync::diverse_get_cave(QString sogenr) +{ + request_type = Praxisd::cavelist; + request_sogenr = sogenr; + + wsem.release(); + rsem.acquire(); + + return cavelist; +} + +Praxisd::patient_t PraxisdSync::patient_get_by_cpr(QString cpr) +{ + cpr = ""; + return Praxisd::patient_t(); +} + +QVector PraxisdSync::dokmenu_get_all_by_cpr(QString cpr) +{ + cpr = ""; + return QVector(); +} + +QString PraxisdSync::dokmenu_get_by_cpr_and_name(QString cpr, QString name) +{ + return cpr + name; +} -- cgit v1.2.3 From c73d1d01ba6b57f664c21a189fa9297e2c75456a Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 13 Oct 2011 10:30:38 +0200 Subject: Finished Praxisd code. Now it works both in sync and async modes. --- client/praxisd.cc | 76 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 24 deletions(-) (limited to 'client/praxisd.cc') diff --git a/client/praxisd.cc b/client/praxisd.cc index d8b3444..5309b66 100644 --- a/client/praxisd.cc +++ b/client/praxisd.cc @@ -27,26 +27,28 @@ */ #include "praxisd.h" +#include + #include #include #define DOCAVE(x) if(element.tagName() == #x) cave.x = element.text() -static QVector getCaveList(QByteArray data) +static CaveVector getCaveList(QByteArray data) { QDomDocument doc; doc.setContent(data); - QVector cavelist; + CaveVector cavelist; - QDomNode praxisd = doc.documentElement().firstChild(); + QDomNode praxisd = doc.documentElement(); QDomNodeList nodes = praxisd.childNodes(); for(int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); QDomElement element = node.toElement(); if(element.tagName() == "div_cave") { - Praxisd::cave_t cave; + cave_t cave; cave.sogenr = element.attribute("sogenr"); QDomNodeList nodes = element.childNodes(); @@ -67,14 +69,14 @@ static QVector getCaveList(QByteArray data) } #define DOPATIENT(x) if(element.tagName() == #x) patient.x = element.text() -static Praxisd::patient_t getPatient(QByteArray data) +static Patient getPatient(QByteArray data) { QDomDocument doc; doc.setContent(data); - Praxisd::patient_t patient; + Patient patient; - QDomNode praxisd = doc.documentElement().firstChild(); + QDomNode praxisd = doc.documentElement(); QDomNode patnode = praxisd.firstChild(); QDomElement patelement = patnode.toElement(); @@ -102,7 +104,7 @@ static Praxisd::patient_t getPatient(QByteArray data) DOPATIENT(frilinie5); if(element.tagName() == "sogeords") { - Praxisd::sogeord_t sogeord; + sogeord_t sogeord; QDomNodeList nodes = element.childNodes(); for(int j = 0; j < nodes.count(); j++) { @@ -140,21 +142,20 @@ static Praxisd::patient_t getPatient(QByteArray data) } #define DODOKMENU(x) if(element.tagName() == #x) dokmenu.x = element.text() -QVector getDokMenu(QByteArray data) +static DokMenuVector getDokMenu(QByteArray data) { QDomDocument doc; doc.setContent(data); - QVector dokmenus; + DokMenuVector dokmenus; - QDomNode praxisd = doc.documentElement().firstChild(); + QDomNode praxisd = doc.documentElement(); QDomNodeList nodes = praxisd.childNodes(); for(int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); QDomElement element = node.toElement(); if(element.tagName() == "dokmenu") { - - Praxisd::dokmenu_t dokmenu; + dokmenu_t dokmenu; dokmenu.cpr = element.attribute("cpr"); QDomNodeList nodes = element.childNodes(); @@ -179,6 +180,9 @@ QVector getDokMenu(QByteArray data) Praxisd::Praxisd(QString host, unsigned short int port) { + qRegisterMetaType("CaveVector"); + qRegisterMetaType("DokMenuVector"); + QUrl url; url.setHost(host); url.setPort(port); @@ -202,7 +206,7 @@ void Praxisd::replyFinished(QNetworkReply *reply) break; case cavelist: - emit gotCave(getCaveList(reply->readAll())); + emit gotCaveList(getCaveList(reply->readAll())); break; case patient: @@ -287,16 +291,23 @@ void Praxisd::dokmenu_get_by_cpr_and_name(QString cpr, QString name) } PraxisdSync::PraxisdSync(QString host, unsigned short int port) - : praxisd(host, port) { - connect(&praxisd, SIGNAL(gotCaveList(QVector)), - this, SLOT(gotCaveList(QVector))); + this->host = host; + this->port = port; start(); } void PraxisdSync::run() { + Praxisd praxisd(host, port); + + connect(&praxisd, SIGNAL(gotCaveList(CaveVector)), + this, SLOT(gotCaveList(CaveVector)), Qt::DirectConnection); + + connect(&praxisd, SIGNAL(gotDokMenu(DokMenuVector)), + this, SLOT(gotDokMenu(DokMenuVector)), Qt::DirectConnection); + while(true) { wsem.acquire(); @@ -309,17 +320,29 @@ void PraxisdSync::run() case Praxisd::patient: break; case Praxisd::dokmenu: + praxisd.dokmenu_get_all_by_cpr(request_cpr); break; case Praxisd::dokmenufile: break; } + + exec(); } } -void PraxisdSync::gotCaveList(QVector cl) +void PraxisdSync::gotCaveList(CaveVector cl) { cavelist = cl; rsem.release(); + + quit(); +} + +void PraxisdSync::gotDokMenu(DokMenuVector d) +{ + dokmenu = d; + rsem.release(); + quit(); } QString PraxisdSync::journal_get_by_cpr(QString cpr) @@ -327,7 +350,7 @@ QString PraxisdSync::journal_get_by_cpr(QString cpr) return cpr; } -QVector PraxisdSync::diverse_get_cave(QString sogenr) +CaveVector PraxisdSync::diverse_get_cave(QString sogenr) { request_type = Praxisd::cavelist; request_sogenr = sogenr; @@ -338,16 +361,21 @@ QVector PraxisdSync::diverse_get_cave(QString sogenr) return cavelist; } -Praxisd::patient_t PraxisdSync::patient_get_by_cpr(QString cpr) +Patient PraxisdSync::patient_get_by_cpr(QString cpr) { cpr = ""; - return Praxisd::patient_t(); + return Patient(); } -QVector PraxisdSync::dokmenu_get_all_by_cpr(QString cpr) +DokMenuVector PraxisdSync::dokmenu_get_all_by_cpr(QString cpr) { - cpr = ""; - return QVector(); + request_type = Praxisd::dokmenu; + request_cpr = cpr; + + wsem.release(); + rsem.acquire(); + + return dokmenu; } QString PraxisdSync::dokmenu_get_by_cpr_and_name(QString cpr, QString name) -- cgit v1.2.3 From 3a7e8f62d40f9fc03fd212a71b0f9a9a8b9bd5fe Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 13 Oct 2011 11:30:41 +0200 Subject: Add Patient request. --- client/praxisd.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'client/praxisd.cc') diff --git a/client/praxisd.cc b/client/praxisd.cc index 5309b66..740825e 100644 --- a/client/praxisd.cc +++ b/client/praxisd.cc @@ -181,6 +181,7 @@ static DokMenuVector getDokMenu(QByteArray data) Praxisd::Praxisd(QString host, unsigned short int port) { qRegisterMetaType("CaveVector"); + qRegisterMetaType("Patient"); qRegisterMetaType("DokMenuVector"); QUrl url; @@ -305,6 +306,9 @@ void PraxisdSync::run() connect(&praxisd, SIGNAL(gotCaveList(CaveVector)), this, SLOT(gotCaveList(CaveVector)), Qt::DirectConnection); + connect(&praxisd, SIGNAL(gotPatient(Patient)), + this, SLOT(gotPatient(Patient)), Qt::DirectConnection); + connect(&praxisd, SIGNAL(gotDokMenu(DokMenuVector)), this, SLOT(gotDokMenu(DokMenuVector)), Qt::DirectConnection); @@ -318,6 +322,7 @@ void PraxisdSync::run() praxisd.diverse_get_cave(request_sogenr); break; case Praxisd::patient: + praxisd.patient_get_by_cpr(request_cpr); break; case Praxisd::dokmenu: praxisd.dokmenu_get_all_by_cpr(request_cpr); @@ -334,7 +339,13 @@ void PraxisdSync::gotCaveList(CaveVector cl) { cavelist = cl; rsem.release(); + quit(); +} +void PraxisdSync::gotPatient(Patient p) +{ + patient = p; + rsem.release(); quit(); } -- cgit v1.2.3