From 158aadf2a79a109f56866f2cc2da1d16ca4051a7 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 19 Oct 2011 10:47:42 +0200 Subject: Make error handling for sync connection. --- client/luapraxisd.cc | 10 ++++++++++ client/praxisd.cc | 37 +++++++++++++++++++++++++++++++++++++ client/praxisd.h | 12 +++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/client/luapraxisd.cc b/client/luapraxisd.cc index 0696674..11d619e 100644 --- a/client/luapraxisd.cc +++ b/client/luapraxisd.cc @@ -52,6 +52,11 @@ static int px_getcave(lua_State *L) QVector cavelist; Patient patient = pxu->px->patient_get_by_cpr(cpr); + if(pxu->px->hasError()) { + lua_pushstring(L, pxu->px->errorString().toStdString().c_str()); + lua_error(L); + return 1; + } QVector::iterator i = patient.sogeord.begin(); while(i != patient.sogeord.end()) { QString cavesogeord = i->sogenr;//.mid(1, i->sogenr.size() - 1); @@ -81,6 +86,11 @@ static int px_cavelist(lua_State *L) luaL_argcheck(L, pxu, 1, "Praxisd expected"); QVector cavelist = pxu->px->diverse_get_cave(""); + if(pxu->px->hasError()) { + lua_pushstring(L, pxu->px->errorString().toStdString().c_str()); + lua_error(L); + return 1; + } lua_createtable(L, 0, cavelist.size()); int top = lua_gettop(L); diff --git a/client/praxisd.cc b/client/praxisd.cc index 740825e..5a0d88e 100644 --- a/client/praxisd.cc +++ b/client/praxisd.cc @@ -295,14 +295,25 @@ PraxisdSync::PraxisdSync(QString host, unsigned short int port) { this->host = host; this->port = port; + this->running = true; start(); } +PraxisdSync::~PraxisdSync() +{ + this->running = false; + wsem.release(); + wait(); +} + void PraxisdSync::run() { Praxisd praxisd(host, port); + connect(&praxisd, SIGNAL(networkError(QString)), + this, SLOT(networkError(QString)), Qt::DirectConnection); + connect(&praxisd, SIGNAL(gotCaveList(CaveVector)), this, SLOT(gotCaveList(CaveVector)), Qt::DirectConnection); @@ -314,7 +325,13 @@ void PraxisdSync::run() while(true) { wsem.acquire(); + + // Reset error state + error = false; + errorStr = ""; + if(this->running == false) break; + switch(request_type) { case Praxisd::journal: break; @@ -333,6 +350,26 @@ void PraxisdSync::run() exec(); } + + rsem.release(); +} + +bool PraxisdSync::hasError() +{ + return error; +} + +QString PraxisdSync::errorString() +{ + return errorStr; +} + +void PraxisdSync::networkError(QString err) +{ + error = true; + errorStr = err; + rsem.release(); + quit(); } void PraxisdSync::gotCaveList(CaveVector cl) diff --git a/client/praxisd.h b/client/praxisd.h index 1268be7..0989274 100644 --- a/client/praxisd.h +++ b/client/praxisd.h @@ -156,6 +156,7 @@ class PraxisdSync : public QThread { Q_OBJECT public: PraxisdSync(QString host, unsigned short int port); + ~PraxisdSync(); QString journal_get_by_cpr(QString patientid); CaveVector diverse_get_cave(QString sogenr); @@ -163,9 +164,13 @@ public: DokMenuVector dokmenu_get_all_by_cpr(QString cpr); QString dokmenu_get_by_cpr_and_name(QString cpr, QString name); + bool hasError(); + QString errorString(); + void run(); -public slots: +private slots: + void networkError(QString); void gotCaveList(CaveVector); void gotPatient(Patient); void gotDokMenu(DokMenuVector); @@ -184,6 +189,11 @@ private: CaveVector cavelist; Patient patient; DokMenuVector dokmenu; + + volatile bool running; + + bool error; + QString errorStr; }; #endif/*__PRACRO_PRAXISD_H__*/ -- cgit v1.2.3