Make pbx_lua handle managing the autoservice better.
Make autoservice_start() and autoservice_stop() return nothing. Also check if the autoservice flag is set before starting or stopping the autoservice and stop and start the autoservice when returning control to and getting control from the pbx engine. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@317803 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
1804a664e3
commit
19b6396301
|
@ -47,6 +47,7 @@ pbx_lua:
|
||||||
(such as app.goto). Now when an application such as app.goto() is called,
|
(such as app.goto). Now when an application such as app.goto() is called,
|
||||||
control is returned back to the pbx engine and the current extension
|
control is returned back to the pbx engine and the current extension
|
||||||
function stops executing.
|
function stops executing.
|
||||||
|
- autoservice_start() and autoservice_start() no longer return a value.
|
||||||
|
|
||||||
===========================================================
|
===========================================================
|
||||||
===========================================================
|
===========================================================
|
||||||
|
|
|
@ -717,26 +717,28 @@ static int lua_func_read(lua_State *L)
|
||||||
* This function will set a flag that will cause pbx_lua to maintain an
|
* This function will set a flag that will cause pbx_lua to maintain an
|
||||||
* autoservice on this channel. The autoservice will automatically be stopped
|
* autoservice on this channel. The autoservice will automatically be stopped
|
||||||
* and restarted before calling applications and functions.
|
* and restarted before calling applications and functions.
|
||||||
*
|
|
||||||
* \return This function returns the result of the ast_autoservice_start()
|
|
||||||
* function as a boolean to its lua caller.
|
|
||||||
*/
|
*/
|
||||||
static int lua_autoservice_start(lua_State *L)
|
static int lua_autoservice_start(lua_State *L)
|
||||||
{
|
{
|
||||||
struct ast_channel *chan;
|
struct ast_channel *chan;
|
||||||
int res;
|
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
if (lua_toboolean(L, -1)) {
|
||||||
|
/* autservice already running */
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
|
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
|
||||||
chan = lua_touserdata(L, -1);
|
chan = lua_touserdata(L, -1);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
res = ast_autoservice_start(chan);
|
ast_autoservice_start(chan);
|
||||||
|
|
||||||
lua_pushboolean(L, !res);
|
lua_pushboolean(L, 1);
|
||||||
lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
|
lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
return 0;
|
||||||
lua_pushboolean(L, !res);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -748,26 +750,28 @@ static int lua_autoservice_start(lua_State *L)
|
||||||
* This function will stop any autoservice running and turn off the autoservice
|
* This function will stop any autoservice running and turn off the autoservice
|
||||||
* flag. If this function returns false, it's probably because no autoservice
|
* flag. If this function returns false, it's probably because no autoservice
|
||||||
* was running to begin with.
|
* was running to begin with.
|
||||||
*
|
|
||||||
* \return This function returns the result of the ast_autoservice_stop()
|
|
||||||
* function as a boolean to its lua caller.
|
|
||||||
*/
|
*/
|
||||||
static int lua_autoservice_stop(lua_State *L)
|
static int lua_autoservice_stop(lua_State *L)
|
||||||
{
|
{
|
||||||
struct ast_channel *chan;
|
struct ast_channel *chan;
|
||||||
int res;
|
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
if (!lua_toboolean(L, -1)) {
|
||||||
|
/* no autservice running */
|
||||||
|
lua_pop(L, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
|
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
|
||||||
chan = lua_touserdata(L, -1);
|
chan = lua_touserdata(L, -1);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
res = ast_autoservice_stop(chan);
|
ast_autoservice_stop(chan);
|
||||||
|
|
||||||
lua_pushboolean(L, 0);
|
lua_pushboolean(L, 0);
|
||||||
lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
|
lua_setfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
return 0;
|
||||||
lua_pushboolean(L, !res);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -1429,7 +1433,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten
|
||||||
ast_module_user_remove(u);
|
ast_module_user_remove(u);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
if (lua_toboolean(L, -1)) {
|
||||||
|
ast_autoservice_start(chan);
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
lua_update_registry(L, context, exten, priority);
|
lua_update_registry(L, context, exten, priority);
|
||||||
|
|
||||||
lua_pushstring(L, context);
|
lua_pushstring(L, context);
|
||||||
|
@ -1459,6 +1469,13 @@ static int exec(struct ast_channel *chan, const char *context, const char *exten
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
lua_remove(L, error_func);
|
lua_remove(L, error_func);
|
||||||
|
|
||||||
|
lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
|
||||||
|
if (lua_toboolean(L, -1)) {
|
||||||
|
ast_autoservice_stop(chan);
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
if (!chan) lua_close(L);
|
if (!chan) lua_close(L);
|
||||||
ast_module_user_remove(u);
|
ast_module_user_remove(u);
|
||||||
return res;
|
return res;
|
||||||
|
|
Reference in New Issue