summaryrefslogtreecommitdiff
path: root/server/src/queryhandlerpentominos.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/queryhandlerpentominos.cc')
-rw-r--r--server/src/queryhandlerpentominos.cc262
1 files changed, 200 insertions, 62 deletions
diff --git a/server/src/queryhandlerpentominos.cc b/server/src/queryhandlerpentominos.cc
index c5450b3..b67f731 100644
--- a/server/src/queryhandlerpentominos.cc
+++ b/server/src/queryhandlerpentominos.cc
@@ -28,103 +28,241 @@
#include "debug.h"
-#include "configuration.h"
+#include <config.h>
-QueryHandlerPentominos::QueryHandlerPentominos(std::string cpr)
- : QueryHandler()
+// For time
+#include <time.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// For getpid
+#include <unistd.h>
+#include <sys/types.h>
+
+// For time
+#include <time.h>
+
+// For strerror and errno
+#include <errno.h>
+
+// For socket and friends
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+
+// For ioctl
+#include <sys/ioctl.h>
+
+#include "queryparser.h"
+
+typedef struct {
+ in_addr_t ip;
+ time_t time;
+ pid_t pid;
+ unsigned short int count;
+} UID;
+
+#define SIOCGIFCONF 0x8912 // get iface list
+/*
+static in_addr_t getIP(const char *interface)
{
- this->cpr = cpr;
+ in_addr_t ret = 0;
+ int numreqs = 30, sd, n;
+ struct ifconf ifc;
+ struct ifreq *ifr;
+ struct in_addr *ia;
- atfh = atf_init();
+ sd = socket(AF_INET, SOCK_STREAM, 0);
+ if(sd == -1) {
+ // throw Pentominos::UIDCouldNotConnectException(strerror(errno));
+ }
+
+ ifc.ifc_buf = NULL;
+ ifc.ifc_len = sizeof(struct ifreq) * numreqs;
+
+ ifc.ifc_buf = (char*)malloc(ifc.ifc_len);
+ if(ifc.ifc_buf == NULL) {
+ // throw Pentominos::UIDOutOfMemoryException();
+ }
+
+ if (ioctl(sd, SIOCGIFCONF, &ifc) < 0) {
+ // throw Pentominos::UIDInterfaceListException(strerror(errno));
+ }
- bool use_https = false;
- atfc = atf_connect(atfh, Conf::pentominos_addr.c_str(),
- Conf::pentominos_port, use_https);
+ ifr = ifc.ifc_req;
+ for (n = 0; n < ifc.ifc_len; n += sizeof(struct ifreq)) {
+ ia = (struct in_addr *)((ifr->ifr_ifru.ifru_addr.sa_data)+2);
+ if(!strcmp(ifr->ifr_ifrn.ifrn_name, interface)) {
+ ret = *(in_addr_t*)ia;
+ }
+ ifr++;
+ }
+ if(!ret) { // Still no interface... We're fucked!
+ // throw Pentominos::UIDInterfaceException(interface);
+ }
+
+ free(ifc.ifc_buf);
+ return ret;
}
-QueryHandlerPentominos::~QueryHandlerPentominos()
+
+static unsigned short counter = 0;
+static unsigned short getCounter()
{
- atf_disconnect(atfc);
- atf_close(atfh);
+ return counter++;
}
-static QueryResult node2result(atf_result_node_t *node, time_t timestamp)
+
+static UID uid = {0,0,0,0};
+static std::string getUID(const char *interface)
{
- QueryResult rnode;
- rnode.timestamp = timestamp;
- rnode.source = "pentominos";
-
- if(!node) return rnode;
-
- struct _atf_result_node_t *child = node->child;
- while(child) {
- if(child->value == NULL) {
- rnode.groups[child->name] = node2result(child, timestamp);
- } else {
- rnode.values[child->name] = child->value;
- }
- child = child->next;
- }
+ if(!uid.ip) uid.ip = getIP(interface);
+
+ time_t t = time(NULL);
+ if(uid.time != t) counter = 0; // If time differes, reset the counter
+ uid.time = t; // We need this value every time.
+
+ if(!uid.pid) uid.pid = getpid();
- return rnode;
+ uid.count = getCounter();
+
+ char buf[32];
+ sprintf(buf, "%08x%08x%04x%04x", uid.ip, (unsigned int)uid.time, uid.pid, uid.count);
+ return std::string(buf);
+}
+*/
+
+QueryHandlerPentominos::QueryHandlerPentominos(Artefact &atf,
+ std::string patientid,
+ std::string user)
+ : QueryHandler(), artefact(atf)
+{
+ this->patientid = patientid;
+ this->user = user;
}
QueryResult QueryHandlerPentominos::exec(Query &query)
{
- atf_transaction_t* atft = NULL;
- atf_reply_t *reply = NULL;
- atf_result_t *result = NULL;
- atf_result_node_t *root = NULL;
- atf_status_t status;
- time_t timestamp;
- atf_id id;
+ return artefact.exec(query, patientid, user);
+
+#if 0
+ time_t timestamp = time(NULL);
+ std::string uid = getUID("eth0");
- QueryResult rroot;
- rroot.timestamp = timestamp;
- rroot.source = "pentominos";
+ char buf[512];
+ char header[] =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<artefact xmlns=\"http://www.aasimon.org/pentominos\"\n"
+ " xmlns:pentominos=\"http://www.aasimon.org/pentominos\"\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+ " xsi:schemaLocation=\"http://www.aasimon.org/pentominos schema.xsd\">\n";
+#ifndef WITHOUT_PENTOMINOS
+ artefact.socket.write(header, strlen(header));
+#endif/*WITHOUT_PENTOMINOS*/
- atft = atf_new_transaction(atfc, cpr.c_str());
- if(!atft) goto aaarg;
+ PRACRO_DEBUG(queryhandler, "%s", header);
- id = atf_add_query(atft, query.attributes["class"].c_str(),
- FILTER_LATEST, USE_NONE, 0, 0);
- if(!atft) goto aaarg;
+ sprintf(buf, " <pentominos:entry replyformat=\"xml\"\n"
+ " cpr=\"%s\"\n"
+ " operator=\"%s\"\n"
+ " src_addr=\"%s\"\n"
+ " dst_addr=\"%s\"\n"
+ " timestamp=\"%d\"\n"
+ " uid=\"%s\"/>\n",
+ cpr.c_str(),
+ "pracro",
+#ifndef WITHOUT_PENTOMINOS
+ artefact.socket.srcaddr().c_str(),
+ artefact.socket.dstaddr().c_str(),
+#else
+ "127.0.0.1",
+ "127.0.0.1",
+#endif/*WITHOUT_PENTOMINOS*/
+ (unsigned int)timestamp,
+ uid.c_str());
+#ifndef WITHOUT_PENTOMINOS
+ artefact.socket.write(buf, strlen(buf));
+#endif/*WITHOUT_PENTOMINOS*/
- reply = atf_commit(atft);
- if(!reply) goto aaarg;
+ PRACRO_DEBUG(queryhandler, "%s", buf);
- if(atf_get_num_results(reply, id) != 1) goto aaarg;
+ sprintf(buf, " <pentominos:query device_id=\"%s\"\n"
+ " device_type=\"%s\"\n"
+ " filter=\"latest\"\n"
+ " location=\"all\"/>\n",
+ query.attributes["class"].c_str(),
+ query.attributes["class"].c_str());
+
+#ifndef WITHOUT_PENTOMINOS
+ artefact.socket.write(buf, strlen(buf));
+#endif/*WITHOUT_PENTOMINOS*/
- result = atf_get_result(reply, id, 0);
- if(!result) goto aaarg;
+ PRACRO_DEBUG(queryhandler, "%s", buf);
- status = atf_get_result_status(result, NULL, 0);
- if(status != ATF_STATUS_OK) goto aaarg;
-
- timestamp = atf_get_result_timestamp(result);
+ sprintf(buf, "</artefact>");
- root = atf_get_result_node(result);
- if(!root) goto aaarg;
+#ifndef WITHOUT_PENTOMINOS
+ artefact.socket.write(buf, strlen(buf));
+#endif/*WITHOUT_PENTOMINOS*/
- {
- QueryResult qresult = node2result(root, timestamp);
- rroot.groups[query.attributes["class"]] = qresult;
+ PRACRO_DEBUG(queryhandler, "%s", buf);
+
+ QueryResult result;
+
+#ifndef WITHOUT_PENTOMINOS
+ QueryParser parser;
+
+ ssize_t size;
+
+ // Read until we've got the entire result.
+ while((size = artefact.socket.read(buf, sizeof(buf))) > 0) {
+ // fwrite(buf, size, 1, stdout); fflush(stdout);
+ if(parser.parse(buf, size)) break;
}
- aaarg:
- if(root) atf_free_result_node(root);
- if(reply) atf_free_reply(reply);
- if(atft) atf_free_transaction(atft);
+ result = parser.result;
+#endif/*WITHOUT_PENTOMINOS*/
+
+ PRACRO_INFO(queryhandler, "Done handling query\n");
+
+ result.print();
- return rroot;
+ return result;
+#endif
+ return QueryResult();
}
#ifdef TEST_QUERYHANDLERPENTOMINOS
int main()
{
+#ifdef WITHOUT_PENTOMINOS
+ printf("The project need to be configured for use of Pentominos in order to run this test.\n");
return 1;
+#endif/*WITHOUT_PENTOMINOS*/
+
+ TCPSocket s;
+ try {
+ s.connect("localhost", 11108);
+ } catch(Exception &e) {
+ printf("ERROR: %s\n", e.what());
+ printf("A running instance of the artefact server in needed on localhost, port 11108 in order for this test to run.\n");
+ return 1;
+ }
+
+ QueryHandlerPentominos qh(s, "2003791613");
+
+ Query q1;
+ q1.attributes["device_id"] = "lensmeter";
+ q1.attributes["device_type"] = "lensmeter";
+ QueryResult res = qh.exec(q1);
+ res.print();
+
+ return 0;
}
#endif/*TEST_QUERYHANDLERPENTOMINOS*/