aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-09-21 04:37:44 +0000
committertwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2010-09-21 04:37:44 +0000
commit03f32acaba14633bc3b2990f058f0139ad791264 (patch)
treec232628c6e77b960bfdb64ab12080c41fa8902cf /main
parent4ec51d628c472a790a32e5a630debd0bf27e4447 (diff)
Don't generate connected line buffer twice for comparison
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.8@287833 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/channel.c35
1 files changed, 6 insertions, 29 deletions
diff --git a/main/channel.c b/main/channel.c
index 6e3758763..96f648344 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -8227,44 +8227,21 @@ int ast_connected_line_parse_data(const unsigned char *data, size_t datalen, str
return 0;
}
-/*! \brief Determine if two ast_party_connected_line structures differ
- *
- * \param c1 One of the structs to compare
- * \param c2 The other struct to compare
- * \retval 0 No difference or one of the structs is NULL
- * \retval non-zero The structs differ
- */
-static int connected_line_differ(const struct ast_party_connected_line *c1, const struct ast_party_connected_line *c2)
-{
- unsigned char buf1[1024] = { 0, };
- unsigned char buf2[sizeof(buf1)] = { 0, };
-
- if (!c1 || !c2) {
- return 0;
- }
-
- ast_connected_line_build_data(buf1, sizeof(buf1), c1, NULL);
- ast_connected_line_build_data(buf2, sizeof(buf2), c2, NULL);
-
- return memcmp(buf1, buf2, sizeof(buf1));
-}
-
void ast_channel_update_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)
{
- unsigned char data[1024]; /* This should be large enough */
+ unsigned char data[1024] = { 0, }; /* This should be large enough */
+ unsigned char data2[sizeof(data)] = { 0, };
size_t datalen;
- if (!connected_line_differ(&chan->connected, connected)) {
- ast_debug(1, "No change, so ignoring update\n");
- return;
- }
-
datalen = ast_connected_line_build_data(data, sizeof(data), connected, update);
if (datalen == (size_t) -1) {
return;
}
- ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
+ /* Only send an update if the connected line info is different or the channels info is suspect */
+ if (ast_connected_line_build_data(data2, sizeof(data2), &chan->connected, update) == -1 || memcmp(data, data2, sizeof(data))) {
+ ast_indicate_data(chan, AST_CONTROL_CONNECTED_LINE, data, datalen);
+ }
}
void ast_channel_queue_connected_line_update(struct ast_channel *chan, const struct ast_party_connected_line *connected, const struct ast_set_party_connected_line *update)