Compare commits

..

27 Commits

Author SHA1 Message Date
Asterisk Autobuilder
6194419ed9 Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400619 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 23:19:36 +00:00
Asterisk Autobuilder
99b1bb8cec Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400618 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 23:19:25 +00:00
Asterisk Autobuilder
22a7d3a837 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400617 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 18:10:25 +00:00
Asterisk Autobuilder
5eba3cf47a Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400615 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 18:05:44 +00:00
Asterisk Autobuilder
f534804779 Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400613 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 17:59:44 +00:00
Asterisk Autobuilder
a51f4134cd Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400612 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 17:59:37 +00:00
Asterisk Autobuilder
511b82563b Importing files for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400611 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 17:59:32 +00:00
Asterisk Autobuilder
c81e14022b Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400610 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 17:36:58 +00:00
Asterisk Autobuilder
9b1a126de6 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400608 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 03:28:07 +00:00
Asterisk Autobuilder
2c38d5c164 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400607 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:53:27 +00:00
Asterisk Autobuilder
95fc980bb4 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400606 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:43:26 +00:00
Asterisk Autobuilder
bf5f59b4eb Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400605 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:34:49 +00:00
Asterisk Autobuilder
087832c0a8 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400604 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:34:41 +00:00
Asterisk Autobuilder
3ff7c8f73f Importing files for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400603 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:34:29 +00:00
Asterisk Autobuilder
81203c99fd Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400602 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 02:27:12 +00:00
Asterisk Autobuilder
0d9cf022f5 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400592 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:55:38 +00:00
Asterisk Autobuilder
7d29b7b25e Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400591 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:46:38 +00:00
Asterisk Autobuilder
1a762d7220 Importing release summary for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400590 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:46:28 +00:00
Asterisk Autobuilder
5f2fc8aa90 Importing files for 12.0.0-alpha2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400589 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:46:22 +00:00
Asterisk Autobuilder
86f01e4e09 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400587 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:39:24 +00:00
Asterisk Autobuilder
dc6a876c45 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400585 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:28:39 +00:00
Asterisk Autobuilder
c1a658bbab Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400583 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-05 00:21:23 +00:00
Asterisk Autobuilder
1dff370bc0 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400572 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-04 21:57:11 +00:00
Asterisk Autobuilder
2fae3ff073 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400570 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-04 21:43:24 +00:00
Asterisk Autobuilder
c920b4e329 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400566 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-04 21:32:30 +00:00
Asterisk Autobuilder
2ea015bc68 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400564 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-04 21:17:10 +00:00
Asterisk Autobuilder
9c33b20357 Creating tag for the release of asterisk-12.0.0-alpha2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/12.0.0-alpha2@400562 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-10-04 21:12:41 +00:00
23 changed files with 498 additions and 20655 deletions

View File

@@ -1 +0,0 @@
40

View File

@@ -1 +0,0 @@
12.0.0-beta1

View File

@@ -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

19337
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@@ -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);

View File

@@ -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;

View File

@@ -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)

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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">&lt;asteriskteam@digium.com&gt;</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>

View File

@@ -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(-)
----------------------------------------------------------------------

View File

@@ -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
View File

@@ -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

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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)",

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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,);

View File

@@ -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);