Asterisk - The Open Source Telephony Project  18.5.0
parking_ui.c
Go to the documentation of this file.
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2013, Digium, Inc.
5  *
6  * Jonathan Rose <[email protected]>
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 /*! \file
20  *
21  * \brief Call Parking CLI commands
22  *
23  * \author Jonathan Rose <[email protected]>
24  */
25 
26 #include "asterisk.h"
27 
28 #include "res_parking.h"
29 #include "asterisk/config.h"
31 #include "asterisk/utils.h"
32 #include "asterisk/module.h"
33 #include "asterisk/cli.h"
34 #include "asterisk/astobj2.h"
35 #include "asterisk/features.h"
36 #include "asterisk/manager.h"
37 
38 static void display_parked_call(struct parked_user *user, int fd)
39 {
40  ast_cli(fd, " Space : %d\n", user->parking_space);
41  ast_cli(fd, " Channel : %s\n", ast_channel_name(user->chan));
42  ast_cli(fd, " Parker Dial String : %s\n", user->parker_dial_string);
43  ast_cli(fd, "\n");
44 }
45 
46 static int display_parked_users_cb(void *obj, void *arg, int flags)
47 {
48  int *fd = arg;
49  struct parked_user *user = obj;
50  display_parked_call(user, *fd);
51  return 0;
52 }
53 
54 static void display_parking_lot(struct parking_lot *lot, int fd)
55 {
56  ast_cli(fd, "Parking Lot: %s\n--------------------------------------------------------------------------\n", lot->name);
57  ast_cli(fd, "Parking Extension : %s\n", lot->cfg->parkext);
58  ast_cli(fd, "Parking Context : %s\n", lot->cfg->parking_con);
59  ast_cli(fd, "Parking Spaces : %d-%d\n", lot->cfg->parking_start, lot->cfg->parking_stop);
60  ast_cli(fd, "Parking Time : %u sec\n", lot->cfg->parkingtime);
61  ast_cli(fd, "Comeback to Origin : %s\n", lot->cfg->comebacktoorigin ? "yes" : "no");
62  ast_cli(fd, "Comeback Context : %s%s\n", lot->cfg->comebackcontext, lot->cfg->comebacktoorigin ? " (comebacktoorigin=yes, not used)" : "");
63  ast_cli(fd, "Comeback Dial Time : %u sec\n", lot->cfg->comebackdialtime);
64  ast_cli(fd, "MusicOnHold Class : %s\n", lot->cfg->mohclass);
65  ast_cli(fd, "Enabled : %s\n", (lot->mode == PARKINGLOT_DISABLED) ? "no" : "yes");
66  ast_cli(fd, "Dynamic : %s\n", (lot->mode == PARKINGLOT_DYNAMIC) ? "yes" : "no");
67  ast_cli(fd, "\n");
68 }
69 
70 static int display_parking_lot_cb(void *obj, void *arg, int flags)
71 {
72  int *fd = arg;
73  struct parking_lot *lot = obj;
74  display_parking_lot(lot, *fd);
75  return 0;
76 }
77 
78 static void cli_display_parking_lot(int fd, const char *name)
79 {
80  RAII_VAR(struct parking_lot *, lot, NULL, ao2_cleanup);
81  lot = parking_lot_find_by_name(name);
82 
83  /* If the parking lot couldn't be found with the search, also abort. */
84  if (!lot) {
85  ast_cli(fd, "Could not find parking lot '%s'\n\n", name);
86  return;
87  }
88 
89  display_parking_lot(lot, fd);
90 
91  ast_cli(fd, "Parked Calls\n------------\n");
92 
93  if (!ao2_container_count(lot->parked_users)) {
94  ast_cli(fd, " (none)\n");
95  ast_cli(fd, "\n\n");
96  return;
97  }
98 
99  ao2_callback(lot->parked_users, OBJ_MULTIPLE | OBJ_NODATA, display_parked_users_cb, &fd);
100  ast_cli(fd, "\n");
101 }
102 
103 static void cli_display_parking_global(int fd)
104 {
105  ast_cli(fd, "Parking General Options\n"
106  "-----------------------\n");
107  ast_cli(fd, "Dynamic Parking : %s\n", parking_dynamic_lots_enabled() ? "yes" : "no");
108  ast_cli(fd, "\n");
109 }
110 
111 static void cli_display_parking_lot_list(int fd)
112 {
113  struct ao2_container *lot_container;
114 
115  lot_container = get_parking_lot_container();
116 
117  if (!lot_container) {
118  ast_cli(fd, "Failed to obtain parking lot list.\n\n");
119  return;
120  }
121 
123  ast_cli(fd, "\n");
124 }
125 
127  int seeking; /*! Nth match to return. */
128  int which; /*! Which match currently on. */
129 };
130 
131 static int complete_parking_lot_search(void *obj, void *arg, void *data, int flags)
132 {
133  struct parking_lot_complete *search = data;
134  if (++search->which > search->seeking) {
135  return CMP_MATCH;
136  }
137  return 0;
138 }
139 
140 static char *complete_parking_lot(const char *word, int seeking)
141 {
142  char *ret = NULL;
143  struct parking_lot *lot;
144  struct ao2_container *global_lots = get_parking_lot_container();
145  struct parking_lot_complete search = {
146  .seeking = seeking,
147  };
148 
149  lot = ao2_callback_data(global_lots, ast_strlen_zero(word) ? 0 : OBJ_PARTIAL_KEY,
150  complete_parking_lot_search, (char *) word, &search);
151 
152  if (!lot) {
153  return NULL;
154  }
155 
156  ret = ast_strdup(lot->name);
157  ao2_ref(lot, -1);
158  return ret;
159 }
160 
161 /* \brief command parking show <name> */
162 static char *handle_show_parking_lot_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
163 {
164  switch (cmd) {
165  case CLI_INIT:
166  e->command = "parking show";
167  e->usage =
168  "Usage: parking show [name]\n"
169  " Shows a list of parking lots or details of a specific parking lot.";
170  return NULL;
171  case CLI_GENERATE:
172  if (a->pos == 2) {
173  return complete_parking_lot(a->word, a->n);
174  }
175  return NULL;
176  }
177 
178  ast_cli(a->fd, "\n");
179 
180  if (a->argc == 2) {
183  return CLI_SUCCESS;
184  }
185 
186  if (a->argc == 3) {
187  cli_display_parking_lot(a->fd, a->argv[2]);
188  return CLI_SUCCESS;
189  }
190 
191  return CLI_SHOWUSAGE;
192 }
193 
194 static struct ast_cli_entry cli_parking_lot[] = {
195  AST_CLI_DEFINE(handle_show_parking_lot_cmd, "Show a parking lot or a list of all parking lots."),
196 };
197 
199 {
200  return ast_cli_register_multiple(cli_parking_lot, ARRAY_LEN(cli_parking_lot));
201 }
202 
204 {
205  ast_cli_unregister_multiple(cli_parking_lot, ARRAY_LEN(cli_parking_lot));
206 }
#define AST_CLI_DEFINE(fn, txt,...)
Definition: cli.h:197
Asterisk main include file. File version handling, generic pbx functions.
unsigned int comebackdialtime
Definition: res_parking.h:70
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
Definition: clicompat.c:30
void unload_parking_ui(void)
Unregister CLI commands.
Definition: parking_ui.c:203
descriptor for a cli entry.
Definition: cli.h:171
const int argc
Definition: cli.h:160
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
unsigned int parkingtime
Definition: res_parking.h:69
Definition: cli.h:152
static char * complete_parking_lot(const char *word, int seeking)
Definition: parking_ui.c:140
static void cli_display_parking_global(int fd)
Definition: parking_ui.c:103
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
const ast_string_field comebackcontext
Definition: res_parking.h:89
int load_parking_ui(void)
Register CLI commands.
Definition: parking_ui.c:198
static int display_parking_lot_cb(void *obj, void *arg, int flags)
Definition: parking_ui.c:70
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
struct parking_lot * lot
Definition: res_parking.h:111
void ast_cli(int fd, const char *fmt,...)
Definition: clicompat.c:6
struct ao2_container * get_parking_lot_container(void)
Get a pointer to the parking lot container for purposes such as iteration.
Definition: res_parking.c:596
#define OBJ_PARTIAL_KEY
Definition: astobj2.h:1156
Utility functions.
#define ast_strlen_zero(foo)
Definition: strings.h:52
Configuration File Parser.
int parking_dynamic_lots_enabled(void)
Check global configuration to see if dynamic parking is enabled.
Definition: res_parking.c:928
const ast_string_field parking_con
Definition: res_parking.h:89
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
const int fd
Definition: cli.h:159
char * parker_dial_string
Definition: res_parking.h:109
const int n
Definition: cli.h:165
static void cli_display_parking_lot(int fd, const char *name)
Definition: parking_ui.c:78
int parking_space
Definition: res_parking.h:107
#define ao2_ref(o, delta)
Definition: astobj2.h:464
unsigned int comebacktoorigin
Definition: res_parking.h:74
const char *const * argv
Definition: cli.h:161
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
Configuration option-handling.
static void display_parked_call(struct parked_user *user, int fd)
Definition: parking_ui.c:38
#define CLI_SHOWUSAGE
Definition: cli.h:45
#define ao2_callback_data(container, flags, cb_fn, arg, data)
Definition: astobj2.h:1743
static const char name[]
Definition: cdr_mysql.c:74
char * command
Definition: cli.h:186
const char * word
Definition: cli.h:163
const ast_string_field name
Definition: res_parking.h:100
structure to hold users read from users.conf
static int display_parked_users_cb(void *obj, void *arg, int flags)
Definition: parking_ui.c:46
static void cli_display_parking_lot_list(int fd)
Definition: parking_ui.c:111
const char * usage
Definition: cli.h:177
#define CLI_SUCCESS
Definition: cli.h:44
enum parking_lot_modes mode
Definition: res_parking.h:97
static int complete_parking_lot_search(void *obj, void *arg, void *data, int flags)
Definition: parking_ui.c:131
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
Standard Command Line Interface.
static char * handle_show_parking_lot_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
Definition: parking_ui.c:162
const ast_string_field parkext
Definition: res_parking.h:89
const char * ast_channel_name(const struct ast_channel *chan)
const int pos
Definition: cli.h:164
const ast_string_field mohclass
Definition: res_parking.h:89
struct parking_lot * parking_lot_find_by_name(const char *lot_name)
Find a parking lot based on its name.
Definition: res_parking.c:601
Call Parking Resource Internal API.
Generic container type.
Call Parking and Pickup API Includes code and algorithms from the Zapata library. ...
Asterisk module definitions.
struct ast_channel * chan
Definition: res_parking.h:104
static struct ast_cli_entry cli_parking_lot[]
Definition: parking_ui.c:194
short word
static void display_parking_lot(struct parking_lot *lot, int fd)
Definition: parking_ui.c:54
struct parking_lot_cfg * cfg
Definition: res_parking.h:96
static struct test_val a