Added "info" subcommand to show more info about running externals.
Added command line completion for command and subcommands. git-svn-id: http://yate.null.ro/svn/yate/trunk@1932 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
parent
0f86f74f85
commit
6fc01e7c92
|
@ -59,6 +59,14 @@ static Mutex s_mutex(true);
|
|||
static int s_timeout = MSG_TIMEOUT;
|
||||
static bool s_timebomb = false;
|
||||
|
||||
static const char* s_cmds[] = {
|
||||
"info",
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
0
|
||||
};
|
||||
|
||||
class ExtModReceiver;
|
||||
class ExtModChan;
|
||||
|
||||
|
@ -218,6 +226,7 @@ public:
|
|||
{ return m_selfWatch; }
|
||||
inline void setRestart(bool restart)
|
||||
{ m_restart = restart; }
|
||||
void describe(String& rval) const;
|
||||
|
||||
private:
|
||||
ExtModReceiver(const char* script, const char* args,
|
||||
|
@ -274,6 +283,8 @@ class ExtModCommand : public MessageHandler
|
|||
public:
|
||||
ExtModCommand(const char *name) : MessageHandler(name) { }
|
||||
virtual bool received(Message &msg);
|
||||
private:
|
||||
bool complete(const String& partLine, const String& partWord, String& rval) const;
|
||||
};
|
||||
|
||||
class ExtListener : public Thread
|
||||
|
@ -401,6 +412,7 @@ void ExtModSource::run()
|
|||
m_chan->setRunning(false);
|
||||
}
|
||||
|
||||
|
||||
ExtModConsumer::ExtModConsumer(Stream* str)
|
||||
: m_str(str), m_total(0)
|
||||
{
|
||||
|
@ -425,6 +437,7 @@ void ExtModConsumer::Consume(const DataBlock& data, unsigned long timestamp)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
ExtModChan* ExtModChan::build(const char* file, const char* args, int type)
|
||||
{
|
||||
ExtModChan* chan = new ExtModChan(file,args,type);
|
||||
|
@ -517,6 +530,7 @@ void ExtModChan::disconnected(bool final, const char *reason)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
MsgHolder::MsgHolder(Message &msg)
|
||||
: m_msg(msg), m_ret(false)
|
||||
{
|
||||
|
@ -1357,6 +1371,35 @@ bool ExtModReceiver::processLine(const char* line)
|
|||
return false;
|
||||
}
|
||||
|
||||
void ExtModReceiver::describe(String& rval) const
|
||||
{
|
||||
rval << "\t";
|
||||
switch (m_role) {
|
||||
case RoleUnknown:
|
||||
rval << "Unknown";
|
||||
break;
|
||||
case RoleGlobal:
|
||||
rval << "Global";
|
||||
break;
|
||||
case RoleChannel:
|
||||
rval << "Channel";
|
||||
break;
|
||||
default:
|
||||
rval << "Invalid";
|
||||
break;
|
||||
}
|
||||
if (m_dead)
|
||||
rval << ", dead";
|
||||
if (m_chan)
|
||||
rval << ", has channel";
|
||||
if (m_restart)
|
||||
rval << ", autorestart";
|
||||
if (m_pid > 0)
|
||||
rval << ", pid=" << m_pid;
|
||||
rval << "\r\n";
|
||||
}
|
||||
|
||||
|
||||
bool ExtModHandler::received(Message& msg)
|
||||
{
|
||||
String dest(msg.getValue("callto"));
|
||||
|
@ -1416,22 +1459,26 @@ bool ExtModHandler::received(Message& msg)
|
|||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool ExtModCommand::received(Message& msg)
|
||||
{
|
||||
String line(msg.getValue("line"));
|
||||
if (!line.startsWith("external",true))
|
||||
return false;
|
||||
return complete(msg.getValue("partline"),msg.getValue("partword"),msg.retValue());;
|
||||
line >> "external";
|
||||
line.trimBlanks();
|
||||
if (line.null()) {
|
||||
if (line.null() || line == "info") {
|
||||
msg.retValue() = "";
|
||||
int n = 0;
|
||||
Lock lock(s_mutex);
|
||||
ObjList *l = &s_modules;
|
||||
for (; l; l=l->next()) {
|
||||
ExtModReceiver *r = static_cast<ExtModReceiver *>(l->get());
|
||||
if (r)
|
||||
if (r) {
|
||||
msg.retValue() << ++n << ". " << r->scriptFile() << " " << r->commandArg() << "\r\n";
|
||||
if (line)
|
||||
r->describe(msg.retValue());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -1465,6 +1512,25 @@ bool ExtModCommand::received(Message& msg)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ExtModCommand::complete(const String& partLine, const String& partWord, String& rval) const
|
||||
{
|
||||
if (partLine.null() && partWord.null())
|
||||
return false;
|
||||
if (partLine.null()) {
|
||||
if (partWord.null() || String("external").startsWith(partWord))
|
||||
rval.append("external","\t");
|
||||
}
|
||||
else if (partLine == "external") {
|
||||
for (const char** list = s_cmds; *list; list++) {
|
||||
String tmp = *list;
|
||||
if (partWord.null() || tmp.startsWith(partWord))
|
||||
rval.append(tmp,"\t");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
ExtListener::ExtListener(const char* name)
|
||||
: Thread("ExtListener"), m_name(name), m_role(ExtModReceiver::RoleUnknown)
|
||||
|
|
Loading…
Reference in New Issue