summaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authordeva <deva>2011-04-25 06:27:08 +0000
committerdeva <deva>2011-04-25 06:27:08 +0000
commiteb91a2967ed18aa24166f13a635091e2193aecc0 (patch)
tree5931eb736092d9b59c35059ee1f26eafcf791194 /server/src
parenta01d53ff5aa238f66cff193af22da8e0b7538437 (diff)
Initial version of praxisd communications class.
Diffstat (limited to 'server/src')
-rw-r--r--server/src/Makefile.am2
-rw-r--r--server/src/praxisd.cc317
-rw-r--r--server/src/praxisd.h141
3 files changed, 460 insertions, 0 deletions
diff --git a/server/src/Makefile.am b/server/src/Makefile.am
index 003148e..ccbc63b 100644
--- a/server/src/Makefile.am
+++ b/server/src/Makefile.am
@@ -44,6 +44,7 @@ pracrod_SOURCES = \
pracrodao.cc \
pracrodaopgsql.cc \
pracrodaotest.cc \
+ praxisd.cc \
queryhandlerpentominos.cc \
queryhandlerpracro.cc \
queryparser.cc \
@@ -101,6 +102,7 @@ EXTRA_DIST = \
pracrodao.h \
pracrodaopgsql.h \
pracrodaotest.h \
+ praxisd.h \
queryhandler.h \
queryhandlerpentominos.h \
queryhandlerpracro.h \
diff --git a/server/src/praxisd.cc b/server/src/praxisd.cc
new file mode 100644
index 0000000..b4b0a88
--- /dev/null
+++ b/server/src/praxisd.cc
@@ -0,0 +1,317 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * praxisd.cc
+ *
+ * Tue Apr 19 09:00:29 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"
+
+static std::string strtime(bool with_sec = true)
+{
+ std::string ret;
+
+ time_t epoch = time(NULL);
+ struct tm t;
+ localtime_r(&epoch, &t);
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%04d-%02d-%02d",
+ t.tm_year + 1900, t.tm_mon + 1, t.tm_mday);
+ ret = buf;
+
+ if(with_sec) {
+ snprintf(buf, sizeof(buf), "%02d:%02d:%02d",
+ t.tm_hour, t.tm_min, t.tm_sec);
+ ret += " ";
+ ret += buf;
+ }
+
+ return ret;
+}
+
+static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
+{
+ std::string *str = (std::string*)userp;
+ str->append((char*)buffer, size * nmemb);
+ return size * nmemb;
+}
+
+Praxisd::Praxisd(std::string h, int port)
+{
+ ch = curl_easy_init();
+ host = h;
+
+ curl_easy_setopt(ch, CURLOPT_PORT, port);
+ curl_easy_setopt(ch, CURLOPT_FAILONERROR, 1L);
+ curl_easy_setopt(ch, CURLOPT_TIMEOUT, 150L);
+ curl_easy_setopt(ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
+ curl_easy_setopt(ch, CURLOPT_CONNECTTIMEOUT, 15L);
+ curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L);
+ curl_easy_setopt(ch, CURLOPT_USERAGENT, "libpraxisd");
+ curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, write_data);
+ curl_easy_setopt(ch, CURLOPT_FILETIME, 1L);
+ curl_easy_setopt(ch, CURLOPT_HEADER, 0L);
+}
+
+Praxisd::~Praxisd()
+{
+ curl_easy_cleanup(ch);
+}
+
+// Get Journal By CPR
+std::string Praxisd::journal_get_by_cpr(std::string cpr)
+{
+ std::string journal;
+
+ std::string uri = host + "/praxisd/1.0/journal/get_by_cpr?cpr=" + cpr;
+ curl_easy_setopt(ch, CURLOPT_URL, uri.c_str());
+
+ curl_easy_setopt(ch, CURLOPT_POST, 0L);
+ curl_easy_setopt(ch, CURLOPT_WRITEDATA, &journal);
+
+ CURLcode errornum = curl_easy_perform(ch);
+ if(errornum != CURLE_OK) {
+ printf("Ouch %d\n", errornum);
+ }
+
+ time_t time;
+ errornum = curl_easy_getinfo(ch, CURLINFO_FILETIME, &time);
+
+ return journal;
+}
+
+time_t Praxisd::journal_last_changed(std::string cpr)
+{
+ std::string journal;
+
+ std::string uri = host + "/praxisd/1.0/journal/get_by_cpr?cpr=" + cpr;
+ curl_easy_setopt(ch, CURLOPT_URL, uri.c_str());
+
+ curl_easy_setopt(ch, CURLOPT_POST, 0L);
+ curl_easy_setopt(ch, CURLOPT_WRITEDATA, &journal);
+
+ CURLcode errornum = curl_easy_perform(ch);
+ if(errornum != CURLE_OK) {
+ printf("Ouch %d\n", errornum);
+ }
+
+ time_t time;
+ errornum = curl_easy_getinfo(ch, CURLINFO_FILETIME, &time);
+
+ return time;
+}
+
+
+void Praxisd::journal_add(std::string cpr, std::string entry)
+{
+ std::string xml;
+ xml += "<praxisd version=\"1.0\">\n";
+ xml += " <journal cpr=\""+cpr+"\">"+entry+"</journal>\n";
+ xml += "</praxisd>\n";
+
+ curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, (long)xml.length());
+ curl_easy_setopt(ch, CURLOPT_POSTFIELDS, xml.c_str());
+ curl_easy_setopt(ch, CURLOPT_POST, 1L);
+
+ struct curl_slist *slist = NULL;
+ // Unset 'Expect' header, set by CURLOPT_POSTFIELDS
+ slist = curl_slist_append(slist, "Expect:");
+ slist = curl_slist_append(slist, "Content-Type: text/xml");
+ slist = curl_slist_append(slist, "Connection: keep-alive");
+ curl_easy_setopt(ch, CURLOPT_HTTPHEADER, slist);
+
+ std::string uri = host + "/praxisd/1.0/journal/add";
+ curl_easy_setopt(ch, CURLOPT_URL, uri.c_str());
+
+ std::string reply;
+ curl_easy_setopt(ch, CURLOPT_WRITEDATA, &reply);
+
+ CURLcode errornum = curl_easy_perform(ch);
+ if(errornum != CURLE_OK) {
+ printf("Ouch: %d %s\n", errornum, reply.c_str());
+ }
+}
+
+void Praxisd::add_sogeord(std::string cpr, std::string sogeord,
+ std::string sogetxt)
+{
+
+ std::string datestr = strtime(false);
+
+ std::string xml;
+ xml += "<praxisd version=\"1.0\">\n";
+ xml += " <addsogeord cpr=\""+cpr+"\">\n";
+ xml += " <sogeord sogenr=\""+sogeord+"\" date=\""+datestr+"\">"+
+ sogetxt+"</sogeord>\n";
+ xml += " </addsogeord>\n";
+ xml += "</praxisd>\n";
+
+ curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, (long)xml.length());
+ curl_easy_setopt(ch, CURLOPT_POSTFIELDS, xml.c_str());
+ curl_easy_setopt(ch, CURLOPT_POST, 1L);
+
+ struct curl_slist *slist = NULL;
+ // Unset 'Expect' header, set by CURLOPT_POSTFIELDS
+ slist = curl_slist_append(slist, "Expect:");
+ slist = curl_slist_append(slist, "Content-Type: text/xml");
+ slist = curl_slist_append(slist, "Connection: keep-alive");
+ curl_easy_setopt(ch, CURLOPT_HTTPHEADER, slist);
+
+ std::string uri = host + "/praxisd/1.0/patient/add_sogeord";
+ curl_easy_setopt(ch, CURLOPT_URL, uri.c_str());
+
+ std::string reply;
+ curl_easy_setopt(ch, CURLOPT_WRITEDATA, &reply);
+
+ CURLcode errornum = curl_easy_perform(ch);
+ if(errornum != CURLE_OK) {
+ printf("Ouch: %d %s\n", errornum, reply.c_str());
+ }
+}
+
+#define DOTAG(x) if(name == #x) str = &p.x;
+#include "saxparser.h"
+class PatientParser : public SAXParser {
+public:
+ PatientParser(Praxisd::patient_t &_p) : p(_p) { str = NULL; }
+
+ void characterData(std::string &data)
+ {
+ if(str) *str += data;
+ }
+
+ void startTag(std::string name, std::map<std::string, std::string> attr)
+ {
+ DOTAG(fornavne);
+ DOTAG(efternavn);
+ DOTAG(stilling);
+ DOTAG(gade);
+ DOTAG(by);
+ DOTAG(telefonnumre);
+ DOTAG(sikringsgr);
+ DOTAG(amtsnr);
+ DOTAG(sygekontor);
+ DOTAG(henvnr);
+ DOTAG(frilinie1);
+ DOTAG(frilinie2);
+ DOTAG(frilinie3);
+ DOTAG(frilinie4);
+ DOTAG(frilinie5);
+ DOTAG(ydernr);
+ DOTAG(created);
+ DOTAG(donottouch);
+ DOTAG(visus);
+ DOTAG(labkort);
+ DOTAG(medkort);
+ DOTAG(jlock);
+ DOTAG(unknown1);
+ DOTAG(henvdato);
+ DOTAG(aarhund);
+ DOTAG(fakturadato);
+ DOTAG(fakturabelob);
+ DOTAG(betaldato);
+ DOTAG(betalbelob);
+ DOTAG(jdato);
+ DOTAG(unknown250);
+ DOTAG(unknown251);
+ DOTAG(jtime);
+ if(name == "sogeords") {} // do nothing
+ if(name == "sogeord") {
+ Praxisd::sogeord_t s;
+ if(attr.find("sogenr") != attr.end()) s.sogenr = attr["sogenr"];
+ if(attr.find("sogedatpo") != attr.end()) s.sogedato = attr["sogedato"];
+ p.sogeord.push_back(s);
+ str = &p.sogeord[p.sogeord.size() - 1].sogetxt;
+ }
+ }
+
+ void endTag(std::string name)
+ {
+ str = NULL;
+ }
+
+private:
+ std::string *str;
+ Praxisd::patient_t &p;
+};
+
+Praxisd::patient_t Praxisd::patient_get_by_cpr(std::string cpr)
+{
+ patient_t p;
+
+ std::string xml;
+
+ std::string uri = host + "/praxisd/1.0/patient/get_by_cpr?cpr=" + cpr;
+ curl_easy_setopt(ch, CURLOPT_URL, uri.c_str());
+
+ curl_easy_setopt(ch, CURLOPT_POST, 0L);
+ curl_easy_setopt(ch, CURLOPT_WRITEDATA, &xml);
+
+ CURLcode errornum = curl_easy_perform(ch);
+ if(errornum != CURLE_OK) {
+ printf("Ouch %d\n", errornum);
+ }
+
+ PatientParser parser(p);
+ parser.parse(xml.data(), xml.length());
+
+ return p;
+}
+
+#ifdef TEST_PRAXISD
+//deps: saxparser.cc debug.cc log.cc
+//cflags: $(CURL_CFLAGS) $(EXPAT_CFLAGS) -I..
+//libs: $(CURL_LIBS) $(EXPAT_LIBS)
+#include "test.h"
+
+#define NL "\r\n"
+#define CPR "1505050505"
+
+TEST_BEGIN;
+
+Praxisd p("http://localhost", 10000);
+
+std::string j = p.journal_get_by_cpr(CPR);
+TEST_NOTEQUAL(j, "", "Did we get a journal?");
+
+std::string more = "less is more... much much more.";
+p.journal_add(CPR, more);
+
+time_t changed = p.journal_last_changed(CPR);
+TEST_EQUAL_INT(changed, time(NULL), "Changed just now?");
+
+Praxisd::patient_t patient = p.patient_get_by_cpr(CPR);
+TEST_EQUAL_STR(patient.fornavne, "Kristian", "Who are you?");
+
+/*
+std::string exp = j + more + NL;
+std::string j2 = p.journal_get_by_cpr(CPR);
+TEST_EQUAL_INT(exp.length(), j2.length(), "Compare lengths");
+TEST_EQUAL_STR(exp, j2, "Did we correctly append to the journal?");
+*/
+
+p.add_sogeord(CPR, "CA0003", "Nolder");
+
+TEST_END;
+
+#endif/*TEST_PRAXISD*/
diff --git a/server/src/praxisd.h b/server/src/praxisd.h
new file mode 100644
index 0000000..c0f6666
--- /dev/null
+++ b/server/src/praxisd.h
@@ -0,0 +1,141 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set et sw=2 ts=2: */
+/***************************************************************************
+ * praxisd.h
+ *
+ * Tue Apr 19 09:00:29 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.
+ */
+#ifndef __PRACRO_PRAXISD_H__
+#define __PRACRO_PRAXISD_H__
+
+#include <string>
+#include <vector>
+
+#include <curl/curl.h>
+
+#include <time.h>
+
+class Praxisd {
+public:
+ Praxisd(std::string host, int port);
+ ~Praxisd();
+
+ time_t journal_last_changed(std::string cpr);
+
+ // Get Journal By CPR
+ std::string journal_get_by_cpr(std::string cpr);
+
+ // Get Patient By CPR
+ typedef struct {
+ std::string sogenr;
+ std::string sogedato;
+ std::string sogetxt;
+ } sogeord_t;
+
+ typedef struct {
+ std::string cpr;
+ std::string fornavne;
+ std::string efternavn;
+ std::string stilling;
+ std::string gade;
+ std::string by;
+ std::string telefonnumre;
+ std::string sikringsgr;
+ std::string amtsnr;
+ std::string sygekontor;
+ std::string henvnr;
+ std::string frilinie1;
+ std::string frilinie2;
+ std::string frilinie3;
+ std::string frilinie4;
+ std::string frilinie5;
+ std::vector<sogeord_t> sogeord;
+ std::string ydernr;
+ std::string created;
+ std::string donottouch;
+ std::string visus;
+ std::string labkort;
+ std::string medkort;
+ std::string jlock;
+ std::string unknown1;
+ std::string henvdato;
+ std::string aarhund;
+ std::string fakturadato;
+ std::string fakturabelob;
+ std::string betaldato;
+ std::string betalbelob;
+ std::string jdato;
+ std::string unknown250;
+ std::string unknown251;
+ std::string jtime;
+ } patient_t;
+ patient_t patient_get_by_cpr(std::string cpr);
+
+#if 0
+ // Get Diverse From Sogenr
+ typedef struct {} diverse_t;
+ std::vector<diverse_t> diverse_get_all_by_sogenr(std::string sogenr);
+
+ // Get Aftale All by Date and Calendar
+ typedef struct {} aftale_t;
+ std::vector<aftale_t> aftale_get_all_by_date_and_calendar(int cal, int year,
+ int month, int day);
+
+ // Get Aftale All by CPR
+ std::vector<aftale_t> aftale_get_all_by_cpr(std::string cpr);
+
+ // Authenticate
+ bool authenticate(std::string user, std::string pass);
+
+ // Get Name by UserID
+ std::string user_get_name_by_id(std::string user);
+
+ // Get All Docmenu by CPR
+ typedef struct {} docmenu_t;
+ std::vector<docmenu_t> docmenu_get_all_by_cpr(std::string cpr);
+
+ // Get Docmenu by Name and CPR
+ std::string docmenu_get_by_cpr_and_name(std::string cpr, std::string name);
+#endif
+
+ // POST:
+ // Add To Journal
+ void journal_add(std::string cpr, std::string entry);
+
+ // Update Patient
+
+ // Add Sogeord to Patient
+ void add_sogeord(std::string cpr, std::string sogeord, std::string sogetxt);
+
+ // Update Aftale
+ // Add Aftale
+ // Delete Aftale
+ // Add File to Docmenu
+ // Delete File from Docmenu
+
+private:
+ CURL *ch;
+ std::string host;
+};
+
+#endif/*__PRACRO_PRAXISD_H__*/