/**
- * Copyright (C) 2012, GENIVI Alliance, Inc.
* Copyright (C) 2012, BMW AG
*
* This file is part of GENIVI Project AudioManager.
#include <istream>
#include <iostream>
#include <iterator>
-#include "CAmDatabaseHandler.h"
+#include <unistd.h>
+#include <stdexcept>
+#include <cstdlib>
+#include "CAmDatabaseHandlerInterface.h"
#include "CAmRoutingSender.h"
#include "CAmTelnetMenuHelper.h"
#include "shared/CAmDltWrapper.h"
#define PRINT_BOOL(var) var ? output+="true\t\t" : output+="false\t\t";
-CAmTelnetServer::CAmTelnetServer(CAmSocketHandler *iSocketHandler, CAmCommandSender *iCommandSender, CAmCommandReceiver *iCommandReceiver, CAmRoutingSender *iRoutingSender, CAmRoutingReceiver *iRoutingReceiver, CAmControlSender *iControlSender, CAmControlReceiver *iControlReceiver, CAmDatabaseHandler *iDatabasehandler, CAmRouter *iRouter, unsigned int servPort, unsigned int maxConnections) :
- telnetConnectFiredCB(this, &CAmTelnetServer::connectSocket), telnetReceiveFiredCB(this, &CAmTelnetServer::receiveData), telnetDispatchCB(this, &CAmTelnetServer::dispatchData), telnetCheckCB(this, &CAmTelnetServer::check), mpSocketHandler(iSocketHandler), mpCommandSender(iCommandSender), mpCommandReceiver(iCommandReceiver), mpRoutingSender(iRoutingSender), mpRoutingReceiver(iRoutingReceiver), mpControlSender(iControlSender), mpControlReceiver(iControlReceiver), mpDatabasehandler(iDatabasehandler), mpRouter(iRouter), mConnecthandle(), mListMessages(), mListConnections(), mConnectFD(NULL), mServerPort(servPort), mMaxConnections(maxConnections), mTelnetMenuHelper(iSocketHandler, iCommandSender, iCommandReceiver, iRoutingSender, iRoutingReceiver, iControlSender, iControlReceiver,
- iDatabasehandler, iRouter, this)
+CAmTelnetServer::CAmTelnetServer(CAmSocketHandler *iSocketHandler, CAmCommandSender *iCommandSender, CAmCommandReceiver *iCommandReceiver, CAmRoutingSender *iRoutingSender, CAmRoutingReceiver *iRoutingReceiver, CAmControlSender *iControlSender, CAmControlReceiver *iControlReceiver, CAmDatabaseHandlerInterface *iDatabasehandler, CAmRouter *iRouter, unsigned int servPort, unsigned int maxConnections) :
+ telnetConnectFiredCB(this, &CAmTelnetServer::connectSocket), //
+ telnetReceiveFiredCB(this, &CAmTelnetServer::receiveData), //
+ telnetDispatchCB(this, &CAmTelnetServer::dispatchData), //
+ telnetCheckCB(this, &CAmTelnetServer::check), //
+ mpSocketHandler(iSocketHandler), //
+ mpCommandSender(iCommandSender), //
+ mpCommandReceiver(iCommandReceiver), //
+ mpRoutingSender(iRoutingSender), //
+ mpRoutingReceiver(iRoutingReceiver), //
+ mpControlSender(iControlSender), //
+ mpControlReceiver(iControlReceiver), //
+ mpDatabasehandler(iDatabasehandler), //
+ mpRouter(iRouter), //
+ mConnecthandle(), //
+ mListMessages(), //
+ mListConnections(), //
+ mConnectFD(0), //
+ mServerPort(servPort), //
+ mMaxConnections(maxConnections), //
+ mTelnetMenuHelper(iSocketHandler, iCommandSender, iCommandReceiver, iRoutingSender, iRoutingReceiver, iControlSender, iControlReceiver, iDatabasehandler, iRouter, this)
{
assert(mpSocketHandler!=NULL);
assert(mpCommandReceiver!=NULL);
//setup the port Listener
mConnectFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
- setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
+ assert (mConnectFD>0);
+ assert(setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))==0);
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(bind(mConnectFD, (struct sockaddr *) &servAddr, sizeof(servAddr))!=0)
+ {
+ logError("CAmTelnetServer::CAmTelnetServer bind failed, error",errno);
+ throw std::runtime_error("CAmTelnetServer::CAmTelnetServer bind failed");
+ }
if (listen(mConnectFD, mMaxConnections) < 0)
{
logError("TelnetServer::TelnetServerk cannot listen ", errno);
+ throw std::runtime_error("CAmTelnetServer::CAmTelnetServer bind failed");
}
else
logInfo("TelnetServer::TelnetServer started listening on port", mServerPort);
connection.handle = 0;
connection.filedescriptor = accept(pfd.fd, (struct sockaddr*) &answer, &len);
+ assert(connection.filedescriptor>0);
+
// Notiy menuhelper
mTelnetMenuHelper.newSocketConnection(connection.filedescriptor);
short event = 0;
event |= POLLIN;
- //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
+ //add the filedescriptor to the sockethandler and register the callbacks for receiving the data
mpSocketHandler->addFDPoll(connection.filedescriptor, event, NULL, &telnetReceiveFiredCB, &telnetCheckCB, &telnetDispatchCB, NULL, connection.handle);
mListConnections.push_back(connection);
}
//initialize buffer
char buffer[100];
//read until buffer is full or no more data is there
- int read = recv(pollfd.fd, buffer, 100, NULL);
+ int read = recv(pollfd.fd, buffer, 100, 0);
if (read > 1)
{
//read the message and store it in a queue - its a telnet connection so data will be sent on enter !
if (iterator->handle == handle)
break;
}
+ if (iterator==mListConnections.end())
+ {
+ logError("CAmTelnetServer::dispatchData could not find handle !");
+ return (false);
+ }
std::string command;
std::queue<std::string> MsgQueue;
{
sliceCommand(mListMessages.front(), command, MsgQueue);
mListMessages.pop();
+ mTelnetMenuHelper.enterCmdQueue(MsgQueue, iterator->filedescriptor);
+ }
+ else
+ {
+ logError("CAmTelnetServer::dispatchData Message queue was empty!");
}
-
- mTelnetMenuHelper.enterCmdQueue(MsgQueue, iterator->filedescriptor);
// must return false to stop endless polling
return (false);