mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
Make realtime pbx understand patterns.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4326 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -356,7 +356,7 @@ int ast_matchmore_extension(struct ast_channel *c, const char *context, const ch
|
|||||||
* Returns 1 on match, 0 on failure
|
* Returns 1 on match, 0 on failure
|
||||||
*/
|
*/
|
||||||
int ast_extension_match(const char *pattern, const char *extension);
|
int ast_extension_match(const char *pattern, const char *extension);
|
||||||
|
int ast_extension_close(const char *pattern, const char *data, int needmore);
|
||||||
//! Launch a new extension (i.e. new stack)
|
//! Launch a new extension (i.e. new stack)
|
||||||
/*!
|
/*!
|
||||||
* \param c not important
|
* \param c not important
|
||||||
|
6
pbx.c
6
pbx.c
@@ -649,7 +649,7 @@ int ast_extension_match(const char *pattern, const char *data)
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int extension_close(const char *pattern, const char *data, int needmore)
|
int ast_extension_close(const char *pattern, const char *data, int needmore)
|
||||||
{
|
{
|
||||||
int match;
|
int match;
|
||||||
/* If "data" is longer, it can'be a subset of pattern unless
|
/* If "data" is longer, it can'be a subset of pattern unless
|
||||||
@@ -749,8 +749,8 @@ static struct ast_exten *pbx_find_extension(struct ast_channel *chan, struct ast
|
|||||||
while(eroot) {
|
while(eroot) {
|
||||||
/* Match extension */
|
/* Match extension */
|
||||||
if ((((action != HELPER_MATCHMORE) && ast_extension_match(eroot->exten, exten)) ||
|
if ((((action != HELPER_MATCHMORE) && ast_extension_match(eroot->exten, exten)) ||
|
||||||
((action == HELPER_CANMATCH) && (extension_close(eroot->exten, exten, 0))) ||
|
((action == HELPER_CANMATCH) && (ast_extension_close(eroot->exten, exten, 0))) ||
|
||||||
((action == HELPER_MATCHMORE) && (extension_close(eroot->exten, exten, 1)))) &&
|
((action == HELPER_MATCHMORE) && (ast_extension_close(eroot->exten, exten, 1)))) &&
|
||||||
(!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
|
(!eroot->matchcid || matchcid(eroot->cidmatch, callerid))) {
|
||||||
e = eroot;
|
e = eroot;
|
||||||
if (*status < STATUS_NO_PRIORITY)
|
if (*status < STATUS_NO_PRIORITY)
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <asterisk/logger.h>
|
#include <asterisk/logger.h>
|
||||||
#include <asterisk/channel.h>
|
#include <asterisk/channel.h>
|
||||||
#include <asterisk/config.h>
|
#include <asterisk/config.h>
|
||||||
|
#include <asterisk/config_pvt.h>
|
||||||
#include <asterisk/options.h>
|
#include <asterisk/options.h>
|
||||||
#include <asterisk/pbx.h>
|
#include <asterisk/pbx.h>
|
||||||
#include <asterisk/module.h>
|
#include <asterisk/module.h>
|
||||||
@@ -34,9 +35,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#define MODE_MATCH 0
|
#define MODE_MATCH 0
|
||||||
#define MODE_MATCHMORE 1
|
#define MODE_MATCHMORE 1
|
||||||
#define MODE_CANMATCH 2
|
#define MODE_CANMATCH 2
|
||||||
|
|
||||||
static char *tdesc = "Realtime Switch";
|
static char *tdesc = "Realtime Switch";
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ static char *tdesc = "Realtime Switch";
|
|||||||
|
|
||||||
The realtime table should have entries for context,exten,priority,app,args
|
The realtime table should have entries for context,exten,priority,app,args
|
||||||
|
|
||||||
The realtime table currently does not support patterns or callerid fields.
|
The realtime table currently does not support callerid fields.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -86,9 +87,12 @@ static char *tdesc = "Realtime Switch";
|
|||||||
static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority, int mode)
|
static struct ast_variable *realtime_switch_common(const char *table, const char *context, const char *exten, int priority, int mode)
|
||||||
{
|
{
|
||||||
struct ast_variable *var;
|
struct ast_variable *var;
|
||||||
|
struct ast_config *cfg;
|
||||||
|
struct ast_category *cat;
|
||||||
char pri[20];
|
char pri[20];
|
||||||
char *ematch;
|
char *ematch;
|
||||||
char rexten[AST_MAX_EXTENSION + 20]="";
|
char rexten[AST_MAX_EXTENSION + 20]="";
|
||||||
|
int match;
|
||||||
snprintf(pri, sizeof(pri), "%d", priority);
|
snprintf(pri, sizeof(pri), "%d", priority);
|
||||||
switch(mode) {
|
switch(mode) {
|
||||||
case MODE_MATCHMORE:
|
case MODE_MATCHMORE:
|
||||||
@@ -104,7 +108,33 @@ static struct ast_variable *realtime_switch_common(const char *table, const char
|
|||||||
ematch = "exten";
|
ematch = "exten";
|
||||||
strncpy(rexten, exten, sizeof(rexten) - 1);
|
strncpy(rexten, exten, sizeof(rexten) - 1);
|
||||||
}
|
}
|
||||||
var = ast_load_realtime(table, "context", context, ematch, rexten, "priority", pri, NULL);
|
var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, NULL);
|
||||||
|
if (!var) {
|
||||||
|
cfg = ast_load_realtime_multientry(table, "exten RLIKE", "_.*", "context", context, "priority", pri, NULL);
|
||||||
|
if (cfg) {
|
||||||
|
cat = cfg->root;
|
||||||
|
while(cat) {
|
||||||
|
switch(mode) {
|
||||||
|
case MODE_MATCHMORE:
|
||||||
|
match = ast_extension_close(cat->name, exten, 1);
|
||||||
|
break;
|
||||||
|
case MODE_CANMATCH:
|
||||||
|
match = ast_extension_close(cat->name, exten, 0);
|
||||||
|
break;
|
||||||
|
case MODE_MATCH:
|
||||||
|
default:
|
||||||
|
match = ast_extension_match(cat->name, exten);
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
var = cat->root;
|
||||||
|
cat->root = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cat = cat->next;
|
||||||
|
}
|
||||||
|
ast_destroy(cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
return var;
|
return var;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -174,6 +174,8 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
char sql[1024];
|
char sql[1024];
|
||||||
char coltitle[256];
|
char coltitle[256];
|
||||||
char rowdata[2048];
|
char rowdata[2048];
|
||||||
|
char *title=NULL;
|
||||||
|
const char *initfield=NULL;
|
||||||
char *op;
|
char *op;
|
||||||
const char *newparam, *newval;
|
const char *newparam, *newval;
|
||||||
char *stringp;
|
char *stringp;
|
||||||
@@ -213,6 +215,9 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
SQLFreeHandle (SQL_HANDLE_STMT, stmt);
|
SQLFreeHandle (SQL_HANDLE_STMT, stmt);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
initfield = ast_strdupa(newparam);
|
||||||
|
if (initfield && (op = strchr(initfield, ' ')))
|
||||||
|
*op = '\0';
|
||||||
newval = va_arg(aq, const char *);
|
newval = va_arg(aq, const char *);
|
||||||
if (!strchr(newparam, ' ')) op = " ="; else op = "";
|
if (!strchr(newparam, ' ')) op = " ="; else op = "";
|
||||||
snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s ?", table, newparam, op);
|
snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s ?", table, newparam, op);
|
||||||
@@ -221,6 +226,8 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s%s ?", newparam, op);
|
snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s%s ?", newparam, op);
|
||||||
newval = va_arg(aq, const char *);
|
newval = va_arg(aq, const char *);
|
||||||
}
|
}
|
||||||
|
if (initfield)
|
||||||
|
snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " ORDER BY %s", initfield);
|
||||||
va_end(aq);
|
va_end(aq);
|
||||||
res = SQLPrepare(stmt, sql, SQL_NTS);
|
res = SQLPrepare(stmt, sql, SQL_NTS);
|
||||||
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
|
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
|
||||||
@@ -259,7 +266,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (rowcount) {
|
while (rowcount--) {
|
||||||
var = NULL;
|
var = NULL;
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
res = SQLFetch(stmt);
|
res = SQLFetch(stmt);
|
||||||
@@ -289,6 +296,8 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
while(stringp) {
|
while(stringp) {
|
||||||
chunk = strsep(&stringp, ";");
|
chunk = strsep(&stringp, ";");
|
||||||
if (chunk && !ast_strlen_zero(ast_strip(chunk))) {
|
if (chunk && !ast_strlen_zero(ast_strip(chunk))) {
|
||||||
|
if (initfield && !strcmp(initfield, coltitle) && !title)
|
||||||
|
title = ast_strdupa(chunk);
|
||||||
if (prev) {
|
if (prev) {
|
||||||
prev->next = ast_new_variable(coltitle, chunk);
|
prev->next = ast_new_variable(coltitle, chunk);
|
||||||
if (prev->next)
|
if (prev->next)
|
||||||
@@ -298,20 +307,20 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (var) {
|
}
|
||||||
cat = ast_new_category("");
|
if (var) {
|
||||||
if (cat) {
|
cat = ast_new_category(title ? title : "");
|
||||||
cat->root = var;
|
if (cat) {
|
||||||
if (!cfg)
|
cat->root = var;
|
||||||
cfg = ast_new_config();
|
if (!cfg)
|
||||||
if (cfg)
|
cfg = ast_new_config();
|
||||||
ast_category_append(cfg, cat);
|
if (cfg)
|
||||||
else
|
ast_category_append(cfg, cat);
|
||||||
ast_category_destroy(cat);
|
else
|
||||||
} else {
|
ast_category_destroy(cat);
|
||||||
ast_log(LOG_WARNING, "Out of memory!\n");
|
} else {
|
||||||
ast_destroy_realtime(var);
|
ast_log(LOG_WARNING, "Out of memory!\n");
|
||||||
}
|
ast_destroy_realtime(var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user