Add distributed devicestate via the XMPP protocol.
[asterisk/asterisk.git] / include / asterisk / jabber.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2010, Digium, Inc.
5  *
6  * Matt O'Gorman <mogorman@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  * \brief AJI - The Asterisk Jabber Interface
21  * \arg \ref AJI_intro
22  * \ref res_jabber.c
23  * \author Matt O'Gorman <mogorman@digium.com>
24  * \extref IKSEMEL http://iksemel.jabberstudio.org
25  *
26  * \page AJI_intro AJI - The Asterisk Jabber Interface
27  * 
28  * The Asterisk Jabber Interface, AJI, publishes an API for
29  * modules to use jabber communication. res_jabber.c implements
30  * a Jabber client and a component that can connect as a service
31  * to Jabber servers.
32  *
33  * \section External dependencies
34  * AJI use the IKSEMEL library found at http://iksemel.jabberstudio.org/
35  *
36  * \section Files
37  * - res_jabber.c
38  * - jabber.h
39  * - chan_gtalk.c
40  *
41  */
42
43 #ifndef _ASTERISK_JABBER_H
44 #define _ASTERISK_JABBER_H
45
46 #ifdef HAVE_OPENSSL
47
48 #include <openssl/ssl.h>
49 #include <openssl/err.h>
50 #define TRY_SECURE 2
51 #define SECURE 4
52
53 #endif /* HAVE_OPENSSL */
54 /* file is read by blocks with this size */
55 #define NET_IO_BUF_SIZE 4096
56 /* Return value for timeout connection expiration */
57 #define IKS_NET_EXPIRED 12
58
59 #include <iksemel.h>
60 #include "asterisk/astobj.h"
61 #include "asterisk/linkedlists.h"
62
63 /* 
64  * As per RFC 3920 - section 3.1, the maximum length for a full Jabber ID 
65  * is 3071 bytes.
66  * The ABNF syntax for jid :
67  * jid = [node "@" ] domain [ "/" resource ]
68  * Each allowable portion of a JID (node identifier, domain identifier,
69  * and resource identifier) MUST NOT be more than 1023 bytes in length,
70  * resulting in a maximum total size (including the '@' and '/' separators) 
71  * of 3071 bytes.
72  */
73 #define AJI_MAX_JIDLEN 3071
74 #define AJI_MAX_RESJIDLEN 1023
75
76 #define MUC_NS "http://jabber.org/protocol/muc"
77
78 enum aji_state {
79         AJI_DISCONNECTING,
80         AJI_DISCONNECTED,
81         AJI_CONNECTING,
82         AJI_CONNECTED
83 };
84
85 enum {
86         AJI_AUTOPRUNE = (1 << 0),
87         AJI_AUTOREGISTER = (1 << 1),
88         AJI_AUTOACCEPT = (1 << 2),
89 };
90
91 enum {
92         AJI_XEP0248 = (1 << 0),
93         AJI_PUBSUB = (1 << 1),
94         AJI_PUBSUB_AUTOCREATE = (1 << 2),
95 };
96
97 enum aji_btype {
98         AJI_USER = 0,
99         AJI_TRANS = 1,
100         AJI_UTRANS = 2,
101 };
102
103 struct aji_version {
104         char version[50];
105         int jingle;
106         struct aji_capabilities *parent;
107         struct aji_version *next;
108 };
109
110 struct aji_capabilities {
111         char node[200];
112         struct aji_version *versions;
113         struct aji_capabilities *next;
114 };
115
116 struct aji_resource {
117         int status;
118         char resource[AJI_MAX_RESJIDLEN];
119         char *description;
120         struct aji_version *cap;
121         int priority;
122         struct aji_resource *next;
123 };
124
125 struct aji_message {
126         char *from;
127         char *message;
128         char id[25];
129         struct timeval arrived;
130         AST_LIST_ENTRY(aji_message) list;
131 };
132
133 struct aji_buddy {
134         ASTOBJ_COMPONENTS_FULL(struct aji_buddy, AJI_MAX_JIDLEN, 1);
135         char channel[160];
136         struct aji_resource *resources;
137         enum aji_btype btype;
138         struct ast_flags flags;
139 };
140
141 struct aji_buddy_container {
142         ASTOBJ_CONTAINER_COMPONENTS(struct aji_buddy);
143 };
144
145 struct aji_transport_container {
146         ASTOBJ_CONTAINER_COMPONENTS(struct aji_transport);
147 };
148
149 struct aji_client {
150         ASTOBJ_COMPONENTS(struct aji_client);
151         char password[160];
152         char user[AJI_MAX_JIDLEN];
153         char serverhost[AJI_MAX_RESJIDLEN];
154         char pubsub_node[AJI_MAX_RESJIDLEN];
155         char statusmessage[256];
156         char name_space[256];
157         char sid[10]; /* Session ID */
158         char mid[6]; /* Message ID */
159         iksid *jid;
160         iksparser *p;
161         iksfilter *f;
162         ikstack *stack;
163 #ifdef HAVE_OPENSSL
164         SSL_CTX *ssl_context;
165         SSL *ssl_session;
166         SSL_METHOD *ssl_method;
167         unsigned int stream_flags;
168 #endif /* HAVE_OPENSSL */
169         enum aji_state state;
170         int port;
171         int debug;
172         int usetls;
173         int forcessl;
174         int usesasl;
175         int keepalive;
176         int allowguest;
177         int timeout;
178         int message_timeout;
179         int authorized;
180         int distribute_events;
181         struct ast_flags flags;
182         int component; /* 0 client,  1 component */
183         struct aji_buddy_container buddies;
184         AST_LIST_HEAD(messages,aji_message) messages;
185         void *jingle;
186         pthread_t thread;
187         int priority;
188         enum ikshowtype status;
189 };
190
191 struct aji_client_container{
192         ASTOBJ_CONTAINER_COMPONENTS(struct aji_client);
193 };
194
195 /* !Send XML stanza over the established XMPP connection */
196 int ast_aji_send(struct aji_client *client, iks *x);
197 /*! Send jabber chat message from connected client to jabber URI */
198 int ast_aji_send_chat(struct aji_client *client, const char *address, const char *message);
199 /*! Send jabber chat message from connected client to a groupchat using 
200  *  a given nickname */
201 int ast_aji_send_groupchat(struct aji_client *client, const char *nick, const char *address, const char *message);
202 /*! Disconnect jabber client */
203 int ast_aji_disconnect(struct aji_client *client);
204 int ast_aji_check_roster(void);
205 void ast_aji_increment_mid(char *mid);
206 /*! Open Chat session */
207 int ast_aji_create_chat(struct aji_client *client,char *room, char *server, char *topic);
208 /*! Invite to opened Chat session */
209 int ast_aji_invite_chat(struct aji_client *client, char *user, char *room, char *message);
210 /*! Join/leave existing Chat session */
211 int ast_aji_join_chat(struct aji_client *client, char *room, char *nick);
212 int ast_aji_leave_chat(struct aji_client *client, char *room, char *nick);
213 struct aji_client *ast_aji_get_client(const char *name);
214 struct aji_client_container *ast_aji_get_clients(void);
215
216 #endif