Thu Apr 28 2011 16:57:15

Asterisk developer's documentation


pbx_realtime.c File Reference

Realtime PBX Module. More...

#include "asterisk.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/frame.h"
#include "asterisk/term.h"
#include "asterisk/manager.h"
#include "asterisk/cli.h"
#include "asterisk/lock.h"
#include "asterisk/md5.h"
#include "asterisk/linkedlists.h"
#include "asterisk/chanvars.h"
#include "asterisk/sched.h"
#include "asterisk/io.h"
#include "asterisk/utils.h"
#include "asterisk/crypto.h"
#include "asterisk/astdb.h"
#include "asterisk/app.h"
Include dependency graph for pbx_realtime.c:

Go to the source code of this file.

Defines

#define EXT_DATA_SIZE   256
#define MODE_CANMATCH   2
#define MODE_MATCH   0
#define MODE_MATCHMORE   1

Enumerations

enum  { OPTION_PATTERNS_DISABLED = (1 << 0) }

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int load_module (void)
static int realtime_canmatch (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
static struct ast_variablerealtime_common (const char *context, const char *exten, int priority, const char *data, int mode)
static int realtime_exec (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
static int realtime_exists (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
static int realtime_matchmore (struct ast_channel *chan, const char *context, const char *exten, int priority, const char *callerid, const char *data)
static struct ast_variablerealtime_switch_common (const char *table, const char *context, const char *exten, int priority, int mode, struct ast_flags flags)
static int unload_module (void)

Variables

static struct ast_module_info
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Switch" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
static struct ast_module_infoast_module_info = &__mod_info
enum { ... }  option_flags
static struct ast_switch realtime_switch
static struct ast_app_option switch_opts [128] = { [ 'p' ] = { .flag = OPTION_PATTERNS_DISABLED },}

Detailed Description

Realtime PBX Module.

Definition in file pbx_realtime.c.


Define Documentation

#define EXT_DATA_SIZE   256

Definition at line 55 of file pbx_realtime.c.

Referenced by realtime_exec().

#define MODE_CANMATCH   2

Definition at line 53 of file pbx_realtime.c.

Referenced by realtime_canmatch(), and realtime_switch_common().

#define MODE_MATCH   0

Definition at line 51 of file pbx_realtime.c.

Referenced by realtime_exec(), realtime_exists(), and realtime_switch_common().

#define MODE_MATCHMORE   1

Definition at line 52 of file pbx_realtime.c.

Referenced by realtime_matchmore(), and realtime_switch_common().


Enumeration Type Documentation

anonymous enum
Enumerator:
OPTION_PATTERNS_DISABLED 

Definition at line 57 of file pbx_realtime.c.


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 296 of file pbx_realtime.c.

static void __unreg_module ( void  ) [static]

Definition at line 296 of file pbx_realtime.c.

static int load_module ( void  ) [static]
static int realtime_canmatch ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid,
const char *  data 
) [static]

Definition at line 176 of file pbx_realtime.c.

References ast_variables_destroy(), MODE_CANMATCH, realtime_common(), and var.

{
   struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_CANMATCH);
   if (var) {
      ast_variables_destroy(var);
      return 1;
   }
   return 0;
}
static struct ast_variable* realtime_common ( const char *  context,
const char *  exten,
int  priority,
const char *  data,
int  mode 
) [static, read]

Definition at line 138 of file pbx_realtime.c.

References ast_app_parse_options(), ast_strdupa, ast_strlen_zero(), buf, realtime_switch_common(), S_OR, switch_opts, table, and var.

Referenced by realtime_canmatch(), realtime_exec(), realtime_exists(), and realtime_matchmore().

{
   const char *ctx = NULL;
   char *table;
   struct ast_variable *var=NULL;
   struct ast_flags flags = { 0, };
   char *buf = ast_strdupa(data);
   if (buf) {
      /* "Realtime" prefix is stripped off in the parent engine.  The
       * remaining string is: [[context@]table][/opts] */
      char *opts = strchr(buf, '/');
      if (opts)
         *opts++ = '\0';
      table = strchr(buf, '@');
      if (table) {
         *table++ = '\0';
         ctx = buf;
      }
      ctx = S_OR(ctx, context);
      table = S_OR(table, "extensions");
      if (!ast_strlen_zero(opts)) {
         ast_app_parse_options(switch_opts, &flags, NULL, opts);
      }
      var = realtime_switch_common(table, ctx, exten, priority, mode, flags);
   }
   return var;
}
static int realtime_exec ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid,
const char *  data 
) [static]

Definition at line 186 of file pbx_realtime.c.

References app, ast_compat_pbx_realtime, ast_log(), ast_strdupa, ast_strlen_zero(), ast_variables_destroy(), ast_verb, COLOR_BRCYAN, COLOR_BRMAGENTA, ast_channel::context, EVENT_FLAG_DIALPLAN, EXT_DATA_SIZE, ast_channel::exten, LOG_NOTICE, LOG_WARNING, manager_event, MODE_MATCH, ast_channel::name, ast_variable::name, ast_variable::next, pbx_exec(), pbx_findapp(), pbx_substitute_variables_helper(), ast_channel::priority, realtime_common(), S_OR, term_color(), ast_channel::uniqueid, ast_variable::value, and var.

{
   int res = -1;
   struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCH);

   if (var) {
      char *tmp="";
      char *app = NULL;
      struct ast_variable *v;

      for (v = var; v ; v = v->next) {
         if (!strcasecmp(v->name, "app"))
            app = ast_strdupa(v->value);
         else if (!strcasecmp(v->name, "appdata")) {
            if (ast_compat_pbx_realtime) {
               char *ptr;
               int in = 0;
               tmp = alloca(strlen(v->value) * 2 + 1);
               for (ptr = tmp; *v->value; v->value++) {
                  if (*v->value == ',') {
                     *ptr++ = '\\';
                     *ptr++ = ',';
                  } else if (*v->value == '|' && !in) {
                     *ptr++ = ',';
                  } else {
                     *ptr++ = *v->value;
                  }

                  /* Don't escape '|', meaning 'or', inside expressions ($[ ]) */
                  if (v->value[0] == '[' && v->value[-1] == '$') {
                     in++;
                  } else if (v->value[0] == ']' && in) {
                     in--;
                  }
               }
               *ptr = '\0';
            } else {
               tmp = ast_strdupa(v->value);
            }
         }
      }
      ast_variables_destroy(var);
      if (!ast_strlen_zero(app)) {
         struct ast_app *a = pbx_findapp(app);
         if (a) {
            char appdata[512];
            char tmp1[80];
            char tmp2[80];
            char tmp3[EXT_DATA_SIZE];

            appdata[0] = 0; /* just in case the substitute var func isn't called */
            if(!ast_strlen_zero(tmp))
               pbx_substitute_variables_helper(chan, tmp, appdata, sizeof(appdata) - 1);
            ast_verb(3, "Executing %s(\"%s\", \"%s\")\n",
                   term_color(tmp1, app, COLOR_BRCYAN, 0, sizeof(tmp1)),
                   term_color(tmp2, chan->name, COLOR_BRMAGENTA, 0, sizeof(tmp2)),
                   term_color(tmp3, S_OR(appdata, ""), COLOR_BRMAGENTA, 0, sizeof(tmp3)));
            manager_event(EVENT_FLAG_DIALPLAN, "Newexten",
                       "Channel: %s\r\n"
                       "Context: %s\r\n"
                       "Extension: %s\r\n"
                       "Priority: %d\r\n"
                       "Application: %s\r\n"
                       "AppData: %s\r\n"
                       "Uniqueid: %s\r\n",
                       chan->name, chan->context, chan->exten, chan->priority, app, !ast_strlen_zero(appdata) ? appdata : "(NULL)", chan->uniqueid);
            
            res = pbx_exec(chan, a, appdata);
         } else
            ast_log(LOG_NOTICE, "No such application '%s' for extension '%s' in context '%s'\n", app, exten, context);
      } else {
         ast_log(LOG_WARNING, "No application specified for realtime extension '%s' in context '%s'\n", exten, context);
      }
   }
   return res;
}
static int realtime_exists ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid,
const char *  data 
) [static]

Definition at line 166 of file pbx_realtime.c.

References ast_variables_destroy(), MODE_MATCH, realtime_common(), and var.

{
   struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCH);
   if (var) {
      ast_variables_destroy(var);
      return 1;
   }
   return 0;
}
static int realtime_matchmore ( struct ast_channel chan,
const char *  context,
const char *  exten,
int  priority,
const char *  callerid,
const char *  data 
) [static]

Definition at line 263 of file pbx_realtime.c.

References ast_variables_destroy(), MODE_MATCHMORE, realtime_common(), and var.

{
   struct ast_variable *var = realtime_common(context, exten, priority, data, MODE_MATCHMORE);
   if (var) {
      ast_variables_destroy(var);
      return 1;
   }
   return 0;
}
static struct ast_variable* realtime_switch_common ( const char *  table,
const char *  context,
const char *  exten,
int  priority,
int  mode,
struct ast_flags  flags 
) [static, read]

Definition at line 79 of file pbx_realtime.c.

References ast_category_browse(), ast_category_detach_variables(), ast_category_get(), ast_config_destroy(), ast_copy_string(), ast_extension_close(), ast_extension_match(), ast_load_realtime(), ast_load_realtime_multientry(), AST_MAX_EXTENSION, ast_test_flag, match(), MODE_CANMATCH, MODE_MATCH, MODE_MATCHMORE, OPTION_PATTERNS_DISABLED, SENTINEL, and var.

Referenced by realtime_common().

{
   struct ast_variable *var;
   struct ast_config *cfg;
   char pri[20];
   char *ematch;
   char rexten[AST_MAX_EXTENSION + 20]="";
   int match;
   /* Optimization: since we don't support hints in realtime, it's silly to
    * query for a hint here, since we won't actually do anything with it.
    * This just wastes CPU time and resources. */
   if (priority < 0) {
      return NULL;
   }
   snprintf(pri, sizeof(pri), "%d", priority);
   switch(mode) {
   case MODE_MATCHMORE:
      ematch = "exten LIKE";
      snprintf(rexten, sizeof(rexten), "%s_%%", exten);
      break;
   case MODE_CANMATCH:
      ematch = "exten LIKE";
      snprintf(rexten, sizeof(rexten), "%s%%", exten);
      break;
   case MODE_MATCH:
   default:
      ematch = "exten";
      ast_copy_string(rexten, exten, sizeof(rexten));
   }
   var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, SENTINEL);
   if (!var && !ast_test_flag(&flags, OPTION_PATTERNS_DISABLED)) {
      cfg = ast_load_realtime_multientry(table, "exten LIKE", "\\_%", "context", context, "priority", pri, SENTINEL);   
      if (cfg) {
         char *cat = ast_category_browse(cfg, NULL);

         while(cat) {
            switch(mode) {
            case MODE_MATCHMORE:
               match = ast_extension_close(cat, exten, 1);
               break;
            case MODE_CANMATCH:
               match = ast_extension_close(cat, exten, 0);
               break;
            case MODE_MATCH:
            default:
               match = ast_extension_match(cat, exten);
            }
            if (match) {
               var = ast_category_detach_variables(ast_category_get(cfg, cat));
               break;
            }
            cat = ast_category_browse(cfg, cat);
         }
         ast_config_destroy(cfg);
      }
   }
   return var;
}
static int unload_module ( void  ) [static]

Definition at line 283 of file pbx_realtime.c.

References ast_unregister_switch().


Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Switch" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 296 of file pbx_realtime.c.

Definition at line 296 of file pbx_realtime.c.

enum { ... } option_flags
struct ast_switch realtime_switch [static]

Definition at line 273 of file pbx_realtime.c.

struct ast_app_option switch_opts[128] = { [ 'p' ] = { .flag = OPTION_PATTERNS_DISABLED },} [static]

Definition at line 63 of file pbx_realtime.c.

Referenced by realtime_common().