summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon/src/TelnetServer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AudioManagerDaemon/src/TelnetServer.cpp')
-rw-r--r--AudioManagerDaemon/src/TelnetServer.cpp350
1 files changed, 176 insertions, 174 deletions
diff --git a/AudioManagerDaemon/src/TelnetServer.cpp b/AudioManagerDaemon/src/TelnetServer.cpp
index 38e8453..8b51af3 100644
--- a/AudioManagerDaemon/src/TelnetServer.cpp
+++ b/AudioManagerDaemon/src/TelnetServer.cpp
@@ -23,12 +23,14 @@
*/
#include "TelnetServer.h"
-#include <cassert>
+#include "CAmTelnetMenuHelper.h"
+#include <assert.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <string.h>
#include <netdb.h>
+#include <dlt/dlt.h>
#include <config.h>
#include <errno.h>
#include <sstream>
@@ -40,217 +42,217 @@
using namespace am;
+DLT_IMPORT_CONTEXT(AudioManager)
+
TelnetServer* TelnetServer::instance = NULL;
#define PRINT_BOOL(var) var ? output+="true\t\t" : output+="false\t\t";
-TelnetServer::TelnetServer(SocketHandler *iSocketHandler, CommandSender *iCommandSender, CommandReceiver *iCommandReceiver, RoutingSender *iRoutingSender, RoutingReceiver *iRoutingReceiver, ControlSender *iControlSender, ControlReceiver *iControlReceiver, DatabaseHandler *iDatabasehandler, unsigned int servPort, unsigned int maxConnections) :
- telnetConnectFiredCB(this, &TelnetServer::connectSocket), //
- telnetReceiveFiredCB(this, &TelnetServer::receiveData), //
- telnetDispatchCB(this, &TelnetServer::dispatchData), //
- telnetCheckCB(this, &TelnetServer::check), //
- mSocketHandler(iSocketHandler), //
- mCommandSender(iCommandSender), //
- mCommandReceiver(iCommandReceiver), //
- mRoutingSender(iRoutingSender), //
- mRoutingReceiver(iRoutingReceiver), //
- mControlSender(iControlSender), //
- mControlReceiver(iControlReceiver), //
- mDatabasehandler(iDatabasehandler), //
- mConnecthandle(), //
- msgList(), //
- mListConnections(), //
- mConnectFD(NULL), //
- mServerPort(servPort), //
- mMaxConnections(maxConnections), //
- mMapCommands(createCommandMap())
+TelnetServer::TelnetServer(SocketHandler *iSocketHandler, CommandSender *iCommandSender, CommandReceiver *iCommandReceiver, RoutingSender *iRoutingSender, RoutingReceiver *iRoutingReceiver, ControlSender *iControlSender, ControlReceiver *iControlReceiver, DatabaseHandler *iDatabasehandler, Router *iRouter, unsigned int servPort, unsigned int maxConnections)
+ :telnetConnectFiredCB(this,&TelnetServer::connectSocket),
+ telnetReceiveFiredCB(this,&TelnetServer::receiveData),
+ telnetDispatchCB(this,&TelnetServer::dispatchData),
+ telnetCheckCB(this,&TelnetServer::check),
+ mSocketHandler(iSocketHandler),
+ mCommandSender(iCommandSender),
+ mCommandReceiver(iCommandReceiver),
+ mRoutingSender(iRoutingSender),
+ mRoutingReceiver(iRoutingReceiver),
+ mControlSender(iControlSender),
+ mControlReceiver(iControlReceiver),
+ mDatabasehandler(iDatabasehandler),
+ mRouter(iRouter),
+ mConnecthandle(),
+ mMsgList(),
+ mListConnections(),
+ mConnectFD(NULL),
+ mServerPort(servPort),
+ mMaxConnections(maxConnections),
+ mTelnetMenuHelper(iSocketHandler,iCommandSender,iCommandReceiver,iRoutingSender,iRoutingReceiver,iControlSender,iControlReceiver,iDatabasehandler,iRouter)
{
- assert(mSocketHandler!=NULL);
- assert(mCommandReceiver!=NULL);
- assert(mCommandSender!=NULL);
- assert(mControlSender!=NULL);
- assert(mControlReceiver!=NULL);
- assert(mRoutingSender!=NULL);
- assert(mRoutingReceiver!=NULL);
- assert(mDatabasehandler!=NULL);
- assert(servPort!=0);
- assert(mMaxConnections!=0);
-
- instance = this;
-
- int yes = 1;
- struct sockaddr_in servAddr;
-
- //setup the port Listener
- mConnectFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
- memset(&servAddr, 0, sizeof(servAddr));
- servAddr.sin_family = AF_INET;
- servAddr.sin_addr.s_addr = INADDR_ANY;
- servAddr.sin_port = htons(servPort);
- bind(mConnectFD, (struct sockaddr *) &servAddr, sizeof(servAddr));
-
- int a = 1;
- ioctl(mConnectFD, FIONBIO, (char *) &a);
- setsockopt(mConnectFD, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof(a));
-
- short events = 0;
- events |= POLLIN;
- mSocketHandler->addFDPoll(mConnectFD, events, NULL, &telnetConnectFiredCB, NULL, NULL, NULL, mConnecthandle);
+ assert(mSocketHandler!=NULL);
+ assert(mCommandReceiver!=NULL);
+ assert(mCommandSender!=NULL);
+ assert(mControlSender!=NULL);
+ assert(mControlReceiver!=NULL);
+ assert(mRoutingSender!=NULL);
+ assert(mRoutingReceiver!=NULL);
+ assert(mDatabasehandler!=NULL);
+ assert(mRouter!=NULL);
+ assert(servPort!=0);
+ assert(mMaxConnections!=0);
+
+ instance = this;
+ mTelnetMenuHelper.setTelnetServer(this);
+
+ int yes = 1;
+ struct sockaddr_in servAddr;
+
+ //setup the port Listener
+ mConnectFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
+ memset(&servAddr, 0, sizeof(servAddr));
+ servAddr.sin_family = AF_INET;
+ servAddr.sin_addr.s_addr = INADDR_ANY;
+ servAddr.sin_port = htons(servPort);
+ bind(mConnectFD, (struct sockaddr *) &servAddr, sizeof(servAddr));
+
+ if (listen(mConnectFD,mMaxConnections) < 0)
+ {
+ DLT_LOG(AudioManager, DLT_LOG_ERROR, DLT_STRING("TelnetServer::TelnetServerk cannot listen "),DLT_INT(errno));
+ }
+ else
+ DLT_LOG(AudioManager, DLT_LOG_INFO, DLT_STRING("TelnetServer::TelnetServer started listening on port"),DLT_INT(mServerPort));
+
+ int a=1;
+ ioctl (mConnectFD, FIONBIO, (char *) &a); // should we use the posix call fcntl(mConnectFD, F_SETFL, O_NONBLOCK)
+ setsockopt (mConnectFD, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof (a));
+
+ short events = 0;
+ events |= POLLIN;
+ mSocketHandler->addFDPoll(mConnectFD, events, NULL, &telnetConnectFiredCB, NULL, NULL, NULL, mConnecthandle);
}
TelnetServer::~TelnetServer()
{
+ mTelnetMenuHelper.setTelnetServer(NULL);
}
void TelnetServer::connectSocket(const pollfd pfd, const sh_pollHandle_t handle, void *userData)
{
- (void) handle;
- (void) userData;
- //first, accept the connection, create a new filedescriptor
- struct sockaddr answer;
- socklen_t len = sizeof(answer);
- connection_s connection;
- connection.filedescriptor = accept(pfd.fd, (struct sockaddr*) &answer, &len);
-
- mListConnections.push_back(connection);
-
- //set the correct event:
- short event = 0;
- event |= POLLIN;
-
- //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
- mSocketHandler->addFDPoll(mListConnections.back().filedescriptor, event, NULL, &telnetReceiveFiredCB, &telnetCheckCB, &telnetDispatchCB, NULL, mListConnections.back().handle);
+ //first, accept the connection, create a new filedescriptor
+ struct sockaddr answer;
+ socklen_t len=sizeof(answer);
+ connection_s connection;
+ connection.handle = 0;
+ connection.filedescriptor = accept(pfd.fd, (struct sockaddr*)&answer, &len);
+
+ // Notiy menuhelper
+ mTelnetMenuHelper.newSocketConnection(connection.filedescriptor);
+
+ //set the correct event:
+ short event = 0;
+ event |=POLLIN;
+
+ //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
+ mSocketHandler->addFDPoll(connection.filedescriptor,event,NULL,&telnetReceiveFiredCB,&telnetCheckCB,&telnetDispatchCB,NULL,connection.handle);
+ mListConnections.push_back(connection);
+}
+
+void TelnetServer::disconnectClient(int filedescriptor)
+{
+ std::vector<connection_s>::iterator iter = mListConnections.begin();
+ while(iter != mListConnections.end())
+ {
+ if( filedescriptor == iter->filedescriptor )
+ {
+ if( E_OK == mSocketHandler->removeFDPoll(iter->handle))
+ {
+ mListConnections.erase(iter);
+ close(filedescriptor);
+ }
+ else
+ {
+ // TODO: Handle error
+ }
+
+ break;
+ }
+ iter++;
+ }
}
void TelnetServer::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData)
{
- (void)handle;
- (void)userData;
- //initialize buffer
- char buffer[100];
- //read until buffer is full or no more data is there
- int read = recv(pollfd.fd, buffer, 100, NULL);
- if (read > 1)
- {
- //read the message and store it in a queue - its a telnet connection so data will be sent on enter !
- std::string msg = std::string(buffer, read);
- msgList.push(msg);
- }
+ //initialize buffer
+ char buffer[100];
+ //read until buffer is full or no more data is there
+ int read=recv(pollfd.fd,buffer,100,NULL);
+ if (read>1)
+ {
+ //read the message and store it in a queue - its a telnet connection so data will be sent on enter !
+ std::string msg=std::string(buffer,read);
+ mMsgList.push(msg);
+ }
}
bool TelnetServer::dispatchData(const sh_pollHandle_t handle, void *userData)
{
- (void)handle;
- (void)userData;
- std::vector<connection_s>::iterator iterator = mListConnections.begin();
- for (; iterator != mListConnections.end(); ++iterator)
- {
- if (iterator->handle == handle) break;
- }
- if (iterator == mListConnections.end()) return false;
-
- std::string command;
- std::vector<std::string> msg;
- sliceCommand(msgList.front(), command, msg);
- msgList.pop();
- mMapCommand_t::iterator commandIter = mMapCommands.find(command);
- if (commandIter == mMapCommands.end())
- {
- send(iterator->filedescriptor, "Command not found!\n", 20, 0);
- }
- else
- {
- (*commandIter).second(msg, iterator->filedescriptor);
- }
+ std::vector<connection_s>::iterator iterator=mListConnections.begin();
+ for(;iterator!=mListConnections.end();++iterator)
+ {
+ if(iterator->handle==handle) break;
+ }
+ //if (iterator==mListConnections.end()) return false;
- //remove the message from the queue and return false if there is no more message to read.
- if (msgList.size() != 0) return true;
- return false;
+ std::string command;
+ std::queue<std::string> MsgQueue;
+ if(!mMsgList.empty())
+ {
+ sliceCommand(mMsgList.front(),command,MsgQueue);
+ mMsgList.pop();
+ }
+
+ mTelnetMenuHelper.enterCmdQueue(MsgQueue,iterator->filedescriptor);
+
+ // must return false to stop endless polling
+ return false;
+
+ /*
+ mMsgList.pop();
+ mMapCommand_t::iterator commandIter=mMapCommands.find(command);
+ if (commandIter==mMapCommands.end())
+ {
+ send(iterator->filedescriptor,"Command not found!\n",20,0);
+ }
+ else
+ {
+ commandIter->second(msg,iterator->filedescriptor);
+ //(*commandIter).second(msg,iterator->filedescriptor);
+ }
+
+ //remove the message from the queue and return false if there is no more message to read.
+ if (mMsgList.size()!=0) return true;
+ return false;
+ */
}
bool TelnetServer::check(const sh_pollHandle_t handle, void *userData)
{
(void)handle;
(void)userData;
- if (msgList.size() != 0) return true;
+ if (mMsgList.size() != 0) return true;
return false;
}
-void TelnetServer::listCommand(std::vector<std::string>& msg, int filedescriptor)
+void am::TelnetServer::sliceCommand(const std::string & string, std::string & command, std::queue<std::string> & MsgQueue)
{
- instance->listCommandShadow(msg, filedescriptor);
-}
+ std::stringstream stream(string);
+ std::istream_iterator<std::string> begin(stream);
+ std::istream_iterator<std::string> end;
+ std::string cmd;
+ bool endOfStream = false;
-void TelnetServer::listCommandShadow(std::vector<std::string> & msg, int filedescriptor)
-{
- std::string output;
- if (msg.empty())
- {
- output += "No second parameter given after list, please enter\n";
- }
- else if (msg.front().compare("plugins") == 0)
- {
- std::vector<std::string> plugins;
- mRoutingSender->getListPlugins(plugins);
- std::vector<std::string>::iterator it = plugins.begin();
- output = "\n\nrouting plugins:\n-------------------------\n";
- for (; it != plugins.end(); ++it)
- {
- output += *it + "\n";
- }
- }
- else if (msg.front().compare("domains") == 0)
- {
- output = "domainID\t\tdomainName\t\tbusName\t\tnodeName\t\tearly\t\tstate\t\tcomplete\n";
- output += "-------------------------------------------------------------------------------------\n";
- std::vector<am_Domain_s> domainList;
- mDatabasehandler->getListDomains(domainList);
- std::vector<am_Domain_s>::iterator it = domainList.begin();
- for (; it != domainList.end(); ++it)
- {
- output += it->domainID + "\t\t";
- output += it->name + "\t\t";
- output += it->busname + "\t\t";
- output += it->nodename + "\t\t";
- PRINT_BOOL(it->early);
- switch (it->state)
- {
- case DS_CONTROLLED:
- output += "DS_CONTROLLED\t\t";
- break;
- case DS_INDEPENDENT_STARTUP:
- output += "DS_INDEPENDENT_STARTUP\t\t";
- break;
- case DS_INDEPENDENT_RUNDOWN:
- output += "DS_INDEPENDENT_RUNDOWN\t\t";
- break;
- default:
- output += "undefined\t\t";
- break;
- }PRINT_BOOL(it->complete);
- }
- }
- else
+ int c = 0;
+
+ while(!endOfStream)
{
- output = "did not recognize parameter: " + msg.front() + "\n";
+ cmd = *begin;
+ MsgQueue.push(cmd);
+ begin++;
+
+ if(begin == end )
+ {
+ endOfStream = true;
+ }
+ c++;
}
- send(filedescriptor, output.c_str(), output.size(), 0);
-}
-void am::TelnetServer::sliceCommand(const std::string & string, std::string & command, std::vector<std::string> & msg)
-{
- std::stringstream stream(string);
- std::istream_iterator<std::string> begin(stream);
- std::istream_iterator<std::string> end;
+
+ /*
command = *begin++;
msg = std::vector<std::string>(begin, end);
+ */
}
-TelnetServer::mMapCommand_t TelnetServer::createCommandMap()
-{
- mMapCommand_t commands;
- commands.insert(std::make_pair("list", &TelnetServer::listCommand));
- return commands;
-}