129 virtual void OnStart();
136 virtual void OnStop();
140 virtual bool WritePrompt();
145 virtual bool ReadAndProcessInput();
150 virtual bool ProcessInput(
int ch);
157 virtual bool EchoInput(
char ch);
165 virtual void OnCompletedLine();
172 PCLI & GetCLI()
const {
return m_cli; }
176 bool IsProcessingCommand()
const {
return m_state == e_ProcessingCommand; }
181 bool InternalMoveCursor(
bool left, PINDEX count);
182 bool InternalEchoCommandLine(PINDEX echoPosition, PINDEX moveLeftCount);
183 bool InternalMoveHistoryCommand(
int direction);
187 PINDEX m_editPosition;
188 bool m_ignoreNextEOL;
190 PINDEX m_historyPosition;
219 Context & WriteUsage();
223 Context & WriteError(
232 Context & GetContext()
const {
return m_context; }
248 const char * prompt = NULL
268 bool runInBackground =
true
282 Context * StartContext(
284 bool autoDelete =
true,
285 bool runInBackground =
true
286 ) {
return StartContext(channel, channel, autoDelete, autoDelete, runInBackground); }
287 Context * StartContext(
290 bool autoDeleteRead =
true,
291 bool autoDeleteWrite =
true,
292 bool runInBackground =
true
298 virtual Context * StartForeground();
307 ) {
return Run(&channel, &channel,
false,
false); }
310 bool autoDelete =
true
311 ) {
return Run(channel, channel, autoDelete, autoDelete); }
315 bool autoDeleteRead =
true,
316 bool autoDeleteWrite =
true
326 ) {
return context != NULL && context->Run(); }
331 virtual Context * CreateContext();
336 virtual Context * AddContext(
337 Context * context = NULL
343 virtual void RemoveContext(
349 virtual void GarbageCollection();
358 virtual void OnReceivedLine(
374 virtual bool OnLogIn(
396 const char * command,
398 const char * help = NULL,
399 const char * usage = NULL,
400 const char * argSpec = NULL
406 const char * command,
409 const char * help = NULL,
416 const char * command,
421 const char * help = NULL,
425 template <
typename TYPE>
427 const char * command,
431 TYPE maxValue = INT_MAX,
432 const char * help = NULL,
436 return SetCommand(command,
PRefVar<TYPE>(value), name, minValue, maxValue, help, notifier);
441 virtual void ShowHelp(
452 const PString & GetNewLine()
const {
return m_newLine; }
457 void SetNewLine(
const PString & newLine) { m_newLine = newLine; }
462 bool GetRequireEcho()
const {
return m_requireEcho; }
467 void SetRequireEcho(
bool requireEcho) { m_requireEcho = requireEcho; }
472 const PIntArray & GetEditCodes()
const {
return m_editCodes; }
477 void SetEditCodes(
const PIntArray & editCodes) { m_editCodes = editCodes; }
482 const PIntArray & GetEraseCodes()
const {
return m_eraseCodes; }
487 void SetEraseCodes(
const PIntArray & eraseCodes) { m_eraseCodes = eraseCodes; }
492 const PIntArray & GetLeftCodes()
const {
return m_leftCodes; }
497 void SetLeftCodes(
const PIntArray & leftCodes) { m_leftCodes = leftCodes; }
502 const PIntArray & GetRightCodes()
const {
return m_rightCodes; }
507 void SetRightCodes(
const PIntArray & rightCodes) { m_rightCodes = rightCodes; }
512 const PIntArray & GetBeginCodes()
const {
return m_beginCodes; }
517 void SetBeginCodes(
const PIntArray & beginCodes) { m_beginCodes = beginCodes; }
522 const PIntArray & GetEndCodes()
const {
return m_endCodes; }
527 void SetEndCodes(
const PIntArray & endCodes) { m_endCodes = endCodes; }
532 const PIntArray & GetPrevCmdCodes()
const {
return m_prevCmdCodes; }
537 void SetPrevCmdCodes(
const PIntArray & prevCmdCodes) { m_prevCmdCodes = prevCmdCodes; }
542 const PIntArray & GetNextCmdCodes()
const {
return m_nextCmdCodes; }
547 void SetNextCmdCodes(
const PIntArray & nextCmdCodes) { m_nextCmdCodes = nextCmdCodes; }
552 void SetAutoFillCodes(
const PIntArray & autoFillCodes) { m_autoFillCodes = autoFillCodes; }
557 const PIntArray & GetAutoFillCodes()
const {
return m_autoFillCodes; }
562 const PString & GetPrompt()
const {
return m_prompt; }
567 void SetPrompt(
const PString & prompt) { m_prompt = prompt; }
572 const PString & GetUsernamePrompt()
const {
return m_usernamePrompt; }
577 void SetUsernamePrompt(
const PString & prompt) { m_usernamePrompt = prompt; }
582 const PString & GetPasswordPrompt()
const {
return m_passwordPrompt; }
587 void SetPasswordPrompt(
const PString & prompt) { m_passwordPrompt = prompt; }
592 const PString & GetUsername()
const {
return m_username; }
597 void SetUsername(
const PString & username) { m_username = username; }
602 const PString & GetPassword()
const {
return m_password; }
607 void SetPassword(
const PString & password) { m_password = password; }
612 const PCaselessString & GetCommentCommand()
const {
return m_commentCommand; }
617 void SetCommentCommand(
const PCaselessString & commentCommand) { m_commentCommand = commentCommand; }
622 const PCaselessString & GetExitCommand()
const {
return m_exitCommand; }
627 void SetExitCommand(
const PCaselessString & exitCommand) { m_exitCommand = exitCommand; }
632 const PCaselessString & GetHelpCommand()
const {
return m_helpCommand; }
637 void SetHelpCommand(
const PCaselessString & helpCommand) { m_helpCommand = helpCommand; }
643 const PString & GetHelpOnHelp()
const {
return m_helpOnHelp; }
649 void SetHelpOnHelp(
const PCaselessString & helpOnHelp) { m_helpOnHelp = helpOnHelp; }
654 const PCaselessString & GetRepeatCommand()
const {
return m_repeatCommand; }
659 void SetRepeatCommand(
const PCaselessString & repeatCommand) { m_repeatCommand = repeatCommand; }
664 const PCaselessString & GetHistoryCommand()
const {
return m_historyCommand; }
669 void SetHistoryCommand(
const PCaselessString & historyCommand) { m_historyCommand = historyCommand; }
674 const PString & GetNoHistoryError()
const {
return m_noHistoryError; }
679 void SetNoHistoryError(
const PString & noHistoryError) { m_noHistoryError = noHistoryError; }
684 const PString & GetCommandUsagePrefix()
const {
return m_commandUsagePrefix; }
689 void SetCommandUsagePrefix(
const PString & commandUsagePrefix) { m_commandUsagePrefix = commandUsagePrefix; }
694 const PString & GetCommandErrorPrefix()
const {
return m_commandErrorPrefix; }
699 void SetCommandErrorPrefix(
const PString & commandErrorPrefix) { m_commandErrorPrefix = commandErrorPrefix; }
704 const PString & GetUnknownCommandError()
const {
return m_unknownCommandError; }
709 void SetUnknownCommandError(
const PString & unknownCommandError) { m_unknownCommandError = unknownCommandError; }
714 const PString & GetAmbiguousCommandError()
const {
return m_ambiguousCommandError; }
719 void SetAmbiguousCommandError(
const PString & ambiguousCommandError) { m_ambiguousCommandError = ambiguousCommandError; }
724 const PCaselessString & GetScriptCommand()
const {
return m_scriptCommand; }
729 void SetScriptCommand(
const PCaselessString & scriptCommand) { m_scriptCommand = scriptCommand; }
734 const PString & GetNoScriptError()
const {
return m_noScriptError; }
739 void SetNoScriptError(
const PString & noScriptError) { m_noScriptError = noScriptError; }
770 PString m_ambiguousCommandError;
774 struct InternalCommand
776 InternalCommand(
const PNotifier & notifier,
const char * help,
const char * usage,
const char * argSpec,
const char * varName);
777 InternalCommand(
const InternalCommand & other);
779 bool IsMatch(
const PArgList & args,
bool partial =
false)
const;
780 bool operator<(
const InternalCommand & other)
const;
793 typedef std::set<InternalCommand> Commands_t;
794 Commands_t m_commands;
795 bool InternalSetCommand(
const char * commands,
const InternalCommand & info);
797 virtual void OnSetBooleanCommand(Arguments & args,
const InternalCommand & cmd);
798 virtual void OnSetIntegerCommand(Arguments & args,
const InternalCommand & cmd);
800 typedef std::list<Context *> ContextList_t;
801 ContextList_t m_contextList;
808 class PCLIStandard :
public PCLI
816 const char * prompt = NULL
825 virtual Context * StartForeground();
835 ) {
return RunScript(&channel,
false); }
838 bool autoDelete =
true
848 class PCLISocket :
public PCLI
855 const char * prompt = NULL,
856 bool singleThreadForAll =
false
868 bool runInBackground =
true
883 virtual Context * AddContext(
884 Context * context = NULL
890 virtual void RemoveContext(
905 WORD GetPort()
const {
return m_listenSocket.GetPort(); }
910 bool HandleSingleThreadForAll();
911 bool HandleIncoming();
914 bool m_singleThreadForAll;
919 typedef std::map<PSocket *, Context *> ContextMap_t;
920 ContextMap_t m_contextBySocket;
929 class PCLITelnet :
public PCLISocket
936 const char * prompt = NULL,
937 bool singleThreadForAll =
false
953 class PCLICurses :
public PCLI
967 virtual Context * StartForeground();
972 virtual Context * CreateContext();
978 ) { rows = m_maxRows; cols = m_maxCols; }
992 PCLICurses & m_owner;
996 unsigned m_pagedRows;
998 Window(PCLICurses & owner, Borders border);
1002 virtual PBoolean Write(
const void * data, PINDEX length);
1005 virtual bool FillChar(
1012 virtual void SetPosition(
1016 virtual void GetPosition(
1021 virtual void SetSize(
1024 Borders border = NumBorders
1026 virtual void GetSize(
1032 virtual void SetCursor(
1036 virtual void GetCursor(
1041 virtual void Refresh() = 0;
1042 virtual void Clear() = 0;
1043 virtual void Scroll(
int n = 1) = 0;
1049 bool GetPageMode()
const {
return m_pageMode; }
1051 virtual void SetFocus();
1052 bool HasFocus()
const {
return m_focus; }
1063 Borders border = NoBorder
1074 PINDEX GetWindowCount()
const {
return m_windows.GetSize(); }
1078 ) {
return dynamic_cast<Window *
>(m_windows.GetAt(idx)); }
1080 Window & operator[](PINDEX idx)
const {
return m_windows[idx]; }
1082 Window * GetFocusWindow()
const;
1084 virtual void Refresh();
1086 virtual bool WaitPage();
1091 const PString & GetPageWaitPrompt()
const {
return m_pageWaitPrompt; }
1096 void SetPageWaitPrompt(
const PString & prompt) { m_pageWaitPrompt = prompt; }
1111 #endif // PTLIB_CLI_H