summaryrefslogtreecommitdiff
path: root/AudioManagerDaemon/include/CAmTelnetMenuHelper.h
blob: 947675186f4dce5592d5bd9b14063fb72971ffcc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/**
 * Copyright (C) 2012, BMW AG
 *
 * This file is part of GENIVI Project AudioManager.
 *
 * Contributions are licensed to the GENIVI Alliance under one or more
 * Contribution License Agreements.
 *
 * \copyright
 * This Source Code Form is subject to the terms of the
 * Mozilla Public License, v. 2.0. If a  copy of the MPL was not distributed with
 * this file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 *
 * \author Christian Mueller, christian.ei.mueller@bmw.de BMW 2011,2012
 * \author Frank Herchet, frank.fh.herchet@bmw.de BMW 2012
 *
 * \file CAmTelnetMenuHelper.h
 * For further information see http://www.genivi.org/.
 *
 */

// Local header
#ifndef CAMTELNETMENUHELPER_H_
#define CAMTELNETMENUHELPER_H_

// Standard header
#include <iostream>
#include <queue>
#include <map>
#include <string>
#include <sstream>
#include <vector>
#include <sys/socket.h>
#include "audiomanagertypes.h"

namespace am
{

class CAmTelnetServer;
class IAmDatabaseHandler;
class CAmCommandSender;
class CAmRoutingSender;
class CAmControlSender;
class CAmCommandReceiver;
class CAmRoutingReceiver;
class CAmControlReceiver;

class CAmRouter;
class CAmSocketHandler;

/**
 * helper class for CAmTelnetServer
 */
class CAmTelnetMenuHelper
{
public:

    enum EMainState
    {
        eRootState = 0, eListState, eInfoState, eGetState, eSetState
    };

    CAmTelnetMenuHelper(CAmSocketHandler *iSocketHandler, CAmCommandSender *iCommandSender, CAmCommandReceiver *iCommandReceiver, CAmRoutingSender *iRoutingSender, CAmRoutingReceiver *iRoutingReceiver, CAmControlSender *iControlSender, CAmControlReceiver *iControlReceiver, IAmDatabaseHandler *iDatabasehandler, CAmRouter *iRouter, CAmTelnetServer *iTelnetServer);

    ~CAmTelnetMenuHelper();

    void newSocketConnection(int filedescriptor);

    void socketConnectionsClosed(int filedescriptor);

    void enterCmdQueue(std::queue<std::string> &CmdQueue, int &filedescriptor);

private:

    void createCommandMaps();
    void sendError(int & filedescriptor, std::string error_string);
    void sendTelnetLine(int & filedescriptor, std::stringstream &line);
    void sendCurrentCmdPrompt(int &filedescriptor);

    // COMMON commands
    static void oneStepBackCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void oneStepBackCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void exitCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void exitCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void helpCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void helpCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);

    // ROOT commands
    static void rootGetCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void rootGetCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void rootSetCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void rootSetCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void rootListCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void rootListCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void rootInfoCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void rootInfoCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);

    // LIST commands
    static void listConnectionsCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listConnectionsCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listSourcesCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listSourcesCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listSinksCommands(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listSinksCommandsExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listCrossfaders(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listCrossfadersExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listDomainsCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listDomainsCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listGatewaysCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listGatewaysCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listPluginsCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listPluginsCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listMainConnectionsCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listMainConnectionsCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listMainSourcesCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listMainSourcesCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void listMainSinksCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void listMainSinksCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);

    // SET commands
    static void setRoutingCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setRoutingCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setConnection(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setConnectionExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setDisconnectConnId(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setDisconnectConnIdExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setSourceSoundProperties(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setSourceSoundPropertiesExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setSinkSoundProperty(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setSinkSoundPropertyExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setSinkVolume(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setSinkVolumeExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setVolumeStep(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setVolumeStepExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setSinkMuteState(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setSinkMuteStateExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void setSourceSoundProperty(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void setSourceSoundPropertyExec(std::queue<std::string> & CmdQueue, int & filedescriptor);

    // GET commands
    static void getRoutingCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void getRoutingCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void getSenderversionCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void getSenderversionCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void getReceiverversionCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void getReceiverversionCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);

    // INFO commands
    static void infoSystempropertiesCommand(std::queue<std::string> & CmdQueue, int & filedescriptor);
    void infoSystempropertiesCommandExec(std::queue<std::string> & CmdQueue, int & filedescriptor);
    static void infoDumpCommand(std::queue<std::string>& CmdQueue, int& filedescriptor);
    void infoDumpCommandExec(std::queue<std::string>& CmdQueue, int& filedescriptor);

private:

    typedef void (*pCommandPrototype)(std::queue<std::string>& msg, int & filedescriptor);

    struct sCommandPrototypeInfo
    {
        std::string info;
        pCommandPrototype CommandPrototype;

        // default contructor to set NULL
        sCommandPrototypeInfo() :
                info(""), CommandPrototype(NULL)
        {
        }

        // a small contructor
        sCommandPrototypeInfo(std::string MyInfo, pCommandPrototype MyCommandPrototype) :
                info(MyInfo), CommandPrototype(MyCommandPrototype)
        {
        }
    };

    typedef std::map<std::string, sCommandPrototypeInfo> tCommandMap;
    std::map<int, EMainState> mCurrentMainStateMap; //!< int filedescriptor of socket connection; EMainState state of current telnet session

    static CAmTelnetMenuHelper* instance;
    CAmTelnetServer *mpTelenetServer;
    CAmSocketHandler *mpSocketHandler;
    CAmCommandSender *mpCommandSender;
    CAmCommandReceiver *mpCommandReceiver;
    CAmRoutingSender *mpRoutingSender;
    CAmRoutingReceiver *mpRoutingReceiver;
    CAmControlSender *mpControlSender;
    CAmControlReceiver *mpControlReceiver;
    IAmDatabaseHandler *mpDatabasehandler;
    CAmRouter *mpRouter;

    tCommandMap mRootCommands;
    tCommandMap mListCommands;
    tCommandMap mGetCommands;
    tCommandMap mSetCommands;
    tCommandMap mInfoCommands;

};
// class CAmTelnetMenuHelper
}// namespace am

#endif // CAMTELNETMENUHELPER_H_