Sat Nov 1 06:28:35 2008

Asterisk developer's documentation


pbx.h

Go to the documentation of this file.
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 */

Generated on Sat Nov 1 06:28:35 2008 for Asterisk - the Open Source PBX by  doxygen 1.5.1