Asterisk - The Open Source Telephony Project GIT-master-0bf3178
Functions | Variables
func_presencestate.c File Reference

Custom presence provider. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/utils.h"
#include "asterisk/linkedlists.h"
#include "asterisk/presencestate.h"
#include "asterisk/cli.h"
#include "asterisk/astdb.h"
#include "asterisk/app.h"
Include dependency graph for func_presencestate.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static enum ast_presence_state custom_presence_callback (const char *data, char **subtype, char **message)
 
static char * handle_cli_presencestate_change (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static char * handle_cli_presencestate_list (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 
static int load_module (void)
 
static int parse_data (char *data, enum ast_presence_state *state, char **subtype, char **message, char **options)
 
static int presence_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 
static int presence_write (struct ast_channel *chan, const char *cmd, char *data, const char *value)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Gets or sets a presence state in the dialplan" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEVSTATE_PROVIDER, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static const char astdb_family [] = "CustomPresence"
 
static struct ast_cli_entry cli_funcpresencestate []
 
static struct ast_custom_function presence_function
 

Detailed Description

Custom presence provider.

Definition in file func_presencestate.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 884 of file func_presencestate.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 884 of file func_presencestate.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 884 of file func_presencestate.c.

◆ custom_presence_callback()

static enum ast_presence_state custom_presence_callback ( const char *  data,
char **  subtype,
char **  message 
)
static

Definition at line 248 of file func_presencestate.c.

249{
250 char buf[1301] = "";
252 char *_options;
253 char *_message;
254 char *_subtype;
255
256 if (ast_db_get(astdb_family, data, buf, sizeof(buf))) {
258 }
259
260 if (parse_data(buf, &state, &_subtype, &_message, &_options)) {
262 }
263
264 if ((strchr(_options, 'e'))) {
265 char tmp[1301];
266
267 if (ast_strlen_zero(_subtype)) {
268 *subtype = NULL;
269 } else {
270 memset(tmp, 0, sizeof(tmp));
271 ast_base64decode((unsigned char *) tmp, _subtype, sizeof(tmp) - 1);
272 *subtype = ast_strdup(tmp);
273 }
274
275 if (ast_strlen_zero(_message)) {
276 *message = NULL;
277 } else {
278 memset(tmp, 0, sizeof(tmp));
279 ast_base64decode((unsigned char *) tmp, _message, sizeof(tmp) - 1);
281 }
282 } else {
283 *subtype = ast_strlen_zero(_subtype) ? NULL : ast_strdup(_subtype);
284 *message = ast_strlen_zero(_message) ? NULL : ast_strdup(_message);
285 }
286 return state;
287}
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
Definition: main/db.c:427
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:241
static int tmp()
Definition: bt_open.c:389
enum cc_state state
Definition: ccss.c:393
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static const char astdb_family[]
static int parse_data(char *data, enum ast_presence_state *state, char **subtype, char **message, char **options)
ast_presence_state
Definition: presencestate.h:26
@ AST_PRESENCE_INVALID
Definition: presencestate.h:39
@ AST_PRESENCE_NOT_SET
Definition: presencestate.h:27
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
int ast_base64decode(unsigned char *dst, const char *src, int max)
Decode data from base64.
Definition: utils.c:296

References ast_base64decode(), ast_db_get(), AST_PRESENCE_INVALID, AST_PRESENCE_NOT_SET, ast_strdup, ast_strlen_zero(), astdb_family, buf, NULL, parse_data(), state, and tmp().

Referenced by load_module().

◆ handle_cli_presencestate_change()

static char * handle_cli_presencestate_change ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 366 of file func_presencestate.c.

367{
368 size_t len;
369 const char *dev, *state, *full_dev;
370 enum ast_presence_state state_val;
371 char *message;
372 char *subtype;
373 char *options;
374 char *args;
375
376 switch (cmd) {
377 case CLI_INIT:
378 e->command = "presencestate change";
379 e->usage =
380 "Usage: presencestate change <entity> <state>[,<subtype>[,message[,options]]]\n"
381 " Change a custom presence to a new state.\n"
382 " The possible values for the state are:\n"
383 "NOT_SET | UNAVAILABLE | AVAILABLE | AWAY | XA | CHAT | DND\n"
384 "Optionally, a custom subtype and message may be provided, along with any options\n"
385 "accepted by func_presencestate. If the subtype or message provided contain spaces,\n"
386 "be sure to enclose the data in quotation marks (\"\")\n"
387 "\n"
388 "Examples:\n"
389 " presencestate change CustomPresence:mystate1 AWAY\n"
390 " presencestate change CustomPresence:mystate1 AVAILABLE\n"
391 " presencestate change CustomPresence:mystate1 \"Away,upstairs,eating lunch\"\n"
392 " \n";
393 return NULL;
394 case CLI_GENERATE:
395 {
396 static const char * const cmds[] = { "NOT_SET", "UNAVAILABLE", "AVAILABLE", "AWAY",
397 "XA", "CHAT", "DND", NULL };
398
399 if (a->pos == e->args + 1) {
400 return ast_cli_complete(a->word, cmds, a->n);
401 }
402
403 return NULL;
404 }
405 }
406
407 if (a->argc != e->args + 2) {
408 return CLI_SHOWUSAGE;
409 }
410
411 len = strlen("CustomPresence:");
412 full_dev = dev = a->argv[e->args];
413 state = a->argv[e->args + 1];
414
415 if (strncasecmp(dev, "CustomPresence:", len)) {
416 ast_cli(a->fd, "The presencestate command can only be used to set 'CustomPresence:' presence state!\n");
417 return CLI_FAILURE;
418 }
419
420 dev += len;
421 if (ast_strlen_zero(dev)) {
422 return CLI_SHOWUSAGE;
423 }
424
426 if (parse_data(args, &state_val, &subtype, &message, &options)) {
427 return CLI_SHOWUSAGE;
428 }
429
430 if (state_val == AST_PRESENCE_NOT_SET) {
431 return CLI_SHOWUSAGE;
432 }
433
434 ast_cli(a->fd, "Changing %s to %s\n", dev, args);
435
437
438 ast_presence_state_changed_literal(state_val, subtype, message, full_dev);
439
440 return CLI_SUCCESS;
441}
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
Definition: main/db.c:341
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define CLI_SUCCESS
Definition: cli.h:44
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
char * ast_cli_complete(const char *word, const char *const choices[], int pos)
Definition: main/cli.c:1853
@ CLI_INIT
Definition: cli.h:152
@ CLI_GENERATE
Definition: cli.h:153
#define CLI_FAILURE
Definition: cli.h:46
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
int ast_presence_state_changed_literal(enum ast_presence_state state, const char *subtype, const char *message, const char *presence_provider)
Notify the world that a presence provider state changed.
int args
This gets set in ast_cli_register()
Definition: cli.h:185
char * command
Definition: cli.h:186
const char * usage
Definition: cli.h:177
const char * args
static struct test_options options
static struct test_val a

References a, ast_cli_entry::args, args, ast_cli(), ast_cli_complete(), ast_db_put(), AST_PRESENCE_NOT_SET, ast_presence_state_changed_literal(), ast_strdupa, ast_strlen_zero(), astdb_family, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, len(), NULL, options, parse_data(), state, and ast_cli_entry::usage.

◆ handle_cli_presencestate_list()

static char * handle_cli_presencestate_list ( struct ast_cli_entry e,
int  cmd,
struct ast_cli_args a 
)
static

Definition at line 295 of file func_presencestate.c.

296{
297 struct ast_db_entry *db_entry, *db_tree;
298
299 switch (cmd) {
300 case CLI_INIT:
301 e->command = "presencestate list";
302 e->usage =
303 "Usage: presencestate list\n"
304 " List all custom presence states that have been set by using\n"
305 " the PRESENCE_STATE dialplan function.\n";
306 return NULL;
307 case CLI_GENERATE:
308 return NULL;
309 }
310
311 if (a->argc != e->args) {
312 return CLI_SHOWUSAGE;
313 }
314
315 ast_cli(a->fd, "\n"
316 "---------------------------------------------------------------------\n"
317 "--- Custom Presence States ------------------------------------------\n"
318 "---------------------------------------------------------------------\n"
319 "---\n");
320
321 db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
322 if (!db_entry) {
323 ast_cli(a->fd, "No custom presence states defined\n");
324 return CLI_SUCCESS;
325 }
326 for (; db_entry; db_entry = db_entry->next) {
327 const char *object_name = strrchr(db_entry->key, '/') + 1;
328 char state_info[1301];
330 char *subtype;
331 char *message;
332 char *options;
333
334 ast_copy_string(state_info, db_entry->data, sizeof(state_info));
335 if (parse_data(state_info, &state, &subtype, &message, &options)) {
336 ast_log(LOG_WARNING, "Invalid CustomPresence entry %s encountered\n", db_entry->data);
337 continue;
338 }
339
340 if (object_name <= (const char *) 1) {
341 continue;
342 }
343 ast_cli(a->fd, "--- Name: 'CustomPresence:%s'\n"
344 " --- State: '%s'\n"
345 " --- Subtype: '%s'\n"
346 " --- Message: '%s'\n"
347 " --- Base64 Encoded: '%s'\n"
348 "---\n",
349 object_name,
351 subtype,
352 message,
353 AST_CLI_YESNO(strchr(options, 'e')));
354 }
355 ast_db_freetree(db_tree);
356 db_tree = NULL;
357
358 ast_cli(a->fd,
359 "---------------------------------------------------------------------\n"
360 "---------------------------------------------------------------------\n"
361 "\n");
362
363 return CLI_SUCCESS;
364}
struct ast_db_entry * ast_db_gettree(const char *family, const char *keytree)
Get a list of values within the astdb tree.
Definition: main/db.c:641
void ast_db_freetree(struct ast_db_entry *entry)
Free structure created by ast_db_gettree()
Definition: main/db.c:701
#define ast_log
Definition: astobj2.c:42
#define AST_CLI_YESNO(x)
Return Yes or No depending on the argument.
Definition: cli.h:71
#define LOG_WARNING
const char * ast_presence_state2str(enum ast_presence_state state)
Convert presence state to text string for output.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
Definition: astdb.h:31
struct ast_db_entry * next
Definition: astdb.h:32
char * key
Definition: astdb.h:33
char data[0]
Definition: astdb.h:34

References a, ast_cli_entry::args, ast_cli(), AST_CLI_YESNO, ast_copy_string(), ast_db_freetree(), ast_db_gettree(), ast_log, ast_presence_state2str(), astdb_family, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, ast_db_entry::data, ast_db_entry::key, LOG_WARNING, ast_db_entry::next, NULL, options, parse_data(), state, and ast_cli_entry::usage.

◆ load_module()

static int load_module ( void  )
static

Definition at line 842 of file func_presencestate.c.

843{
844 int res = 0;
845 struct ast_db_entry *db_entry, *db_tree;
846
847 /* Populate the presence state cache on the system with all of the currently
848 * known custom presence states. */
849 db_entry = db_tree = ast_db_gettree(astdb_family, NULL);
850 for (; db_entry; db_entry = db_entry->next) {
851 const char *dev_name = strrchr(db_entry->key, '/') + 1;
853 char *message = NULL;
854 char *subtype = NULL;
855 if (dev_name <= (const char *) 1) {
856 continue;
857 }
858 state = custom_presence_callback(dev_name, &subtype, &message);
859 ast_presence_state_changed(state, subtype, message, "CustomPresence:%s", dev_name);
860 ast_free(subtype);
862 }
863 ast_db_freetree(db_tree);
864 db_tree = NULL;
865
869#ifdef TEST_FRAMEWORK
870 AST_TEST_REGISTER(test_valid_parse_data);
871 AST_TEST_REGISTER(test_invalid_parse_data);
872 AST_TEST_REGISTER(test_presence_state_change);
873 AST_TEST_REGISTER(test_presence_state_base64_encode);
874#endif
875
876 return res;
877}
#define ast_free(a)
Definition: astmm.h:180
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
static enum ast_presence_state custom_presence_callback(const char *data, char **subtype, char **message)
static struct ast_cli_entry cli_funcpresencestate[]
static struct ast_custom_function presence_function
#define ast_custom_function_register(acf)
Register a custom function.
Definition: pbx.h:1558
int ast_presence_state_prov_add(const char *label, ast_presence_state_prov_cb_type callback)
Add presence state provider.
int ast_presence_state_changed(enum ast_presence_state state, const char *subtype, const char *message, const char *fmt,...)
Notify the world that a presence provider state changed.
#define AST_TEST_REGISTER(cb)
Definition: test.h:127
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, ast_cli_register_multiple, ast_custom_function_register, ast_db_freetree(), ast_db_gettree(), ast_free, ast_presence_state_changed(), ast_presence_state_prov_add(), AST_TEST_REGISTER, astdb_family, cli_funcpresencestate, custom_presence_callback(), ast_db_entry::key, ast_db_entry::next, NULL, presence_function, and state.

◆ parse_data()

static int parse_data ( char *  data,
enum ast_presence_state state,
char **  subtype,
char **  message,
char **  options 
)
static

Definition at line 162 of file func_presencestate.c.

163{
164 char *state_str;
165
166 /* data syntax is state,subtype,message,options */
167 *subtype = "";
168 *message = "";
169 *options = "";
170
171 state_str = strsep(&data, ",");
172 if (ast_strlen_zero(state_str)) {
173 return -1; /* state is required */
174 }
175
176 *state = ast_presence_state_val(state_str);
177
178 /* not a valid state */
179 if (*state == AST_PRESENCE_INVALID) {
180 ast_log(LOG_WARNING, "Unknown presence state value %s\n", state_str);
181 return -1;
182 }
183
184 if (!(*subtype = strsep(&data,","))) {
185 *subtype = "";
186 return 0;
187 }
188
189 if (!(*message = strsep(&data, ","))) {
190 *message = "";
191 return 0;
192 }
193
194 if (!(*options = strsep(&data, ","))) {
195 *options = "";
196 return 0;
197 }
198
199 if (!ast_strlen_zero(*options) && !(strchr(*options, 'e'))) {
200 ast_log(LOG_NOTICE, "Invalid options '%s'\n", *options);
201 return -1;
202 }
203
204 return 0;
205}
char * strsep(char **str, const char *delims)
#define LOG_NOTICE
enum ast_presence_state ast_presence_state_val(const char *val)
Convert presence state from text to integer value.

References ast_log, AST_PRESENCE_INVALID, ast_presence_state_val(), ast_strlen_zero(), LOG_NOTICE, LOG_WARNING, options, and strsep().

Referenced by custom_presence_callback(), handle_cli_presencestate_change(), handle_cli_presencestate_list(), and presence_write().

◆ presence_read()

static int presence_read ( struct ast_channel chan,
const char *  cmd,
char *  data,
char *  buf,
size_t  len 
)
static

Definition at line 102 of file func_presencestate.c.

103{
104 int state;
105 char *message = NULL;
106 char *subtype = NULL;
107 char *parse;
108 int base64encode = 0;
111 AST_APP_ARG(field);
113 );
114
115 if (ast_strlen_zero(data)) {
116 ast_log(LOG_WARNING, "PRESENCE_STATE reading requires an argument \n");
117 return -1;
118 }
119
120 parse = ast_strdupa(data);
121
123
124 if (ast_strlen_zero(args.provider) || ast_strlen_zero(args.field)) {
125 ast_log(LOG_WARNING, "PRESENCE_STATE reading requires both presence provider and presence field arguments. \n");
126 return -1;
127 }
128
129 state = ast_presence_state_nocache(args.provider, &subtype, &message);
131 ast_log(LOG_WARNING, "PRESENCE_STATE unknown \n");
132 return -1;
133 }
134
135 if (!(ast_strlen_zero(args.options)) && (strchr(args.options, 'e'))) {
136 base64encode = 1;
137 }
138
139 if (!ast_strlen_zero(subtype) && !strcasecmp(args.field, "subtype")) {
140 if (base64encode) {
141 ast_base64encode(buf, (unsigned char *) subtype, strlen(subtype), len);
142 } else {
143 ast_copy_string(buf, subtype, len);
144 }
145 } else if (!ast_strlen_zero(message) && !strcasecmp(args.field, "message")) {
146 if (base64encode) {
147 ast_base64encode(buf, (unsigned char *) message, strlen(message), len);
148 } else {
150 }
151
152 } else if (!strcasecmp(args.field, "value")) {
154 }
155
157 ast_free(subtype);
158
159 return 0;
160}
static struct prometheus_metrics_provider provider
Definition: bridges.c:201
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
enum ast_presence_state ast_presence_state_nocache(const char *presence_provider, char **subtype, char **message)
Asks a presence state provider for the current presence state, bypassing the event cache.
int ast_base64encode(char *dst, const unsigned char *src, int srclen, int max)
Encode data in base64.
Definition: utils.c:406

References args, AST_APP_ARG, ast_base64encode(), ast_copy_string(), AST_DECLARE_APP_ARGS, ast_free, ast_log, AST_PRESENCE_INVALID, ast_presence_state2str(), ast_presence_state_nocache(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_strlen_zero(), buf, len(), LOG_WARNING, NULL, options, provider, and state.

◆ presence_write()

static int presence_write ( struct ast_channel chan,
const char *  cmd,
char *  data,
const char *  value 
)
static

Definition at line 207 of file func_presencestate.c.

208{
209 size_t len = strlen("CustomPresence:");
210 char *tmp = data;
211 char *args = ast_strdupa(value);
213 char *options, *message, *subtype;
214
215 if (strncasecmp(data, "CustomPresence:", len)) {
216 ast_log(LOG_WARNING, "The PRESENCE_STATE function can only set CustomPresence: presence providers.\n");
217 return -1;
218 }
219 data += len;
220 if (ast_strlen_zero(data)) {
221 ast_log(LOG_WARNING, "PRESENCE_STATE function called with no custom device name!\n");
222 return -1;
223 }
224
225 if (parse_data(args, &state, &subtype, &message, &options)) {
226 ast_log(LOG_WARNING, "Invalid arguments to PRESENCE_STATE\n");
227 return -1;
228 }
229
231
232 if (strchr(options, 'e')) {
233 /* Let's decode the values before sending them to stasis, yes? */
234 char decoded_subtype[256] = { 0, };
235 char decoded_message[256] = { 0, };
236
237 ast_base64decode((unsigned char *) decoded_subtype, subtype, sizeof(decoded_subtype) -1);
238 ast_base64decode((unsigned char *) decoded_message, message, sizeof(decoded_message) -1);
239
240 ast_presence_state_changed_literal(state, decoded_subtype, decoded_message, tmp);
241 } else {
243 }
244
245 return 0;
246}
int value
Definition: syslog.c:37

References args, ast_base64decode(), ast_db_put(), ast_log, ast_presence_state_changed_literal(), ast_strdupa, ast_strlen_zero(), astdb_family, len(), LOG_WARNING, options, parse_data(), state, tmp(), and value.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 826 of file func_presencestate.c.

827{
828 int res = 0;
829
831 res |= ast_presence_state_prov_del("CustomPresence");
833#ifdef TEST_FRAMEWORK
834 AST_TEST_UNREGISTER(test_valid_parse_data);
835 AST_TEST_UNREGISTER(test_invalid_parse_data);
836 AST_TEST_UNREGISTER(test_presence_state_change);
837 AST_TEST_UNREGISTER(test_presence_state_base64_encode);
838#endif
839 return res;
840}
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
int ast_presence_state_prov_del(const char *label)
Remove presence state provider.
#define AST_TEST_UNREGISTER(cb)
Definition: test.h:128

References ARRAY_LEN, ast_cli_unregister_multiple(), ast_custom_function_unregister(), ast_presence_state_prov_del(), AST_TEST_UNREGISTER, cli_funcpresencestate, and presence_function.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Gets or sets a presence state in the dialplan" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEVSTATE_PROVIDER, }
static

Definition at line 884 of file func_presencestate.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 884 of file func_presencestate.c.

◆ astdb_family

const char astdb_family[] = "CustomPresence"
static

◆ cli_funcpresencestate

struct ast_cli_entry cli_funcpresencestate[]
static
Initial value:
= {
{ .handler = handle_cli_presencestate_list , .summary = "List currently know custom presence states" ,},
{ .handler = handle_cli_presencestate_change , .summary = "Change a custom presence state" ,},
}
static char * handle_cli_presencestate_list(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static char * handle_cli_presencestate_change(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)

Definition at line 443 of file func_presencestate.c.

Referenced by load_module(), and unload_module().

◆ presence_function

struct ast_custom_function presence_function
static
Initial value:
= {
.name = "PRESENCE_STATE",
.read = presence_read,
.write = presence_write,
}
static int presence_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
static int presence_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)

Definition at line 289 of file func_presencestate.c.

Referenced by load_module(), and unload_module().