| 1 | #ifndef FACT_RemoteControl
|
|---|
| 2 | #define FACT_RemoteControl
|
|---|
| 3 |
|
|---|
| 4 | // **************************************************************************
|
|---|
| 5 | /** @class StateClient
|
|---|
| 6 |
|
|---|
| 7 | @brief A simple Dim client diriving from MessageDimRX subscribing to the STATE service
|
|---|
| 8 |
|
|---|
| 9 | This is a simple dim client which subscribes to the MESSAGE and STATE
|
|---|
| 10 | service of a server. It stores the last state and its time as well as
|
|---|
| 11 | the last message sent.
|
|---|
| 12 |
|
|---|
| 13 | **/
|
|---|
| 14 | // **************************************************************************
|
|---|
| 15 | #include "MessageDim.h"
|
|---|
| 16 | #include "Time.h"
|
|---|
| 17 |
|
|---|
| 18 | class StateClient : public MessageDimRX
|
|---|
| 19 | {
|
|---|
| 20 | private:
|
|---|
| 21 | Time fStateTime; /// Combine into one MTime (together with value)
|
|---|
| 22 | int fState; /// -2 not initialized, -1 not connected, 0>= state of client
|
|---|
| 23 |
|
|---|
| 24 | std::string fStateMsg; /// The message received with the last state change
|
|---|
| 25 |
|
|---|
| 26 | DimStampedInfo fInfoState; /// The dim service subscription
|
|---|
| 27 |
|
|---|
| 28 | protected:
|
|---|
| 29 | void infoHandler();
|
|---|
| 30 |
|
|---|
| 31 | public:
|
|---|
| 32 | StateClient(const std::string &name, MessageImp &imp);
|
|---|
| 33 |
|
|---|
| 34 | bool IsConnected() const { return fState>=0; }
|
|---|
| 35 | int GetState() const { return fState; }
|
|---|
| 36 | std::string GetMsg() const { return fStateMsg; }
|
|---|
| 37 | };
|
|---|
| 38 |
|
|---|
| 39 | // **************************************************************************
|
|---|
| 40 | /** @class RemoteControlImp
|
|---|
| 41 |
|
|---|
| 42 | @brief This implements the basic functions of a remote control via dim
|
|---|
| 43 |
|
|---|
| 44 | Through a ServiceList object this object subscribes to all available
|
|---|
| 45 | SERVICE_LISTs in the dim network. This allows to keep an up-to-date
|
|---|
| 46 | list of all servers and services. Its ProcessCommand member function
|
|---|
| 47 | allows to emit commands according to the services found in the network.
|
|---|
| 48 | Its infoHandler() is called as an update notifier from the ClientList
|
|---|
| 49 | object.
|
|---|
| 50 |
|
|---|
| 51 | **/
|
|---|
| 52 | // **************************************************************************
|
|---|
| 53 | #include "ServiceList.h"
|
|---|
| 54 | #include "DimErrorRedirecter.h"
|
|---|
| 55 |
|
|---|
| 56 | using namespace std;
|
|---|
| 57 |
|
|---|
| 58 | class RemoteControlImp : public MessageImp, public DimErrorRedirecter, public DimInfoHandler
|
|---|
| 59 | {
|
|---|
| 60 | private:
|
|---|
| 61 | std::ostream &lout; /// Output stream for local synchrounous output
|
|---|
| 62 |
|
|---|
| 63 | protected:
|
|---|
| 64 | typedef std::map<const std::string, StateClient*> ClientList;
|
|---|
| 65 |
|
|---|
| 66 | ServiceList fServiceList; /// An up-to-date list of all available commands
|
|---|
| 67 | ClientList fClientList; /// A list with all MESSAGE services to which we subscribed
|
|---|
| 68 |
|
|---|
| 69 | std::string fCurrentServer; /// The server to which we currently cd'ed
|
|---|
| 70 |
|
|---|
| 71 | void infoHandler();
|
|---|
| 72 |
|
|---|
| 73 | protected:
|
|---|
| 74 | // Redirect asynchronous output to the output window
|
|---|
| 75 | RemoteControlImp(std::ostream &out, std::ostream &in) :
|
|---|
| 76 | MessageImp(out),
|
|---|
| 77 | DimErrorRedirecter(static_cast<MessageImp&>(*this)),
|
|---|
| 78 | lout(in), fServiceList("CMD", out)
|
|---|
| 79 | {
|
|---|
| 80 | fServiceList.SetHandler(this);
|
|---|
| 81 | }
|
|---|
| 82 | bool ProcessCommand(const std::string &str);
|
|---|
| 83 | };
|
|---|
| 84 |
|
|---|
| 85 | // **************************************************************************
|
|---|
| 86 | /** @class RemoteControl
|
|---|
| 87 |
|
|---|
| 88 | @brief Implements a remote control based on a Readline class for the dim network
|
|---|
| 89 |
|
|---|
| 90 | This template implements all functions which overwrite any function from the
|
|---|
| 91 | Readline class. Since several derivatives of the Readline class implement
|
|---|
| 92 | different kind of Readline access, this class can be derived by any of them
|
|---|
| 93 | due to its template argument. However, the normal case will be
|
|---|
| 94 | deriving it from either Console or Shell.
|
|---|
| 95 |
|
|---|
| 96 | @tparam T
|
|---|
| 97 | The base class for RemoteControl. Either Readlien or a class
|
|---|
| 98 | deriving from it. This is usually either Console or Shell.
|
|---|
| 99 |
|
|---|
| 100 | **/
|
|---|
| 101 | // **************************************************************************
|
|---|
| 102 | #include "WindowLog.h"
|
|---|
| 103 |
|
|---|
| 104 | template <class T>
|
|---|
| 105 | class RemoteControl : public T, public RemoteControlImp
|
|---|
| 106 | {
|
|---|
| 107 | private:
|
|---|
| 108 | std::ostream &lout; /// Output stream for local synchrounous output
|
|---|
| 109 |
|
|---|
| 110 | // This funtion defines which generator should be called.
|
|---|
| 111 | // If it returns 0 the standard reaqdline generator are called.
|
|---|
| 112 | // Otherwise set the right generator with rl_completion_matches.
|
|---|
| 113 | char **Completion(const char *text, int start, int)
|
|---|
| 114 | {
|
|---|
| 115 | // Get the whole buffer before the tab-position
|
|---|
| 116 | const string s = string(T::GetBuffer(), 0, start);
|
|---|
| 117 | const string l = T::TrimSpaces(s.c_str());
|
|---|
| 118 | if (l.empty())
|
|---|
| 119 | {
|
|---|
| 120 | if (fCurrentServer.empty())
|
|---|
| 121 | return T::Complete(fServiceList.GetServerList(), text);
|
|---|
| 122 | else
|
|---|
| 123 | return T::Complete(fServiceList.GetServiceList(fCurrentServer), text);
|
|---|
| 124 | }
|
|---|
| 125 | return T::Complete(fServiceList.GetServiceList(l), text);
|
|---|
| 126 | }
|
|---|
| 127 |
|
|---|
| 128 | void infoHandler()
|
|---|
| 129 | {
|
|---|
| 130 | RemoteControlImp::infoHandler();
|
|---|
| 131 | if (!fCurrentServer.empty() && !fServiceList.HasServer(fCurrentServer))
|
|---|
| 132 | {
|
|---|
| 133 | fCurrentServer = "";
|
|---|
| 134 | T::UpdatePrompt();
|
|---|
| 135 | }
|
|---|
| 136 | }
|
|---|
| 137 |
|
|---|
| 138 | public:
|
|---|
| 139 | // Redirect asynchronous output to the output window
|
|---|
| 140 | RemoteControl(const char *name) : T(name),
|
|---|
| 141 | RemoteControlImp(T::GetStreamOut(), T::GetStreamIn()),
|
|---|
| 142 | lout(T::GetStreamIn())
|
|---|
| 143 | {
|
|---|
| 144 | fServiceList.SetHandler(this);
|
|---|
| 145 | }
|
|---|
| 146 |
|
|---|
| 147 |
|
|---|
| 148 | bool PrintGeneralHelp()
|
|---|
| 149 | {
|
|---|
| 150 | T::PrintGeneralHelp();
|
|---|
| 151 | lout << " " << kUnderline << "Specific commands:" << endl;
|
|---|
| 152 | lout << kBold << " s,servers " << kReset << "List all servers which are connected." << endl;
|
|---|
| 153 | lout << endl;
|
|---|
| 154 | return true;
|
|---|
| 155 | }
|
|---|
| 156 |
|
|---|
| 157 | bool PrintCommands()
|
|---|
| 158 | {
|
|---|
| 159 | lout << endl << kBold << "List of commands:" << endl;
|
|---|
| 160 | fServiceList.PrintServiceList(lout);
|
|---|
| 161 | return true;
|
|---|
| 162 | }
|
|---|
| 163 |
|
|---|
| 164 | // returns whether a command should be put into the history
|
|---|
| 165 | bool Process(const std::string &str)
|
|---|
| 166 | {
|
|---|
| 167 | if (T::Process(str))
|
|---|
| 168 | return true;
|
|---|
| 169 |
|
|---|
| 170 | if (str=="servers" || str=="s")
|
|---|
| 171 | {
|
|---|
| 172 | fServiceList.PrintServerList(lout);
|
|---|
| 173 | return true;
|
|---|
| 174 | }
|
|---|
| 175 |
|
|---|
| 176 | return ProcessCommand(str);
|
|---|
| 177 | }
|
|---|
| 178 | void Run(const char * = 0)
|
|---|
| 179 | {
|
|---|
| 180 | lout << endl;
|
|---|
| 181 | lout << kBlue << kBold << "You are on the terminal of the MCP -" << endl;
|
|---|
| 182 | lout << kBlue << kBold << "the Master Control Program." << endl;
|
|---|
| 183 | lout << endl;
|
|---|
| 184 | lout << kBlue << kBold << "Hello Flynn..." << endl;
|
|---|
| 185 | lout << endl;
|
|---|
| 186 |
|
|---|
| 187 | T::Run();
|
|---|
| 188 | }
|
|---|
| 189 | };
|
|---|
| 190 |
|
|---|
| 191 |
|
|---|
| 192 |
|
|---|
| 193 | // **************************************************************************
|
|---|
| 194 | /** @class RemoteConsole
|
|---|
| 195 |
|
|---|
| 196 | @brief Derives the RemoteControl from Control and adds a proper prompt
|
|---|
| 197 |
|
|---|
| 198 | This is basically a RemoteControl, which derives through the template
|
|---|
| 199 | argument from the Console class. It enhances the functionality of
|
|---|
| 200 | the remote control with a proper updated prompt.
|
|---|
| 201 |
|
|---|
| 202 | */
|
|---|
| 203 | // **************************************************************************
|
|---|
| 204 | #include "Console.h"
|
|---|
| 205 |
|
|---|
| 206 | class RemoteConsole : public RemoteControl<Console>
|
|---|
| 207 | {
|
|---|
| 208 | public:
|
|---|
| 209 | RemoteConsole(const char *name, bool continous=false) :
|
|---|
| 210 | RemoteControl<Console>(name)
|
|---|
| 211 | {
|
|---|
| 212 | SetContinous(continous);
|
|---|
| 213 | }
|
|---|
| 214 | string GetUpdatePrompt() const;
|
|---|
| 215 | };
|
|---|
| 216 |
|
|---|
| 217 | // **************************************************************************
|
|---|
| 218 | /** @class RemoteShell
|
|---|
| 219 |
|
|---|
| 220 | @brief Derives the RemoteControl from Shell and adds colored prompt
|
|---|
| 221 |
|
|---|
| 222 | This is basically a RemoteControl, which derives through the template
|
|---|
| 223 | argument from the Shell class. It enhances the functionality of
|
|---|
| 224 | the local control with a proper updated prompt.
|
|---|
| 225 |
|
|---|
| 226 | */
|
|---|
| 227 | // **************************************************************************
|
|---|
| 228 | #include "Shell.h"
|
|---|
| 229 |
|
|---|
| 230 | class RemoteShell : public RemoteControl<Shell>
|
|---|
| 231 | {
|
|---|
| 232 | public:
|
|---|
| 233 | RemoteShell(const char *name, bool = false) :
|
|---|
| 234 | RemoteControl<Shell>(name)
|
|---|
| 235 | {
|
|---|
| 236 | }
|
|---|
| 237 | string GetUpdatePrompt() const;
|
|---|
| 238 | };
|
|---|
| 239 |
|
|---|
| 240 | #endif
|
|---|