diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h index 0568de6e784b27d53df397af6508342db4431571..24831ff2826d88e880a0379d7fd961fc2363a118 100644 --- a/src/gui/guiframework.h +++ b/src/gui/guiframework.h @@ -37,18 +37,15 @@ public: virtual void peerAnsweredCall (short id) = 0; virtual int peerRingingCall (short id) = 0; virtual int peerHungupCall (short id) = 0; + virtual void displayStatus (const std::string& status) = 0; + virtual void displayConfigError (const std::string& error) = 0; virtual void displayTextMessage (short id, const std::string& message) = 0; virtual void displayErrorText (short id, const std::string& message) = 0; virtual void displayError (const std::string& error) = 0; - virtual void displayStatus (const std::string& status) = 0; - virtual void displayContext (short id) = 0; - virtual void setup (void) = 0; - //virtual int selectedCall (void) = 0; - //virtual bool isCurrentId (short) = 0; virtual void startVoiceMessageNotification (void) {} virtual void stopVoiceMessageNotification (void) {} virtual void sendVoiceNbMessage(const std::string& nb_msg) = 0; - + virtual void setup() = 0; virtual void sendMessage(const std::string& code, const std::string& seqId, TokenList& arg) = 0; virtual void sendCallMessage(const std::string& code, const std::string& sequenceId, diff --git a/src/gui/server/guiserver.cpp b/src/gui/server/guiserver.cpp deleted file mode 100644 index 098f009ec8e32e5f0bfd2e2a130956e7188c44a8..0000000000000000000000000000000000000000 --- a/src/gui/server/guiserver.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/** - * Copyright (C) 2005 Savoir-Faire Linux inc. - * Author: Yan Morin <yan.morin@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "guiserver.h" -#include <string> -#include <iostream> -#include <sstream> -#include <stdexcept> -#include "responsemessage.h" -#include "request.h" - -void -TCPSessionIO::run() { - std::string response; - while(!testCancel() && good()) { - if (isPending(ost::TCPSocket::pendingInput, 10)) { - std::string input; - std::getline(*this, input); - _gui->pushRequestMessage(input); - } - if (_outputPool.pop(response, 10)) { - *this << response << std::endl; - } - } -} - -// default constructor -GUIServer::GUIServer() -{ - _factory.registerAll(); - _sessionIO = 0; - _shouldQuit = false; -} - -// destructor -GUIServer::~GUIServer() -{ - // Waiting Requests cleanup - std::map<std::string, Request*>::iterator iter = _waitingRequests.begin(); - while (iter != _waitingRequests.end()) { - delete iter->second; iter->second = NULL; - iter++; - } - _waitingRequests.clear(); -} - -int -GUIServer::exec() { - try { - ost::InetAddress addr("127.0.0.1"); - - //Creating a listening socket. - ost::TCPSocket aServer(addr, 3999); - - std::cout << "listening on " << aServer.getLocal() << ":" << 3999 << std::endl; - - ResponseMessage output; // TCPStream output line - Request *request; - - while (std::cin.good()) { - - // waiting for a new connection - std::cout << "waiting for a new connection..." << std::endl; - - //I'm accepting an incomming connection - _sessionIO = new TCPSessionIO(aServer, this); - _sessionIO->start(); - - // wait for the first message - std::cout << "accepting connection..." << std::endl; - - _shouldQuit = false; - while(_sessionIO->good() && !_shouldQuit) { - if ( _requests.pop(request, 1000)) { - output = request->execute(*this); - handleExecutedRequest(request, output); - } - } - } - } - catch(ost::Socket *e) { - std::cerr << e->getErrorString() << std::endl; - } - - return 0; -} - -void -GUIServer::pushRequestMessage(const std::string &request) -{ - Request *tempRequest = _factory.create(request); - _requests.push(tempRequest); -} - -void -GUIServer::pushResponseMessage(const ResponseMessage &response) -{ - if (_sessionIO) { - _sessionIO->push(response.toString()); - } else { - std::cerr << "PushResponseMessage: " << response.toString() << std::endl; - } - - // remove the request from the list - if (response.isFinal()) { - std::map<std::string, Request*>::iterator iter = _waitingRequests.find(response.sequenceId()); - if (iter != _waitingRequests.end()) { - delete iter->second; iter->second = NULL; - _waitingRequests.erase(iter); - } - } -} - -/** - * Delete the request from the list of request - * or send it into the waitingRequest map - */ -void -GUIServer::handleExecutedRequest(Request * const request, const ResponseMessage& response) -{ - if (response.isFinal()) { - delete request; request = NULL; - } else { - if (_waitingRequests.find(request->sequenceId()) == _waitingRequests.end()) { - _waitingRequests[response.sequenceId()] = request; - } else { - // we don't deal with requests with a sequenceId already send... - delete request; request = NULL; - } - } - if (_sessionIO) { - _sessionIO->push(response.toString()); - } -} - -/** - * SubCall operations - * insert - * remove - */ -void -GUIServer::insertSubCall(short id, SubCall& subCall) { - _callMap[id] = subCall; -} - -void -GUIServer::removeSubCall(short id) { - _callMap.erase(id); -} - -/** - * Retreive the subcall or send 0 - */ -std::string -GUIServer::getSequenceIdFromId(short id) { - CallMap::iterator iter = _callMap.find(id); - if (iter != _callMap.end()) { - return iter->second.sequenceId(); - } - return "seq0"; -} - -short -GUIServer::getIdFromCallId(const std::string& callId) -{ - CallMap::iterator iter = _callMap.begin(); - while (iter != _callMap.end()) { - if (iter->second.callId()==callId) { - return iter->first; - } - } - throw std::runtime_error("No match for this CallId"); -} - -void -GUIServer::hangup(const std::string& callId) { - try { - short id = getIdFromCallId(callId); - // There was a problem when hanging up... - if (!GuiFramework::hangupCall(id)) { - throw std::runtime_error("Error when hangup"); - } - } catch(...) { - throw; - } -} - -int -GUIServer::incomingCall (short id) -{ - return 0; -} - -void -GUIServer::peerAnsweredCall (short id) -{ - CallMap::iterator iter = _callMap.find(id); - if ( iter != _callMap.end() ) { - pushResponseMessage(ResponseMessage("200", iter->second.sequenceId(), "OK")); - } else { - std::ostringstream responseMessage; - responseMessage << "Peer Answered Call: " << id; - pushResponseMessage(ResponseMessage("500", "seq0", responseMessage.str())); - } -} - -int -GUIServer::peerRingingCall (short id) -{ - CallMap::iterator iter = _callMap.find(id); - if ( iter != _callMap.end() ) { - pushResponseMessage(ResponseMessage("151", iter->second.sequenceId(), "Ringing")); - } - return 0; -} - -int -GUIServer::peerHungupCall (short id) -{ - return 0; -} - -void -GUIServer::displayTextMessage (short id, const std::string& message) -{ - std::ostringstream responseMessage; - std::string seq = getSequenceIdFromId(id); - responseMessage <<"s" << id << "text message: " + message; - pushResponseMessage(ResponseMessage("700", seq, responseMessage.str())); -} - -void -GUIServer::displayErrorText (short id, const std::string& message) -{ - std::ostringstream responseMessage; - std::string seq = getSequenceIdFromId(id); - responseMessage << "s" << id << " error text: " << message; - pushResponseMessage(ResponseMessage("700", seq, responseMessage.str())); -} - -void -GUIServer::displayError (const std::string& error) -{ - std::ostringstream responseMessage; - responseMessage << "error: " << error; - pushResponseMessage(ResponseMessage("700", "seq0", responseMessage.str())); -} - -void -GUIServer::displayStatus (const std::string& status) -{ - std::ostringstream responseMessage; - responseMessage << "status: " + status; - pushResponseMessage(ResponseMessage("700", "seq0", responseMessage.str())); -} - -void -GUIServer::displayContext (short id) -{ - std::ostringstream responseMessage; - responseMessage << "s" << id; - std::string seq = getSequenceIdFromId(id); - pushResponseMessage(ResponseMessage("700", seq, responseMessage.str())); -} - -std::string -GUIServer::getRingtoneFile (void) -{ - return std::string(""); -} - -void -GUIServer::setup (void) -{ -} - -void -GUIServer::startVoiceMessageNotification (void) -{ -} - -void -GUIServer::stopVoiceMessageNotification (void) -{ -} diff --git a/src/gui/server/guiserverimpl.cpp b/src/gui/server/guiserverimpl.cpp index aaecadd041df95fd39a7ed76a680b187ab04f25e..a231bd1eafbd7feb521f30f34fc72f7cef64d1cd 100644 --- a/src/gui/server/guiserverimpl.cpp +++ b/src/gui/server/guiserverimpl.cpp @@ -342,59 +342,74 @@ responseMessage.str())); } void -GUIServerImpl::displayTextMessage (short id, const std::string& message) +GUIServerImpl::displayStatus (const std::string& status) { - std::ostringstream responseMessage; - std::string seq = getSequenceIdFromId(id); - responseMessage << "s" << id << " text message: " + message; - _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str())); + TokenList tk; + tk.push_back(status); + tk.push_back("Status"); + _requestManager.sendResponse(ResponseMessage("100", _getEventsSequenceId, tk)); } void -GUIServerImpl::displayErrorText (short id, const std::string& message) +GUIServerImpl::displayConfigError (const std::string& error) { - std::ostringstream responseMessage; - std::string seq = getSequenceIdFromId(id); - responseMessage << "s" << id << " error text: " << message; - _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str())); + TokenList tk; + tk.push_back(error); + tk.push_back("Config Error"); + _requestManager.sendResponse(ResponseMessage("101", _getEventsSequenceId, tk)); } void -GUIServerImpl::displayError (const std::string& error) +GUIServerImpl::displayTextMessage (short id, const std::string& message) { - std::ostringstream responseMessage; - responseMessage << "error: " << error; - _requestManager.sendResponse(ResponseMessage("700", _getEventsSequenceId, -responseMessage.str())); + try { + std::string callId = getCallIdFromId(id); + TokenList tk; + tk.push_back(callId); + tk.push_back(message); + tk.push_back("Text message"); + _requestManager.sendResponse(ResponseMessage("102", _getEventsSequenceId, tk)); + } catch(...) { + TokenList tk; + tk.push_back(message); + tk.push_back("Text message"); + _requestManager.sendResponse(ResponseMessage("103", _getEventsSequenceId, tk)); + } } void -GUIServerImpl::displayStatus (const std::string& status) +GUIServerImpl::displayErrorText (short id, const std::string& message) { - std::ostringstream responseMessage; - responseMessage << "status: " + status; - _requestManager.sendResponse(ResponseMessage("700", _getEventsSequenceId, -responseMessage.str())); + try { + std::string callId = getCallIdFromId(id); + TokenList tk; + tk.push_back(callId); + tk.push_back(message); + tk.push_back("Error"); + _requestManager.sendResponse(ResponseMessage("104", _getEventsSequenceId, tk)); + } catch(...) { + displayError(message); + } } void -GUIServerImpl::displayContext (short id) +GUIServerImpl::displayError (const std::string& error) { - std::ostringstream responseMessage; - responseMessage << "s" << id; - std::string seq = getSequenceIdFromId(id); - _requestManager.sendResponse(ResponseMessage("700", seq, responseMessage.str())); + TokenList tk; + tk.push_back(error); + tk.push_back("Error"); + _requestManager.sendResponse(ResponseMessage("105", _getEventsSequenceId, tk)); } -void -GUIServerImpl::setup (void) +void +GUIServerImpl::sendVoiceNbMessage(const std::string& nb_msg) { + _requestManager.sendResponse(ResponseMessage("020", _getEventsSequenceId, nb_msg)); } void -GUIServerImpl::sendVoiceNbMessage(const std::string& nb_msg) +GUIServerImpl::setup() { - _requestManager.sendResponse(ResponseMessage("020", _getEventsSequenceId, nb_msg)); } void diff --git a/src/gui/server/guiserverimpl.h b/src/gui/server/guiserverimpl.h index 35f1e26b72508802f382c1cf288a60b707b64a3f..8a14759bac7f1256467d566a56e5ab742b3b29ab 100644 --- a/src/gui/server/guiserverimpl.h +++ b/src/gui/server/guiserverimpl.h @@ -46,15 +46,15 @@ public: void peerAnsweredCall (short id); int peerRingingCall (short id); int peerHungupCall (short id); + void displayStatus (const std::string& status); + void displayConfigError(const std::string& error); void displayTextMessage (short id, const std::string& message); void displayErrorText (short id, const std::string& message); void displayError (const std::string& error); - void displayStatus (const std::string& status); - void displayContext (short id); - void setup (void); //void startVoiceMessageNotification (void); //void stopVoiceMessageNotification (void); void sendVoiceNbMessage(const std::string& nb_msg); + void setup(); void sendMessage(const std::string& code, const std::string& seqId, TokenList& arg); @@ -81,7 +81,7 @@ arg); bool getCurrentCallId(std::string& callId); std::string version(); - void quit() { _requestManager.quit(); } + void quit() { _getEventsSequenceId="seq0"; _requestManager.quit(); } void stop() { _requestManager.stop(); } // observer methods diff --git a/src/gui/server/requestmanager.cpp b/src/gui/server/requestmanager.cpp index 83a9b86dee2901853de34830abf5dc81be788a30..685993338478994e21a7420e58d4da7520eb1276 100644 --- a/src/gui/server/requestmanager.cpp +++ b/src/gui/server/requestmanager.cpp @@ -62,7 +62,6 @@ RequestManager::exec() while(_sessionIO && _sessionIO->good() && std::cin.good() && !_quit) { if (_sessionIO->receive(input)) { - _debug("Receive Input...: %s\n", input.c_str()); request = _factory.create(input); outputResponse = request->execute(); diff --git a/src/gui/server/responsemessage.cpp b/src/gui/server/responsemessage.cpp index 74a122a4df93850b3ece07879adc16ae314bc9b2..34c2715e7a0c3b1a9d4f084ea7da45b3c7a73b6b 100644 --- a/src/gui/server/responsemessage.cpp +++ b/src/gui/server/responsemessage.cpp @@ -27,8 +27,16 @@ const std::string ResponseMessage::FINALCODE = "2456"; ResponseMessage::ResponseMessage(const std::string& code, const std::string& seq, - const std::string& message) : _code(code), _seq(seq), _message(message) + const std::string& message) : _code(code), _seq(seq) { + int len = message.length(); + if (len) { + char *tmp = new char[len*3+2]; + ost::urlEncode(message.c_str(), tmp, len*3+2); + // we don't have to put a '\0' right? + _message = tmp; + delete [] tmp; tmp = NULL; + } } /* diff --git a/src/gui/server/tcpsessionio.cpp b/src/gui/server/tcpsessionio.cpp index 8382587bb1a8c81ecb9664514eb52f50c368dc1f..19cfd1b0ec0890c7b9c93dcba7a13fbd3d6950cd 100644 --- a/src/gui/server/tcpsessionio.cpp +++ b/src/gui/server/tcpsessionio.cpp @@ -17,6 +17,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "tcpsessionio.h" +#include "../../global.h" const int TCPSessionIO::PORT = 3999; const char * const TCPSessionIO::IP = "127.0.0.1"; @@ -55,16 +56,19 @@ TCPSessionIO::send(const std::string& response) { if (_clientStream) { // just in case _clientStream->send(response); + _debug("SessionIO: Sending: %s\n", response.c_str()); } } bool TCPSessionIO::receive(std::string& request) { + bool returnValue = false; if (_clientStream) { // just in case - return _clientStream->receive(request); + returnValue = _clientStream->receive(request); + if (returnValue) _debug("SessionIO: Receiving: %s\n", request.c_str()); } - return false; + return returnValue; } void diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index a6e875e11469ab7a56635fab2ee1c36e2bc2f4fc..2fc2118f96d4dcfd7f68a890c66415873694689a 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -571,7 +571,7 @@ ManagerImpl::registerVoIPLink (void) { int returnValue = 0; if ( !useStun() ) { - if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() == 0) { + if (_voIPLinkVector.at(DFT_VOIP_LINK)->setRegister() >= 0) { returnValue = true; } else { _debug("ManagerImpl::registerVoIPLink: Registration Failed\n"); @@ -849,7 +849,8 @@ void ManagerImpl::displayError (const string& error) { if(_gui) { - _gui->displayStatus(error); + _debug("Display Error: %s\n", error.c_str()); + _gui->displayError(error); } }