27 #include <sys/socket.h>
28 #include <arpa/inet.h>
29 #include <sys/ioctl.h>
32 #include <audiomanagerconfig.h>
48 CAmTelnetServer* CAmTelnetServer::mpInstance = NULL;
50 #define PRINT_BOOL(var) var ? output+="true\t\t" : output+="false\t\t";
52 CAmTelnetServer::CAmTelnetServer(
CAmSocketHandler *iSocketHandler,
CAmCommandSender *iCommandSender,
CAmCommandReceiver *iCommandReceiver,
CAmRoutingSender *iRoutingSender,
CAmRoutingReceiver *iRoutingReceiver,
CAmControlSender *iControlSender,
CAmControlReceiver *iControlReceiver,
IAmDatabaseHandler *iDatabasehandler,
CAmRouter *iRouter,
unsigned int servPort,
unsigned int maxConnections) :
57 mpSocketHandler(iSocketHandler),
58 mpCommandSender(iCommandSender),
59 mpCommandReceiver(iCommandReceiver),
60 mpRoutingSender(iRoutingSender),
61 mpRoutingReceiver(iRoutingReceiver),
62 mpControlSender(iControlSender),
63 mpControlReceiver(iControlReceiver),
64 mpDatabasehandler(iDatabasehandler),
70 mServerPort(servPort),
71 mMaxConnections(maxConnections),
72 mTelnetMenuHelper(iSocketHandler, iCommandSender, iCommandReceiver, iRoutingSender, iRoutingReceiver, iControlSender, iControlReceiver, iDatabasehandler, iRouter, this)
74 assert(mpSocketHandler!=NULL);
75 assert(mpCommandReceiver!=NULL);
76 assert(mpCommandSender!=NULL);
77 assert(mpControlSender!=NULL);
78 assert(mpControlReceiver!=NULL);
79 assert(mpRoutingSender!=NULL);
80 assert(mpRoutingReceiver!=NULL);
81 assert(mpDatabasehandler!=NULL);
82 assert(mpRouter!=NULL);
84 assert(mMaxConnections!=0);
90 struct sockaddr_in servAddr;
93 mConnectFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
94 assert (mConnectFD>0);
95 assert(setsockopt(mConnectFD, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(
int))==0);
96 memset(&servAddr, 0,
sizeof(servAddr));
97 servAddr.sin_family = AF_INET;
98 servAddr.sin_addr.s_addr = INADDR_ANY;
99 servAddr.sin_port = htons(servPort);
100 if(bind(mConnectFD, (
struct sockaddr *) &servAddr,
sizeof(servAddr))!=0)
102 logError(
"CAmTelnetServer::CAmTelnetServer bind failed, error",errno);
103 throw std::runtime_error(
"CAmTelnetServer::CAmTelnetServer bind failed");
106 if (listen(mConnectFD, mMaxConnections) < 0)
108 logError(
"TelnetServer::TelnetServerk cannot listen ", errno);
109 throw std::runtime_error(
"CAmTelnetServer::CAmTelnetServer bind failed");
112 logInfo(
"TelnetServer::TelnetServer started listening on port", mServerPort);
115 ioctl(mConnectFD, FIONBIO, (
char *) &a);
116 setsockopt(mConnectFD, SOL_SOCKET, SO_KEEPALIVE, (
char *) &a,
sizeof(a));
132 struct sockaddr answer;
133 socklen_t len =
sizeof(answer);
134 connection_s connection;
135 connection.handle = 0;
136 connection.filedescriptor = accept(pfd.fd, (
struct sockaddr*) &answer, &len);
138 assert(connection.filedescriptor>0);
149 mListConnections.push_back(connection);
154 std::vector<connection_s>::iterator iter = mListConnections.begin();
155 while (iter != mListConnections.end())
157 if (filedescriptor == iter->filedescriptor)
161 mListConnections.erase(iter);
162 close(filedescriptor);
182 int read = recv(pollfd.fd, buffer, 100, 0);
186 std::string msg = std::string(buffer, read);
187 mListMessages.push(msg);
194 std::vector<connection_s>::iterator iterator = mListConnections.begin();
195 for (; iterator != mListConnections.end(); ++iterator)
197 if (iterator->handle == handle)
200 if (iterator==mListConnections.end())
202 logError(
"CAmTelnetServer::dispatchData could not find handle !");
207 std::queue<std::string> MsgQueue;
208 if (!mListMessages.empty())
210 sliceCommand(mListMessages.front(), command, MsgQueue);
212 mTelnetMenuHelper.
enterCmdQueue(MsgQueue, iterator->filedescriptor);
216 logError(
"CAmTelnetServer::dispatchData Message queue was empty!");
227 if (mListMessages.size() != 0)
232 void am::CAmTelnetServer::sliceCommand(
const std::string &
string, std::string & command, std::queue<std::string> & MsgQueue)
235 std::stringstream stream(
string);
236 std::istream_iterator<std::string> begin(stream);
237 std::istream_iterator<std::string> end;
239 bool endOfStream =
false;
Implements the RoutingSendInterface.
This class realizes the command Interface.
void logInfo(T value, TArgs...args)
logs given values with infolevel with the default context
bool check(const sh_pollHandle_t handle, void *userData)
Implements an autorouting algorithm for connecting sinks and sources via different audio domains...
This class is used to receive all commands from the control interface.
The am::CAmSocketHandler implements a mainloop for the AudioManager.
void connectSocket(const pollfd pfd, const sh_pollHandle_t handle, void *userData)
uint16_t sh_pollHandle_t
this is a handle for a filedescriptor to be used with the SocketHandler
SPDX license identifier: MPL-2.0.
am_Error_e removeFDPoll(const sh_pollHandle_t handle)
removes a filedescriptor from the poll loop
Implements the Receiving side of the RoutingPlugins.
SPDX license identifier: MPL-2.0.
am_Error_e addFDPoll(const int fd, const short event, IAmShPollPrepare *prepare, IAmShPollFired *fired, IAmShPollCheck *check, IAmShPollDispatch *dispatch, void *userData, sh_pollHandle_t &handle)
Adds a filedescriptor to the polling loop.
void disconnectClient(int filedescriptor)
sends data to the commandInterface, takes the file of the library that needs to be loaded ...
This class handles and abstracts the database.
SPDX license identifier: MPL-2.0.
Implements a telnetserver that can be used to connect to the audiomanager, retrieve some information ...
CAmTelnetServer(CAmSocketHandler *iSocketHandler, CAmCommandSender *iCommandSender, CAmCommandReceiver *iCommandReceiver, CAmRoutingSender *iRoutingSender, CAmRoutingReceiver *iRoutingReceiver, CAmControlSender *iControlSender, CAmControlReceiver *iControlReceiver, IAmDatabaseHandler *iDatabasehandler, CAmRouter *iRouter, unsigned int servPort, unsigned int maxConnections)
TAmShPollCheck< CAmTelnetServer > telnetCheckCB
bool dispatchData(const sh_pollHandle_t handle, void *userData)
TAmShPollDispatch< CAmTelnetServer > telnetDispatchCB
void logError(T value, TArgs...args)
logs given values with errorlevel with the default context
no error - positive reply
TAmShPollFired< CAmTelnetServer > telnetReceiveFiredCB
This class is used to send data to the CommandInterface.
void receiveData(const pollfd pfd, const sh_pollHandle_t handle, void *userData)
TCLAP::ValueArg< unsigned int > maxConnections("m","maxConnections","Maximal number of connections for telnet", false, MAX_TELNETCONNECTIONS,"int")
TAmShPollFired< CAmTelnetServer > telnetConnectFiredCB