Added 'Dump' method to the database handler and to the telnet server (Info -> Dump...
[profile/ivi/genivi/genivi-audio-manager.git] / AudioManagerDaemon / src / CAmTelnetServer.cpp
old mode 100644 (file)
new mode 100755 (executable)
index ed28f9c..644b0a6
 #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"
@@ -45,9 +48,27 @@ CAmTelnetServer* CAmTelnetServer::mpInstance = NULL;
 
 #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);
@@ -70,16 +91,21 @@ CAmTelnetServer::CAmTelnetServer(CAmSocketHandler *iSocketHandler, CAmCommandSen
     //setup the port Listener
     mConnectFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
     assert (mConnectFD>0);
-    setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
+    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);
@@ -117,7 +143,7 @@ void CAmTelnetServer::connectSocket(const pollfd pfd, const sh_pollHandle_t hand
     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);
 }
@@ -152,7 +178,7 @@ void CAmTelnetServer::receiveData(const pollfd pollfd, const sh_pollHandle_t han
     //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 !