91 lines
1.7 KiB
C++
91 lines
1.7 KiB
C++
#include "cdevSystem.h"
|
|
#include "cdevSessionManager.h"
|
|
|
|
class GENERIC_SERVER_API cdevSystemEventHandler : public cdevEventHandler
|
|
{
|
|
private:
|
|
int cdevfd;
|
|
|
|
public:
|
|
cdevSystemEventHandler ( cdevReactor & Reactor, int fd )
|
|
: cdevfd(fd)
|
|
{
|
|
Reactor.registerHandler(this, READ_MASK|WRITE_MASK|EXCEPT_MASK);
|
|
}
|
|
|
|
~cdevSystemEventHandler ( void )
|
|
{
|
|
if(reactor) reactor->extractHandler(this);
|
|
handleClose();
|
|
}
|
|
|
|
int handleInput ( void )
|
|
{
|
|
cdevSystem::defaultSystem().poll();
|
|
return 0;
|
|
}
|
|
|
|
int handleOutput ( void )
|
|
{
|
|
cdevSystem::defaultSystem().flush();
|
|
return 0;
|
|
}
|
|
|
|
int handleExcept ( void )
|
|
{
|
|
cdevSystem::defaultSystem().poll();
|
|
return 0;
|
|
}
|
|
|
|
int getHandle ( void ) const
|
|
{
|
|
return cdevfd;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
class GENERIC_SERVER_API cdevSystemEventManager : public cdevEventHandler
|
|
{
|
|
public:
|
|
cdevSystemEventManager ( cdevReactor &Reactor=cdevSessionManager::Reactor, double Rate = 30.0 )
|
|
{
|
|
setTimeoutRate(Rate);
|
|
Reactor.registerTimer(this);
|
|
cdevSystem::defaultSystem().addFdChangedCallback
|
|
(cdevSystemEventManager::fdChangedCallback, this);
|
|
}
|
|
|
|
~cdevSystemEventManager ( void )
|
|
{
|
|
if(reactor) reactor->extractHandler(this);
|
|
handleClose();
|
|
}
|
|
|
|
int handleTimeout ( void )
|
|
{
|
|
cdevSystem::defaultSystem().pend(0.0001);
|
|
return 0;
|
|
}
|
|
|
|
static void fdChangedCallback ( int fd, int opened, void * arg )
|
|
{
|
|
cdevSystemEventManager *manager = (cdevSystemEventManager *)arg;
|
|
cdevEventHandler *handler;
|
|
cdevReactor *reactor = manager->reactor;
|
|
|
|
if(reactor)
|
|
{
|
|
if(opened && reactor->getHandler(fd, handler)!=0)
|
|
{
|
|
handler = new cdevSystemEventHandler(*reactor, fd);
|
|
}
|
|
else if(!opened && reactor->getHandler(fd, handler)==0)
|
|
{
|
|
delete handler;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|