Skip to content
Snippets Groups Projects
pbx.c 166 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	rc = pbx_builtin_goto(chan, branch);
    
    Mark Spencer's avatar
    Mark Spencer committed
    }           
    
    Mark Spencer's avatar
    Mark Spencer committed
    
    static int pbx_builtin_saynumber(struct ast_channel *chan, void *data)
    {
    	int res = 0;
    
    	char tmp[256];
    	char *number = (char *) NULL;
    	char *options = (char *) NULL;
    
    	
    
    		ast_log(LOG_WARNING, "SayNumber requires an argument (number)\n");
    		return -1;
    	}
    
    	ast_copy_string(tmp, (char *) data, sizeof(tmp));
    
    	number=tmp;
    	strsep(&number, "|");
    	options = strsep(&number, "|");
    	if (options) { 
    
    		if ( strcasecmp(options, "f") && strcasecmp(options,"m") && 
    			strcasecmp(options, "c") && strcasecmp(options, "n") ) {
    
    			ast_log(LOG_WARNING, "SayNumber gender option is either 'f', 'm', 'c' or 'n'\n");
    			return -1;
    
    		}
    	}
    	return res = ast_say_number(chan, atoi((char *) tmp), "", chan->language, options);
    
    Mark Spencer's avatar
    Mark Spencer committed
    }
    
    static int pbx_builtin_saydigits(struct ast_channel *chan, void *data)
    {
    	int res = 0;
    
    Mark Spencer's avatar
    Mark Spencer committed
    	if (data)
    		res = ast_say_digit_str(chan, (char *)data, "", chan->language);
    
    Mark Spencer's avatar
    Mark Spencer committed
    	return res;
    }
    
    static int pbx_builtin_saycharacters(struct ast_channel *chan, void *data)
    {
    	int res = 0;
    
    	if (data)
    		res = ast_say_character_str(chan, (char *)data, "", chan->language);
    	return res;
    }
    	
    static int pbx_builtin_sayphonetic(struct ast_channel *chan, void *data)
    {
    	int res = 0;
    
    	if (data)
    		res = ast_say_phonetic_str(chan, (char *)data, "", chan->language);
    	return res;
    }
    	
    
    Mark Spencer's avatar
    Mark Spencer committed
    int load_pbx(void)
    {
    	int x;
    
    Mark Spencer's avatar
    Mark Spencer committed
    	/* Initialize the PBX */
    	if (option_verbose) {
    		ast_verbose( "Asterisk PBX Core Initializing\n");
    		ast_verbose( "Registering builtin applications:\n");
    	}
    
    	ast_cli_register_multiple(pbx_cli, sizeof(pbx_cli) / sizeof(pbx_cli[0]));
    
    
    	/* Register builtin applications */
    	for (x=0; x<sizeof(builtins) / sizeof(struct pbx_builtin); x++) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    		if (option_verbose)
    			ast_verbose( VERBOSE_PREFIX_1 "[%s]\n", builtins[x].name);
    
    Mark Spencer's avatar
    Mark Spencer committed
    		if (ast_register_application(builtins[x].name, builtins[x].execute, builtins[x].synopsis, builtins[x].description)) {
    
    Mark Spencer's avatar
    Mark Spencer committed
    			ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name);
    			return -1;
    		}
    	}
    	return 0;
    }
    
    
    Mark Spencer's avatar
    Mark Spencer committed
    /*
     * Lock context list functions ...
     */
    int ast_lock_contexts()
    {
    
    Mark Spencer's avatar
    Mark Spencer committed
    }
    
    int ast_unlock_contexts()
    {
    
    Mark Spencer's avatar
    Mark Spencer committed
    }
    
    /*
     * Lock context ...
     */
    int ast_lock_context(struct ast_context *con)
    {
    
    Mark Spencer's avatar
    Mark Spencer committed
    }
    
    int ast_unlock_context(struct ast_context *con)
    {
    
    	return ast_mutex_unlock(&con->lock);
    
    Mark Spencer's avatar
    Mark Spencer committed
    }
    
    /*
     * Name functions ...
     */
    
    const char *ast_get_context_name(struct ast_context *con)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return con ? con->name : NULL;
    }
    
    
    const char *ast_get_extension_name(struct ast_exten *exten)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return exten ? exten->exten : NULL;
    }
    
    
    const char *ast_get_extension_label(struct ast_exten *exten)
    {
    	return exten ? exten->label : NULL;
    }
    
    const char *ast_get_include_name(struct ast_include *inc)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return inc ? inc->name : NULL;
    }
    
    
    const char *ast_get_ignorepat_name(struct ast_ignorepat *ip)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return ip ? ip->pattern : NULL;
    }
    
    int ast_get_extension_priority(struct ast_exten *exten)
    {
    	return exten ? exten->priority : -1;
    }
    
    /*
     * Registrar info functions ...
     */
    
    const char *ast_get_context_registrar(struct ast_context *c)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return c ? c->registrar : NULL;
    }
    
    
    const char *ast_get_extension_registrar(struct ast_exten *e)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return e ? e->registrar : NULL;
    }
    
    
    const char *ast_get_include_registrar(struct ast_include *i)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return i ? i->registrar : NULL;
    }
    
    
    const char *ast_get_ignorepat_registrar(struct ast_ignorepat *ip)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return ip ? ip->registrar : NULL;
    }
    
    
    int ast_get_extension_matchcid(struct ast_exten *e)
    {
    	return e ? e->matchcid : 0;
    }
    
    
    const char *ast_get_extension_cidmatch(struct ast_exten *e)
    
    const char *ast_get_extension_app(struct ast_exten *e)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return e ? e->app : NULL;
    }
    
    void *ast_get_extension_app_data(struct ast_exten *e)
    {
    	return e ? e->data : NULL;
    }
    
    
    const char *ast_get_switch_name(struct ast_sw *sw)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return sw ? sw->name : NULL;
    }
    
    
    const char *ast_get_switch_data(struct ast_sw *sw)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return sw ? sw->data : NULL;
    }
    
    
    const char *ast_get_switch_registrar(struct ast_sw *sw)
    
    Mark Spencer's avatar
    Mark Spencer committed
    {
    	return sw ? sw->registrar : NULL;
    }
    
    /*
     * Walking functions ...
     */
    struct ast_context *ast_walk_contexts(struct ast_context *con)
    {
    	if (!con)
    		return contexts;
    	else
    		return con->next;
    }
    
    struct ast_exten *ast_walk_context_extensions(struct ast_context *con,
    	struct ast_exten *exten)
    {
    	if (!exten)
    		return con ? con->root : NULL;
    	else
    		return exten->next;
    }
    
    struct ast_sw *ast_walk_context_switches(struct ast_context *con,
    	struct ast_sw *sw)
    {
    	if (!sw)
    		return con ? con->alts : NULL;
    	else
    		return sw->next;
    }
    
    struct ast_exten *ast_walk_extension_priorities(struct ast_exten *exten,
    	struct ast_exten *priority)
    {
    	if (!priority)
    		return exten;
    	else
    		return priority->peer;
    }
    
    struct ast_include *ast_walk_context_includes(struct ast_context *con,
    	struct ast_include *inc)
    {
    	if (!inc)
    		return con ? con->includes : NULL;
    	else
    		return inc->next;
    }
    
    struct ast_ignorepat *ast_walk_context_ignorepats(struct ast_context *con,
    	struct ast_ignorepat *ip)
    {
    	if (!ip)
    		return con ? con->ignorepats : NULL;
    	else
    		return ip->next;
    }
    
    
    int ast_context_verify_includes(struct ast_context *con)
    {
    	struct ast_include *inc;
    	int res = 0;
    
    	for (inc = ast_walk_context_includes(con, NULL); inc; inc = ast_walk_context_includes(con, inc))
    		if (!ast_context_find(inc->rname)) {
    			res = -1;
    
    			ast_log(LOG_WARNING, "Context '%s' tries includes nonexistent context '%s'\n",
    
    					ast_get_context_name(con), inc->rname);
    		}
    	return res;
    }
    
    static int __ast_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority, int async) 
    
    	int (*goto_func)(struct ast_channel *chan, const char *context, const char *exten, int priority);
    
    	goto_func = (async) ? ast_async_goto : ast_explicit_goto;
    	if (ast_exists_extension(chan, context ? context : chan->context,
    				 exten ? exten : chan->exten, priority,
    				 chan->cid.cid_num))
    		return goto_func(chan, context ? context : chan->context,
    				 exten ? exten : chan->exten, priority);
    	else 
    		return -3;
    
    int ast_goto_if_exists(struct ast_channel *chan, const char* context, const char *exten, int priority) {
    
    	return __ast_goto_if_exists(chan, context, exten, priority, 0);
    }
    
    
    int ast_async_goto_if_exists(struct ast_channel *chan, const char * context, const char *exten, int priority) {
    
    	return __ast_goto_if_exists(chan, context, exten, priority, 1);
    }
    
    
    int ast_parseable_goto(struct ast_channel *chan, const char *goto_string) 
    {
    	char *s;
    	char *exten, *pri, *context;
    	char *stringp=NULL;
    	int ipri;
    	int mode = 0;
    
    
    	if (ast_strlen_zero(goto_string)) {
    
    		ast_log(LOG_WARNING, "Goto requires an argument (optional context|optional extension|priority)\n");
    		return -1;
    	}
    	s = ast_strdupa(goto_string);
    	stringp=s;
    	context = strsep(&stringp, "|");
    	exten = strsep(&stringp, "|");
    	if (!exten) {
    		/* Only a priority in this one */
    		pri = context;
    		exten = NULL;
    		context = NULL;
    	} else {
    		pri = strsep(&stringp, "|");
    		if (!pri) {
    			/* Only an extension and priority in this one */
    			pri = exten;
    			exten = context;
    			context = NULL;
    		}
    	}
    	if (*pri == '+') {
    		mode = 1;
    		pri++;
    	} else if (*pri == '-') {
    		mode = -1;
    		pri++;
    	}
    
    		if ((ipri = ast_findlabel_extension(chan, context ? context : chan->context, (exten && strcasecmp(exten, "BYEXTENSION")) ? exten : chan->exten, 
    			pri, chan->cid.cid_num)) < 1) {
    			ast_log(LOG_WARNING, "Priority '%s' must be a number > 0, or valid label\n", pri);
    			return -1;
    		} else
    			mode = 0;
    	} 
    	/* At this point we have a priority and maybe an extension and a context */
    
    	if (exten && !strcasecmp(exten, "BYEXTENSION"))
    		exten = NULL;
    
    	if (mode) 
    		ipri = chan->priority + (ipri * mode);
    
    
    	ast_explicit_goto(chan, context, exten, ipri);
    
    	ast_cdr_update(chan);
    	return 0;
    
    }