- Formatting

- Changing debug messages from VERBOSE to DEBUG channel
- Adding a few todo's
- Adding a few more "XMPP"'s to compliment Jabber...



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@136005 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.1
Olle Johansson 17 years ago
parent 700d4501b8
commit a4436cb2ff

@ -17,12 +17,16 @@
*/
/*! \file
* \brief A resource for interfacing asterisk directly as a client
* or a component to a jabber compliant server.
* \brief A resource for interfacing Asterisk directly as a client
* or a component to a XMPP/Jabber compliant server.
*
* References:
* - http://www.xmpp.org - The XMPP standards foundation
*
* \extref Iksemel http://code.google.com/p/iksemel/
*
* \todo If you unload this module, chan_gtalk/jingle will be dead. How do we handle that?
* \todo Dialplan applications need RETURN variable, like JABBERSENDSTATUS
*
*/
@ -55,6 +59,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/astdb.h"
#include "asterisk/manager.h"
/*! \todo This should really be renamed to xmpp.conf. For backwards compatibility, we
need to read both files */
#define JABBER_CONFIG "jabber.conf"
#ifndef FALSE
@ -133,8 +139,8 @@ static char *ajisend_synopsis = "JabberSend(jabber,screenname,message)";
static char *ajisend_descrip =
"JabberSend(Jabber,ScreenName,Message)\n"
" Jabber - Client or transport Asterisk uses to connect to Jabber\n"
" ScreenName - User Name to message.\n"
" Message - Message to be sent to the buddy\n";
" ScreenName - XMPP/Jabber JID (Name) of recipient\n"
" Message - Message to be sent to the budd (UTF8)y\n";
static char *app_ajistatus = "JabberStatus";
@ -145,8 +151,9 @@ static char *ajistatus_descrip =
" Jabber - Client or transport Asterisk uses to connect to Jabber\n"
" ScreenName - User Name to retrieve status from.\n"
" Variable - Variable to store presence in will be 1-6.\n"
" In order, Online, Chatty, Away, XAway, DND, Offline\n"
" If not in roster variable will = 7\n";
" In order, 1=Online, 2=Chatty, 3=Away, 4=XAway, 5=DND, 6=Offline\n"
" If not in roster variable will be set to 7\n\n"
"Note: This application is deprecated. Please use the JABBER_STATUS() function instead.\n";
struct aji_client_container clients;
struct aji_capabilities *capabilities = NULL;
@ -407,13 +414,13 @@ static int acf_jabberstatus_read(struct ast_channel *chan, const char *name, cha
);
if (!data) {
ast_log(LOG_ERROR, "Usage: JABBER_STATUS(<sender>,<screenname>[/<resource>])\n");
ast_log(LOG_ERROR, "Usage: JABBER_STATUS(<sender>,<jid>[/<resource>])\n");
return 0;
}
AST_STANDARD_APP_ARGS(args, data);
if (args.argc != 2) {
ast_log(LOG_ERROR, "JABBER_STATUS requires 2 arguments.\n");
ast_log(LOG_ERROR, "JABBER_STATUS requires 2 arguments: sender and jid.\n");
return -1;
}
@ -445,8 +452,11 @@ static struct ast_custom_function jabberstatus_function = {
.syntax = "JABBER_STATUS(<sender>,<buddy>[/<resource>])",
.read = acf_jabberstatus_read,
.desc =
"Retrieves the numeric status associated with the specified buddy. If the\n"
"buddy does not exist in the buddylist, returns 7.\n",
"Retrieves the numeric status associated with the specified buddy (jid). If the\n"
"buddy does not exist in the buddylist, returns 7.\n"
"Status will be 1-7.\n"
" 1=Online, 2=Chatty, 3=Away, 4=XAway, 5=DND, 6=Offline\n"
" If not in roster variable will be set to 7\n\n",
};
/*!
@ -776,8 +786,9 @@ static void aji_log_hook(void *data, const char *xmpp, size_t size, int is_incom
ast_verbose("\nJABBER: %s INCOMING: %s\n", client->name, xmpp);
else {
if( strlen(xmpp) == 1) {
if(option_debug > 2 && xmpp[0] == ' ')
if(option_debug > 2 && xmpp[0] == ' ') {
ast_verbose("\nJABBER: Keep alive packet\n");
}
} else
ast_verbose("\nJABBER: %s OUTGOING: %s\n", client->name, xmpp);
}
@ -1040,7 +1051,7 @@ static int aji_act_hook(void *data, int type, iks *node)
return IKS_OK;
}
/*!
* \brief Uknown
* \brief Unknown
* \param data void
* \param pak ikspak
* \return IKS_FILTER_EAT.
@ -1083,7 +1094,7 @@ static int aji_register_approve_handler(void *data, ikspak *pak)
return IKS_FILTER_EAT;
}
/*!
* \brief register query
* \brief register handler for incoming querys (IQ's)
* \param data incoming aji_client request
* \param pak ikspak
* \return IKS_FILTER_EAT.
@ -1093,14 +1104,15 @@ static int aji_register_query_handler(void *data, ikspak *pak)
struct aji_client *client = ASTOBJ_REF((struct aji_client *) data);
struct aji_buddy *buddy = NULL;
char *node = NULL;
iks *iq = NULL, *query = NULL;
client = (struct aji_client *) data;
buddy = ASTOBJ_CONTAINER_FIND(&client->buddies, pak->from->partial);
if (!buddy) {
iks *iq = NULL, *query = NULL, *error = NULL, *notacceptable = NULL;
iks *error = NULL, *notacceptable = NULL;
ast_verbose("Someone.... %s tried to register but they aren't allowed\n", pak->from->partial);
ast_log(LOG_ERROR, "Someone.... %s tried to register but they aren't allowed\n", pak->from->partial);
iq = iks_new("iq");
query = iks_new("query");
error = iks_new("error");
@ -1122,12 +1134,10 @@ static int aji_register_query_handler(void *data, ikspak *pak)
ast_log(LOG_ERROR, "Out of memory.\n");
}
iks_delete(iq);
iks_delete(query);
iks_delete(error);
iks_delete(notacceptable);
} else if (!(node = iks_find_attrib(pak->query, "node"))) {
iks *iq = NULL, *query = NULL, *instructions = NULL;
iks *instructions = NULL;
char *explain = "Welcome to Asterisk - the Open Source PBX.\n";
iq = iks_new("iq");
query = iks_new("query");
@ -1146,10 +1156,10 @@ static int aji_register_query_handler(void *data, ikspak *pak)
ast_log(LOG_ERROR, "Out of memory.\n");
}
iks_delete(iq);
iks_delete(query);
iks_delete(instructions);
}
iks_delete(iq);
iks_delete(query);
ASTOBJ_UNREF(client, aji_client_destroy);
return IKS_FILTER_EAT;
}
@ -1264,7 +1274,7 @@ static int aji_client_info_handler(void *data, ikspak *pak)
resource = aji_find_resource(buddy, pak->from->resource);
if (pak->subtype == IKS_TYPE_RESULT) {
if (!resource) {
ast_log(LOG_NOTICE,"JABBER: Received client info from %s when not requested.\n", pak->from->full);
ast_log(LOG_NOTICE, "JABBER: Received client info from %s when not requested.\n", pak->from->full);
ASTOBJ_UNREF(client, aji_client_destroy);
return IKS_FILTER_EAT;
}
@ -1686,35 +1696,35 @@ static void aji_handle_presence(struct aji_client *client, ikspak *pak)
}
switch (pak->subtype) {
case IKS_TYPE_AVAILABLE:
ast_verb(5, "JABBER: I am available ^_* %i\n", pak->subtype);
ast_debug(3, "JABBER: I am available ^_* %i\n", pak->subtype);
break;
case IKS_TYPE_UNAVAILABLE:
ast_verb(5, "JABBER: I am unavailable ^_* %i\n", pak->subtype);
ast_debug(3, "JABBER: I am unavailable ^_* %i\n", pak->subtype);
break;
default:
ast_verb(5, "JABBER: Ohh sexy and the wrong type: %i\n", pak->subtype);
ast_debug(3, "JABBER: Ohh sexy and the wrong type: %i\n", pak->subtype);
}
switch (pak->show) {
case IKS_SHOW_UNAVAILABLE:
ast_verb(5, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
ast_debug(3, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
break;
case IKS_SHOW_AVAILABLE:
ast_verb(5, "JABBER: type is available\n");
ast_debug(3, "JABBER: type is available\n");
break;
case IKS_SHOW_CHAT:
ast_verb(5, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
ast_debug(3, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
break;
case IKS_SHOW_AWAY:
ast_verb(5, "JABBER: type is away\n");
ast_debug(3, "JABBER: type is away\n");
break;
case IKS_SHOW_XA:
ast_verb(5, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
ast_debug(3, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
break;
case IKS_SHOW_DND:
ast_verb(5, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
ast_debug(3, "JABBER: type: %i subtype %i\n", pak->subtype, pak->show);
break;
default:
ast_verb(5, "JABBER: Kinky! how did that happen %i\n", pak->show);
ast_debug(3, "JABBER: Kinky! how did that happen %i\n", pak->show);
}
}
@ -1893,7 +1903,7 @@ static void *aji_recv_loop(void *data)
int res = IKS_HOOK;
while(res != IKS_OK) {
ast_verb(4, "JABBER: Connecting.\n");
ast_debug(3, "JABBER: Connecting.\n");
res = aji_reconnect(client);
sleep(4);
}
@ -1901,7 +1911,7 @@ static void *aji_recv_loop(void *data)
do {
if (res == IKS_NET_RWERR || client->timeout == 0) {
while(res != IKS_OK) {
ast_verb(4, "JABBER: reconnecting.\n");
ast_debug(3, "JABBER: reconnecting.\n");
res = aji_reconnect(client);
sleep(4);
}
@ -1921,7 +1931,7 @@ static void *aji_recv_loop(void *data)
if (res == IKS_HOOK)
ast_log(LOG_WARNING, "JABBER: Got hook event.\n");
else if (res == IKS_NET_TLSFAIL)
ast_log(LOG_WARNING, "JABBER: Failure in TLS.\n");
ast_log(LOG_ERROR, "JABBER: Failure in TLS.\n");
else if (client->timeout == 0 && client->state == AJI_CONNECTED) {
res = client->keepalive ? aji_send_raw(client, " ") : IKS_OK;
if(res == IKS_OK)
@ -2046,6 +2056,7 @@ static int aji_register_transport2(void *data, ikspak *pak)
* \brief goes through roster and prunes users not needed in list, or adds them accordingly.
* \param client the configured XMPP client we use to connect to a XMPP server
* \return void.
* \note The messages here should be configurable.
*/
static void aji_pruneregister(struct aji_client *client)
{
@ -2067,10 +2078,10 @@ static void aji_pruneregister(struct aji_client *client)
* be called at the same time */
if (ast_test_flag(&iterator->flags, AJI_AUTOPRUNE)) {
res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_UNSUBSCRIBE, iterator->name,
"GoodBye your status is no longer needed by Asterisk the Open Source PBX"
"GoodBye. Your status is no longer needed by Asterisk the Open Source PBX"
" so I am no longer subscribing to your presence.\n"));
res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_UNSUBSCRIBED, iterator->name,
"GoodBye you are no longer in the asterisk config file so I am removing"
"GoodBye. You are no longer in the Asterisk config file so I am removing"
" your access to my presence.\n"));
iks_insert_attrib(removeiq, "from", client->jid->full);
iks_insert_attrib(removeiq, "type", "set");
@ -2080,7 +2091,7 @@ static void aji_pruneregister(struct aji_client *client)
res = ast_aji_send(client, removeiq);
} else if (ast_test_flag(&iterator->flags, AJI_AUTOREGISTER)) {
res = ast_aji_send(client, iks_make_s10n(IKS_TYPE_SUBSCRIBE, iterator->name,
"Greetings I am the Asterisk Open Source PBX and I want to subscribe to your presence\n"));
"Greetings! I am the Asterisk Open Source PBX and I want to subscribe to your presence\n"));
ast_clear_flag(&iterator->flags, AJI_AUTOREGISTER);
}
ASTOBJ_UNLOCK(iterator);
@ -2178,6 +2189,7 @@ static int aji_filter_roster(void *data, ikspak *pak)
ASTOBJ_UNREF(client, aji_client_destroy);
return IKS_FILTER_EAT;
}
/*!
* \brief reconnect to jabber server
* \param client the configured XMPP client we use to connect to a XMPP server
@ -2199,6 +2211,7 @@ static int aji_reconnect(struct aji_client *client)
return res;
}
/*!
* \brief Get the roster of jabber users
* \param client the configured XMPP client we use to connect to a XMPP server
@ -2348,7 +2361,7 @@ static char *aji_do_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_a
e->command = "jabber set debug {on|off}";
e->usage =
"Usage: jabber set debug {on|off}\n"
" Enables/disables dumping of Jabber packets for debugging purposes.\n";
" Enables/disables dumping of XMPP/Jabber packets for debugging purposes.\n";
return NULL;
case CLI_GENERATE:
return NULL;

Loading…
Cancel
Save