HoverRace  2.0
SysConsole.h
Go to the documentation of this file.
1 
2 // SysConsole.h
3 //
4 // Copyright (c) 2013-2016 Michael Imamura.
5 //
6 // Licensed under GrokkSoft HoverRace SourceCode License v1.0(the "License");
7 // you may not use this file except in compliance with the License.
8 //
9 // A copy of the license should have been attached to the package from which
10 // you have taken this file. If you can not find the license you can not use
11 // this file.
12 //
13 //
14 // The author makes no representations about the suitability of
15 // this software for any purpose. It is provided "as is" "AS IS",
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
17 // implied.
18 //
19 // See the License for the specific language governing permissions
20 // and limitations under the License.
21 
22 #pragma once
23 
24 #include <boost/circular_buffer.hpp>
25 
26 #include "../../../engine/Util/Log.h"
27 
28 #include "Console.h"
29 
30 // Previously defined in WinGDI.h.
31 #ifdef ERROR
32 # undef ERROR
33 #endif
34 
35 namespace HoverRace {
36  namespace Client {
37  namespace HoverScript {
38  class DebugPeer;
39  class GamePeer;
40  class InputPeer;
41  class MetaSession;
42  }
43  class ClientSession;
44  class GameDirector;
45  }
46 }
47 
48 namespace HoverRace {
49 namespace Client {
50 namespace HoverScript {
51 
60 class SysConsole : public Console
61 {
62  using SUPER = Console;
63 
64 public:
66  DebugPeer &debugPeer, GamePeer &gamePeer, InputPeer &inputPeer,
67  size_t maxLogLines = 512,
68  size_t maxHistory = 64);
69  virtual ~SysConsole();
70 
71 protected:
72  void InitEnv() override;
73 
74 public:
75  void Advance(Util::OS::timestamp_t tick) override { HR_UNUSED(tick); }
76 
77 private:
78  void OnSessionChanged(std::shared_ptr<MetaSession> metaSession);
79 
80 public:
81  void Clear() override;
82  void SubmitChunkWithHistory(const std::string &s);
83 
84 public:
85  enum class LogLevel { HISTORY, NOTE, INFO, ERROR };
86  struct LogLine
87  {
88  LogLine(int idx, LogLevel level, const std::string &line) :
89  idx(idx), level(level), line(line) { }
90 
91  LogLine &operator=(const LogLine&) = delete;
92 
93  const int idx;
94  const LogLevel level;
95  const std::string line;
96  };
97 private:
98  void OnLog(const Util::Log::Entry &entry);
99  void AddLogLine(LogLevel level, const std::string &line);
100 public:
101  void AddIntroLines();
102  void LogHistory(const std::string &s);
103  void LogNote(const std::string &s);
104  void LogInfo(const std::string &s) override;
105  void LogError(const std::string &s) override;
106 
107  void LoadPrevCmd();
108  void LoadNextCmd();
109 
110 public:
111  int GetEndLogIndex() const;
112 
117  template<class Function>
118  void ReadLogs(Function fn)
119  {
120  if (!logLines.empty()) {
121  std::for_each(logLines.cbegin(), logLines.cend(), fn);
122  }
123  }
124 
130  template<class Function>
131  void ReadLogs(size_t start, Function fn)
132  {
133  if (!logLines.empty()) {
134  if (start < baseLogIdx) {
135  ReadLogs(fn);
136  }
137  else {
138  // Safe case since the end log index only returns -1 if empty.
139  size_t endIdx = static_cast<size_t>(GetEndLogIndex());
140  ReadLogs(start, endIdx, fn);
141  }
142  }
143  }
144 
151  template<class Function>
152  void ReadLogs(size_t start, size_t end, Function fn)
153  {
154  if (logLines.empty()) return;
155  if (start > end) return;
156  size_t endIdx = baseLogIdx + logLines.size() - 1;
157  if (start > endIdx) return;
158  size_t idx = start - baseLogIdx;
159 
160  if (start == end) {
161  fn(logLines.at(idx));
162  }
163  else {
164  if (start < baseLogIdx) start = baseLogIdx;
165  auto startIter = logLines.begin();
166  std::advance(startIter, start - baseLogIdx);
167  auto endIter = logLines.end();
168  if (end <= endIdx) {
169  endIter = startIter;
170  std::advance(endIter, end - start + 1);
171  }
172  std::for_each(startIter, endIter, fn);
173  }
174  }
175 
176  std::string &GetCommandLine() { return commandLine; }
177 
178 public:
180  using logClearedSignal_t = boost::signals2::signal<void()>;
181  logClearedSignal_t &GetLogClearedSignal() { return logClearedSignal; }
182 
184  using logAddedSignal_t = boost::signals2::signal<void(size_t)>;
186 
187 public:
188  // HelpHandler.
189  void HelpClass(const Script::Help::Class &cls) override;
190  void HelpMethod(const Script::Help::Class &cls,
191  const Script::Help::Method &method) override;
192 
193 public:
194  static int LQuit(lua_State *L);
195 
196 private:
201  std::shared_ptr<MetaSession> metaSession;
202 
203  boost::signals2::scoped_connection sessionChangedConn;
204 
206  size_t maxLogLines;
207  std::deque<LogLine> logLines;
208  size_t baseLogIdx;
209 
210  using history_t = boost::circular_buffer<std::string>;
212  history_t::iterator curHistory;
213 
214  std::string commandLine;
215 
216  boost::signals2::scoped_connection logConn;
217 
220 };
221 
222 } // namespace HoverScript
223 } // namespace Client
224 } // namespace HoverRace
225 
const int idx
Definition: SysConsole.h:93
DebugPeer & debugPeer
Definition: SysConsole.h:198
boost::signals2::signal< void()> logClearedSignal_t
Fired when the log is cleared.
Definition: SysConsole.h:180
Definition: Log.h:73
logClearedSignal_t & GetLogClearedSignal()
Definition: SysConsole.h:181
Scripting peer for system-level control of the game.
Definition: GamePeer.h:56
const LogLevel level
Definition: SysConsole.h:94
LogLine(int idx, LogLevel level, const std::string &line)
Definition: SysConsole.h:88
history_t history
Definition: SysConsole.h:211
Interface for game client shells.
Definition: GameDirector.h:57
void ReadLogs(Function fn)
Read all log entries.
Definition: SysConsole.h:118
std::shared_ptr< MetaSession > metaSession
Definition: SysConsole.h:201
GameDirector & director
Definition: SysConsole.h:197
LogLevel
Definition: SysConsole.h:85
GameDirector & director
Definition: TestLabScene.cpp:160
history_t::iterator curHistory
Definition: SysConsole.h:212
boost::signals2::scoped_connection logConn
Definition: SysConsole.h:216
A script environment.
Definition: Env.h:54
logClearedSignal_t logClearedSignal
Definition: SysConsole.h:218
void Advance(Util::OS::timestamp_t tick) override
Definition: SysConsole.h:75
logAddedSignal_t & GetLogAddedSignal()
Definition: SysConsole.h:185
std::string & GetCommandLine()
Definition: SysConsole.h:176
API documentation for a Lua method.
Definition: Method.h:50
bool introWritten
Definition: SysConsole.h:205
std::deque< LogLine > logLines
Definition: SysConsole.h:207
void ReadLogs(size_t start, size_t end, Function fn)
Read a subset of log entries, for a specific range.
Definition: SysConsole.h:152
Base class for debug consoles.
Definition: Console.h:45
InputPeer & inputPeer
Definition: SysConsole.h:200
boost::circular_buffer< std::string > history_t
Definition: SysConsole.h:210
Provides access to debugging tools.
Definition: DebugPeer.h:50
logAdded_t logAddedSignal
Definition: Log.cpp:54
GamePeer & gamePeer
Definition: SysConsole.h:199
std::string commandLine
Definition: SysConsole.h:214
Scripting peer for input.
Definition: InputPeer.h:45
int idx
Definition: SdlDisplay.cpp:254
const std::string line
Definition: SysConsole.h:95
API documentation for a Lua class.
Definition: Class.h:52
Definition: Announcement.h:24
logAddedSignal_t logAddedSignal
Definition: SysConsole.h:219
boost::signals2::scoped_connection sessionChangedConn
Definition: SysConsole.h:203
void ReadLogs(size_t start, Function fn)
Read a subset of log entries, from a starting index to the end.
Definition: SysConsole.h:131
size_t maxLogLines
Definition: SysConsole.h:206
Definition: Symbol.h:566
size_t baseLogIdx
Index of the first item in logLines.
Definition: SysConsole.h:208
boost::signals2::signal< void(size_t)> logAddedSignal_t
Fired when a log line is added. Parameter is the log index.
Definition: SysConsole.h:184
Global always-on console.
Definition: SysConsole.h:60
MR_Int64 timestamp_t
Definition: OS.h:55
A script environment.
Definition: Core.h:66