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 079e6e3..644b0a6
@@ -1,5 +1,4 @@
 /**
- * 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"
@@ -46,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 +90,22 @@ CAmTelnetServer::CAmTelnetServer(CAmSocketHandler *iSocketHandler, CAmCommandSen
 
     //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);
@@ -108,6 +134,8 @@ void CAmTelnetServer::connectSocket(const pollfd pfd, const sh_pollHandle_t hand
     connection.handle = 0;
     connection.filedescriptor = accept(pfd.fd, (struct sockaddr*) &answer, &len);
 
+    assert(connection.filedescriptor>0);
+
     // Notiy menuhelper
     mTelnetMenuHelper.newSocketConnection(connection.filedescriptor);
 
@@ -115,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);
 }
@@ -150,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 !
@@ -168,6 +196,11 @@ bool CAmTelnetServer::dispatchData(const sh_pollHandle_t handle, void *userData)
         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;
@@ -175,9 +208,12 @@ bool CAmTelnetServer::dispatchData(const sh_pollHandle_t handle, void *userData)
     {
         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);