telldus/telldus-core/service/TelldusMain.cpp

109 lines
3.2 KiB
C++

#include "TelldusMain.h"
#include "ConnectionListener.h"
#include "EventHandler.h"
#include "ClientCommunicationHandler.h"
#include "DeviceManager.h"
#include "ControllerManager.h"
#include "ControllerListener.h"
#include "EventUpdateManager.h"
#include <stdio.h>
#include <list>
#include <memory>
class TelldusMain::PrivateData {
public:
EventHandler eventHandler;
EventRef stopEvent, controllerChangeEvent;
};
TelldusMain::TelldusMain(void)
{
d = new PrivateData;
d->stopEvent = d->eventHandler.addEvent();
d->controllerChangeEvent = d->eventHandler.addEvent();
}
TelldusMain::~TelldusMain(void) {
delete d;
}
void TelldusMain::deviceInsertedOrRemoved(int vid, int pid, bool inserted) {
ControllerChangeEventData *data = new ControllerChangeEventData;
data->vid = vid;
data->pid = pid;
data->inserted = inserted;
d->controllerChangeEvent->signal(data);
}
void TelldusMain::start(void) {
EventRef clientEvent = d->eventHandler.addEvent();
EventRef dataEvent = d->eventHandler.addEvent();
ControllerManager controllerManager(dataEvent.get());
EventUpdateManager eventUpdateManager;
EventRef deviceUpdateEvent = eventUpdateManager.retrieveUpdateEvent();
eventUpdateManager.start();
DeviceManager deviceManager(&controllerManager, deviceUpdateEvent);
ConnectionListener clientListener(L"TelldusClient", clientEvent);
std::list<ClientCommunicationHandler *> clientCommunicationHandlerList;
EventRef handlerEvent = d->eventHandler.addEvent();
#ifdef _MACOSX
//This is only needed on OS X
ControllerListener controllerListener(d->controllerChangeEvent);
#endif
while(!d->stopEvent->isSignaled()) {
if (!d->eventHandler.waitForAny()) {
continue;
}
if (clientEvent->isSignaled()) {
//New client connection
EventDataRef eventDataRef = clientEvent->takeSignal();
ConnectionListenerEventData *data = reinterpret_cast<ConnectionListenerEventData*>(eventDataRef.get());
if (data) {
ClientCommunicationHandler *clientCommunication = new ClientCommunicationHandler(data->socket, handlerEvent, &deviceManager, deviceUpdateEvent);
clientCommunication->start();
clientCommunicationHandlerList.push_back(clientCommunication);
}
}
if (d->controllerChangeEvent->isSignaled()) {
EventDataRef eventDataRef = d->controllerChangeEvent->takeSignal();
ControllerChangeEventData *data = reinterpret_cast<ControllerChangeEventData*>(eventDataRef.get());
if (data) {
controllerManager.deviceInsertedOrRemoved(data->vid, data->pid, "", data->inserted);
}
}
if (dataEvent->isSignaled()) {
EventDataRef eventData = dataEvent->takeSignal();
ControllerEventData *data = reinterpret_cast<ControllerEventData*>(eventData.get());
if (data) {
deviceManager.handleControllerMessage(*data);
}
}
if (handlerEvent->isSignaled()) {
handlerEvent->popSignal();
for ( std::list<ClientCommunicationHandler *>::iterator it = clientCommunicationHandlerList.begin(); it != clientCommunicationHandlerList.end(); ){
if ((*it)->isDone()){
delete *it;
it = clientCommunicationHandlerList.erase(it);
} else {
++it;
}
}
}
}
}
void TelldusMain::stop(void){
d->stopEvent->signal();
}