[asterisk-commits] file: branch file/res_xmpp r367975 - in /team/file/res_xmpp: include/asterisk...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed May 30 11:39:19 CDT 2012
Author: file
Date: Wed May 30 11:39:15 2012
New Revision: 367975
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=367975
Log:
Add some locking to protect the message ID, which can be used from multiple threads, and support the buddy configuration option.
Modified:
team/file/res_xmpp/include/asterisk/xmpp.h
team/file/res_xmpp/res/res_xmpp.c
Modified: team/file/res_xmpp/include/asterisk/xmpp.h
URL: http://svnview.digium.com/svn/asterisk/team/file/res_xmpp/include/asterisk/xmpp.h?view=diff&rev=367975&r1=367974&r2=367975
==============================================================================
--- team/file/res_xmpp/include/asterisk/xmpp.h (original)
+++ team/file/res_xmpp/include/asterisk/xmpp.h Wed May 30 11:39:15 2012
@@ -177,6 +177,20 @@
void ast_xmpp_client_unref(struct ast_xmpp_client *client);
/*!
+ * \brief Lock an XMPP client connection
+ *
+ * \param client Pointer to the client
+ */
+void ast_xmpp_client_lock(struct ast_xmpp_client *client);
+
+/*!
+ * \brief Unlock an XMPP client connection
+ *
+ * \param client Pointer to the client
+ */
+void ast_xmpp_client_unlock(struct ast_xmpp_client *client);
+
+/*!
* \brief Send an XML stanza out using an established XMPP client connection
*
* \param client Pointer to the client
Modified: team/file/res_xmpp/res/res_xmpp.c
URL: http://svnview.digium.com/svn/asterisk/team/file/res_xmpp/res/res_xmpp.c?view=diff&rev=367975&r1=367974&r2=367975
==============================================================================
--- team/file/res_xmpp/res/res_xmpp.c (original)
+++ team/file/res_xmpp/res/res_xmpp.c Wed May 30 11:39:15 2012
@@ -504,6 +504,16 @@
ao2_ref(client, -1);
}
+void ast_xmpp_client_lock(struct ast_xmpp_client *client)
+{
+ ao2_lock(client);
+}
+
+void ast_xmpp_client_unlock(struct ast_xmpp_client *client)
+{
+ ao2_unlock(client);
+}
+
/*! \brief Internal function used to send a message to a user or chatroom */
static int xmpp_client_send_message(struct ast_xmpp_client *client, int group, const char *nick, const char *address, const char *message)
{
@@ -546,8 +556,10 @@
}
iks_insert_attrib(invite, "to", user);
+ ast_xmpp_client_lock(client);
iks_insert_attrib(invite, "id", client->mid);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
iks_insert_cdata(body, message, 0);
iks_insert_node(invite, body);
iks_insert_attrib(namespace, "xmlns", "jabber:x:conference");
@@ -644,8 +656,10 @@
iks_insert_attrib(request, "to", client->pubsubnode);
iks_insert_attrib(request, "from", client->jid->full);
iks_insert_attrib(request, "type", type);
+ ast_xmpp_client_lock(client);
ast_xmpp_increment_mid(client->mid);
iks_insert_attrib(request, "id", client->mid);
+ ast_xmpp_client_unlock(client);
return request;
}
@@ -1752,7 +1766,7 @@
ast_copy_string(buddy->id, id, sizeof(buddy->id));
- /* Assume we need to get subscribe to get their presence until proven otherwise */
+ /* Assume we need to subscribe to get their presence until proven otherwise */
buddy->subscribe = 1;
ao2_link(client->buddies, buddy);
@@ -2202,15 +2216,17 @@
ast_sha1_hash(buf, sidpass);
iks_insert_cdata(iks_insert(query, "digest"), buf, 0);
+ ast_xmpp_client_lock(client);
+ iks_filter_add_rule(client->filter, xmpp_connect_hook, client, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_SUBTYPE, IKS_TYPE_RESULT, IKS_RULE_ID, client->mid, IKS_RULE_DONE);
iks_insert_attrib(iq, "id", client->mid);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
+
iks_insert_attrib(iq, "to", client->jid->server);
ast_xmpp_client_send(client, iq);
iks_delete(iq);
-
- iks_filter_add_rule(client->filter, xmpp_connect_hook, client, IKS_RULE_TYPE, IKS_PAK_IQ, IKS_RULE_SUBTYPE, IKS_TYPE_RESULT, IKS_RULE_ID, client->mid, IKS_RULE_DONE);
xmpp_client_change_state(client, XMPP_STATE_AUTHENTICATING);
@@ -2303,8 +2319,10 @@
return -1;
}
+ ast_xmpp_client_lock(client);
iks_insert_attrib(auth, "id", client->mid);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
ast_xmpp_client_send(client, auth);
iks_delete(auth);
@@ -2321,7 +2339,9 @@
}
iks_insert_attrib(auth, "id", "auth");
+ ast_xmpp_client_lock(client);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
ast_xmpp_client_send(client, auth);
iks_delete(auth);
@@ -2519,8 +2539,10 @@
iks_insert_attrib(presence, "from", client->jid->full);
iks_insert_attrib(presence, "to", pak->from->partial);
+ ast_xmpp_client_lock(client);
iks_insert_attrib(presence, "id", client->mid);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
iks_insert_attrib(presence, "type", "subscribe");
iks_insert_attrib(x, "xmlns", "vcard-temp:x:update");
@@ -2637,10 +2659,14 @@
if ((msg = ast_msg_alloc())) {
int res;
+ ast_xmpp_client_lock(client);
+
res = ast_msg_set_to(msg, "xmpp:%s", client->user);
res |= ast_msg_set_from(msg, "xmpp:%s", message->from);
res |= ast_msg_set_body(msg, "%s", message->message);
res |= ast_msg_set_context(msg, "%s", client->context);
+
+ ast_xmpp_client_unlock(client);
if (res) {
ast_msg_destroy(msg);
@@ -2680,8 +2706,10 @@
iks_insert_attrib(iq, "type", "get");
iks_insert_attrib(iq, "to", to);
iks_insert_attrib(iq, "from", from);
+ ast_xmpp_client_lock(client);
iks_insert_attrib(iq, "id", client->mid);
ast_xmpp_increment_mid(client->mid);
+ ast_xmpp_client_unlock(client);
iks_insert_attrib(query, "xmlns", "http://jabber.org/protocol/disco#info");
iks_insert_node(iq, query);
@@ -3189,6 +3217,26 @@
}
}
+/*! \brief Helper function which interpets a buddy configuration value and stores it on a client */
+static void store_config_buddy(struct ast_xmpp_client *client, const char *value)
+{
+ struct ast_xmpp_buddy *buddy;
+
+ ao2_lock(client->buddies);
+
+ /* If the buddy already exists in the roster don't bother adding it */
+ if ((buddy = ao2_find(client->buddies, value, OBJ_KEY | OBJ_NOLOCK))) {
+ ao2_unlock(client->buddies);
+ return;
+ }
+
+ if ((buddy = xmpp_client_create_buddy(client, value))) {
+ ao2_ref(buddy, -1);
+ }
+
+ ao2_unlock(client->buddies);
+}
+
/*! \brief Internal function used to store client configuration information */
static void store_config_client(struct ast_config *cfg, const char *category)
{
@@ -3276,8 +3324,7 @@
CV_STR("context", client->context);
CV_F("sendtodialplan", ast_set2_flag(&client->flags, ast_true(__val), XMPP_SEND_TO_DIALPLAN));
CV_F("status", store_config_status(client, __val));
-
- /* Items to do: buddy */
+ CV_F("buddy", store_config_buddy(client, __val));
CV_END;
}
More information about the asterisk-commits
mailing list