#ifndef __InputFramework_h_ #define __InputFramework_h_ #include #include "Messages.h" #include "SelectableRequestQueue.h" #include "ThreadClass.h" class NewInputRequest : public Request { private: const std::string _newInput; const bool _eof; const bool _newSocket; public: NewInputRequest(SocketInfo *socket, std::string newInput, int id) : Request(socket), _newInput(newInput), _eof(newInput.empty()), _newSocket(false) { callbackId = id; } NewInputRequest(SocketInfo *socket, int id) : Request(socket), _newInput(""), _eof(false), _newSocket(true) { callbackId = id; } std::string getNewInput() const { return _newInput; } bool atEOF() const { return _eof; } bool newSocket() const { return _newSocket; } }; // This is the main framework object which will listen on a socket // for new connections, then listen on each connection for new data. class InputListener : ThreadClass, public NewSocketListener, NoCopy, NoAssign { private: enum { mtNewSocket, mtQuit }; SelectableRequestQueue _incomingRequests; RequestListener *_requestListener; int _outgoingRequestId; protected: void threadFunction(); public: // Get new data. We accept new sockets, rather than a port number, // as input to allow for more complicated types of input. We can, // for example, listen to multiple ports. void listenToNewSocket(SocketInfo *socketInfo); // Need someone to do the application specific part of the work. InputListener(RequestListener *requestListener, int requestId); ~InputListener(); }; #endif