diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp index c3d6ccfa9bd6ae1c4f4fad852e97fffc8f6ceb85..20545889cbb537ca6c72d50c8741b243fd728674 100644 --- a/src/gui/server/guiserverimpl.cpp +++ b/src/gui/server/guiserverimpl.cpp @@ -23,12 +23,12 @@ #include <sstream> #include <stdexcept> +#include "../../global.h" // for VERSION and PROGNAME #include "responsemessage.h" // default constructor GUIServerImpl::GUIServerImpl() { - _shouldQuit = false; } // destructor @@ -157,6 +157,7 @@ GUIServerImpl::hangupCall(const std::string& callId) try { short id = getIdFromCallId(callId); if (GuiFramework::hangupCall(id)) { + _callMap.erase(id); return true; } } catch(...) { @@ -165,6 +166,25 @@ GUIServerImpl::hangupCall(const std::string& callId) return false; } +bool +GUIServerImpl::hangupAll() +{ + bool result = true; + short id; + CallMap::iterator iter = _callMap.begin(); + // try to hangup every call, even if one fail + while(iter!=_callMap.end()) { + id = iter->first; + if (!GuiFramework::hangupCall(id)) { + result = false; + } else { + _callMap.erase(id); + } + iter++; + } + return result; +} + bool GUIServerImpl::dtmfCall(const std::string& callId, const std::string& dtmfKey) { @@ -178,6 +198,20 @@ GUIServerImpl::dtmfCall(const std::string& callId, const std::string& dtmfKey) return false; } +/** + * Version constant are in global.h + * @return the version (name number) + */ +std::string +GUIServerImpl::version() +{ + std::ostringstream version; + version << PROGNAME << " " << VERSION; + return version.str(); +} + + + int GUIServerImpl::incomingCall (short id) { diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h index 7ca6e04fe54f10a763051ce7f7643aa53dd2ecaf..839c2be0c6fa1ec4495e794fab05dad70a5eb29f 100644 --- a/src/gui/server/guiserverimpl.h +++ b/src/gui/server/guiserverimpl.h @@ -67,8 +67,10 @@ public: bool unholdCall(const std::string& callId); bool hangupCall(const std::string& callId); bool dtmfCall(const std::string& callId, const std::string& dtmfKey); + bool hangupAll(); - void quit() {_shouldQuit=true;} + std::string version(); + void quit() { _requestManager.quit(); } private: @@ -83,7 +85,6 @@ private: // RequestManager execute received request // and send response RequestManager _requestManager; - bool _shouldQuit; }; #endif // __GUI_SERVER_H__ diff --git a/src/gui/server/request.cpp b/src/gui/server/request.cpp index ec8704996ec390e190346e0582b3fb4f5c5750c7..2a7fad5c319f4532b1f101036e00bb210a177232 100644 --- a/src/gui/server/request.cpp +++ b/src/gui/server/request.cpp @@ -81,6 +81,15 @@ RequestHangup::execute() return message("500", "Hangup Error"); } +ResponseMessage +RequestHangupAll::execute() +{ + if ( GUIServer::instance().hangupAll() ) { + return message("200", "OK"); + } + return message("500", "Hangup Error"); +} + RequestDTMF::RequestDTMF(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId, argList) { @@ -112,17 +121,23 @@ RequestDTMF::execute() ResponseMessage RequestMute::execute() { - GUI::instance().muteOn(); + GUIServer::instance().mute(); return message("200","OK"); } ResponseMessage RequestUnmute::execute() { - GUI::instance().unmute(); + GUIServer::instance().unmute(); return message("200","OK"); } +ResponseMessage +RequestVersion::execute() +{ + return message("200",GUIServer::instance().version()); +} + ResponseMessage RequestQuit::execute() { diff --git a/src/gui/server/request.h b/src/gui/server/request.h index 4851952e735639268f8ce3ebd2a39631eb8e2f4c..7ab3b5d352159c1f37bbdec9b446c97bc9c8ef9e 100644 --- a/src/gui/server/request.h +++ b/src/gui/server/request.h @@ -170,11 +170,21 @@ public: RequestUnmute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} ResponseMessage execute(); }; +class RequestVersion : public RequestGlobal { +public: + RequestVersion(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} + ResponseMessage execute(); +}; class RequestQuit : public RequestGlobal { public: RequestQuit(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} ResponseMessage execute(); }; +class RequestHangupAll : public RequestGlobal { +public: + RequestHangupAll(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} + ResponseMessage execute(); +}; class RequestSyntaxError : public Request { diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp index 20995e9c40f5e4001c8e1b5d7680a63125ba0a4a..a433239506d8d4227a264441598e111fd2c65a2b 100644 --- a/src/gui/server/requestfactory.cpp +++ b/src/gui/server/requestfactory.cpp @@ -85,15 +85,17 @@ RequestFactory::registerRequest(const std::string &requestname) void RequestFactory::registerAll() { registerRequest<RequestSyntaxError> ("syntaxerror"); - registerRequest<RequestCall> ("call"); - registerRequest<RequestQuit> ("quit"); - registerRequest<RequestAnswer> ("answer"); - registerRequest<RequestRefuse> ("refuse"); - registerRequest<RequestHold> ("hold"); - registerRequest<RequestUnhold> ("unhold"); - registerRequest<RequestHangup> ("hangup"); - registerRequest<RequestDTMF> ("dtmf"); - registerRequest<RequestTransfer> ("transfer"); - registerRequest<RequestMute> ("mute"); - registerRequest<RequestUnmute> ("unmute"); -} + registerRequest<RequestCall> ("call"); + registerRequest<RequestAnswer> ("answer"); + registerRequest<RequestRefuse> ("refuse"); + registerRequest<RequestHold> ("hold"); + registerRequest<RequestUnhold> ("unhold"); + registerRequest<RequestHangup> ("hangup"); + registerRequest<RequestHangupAll> ("hangupall"); + registerRequest<RequestDTMF> ("dtmf"); + registerRequest<RequestTransfer> ("transfer"); + registerRequest<RequestMute> ("mute"); + registerRequest<RequestUnmute> ("unmute"); + registerRequest<RequestVersion> ("version"); + registerRequest<RequestQuit> ("quit"); +} diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp index 2dccf5d72f8857181612e56d463b1698b36b6c01..184426548a3fe5253e625a32242e045433eee327 100644 --- a/src/gui/server/requestmanager.cpp +++ b/src/gui/server/requestmanager.cpp @@ -26,6 +26,7 @@ RequestManager::RequestManager() : _sessionIO(0) { _factory.registerAll(); + _quit = false; } @@ -57,7 +58,7 @@ RequestManager::exec() // std::cin.good() is only there to close the server when // we do a CTRL+D - while(_sessionIO->good() && std::cin.good()) { + while(_sessionIO && _sessionIO->good() && std::cin.good() && !_quit) { if (_sessionIO->receive(input)) { _debug("Receive Input...: %s\n", input.c_str()); @@ -68,7 +69,6 @@ RequestManager::exec() handleExecutedRequest(request, outputResponse); } // end pop - } // end streaming delete _sessionIO; _sessionIO = 0; diff --git a/src/gui/server/requestmanager.h b/src/gui/server/requestmanager.h index 509fa3f81d10c094f98fbbc83dcdf4eed0c828c1..babfb7f91d55cd23bec4ee04fafa486e6079dce9 100644 --- a/src/gui/server/requestmanager.h +++ b/src/gui/server/requestmanager.h @@ -36,6 +36,7 @@ public: int exec(void); void sendResponse(const ResponseMessage& response); + void quit() { _quit = true; } private: void flushWaitingRequest(); @@ -47,6 +48,8 @@ private: // waiting requests ost::Mutex _waitingRequestsMutex; std::map<std::string, Request*> _waitingRequests; + + bool _quit; // tell to quit and end the exec loop }; #endif diff --git a/src/gui/server/tcpstreampool.h b/src/gui/server/tcpstreampool.h index 5e7afa9e45689ffca64de12aab6c382d46de3073..46f8e90af0d61e9389f48879652d0c59d8fe3d98 100644 --- a/src/gui/server/tcpstreampool.h +++ b/src/gui/server/tcpstreampool.h @@ -39,7 +39,10 @@ class TCPStreamPool : public ost::TCPSession { public: - TCPStreamPool(ost::TCPSocket& server) : ost::TCPSession(server) {} + TCPStreamPool(ost::TCPSocket& server) : ost::TCPSession(server) + { + setCancel(cancelDeferred); + } void run(); void send(const std::string& response);