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