diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 6311881d3dc7ef330663463380ec9eca4e6e1d31..1fba455958d9eacd1025b7f83cb49ec718205e30 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -6,8 +6,7 @@ SUBDIRS = $(officialdir) qt server noinst_LTLIBRARIES = libguiframework.la -libguiframework_la_SOURCES = \ - guiframework.cpp guiframework.h +libguiframework_la_SOURCES = guiframework.cpp guiframework.h libguiframework_la_CPPFLAGS = -I$(top_srcdir) libguiframework_la_CXXFLAGS = $(libccext2_CFLAGS) diff --git a/src/gui/server/Makefile.am b/src/gui/server/Makefile.am index 8db981b80d6e2e6d8fa6c7a3a7462bc86f0c68dd..7e523e574a5a7b98bd3ed0c6379600c9b355d345 100644 --- a/src/gui/server/Makefile.am +++ b/src/gui/server/Makefile.am @@ -8,4 +8,5 @@ libsflphoneguiserver_la_LIBADD = AM_CPPFLAGS = -I$(top_srcdir) $(libccext2_CFLAGS) -noinst_HEADERS = responsemessage.h request.h requestfactory.h subcall.h +noinst_HEADERS = responsemessage.h request.h requestfactory.h subcall.h \ + argtokenizer.h diff --git a/src/gui/server/request.h b/src/gui/server/request.h index b9d81306505073ec15efe0e2a0084d4f2f2b446b..3701debcb91a31707512c6d656da689deca847f2 100644 --- a/src/gui/server/request.h +++ b/src/gui/server/request.h @@ -21,8 +21,11 @@ #define __REQUEST_H__ #include <string> +#include <list> #include "responsemessage.h" +typedef std::list<std::string> TokenList; + /** Request are received from the client and execute on the server @@ -30,10 +33,14 @@ Request execution always return a ResponseMessage @author Yan Morin */ class GUIServer; + +class RequestConstructorException { +}; + class Request { public: - Request(const std::string &sequenceId, const std::string &arg) : _sequenceId(sequenceId), _arg(arg) {} + Request(const std::string &sequenceId, const TokenList& argList) : _sequenceId(sequenceId), _argList(argList) {} virtual ~Request() {} virtual ResponseMessage execute(GUIServer& gui) = 0; ResponseMessage message(const std::string &code, const std::string &message) { @@ -44,99 +51,114 @@ public: protected: std::string _sequenceId; - std::string _arg; + TokenList _argList; }; -class RequestGlobalCall : public Request -{ +class RequestCall : public Request { public: - RequestGlobalCall(const std::string &sequenceId, const std::string &arg) : Request(sequenceId,arg) { - unsigned int spacePos = _arg.find(' '); - if (spacePos == std::string::npos) { - // only one argument, so it's must be the callId - _callId = _arg; - } else { - _callId = _arg.substr(0, spacePos); - _arg = _arg.substr(spacePos+1, _arg.size()-spacePos+1); + RequestCall(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId,argList) { + TokenList::iterator iter = _argList.begin(); + // check for the callid + bool argsAreValid = false; + // Args are: account callid destination + // acc1000 c10345 sip:test@test.com + if (iter != _argList.end() && iter->find("acc")==0) { + _account = *iter; + _argList.pop_front(); + iter = _argList.begin(); + // a call method can only begin by 'c' since it's only the client that + // call with method + if (iter != _argList.end() && (*iter)[0]=='c') { + _callId = *iter; + iter++; + // last arg is the destination + if (iter != _argList.end()) { + _destination = *iter; + argsAreValid = true; + } + } + } + if (!argsAreValid) { + throw RequestConstructorException(); } } - virtual ~RequestGlobalCall() {} - virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); } + virtual ResponseMessage execute(GUIServer& gui); -protected: +private: std::string _callId; + std::string _destination; + std::string _account; }; -class RequestCall : public RequestGlobalCall { + +class RequestGlobalCall : public Request +{ public: - RequestCall(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) { - // only one argument, so it's must be the account (that switch is JP fault) - _account = _callId; - _callId = ""; - unsigned int spacePos = _arg.find(' '); - if (spacePos == std::string::npos) { - _callId = _arg; + RequestGlobalCall(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId, argList) { + TokenList::iterator iter = _argList.begin(); + if (iter != _argList.end() && ((*iter)[0]=='c' || (*iter)[0]=='s') ) { + _callId = *iter; + _argList.pop_front(); } else { - _callId = _arg.substr(0, spacePos); - _destination = _arg.substr(spacePos+1, _arg.size()-spacePos+1); + throw RequestConstructorException(); } } - virtual ResponseMessage execute(GUIServer& gui); + virtual ~RequestGlobalCall() {} + virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); } -private: - std::string _destination; - std::string _account; +protected: + std::string _callId; }; class RequestAnswer : public RequestGlobalCall { public: - RequestAnswer(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {} + RequestAnswer(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {} }; class RequestRefuse : public RequestGlobalCall { public: - RequestRefuse(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {} + RequestRefuse(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {} }; class RequestHold : public RequestGlobalCall { public: - RequestHold(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {} + RequestHold(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {} }; class RequestUnhold : public RequestGlobalCall { public: - RequestUnhold(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {} + RequestUnhold(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {} }; class RequestTransfer : public RequestGlobalCall { public: - RequestTransfer(const std::string &sequenceId, const std::string &arg) : RequestGlobalCall(sequenceId,arg) {} + RequestTransfer(const std::string &sequenceId, const TokenList& argList) : RequestGlobalCall(sequenceId,argList) {} }; class RequestGlobal : public Request { public: - RequestGlobal(const std::string &sequenceId, const std::string &arg) : Request(sequenceId,arg) {} + RequestGlobal(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId,argList) {} virtual ~RequestGlobal() {} virtual ResponseMessage execute(GUIServer& gui) { return message("200","OK"); } }; class RequestMute : public RequestGlobal { public: - RequestMute(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {} + RequestMute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} }; class RequestUnmute : public RequestGlobal { public: - RequestUnmute(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {} + RequestUnmute(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} }; class RequestQuit : public RequestGlobal { public: - RequestQuit(const std::string &sequenceId, const std::string &arg) : RequestGlobal(sequenceId,arg) {} + RequestQuit(const std::string &sequenceId, const TokenList& argList) : RequestGlobal(sequenceId,argList) {} }; class RequestSyntaxError : public Request { public: - RequestSyntaxError(const std::string &sequenceId, const std::string &arg) : Request(sequenceId, arg) {} + RequestSyntaxError(const std::string &sequenceId, const TokenList& argList) : Request(sequenceId, argList) {} ~RequestSyntaxError() {} ResponseMessage execute(GUIServer& gui) { return message("501", "Syntax Error"); diff --git a/src/gui/server/requestfactory.cpp b/src/gui/server/requestfactory.cpp index 0593a78c5e73970ad74beae6ad0f395bf494ca52..ae76e5c1fbad97a551c16634786f7baca388dce1 100644 --- a/src/gui/server/requestfactory.cpp +++ b/src/gui/server/requestfactory.cpp @@ -23,48 +23,39 @@ #include "request.h" Request * -RequestFactory::create(const std::string &requestLine) +RequestFactory::create(const std::string& requestLine) { - std::string requestName; - std::string sequenceId="seq0"; - std::string arguments; - unsigned int spacePos = requestLine.find(' '); - // we find a spacePos - if (spacePos != std::string::npos) { - /* - 012345678901234 - call seq1 cdddd - spacePos = 4 - spacePos2 = 9 - 0 for 4 = 0 for spacePos - 5 for 4 = (spacePos+1 for spacePos2-spacePos-1) - 10 for 5 = (spacePos2+1 for size - spacePos2+1) - */ - requestName = requestLine.substr(0, spacePos); - - unsigned int spacePos2 = requestLine.find(' ', spacePos+1); - if (spacePos2 == std::string::npos) { - // command that end with a sequence number - sequenceId = requestLine.substr(spacePos+1, requestLine.size()-spacePos+1); - } else { - sequenceId = requestLine.substr(spacePos+1, spacePos2-spacePos-1); - arguments = requestLine.substr(spacePos2+1, requestLine.size()-spacePos2+1); + TokenList tList = _tokenizer.tokenize(requestLine); + TokenList::iterator iter = tList.begin(); + // there is atleast one token (the command) + if (iter != tList.end()) { + std::string requestName = *iter; + tList.pop_front(); + iter = tList.begin(); + // there is atleast a second token (the sequenceId) + if (iter != tList.end() && iter->find("seq") == 0 ) { + std::string sequenceId = *iter; + tList.pop_front(); + try { + Request *r = create(requestName, sequenceId, tList); + return r; + } catch (...) { + // if the create return an exception + // we create a syntaxerror + } } - } else { - requestName = "syntaxerror"; } - - return create(requestName, sequenceId, arguments); + return create("syntaxerror", "seq0", tList); } Request * RequestFactory::create( - const std::string &requestname, - const std::string &sequenceId, - const std::string &arg) + const std::string& requestName, + const std::string& sequenceId, + const TokenList& argList) { - std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestname); + std::map< std::string, RequestCreatorBase * >::iterator pos = mRequests.find(requestName); if(pos == mRequests.end()) { pos = mRequests.find("syntaxerror"); if(pos == mRequests.end()) { @@ -72,7 +63,7 @@ RequestFactory::create( } } - return pos->second->create(sequenceId, arg); + return pos->second->create(sequenceId, argList); } template< typename T > diff --git a/src/gui/server/requestfactory.h b/src/gui/server/requestfactory.h index 1d84c4bb943597d90dfa624ec09d1df9cb1a30b4..39f74e024d09584950b782f9fbfd2634679f793a 100644 --- a/src/gui/server/requestfactory.h +++ b/src/gui/server/requestfactory.h @@ -23,6 +23,7 @@ #include <map> #include "request.h" +#include "argtokenizer.h" class Request; /** @@ -30,7 +31,7 @@ class Request; class RequestCreatorBase { public: - virtual Request *create(const std::string &sequenceId, const std::string &arg) = 0; + virtual Request *create(const std::string &sequenceId, const TokenList& argList) = 0; virtual RequestCreatorBase *clone() = 0; }; @@ -38,9 +39,9 @@ template< typename T > class RequestCreator : public RequestCreatorBase { public: - virtual Request *create(const std::string &sequenceId, const std::string &arg) + virtual Request *create(const std::string &sequenceId, const TokenList& argList) { - return new T(sequenceId, arg); + return new T(sequenceId, argList); } virtual RequestCreatorBase *clone() @@ -53,17 +54,18 @@ public: class RequestFactory { public: - Request *create(const std::string &requestLine); + Request *create(const std::string& requestLine); Request *create( - const std::string &requestname, - const std::string &sequenceId, - const std::string &arg); + const std::string& requestname, + const std::string& sequenceId, + const TokenList& argList); template< typename T > - void registerRequest(const std::string &requestname); + void registerRequest(const std::string& requestname); void registerAll(); private: std::map< std::string, RequestCreatorBase * > mRequests; + ArgTokenizer _tokenizer; };