diff --git a/server/Makefile b/server/Makefile index 3bec9b3..a4078dc 100644 --- a/server/Makefile +++ b/server/Makefile @@ -16,7 +16,7 @@ LDFLAGS_CGI= -lm -lc -lpthread -L/usr/local/lib -g -ggdb DEPENDFILE=.depend TARGET=modelbahn-server -SERVEROBJ=server.o network.o session.o server-loadsave.o \ +SERVEROBJ=server.o network.o webserver.o session.o server-loadsave.o \ main.o sensor.o turnout.o railway.o interfaces.o locomotive.o \ block.o interface.o interface-z21.o diff --git a/server/main.cc b/server/main.cc index 7c1863d..a8156ec 100644 --- a/server/main.cc +++ b/server/main.cc @@ -9,6 +9,7 @@ #include #include "modelbahn.h" +#include "webserver.h" void uprintf (UNIX *u, char *fmt,...); static void sig_int(int); // signal handler @@ -16,6 +17,7 @@ int running = 1; Server *server = NULL; Network *network = NULL; + int simulation = 0; int main (int argc, char **argv) { diff --git a/server/modelbahn.h b/server/modelbahn.h index 129cbf3..b8c4cf8 100644 --- a/server/modelbahn.h +++ b/server/modelbahn.h @@ -20,8 +20,9 @@ using namespace std; #define DEBUG_FILE "/tmp/modelbahn-server.log" -#include "UDPTCPNetwork.h" +#include +#include "webserver.h" #include "server.h" #include "turnout.h" #include "sensor.h" diff --git a/server/network.cc b/server/network.cc index da39da2..00fb216 100644 --- a/server/network.cc +++ b/server/network.cc @@ -49,8 +49,6 @@ Network::~Network() { void Network::ThreadProcess() { - list::iterator iteru; - UNIX *u; int i = 0; int timeout10s; @@ -65,21 +63,7 @@ void Network::ThreadProcess() { while (running) { // // check network - - // - // server socket - ServerLoop(); - - // - // client socket - for (iteru = clients.begin(); iteru != clients.end(); iteru++) { - if (ClientLoop((UNIX*) *iteru) < 0) { - u = *iteru; - clients.remove(u); - delete u; - iteru = clients.begin(); - } - } + webserver.Loop(); gettimeofday (&tv, NULL); i = (tv.tv_sec-tv_loop.tv_sec) * 1000 + (tv.tv_usec - tv_loop.tv_usec) / 1000; @@ -108,12 +92,11 @@ int Network::Start() { mtx = PTHREAD_MUTEX_INITIALIZER; // - // start socket server + // start the webserver // - if (sockserver.Listen(UNIX_SOCKET_FILE) != 1) { - return 0; - } - chmod(UNIX_SOCKET_FILE, 00666); + webserver.SetupDocumentRoot("webinterface"); + webserver.SetupPorts(1080, 1081); + webserver.Start(); thread_running = 1; pthread_attr_init (&attr); @@ -129,8 +112,7 @@ int Network::Start() { void Network::Stop() { - sockserver.Close(); - unlink(UNIX_SOCKET_FILE); + webserver.Stop(); } @@ -146,17 +128,6 @@ void Network::ChangeListPushToAll(string changes) { -int Network::ServerLoop() { - UNIX *u = NULL; - if (sockserver.IsData(10)) { - u = sockserver.Accept(); - clients.push_back(u); - } - - return 1; -}; - - Session *Network::GetSession(int sid) { Session *s = NULL; list::iterator iter; @@ -174,9 +145,8 @@ Session *Network::GetSession(int sid) { }; -int Network::ClientLoop(UNIX *client) { - char bufferin[BUFFERSIZE]; - int len, rid, sid; +int Network::ClientLoop(JSONParse *jpin, JSONParse *jpout) { + int rid, sid; list::iterator siter; Session *session = NULL; string value; @@ -187,101 +157,89 @@ int Network::ClientLoop(UNIX *client) { struct timeval timer; timer_start(&timer); + JSONParse jelement; - len = client->ReadTimeout(bufferin, BUFFERSIZE, 20); - if (len > 0 && len < BUFFERSIZE) { - JSONParse json; - JSONParse jsonout; - JSONParse jelement; - - bufferin[len] = 0; // prevent reading behind the data + if (jpin == NULL || jpout == NULL) return 0; + jpout->Clear(); - json.Set(bufferin); - if (!json.GetValue("sid", &ssid)) { - debug ("json.GetValue error --> sid"); - return 0; - } + if (!jpin->GetValue("sid", &ssid)) { + debug ("jpin->GetValue error --> sid"); + return 0; + } - if (!json.GetValue("rid", &srid)) { - debug ("json.GetValue error --> rid"); - return 0; - } + if (!jpin->GetValue("rid", &srid)) { + debug ("jpin->GetValue error --> rid"); + return 0; + } - // - try { - rid = stoi (srid); - } - catch (...) { - rid = 0; - debug ("rid error"); - } + // + try { + rid = stoi (srid); + } + catch (...) { + rid = 0; + debug ("rid error"); + } - try { - sid = stoi (ssid); - } - catch (...) { - sid = 0; - debug ("sid error"); - } + try { + sid = stoi (ssid); + } + catch (...) { + sid = 0; + debug ("sid error"); + } - if (sid <= 0) { - debug ("sid not set, gettin new SID"); - session = new Session(rid); - sid = session->GetSessionID(); - LockSessions(); - sessions.push_back(session); - UnLockSessions(); - } - else { - LockSessions(); - // - // search for session - session = NULL; - for (siter = sessions.begin(); siter != sessions.end(); siter++) { - if ((*siter)->GetRandomID() == rid && ((Session*)(*siter))->GetSessionID() == sid) { - session = (*siter); - break; - } + if (sid <= 0) { + debug ("sid not set, gettin new SID"); + session = new Session(rid); + sid = session->GetSessionID(); + LockSessions(); + sessions.push_back(session); + UnLockSessions(); + } + else { + LockSessions(); + // + // search for session + session = NULL; + for (siter = sessions.begin(); siter != sessions.end(); siter++) { + if ((*siter)->GetRandomID() == rid && ((Session*)(*siter))->GetSessionID() == sid) { + session = (*siter); + break; } - UnLockSessions(); } + UnLockSessions(); + } - if (session) { - JSONElement je; - int retval; - - retval = session->ProcessData(&json, &jsonout); - - len = BUFFERSIZE; - if (retval) { - je.Clear(); - je.Set("success", 1); - jsonout.AddObject(je); - je.Clear(); - je.Set("serverstatus", server->GetStatus()); - jsonout.AddObject(je); - je.Clear(); - je.Set("simulation", simulation); - jsonout.AddObject(je); - } - else { - je.Clear(); - je.Set("success", 0); - jsonout.AddObject(je); - je.Clear(); - je.Set("serverstatus", "ERROR"); - jsonout.AddObject(je); - } - s = jsonout.ToString(); - client->Write((char*)s.c_str(), strlen(s.c_str())); - result = 1; + if (session) { + JSONElement je; + int retval; + + retval = session->ProcessData(jpin, jpout); + + if (retval) { + je.Clear(); + je.Set("success", 1); + jpout->AddObject(je); + je.Clear(); + je.Set("serverstatus", server->GetStatus()); + jpout->AddObject(je); + je.Clear(); + je.Set("simulation", simulation); + jpout->AddObject(je); } else { - // no session found - result = 0; + je.Clear(); + je.Set("success", 0); + jpout->AddObject(je); + je.Clear(); + je.Set("serverstatus", "ERROR"); + jpout->AddObject(je); } + result = 1; } - else if (len == 0) { + else { + // no session found result = 0; } diff --git a/server/network.h b/server/network.h index 0290d2d..972b015 100644 --- a/server/network.h +++ b/server/network.h @@ -27,6 +27,7 @@ using namespace std; +#include "webserver.h" #include "modelbahn.h" extern int next_sessionID; @@ -99,17 +100,13 @@ private: void ThreadProcess(); pthread_mutex_t mtx; pthread_mutex_t mtxsessions; + SimpleWebServer webserver; pthread_t thread; int thread_running; list sessions; - list clients; - Session *GetSession(int Sid); - int ServerLoop(); // loop for network connection and call clientloop if needed - int ClientLoop(UNIX *u); - UNIX sockserver; friend class Session; public: @@ -126,6 +123,7 @@ public: void ChangeListPushToAll (string changes); // adds JSON compat. change string too all clients int isRunning() { return thread_running; } + int ClientLoop(JSONParse *jpin, JSONParse *jpout); protected: static void *ThreadEntry (void *This) { ((Network*)This)->ThreadProcess(); return NULL;}; };