mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-16 17:53:15 +00:00
Compare commits
27 Commits
12.0.0-bet
...
12.0.0-alp
Author | SHA1 | Date | |
---|---|---|---|
|
6194419ed9 | ||
|
99b1bb8cec | ||
|
22a7d3a837 | ||
|
5eba3cf47a | ||
|
f534804779 | ||
|
a51f4134cd | ||
|
511b82563b | ||
|
c81e14022b | ||
|
9b1a126de6 | ||
|
2c38d5c164 | ||
|
95fc980bb4 | ||
|
bf5f59b4eb | ||
|
087832c0a8 | ||
|
3ff7c8f73f | ||
|
81203c99fd | ||
|
0d9cf022f5 | ||
|
7d29b7b25e | ||
|
1a762d7220 | ||
|
5f2fc8aa90 | ||
|
86f01e4e09 | ||
|
dc6a876c45 | ||
|
c1a658bbab | ||
|
1dff370bc0 | ||
|
2fae3ff073 | ||
|
c920b4e329 | ||
|
2ea015bc68 | ||
|
9c33b20357 |
@@ -1 +0,0 @@
|
||||
40
|
4
CHANGES
4
CHANGES
@@ -161,10 +161,6 @@ ConfBridge
|
||||
when the recording is stopped and then re-started, the existing recording
|
||||
will be used and appended to.
|
||||
|
||||
* ConfBridge now has the ability to set the language of announcements to the
|
||||
conference. The language can be set on a bridge profile in confbridge.conf
|
||||
or by the dialplan function CONFBRIDGE(bridge,language)=en.
|
||||
|
||||
ControlPlayback
|
||||
------------------
|
||||
* The channel variable CPLAYBACKSTATUS may now return the value
|
||||
|
@@ -2032,7 +2032,6 @@ static int agent_login_exec(struct ast_channel *chan, const char *data)
|
||||
agent->logged = ast_channel_ref(chan);
|
||||
agent->last_disconnect = ast_tvnow();
|
||||
time(&agent->login_start);
|
||||
agent->deferred_logoff = 0;
|
||||
agent_unlock(agent);
|
||||
|
||||
agent_login_channel_config(agent, chan);
|
||||
|
@@ -1339,9 +1339,6 @@ static int alloc_playback_chan(struct confbridge_conference *conference)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* To make sure playback_chan has the same language of that profile */
|
||||
ast_channel_language_set(conference->playback_chan, conference->b_profile.language);
|
||||
|
||||
ast_debug(1, "Created announcer channel '%s' to conference bridge '%s'\n",
|
||||
ast_channel_name(conference->playback_chan), conference->name);
|
||||
return 0;
|
||||
|
504
apps/app_queue.c
504
apps/app_queue.c
@@ -1268,12 +1268,8 @@ static const struct autopause {
|
||||
#define DEFAULT_TIMEOUT 15
|
||||
#define RECHECK 1 /*!< Recheck every second to see we we're at the top yet */
|
||||
#define MAX_PERIODIC_ANNOUNCEMENTS 10 /*!< The maximum periodic announcements we can have */
|
||||
/*!
|
||||
* \brief The minimum number of seconds between position announcements.
|
||||
* \note The default value of 15 provides backwards compatibility.
|
||||
*/
|
||||
#define DEFAULT_MIN_ANNOUNCE_FREQUENCY 15
|
||||
|
||||
#define DEFAULT_MIN_ANNOUNCE_FREQUENCY 15 /*!< The minimum number of seconds between position announcements \
|
||||
The default value of 15 provides backwards compatibility */
|
||||
#define MAX_QUEUE_BUCKETS 53
|
||||
|
||||
#define RES_OKAY 0 /*!< Action completed */
|
||||
@@ -1818,116 +1814,54 @@ static inline void insert_entry(struct call_queue *q, struct queue_ent *prev, st
|
||||
new->opos = *pos;
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_channel_to_ami(const char *type, struct stasis_message *message)
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_join_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_leave_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_abandon_type);
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_status_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_added_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_removed_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_pause_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_penalty_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_ringinuse_type);
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_called_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_connect_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_complete_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_dump_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_ringnoanswer_type);
|
||||
|
||||
static void queue_channel_manager_event(void *data,
|
||||
struct stasis_subscription *sub,
|
||||
struct stasis_message *message)
|
||||
{
|
||||
const char *type = data;
|
||||
struct ast_channel_blob *obj = stasis_message_data(message);
|
||||
RAII_VAR(struct ast_str *, channel_string, NULL, ast_free);
|
||||
RAII_VAR(struct ast_str *, channel_event_string, NULL, ast_free);
|
||||
RAII_VAR(struct ast_str *, event_string, NULL, ast_free);
|
||||
|
||||
channel_string = ast_manager_build_channel_state_string(obj->snapshot);
|
||||
event_string = ast_manager_str_from_json_object(obj->blob, NULL);
|
||||
if (!channel_string || !event_string) {
|
||||
return NULL;
|
||||
channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
|
||||
if (!channel_event_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
return ast_manager_event_blob_create(EVENT_FLAG_AGENT, type,
|
||||
event_string = ast_manager_str_from_json_object(obj->blob, NULL);
|
||||
if (!event_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
manager_event(EVENT_FLAG_AGENT, type,
|
||||
"%s"
|
||||
"%s",
|
||||
ast_str_buffer(channel_string),
|
||||
ast_str_buffer(channel_event_string),
|
||||
ast_str_buffer(event_string));
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_caller_join_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_channel_to_ami("QueueCallerJoin", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_caller_leave_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_channel_to_ami("QueueCallerLeave", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_caller_abandon_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_channel_to_ami("QueueCallerAbandon", message);
|
||||
}
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_join_type,
|
||||
.to_ami = queue_caller_join_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_leave_type,
|
||||
.to_ami = queue_caller_leave_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_caller_abandon_type,
|
||||
.to_ami = queue_caller_abandon_to_ami,
|
||||
);
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_to_ami(const char *type, struct stasis_message *message)
|
||||
{
|
||||
struct ast_json_payload *payload = stasis_message_data(message);
|
||||
RAII_VAR(struct ast_str *, event_string, NULL, ast_free);
|
||||
|
||||
event_string = ast_manager_str_from_json_object(payload->json, NULL);
|
||||
if (!event_string) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ast_manager_event_blob_create(EVENT_FLAG_AGENT, type,
|
||||
"%s",
|
||||
ast_str_buffer(event_string));
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_status_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberStatus", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_added_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberAdded", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_removed_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberRemoved", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_pause_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberPause", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_penalty_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberPenalty", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_member_ringinuse_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_member_to_ami("QueueMemberRinginuse", message);
|
||||
}
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_status_type,
|
||||
.to_ami = queue_member_status_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_added_type,
|
||||
.to_ami = queue_member_added_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_removed_type,
|
||||
.to_ami = queue_member_removed_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_pause_type,
|
||||
.to_ami = queue_member_pause_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_penalty_type,
|
||||
.to_ami = queue_member_penalty_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_member_ringinuse_type,
|
||||
.to_ami = queue_member_ringinuse_to_ami,
|
||||
);
|
||||
|
||||
static struct ast_manager_event_blob *queue_multi_channel_to_ami(const char *type, struct stasis_message *message)
|
||||
static void queue_multi_channel_manager_event(void *data,
|
||||
struct stasis_subscription *sub,
|
||||
struct stasis_message *message)
|
||||
{
|
||||
const char *type = data;
|
||||
struct ast_multi_channel_blob *obj = stasis_message_data(message);
|
||||
struct ast_channel_snapshot *caller;
|
||||
struct ast_channel_snapshot *agent;
|
||||
@@ -1939,8 +1873,8 @@ static struct ast_manager_event_blob *queue_multi_channel_to_ami(const char *typ
|
||||
if (caller) {
|
||||
caller_event_string = ast_manager_build_channel_state_string(caller);
|
||||
if (!caller_event_string) {
|
||||
ast_log(LOG_NOTICE, "No caller event string, bailing\n");
|
||||
return NULL;
|
||||
ast_log(AST_LOG_NOTICE, "No caller event string, bailing\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1948,17 +1882,17 @@ static struct ast_manager_event_blob *queue_multi_channel_to_ami(const char *typ
|
||||
if (agent) {
|
||||
agent_event_string = ast_manager_build_channel_state_string_prefix(agent, "Dest");
|
||||
if (!agent_event_string) {
|
||||
ast_log(LOG_NOTICE, "No agent event string, bailing\n");
|
||||
return NULL;
|
||||
ast_log(AST_LOG_NOTICE, "No agent event string, bailing\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
event_string = ast_manager_str_from_json_object(ast_multi_channel_blob_get_json(obj), NULL);
|
||||
if (!event_string) {
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
return ast_manager_event_blob_create(EVENT_FLAG_AGENT, type,
|
||||
manager_event(EVENT_FLAG_AGENT, type,
|
||||
"%s"
|
||||
"%s"
|
||||
"%s",
|
||||
@@ -1967,47 +1901,24 @@ static struct ast_manager_event_blob *queue_multi_channel_to_ami(const char *typ
|
||||
ast_str_buffer(event_string));
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_agent_called_to_ami(struct stasis_message *message)
|
||||
static void queue_member_manager_event(void *data,
|
||||
struct stasis_subscription *sub,
|
||||
struct stasis_message *message)
|
||||
{
|
||||
return queue_multi_channel_to_ami("AgentCalled", message);
|
||||
}
|
||||
const char *type = data;
|
||||
struct ast_json_payload *payload = stasis_message_data(message);
|
||||
struct ast_json *event = payload->json;
|
||||
RAII_VAR(struct ast_str *, event_string, NULL, ast_free);
|
||||
|
||||
static struct ast_manager_event_blob *queue_agent_connect_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_multi_channel_to_ami("AgentConnect", message);
|
||||
}
|
||||
event_string = ast_manager_str_from_json_object(event, NULL);
|
||||
if (!event_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_agent_complete_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_multi_channel_to_ami("AgentComplete", message);
|
||||
manager_event(EVENT_FLAG_AGENT, type,
|
||||
"%s", ast_str_buffer(event_string));
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_agent_dump_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_multi_channel_to_ami("AgentDump", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *queue_agent_ringnoanswer_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return queue_multi_channel_to_ami("AgentRingNoAnswer", message);
|
||||
}
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_called_type,
|
||||
.to_ami = queue_agent_called_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_connect_type,
|
||||
.to_ami = queue_agent_connect_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_complete_type,
|
||||
.to_ami = queue_agent_complete_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_dump_type,
|
||||
.to_ami = queue_agent_dump_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(queue_agent_ringnoanswer_type,
|
||||
.to_ami = queue_agent_ringnoanswer_to_ami,
|
||||
);
|
||||
|
||||
static void queue_publish_multi_channel_snapshot_blob(struct stasis_topic *topic,
|
||||
struct ast_channel_snapshot *caller_snapshot,
|
||||
struct ast_channel_snapshot *agent_snapshot,
|
||||
@@ -7779,7 +7690,7 @@ stop:
|
||||
}
|
||||
} else if (qe.valid_digits) {
|
||||
ast_queue_log(args.queuename, ast_channel_uniqueid(chan), "NONE", "EXITWITHKEY",
|
||||
"%s|%d|%d|%ld", qe.digits, qe.pos, qe.opos, (long) time(NULL) - qe.start);
|
||||
"%s|%d", qe.digits, qe.pos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10429,9 +10340,30 @@ static struct stasis_forward *topic_forwarder;
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
stasis_message_router_unsubscribe_and_join(agent_router);
|
||||
agent_router = NULL;
|
||||
int res;
|
||||
struct ao2_iterator q_iter;
|
||||
struct call_queue *q = NULL;
|
||||
|
||||
struct stasis_message_router *message_router;
|
||||
|
||||
message_router = ast_manager_get_message_router();
|
||||
if (message_router) {
|
||||
stasis_message_router_remove(message_router, queue_caller_join_type());
|
||||
stasis_message_router_remove(message_router, queue_caller_leave_type());
|
||||
stasis_message_router_remove(message_router, queue_caller_abandon_type());
|
||||
stasis_message_router_remove(message_router, queue_member_status_type());
|
||||
stasis_message_router_remove(message_router, queue_member_added_type());
|
||||
stasis_message_router_remove(message_router, queue_member_removed_type());
|
||||
stasis_message_router_remove(message_router, queue_member_pause_type());
|
||||
stasis_message_router_remove(message_router, queue_member_penalty_type());
|
||||
stasis_message_router_remove(message_router, queue_member_ringinuse_type());
|
||||
stasis_message_router_remove(message_router, queue_agent_called_type());
|
||||
stasis_message_router_remove(message_router, queue_agent_connect_type());
|
||||
stasis_message_router_remove(message_router, queue_agent_complete_type());
|
||||
stasis_message_router_remove(message_router, queue_agent_dump_type());
|
||||
stasis_message_router_remove(message_router, queue_agent_ringnoanswer_type());
|
||||
}
|
||||
stasis_message_router_unsubscribe_and_join(agent_router);
|
||||
topic_forwarder = stasis_forward_cancel(topic_forwarder);
|
||||
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(queue_caller_join_type);
|
||||
@@ -10452,42 +10384,47 @@ static int unload_module(void)
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(queue_agent_ringnoanswer_type);
|
||||
|
||||
ast_cli_unregister_multiple(cli_queue, ARRAY_LEN(cli_queue));
|
||||
ast_manager_unregister("QueueStatus");
|
||||
ast_manager_unregister("Queues");
|
||||
ast_manager_unregister("QueueRule");
|
||||
ast_manager_unregister("QueueSummary");
|
||||
ast_manager_unregister("QueueAdd");
|
||||
ast_manager_unregister("QueueRemove");
|
||||
ast_manager_unregister("QueuePause");
|
||||
ast_manager_unregister("QueueLog");
|
||||
ast_manager_unregister("QueuePenalty");
|
||||
ast_manager_unregister("QueueReload");
|
||||
ast_manager_unregister("QueueReset");
|
||||
ast_manager_unregister("QueueMemberRingInUse");
|
||||
ast_unregister_application(app_aqm);
|
||||
ast_unregister_application(app_rqm);
|
||||
ast_unregister_application(app_pqm);
|
||||
ast_unregister_application(app_upqm);
|
||||
ast_unregister_application(app_ql);
|
||||
ast_unregister_application(app);
|
||||
ast_custom_function_unregister(&queueexists_function);
|
||||
ast_custom_function_unregister(&queuevar_function);
|
||||
ast_custom_function_unregister(&queuemembercount_function);
|
||||
ast_custom_function_unregister(&queuemembercount_dep);
|
||||
ast_custom_function_unregister(&queuememberlist_function);
|
||||
ast_custom_function_unregister(&queuewaitingcount_function);
|
||||
ast_custom_function_unregister(&queuememberpenalty_function);
|
||||
res = ast_manager_unregister("QueueStatus");
|
||||
res |= ast_manager_unregister("Queues");
|
||||
res |= ast_manager_unregister("QueueRule");
|
||||
res |= ast_manager_unregister("QueueSummary");
|
||||
res |= ast_manager_unregister("QueueAdd");
|
||||
res |= ast_manager_unregister("QueueRemove");
|
||||
res |= ast_manager_unregister("QueuePause");
|
||||
res |= ast_manager_unregister("QueueLog");
|
||||
res |= ast_manager_unregister("QueuePenalty");
|
||||
res |= ast_manager_unregister("QueueReload");
|
||||
res |= ast_manager_unregister("QueueReset");
|
||||
res |= ast_manager_unregister("QueueMemberRingInUse");
|
||||
res |= ast_unregister_application(app_aqm);
|
||||
res |= ast_unregister_application(app_rqm);
|
||||
res |= ast_unregister_application(app_pqm);
|
||||
res |= ast_unregister_application(app_upqm);
|
||||
res |= ast_unregister_application(app_ql);
|
||||
res |= ast_unregister_application(app);
|
||||
res |= ast_custom_function_unregister(&queueexists_function);
|
||||
res |= ast_custom_function_unregister(&queuevar_function);
|
||||
res |= ast_custom_function_unregister(&queuemembercount_function);
|
||||
res |= ast_custom_function_unregister(&queuemembercount_dep);
|
||||
res |= ast_custom_function_unregister(&queuememberlist_function);
|
||||
res |= ast_custom_function_unregister(&queuewaitingcount_function);
|
||||
res |= ast_custom_function_unregister(&queuememberpenalty_function);
|
||||
|
||||
ast_data_unregister(NULL);
|
||||
res |= ast_data_unregister(NULL);
|
||||
|
||||
device_state_sub = stasis_unsubscribe_and_join(device_state_sub);
|
||||
|
||||
ast_extension_state_del(0, extension_state_cb);
|
||||
|
||||
q_iter = ao2_iterator_init(queues, 0);
|
||||
while ((q = ao2_t_iterator_next(&q_iter, "Iterate through queues"))) {
|
||||
queues_t_unlink(queues, q, "Remove queue from container due to unload");
|
||||
queue_t_unref(q, "Done with iterator");
|
||||
}
|
||||
ao2_iterator_destroy(&q_iter);
|
||||
ao2_ref(queues, -1);
|
||||
ast_unload_realtime("queue_members");
|
||||
ao2_cleanup(queues);
|
||||
queues = NULL;
|
||||
return 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -10502,23 +10439,19 @@ static int unload_module(void)
|
||||
*/
|
||||
static int load_module(void)
|
||||
{
|
||||
int err = 0;
|
||||
int res;
|
||||
struct ast_flags mask = {AST_FLAGS_ALL, };
|
||||
struct ast_config *member_config;
|
||||
struct stasis_message_router *manager_router;
|
||||
struct stasis_topic *queue_topic;
|
||||
struct stasis_topic *manager_topic;
|
||||
|
||||
queues = ao2_container_alloc(MAX_QUEUE_BUCKETS, queue_hash_cb, queue_cmp_cb);
|
||||
if (!queues) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
|
||||
use_weight = 0;
|
||||
|
||||
if (reload_handler(0, &mask, NULL)) {
|
||||
unload_module();
|
||||
if (reload_handler(0, &mask, NULL))
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
|
||||
ast_realtime_require_field("queue_members", "paused", RQ_INTEGER1, 1, "uniqueid", RQ_UINTEGER2, 5, SENTINEL);
|
||||
|
||||
@@ -10531,7 +10464,6 @@ static int load_module(void)
|
||||
realtime_ringinuse_field = "ringinuse";
|
||||
} else {
|
||||
const char *config_val;
|
||||
|
||||
if ((config_val = ast_variable_retrieve(member_config, NULL, "ringinuse"))) {
|
||||
ast_log(LOG_NOTICE, "ringinuse field entries found in queue_members table. Using 'ringinuse'\n");
|
||||
realtime_ringinuse_field = "ringinuse";
|
||||
@@ -10543,102 +10475,168 @@ static int load_module(void)
|
||||
realtime_ringinuse_field = "ringinuse";
|
||||
}
|
||||
}
|
||||
|
||||
ast_config_destroy(member_config);
|
||||
|
||||
if (queue_persistent_members) {
|
||||
if (queue_persistent_members)
|
||||
reload_queue_members();
|
||||
}
|
||||
|
||||
ast_data_register_multiple(queue_data_providers, ARRAY_LEN(queue_data_providers));
|
||||
|
||||
err |= ast_cli_register_multiple(cli_queue, ARRAY_LEN(cli_queue));
|
||||
err |= ast_register_application_xml(app, queue_exec);
|
||||
err |= ast_register_application_xml(app_aqm, aqm_exec);
|
||||
err |= ast_register_application_xml(app_rqm, rqm_exec);
|
||||
err |= ast_register_application_xml(app_pqm, pqm_exec);
|
||||
err |= ast_register_application_xml(app_upqm, upqm_exec);
|
||||
err |= ast_register_application_xml(app_ql, ql_exec);
|
||||
err |= ast_manager_register_xml("Queues", 0, manager_queues_show);
|
||||
err |= ast_manager_register_xml("QueueStatus", 0, manager_queues_status);
|
||||
err |= ast_manager_register_xml("QueueSummary", 0, manager_queues_summary);
|
||||
err |= ast_manager_register_xml("QueueAdd", EVENT_FLAG_AGENT, manager_add_queue_member);
|
||||
err |= ast_manager_register_xml("QueueRemove", EVENT_FLAG_AGENT, manager_remove_queue_member);
|
||||
err |= ast_manager_register_xml("QueuePause", EVENT_FLAG_AGENT, manager_pause_queue_member);
|
||||
err |= ast_manager_register_xml("QueueLog", EVENT_FLAG_AGENT, manager_queue_log_custom);
|
||||
err |= ast_manager_register_xml("QueuePenalty", EVENT_FLAG_AGENT, manager_queue_member_penalty);
|
||||
err |= ast_manager_register_xml("QueueMemberRingInUse", EVENT_FLAG_AGENT, manager_queue_member_ringinuse);
|
||||
err |= ast_manager_register_xml("QueueRule", 0, manager_queue_rule_show);
|
||||
err |= ast_manager_register_xml("QueueReload", 0, manager_queue_reload);
|
||||
err |= ast_manager_register_xml("QueueReset", 0, manager_queue_reset);
|
||||
err |= ast_custom_function_register(&queuevar_function);
|
||||
err |= ast_custom_function_register(&queueexists_function);
|
||||
err |= ast_custom_function_register(&queuemembercount_function);
|
||||
err |= ast_custom_function_register(&queuemembercount_dep);
|
||||
err |= ast_custom_function_register(&queuememberlist_function);
|
||||
err |= ast_custom_function_register(&queuewaitingcount_function);
|
||||
err |= ast_custom_function_register(&queuememberpenalty_function);
|
||||
ast_cli_register_multiple(cli_queue, ARRAY_LEN(cli_queue));
|
||||
res = ast_register_application_xml(app, queue_exec);
|
||||
res |= ast_register_application_xml(app_aqm, aqm_exec);
|
||||
res |= ast_register_application_xml(app_rqm, rqm_exec);
|
||||
res |= ast_register_application_xml(app_pqm, pqm_exec);
|
||||
res |= ast_register_application_xml(app_upqm, upqm_exec);
|
||||
res |= ast_register_application_xml(app_ql, ql_exec);
|
||||
res |= ast_manager_register_xml("Queues", 0, manager_queues_show);
|
||||
res |= ast_manager_register_xml("QueueStatus", 0, manager_queues_status);
|
||||
res |= ast_manager_register_xml("QueueSummary", 0, manager_queues_summary);
|
||||
res |= ast_manager_register_xml("QueueAdd", EVENT_FLAG_AGENT, manager_add_queue_member);
|
||||
res |= ast_manager_register_xml("QueueRemove", EVENT_FLAG_AGENT, manager_remove_queue_member);
|
||||
res |= ast_manager_register_xml("QueuePause", EVENT_FLAG_AGENT, manager_pause_queue_member);
|
||||
res |= ast_manager_register_xml("QueueLog", EVENT_FLAG_AGENT, manager_queue_log_custom);
|
||||
res |= ast_manager_register_xml("QueuePenalty", EVENT_FLAG_AGENT, manager_queue_member_penalty);
|
||||
res |= ast_manager_register_xml("QueueMemberRingInUse", EVENT_FLAG_AGENT, manager_queue_member_ringinuse);
|
||||
res |= ast_manager_register_xml("QueueRule", 0, manager_queue_rule_show);
|
||||
res |= ast_manager_register_xml("QueueReload", 0, manager_queue_reload);
|
||||
res |= ast_manager_register_xml("QueueReset", 0, manager_queue_reset);
|
||||
res |= ast_custom_function_register(&queuevar_function);
|
||||
res |= ast_custom_function_register(&queueexists_function);
|
||||
res |= ast_custom_function_register(&queuemembercount_function);
|
||||
res |= ast_custom_function_register(&queuemembercount_dep);
|
||||
res |= ast_custom_function_register(&queuememberlist_function);
|
||||
res |= ast_custom_function_register(&queuewaitingcount_function);
|
||||
res |= ast_custom_function_register(&queuememberpenalty_function);
|
||||
|
||||
/* in the following subscribe call, do I use DEVICE_STATE, or DEVICE_STATE_CHANGE? */
|
||||
device_state_sub = stasis_subscribe(ast_device_state_topic_all(), device_state_cb, NULL);
|
||||
if (!device_state_sub) {
|
||||
err = -1;
|
||||
if (!(device_state_sub = stasis_subscribe(ast_device_state_topic_all(), device_state_cb, NULL))) {
|
||||
res = -1;
|
||||
}
|
||||
|
||||
manager_topic = ast_manager_get_topic();
|
||||
if (!manager_topic) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
manager_router = ast_manager_get_message_router();
|
||||
if (!manager_router) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
queue_topic = ast_queue_topic_all();
|
||||
if (!manager_topic || !queue_topic) {
|
||||
unload_module();
|
||||
if (!queue_topic) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
topic_forwarder = stasis_forward_all(queue_topic, manager_topic);
|
||||
if (!topic_forwarder) {
|
||||
unload_module();
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
|
||||
if (!ast_channel_agent_login_type()
|
||||
|| !ast_channel_agent_logoff_type()) {
|
||||
unload_module();
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
agent_router = stasis_message_router_create(ast_channel_topic_all());
|
||||
if (!agent_router) {
|
||||
unload_module();
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
err |= stasis_message_router_add(agent_router,
|
||||
ast_channel_agent_login_type(),
|
||||
queue_agent_cb,
|
||||
NULL);
|
||||
err |= stasis_message_router_add(agent_router,
|
||||
ast_channel_agent_logoff_type(),
|
||||
queue_agent_cb,
|
||||
NULL);
|
||||
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_caller_join_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_caller_leave_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_caller_abandon_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_caller_join_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_caller_leave_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_caller_abandon_type);
|
||||
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_status_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_added_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_removed_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_pause_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_penalty_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_member_ringinuse_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_status_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_added_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_removed_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_pause_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_penalty_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_member_ringinuse_type);
|
||||
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_called_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_connect_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_complete_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_dump_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(queue_agent_ringnoanswer_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_agent_called_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_agent_connect_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_agent_complete_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_agent_dump_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(queue_agent_ringnoanswer_type);
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_caller_join_type(),
|
||||
queue_channel_manager_event,
|
||||
"QueueCallerJoin");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_caller_leave_type(),
|
||||
queue_channel_manager_event,
|
||||
"QueueCallerLeave");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_caller_abandon_type(),
|
||||
queue_channel_manager_event,
|
||||
"QueueCallerAbandon");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_status_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberStatus");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_added_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberAdded");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_removed_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberRemoved");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_pause_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberPause");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_penalty_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberPenalty");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_member_ringinuse_type(),
|
||||
queue_member_manager_event,
|
||||
"QueueMemberRinginuse");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_agent_called_type(),
|
||||
queue_multi_channel_manager_event,
|
||||
"AgentCalled");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_agent_connect_type(),
|
||||
queue_multi_channel_manager_event,
|
||||
"AgentConnect");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_agent_complete_type(),
|
||||
queue_multi_channel_manager_event,
|
||||
"AgentComplete");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_agent_dump_type(),
|
||||
queue_multi_channel_manager_event,
|
||||
"AgentDump");
|
||||
|
||||
stasis_message_router_add(manager_router,
|
||||
queue_agent_ringnoanswer_type(),
|
||||
queue_multi_channel_manager_event,
|
||||
"AgentRingNoAnswer");
|
||||
|
||||
stasis_message_router_add(agent_router,
|
||||
ast_channel_agent_login_type(),
|
||||
queue_agent_cb,
|
||||
NULL);
|
||||
|
||||
stasis_message_router_add(agent_router,
|
||||
ast_channel_agent_logoff_type(),
|
||||
queue_agent_cb,
|
||||
NULL);
|
||||
|
||||
ast_extension_state_add(NULL, NULL, extension_state_cb, NULL);
|
||||
|
||||
if (err) {
|
||||
unload_module();
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
return AST_MODULE_LOAD_SUCCESS;
|
||||
return res ? AST_MODULE_LOAD_DECLINE : 0;
|
||||
}
|
||||
|
||||
static int reload(void)
|
||||
|
@@ -257,15 +257,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
will be used.
|
||||
</para></description>
|
||||
</configOption>
|
||||
<configOption name="language" default="en">
|
||||
<synopsis>The language used for announcements to the conference.</synopsis>
|
||||
<description><para>
|
||||
By default, announcements to a conference use English. Which means
|
||||
the prompts played to all users within the conference will be
|
||||
English. By changing the language of a bridge, this will change
|
||||
the language of the prompts played to all users.
|
||||
</para></description>
|
||||
</configOption>
|
||||
<configOption name="mixing_interval">
|
||||
<synopsis>Sets the internal mixing interval in milliseconds for the bridge</synopsis>
|
||||
<description><para>
|
||||
@@ -1426,7 +1417,6 @@ static char *handle_cli_confbridge_show_bridge_profile(struct ast_cli_entry *e,
|
||||
|
||||
ast_cli(a->fd,"--------------------------------------------\n");
|
||||
ast_cli(a->fd,"Name: %s\n", b_profile.name);
|
||||
ast_cli(a->fd,"Language: %s\n", b_profile.language);
|
||||
|
||||
if (b_profile.internal_sample_rate) {
|
||||
snprintf(tmp, sizeof(tmp), "%d", b_profile.internal_sample_rate);
|
||||
@@ -1885,7 +1875,7 @@ static int verify_default_profiles(void)
|
||||
ao2_link(cfg->bridge_profiles, bridge_profile);
|
||||
}
|
||||
|
||||
user_profile = ao2_find(cfg->user_profiles, DEFAULT_USER_PROFILE, OBJ_KEY);
|
||||
user_profile = ao2_find(cfg->bridge_profiles, DEFAULT_USER_PROFILE, OBJ_KEY);
|
||||
if (!user_profile) {
|
||||
user_profile = user_profile_alloc(DEFAULT_USER_PROFILE);
|
||||
if (!user_profile) {
|
||||
@@ -1944,7 +1934,6 @@ int conf_load_config(void)
|
||||
aco_option_register(&cfg_info, "record_file_append", ACO_EXACT, bridge_types, "yes", OPT_BOOLFLAG_T, 1, FLDSET(struct bridge_profile, flags), BRIDGE_OPT_RECORD_FILE_APPEND);
|
||||
aco_option_register(&cfg_info, "max_members", ACO_EXACT, bridge_types, "0", OPT_UINT_T, 0, FLDSET(struct bridge_profile, max_members));
|
||||
aco_option_register(&cfg_info, "record_file", ACO_EXACT, bridge_types, NULL, OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, rec_file));
|
||||
aco_option_register(&cfg_info, "language", ACO_EXACT, bridge_types, "en", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct bridge_profile, language));
|
||||
aco_option_register_custom(&cfg_info, "^sound_", ACO_REGEX, bridge_types, NULL, sound_option_handler, 0);
|
||||
/* This option should only be used with the CONFBRIDGE dialplan function */
|
||||
aco_option_register_custom(&cfg_info, "template", ACO_EXACT, bridge_types, NULL, bridge_template_handler, 0);
|
||||
|
@@ -192,7 +192,6 @@ struct bridge_profile_sounds {
|
||||
|
||||
struct bridge_profile {
|
||||
char name[64];
|
||||
char language[MAX_LANGUAGE]; /*!< Language used for playback_chan */
|
||||
char rec_file[PATH_MAX];
|
||||
unsigned int flags;
|
||||
unsigned int max_members; /*!< The maximum number of participants allowed in the conference */
|
||||
|
@@ -1,10 +1,10 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-12.0.0-beta1</title></head>
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-12.0.0-alpha2</title></head>
|
||||
<body>
|
||||
<h1 align="center"><a name="top">Release Summary</a></h1>
|
||||
<h3 align="center">asterisk-12.0.0-beta1</h3>
|
||||
<h3 align="center">Date: 2013-10-08</h3>
|
||||
<h3 align="center">asterisk-12.0.0-alpha2</h3>
|
||||
<h3 align="center">Date: 2013-10-05</h3>
|
||||
<h3 align="center"><asteriskteam@digium.com></h3>
|
||||
<hr/>
|
||||
<h2 align="center">Table of Contents</h2>
|
||||
@@ -30,18 +30,18 @@
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
347 rmudgett<br/>
|
||||
204 mjordan<br/>
|
||||
343 rmudgett<br/>
|
||||
203 mjordan<br/>
|
||||
184 dlee<br/>
|
||||
154 kmoore<br/>
|
||||
131 mmichelson<br/>
|
||||
153 kmoore<br/>
|
||||
129 mmichelson<br/>
|
||||
89 jrose<br/>
|
||||
79 file<br/>
|
||||
47 qwell<br/>
|
||||
41 elguero<br/>
|
||||
41 jcolp<br/>
|
||||
40 elguero<br/>
|
||||
33 lathama<br/>
|
||||
32 wdoekes<br/>
|
||||
31 wdoekes<br/>
|
||||
29 kharwell<br/>
|
||||
28 alecdavis<br/>
|
||||
23 wedhorn<br/>
|
||||
@@ -116,7 +116,6 @@
|
||||
1 Jeremy Pepper<br/>
|
||||
1 jkister<br/>
|
||||
1 John Covert<br/>
|
||||
1 junky<br/>
|
||||
1 Kaloyan Kovachev<br/>
|
||||
1 kawasaki<br/>
|
||||
1 klaus3000<br/>
|
||||
@@ -148,7 +147,6 @@
|
||||
1 tblancher<br/>
|
||||
1 Thomas Omerzu<br/>
|
||||
1 Timo Teras<br/>
|
||||
1 Torrey Searle<br/>
|
||||
1 Tzafrir Cohen<br/>
|
||||
1 varnav<br/>
|
||||
1 vldmr<br/>
|
||||
@@ -157,8 +155,8 @@
|
||||
</td>
|
||||
<td>
|
||||
20 mjordan<br/>
|
||||
19 rmudgett<br/>
|
||||
18 elguero<br/>
|
||||
18 rmudgett<br/>
|
||||
14 alecdavis<br/>
|
||||
14 myself<br/>
|
||||
12 snuffy<br/>
|
||||
@@ -167,11 +165,11 @@
|
||||
6 sruffell<br/>
|
||||
5 Corey Farrell<br/>
|
||||
4 jrose<br/>
|
||||
4 wdoekes<br/>
|
||||
3 Byron Clark<br/>
|
||||
3 flan<br/>
|
||||
3 Jonathan White<br/>
|
||||
3 Rusty Newton<br/>
|
||||
3 wdoekes<br/>
|
||||
2 Deepak Lohani<br/>
|
||||
2 Jeremy Kister<br/>
|
||||
2 Jonas Falck<br/>
|
||||
@@ -200,7 +198,6 @@
|
||||
1 Christian Hesse<br/>
|
||||
1 Clint Davis<br/>
|
||||
1 Colin Cutherbertson<br/>
|
||||
1 Dalius M.<br/>
|
||||
1 Daniel Bohling<br/>
|
||||
1 danilo borges<br/>
|
||||
1 Danny Nicholas<br/>
|
||||
@@ -256,11 +253,11 @@
|
||||
</td>
|
||||
<td>
|
||||
161 mjordan<br/>
|
||||
34 jbigelow<br/>
|
||||
33 jbigelow<br/>
|
||||
32 rnewton<br/>
|
||||
25 coreyfarrell<br/>
|
||||
22 dlee<br/>
|
||||
17 rmudgett<br/>
|
||||
16 rmudgett<br/>
|
||||
12 snuffy<br/>
|
||||
9 alecdavis<br/>
|
||||
9 jrose<br/>
|
||||
@@ -300,7 +297,6 @@
|
||||
2 eelcob<br/>
|
||||
2 flan<br/>
|
||||
2 gentlec<br/>
|
||||
2 gtj<br/>
|
||||
2 ishmalik<br/>
|
||||
2 isrl<br/>
|
||||
2 jcolp<br/>
|
||||
@@ -311,14 +307,12 @@
|
||||
2 jplord<br/>
|
||||
2 junky<br/>
|
||||
2 kenner<br/>
|
||||
2 londonnet<br/>
|
||||
2 nikola.ciprich<br/>
|
||||
2 p_lindheimer<br/>
|
||||
2 patrol-cz<br/>
|
||||
2 pk16208<br/>
|
||||
2 tblancher<br/>
|
||||
2 tootai<br/>
|
||||
2 tsearle<br/>
|
||||
2 vldmr<br/>
|
||||
1 /dev/null<br/>
|
||||
1 adavid<br/>
|
||||
@@ -340,7 +334,6 @@
|
||||
1 blkline<br/>
|
||||
1 bootc<br/>
|
||||
1 brhunt<br/>
|
||||
1 brianscott<br/>
|
||||
1 brietz<br/>
|
||||
1 bulkorok<br/>
|
||||
1 byronclark<br/>
|
||||
@@ -387,6 +380,7 @@
|
||||
1 gknispel<br/>
|
||||
1 gporras<br/>
|
||||
1 greenlightcrm<br/>
|
||||
1 gtj<br/>
|
||||
1 herzer<br/>
|
||||
1 hexanol<br/>
|
||||
1 ianc<br/>
|
||||
@@ -413,10 +407,10 @@
|
||||
1 lexus350<br/>
|
||||
1 licedey<br/>
|
||||
1 lieshout<br/>
|
||||
1 londonnet<br/>
|
||||
1 maha<br/>
|
||||
1 marcelloceschia<br/>
|
||||
1 mcargile<br/>
|
||||
1 mdalius<br/>
|
||||
1 menschentier<br/>
|
||||
1 mike@farsouthnet.com<br/>
|
||||
1 mithraen<br/>
|
||||
@@ -429,7 +423,6 @@
|
||||
1 nivek<br/>
|
||||
1 ovi<br/>
|
||||
1 pabelanger<br/>
|
||||
1 patrickm<br/>
|
||||
1 pciccone<br/>
|
||||
1 PepeN<br/>
|
||||
1 pgoergler<br/>
|
||||
@@ -466,6 +459,7 @@
|
||||
1 tim_ringenbach<br/>
|
||||
1 tm1000<br/>
|
||||
1 tomo1657<br/>
|
||||
1 tsearle<br/>
|
||||
1 ulugutz<br/>
|
||||
1 usinternet<br/>
|
||||
1 varnav<br/>
|
||||
@@ -533,11 +527,6 @@ Reporter: jgowdy<br/>
|
||||
Testers: rmudgett<br/>
|
||||
Coders: Jeremiah Gowdy<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22669">ASTERISK-22669</a>: AMI/CLI Agent Logoff with soft logs out agent on subsequent logins<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400759">400759</a><br/>
|
||||
Reporter: jbigelow<br/>
|
||||
Coders: rmudgett<br/>
|
||||
<br/>
|
||||
<h3>Category: Applications/NewFeature</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20782">ASTERISK-20782</a>: Allow SayAlpha to announce "Uppercase <letter>" in a string.<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=397493">397493</a><br/>
|
||||
@@ -642,12 +631,6 @@ Reporter: flan<br/>
|
||||
Testers: flan, mjordan, jrose, Jonathan White<br/>
|
||||
Coders: twilson<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-19983">ASTERISK-19983</a>: ConfBridge does not expose a mechanism to change the language on the Bridging channel, defaulting to 'en'<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400744">400744</a><br/>
|
||||
Reporter: londonnet<br/>
|
||||
Testers: rmudgett<br/>
|
||||
Coders: junky<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20181">ASTERISK-20181</a>: Various confbridge features not available when set in user profile within confbridge.conf<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=374658">374658</a><br/>
|
||||
Reporter: londonnet<br/>
|
||||
@@ -988,12 +971,6 @@ Reporter: mjordan<br/>
|
||||
Testers: Tony Lewis<br/>
|
||||
Coders: mjordan<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22197">ASTERISK-22197</a>: [patch] Queuelog EXITWITHKEY only two of four parameters<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400625">400625</a><br/>
|
||||
Reporter: mdalius<br/>
|
||||
Testers: Dalius M.<br/>
|
||||
Coders: elguero<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22258">ASTERISK-22258</a>: Queue crashes when publishing message to Stasis after ringing busy Agent<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=396365">396365</a><br/>
|
||||
Reporter: djimbo<br/>
|
||||
@@ -1010,11 +987,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: rmudgett<br/>
|
||||
Coders: mjordan<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22604">ASTERISK-22604</a>: app_queue is dependent upon AMI subscribing to stasis.<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400672">400672</a><br/>
|
||||
Reporter: rmudgett<br/>
|
||||
Coders: rmudgett<br/>
|
||||
<br/>
|
||||
<h3>Category: Applications/app_senddtmf</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-18172">ASTERISK-18172</a>: SendDTMF with duration<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=373979">373979</a><br/>
|
||||
@@ -3364,12 +3336,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: snuffy<br/>
|
||||
Coders: snuffy<br/>
|
||||
<br/>
|
||||
<h3>Category: Functions/func_config</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22483">ASTERISK-22483</a>: AST_LIST_INSERT_TAIL doesn't set field.next on added entry<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400704">400704</a><br/>
|
||||
Reporter: brianscott<br/>
|
||||
Coders: kmoore<br/>
|
||||
<br/>
|
||||
<h3>Category: Functions/func_enum</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-20253">ASTERISK-20253</a>: HangupcauseClear XML Doc issue<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=371517">371517</a><br/>
|
||||
@@ -3453,11 +3419,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: jkroon<br/>
|
||||
Coders: jkroon<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22669">ASTERISK-22669</a>: AMI/CLI Agent Logoff with soft logs out agent on subsequent logins<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400759">400759</a><br/>
|
||||
Reporter: jbigelow<br/>
|
||||
Coders: rmudgett<br/>
|
||||
<br/>
|
||||
<h3>Category: PBX/pbx_dundi</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-19309">ASTERISK-19309</a>: [patch] DUNDi message routing bug<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=372420">372420</a><br/>
|
||||
@@ -3884,12 +3845,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: stefan.at.wpf<br/>
|
||||
Coders: kmoore<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22459">ASTERISK-22459</a>: Compiling res_odbc against iODBC instead of unixodbc produces runtime errors<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400770">400770</a><br/>
|
||||
Reporter: patrickm<br/>
|
||||
Testers: wdoekes<br/>
|
||||
Coders: wdoekes<br/>
|
||||
<br/>
|
||||
<h3>Category: Resources/res_parking</h3><br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21877">ASTERISK-21877</a>: Bridge API Enhancements - fix the Parking BUGBUG comments in trunk<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=393815">393815</a><br/>
|
||||
@@ -4078,11 +4033,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: coreyfarrell<br/>
|
||||
Coders: jcolp<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22498">ASTERISK-22498</a>: [patch]Create functions to manipulate SIP headers when using PJSIP stack<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400772">400772</a><br/>
|
||||
Reporter: gtj<br/>
|
||||
Coders: mjordan<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22528">ASTERISK-22528</a>: Change name of endpoint config option "external_media_address" to "media_address"<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=399284">399284</a><br/>
|
||||
Reporter: rnewton<br/>
|
||||
@@ -4206,11 +4156,6 @@ Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revis
|
||||
Reporter: coreyfarrell<br/>
|
||||
Coders: Corey Farrell<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-21917">ASTERISK-21917</a>: [patch] STUN crashes when SIP is bound to ipv4 and ipv6<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400684">400684</a><br/>
|
||||
Reporter: tsearle<br/>
|
||||
Coders: Torrey Searle<br/>
|
||||
<br/>
|
||||
<a href="https://issues.asterisk.org/jira/browse/ASTERISK-22360">ASTERISK-22360</a>: Logging output from pjproject not sent through Asterisk logger<br/>
|
||||
Revision: <a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=399051">399051</a><br/>
|
||||
Reporter: jcolp<br/>
|
||||
@@ -5469,16 +5414,12 @@ Coders: Jakob Hirsch<br/>
|
||||
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-22451">ASTERISK-22451</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400543">400543</a></td><td>jrose</td><td>chan_pjsip: Make logger togglable without loading/unloading</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400553">400553</a></td><td>dlee</td><td>Added missing file from r400522</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400593">400593</a></td><td>rmudgett</td><td>chan_iax2: Fix compile error.</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400662">400662</a></td><td>rmudgett</td><td>Miscellaneous stand alone comment cleanups.</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400683">400683</a></td><td>mmichelson</td><td>Push CLI qualify into the threadpool.</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400728">400728</a></td><td>rmudgett</td><td>app_confbridge: Fix duplicate default_user profile.</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/trunk?view=revision&revision=400750">400750</a></td><td>mmichelson</td><td>Switch from using pjsip_strerror to pj_strerror.</td>
|
||||
<td></td></tr></table>
|
||||
<hr/>
|
||||
<a name="diffstat"><h2 align="center">Diffstat Results</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p>
|
||||
<pre>
|
||||
CHANGES | 1158 +
|
||||
CHANGES | 1154 +
|
||||
CREDITS | 396
|
||||
Makefile | 173
|
||||
Makefile.moddir_rules | 2
|
||||
@@ -5500,7 +5441,7 @@ addons/res_config_mysql.c | 17
|
||||
agi/Makefile | 2
|
||||
apps/Makefile | 3
|
||||
apps/app_adsiprog.c | 19
|
||||
apps/app_agent_pool.c | 2582 +++
|
||||
apps/app_agent_pool.c | 2581 +++
|
||||
apps/app_alarmreceiver.c | 1008 -
|
||||
apps/app_amd.c | 21
|
||||
apps/app_authenticate.c | 8
|
||||
@@ -5509,7 +5450,7 @@ apps/app_cdr.c | 10
|
||||
apps/app_celgenuserevent.c | 18
|
||||
apps/app_channelredirect.c | 4
|
||||
apps/app_chanspy.c | 126
|
||||
apps/app_confbridge.c | 2524 +-
|
||||
apps/app_confbridge.c | 2521 +-
|
||||
apps/app_controlplayback.c | 127
|
||||
apps/app_db.c | 8
|
||||
apps/app_dial.c | 371
|
||||
@@ -5531,7 +5472,7 @@ apps/app_osplookup.c | 11
|
||||
apps/app_page.c | 105
|
||||
apps/app_parkandannounce.c | 247
|
||||
apps/app_playback.c | 23
|
||||
apps/app_queue.c | 3554 ++--
|
||||
apps/app_queue.c | 3442 ++--
|
||||
apps/app_record.c | 27
|
||||
apps/app_senddtmf.c | 76
|
||||
apps/app_skel.c | 69
|
||||
@@ -5544,7 +5485,7 @@ apps/app_voicemail.c | 54
|
||||
apps/app_waitforring.c | 25
|
||||
apps/confbridge/conf_chan_announce.c | 209
|
||||
apps/confbridge/conf_chan_record.c | 95
|
||||
apps/confbridge/conf_config_parser.c | 825
|
||||
apps/confbridge/conf_config_parser.c | 814
|
||||
apps/confbridge/conf_state.c | 94
|
||||
apps/confbridge/conf_state_empty.c | 86
|
||||
apps/confbridge/conf_state_inactive.c | 80
|
||||
@@ -5554,7 +5495,7 @@ apps/confbridge/conf_state_single.c | 8
|
||||
apps/confbridge/conf_state_single_marked.c | 79
|
||||
apps/confbridge/confbridge_manager.c | 480
|
||||
apps/confbridge/include/conf_state.h | 95
|
||||
apps/confbridge/include/confbridge.h | 303
|
||||
apps/confbridge/include/confbridge.h | 302
|
||||
autoconf/ast_check_pwlib.m4 | 2
|
||||
autoconf/ast_ext_lib.m4 | 4
|
||||
bridges/Makefile | 2
|
||||
@@ -5669,7 +5610,7 @@ configs/ari.conf.sample | 2
|
||||
configs/cel.conf.sample | 20
|
||||
configs/chan_dahdi.conf.sample | 47
|
||||
configs/cli_aliases.conf.sample | 2
|
||||
configs/confbridge.conf.sample | 9
|
||||
configs/confbridge.conf.sample | 6
|
||||
configs/dsp.conf.sample | 36
|
||||
configs/extconfig.conf.sample | 12
|
||||
configs/extensions.conf.sample | 10
|
||||
@@ -5694,7 +5635,7 @@ configs/statsd.conf.sample |
|
||||
configs/test_sorcery.conf.sample | 14
|
||||
configs/voicemail.conf.sample | 4
|
||||
configs/xmpp.conf.sample | 3
|
||||
configure.ac | 187
|
||||
configure.ac | 178
|
||||
contrib/ast-db-manage/README.md | 63
|
||||
contrib/ast-db-manage/config.ini.sample | 48
|
||||
contrib/ast-db-manage/config/env.py | 71
|
||||
@@ -5746,7 +5687,6 @@ funcs/func_audiohookinherit.c |
|
||||
funcs/func_callerid.c | 51
|
||||
funcs/func_cdr.c | 348
|
||||
funcs/func_channel.c | 164
|
||||
funcs/func_config.c | 4
|
||||
funcs/func_curl.c | 32
|
||||
funcs/func_devstate.c | 6
|
||||
funcs/func_dialgroup.c | 8
|
||||
@@ -5834,7 +5774,7 @@ include/asterisk/linkedlists.h | 5
|
||||
include/asterisk/localtime.h | 7
|
||||
include/asterisk/lock.h | 129
|
||||
include/asterisk/logger.h | 82
|
||||
include/asterisk/manager.h | 230
|
||||
include/asterisk/manager.h | 232
|
||||
include/asterisk/md5.h | 3
|
||||
include/asterisk/media_index.h | 108
|
||||
include/asterisk/message.h | 2
|
||||
@@ -6060,7 +6000,7 @@ res/parking/parking_manager.c | 58
|
||||
res/parking/parking_tests.c | 828
|
||||
res/parking/parking_ui.c | 208
|
||||
res/parking/res_parking.h | 558
|
||||
res/res_agi.c | 617
|
||||
res/res_agi.c | 595
|
||||
res/res_ari.c | 1055 +
|
||||
res/res_ari.exports.in | 6
|
||||
res/res_ari_applications.c | 425
|
||||
@@ -6116,7 +6056,7 @@ res/res_pjsip/location.c | 32
|
||||
res/res_pjsip/pjsip_configuration.c | 890 +
|
||||
res/res_pjsip/pjsip_distributor.c | 374
|
||||
res/res_pjsip/pjsip_global_headers.c | 171
|
||||
res/res_pjsip/pjsip_options.c | 890 +
|
||||
res/res_pjsip/pjsip_options.c | 848
|
||||
res/res_pjsip/pjsip_outbound_auth.c | 94
|
||||
res/res_pjsip/security_events.c | 290
|
||||
res/res_pjsip_acl.c | 302
|
||||
@@ -6129,7 +6069,6 @@ res/res_pjsip_endpoint_identifier_ip.c | 20
|
||||
res/res_pjsip_endpoint_identifier_user.c | 129
|
||||
res/res_pjsip_exten_state.c | 625
|
||||
res/res_pjsip_exten_state.exports.in | 7
|
||||
res/res_pjsip_header_funcs.c | 609
|
||||
res/res_pjsip_log_forwarder.c | 124
|
||||
res/res_pjsip_logger.c | 214
|
||||
res/res_pjsip_messaging.c | 704
|
||||
@@ -6152,7 +6091,7 @@ res/res_pjsip_session.exports.in | 2
|
||||
res/res_pjsip_t38.c | 859 +
|
||||
res/res_pjsip_transport_websocket.c | 402
|
||||
res/res_pktccops.c | 2
|
||||
res/res_rtp_asterisk.c | 1734 +-
|
||||
res/res_rtp_asterisk.c | 1726 +-
|
||||
res/res_rtp_multicast.c | 47
|
||||
res/res_security_log.c | 100
|
||||
res/res_smdi.c | 23
|
||||
@@ -6274,7 +6213,7 @@ utils/hashtest2.c | 41
|
||||
utils/muted.c | 9
|
||||
utils/refcounter.c | 44
|
||||
utils/utils.xml | 9
|
||||
796 files changed, 197267 insertions(+), 53991 deletions(-)
|
||||
794 files changed, 196515 insertions(+), 53916 deletions(-)
|
||||
</pre><br/>
|
||||
<hr/>
|
||||
</body>
|
@@ -1,8 +1,8 @@
|
||||
Release Summary
|
||||
|
||||
asterisk-12.0.0-beta1
|
||||
asterisk-12.0.0-alpha2
|
||||
|
||||
Date: 2013-10-08
|
||||
Date: 2013-10-05
|
||||
|
||||
<asteriskteam@digium.com>
|
||||
|
||||
@@ -47,22 +47,22 @@
|
||||
release.
|
||||
|
||||
Coders Testers Reporters
|
||||
347 rmudgett 20 mjordan 161 mjordan
|
||||
204 mjordan 19 rmudgett 34 jbigelow
|
||||
184 dlee 18 elguero 32 rnewton
|
||||
154 kmoore 14 alecdavis 25 coreyfarrell
|
||||
131 mmichelson 14 myself 22 dlee
|
||||
89 jrose 12 snuffy 17 rmudgett
|
||||
343 rmudgett 20 mjordan 161 mjordan
|
||||
203 mjordan 18 elguero 33 jbigelow
|
||||
184 dlee 18 rmudgett 32 rnewton
|
||||
153 kmoore 14 alecdavis 25 coreyfarrell
|
||||
129 mmichelson 14 myself 22 dlee
|
||||
89 jrose 12 snuffy 16 rmudgett
|
||||
79 file 7 Tony Lewis 12 snuffy
|
||||
47 qwell 6 jbigelow 9 alecdavis
|
||||
41 elguero 6 sruffell 9 jrose
|
||||
41 jcolp 5 Corey Farrell 9 tomaso
|
||||
41 jcolp 6 sruffell 9 jrose
|
||||
40 elguero 5 Corey Farrell 9 tomaso
|
||||
33 lathama 4 jrose 9 wdoekes
|
||||
32 wdoekes 4 wdoekes 8 mdavenport
|
||||
29 kharwell 3 Byron Clark 7 gkelleter
|
||||
28 alecdavis 3 flan 7 mmichelson
|
||||
23 wedhorn 3 Jonathan White 7 wedhorn
|
||||
21 seanbright 3 Rusty Newton 6 jkister
|
||||
31 wdoekes 3 Byron Clark 8 mdavenport
|
||||
29 kharwell 3 flan 7 gkelleter
|
||||
28 alecdavis 3 Jonathan White 7 mmichelson
|
||||
23 wedhorn 3 Rusty Newton 7 wedhorn
|
||||
21 seanbright 3 wdoekes 6 jkister
|
||||
19 Corey Farrell 2 Deepak Lohani 6 spitts
|
||||
18 newtonr 2 Jeremy Kister 5 kmoore
|
||||
15 russell 2 Jonas Falck 5 sruffell
|
||||
@@ -92,93 +92,90 @@
|
||||
2 JoshE 1 Bryan Hunt 2 eelcob
|
||||
2 Pavel Troller 1 call 2 flan
|
||||
2 pkiefer 1 Chris Warr 2 gentlec
|
||||
2 roeften 1 Christian 2 gtj
|
||||
1 abelbeck Hesse 2 ishmalik
|
||||
1 Andre Luis 1 Clint Davis 2 isrl
|
||||
1 Andrew Nagy 1 Colin 2 jcolp
|
||||
1 anstein Cutherbertson 2 jhutchins
|
||||
1 Antti Yrjola 1 Dalius M. 2 jmillan
|
||||
1 artem 1 Daniel Bohling 2 jparker
|
||||
1 avalentin 1 danilo borges 2 jpepper
|
||||
1 bootc 1 Danny Nicholas 2 jplord
|
||||
1 byronclark 1 daroz 2 junky
|
||||
1 Christian Hesse 1 David M. Lee 2 kenner
|
||||
1 Clint Davis 1 David van Geyn 2 londonnet
|
||||
1 Clod Patry 1 Dennis 2 nikola.ciprich
|
||||
1 coriley DeDonatis 2 p_lindheimer
|
||||
1 Correy Farrell 1 Dmitry Burilov 2 patrol-cz
|
||||
1 Dan Cropp 1 Dmitry 2 pk16208
|
||||
1 Daniel O'Connor Melekhov 2 tblancher
|
||||
1 David Chappell 1 Doug Bailey 2 tootai
|
||||
1 Demon 1 dsessions 2 tsearle
|
||||
1 dennis.guse 1 eliafino 2 vldmr
|
||||
1 Dmitriy Serov 1 Eric Hill 1 /dev/null
|
||||
1 Dmitry Melekhov 1 Etienne 1 adavid
|
||||
1 dorianlogan Lessard 1 ahoemig
|
||||
1 dsessions 1 Ishfaq Malik 1 amegyeri
|
||||
1 Eelco Brolman 1 IA+-aki Baz 1 amsoft2001
|
||||
1 eelcob Castillo 1 andrel
|
||||
1 Egor Gorlin 1 Jaco Kroon 1 anstein
|
||||
1 Eric Hill 1 James 1 ariw
|
||||
1 Etienne Lessard Mortensen 1 artem
|
||||
1 feyfre 1 Jamuel Starkey 1 ascanland
|
||||
1 Gareth Palmer 1 Jared Smith 1 avalentin
|
||||
1 gknispel 1 Jason Parker 1 ayrjola
|
||||
1 Heiko Wundram 1 Jean-Philippe 1 az_tth
|
||||
1 ianc Lord 1 bensmithurst
|
||||
1 Italo Rossi 1 Jeremy Pepper 1 berlic
|
||||
1 Jaco Kroon 1 Joel Vandal 1 bklang
|
||||
1 Jakob Hirsch 1 kaldemar 1 blackaura
|
||||
1 James Le Cuirot 1 Karsten 1 blkline
|
||||
1 Jeremy Pepper Wemheuer 1 bootc
|
||||
1 jkister 1 Kinsey Moore 1 brhunt
|
||||
1 John Covert 1 Kiril Valchev 1 brianscott
|
||||
1 junky 1 klaus3000 1 brietz
|
||||
1 Kaloyan Kovachev 1 Leif Madsen 1 bulkorok
|
||||
1 kawasaki 1 Martin W 1 byronclark
|
||||
1 klaus3000 1 Michael Keuter 1 call
|
||||
1 kmoore, wdoekes 1 mmichelson 1 challado
|
||||
1 Konstantin 1 Nikola Ciprich 1 chappell
|
||||
Suvorov 1 Nikolay 1 chengzhicn
|
||||
1 lminiero Ilduganov 1 chesse
|
||||
1 marcelloceschia 1 Noah 1 chewi
|
||||
1 Martin W Engelberth 1 chip
|
||||
1 Michael Walton 1 oej 1 clint.davis
|
||||
1 moy 1 Pavel Kopchyk 1 colinc
|
||||
1 murraytm 1 Pavel Troller 1 coopvr
|
||||
1 nbansal 1 Pedro Kiefer 1 coriley
|
||||
1 Nikolay Ilduganov 1 Peter Katzmann 1 daninmadison
|
||||
1 Nitesh Bansal 1 Pietro Bertera 1 danjenkins
|
||||
1 NITESH BANSAL 1 Rodrigo P. 1 daren
|
||||
1 one47 Telles 1 dario
|
||||
1 pbertera 1 Stephan 1 darius
|
||||
1 Pedro Kiefer 1 Steve Lang 1 daroz
|
||||
1 Peter Racz 1 Steven T. 1 dbailey
|
||||
1 Philippe Wheeler 1 deniz
|
||||
Lindheimer 1 Stuart 1 dennis.guse
|
||||
1 phill Henderson 1 dennisd
|
||||
1 Renato dos Santos 1 Sven Beisiegel 1 derlinuxer
|
||||
1 Rusty Newton 1 sysreq 1 deti
|
||||
1 serginuez 1 tbsky 1 din3sh
|
||||
1 Shaun Ruffel 1 Tzafrir Cohen 1 djimbo
|
||||
1 Simone Camporeale 1 William luke 1 dlmarten
|
||||
1 Stefan Reuter 1 docent
|
||||
1 Stefan Wachtler 1 dorianlogan
|
||||
1 tblancher 1 eabad
|
||||
1 Thomas Omerzu 1 eleo
|
||||
1 Timo Teras 1 erichill
|
||||
1 Torrey Searle 1 fabled
|
||||
1 Tzafrir Cohen 1 falves11
|
||||
1 varnav 1 feyfre
|
||||
1 vldmr 1 fhackenberger
|
||||
1 wimpy 1 floradio
|
||||
1 Zhi Cheng 1 frap
|
||||
1 gareth
|
||||
1 giacomo
|
||||
2 roeften 1 Christian 2 ishmalik
|
||||
1 abelbeck Hesse 2 isrl
|
||||
1 Andre Luis 1 Clint Davis 2 jcolp
|
||||
1 Andrew Nagy 1 Colin 2 jhutchins
|
||||
1 anstein Cutherbertson 2 jmillan
|
||||
1 Antti Yrjola 1 Daniel Bohling 2 jparker
|
||||
1 artem 1 danilo borges 2 jpepper
|
||||
1 avalentin 1 Danny Nicholas 2 jplord
|
||||
1 bootc 1 daroz 2 junky
|
||||
1 byronclark 1 David M. Lee 2 kenner
|
||||
1 Christian Hesse 1 David van Geyn 2 nikola.ciprich
|
||||
1 Clint Davis 1 Dennis 2 p_lindheimer
|
||||
1 Clod Patry DeDonatis 2 patrol-cz
|
||||
1 coriley 1 Dmitry Burilov 2 pk16208
|
||||
1 Correy Farrell 1 Dmitry 2 tblancher
|
||||
1 Dan Cropp Melekhov 2 tootai
|
||||
1 Daniel O'Connor 1 Doug Bailey 2 vldmr
|
||||
1 David Chappell 1 dsessions 1 /dev/null
|
||||
1 Demon 1 eliafino 1 adavid
|
||||
1 dennis.guse 1 Eric Hill 1 ahoemig
|
||||
1 Dmitriy Serov 1 Etienne 1 amegyeri
|
||||
1 Dmitry Melekhov Lessard 1 amsoft2001
|
||||
1 dorianlogan 1 Ishfaq Malik 1 andrel
|
||||
1 dsessions 1 IA+-aki Baz 1 anstein
|
||||
1 Eelco Brolman Castillo 1 ariw
|
||||
1 eelcob 1 Jaco Kroon 1 artem
|
||||
1 Egor Gorlin 1 James 1 ascanland
|
||||
1 Eric Hill Mortensen 1 avalentin
|
||||
1 Etienne Lessard 1 Jamuel Starkey 1 ayrjola
|
||||
1 feyfre 1 Jared Smith 1 az_tth
|
||||
1 Gareth Palmer 1 Jason Parker 1 bensmithurst
|
||||
1 gknispel 1 Jean-Philippe 1 berlic
|
||||
1 Heiko Wundram Lord 1 bklang
|
||||
1 ianc 1 Jeremy Pepper 1 blackaura
|
||||
1 Italo Rossi 1 Joel Vandal 1 blkline
|
||||
1 Jaco Kroon 1 kaldemar 1 bootc
|
||||
1 Jakob Hirsch 1 Karsten 1 brhunt
|
||||
1 James Le Cuirot Wemheuer 1 brietz
|
||||
1 Jeremy Pepper 1 Kinsey Moore 1 bulkorok
|
||||
1 jkister 1 Kiril Valchev 1 byronclark
|
||||
1 John Covert 1 klaus3000 1 call
|
||||
1 Kaloyan Kovachev 1 Leif Madsen 1 challado
|
||||
1 kawasaki 1 Martin W 1 chappell
|
||||
1 klaus3000 1 Michael Keuter 1 chengzhicn
|
||||
1 kmoore, wdoekes 1 mmichelson 1 chesse
|
||||
1 Konstantin 1 Nikola Ciprich 1 chewi
|
||||
Suvorov 1 Nikolay 1 chip
|
||||
1 lminiero Ilduganov 1 clint.davis
|
||||
1 marcelloceschia 1 Noah 1 colinc
|
||||
1 Martin W Engelberth 1 coopvr
|
||||
1 Michael Walton 1 oej 1 coriley
|
||||
1 moy 1 Pavel Kopchyk 1 daninmadison
|
||||
1 murraytm 1 Pavel Troller 1 danjenkins
|
||||
1 nbansal 1 Pedro Kiefer 1 daren
|
||||
1 Nikolay Ilduganov 1 Peter Katzmann 1 dario
|
||||
1 Nitesh Bansal 1 Pietro Bertera 1 darius
|
||||
1 NITESH BANSAL 1 Rodrigo P. 1 daroz
|
||||
1 one47 Telles 1 dbailey
|
||||
1 pbertera 1 Stephan 1 deniz
|
||||
1 Pedro Kiefer 1 Steve Lang 1 dennis.guse
|
||||
1 Peter Racz 1 Steven T. 1 dennisd
|
||||
1 Philippe Wheeler 1 derlinuxer
|
||||
Lindheimer 1 Stuart 1 deti
|
||||
1 phill Henderson 1 din3sh
|
||||
1 Renato dos Santos 1 Sven Beisiegel 1 djimbo
|
||||
1 Rusty Newton 1 sysreq 1 dlmarten
|
||||
1 serginuez 1 tbsky 1 docent
|
||||
1 Shaun Ruffel 1 Tzafrir Cohen 1 dorianlogan
|
||||
1 Simone Camporeale 1 William luke 1 eabad
|
||||
1 Stefan Reuter 1 eleo
|
||||
1 Stefan Wachtler 1 erichill
|
||||
1 tblancher 1 fabled
|
||||
1 Thomas Omerzu 1 falves11
|
||||
1 Timo Teras 1 feyfre
|
||||
1 Tzafrir Cohen 1 fhackenberger
|
||||
1 varnav 1 floradio
|
||||
1 vldmr 1 frap
|
||||
1 wimpy 1 gareth
|
||||
1 Zhi Cheng 1 giacomo
|
||||
1 gian
|
||||
1 gknispel
|
||||
1 gporras
|
||||
1 greenlightcrm
|
||||
1 gtj
|
||||
1 herzer
|
||||
1 hexanol
|
||||
1 ianc
|
||||
@@ -205,10 +202,10 @@
|
||||
1 lexus350
|
||||
1 licedey
|
||||
1 lieshout
|
||||
1 londonnet
|
||||
1 maha
|
||||
1 marcelloceschia
|
||||
1 mcargile
|
||||
1 mdalius
|
||||
1 menschentier
|
||||
1 mike@farsouthnet.com
|
||||
1 mithraen
|
||||
@@ -221,7 +218,6 @@
|
||||
1 nivek
|
||||
1 ovi
|
||||
1 pabelanger
|
||||
1 patrickm
|
||||
1 pciccone
|
||||
1 PepeN
|
||||
1 pgoergler
|
||||
@@ -259,6 +255,7 @@
|
||||
1 tim_ringenbach
|
||||
1 tm1000
|
||||
1 tomo1657
|
||||
1 tsearle
|
||||
1 ulugutz
|
||||
1 usinternet
|
||||
1 varnav
|
||||
@@ -338,12 +335,6 @@
|
||||
Testers: rmudgett
|
||||
Coders: Jeremiah Gowdy
|
||||
|
||||
ASTERISK-22669: AMI/CLI Agent Logoff with soft logs out agent on
|
||||
subsequent logins
|
||||
Revision: 400759
|
||||
Reporter: jbigelow
|
||||
Coders: rmudgett
|
||||
|
||||
Category: Applications/NewFeature
|
||||
|
||||
ASTERISK-20782: Allow SayAlpha to announce "Uppercase " in a string.
|
||||
@@ -466,13 +457,6 @@
|
||||
Testers: flan, mjordan, jrose, Jonathan White
|
||||
Coders: twilson
|
||||
|
||||
ASTERISK-19983: ConfBridge does not expose a mechanism to change the
|
||||
language on the Bridging channel, defaulting to 'en'
|
||||
Revision: 400744
|
||||
Reporter: londonnet
|
||||
Testers: rmudgett
|
||||
Coders: junky
|
||||
|
||||
ASTERISK-20181: Various confbridge features not available when set in user
|
||||
profile within confbridge.conf
|
||||
Revision: 374658
|
||||
@@ -859,12 +843,6 @@
|
||||
Testers: Tony Lewis
|
||||
Coders: mjordan
|
||||
|
||||
ASTERISK-22197: [patch] Queuelog EXITWITHKEY only two of four parameters
|
||||
Revision: 400625
|
||||
Reporter: mdalius
|
||||
Testers: Dalius M.
|
||||
Coders: elguero
|
||||
|
||||
ASTERISK-22258: Queue crashes when publishing message to Stasis after
|
||||
ringing busy Agent
|
||||
Revision: 396365
|
||||
@@ -882,11 +860,6 @@
|
||||
Reporter: rmudgett
|
||||
Coders: mjordan
|
||||
|
||||
ASTERISK-22604: app_queue is dependent upon AMI subscribing to stasis.
|
||||
Revision: 400672
|
||||
Reporter: rmudgett
|
||||
Coders: rmudgett
|
||||
|
||||
Category: Applications/app_senddtmf
|
||||
|
||||
ASTERISK-18172: SendDTMF with duration
|
||||
@@ -3545,13 +3518,6 @@
|
||||
Reporter: snuffy
|
||||
Coders: snuffy
|
||||
|
||||
Category: Functions/func_config
|
||||
|
||||
ASTERISK-22483: AST_LIST_INSERT_TAIL doesn't set field.next on added entry
|
||||
Revision: 400704
|
||||
Reporter: brianscott
|
||||
Coders: kmoore
|
||||
|
||||
Category: Functions/func_enum
|
||||
|
||||
ASTERISK-20253: HangupcauseClear XML Doc issue
|
||||
@@ -3650,12 +3616,6 @@
|
||||
Reporter: jkroon
|
||||
Coders: jkroon
|
||||
|
||||
ASTERISK-22669: AMI/CLI Agent Logoff with soft logs out agent on
|
||||
subsequent logins
|
||||
Revision: 400759
|
||||
Reporter: jbigelow
|
||||
Coders: rmudgett
|
||||
|
||||
Category: PBX/pbx_dundi
|
||||
|
||||
ASTERISK-19309: [patch] DUNDi message routing bug
|
||||
@@ -4140,13 +4100,6 @@
|
||||
Reporter: stefan.at.wpf
|
||||
Coders: kmoore
|
||||
|
||||
ASTERISK-22459: Compiling res_odbc against iODBC instead of unixodbc
|
||||
produces runtime errors
|
||||
Revision: 400770
|
||||
Reporter: patrickm
|
||||
Testers: wdoekes
|
||||
Coders: wdoekes
|
||||
|
||||
Category: Resources/res_parking
|
||||
|
||||
ASTERISK-21877: Bridge API Enhancements - fix the Parking BUGBUG comments
|
||||
@@ -4373,12 +4326,6 @@
|
||||
Reporter: coreyfarrell
|
||||
Coders: jcolp
|
||||
|
||||
ASTERISK-22498: [patch]Create functions to manipulate SIP headers when
|
||||
using PJSIP stack
|
||||
Revision: 400772
|
||||
Reporter: gtj
|
||||
Coders: mjordan
|
||||
|
||||
ASTERISK-22528: Change name of endpoint config option
|
||||
"external_media_address" to "media_address"
|
||||
Revision: 399284
|
||||
@@ -4527,11 +4474,6 @@
|
||||
Reporter: coreyfarrell
|
||||
Coders: Corey Farrell
|
||||
|
||||
ASTERISK-21917: [patch] STUN crashes when SIP is bound to ipv4 and ipv6
|
||||
Revision: 400684
|
||||
Reporter: tsearle
|
||||
Coders: Torrey Searle
|
||||
|
||||
ASTERISK-22360: Logging output from pjproject not sent through Asterisk
|
||||
logger
|
||||
Revision: 399051
|
||||
@@ -7647,17 +7589,6 @@
|
||||
|400553 |dlee |Added missing file from r400522 | |
|
||||
|--------+----------+-----------------------------------------+---------------|
|
||||
|400593 |rmudgett |chan_iax2: Fix compile error. | |
|
||||
|--------+----------+-----------------------------------------+---------------|
|
||||
|400662 |rmudgett |Miscellaneous stand alone comment | |
|
||||
| | |cleanups. | |
|
||||
|--------+----------+-----------------------------------------+---------------|
|
||||
|400683 |mmichelson|Push CLI qualify into the threadpool. | |
|
||||
|--------+----------+-----------------------------------------+---------------|
|
||||
|400728 |rmudgett |app_confbridge: Fix duplicate | |
|
||||
| | |default_user profile. | |
|
||||
|--------+----------+-----------------------------------------+---------------|
|
||||
|400750 |mmichelson|Switch from using pjsip_strerror to | |
|
||||
| | |pj_strerror. | |
|
||||
+-----------------------------------------------------------------------------+
|
||||
|
||||
----------------------------------------------------------------------
|
||||
@@ -7669,7 +7600,7 @@
|
||||
This is a summary of the changes to the source code that went into this
|
||||
release that was generated using the diffstat utility.
|
||||
|
||||
CHANGES | 1158 +
|
||||
CHANGES | 1154 +
|
||||
CREDITS | 396
|
||||
Makefile | 173
|
||||
Makefile.moddir_rules | 2
|
||||
@@ -7691,7 +7622,7 @@
|
||||
agi/Makefile | 2
|
||||
apps/Makefile | 3
|
||||
apps/app_adsiprog.c | 19
|
||||
apps/app_agent_pool.c | 2582 +++
|
||||
apps/app_agent_pool.c | 2581 +++
|
||||
apps/app_alarmreceiver.c | 1008 -
|
||||
apps/app_amd.c | 21
|
||||
apps/app_authenticate.c | 8
|
||||
@@ -7700,7 +7631,7 @@
|
||||
apps/app_celgenuserevent.c | 18
|
||||
apps/app_channelredirect.c | 4
|
||||
apps/app_chanspy.c | 126
|
||||
apps/app_confbridge.c | 2524 +-
|
||||
apps/app_confbridge.c | 2521 +-
|
||||
apps/app_controlplayback.c | 127
|
||||
apps/app_db.c | 8
|
||||
apps/app_dial.c | 371
|
||||
@@ -7722,7 +7653,7 @@
|
||||
apps/app_page.c | 105
|
||||
apps/app_parkandannounce.c | 247
|
||||
apps/app_playback.c | 23
|
||||
apps/app_queue.c | 3554 ++--
|
||||
apps/app_queue.c | 3442 ++--
|
||||
apps/app_record.c | 27
|
||||
apps/app_senddtmf.c | 76
|
||||
apps/app_skel.c | 69
|
||||
@@ -7735,7 +7666,7 @@
|
||||
apps/app_waitforring.c | 25
|
||||
apps/confbridge/conf_chan_announce.c | 209
|
||||
apps/confbridge/conf_chan_record.c | 95
|
||||
apps/confbridge/conf_config_parser.c | 825
|
||||
apps/confbridge/conf_config_parser.c | 814
|
||||
apps/confbridge/conf_state.c | 94
|
||||
apps/confbridge/conf_state_empty.c | 86
|
||||
apps/confbridge/conf_state_inactive.c | 80
|
||||
@@ -7745,7 +7676,7 @@
|
||||
apps/confbridge/conf_state_single_marked.c | 79
|
||||
apps/confbridge/confbridge_manager.c | 480
|
||||
apps/confbridge/include/conf_state.h | 95
|
||||
apps/confbridge/include/confbridge.h | 303
|
||||
apps/confbridge/include/confbridge.h | 302
|
||||
autoconf/ast_check_pwlib.m4 | 2
|
||||
autoconf/ast_ext_lib.m4 | 4
|
||||
bridges/Makefile | 2
|
||||
@@ -7860,7 +7791,7 @@
|
||||
configs/cel.conf.sample | 20
|
||||
configs/chan_dahdi.conf.sample | 47
|
||||
configs/cli_aliases.conf.sample | 2
|
||||
configs/confbridge.conf.sample | 9
|
||||
configs/confbridge.conf.sample | 6
|
||||
configs/dsp.conf.sample | 36
|
||||
configs/extconfig.conf.sample | 12
|
||||
configs/extensions.conf.sample | 10
|
||||
@@ -7885,7 +7816,7 @@
|
||||
configs/test_sorcery.conf.sample | 14
|
||||
configs/voicemail.conf.sample | 4
|
||||
configs/xmpp.conf.sample | 3
|
||||
configure.ac | 187
|
||||
configure.ac | 178
|
||||
contrib/ast-db-manage/README.md | 63
|
||||
contrib/ast-db-manage/config.ini.sample | 48
|
||||
contrib/ast-db-manage/config/env.py | 71
|
||||
@@ -7937,7 +7868,6 @@
|
||||
funcs/func_callerid.c | 51
|
||||
funcs/func_cdr.c | 348
|
||||
funcs/func_channel.c | 164
|
||||
funcs/func_config.c | 4
|
||||
funcs/func_curl.c | 32
|
||||
funcs/func_devstate.c | 6
|
||||
funcs/func_dialgroup.c | 8
|
||||
@@ -8025,7 +7955,7 @@
|
||||
include/asterisk/localtime.h | 7
|
||||
include/asterisk/lock.h | 129
|
||||
include/asterisk/logger.h | 82
|
||||
include/asterisk/manager.h | 230
|
||||
include/asterisk/manager.h | 232
|
||||
include/asterisk/md5.h | 3
|
||||
include/asterisk/media_index.h | 108
|
||||
include/asterisk/message.h | 2
|
||||
@@ -8251,7 +8181,7 @@
|
||||
res/parking/parking_tests.c | 828
|
||||
res/parking/parking_ui.c | 208
|
||||
res/parking/res_parking.h | 558
|
||||
res/res_agi.c | 617
|
||||
res/res_agi.c | 595
|
||||
res/res_ari.c | 1055 +
|
||||
res/res_ari.exports.in | 6
|
||||
res/res_ari_applications.c | 425
|
||||
@@ -8307,7 +8237,7 @@
|
||||
res/res_pjsip/pjsip_configuration.c | 890 +
|
||||
res/res_pjsip/pjsip_distributor.c | 374
|
||||
res/res_pjsip/pjsip_global_headers.c | 171
|
||||
res/res_pjsip/pjsip_options.c | 890 +
|
||||
res/res_pjsip/pjsip_options.c | 848
|
||||
res/res_pjsip/pjsip_outbound_auth.c | 94
|
||||
res/res_pjsip/security_events.c | 290
|
||||
res/res_pjsip_acl.c | 302
|
||||
@@ -8320,7 +8250,6 @@
|
||||
res/res_pjsip_endpoint_identifier_user.c | 129
|
||||
res/res_pjsip_exten_state.c | 625
|
||||
res/res_pjsip_exten_state.exports.in | 7
|
||||
res/res_pjsip_header_funcs.c | 609
|
||||
res/res_pjsip_log_forwarder.c | 124
|
||||
res/res_pjsip_logger.c | 214
|
||||
res/res_pjsip_messaging.c | 704
|
||||
@@ -8343,7 +8272,7 @@
|
||||
res/res_pjsip_t38.c | 859 +
|
||||
res/res_pjsip_transport_websocket.c | 402
|
||||
res/res_pktccops.c | 2
|
||||
res/res_rtp_asterisk.c | 1734 +-
|
||||
res/res_rtp_asterisk.c | 1726 +-
|
||||
res/res_rtp_multicast.c | 47
|
||||
res/res_security_log.c | 100
|
||||
res/res_smdi.c | 23
|
||||
@@ -8465,6 +8394,6 @@
|
||||
utils/muted.c | 9
|
||||
utils/refcounter.c | 44
|
||||
utils/utils.xml | 9
|
||||
796 files changed, 197267 insertions(+), 53991 deletions(-)
|
||||
794 files changed, 196515 insertions(+), 53916 deletions(-)
|
||||
|
||||
----------------------------------------------------------------------
|
@@ -197,9 +197,6 @@ type=bridge
|
||||
; is the single source of video distribution among all participants. If
|
||||
; that user leaves, the marked user to join after them becomes the source.
|
||||
|
||||
;language=en ; Set the language used for announcements to the conference.
|
||||
; Default is en (English).
|
||||
|
||||
; All sounds in the conference are customizable using the bridge profile options below.
|
||||
; Simply state the option followed by the filename or full path of the filename after
|
||||
; the option. Example: sound_had_joined=conf-hasjoin This will play the conf-hasjoin
|
||||
|
11
configure
vendored
11
configure
vendored
@@ -1,5 +1,5 @@
|
||||
#! /bin/sh
|
||||
# From configure.ac Revision: 400384 .
|
||||
# From configure.ac Revision: 400178 .
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for asterisk trunk.
|
||||
#
|
||||
@@ -32871,15 +32871,6 @@ echo " \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$. "
|
||||
echo
|
||||
fi
|
||||
|
||||
if test "x${AST_IODBC_FOUND}" = "xyes"; then
|
||||
echo "WARNING: iodbc libs/headers found!"
|
||||
echo
|
||||
echo " If you plan to use ODBC functionality, you should consider"
|
||||
echo " switching to unixodbc instead."
|
||||
echo " See: https://issues.asterisk.org/jira/browse/ASTERISK-22459"
|
||||
echo
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Package configured for: " >&5
|
||||
$as_echo "$as_me: Package configured for: " >&6;}
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: OS type : $host_os" >&5
|
||||
|
@@ -2452,15 +2452,6 @@ echo " \$\$\$\$\$\$\$\$\$\$\$\$\$\$\$\$. "
|
||||
echo
|
||||
fi
|
||||
|
||||
if test "x${AST_IODBC_FOUND}" = "xyes"; then
|
||||
echo "WARNING: iodbc libs/headers found!"
|
||||
echo
|
||||
echo " If you plan to use ODBC functionality, you should consider"
|
||||
echo " switching to unixodbc instead."
|
||||
echo " See: https://issues.asterisk.org/jira/browse/ASTERISK-22459"
|
||||
echo
|
||||
fi
|
||||
|
||||
AC_MSG_NOTICE(Package configured for: )
|
||||
AC_MSG_NOTICE( OS type : $host_os)
|
||||
AC_MSG_NOTICE( Host CPU : $host_cpu)
|
||||
|
@@ -120,7 +120,7 @@ static int config_function_read(struct ast_channel *chan, const char *cmd, char
|
||||
/* At worst, we might leak an entry while upgrading locks */
|
||||
AST_RWLIST_UNLOCK(&configs);
|
||||
AST_RWLIST_WRLOCK(&configs);
|
||||
if (!(cur = ast_calloc(1, sizeof(*cur) + strlen(args.filename) + 1))) {
|
||||
if (!(cur = ast_malloc(sizeof(*cur) + strlen(args.filename) + 1))) {
|
||||
AST_RWLIST_UNLOCK(&configs);
|
||||
return -1;
|
||||
}
|
||||
@@ -149,7 +149,7 @@ static int config_function_read(struct ast_channel *chan, const char *cmd, char
|
||||
}
|
||||
|
||||
if (!cur) {
|
||||
if (!(cur = ast_calloc(1, sizeof(*cur) + strlen(args.filename) + 1))) {
|
||||
if (!(cur = ast_malloc(sizeof(*cur) + strlen(args.filename) + 1))) {
|
||||
AST_RWLIST_UNLOCK(&configs);
|
||||
return -1;
|
||||
}
|
||||
|
@@ -518,6 +518,8 @@ struct stasis_message_type *ast_manager_get_generic_type(void);
|
||||
*/
|
||||
struct stasis_topic *ast_manager_get_topic(void);
|
||||
|
||||
struct ast_json;
|
||||
|
||||
/*!
|
||||
* \since 12
|
||||
* \brief Publish an event to AMI
|
||||
|
@@ -731,7 +731,7 @@ struct ao2_container *stasis_cache_dump(struct stasis_cache *cache,
|
||||
void stasis_log_bad_type_access(const char *name);
|
||||
|
||||
/*!
|
||||
* \brief Boiler-plate messaging macro for defining public message types.
|
||||
* \brief Boiler-plate removing macro for defining message types.
|
||||
*
|
||||
* \code
|
||||
* STASIS_MESSAGE_TYPE_DEFN(ast_foo_type,
|
||||
@@ -757,7 +757,7 @@ void stasis_log_bad_type_access(const char *name);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Boiler-plate messaging macro for defining local message types.
|
||||
* \brief Boiler-plate removing macro for defining local message types.
|
||||
*
|
||||
* \code
|
||||
* STASIS_MESSAGE_TYPE_DEFN_LOCAL(ast_foo_type,
|
||||
@@ -783,7 +783,7 @@ void stasis_log_bad_type_access(const char *name);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Boiler-plate messaging macro for initializing message types.
|
||||
* \brief Boiler-plate removing macro for initializing message types.
|
||||
*
|
||||
* \code
|
||||
* if (STASIS_MESSAGE_TYPE_INIT(ast_foo_type) != 0) {
|
||||
@@ -805,7 +805,7 @@ void stasis_log_bad_type_access(const char *name);
|
||||
})
|
||||
|
||||
/*!
|
||||
* \brief Boiler-plate messaging macro for cleaning up message types.
|
||||
* \brief Boiler-plate removing macro for cleaning up message types.
|
||||
*
|
||||
* Note that if your type is defined in core instead of a loadable module, you
|
||||
* should call message type cleanup from an ast_register_cleanup() handler
|
||||
|
158
res/res_agi.c
158
res/res_agi.c
@@ -1033,66 +1033,38 @@ enum agi_result {
|
||||
AGI_RESULT_HANGUP,
|
||||
};
|
||||
|
||||
static struct ast_manager_event_blob *agi_channel_to_ami(const char *type, struct stasis_message *message)
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_exec_start_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_exec_end_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_start_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_exec_type);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_end_type);
|
||||
|
||||
static void agi_channel_manager_event(void *data,
|
||||
struct stasis_subscription *sub,
|
||||
struct stasis_message *message)
|
||||
{
|
||||
const char *type = data;
|
||||
struct ast_channel_blob *obj = stasis_message_data(message);
|
||||
RAII_VAR(struct ast_str *, channel_string, NULL, ast_free);
|
||||
RAII_VAR(struct ast_str *, channel_event_string, NULL, ast_free);
|
||||
RAII_VAR(struct ast_str *, event_string, NULL, ast_free);
|
||||
|
||||
channel_string = ast_manager_build_channel_state_string(obj->snapshot);
|
||||
event_string = ast_manager_str_from_json_object(obj->blob, NULL);
|
||||
if (!channel_string || !event_string) {
|
||||
return NULL;
|
||||
channel_event_string = ast_manager_build_channel_state_string(obj->snapshot);
|
||||
if (!channel_event_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
return ast_manager_event_blob_create(EVENT_FLAG_AGI, type,
|
||||
event_string = ast_manager_str_from_json_object(obj->blob, NULL);
|
||||
if (!event_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
manager_event(EVENT_FLAG_AGI, type,
|
||||
"%s"
|
||||
"%s",
|
||||
ast_str_buffer(channel_string),
|
||||
ast_str_buffer(channel_event_string),
|
||||
ast_str_buffer(event_string));
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *agi_exec_start_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return agi_channel_to_ami("AGIExecStart", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *agi_exec_end_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return agi_channel_to_ami("AGIExecEnd", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *agi_async_start_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return agi_channel_to_ami("AsyncAGIStart", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *agi_async_exec_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return agi_channel_to_ami("AsyncAGIExec", message);
|
||||
}
|
||||
|
||||
static struct ast_manager_event_blob *agi_async_end_to_ami(struct stasis_message *message)
|
||||
{
|
||||
return agi_channel_to_ami("AsyncAGIEnd", message);
|
||||
}
|
||||
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_exec_start_type,
|
||||
.to_ami = agi_exec_start_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_exec_end_type,
|
||||
.to_ami = agi_exec_end_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_start_type,
|
||||
.to_ami = agi_async_start_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_exec_type,
|
||||
.to_ami = agi_async_exec_to_ami,
|
||||
);
|
||||
STASIS_MESSAGE_TYPE_DEFN_LOCAL(agi_async_end_type,
|
||||
.to_ami = agi_async_end_to_ami,
|
||||
);
|
||||
|
||||
static agi_command *find_command(const char * const cmds[], int exact);
|
||||
|
||||
AST_THREADSTORAGE(agi_buf);
|
||||
@@ -3496,9 +3468,10 @@ int AST_OPTIONAL_API_NAME(ast_agi_unregister)(struct ast_module *mod, agi_comman
|
||||
}
|
||||
AST_RWLIST_TRAVERSE_SAFE_END;
|
||||
AST_RWLIST_UNLOCK(&agi_commands);
|
||||
if (unregistered) {
|
||||
if (unregistered)
|
||||
ast_verb(2, "AGI Command '%s' unregistered\n",fullcmd);
|
||||
}
|
||||
else
|
||||
ast_log(LOG_WARNING, "Unable to unregister command: '%s'!\n",fullcmd);
|
||||
return unregistered;
|
||||
}
|
||||
|
||||
@@ -4283,6 +4256,17 @@ AST_TEST_DEFINE(test_agi_null_docs)
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
struct stasis_message_router *message_router;
|
||||
|
||||
message_router = ast_manager_get_message_router();
|
||||
if (message_router) {
|
||||
stasis_message_router_remove(message_router, agi_exec_start_type());
|
||||
stasis_message_router_remove(message_router, agi_exec_end_type());
|
||||
stasis_message_router_remove(message_router, agi_async_start_type());
|
||||
stasis_message_router_remove(message_router, agi_async_exec_type());
|
||||
stasis_message_router_remove(message_router, agi_async_end_type());
|
||||
}
|
||||
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(agi_exec_start_type);
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(agi_exec_end_type);
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(agi_async_start_type);
|
||||
@@ -4290,39 +4274,67 @@ static int unload_module(void)
|
||||
STASIS_MESSAGE_TYPE_CLEANUP(agi_async_end_type);
|
||||
|
||||
ast_cli_unregister_multiple(cli_agi, ARRAY_LEN(cli_agi));
|
||||
ast_agi_unregister_multiple(ast_module_info->self, commands, ARRAY_LEN(commands));
|
||||
/* we can safely ignore the result of ast_agi_unregister_multiple() here, since it cannot fail, as
|
||||
we know that these commands were registered by this module and are still registered
|
||||
*/
|
||||
(void) ast_agi_unregister_multiple(ast_module_info->self, commands, ARRAY_LEN(commands));
|
||||
ast_unregister_application(eapp);
|
||||
ast_unregister_application(deadapp);
|
||||
ast_manager_unregister("AGI");
|
||||
ast_unregister_application(app);
|
||||
AST_TEST_UNREGISTER(test_agi_null_docs);
|
||||
return 0;
|
||||
return ast_unregister_application(app);
|
||||
}
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
int err = 0;
|
||||
struct stasis_message_router *message_router;
|
||||
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(agi_exec_start_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(agi_exec_end_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(agi_async_start_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(agi_async_exec_type);
|
||||
err |= STASIS_MESSAGE_TYPE_INIT(agi_async_end_type);
|
||||
|
||||
err |= ast_cli_register_multiple(cli_agi, ARRAY_LEN(cli_agi));
|
||||
err |= ast_agi_register_multiple(ast_module_info->self, commands, ARRAY_LEN(commands));
|
||||
err |= ast_register_application_xml(deadapp, deadagi_exec);
|
||||
err |= ast_register_application_xml(eapp, eagi_exec);
|
||||
err |= ast_manager_register_xml("AGI", EVENT_FLAG_AGI, action_add_agi_cmd);
|
||||
err |= ast_register_application_xml(app, agi_exec);
|
||||
|
||||
AST_TEST_REGISTER(test_agi_null_docs);
|
||||
|
||||
if (err) {
|
||||
unload_module();
|
||||
message_router = ast_manager_get_message_router();
|
||||
if (!message_router) {
|
||||
return AST_MODULE_LOAD_DECLINE;
|
||||
}
|
||||
return AST_MODULE_LOAD_SUCCESS;
|
||||
|
||||
STASIS_MESSAGE_TYPE_INIT(agi_exec_start_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(agi_exec_end_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(agi_async_start_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(agi_async_exec_type);
|
||||
STASIS_MESSAGE_TYPE_INIT(agi_async_end_type);
|
||||
|
||||
stasis_message_router_add(message_router,
|
||||
agi_exec_start_type(),
|
||||
agi_channel_manager_event,
|
||||
"AGIExecStart");
|
||||
|
||||
stasis_message_router_add(message_router,
|
||||
agi_exec_end_type(),
|
||||
agi_channel_manager_event,
|
||||
"AGIExecEnd");
|
||||
|
||||
stasis_message_router_add(message_router,
|
||||
agi_async_start_type(),
|
||||
agi_channel_manager_event,
|
||||
"AsyncAGIStart");
|
||||
|
||||
stasis_message_router_add(message_router,
|
||||
agi_async_exec_type(),
|
||||
agi_channel_manager_event,
|
||||
"AsyncAGIExec");
|
||||
|
||||
stasis_message_router_add(message_router,
|
||||
agi_async_end_type(),
|
||||
agi_channel_manager_event,
|
||||
"AsyncAGIEnd");
|
||||
|
||||
ast_cli_register_multiple(cli_agi, ARRAY_LEN(cli_agi));
|
||||
/* we can safely ignore the result of ast_agi_register_multiple() here, since it cannot fail, as
|
||||
no other commands have been registered yet
|
||||
*/
|
||||
(void) ast_agi_register_multiple(ast_module_info->self, commands, ARRAY_LEN(commands));
|
||||
ast_register_application_xml(deadapp, deadagi_exec);
|
||||
ast_register_application_xml(eapp, eagi_exec);
|
||||
ast_manager_register_xml("AGI", EVENT_FLAG_AGI, action_add_agi_cmd);
|
||||
AST_TEST_REGISTER(test_agi_null_docs);
|
||||
return ast_register_application_xml(app, agi_exec);
|
||||
}
|
||||
|
||||
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER, "Asterisk Gateway Interface (AGI)",
|
||||
|
@@ -1437,7 +1437,7 @@ pjsip_dialog *ast_sip_create_dialog_uas(const struct ast_sip_endpoint *endpoint,
|
||||
if (status != PJ_SUCCESS) {
|
||||
char err[PJ_ERR_MSG_SIZE];
|
||||
|
||||
pj_strerror(status, err, sizeof(err));
|
||||
pjsip_strerror(status, err, sizeof(err));
|
||||
ast_log(LOG_ERROR, "Could not create dialog with endpoint %s. %s\n",
|
||||
ast_sorcery_object_get_id(endpoint), err);
|
||||
return NULL;
|
||||
|
@@ -184,7 +184,7 @@ static int transport_apply(const struct ast_sorcery *sorcery, void *obj)
|
||||
if (res != PJ_SUCCESS) {
|
||||
char msg[PJ_ERR_MSG_SIZE];
|
||||
|
||||
pj_strerror(res, msg, sizeof(msg));
|
||||
pjsip_strerror(res, msg, sizeof(msg));
|
||||
ast_log(LOG_ERROR, "Transport '%s' could not be started: %s\n", ast_sorcery_object_get_id(obj), msg);
|
||||
return -1;
|
||||
}
|
||||
|
@@ -581,58 +581,25 @@ static pjsip_module options_module = {
|
||||
static int cli_on_contact(void *obj, void *arg, int flags)
|
||||
{
|
||||
struct ast_sip_contact *contact = obj;
|
||||
int *cli_fd = arg;
|
||||
ast_cli(*cli_fd, " contact %s\n", contact->uri);
|
||||
struct ast_cli_args *a = arg;
|
||||
ast_cli(a->fd, " contact %s\n", contact->uri);
|
||||
qualify_contact(contact);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Data pushed to threadpool to qualify endpoints from the CLI
|
||||
*/
|
||||
struct qualify_data {
|
||||
/*! Endpoint that is being qualified */
|
||||
struct ast_sip_endpoint *endpoint;
|
||||
/*! CLI File descriptor for printing messages */
|
||||
int cli_fd;
|
||||
};
|
||||
|
||||
static struct qualify_data *qualify_data_alloc(struct ast_sip_endpoint *endpoint, int cli_fd)
|
||||
{
|
||||
struct qualify_data *qual_data;
|
||||
|
||||
qual_data = ast_malloc(sizeof(*qual_data));
|
||||
if (!qual_data) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
qual_data->endpoint = ao2_bump(endpoint);
|
||||
qual_data->cli_fd = cli_fd;
|
||||
return qual_data;
|
||||
}
|
||||
|
||||
static void qualify_data_destroy(struct qualify_data *qual_data)
|
||||
{
|
||||
ao2_cleanup(qual_data->endpoint);
|
||||
ast_free(qual_data);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief For an endpoint iterate over and qualify all aors/contacts
|
||||
*/
|
||||
static int cli_qualify_contacts(void *data)
|
||||
static void cli_qualify_contacts(struct ast_cli_args *a, const char *endpoint_name,
|
||||
struct ast_sip_endpoint *endpoint)
|
||||
{
|
||||
char *aor_name, *aors;
|
||||
RAII_VAR(struct qualify_data *, qual_data, data, qualify_data_destroy);
|
||||
struct ast_sip_endpoint *endpoint = qual_data->endpoint;
|
||||
int cli_fd = qual_data->cli_fd;
|
||||
const char *endpoint_name = ast_sorcery_object_get_id(endpoint);
|
||||
|
||||
if (ast_strlen_zero(endpoint->aors)) {
|
||||
ast_cli(cli_fd, "Endpoint %s has no AoR's configured\n",
|
||||
ast_cli(a->fd, "Endpoint %s has no AoR's configured\n",
|
||||
endpoint_name);
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
aors = ast_strdupa(endpoint->aors);
|
||||
@@ -646,17 +613,15 @@ static int cli_qualify_contacts(void *data)
|
||||
continue;
|
||||
}
|
||||
|
||||
ast_cli(cli_fd, "Sending qualify to endpoint %s\n", endpoint_name);
|
||||
ao2_callback(contacts, OBJ_NODATA, cli_on_contact, &cli_fd);
|
||||
ast_cli(a->fd, "Sending qualify to endpoint %s\n", endpoint_name);
|
||||
ao2_callback(contacts, OBJ_NODATA, cli_on_contact, a);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char *cli_qualify(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||
{
|
||||
RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
|
||||
const char *endpoint_name;
|
||||
struct qualify_data *qual_data;
|
||||
|
||||
switch (cmd) {
|
||||
case CLI_INIT:
|
||||
@@ -681,15 +646,8 @@ static char *cli_qualify(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
|
||||
return CLI_FAILURE;
|
||||
}
|
||||
|
||||
qual_data = qualify_data_alloc(endpoint, a->fd);
|
||||
if (!qual_data) {
|
||||
return CLI_FAILURE;
|
||||
}
|
||||
|
||||
if (ast_sip_push_task(NULL, cli_qualify_contacts, qual_data)) {
|
||||
qualify_data_destroy(qual_data);
|
||||
return CLI_FAILURE;
|
||||
}
|
||||
/* send a qualify for all contacts registered with the endpoint */
|
||||
cli_qualify_contacts(a, endpoint_name, endpoint);
|
||||
|
||||
return CLI_SUCCESS;
|
||||
}
|
||||
|
@@ -1,609 +0,0 @@
|
||||
/*
|
||||
* Asterisk -- An open source telephony toolkit.
|
||||
*
|
||||
* Copyright (C) 2013, Fairview 5 Engineering, LLC
|
||||
*
|
||||
* George Joseph <george.joseph@fairview5.com>
|
||||
*
|
||||
* See http://www.asterisk.org for more information about
|
||||
* the Asterisk project. Please do not directly contact
|
||||
* any of the maintainers of this project for assistance;
|
||||
* the project provides a web site, mailing lists and IRC
|
||||
* channels for your use.
|
||||
*
|
||||
* This program is free software, distributed under the terms of
|
||||
* the GNU General Public License Version 2. See the LICENSE file
|
||||
* at the top of the source tree.
|
||||
*/
|
||||
|
||||
/*** MODULEINFO
|
||||
<depend>pjproject</depend>
|
||||
<depend>res_pjsip</depend>
|
||||
<depend>res_pjsip_session</depend>
|
||||
<support_level>core</support_level>
|
||||
***/
|
||||
|
||||
#include "asterisk.h"
|
||||
|
||||
#include <pjsip.h>
|
||||
#include <pjsip_ua.h>
|
||||
|
||||
#include "asterisk/res_pjsip.h"
|
||||
#include "asterisk/res_pjsip_session.h"
|
||||
#include "asterisk/channel.h"
|
||||
#include "asterisk/pbx.h"
|
||||
#include "asterisk/app.h"
|
||||
#include "asterisk/module.h"
|
||||
#include "asterisk/utils.h"
|
||||
|
||||
/*** DOCUMENTATION
|
||||
<function name="PJSIP_HEADER" language="en_US">
|
||||
<synopsis>
|
||||
Gets, adds, updates or removes the specified SIP header from a PJSIP session.
|
||||
</synopsis>
|
||||
<syntax>
|
||||
<parameter name="action" required="true">
|
||||
<enumlist>
|
||||
<enum name="read"><para>Returns instance <replaceable>number</replaceable>
|
||||
of header <replaceable>name</replaceable>.</para></enum>
|
||||
|
||||
<enum name="add"><para>Adds a new header <replaceable>name</replaceable>
|
||||
to this session.</para></enum>
|
||||
|
||||
<enum name="update"><para>Updates instance <replaceable>number</replaceable>
|
||||
of header <replaceable>name</replaceable> to a new value.
|
||||
The header must already exist.</para></enum>
|
||||
|
||||
<enum name="remove"><para>Removes all instances of previously added headers
|
||||
whose names match <replaceable>name</replaceable>. A <literal>*</literal>
|
||||
may be appended to <replaceable>name</replaceable> to remove all headers
|
||||
<emphasis>beginning with</emphasis> <replaceable>name</replaceable>.
|
||||
<replaceable>name</replaceable> may be set to a single <literal>*</literal>
|
||||
to clear <emphasis>all</emphasis> previously added headers. In all cases,
|
||||
the number of headers actually removed is returned.</para></enum>
|
||||
</enumlist>
|
||||
</parameter>
|
||||
|
||||
<parameter name="name" required="true"><para>The name of the header.</para></parameter>
|
||||
|
||||
<parameter name="number" required="false">
|
||||
<para>If there's more than 1 header with the same name, this specifies which header
|
||||
to read or update. If not specified, defaults to <literal>1</literal> meaning
|
||||
the first matching header. Not valid for <literal>add</literal> or
|
||||
<literal>remove</literal>.</para>
|
||||
</parameter>
|
||||
|
||||
</syntax>
|
||||
<description>
|
||||
<para>Examples:</para>
|
||||
<para>;</para>
|
||||
<para>; Set 'somevar' to the value of the 'From' header.</para>
|
||||
<para>exten => 1,1,Set(somevar=${PJSIP_HEADER(read,From)})</para>
|
||||
<para>;</para>
|
||||
<para>; Set 'via2' to the value of the 2nd 'Via' header.</para>
|
||||
<para>exten => 1,1,Set(via2=${PJSIP_HEADER(read,Via,2)})</para>
|
||||
<para>;</para>
|
||||
<para>; Add an 'X-Myheader' header with the value of 'myvalue'.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(add,X-MyHeader)=myvalue)</para>
|
||||
<para>;</para>
|
||||
<para>; Add an 'X-Myheader' header with an empty value.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(add,X-MyHeader)=)</para>
|
||||
<para>;</para>
|
||||
<para>; Update the value of the header named 'X-Myheader' to 'newvalue'.</para>
|
||||
<para>; 'X-Myheader' must already exist or the call will fail.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(update,X-MyHeader)=newvalue)</para>
|
||||
<para>;</para>
|
||||
<para>; Remove all headers whose names exactly match 'X-MyHeader'.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(remove,X-MyHeader)=)</para>
|
||||
<para>;</para>
|
||||
<para>; Remove all headers that begin with 'X-My'.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(remove,X-My*)=)</para>
|
||||
<para>;</para>
|
||||
<para>; Remove all previously added headers.</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(remove,*)=)</para>
|
||||
<para>;</para>
|
||||
|
||||
<note><para>The <literal>remove</literal> action can be called by reading
|
||||
<emphasis>or</emphasis> writing PJSIP_HEADER.</para>
|
||||
<para>;</para>
|
||||
<para>; Display the number of headers removed</para>
|
||||
<para>exten => 1,1,Verbose( Removed ${PJSIP_HEADER(remove,X-MyHeader)} headers)</para>
|
||||
<para>;</para>
|
||||
<para>; Set a variable to the number of headers removed</para>
|
||||
<para>exten => 1,1,Set(count=${PJSIP_HEADER(remove,X-MyHeader)})</para>
|
||||
<para>;</para>
|
||||
<para>; Just remove them ignoring any count</para>
|
||||
<para>exten => 1,1,Set(=${PJSIP_HEADER(remove,X-MyHeader)})</para>
|
||||
<para>exten => 1,1,Set(PJSIP_HEADER(remove,X-MyHeader)=)</para>
|
||||
<para>;</para>
|
||||
</note>
|
||||
|
||||
<note><para>If you call PJSIP_HEADER in a normal dialplan context you'll be
|
||||
operating on the <emphasis>caller's (incoming)</emphasis> channel which
|
||||
may not be what you want. To operate on the <emphasis>callee's (outgoing)</emphasis>
|
||||
channel call PJSIP_HEADER in a pre-dial handler. </para>
|
||||
<para>Example:</para>
|
||||
<para>;</para>
|
||||
<para>[handler]</para>
|
||||
<para>exten => addheader,1,Set(PJSIP_HEADER(add,X-MyHeader)=myvalue)</para>
|
||||
<para>exten => addheader,2,Set(PJSIP_HEADER(add,X-MyHeader2)=myvalue2)</para>
|
||||
<para>;</para>
|
||||
<para>[somecontext]</para>
|
||||
<para>exten => 1,1,Dial(PJSIP/${EXTEN},,b(handler^addheader^1))</para>
|
||||
<para>;</para>
|
||||
</note>
|
||||
</description>
|
||||
</function>
|
||||
***/
|
||||
|
||||
/*! \brief Linked list for accumulating headers */
|
||||
struct hdr_list_entry {
|
||||
pjsip_hdr *hdr;
|
||||
AST_LIST_ENTRY(hdr_list_entry) nextptr;
|
||||
};
|
||||
AST_LIST_HEAD(hdr_list, hdr_list_entry);
|
||||
|
||||
/*! \brief Destructor for hdr_list */
|
||||
static void hdr_list_destroy(void *obj)
|
||||
{
|
||||
AST_LIST_HEAD_DESTROY((struct hdr_list *) obj);
|
||||
}
|
||||
|
||||
/*! \brief Datastore for saving headers */
|
||||
static const struct ast_datastore_info header_datastore = {
|
||||
.type = "header_datastore",
|
||||
.destroy = hdr_list_destroy,
|
||||
};
|
||||
|
||||
/*! \brief Data structure used for ast_sip_push_task_synchronous */
|
||||
struct header_data {
|
||||
struct ast_sip_channel_pvt *channel;
|
||||
char *header_name;
|
||||
const char *header_value;
|
||||
char *buf;
|
||||
int header_number;
|
||||
size_t len;
|
||||
};
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Insert the header pointers into the linked list.
|
||||
*
|
||||
* For each header in the message, allocate a list entry,
|
||||
* clone the header, then insert the entry.
|
||||
*/
|
||||
static int insert_headers(pj_pool_t * pool, struct hdr_list *list, pjsip_msg * msg)
|
||||
{
|
||||
pjsip_hdr *hdr = msg->hdr.next;
|
||||
struct hdr_list_entry *le;
|
||||
|
||||
while (hdr && hdr != &msg->hdr) {
|
||||
le = pj_pool_zalloc(pool, sizeof(struct hdr_list_entry));
|
||||
le->hdr = pjsip_hdr_clone(pool, hdr);
|
||||
AST_LIST_INSERT_TAIL(list, le, nextptr);
|
||||
hdr = hdr->next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Session supplement callback on an incoming INVITE request
|
||||
*
|
||||
* Retrieve the header_datastore from the session or create one if it doesn't exist.
|
||||
* Create and initialize the list if needed.
|
||||
* Insert the headers.
|
||||
*/
|
||||
static int incoming_request(struct ast_sip_session *session, pjsip_rx_data * rdata)
|
||||
{
|
||||
pj_pool_t *pool = session->inv_session->dlg->pool;
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(session, header_datastore.type), ao2_cleanup);
|
||||
|
||||
if (!datastore) {
|
||||
if (!(datastore =
|
||||
ast_sip_session_alloc_datastore(&header_datastore, header_datastore.type))
|
||||
||
|
||||
!(datastore->data = pj_pool_alloc(pool, sizeof(struct hdr_list))) ||
|
||||
ast_sip_session_add_datastore(session, datastore)) {
|
||||
ast_log(AST_LOG_ERROR, "Unable to create datastore for header functions.\n");
|
||||
return 0;
|
||||
}
|
||||
AST_LIST_HEAD_INIT((struct hdr_list *) datastore->data);
|
||||
}
|
||||
insert_headers(pool, (struct hdr_list *) datastore->data, rdata->msg_info.msg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Search list for nth occurrence of specific header.
|
||||
*/
|
||||
static pjsip_hdr *find_header(struct hdr_list *list, const char *header_name,
|
||||
int header_number)
|
||||
{
|
||||
struct hdr_list_entry *le;
|
||||
pjsip_hdr *hdr = NULL;
|
||||
int i = 1;
|
||||
|
||||
if (!list || ast_strlen_zero(header_name) || header_number < 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AST_LIST_TRAVERSE(list, le, nextptr) {
|
||||
if (pj_stricmp2(&le->hdr->name, header_name) == 0 && i++ == header_number) {
|
||||
hdr = le->hdr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return hdr;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Implements PJSIP_HEADER 'read' by searching the for the requested header.
|
||||
*
|
||||
* Retrieve the header_datastore.
|
||||
* Search for the nth matching header.
|
||||
* Validate the pjsip_hdr found.
|
||||
* Parse pjsip_hdr into a name and value.
|
||||
* Return the value.
|
||||
*/
|
||||
static int read_header(void *obj)
|
||||
{
|
||||
struct header_data *data = obj;
|
||||
pjsip_hdr *hdr = NULL;
|
||||
char *pj_hdr_string;
|
||||
size_t pj_hdr_string_len;
|
||||
char *p;
|
||||
size_t plen;
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(data->channel->session, header_datastore.type),
|
||||
ao2_cleanup);
|
||||
|
||||
if (!datastore || !datastore->data) {
|
||||
ast_debug(1, "There was no datastore from which to read headers.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
hdr = find_header((struct hdr_list *) datastore->data, data->header_name,
|
||||
data->header_number);
|
||||
|
||||
if (!hdr) {
|
||||
ast_debug(1, "There was no header named %s.\n", data->header_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pj_hdr_string = ast_alloca(data->len);
|
||||
pj_hdr_string_len = pjsip_hdr_print_on(hdr, pj_hdr_string, data->len);
|
||||
pj_hdr_string[pj_hdr_string_len] = '\0';
|
||||
|
||||
p = strchr(pj_hdr_string, ':');
|
||||
if (!p) {
|
||||
ast_log(AST_LOG_ERROR,
|
||||
"A malformed header was returned from pjsip_hdr_print_on.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
++p;
|
||||
p = ast_strip(p);
|
||||
plen = strlen(p);
|
||||
if (plen + 1 > data->len) {
|
||||
ast_log(AST_LOG_ERROR,
|
||||
"Buffer isn't big enough to hold header value. %lu > %lu\n", plen + 1,
|
||||
data->len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ast_copy_string(data->buf, p, data->len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Implements PJSIP_HEADER 'add' by inserting the specified header into thge list.
|
||||
*
|
||||
* Retrieve the header_datastore from the session or create one if it doesn't exist.
|
||||
* Create and initialize the list if needed.
|
||||
* Create the pj_strs for name and value.
|
||||
* Create pjsip_msg and hdr_list_entry.
|
||||
* Add the entry to the list.
|
||||
*/
|
||||
static int add_header(void *obj)
|
||||
{
|
||||
struct header_data *data = obj;
|
||||
struct ast_sip_session *session = data->channel->session;
|
||||
pj_pool_t *pool = session->inv_session->dlg->pool;
|
||||
pj_str_t pj_header_name;
|
||||
pj_str_t pj_header_value;
|
||||
struct hdr_list_entry *le;
|
||||
struct hdr_list *list;
|
||||
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(session, header_datastore.type), ao2_cleanup);
|
||||
|
||||
if (!datastore) {
|
||||
if (!(datastore = ast_sip_session_alloc_datastore(&header_datastore,
|
||||
header_datastore.type))
|
||||
|| !(datastore->data = pj_pool_alloc(pool, sizeof(struct hdr_list)))
|
||||
|| ast_sip_session_add_datastore(session, datastore)) {
|
||||
ast_log(AST_LOG_ERROR, "Unable to create datastore for header functions.\n");
|
||||
return -1;
|
||||
}
|
||||
AST_LIST_HEAD_INIT((struct hdr_list *) datastore->data);
|
||||
}
|
||||
|
||||
ast_debug(1, "Adding header %s with value %s\n", data->header_name,
|
||||
data->header_value);
|
||||
|
||||
pj_cstr(&pj_header_name, data->header_name);
|
||||
pj_cstr(&pj_header_value, data->header_value);
|
||||
le = pj_pool_zalloc(pool, sizeof(struct hdr_list_entry));
|
||||
le->hdr = (pjsip_hdr *) pjsip_generic_string_hdr_create(pool, &pj_header_name,
|
||||
&pj_header_value);
|
||||
list = datastore->data;
|
||||
|
||||
AST_LIST_INSERT_TAIL(list, le, nextptr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Implements PJSIP_HEADER 'update' by finding the specified header and updating it.
|
||||
*
|
||||
* Retrieve the header_datastore from the session or create one if it doesn't exist.
|
||||
* Create and initialize the list if needed.
|
||||
* Create the pj_strs for name and value.
|
||||
* Create pjsip_msg and hdr_list_entry.
|
||||
* Add the entry to the list.
|
||||
*/
|
||||
static int update_header(void *obj)
|
||||
{
|
||||
struct header_data *data = obj;
|
||||
pjsip_hdr *hdr = NULL;
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(data->channel->session, header_datastore.type),
|
||||
ao2_cleanup);
|
||||
|
||||
if (!datastore || !datastore->data) {
|
||||
ast_log(AST_LOG_ERROR, "No headers had been previously added to this session.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
hdr = find_header((struct hdr_list *) datastore->data, data->header_name,
|
||||
data->header_number);
|
||||
|
||||
if (!hdr) {
|
||||
ast_log(AST_LOG_ERROR, "There was no header named %s.\n", data->header_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pj_strcpy2(&((pjsip_generic_string_hdr *) hdr)->hvalue, data->header_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Implements PJSIP_HEADER 'remove' by finding the specified header and removing it.
|
||||
*
|
||||
* Retrieve the header_datastore from the session. Fail if it doesn't exist.
|
||||
* If the header_name is exactly '*', the entire list is simply destroyed.
|
||||
* Otherwise search the list for the matching header name which may be a partial name.
|
||||
*/
|
||||
static int remove_header(void *obj)
|
||||
{
|
||||
struct header_data *data = obj;
|
||||
size_t len = strlen(data->header_name);
|
||||
struct hdr_list *list;
|
||||
struct hdr_list_entry *le;
|
||||
int removed_count = 0;
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(data->channel->session, header_datastore.type),
|
||||
ao2_cleanup);
|
||||
|
||||
if (!datastore || !datastore->data) {
|
||||
ast_log(AST_LOG_ERROR, "No headers had been previously added to this session.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
list = datastore->data;
|
||||
AST_LIST_TRAVERSE_SAFE_BEGIN(list, le, nextptr) {
|
||||
if (data->header_name[len - 1] == '*') {
|
||||
if (pj_strnicmp2(&le->hdr->name, data->header_name, len - 1) == 0) {
|
||||
AST_LIST_REMOVE_CURRENT(nextptr);
|
||||
removed_count++;
|
||||
}
|
||||
} else {
|
||||
if (pj_stricmp2(&le->hdr->name, data->header_name) == 0) {
|
||||
AST_LIST_REMOVE_CURRENT(nextptr);
|
||||
removed_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
AST_LIST_TRAVERSE_SAFE_END;
|
||||
|
||||
if (data->buf && data->len) {
|
||||
snprintf(data->buf, data->len, "%d", removed_count);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Implements function 'read' callback.
|
||||
*
|
||||
* Valid actions are 'read' and 'remove'.
|
||||
*/
|
||||
static int func_read_header(struct ast_channel *chan, const char *function, char *data,
|
||||
char *buf, size_t len)
|
||||
{
|
||||
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
|
||||
struct header_data header_data;
|
||||
int number;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(action);
|
||||
AST_APP_ARG(header_name); AST_APP_ARG(header_number););
|
||||
AST_STANDARD_APP_ARGS(args, data);
|
||||
|
||||
if (ast_strlen_zero(args.action)) {
|
||||
ast_log(AST_LOG_ERROR, "This function requires an action.\n");
|
||||
return -1;
|
||||
}
|
||||
if (ast_strlen_zero(args.header_name)) {
|
||||
ast_log(AST_LOG_ERROR, "This function requires a header name.\n");
|
||||
return -1;
|
||||
}
|
||||
if (!args.header_number) {
|
||||
number = 1;
|
||||
} else {
|
||||
sscanf(args.header_number, "%30d", &number);
|
||||
if (number < 1) {
|
||||
number = 1;
|
||||
}
|
||||
}
|
||||
|
||||
header_data.channel = channel;
|
||||
header_data.header_name = args.header_name;
|
||||
header_data.header_number = number;
|
||||
header_data.header_value = NULL;
|
||||
header_data.buf = buf;
|
||||
header_data.len = len;
|
||||
|
||||
if (stricmp(args.action, "read") == 0) {
|
||||
return ast_sip_push_task_synchronous(channel->session->serializer, read_header,
|
||||
&header_data);
|
||||
} else if (stricmp(args.action, "remove") == 0) {
|
||||
return ast_sip_push_task_synchronous(channel->session->serializer, remove_header,
|
||||
&header_data);
|
||||
} else {
|
||||
ast_log(AST_LOG_ERROR,
|
||||
"Unknown action \'%s\' is not valid, Must be \'read\' or \'remove\'.\n",
|
||||
args.action);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Implements function 'write' callback.
|
||||
*
|
||||
* Valid actions are 'add', 'update' and 'remove'.
|
||||
*/
|
||||
static int func_write_header(struct ast_channel *chan, const char *cmd, char *data,
|
||||
const char *value)
|
||||
{
|
||||
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
|
||||
struct header_data header_data;
|
||||
int header_number;
|
||||
AST_DECLARE_APP_ARGS(args,
|
||||
AST_APP_ARG(action);
|
||||
AST_APP_ARG(header_name); AST_APP_ARG(header_number););
|
||||
AST_STANDARD_APP_ARGS(args, data);
|
||||
|
||||
if (ast_strlen_zero(args.action)) {
|
||||
ast_log(AST_LOG_ERROR, "This function requires an action.\n");
|
||||
return -1;
|
||||
}
|
||||
if (ast_strlen_zero(args.header_name)) {
|
||||
ast_log(AST_LOG_ERROR, "This function requires a header name.\n");
|
||||
return -1;
|
||||
}
|
||||
if (!args.header_number) {
|
||||
header_number = 1;
|
||||
} else {
|
||||
sscanf(args.header_number, "%30d", &header_number);
|
||||
if (header_number < 1) {
|
||||
header_number = 1;
|
||||
}
|
||||
}
|
||||
|
||||
header_data.channel = channel;
|
||||
header_data.header_name = args.header_name;
|
||||
header_data.header_number = header_number;
|
||||
header_data.header_value = value;
|
||||
header_data.buf = NULL;
|
||||
header_data.len = 0;
|
||||
|
||||
if (stricmp(args.action, "add") == 0) {
|
||||
return ast_sip_push_task_synchronous(channel->session->serializer, add_header,
|
||||
&header_data);
|
||||
} else if (stricmp(args.action, "update") == 0) {
|
||||
return ast_sip_push_task_synchronous(channel->session->serializer, update_header,
|
||||
&header_data);
|
||||
} else if (stricmp(args.action, "remove") == 0) {
|
||||
return ast_sip_push_task_synchronous(channel->session->serializer, remove_header,
|
||||
&header_data);
|
||||
} else {
|
||||
ast_log(AST_LOG_ERROR,
|
||||
"Unknown action \'%s\' is not valid, Must be \'add\', \'update\', or \'remove\'.\n",
|
||||
args.action);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static struct ast_custom_function pjsip_header_function = {
|
||||
.name = "PJSIP_HEADER",
|
||||
.read = func_read_header,
|
||||
.write = func_write_header,
|
||||
};
|
||||
|
||||
/*!
|
||||
* \internal
|
||||
* \brief Session supplement callback for outgoing INVITE requests
|
||||
*
|
||||
* Retrieve the header_datastore from the session.
|
||||
* Add each header in the list to the outgoing message.
|
||||
*
|
||||
* These pjsip_hdr structures will have been created by add_header.
|
||||
* Because outgoing_request may be called more than once with the same header
|
||||
* list (as in the case of an authentication exchange), each pjsip_hdr structure
|
||||
* MUST be newly cloned for each outgoing message.
|
||||
*/
|
||||
static void outgoing_request(struct ast_sip_session *session, pjsip_tx_data * tdata)
|
||||
{
|
||||
pj_pool_t *pool = session->inv_session->dlg->pool;
|
||||
struct hdr_list *list;
|
||||
struct hdr_list_entry *le;
|
||||
RAII_VAR(struct ast_datastore *, datastore,
|
||||
ast_sip_session_get_datastore(session, header_datastore.type), ao2_cleanup);
|
||||
|
||||
if (!datastore || !datastore->data) {
|
||||
return;
|
||||
}
|
||||
|
||||
list = datastore->data;
|
||||
AST_LIST_TRAVERSE(list, le, nextptr) {
|
||||
pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr *) pjsip_hdr_clone(pool, le->hdr));
|
||||
}
|
||||
}
|
||||
|
||||
static struct ast_sip_session_supplement header_funcs_supplement = {
|
||||
.method = "INVITE",
|
||||
.priority = AST_SIP_SESSION_SUPPLEMENT_PRIORITY_CHANNEL - 1000,
|
||||
.incoming_request = incoming_request,
|
||||
.outgoing_request = outgoing_request,
|
||||
};
|
||||
|
||||
static int load_module(void)
|
||||
{
|
||||
ast_sip_session_register_supplement(&header_funcs_supplement);
|
||||
ast_custom_function_register(&pjsip_header_function);
|
||||
|
||||
return AST_MODULE_LOAD_SUCCESS;
|
||||
}
|
||||
|
||||
static int unload_module(void)
|
||||
{
|
||||
ast_custom_function_unregister(&pjsip_header_function);
|
||||
ast_sip_session_unregister_supplement(&header_funcs_supplement);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "PJSIP Header Functions",.load =
|
||||
load_module,.unload = unload_module,.load_pri = AST_MODPRI_APP_DEPEND,);
|
@@ -1661,13 +1661,7 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
|
||||
unsigned int count = PJ_ARRAY_SIZE(address), pos = 0;
|
||||
|
||||
/* Add all the local interface IP addresses */
|
||||
if (ast_sockaddr_is_ipv4(addr)) {
|
||||
pj_enum_ip_interface(pj_AF_INET(), &count, address);
|
||||
} else if (ast_sockaddr_is_any(addr)) {
|
||||
pj_enum_ip_interface(pj_AF_UNSPEC(), &count, address);
|
||||
} else {
|
||||
pj_enum_ip_interface(pj_AF_INET6(), &count, address);
|
||||
}
|
||||
pj_enum_ip_interface(ast_sockaddr_is_ipv4(addr) ? pj_AF_INET() : pj_AF_INET6(), &count, address);
|
||||
|
||||
for (pos = 0; pos < count; pos++) {
|
||||
pj_sockaddr_set_port(&address[pos], port);
|
||||
|
Reference in New Issue
Block a user