00001 /* 00002 * Asterisk -- An open source telephony toolkit. 00003 * 00004 * Copyright (C) 1999 - 2006, Digium, Inc. 00005 * 00006 * Mark Spencer <markster@digium.com> 00007 * 00008 * See http://www.asterisk.org for more information about 00009 * the Asterisk project. Please do not directly contact 00010 * any of the maintainers of this project for assistance; 00011 * the project provides a web site, mailing lists and IRC 00012 * channels for your use. 00013 * 00014 * This program is free software, distributed under the terms of 00015 * the GNU General Public License Version 2. See the LICENSE file 00016 * at the top of the source tree. 00017 */ 00018 00019 /*! \file 00020 * \brief Core PBX routines and definitions. 00021 */ 00022 00023 #ifndef _ASTERISK_PBX_H 00024 #define _ASTERISK_PBX_H 00025 00026 #include "asterisk/sched.h" 00027 #include "asterisk/channel.h" 00028 #include "asterisk/linkedlists.h" 00029 00030 #if defined(__cplusplus) || defined(c_plusplus) 00031 extern "C" { 00032 #endif 00033 00034 #define AST_MAX_APP 32 /*!< Max length of an application */ 00035 00036 #define AST_PBX_KEEP 0 00037 #define AST_PBX_REPLACE 1 00038 00039 /*! \brief Special return values from applications to the PBX { */ 00040 #define AST_PBX_KEEPALIVE 10 /*!< Destroy the thread, but don't hang up the channel */ 00041 #define AST_PBX_NO_HANGUP_PEER 11 /*!< The peer has been involved in a transfer */ 00042 #define AST_PBX_NO_HANGUP_PEER_PARKED 12 /*!< Don't touch the peer channel - it was sent to the parking lot and might be gone by now */ 00043 /*! } */ 00044 00045 #define PRIORITY_HINT -1 /*!< Special Priority for a hint */ 00046 00047 /*! \brief Extension states */ 00048 enum ast_extension_states { 00049 AST_EXTENSION_REMOVED = -2, /*!< Extension removed */ 00050 AST_EXTENSION_DEACTIVATED = -1, /*!< Extension hint removed */ 00051 AST_EXTENSION_NOT_INUSE = 0, /*!< No device INUSE or BUSY */ 00052 AST_EXTENSION_INUSE = 1 << 0, /*!< One or more devices INUSE */ 00053 AST_EXTENSION_BUSY = 1 << 1, /*!< All devices BUSY */ 00054 AST_EXTENSION_UNAVAILABLE = 1 << 2, /*!< All devices UNAVAILABLE/UNREGISTERED */ 00055 AST_EXTENSION_RINGING = 1 << 3, /*!< All devices RINGING */ 00056 AST_EXTENSION_ONHOLD = 1 << 4, /*!< All devices ONHOLD */ 00057 }; 00058 00059 00060 struct ast_context; 00061 struct ast_exten; 00062 struct ast_include; 00063 struct ast_ignorepat; 00064 struct ast_sw; 00065 00066 /*! \brief Typedef for devicestate and hint callbacks */ 00067 typedef int (*ast_state_cb_type)(char *context, char* id, enum ast_extension_states state, void *data); 00068 00069 /*! \brief Data structure associated with a custom dialplan function */ 00070 struct ast_custom_function { 00071 const char *name; /*!< Name */ 00072 const char *synopsis; /*!< Short description for "show functions" */ 00073 const char *desc; /*!< Help text that explains it all */ 00074 const char *syntax; /*!< Syntax description */ 00075 int (*read)(struct ast_channel *, char *, char *, char *, size_t); /*!< Read function, if read is supported */ 00076 int (*write)(struct ast_channel *, char *, char *, const char *); /*!< Write function, if write is supported */ 00077 AST_LIST_ENTRY(ast_custom_function) acflist; 00078 }; 00079 00080 /*! \brief All switch functions have the same interface, so define a type for them */ 00081 typedef int (ast_switch_f)(struct ast_channel *chan, const char *context, 00082 const char *exten, int priority, const char *callerid, const char *data); 00083 00084 /*!< Data structure associated with an Asterisk switch */ 00085 struct ast_switch { 00086 AST_LIST_ENTRY(ast_switch) list; 00087 const char *name; /*!< Name of the switch */ 00088 const char *description; /*!< Description of the switch */ 00089 00090 ast_switch_f *exists; 00091 ast_switch_f *canmatch; 00092 ast_switch_f *exec; 00093 ast_switch_f *matchmore; 00094 }; 00095 00096 struct ast_timing { 00097 int hastime; /*!< If time construct exists */ 00098 unsigned int monthmask; /*!< Mask for month */ 00099 unsigned int daymask; /*!< Mask for date */ 00100 unsigned int dowmask; /*!< Mask for day of week (mon-sun) */ 00101 unsigned int minmask[24]; /*!< Mask for minute */ 00102 }; 00103 00104 int ast_build_timing(struct ast_timing *i, const char *info); 00105 int ast_check_timing(const struct ast_timing *i); 00106 00107 struct ast_pbx { 00108 int dtimeout; /*!< Timeout between digits (seconds) */ 00109 int rtimeout; /*!< Timeout for response (seconds) */ 00110 }; 00111 00112 00113 /*! 00114 * \brief Register an alternative dialplan switch 00115 * 00116 * \param sw switch to register 00117 * 00118 * This function registers a populated ast_switch structure with the 00119 * asterisk switching architecture. 00120 * 00121 * \return 0 on success, and other than 0 on failure 00122 */ 00123 int ast_register_switch(struct ast_switch *sw); 00124 00125 /*! 00126 * \brief Unregister an alternative switch 00127 * 00128 * \param sw switch to unregister 00129 * 00130 * Unregisters a switch from asterisk. 00131 * 00132 * \return nothing 00133 */ 00134 void ast_unregister_switch(struct ast_switch *sw); 00135 00136 /*! 00137 * \brief Look up an application 00138 * 00139 * \param app name of the app 00140 * 00141 * This function searches for the ast_app structure within 00142 * the apps that are registered for the one with the name 00143 * you passed in. 00144 * 00145 * \return the ast_app structure that matches on success, or NULL on failure 00146 */ 00147 struct ast_app *pbx_findapp(const char *app); 00148 00149 /*! 00150 * \brief Execute an application 00151 * 00152 * \param c channel to execute on 00153 * \param app which app to execute 00154 * \param data the data passed into the app 00155 * 00156 * This application executes an application on a given channel. It 00157 * saves the stack and executes the given appliation passing in 00158 * the given data. 00159 * 00160 * \return 0 on success, and -1 on failure 00161 */ 00162 int pbx_exec(struct ast_channel *c, struct ast_app *app, void *data); 00163 00164 /*! 00165 * \brief Register a new context 00166 * 00167 * \param extcontexts pointer to the ast_context structure pointer 00168 * \param name name of the new context 00169 * \param registrar registrar of the context 00170 * 00171 * This will first search for a context with your name. If it exists already, it will not 00172 * create a new one. If it does not exist, it will create a new one with the given name 00173 * and registrar. 00174 * 00175 * \return NULL on failure, and an ast_context structure on success 00176 */ 00177 struct ast_context *ast_context_create(struct ast_context **extcontexts, const char *name, const char *registrar); 00178 struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, const char *name, const char *registrar); 00179 00180 /*! 00181 * \brief Merge the temporary contexts into a global contexts list and delete from the 00182 * global list the ones that are being added 00183 * 00184 * \param extcontexts pointer to the ast_context structure pointer 00185 * \param registrar of the context; if it's set the routine will delete all contexts 00186 * that belong to that registrar; if NULL only the contexts that are specified 00187 * in extcontexts 00188 */ 00189 void ast_merge_contexts_and_delete(struct ast_context **extcontexts, const char *registrar); 00190 00191 /*! 00192 * \brief Destroy a context (matches the specified context (or ANY context if NULL) 00193 * 00194 * \param con context to destroy 00195 * \param registrar who registered it 00196 * 00197 * You can optionally leave out either parameter. It will find it 00198 * based on either the ast_context or the registrar name. 00199 * 00200 * \return nothing 00201 */ 00202 void ast_context_destroy(struct ast_context *con, const char *registrar); 00203 00204 /*! 00205 * \brief Find a context 00206 * 00207 * \param name name of the context to find 00208 * 00209 * Will search for the context with the given name. 00210 * 00211 * \return the ast_context on success, NULL on failure. 00212 */ 00213 struct ast_context *ast_context_find(const char *name); 00214 00215 enum ast_pbx_result { 00216 AST_PBX_SUCCESS = 0, 00217 AST_PBX_FAILED = -1, 00218 AST_PBX_CALL_LIMIT = -2, 00219 }; 00220 00221 /*! 00222 * \brief Create a new thread and start the PBX 00223 * 00224 * \param c channel to start the pbx on 00225 * 00226 * See ast_pbx_run for a synchronous function to run the PBX in the 00227 * current thread, as opposed to starting a new one. 00228 * 00229 * \return Zero on success, non-zero on failure 00230 */ 00231 enum ast_pbx_result ast_pbx_start(struct ast_channel *c); 00232 00233 /*! 00234 * \brief Execute the PBX in the current thread 00235 * 00236 * \param c channel to run the pbx on 00237 * 00238 * This executes the PBX on a given channel. It allocates a new 00239 * PBX structure for the channel, and provides all PBX functionality. 00240 * See ast_pbx_start for an asynchronous function to run the PBX in a 00241 * new thread as opposed to the current one. 00242 * 00243 * \return Zero on success, non-zero on failure 00244 */ 00245 enum ast_pbx_result ast_pbx_run(struct ast_channel *c); 00246 00247 /*! 00248 * \brief Add and extension to an extension context. 00249 * 00250 * \param context context to add the extension to 00251 * \param replace 00252 * \param extension extension to add 00253 * \param priority priority level of extension addition 00254 * \param label extension label 00255 * \param callerid pattern to match CallerID, or NULL to match any CallerID 00256 * \param application application to run on the extension with that priority level 00257 * \param data data to pass to the application 00258 * \param datad 00259 * \param registrar who registered the extension 00260 * 00261 * \retval 0 success 00262 * \retval -1 failure 00263 */ 00264 int ast_add_extension(const char *context, int replace, const char *extension, 00265 int priority, const char *label, const char *callerid, 00266 const char *application, void *data, void (*datad)(void *), const char *registrar); 00267 00268 /*! 00269 * \brief Add an extension to an extension context, this time with an ast_context *. 00270 * 00271 * \note For details about the arguments, check ast_add_extension() 00272 */ 00273 int ast_add_extension2(struct ast_context *con, int replace, const char *extension, 00274 int priority, const char *label, const char *callerid, 00275 const char *application, void *data, void (*datad)(void *), const char *registrar); 00276 00277 00278 /*! 00279 * \brief Register an application. 00280 * 00281 * \param app Short name of the application 00282 * \param execute a function callback to execute the application. It should return 00283 * non-zero if the channel needs to be hung up. 00284 * \param synopsis a short description (one line synopsis) of the application 00285 * \param description long description with all of the details about the use of 00286 * the application 00287 * 00288 * This registers an application with Asterisk's internal application list. 00289 * \note The individual applications themselves are responsible for registering and unregistering 00290 * and unregistering their own CLI commands. 00291 * 00292 * \retval 0 success 00293 * \retval -1 failure. 00294 */ 00295 int ast_register_application(const char *app, int (*execute)(struct ast_channel *, void *), 00296 const char *synopsis, const char *description); 00297 00298 /*! 00299 * \brief Unregister an application 00300 * 00301 * \param app name of the application (does not have to be the same string as the one that was registered) 00302 * 00303 * This unregisters an application from Asterisk's internal application list. 00304 * 00305 * \retval 0 success 00306 * \retval -1 failure 00307 */ 00308 int ast_unregister_application(const char *app); 00309 00310 /*! 00311 * \brief Uses hint and devicestate callback to get the state of an extension 00312 * 00313 * \param c this is not important 00314 * \param context which context to look in 00315 * \param exten which extension to get state 00316 * 00317 * \return extension state as defined in the ast_extension_states enum 00318 */ 00319 int ast_extension_state(struct ast_channel *c, const char *context, const char *exten); 00320 00321 /*! 00322 * \brief Return string representation of the state of an extension 00323 * 00324 * \param extension_state is the numerical state delivered by ast_extension_state 00325 * 00326 * \return the state of an extension as string 00327 */ 00328 const char *ast_extension_state2str(int extension_state); 00329 00330 /*! 00331 * \brief Registers a state change callback 00332 * 00333 * \param context which context to look in 00334 * \param exten which extension to get state 00335 * \param callback callback to call if state changed 00336 * \param data to pass to callback 00337 * 00338 * The callback is called if the state of an extension is changed. 00339 * 00340 * \retval -1 on failure 00341 * \retval ID on success 00342 */ 00343 int ast_extension_state_add(const char *context, const char *exten, 00344 ast_state_cb_type callback, void *data); 00345 00346 /*! 00347 * \brief Deletes a registered state change callback by ID 00348 * 00349 * \param id of the callback to delete 00350 * \param callback callback 00351 * 00352 * Removes the callback from list of callbacks 00353 * 00354 * \retval 0 success 00355 * \retval -1 failure 00356 */ 00357 int ast_extension_state_del(int id, ast_state_cb_type callback); 00358 00359 /*! 00360 * \brief If an extension exists, return non-zero 00361 * 00362 * \param hint buffer for hint 00363 * \param maxlen size of hint buffer 00364 * \param name buffer for name portion of hint 00365 * \param maxnamelen size of name buffer 00366 * \param c this is not important 00367 * \param context which context to look in 00368 * \param exten which extension to search for 00369 * 00370 * \return If an extension within the given context with the priority PRIORITY_HINT 00371 * is found a non zero value will be returned. 00372 * Otherwise, 0 is returned. 00373 */ 00374 int ast_get_hint(char *hint, int maxlen, char *name, int maxnamelen, 00375 struct ast_channel *c, const char *context, const char *exten); 00376 00377 /*! 00378 * \brief Determine whether an extension exists 00379 * 00380 * \param c this is not important 00381 * \param context which context to look in 00382 * \param exten which extension to search for 00383 * \param priority priority of the action within the extension 00384 * \param callerid callerid to search for 00385 * 00386 * \return If an extension within the given context(or callerid) with the given priority 00387 * is found a non zero value will be returned. Otherwise, 0 is returned. 00388 */ 00389 int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, 00390 int priority, const char *callerid); 00391 00392 /*! 00393 * \brief Find the priority of an extension that has the specified label 00394 * 00395 * \param c this is not important 00396 * \param context which context to look in 00397 * \param exten which extension to search for 00398 * \param label label of the action within the extension to match to priority 00399 * \param callerid callerid to search for 00400 * 00401 * \return the priority which matches the given label in the extension or -1 if not found. 00402 */ 00403 int ast_findlabel_extension(struct ast_channel *c, const char *context, 00404 const char *exten, const char *label, const char *callerid); 00405 00406 /*! 00407 * \brief Find the priority of an extension that has the specified label 00408 * 00409 * \note This function is the same as ast_findlabel_extension, except that it accepts 00410 * a pointer to an ast_context structure to specify the context instead of the 00411 * name of the context. Otherwise, the functions behave the same. 00412 */ 00413 int ast_findlabel_extension2(struct ast_channel *c, struct ast_context *con, 00414 const char *exten, const char *label, const char *callerid); 00415 00416 /*! 00417 * \brief Looks for a valid matching extension 00418 * 00419 * \param c not really important 00420 * \param context context to serach within 00421 * \param exten extension to check 00422 * \param priority priority of extension path 00423 * \param callerid callerid of extension being searched for 00424 * 00425 * \return If "exten" *could be* a valid extension in this context with or without 00426 * some more digits, return non-zero. Basically, when this returns 0, no matter 00427 * what you add to exten, it's not going to be a valid extension anymore 00428 */ 00429 int ast_canmatch_extension(struct ast_channel *c, const char *context, 00430 const char *exten, int priority, const char *callerid); 00431 00432 /*! 00433 * \brief Looks to see if adding anything to this extension might match something. (exists ^ canmatch) 00434 * 00435 * \param c not really important XXX 00436 * \param context context to serach within 00437 * \param exten extension to check 00438 * \param priority priority of extension path 00439 * \param callerid callerid of extension being searched for 00440 * 00441 * \return If "exten" *could match* a valid extension in this context with 00442 * some more digits, return non-zero. Does NOT return non-zero if this is 00443 * an exact-match only. Basically, when this returns 0, no matter 00444 * what you add to exten, it's not going to be a valid extension anymore 00445 */ 00446 int ast_matchmore_extension(struct ast_channel *c, const char *context, 00447 const char *exten, int priority, const char *callerid); 00448 00449 /*! 00450 * \brief Determine if a given extension matches a given pattern (in NXX format) 00451 * 00452 * \param pattern pattern to match 00453 * \param extension extension to check against the pattern. 00454 * 00455 * Checks whether or not the given extension matches the given pattern. 00456 * 00457 * \retval 1 on match 00458 * \retval 0 on failure 00459 */ 00460 int ast_extension_match(const char *pattern, const char *extension); 00461 00462 int ast_extension_close(const char *pattern, const char *data, int needmore); 00463 00464 /*! 00465 * \brief Launch a new extension (i.e. new stack) 00466 * 00467 * \param c not important 00468 * \param context which context to generate the extension within 00469 * \param exten new extension to add 00470 * \param priority priority of new extension 00471 * \param callerid callerid of extension 00472 * 00473 * This adds a new extension to the asterisk extension list. 00474 * 00475 * \retval 0 on success 00476 * \retval -1 on failure. 00477 */ 00478 int ast_spawn_extension(struct ast_channel *c, const char *context, 00479 const char *exten, int priority, const char *callerid); 00480 00481 /*! 00482 * \brief Add a context include 00483 * 00484 * \param context context to add include to 00485 * \param include new include to add 00486 * \param registrar who's registering it 00487 * 00488 * Adds an include taking a char * string as the context parameter 00489 * 00490 * \retval 0 on success 00491 * \retval -1 on error 00492 */ 00493 int ast_context_add_include(const char *context, const char *include, 00494 const char *registrar); 00495 00496 /*! 00497 * \brief Add a context include 00498 * 00499 * \param con context to add the include to 00500 * \param include include to add 00501 * \param registrar who registered the context 00502 * 00503 * Adds an include taking a struct ast_context as the first parameter 00504 * 00505 * \retval 0 on success 00506 * \retval -1 on failure 00507 */ 00508 int ast_context_add_include2(struct ast_context *con, const char *include, 00509 const char *registrar); 00510 00511 /*! 00512 * \brief Remove a context include 00513 * 00514 * \note See ast_context_add_include for information on arguments 00515 * 00516 * \retval 0 on success 00517 * \retval -1 on failure 00518 */ 00519 int ast_context_remove_include(const char *context, const char *include, 00520 const char *registrar); 00521 00522 /*! 00523 * \brief Removes an include by an ast_context structure 00524 * 00525 * \note See ast_context_add_include2 for information on arguments 00526 * 00527 * \retval 0 on success 00528 * \retval -1 on success 00529 */ 00530 int ast_context_remove_include2(struct ast_context *con, const char *include, 00531 const char *registrar); 00532 00533 /*! 00534 * \brief Verifies includes in an ast_contect structure 00535 * 00536 * \param con context in which to verify the includes 00537 * 00538 * \retval 0 if no problems found 00539 * \retval -1 if there were any missing context 00540 */ 00541 int ast_context_verify_includes(struct ast_context *con); 00542 00543 /*! 00544 * \brief Add a switch 00545 * 00546 * \param context context to which to add the switch 00547 * \param sw switch to add 00548 * \param data data to pass to switch 00549 * \param eval whether to evaluate variables when running switch 00550 * \param registrar whoever registered the switch 00551 * 00552 * This function registers a switch with the asterisk switch architecture 00553 * 00554 * \retval 0 on success 00555 * \retval -1 on failure 00556 */ 00557 int ast_context_add_switch(const char *context, const char *sw, const char *data, 00558 int eval, const char *registrar); 00559 00560 /*! 00561 * \brief Adds a switch (first param is a ast_context) 00562 * 00563 * \note See ast_context_add_switch() for argument information, with the exception of 00564 * the first argument. In this case, it's a pointer to an ast_context structure 00565 * as opposed to the name. 00566 */ 00567 int ast_context_add_switch2(struct ast_context *con, const char *sw, const char *data, 00568 int eval, const char *registrar); 00569 00570 /*! 00571 * \brief Remove a switch 00572 * 00573 * Removes a switch with the given parameters 00574 * 00575 * \retval 0 on success 00576 * \retval -1 on failure 00577 */ 00578 int ast_context_remove_switch(const char *context, const char *sw, 00579 const char *data, const char *registrar); 00580 00581 int ast_context_remove_switch2(struct ast_context *con, const char *sw, 00582 const char *data, const char *registrar); 00583 00584 /*! 00585 * \brief Simply remove extension from context 00586 * 00587 * \param context context to remove extension from 00588 * \param extension which extension to remove 00589 * \param priority priority of extension to remove (0 to remove all) 00590 * \param callerid NULL to remove all; non-NULL to match a single record per priority 00591 * \param matchcid non-zero to match callerid element (if non-NULL); 0 to match default case 00592 * \param registrar registrar of the extension 00593 * 00594 * This function removes an extension from a given context. 00595 * 00596 * \retval 0 on success 00597 * \retval -1 on failure 00598 */ 00599 int ast_context_remove_extension(const char *context, const char *extension, int priority, 00600 const char *registrar); 00601 00602 int ast_context_remove_extension2(struct ast_context *con, const char *extension, 00603 int priority, const char *registrar); 00604 00605 int ast_context_remove_extension_callerid(const char *context, const char *extension, 00606 int priority, const char *callerid, int matchcid, const char *registrar); 00607 00608 int ast_context_remove_extension_callerid2(struct ast_context *con, const char *extension, 00609 int priority, const char *callerid, int matchcid, const char *registrar); 00610 00611 /*! 00612 * \brief Add an ignorepat 00613 * 00614 * \param context which context to add the ignorpattern to 00615 * \param ignorepat ignorepattern to set up for the extension 00616 * \param registrar registrar of the ignore pattern 00617 * 00618 * Adds an ignore pattern to a particular context. 00619 * 00620 * \retval 0 on success 00621 * \retval -1 on failure 00622 */ 00623 int ast_context_add_ignorepat(const char *context, const char *ignorepat, const char *registrar); 00624 00625 int ast_context_add_ignorepat2(struct ast_context *con, const char *ignorepat, const char *registrar); 00626 00627 /* 00628 * \brief Remove an ignorepat 00629 * 00630 * \param context context from which to remove the pattern 00631 * \param ignorepat the pattern to remove 00632 * \param registrar the registrar of the ignore pattern 00633 * 00634 * This removes the given ignorepattern 00635 * 00636 * \retval 0 on success 00637 * \retval -1 on failure 00638 */ 00639 int ast_context_remove_ignorepat(const char *context, const char *ignorepat, const char *registrar); 00640 00641 int ast_context_remove_ignorepat2(struct ast_context *con, const char *ignorepat, const char *registrar); 00642 00643 /*! 00644 * \brief Checks to see if a number should be ignored 00645 * 00646 * \param context context to search within 00647 * \param pattern to check whether it should be ignored or not 00648 * 00649 * Check if a number should be ignored with respect to dialtone cancellation. 00650 * 00651 * \retval 0 if the pattern should not be ignored 00652 * \retval non-zero if the pattern should be ignored 00653 */ 00654 int ast_ignore_pattern(const char *context, const char *pattern); 00655 00656 /* Locking functions for outer modules, especially for completion functions */ 00657 00658 /*! 00659 * \brief Locks the context list 00660 * 00661 * \retval 0 on success 00662 * \retval -1 on error 00663 */ 00664 int ast_lock_contexts(void); /* equivalent to wrlock */ 00665 int ast_rdlock_contexts(void); 00666 int ast_wrlock_contexts(void); 00667 00668 /*! 00669 * \brief Unlocks contexts 00670 * 00671 * \retval 0 on success 00672 * \retval -1 on failure 00673 */ 00674 int ast_unlock_contexts(void); 00675 00676 /*! 00677 * \brief Locks a given context 00678 * 00679 * \param con context to lock 00680 * 00681 * \retval 0 on success 00682 * \retval -1 on failure 00683 */ 00684 int ast_lock_context(struct ast_context *con); 00685 00686 /*! 00687 * \retval Unlocks the given context 00688 * 00689 * \param con context to unlock 00690 * 00691 * \retval 0 on success 00692 * \retval -1 on failure 00693 */ 00694 int ast_unlock_context(struct ast_context *con); 00695 00696 /*! 00697 * \brief locks the macrolock in the given given context 00698 * 00699 * \param macrocontext name of the macro-context to lock 00700 * 00701 * Locks the given macro-context to ensure only one thread (call) can execute it at a time 00702 * 00703 * \retval 0 on success 00704 * \retval -1 on failure 00705 */ 00706 int ast_context_lockmacro(const char *macrocontext); 00707 00708 /*! 00709 * \brief Unlocks the macrolock in the given context 00710 * 00711 * \param macrocontext name of the macro-context to unlock 00712 * 00713 * Unlocks the given macro-context so that another thread (call) can execute it 00714 * 00715 * \retval 0 on success 00716 * \retval -1 on failure 00717 */ 00718 int ast_context_unlockmacro(const char *macrocontext); 00719 00720 int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority); 00721 00722 int ast_async_goto_by_name(const char *chan, const char *context, const char *exten, int priority); 00723 00724 /*! Synchronously or asynchronously make an outbound call and send it to a 00725 particular extension */ 00726 int ast_pbx_outgoing_exten(const char *type, int format, void *data, int timeout, const char *context, const char *exten, int priority, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel); 00727 00728 /*! Synchronously or asynchronously make an outbound call and send it to a 00729 particular application with given extension */ 00730 int ast_pbx_outgoing_app(const char *type, int format, void *data, int timeout, const char *app, const char *appdata, int *reason, int sync, const char *cid_num, const char *cid_name, struct ast_variable *vars, const char *account, struct ast_channel **locked_channel); 00731 00732 /*! 00733 * \brief Evaluate a condition 00734 * 00735 * \retval 0 if the condition is NULL or of zero length 00736 * \retval int If the string is an integer, the integer representation of 00737 * the integer is returned 00738 * \retval 1 Any other non-empty string 00739 */ 00740 int pbx_checkcondition(const char *condition); 00741 00742 /* Functions for returning values from structures */ 00743 const char *ast_get_context_name(struct ast_context *con); 00744 const char *ast_get_extension_name(struct ast_exten *exten); 00745 struct ast_context *ast_get_extension_context(struct ast_exten *exten); 00746 const char *ast_get_include_name(struct ast_include *include); 00747 const char *ast_get_ignorepat_name(struct ast_ignorepat *ip); 00748 const char *ast_get_switch_name(struct ast_sw *sw); 00749 const char *ast_get_switch_data(struct ast_sw *sw); 00750 00751 /* Other extension stuff */ 00752 int ast_get_extension_priority(struct ast_exten *exten); 00753 int ast_get_extension_matchcid(struct ast_exten *e); 00754 const char *ast_get_extension_cidmatch(struct ast_exten *e); 00755 const char *ast_get_extension_app(struct ast_exten *e); 00756 const char *ast_get_extension_label(struct ast_exten *e); 00757 void *ast_get_extension_app_data(struct ast_exten *e); 00758 00759 /* Registrar info functions ... */ 00760 const char *ast_get_context_registrar(struct ast_context *c); 00761 const char *ast_get_extension_registrar(struct ast_exten *e); 00762 const char *ast_get_include_registrar(struct ast_include *i); 00763 const char *ast_get_ignorepat_registrar(struct ast_ignorepat *ip); 00764 const char *ast_get_switch_registrar(struct ast_sw *sw); 00765 00766 /* Walking functions ... */ 00767 struct ast_context *ast_walk_contexts(struct ast_context *con); 00768 struct ast_exten *ast_walk_context_extensions(struct ast_context *con, 00769 struct ast_exten *priority); 00770 struct ast_exten *ast_walk_extension_priorities(struct ast_exten *exten, 00771 struct ast_exten *priority); 00772 struct ast_include *ast_walk_context_includes(struct ast_context *con, 00773 struct ast_include *inc); 00774 struct ast_ignorepat *ast_walk_context_ignorepats(struct ast_context *con, 00775 struct ast_ignorepat *ip); 00776 struct ast_sw *ast_walk_context_switches(struct ast_context *con, struct ast_sw *sw); 00777 00778 /*! 00779 * \note Will lock the channel. 00780 */ 00781 int pbx_builtin_serialize_variables(struct ast_channel *chan, char *buf, size_t size); 00782 00783 /*! 00784 * \note Will lock the channel. 00785 */ 00786 const char *pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name); 00787 00788 /*! 00789 * \note Will lock the channel. 00790 */ 00791 void pbx_builtin_pushvar_helper(struct ast_channel *chan, const char *name, const char *value); 00792 00793 /*! 00794 * \note Will lock the channel. 00795 */ 00796 void pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value); 00797 00798 /*! 00799 * \note Will lock the channel. 00800 */ 00801 void pbx_retrieve_variable(struct ast_channel *c, const char *var, char **ret, char *workspace, int workspacelen, struct varshead *headp); 00802 void pbx_builtin_clear_globals(void); 00803 00804 /*! 00805 * \note Will lock the channel. 00806 */ 00807 int pbx_builtin_setvar(struct ast_channel *chan, void *data); 00808 00809 void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count); 00810 void pbx_substitute_variables_varshead(struct varshead *headp, const char *cp1, char *cp2, int count); 00811 00812 int ast_extension_patmatch(const char *pattern, const char *data); 00813 00814 /*! Set "autofallthrough" flag, if newval is <0, does not acutally set. If 00815 set to 1, sets to auto fall through. If newval set to 0, sets to no auto 00816 fall through (reads extension instead). Returns previous value. */ 00817 int pbx_set_autofallthrough(int newval); 00818 00819 /*! 00820 * \note This function will handle locking the channel as needed. 00821 */ 00822 int ast_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority); 00823 00824 /*! 00825 * \note I can find neither parsable nor parseable at dictionary.com, 00826 * but google gives me 169000 hits for parseable and only 49,800 00827 * for parsable 00828 * 00829 * \note This function will handle locking the channel as needed. 00830 */ 00831 int ast_parseable_goto(struct ast_channel *chan, const char *goto_string); 00832 00833 /*! 00834 * \note This function will handle locking the channel as needed. 00835 */ 00836 int ast_explicit_goto(struct ast_channel *chan, const char *context, const char *exten, int priority); 00837 00838 /*! 00839 * \note This function will handle locking the channel as needed. 00840 */ 00841 int ast_async_goto_if_exists(struct ast_channel *chan, const char *context, const char *exten, int priority); 00842 00843 struct ast_custom_function* ast_custom_function_find(const char *name); 00844 00845 /*! 00846 * \brief Unregister a custom function 00847 */ 00848 int ast_custom_function_unregister(struct ast_custom_function *acf); 00849 00850 /*! 00851 * \brief Reigster a custom function 00852 */ 00853 int ast_custom_function_register(struct ast_custom_function *acf); 00854 00855 /*! 00856 * \brief Retrieve the number of active calls 00857 */ 00858 int ast_active_calls(void); 00859 00860 /*! 00861 * \brief executes a read operation on a function 00862 * 00863 * \param chan Channel to execute on 00864 * \param function Data containing the function call string (will be modified) 00865 * \param workspace A pointer to safe memory to use for a return value 00866 * \param len the number of bytes in workspace 00867 * 00868 * This application executes a function in read mode on a given channel. 00869 * 00870 * \return zero on success, non-zero on failure 00871 */ 00872 int ast_func_read(struct ast_channel *chan, char *function, char *workspace, size_t len); 00873 00874 /*! 00875 * \brief executes a write operation on a function 00876 * 00877 * \param chan Channel to execute on 00878 * \param function Data containing the function call string (will be modified) 00879 * \param value A value parameter to pass for writing 00880 * 00881 * This application executes a function in write mode on a given channel. 00882 * 00883 * \return zero on success, non-zero on failure 00884 */ 00885 int ast_func_write(struct ast_channel *chan, char *function, const char *value); 00886 00887 void ast_hint_state_changed(const char *device); 00888 00889 #if defined(__cplusplus) || defined(c_plusplus) 00890 } 00891 #endif 00892 00893 #endif /* _ASTERISK_PBX_H */
1.5.1