2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 1999 - 2005, Digium, Inc.
6 * Mark Spencer <markster@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
20 * \brief Call Parking and Pickup API
21 * Includes code and algorithms from the Zapata library.
24 #ifndef _AST_FEATURES_H
25 #define _AST_FEATURES_H
27 #include "asterisk/pbx.h"
28 #include "asterisk/linkedlists.h"
30 #define FEATURE_MAX_LEN 11
31 #define FEATURE_APP_LEN 64
32 #define FEATURE_APP_ARGS_LEN 256
33 #define FEATURE_SNAME_LEN 32
34 #define FEATURE_EXTEN_LEN 32
35 #define FEATURE_MOH_LEN 80 /* same as MAX_MUSICCLASS from channel.h */
37 #define PARK_APP_NAME "Park"
38 #define DEFAULT_PARKINGLOT "default" /*!< Default parking lot */
40 #define AST_FEATURE_RETURN_HANGUP -1
41 #define AST_FEATURE_RETURN_SUCCESSBREAK 0
42 #define AST_FEATURE_RETURN_PBX_KEEPALIVE AST_PBX_KEEPALIVE
43 #define AST_FEATURE_RETURN_NO_HANGUP_PEER AST_PBX_NO_HANGUP_PEER
44 #define AST_FEATURE_RETURN_PASSDIGITS 21
45 #define AST_FEATURE_RETURN_STOREDIGITS 22
46 #define AST_FEATURE_RETURN_SUCCESS 23
47 #define AST_FEATURE_RETURN_KEEPTRYING 24
48 #define AST_FEATURE_RETURN_PARKFAILED 25
50 #define FEATURE_SENSE_CHAN (1 << 0)
51 #define FEATURE_SENSE_PEER (1 << 1)
53 typedef int (*ast_feature_operation)(struct ast_channel *chan, struct ast_channel *peer, struct ast_bridge_config *config, const char *code, int sense, void *data);
55 /*! \brief main call feature structure */
58 AST_FEATURE_FLAG_NEEDSDTMF = (1 << 0),
59 AST_FEATURE_FLAG_ONPEER = (1 << 1),
60 AST_FEATURE_FLAG_ONSELF = (1 << 2),
61 AST_FEATURE_FLAG_BYCALLEE = (1 << 3),
62 AST_FEATURE_FLAG_BYCALLER = (1 << 4),
63 AST_FEATURE_FLAG_BYBOTH = (3 << 3),
66 struct ast_call_feature {
69 char sname[FEATURE_SNAME_LEN];
70 char exten[FEATURE_MAX_LEN];
71 char default_exten[FEATURE_MAX_LEN];
72 ast_feature_operation operation;
74 char app[FEATURE_APP_LEN];
75 char app_args[FEATURE_APP_ARGS_LEN];
76 char moh_class[FEATURE_MOH_LEN];
77 AST_LIST_ENTRY(ast_call_feature) feature_entry;
81 * \brief Park a call and read back parked location
82 * \param chan the channel to actually be parked
83 * \param host the channel which will have the parked location read to.
84 * \param timeout is a timeout in milliseconds
85 * \param extout is a parameter to an int that will hold the parked location, or NULL if you want.
87 * Park the channel chan, and read back the parked location to the host.
88 * If the call is not picked up within a specified period of time,
89 * then the call will return to the last step that it was in
90 * (in terms of exten, priority and context)
91 * \retval 0 on success.
92 * \retval -1 on failure.
94 int ast_park_call(struct ast_channel *chan, struct ast_channel *host, int timeout, const char *parkexten, int *extout);
97 * \brief Park a call via a masqueraded channel
98 * \param rchan the real channel to be parked
99 * \param host the channel to have the parking read to.
100 * \param timeout is a timeout in milliseconds
101 * \param extout is a parameter to an int that will hold the parked location, or NULL if you want.
103 * Masquerade the channel rchan into a new, empty channel which is then parked with ast_park_call
104 * \retval 0 on success.
105 * \retval -1 on failure.
107 int ast_masq_park_call(struct ast_channel *rchan, struct ast_channel *host, int timeout, int *extout);
110 * \brief Determine if parking extension exists in a given context
111 * \retval 0 if extension does not exist
112 * \retval 1 if extension does exist
114 int ast_parking_ext_valid(const char *exten_str, struct ast_channel *chan, const char *context);
116 /*! \brief Determine system call pickup extension */
117 const char *ast_pickup_ext(void);
119 /*! \brief Bridge a call, optionally allowing redirection */
120 int ast_bridge_call(struct ast_channel *chan, struct ast_channel *peer,struct ast_bridge_config *config);
122 /*! \brief Pickup a call */
123 int ast_pickup_call(struct ast_channel *chan);
126 * \brief Pickup a call target
127 * \note This function assumes that target is locked
128 * \retval 0 on success.
129 * \retval -1 on failure.
131 int ast_do_pickup(struct ast_channel *chan, struct ast_channel *target);
134 * \brief register new feature into feature_set
135 * \param feature an ast_call_feature object which contains a keysequence
136 * and a callback function which is called when this keysequence is pressed
139 void ast_register_feature(struct ast_call_feature *feature);
142 * \brief unregister feature from feature_set
143 * \param feature the ast_call_feature object which was registered before
145 void ast_unregister_feature(struct ast_call_feature *feature);
148 * \brief detect a feature before bridging
150 * \param features an ast_flags ptr
151 * \param code ptr of input code
153 * \retval ast_call_feature ptr to be set if found
155 int ast_feature_detect(struct ast_channel *chan, struct ast_flags *features, const char *code, struct ast_call_feature *feature);
158 * \brief look for a call feature entry by its sname
159 * \param name a string ptr, should match "automon", "blindxfer", "atxfer", etc.
161 struct ast_call_feature *ast_find_call_feature(const char *name);
163 void ast_rdlock_call_features(void);
164 void ast_unlock_call_features(void);
166 /*! \brief Reload call features from features.conf */
167 int ast_features_reload(void);
170 * \brief parse L option and read associated channel variables to set warning, warning frequency, and timelimit
171 * \note caller must be aware of freeing memory for warning_sound, end_sound, and start_sound
173 int ast_bridge_timelimit(struct ast_channel *chan, struct ast_bridge_config *config, char *parse, struct timeval *calldurationlimit);
175 #endif /* _AST_FEATURES_H */