Fix building under Solaris.
[asterisk/asterisk.git] / res / res_eventtest.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2007, Digium, Inc.
5  *
6  * Russell Bryant <russell@digium.com>
7  *
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.
13  *
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.
17  */
18
19 /*! 
20  * \file
21  * \author Russell Bryant <russell@digium.com>
22  *
23  * \brief Test code for the internal event system
24  * 
25  */
26
27 /*** MODULEINFO
28         <defaultenabled>no</defaultenabled>
29  ***/
30
31 #include "asterisk.h"
32
33 ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
34
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <string.h>
38 #include <unistd.h>
39
40 #include "asterisk/module.h"
41 #include "asterisk/event.h"
42 #include "asterisk/cli.h"
43
44 static void process_event_generic(const struct ast_event *event)
45 {
46         ast_log(LOG_DEBUG, "Event type: %u\n", ast_event_get_type(event));
47 }
48
49 static void process_event_mwi(const struct ast_event *event)
50 {
51         const char *mailbox;
52         unsigned int new;
53         unsigned int old;
54
55         mailbox = ast_event_get_ie_str(event, AST_EVENT_IE_MAILBOX);
56         new = ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS);
57         old = ast_event_get_ie_uint(event, AST_EVENT_IE_OLDMSGS);
58
59         ast_log(LOG_DEBUG, "MWI Event.  Mailbox: %s  New: %u  Old: %u\n",
60                 mailbox, new, old);
61 }
62
63 static void ast_event_process(const struct ast_event *event, void *userdata)
64 {
65         switch (ast_event_get_type(event)) {
66         case AST_EVENT_MWI:
67                 process_event_mwi(event);
68                 break;
69         default:
70                 process_event_generic(event);
71         }
72 }
73
74 static char *event_gen(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
75 {
76         struct ast_event *event;
77         const char *mailbox = "1234@fakecontext";
78         unsigned int new = 5;
79         unsigned int old = 12;
80         struct ast_event_sub *event_sub;
81
82         switch (cmd) {
83         case CLI_INIT:
84                 e->command = "event generate";
85                 e->usage =
86                         "Usage: event generate\n"
87                         "       Generate a test event.\n";
88                 return NULL;
89
90         case CLI_GENERATE:
91                 return NULL;    /* no completion */
92         }
93         if (a->argc != e->args)
94                 return CLI_SHOWUSAGE;
95
96         if (!(event_sub = ast_event_subscribe(AST_EVENT_ALL, ast_event_process, 
97                 NULL, AST_EVENT_IE_END))) {
98                 return CLI_FAILURE;
99         }
100
101         if (!(event = ast_event_new(AST_EVENT_MWI, 
102                         AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
103                         AST_EVENT_IE_NEWMSGS, AST_EVENT_IE_PLTYPE_UINT, new,
104                         AST_EVENT_IE_OLDMSGS, AST_EVENT_IE_PLTYPE_UINT, old,
105                         AST_EVENT_IE_END))) {
106                 return CLI_FAILURE;
107         }
108
109         ast_event_queue_and_cache(event,
110                 AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR,
111                 AST_EVENT_IE_END);
112
113         /* XXX This is a hack.  I should use a timed thread condition instead. */
114         usleep(1000000);
115
116         ast_event_unsubscribe(event_sub);
117
118         return CLI_SUCCESS;
119 }
120
121 static char *event_get_cached(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
122 {
123         struct ast_event *event;
124         const char *mailbox = "1234@fakecontext";
125
126         switch (cmd) {
127         case CLI_INIT:
128                 e->command = "event get cached";
129                 e->usage =
130                         "Usage: event get cached\n"
131                         "       Test getting an event from the cache.\n";
132                 return NULL;
133
134         case CLI_GENERATE:
135                 return NULL;    /* no completion */
136         }
137         if (a->argc != e->args)
138                 return CLI_SHOWUSAGE;
139
140         event = ast_event_get_cached(AST_EVENT_MWI,
141                 AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR, mailbox,
142                 AST_EVENT_IE_END);
143
144         if (!event) {
145                 ast_cli(a->fd, "No event retrieved!\n");
146                 return CLI_FAILURE;
147         }
148
149         ast_cli(a->fd, "Got the event.  New: %u  Old: %u\n",
150                 ast_event_get_ie_uint(event, AST_EVENT_IE_NEWMSGS),
151                 ast_event_get_ie_uint(event, AST_EVENT_IE_OLDMSGS));
152
153         ast_event_destroy(event);
154
155         return CLI_SUCCESS;
156 }
157
158 static struct ast_cli_entry cli_commands[] = {
159         NEW_CLI(event_gen, "Generate a test event"),
160         NEW_CLI(event_get_cached, "Get an event from the cache"),
161 };
162
163 static int load_module(void)
164 {
165         ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands));
166
167         return AST_MODULE_LOAD_SUCCESS;
168 }
169
170 static int unload_module(void)
171 {
172         ast_cli_unregister_multiple(cli_commands, ARRAY_LEN(cli_commands));
173
174         return 0;
175 }
176
177 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Test code for the internal event system");