Make the status and priority configurable.
[asterisk/asterisk.git] / include / asterisk / jabber.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, 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  * To use TLS connections, IKSEMEL depends on the GNUTLS library
36  * available at http://iksemel.jabberstudio.org/
37  *
38  * \section Files
39  * - res_jabber.c
40  * - jabber.h
41  * - chan_gtalk.c
42  *
43  */
44
45 #ifndef _ASTERISK_JABBER_H
46 #define _ASTERISK_JABBER_H
47
48 #include <iksemel.h>
49 #include "asterisk/astobj.h"
50 #include "asterisk/linkedlists.h"
51
52 /* 
53  * As per RFC 3920 - section 3.1, the maximum length for a full Jabber ID 
54  * is 3071 bytes.
55  * The ABNF syntax for jid :
56  * jid = [node "@" ] domain [ "/" resource ]
57  * Each allowable portion of a JID (node identifier, domain identifier,
58  * and resource identifier) MUST NOT be more than 1023 bytes in length,
59  * resulting in a maximum total size (including the '@' and '/' separators) 
60  * of 3071 bytes.
61  */
62 #define AJI_MAX_JIDLEN 3071
63 #define AJI_MAX_RESJIDLEN 1023
64
65 enum aji_state {
66         AJI_DISCONNECTING,
67         AJI_DISCONNECTED,
68         AJI_CONNECTING,
69         AJI_CONNECTED
70 };
71
72 enum {
73         AJI_AUTOPRUNE = (1 << 0),
74         AJI_AUTOREGISTER = (1 << 1)
75 };
76
77 enum aji_btype {
78         AJI_USER=0,
79         AJI_TRANS=1,
80         AJI_UTRANS=2
81 };
82
83 struct aji_version {
84         char version[50];
85         int jingle;
86         struct aji_capabilities *parent;
87         struct aji_version *next;
88 };
89
90 struct aji_capabilities {
91         char node[200];
92         struct aji_version *versions;
93         struct aji_capabilities *next;
94 };
95
96 struct aji_resource {
97         int status;
98         char resource[AJI_MAX_RESJIDLEN];
99         char *description;
100         struct aji_version *cap;
101         int priority;
102         struct aji_resource *next;
103 };
104
105 struct aji_message {
106         char *from;
107         char *message;
108         char id[25];
109         time_t arrived;
110         AST_LIST_ENTRY(aji_message) list;
111 };
112
113 struct aji_buddy {
114         ASTOBJ_COMPONENTS_FULL(struct aji_buddy, AJI_MAX_JIDLEN, 1);
115         char channel[160];
116         struct aji_resource *resources;
117         enum aji_btype btype;
118         unsigned int flags;
119 };
120
121 struct aji_buddy_container {
122         ASTOBJ_CONTAINER_COMPONENTS(struct aji_buddy);
123 };
124
125 struct aji_transport_container {
126         ASTOBJ_CONTAINER_COMPONENTS(struct aji_transport);
127 };
128
129 struct aji_client {
130         ASTOBJ_COMPONENTS(struct aji_client);
131         char password[160];
132         char user[AJI_MAX_JIDLEN];
133         char serverhost[AJI_MAX_RESJIDLEN];
134         char statusmessage[256];
135         char sid[10]; /* Session ID */
136         char mid[6]; /* Message ID */
137         iksid *jid;
138         iksparser *p;
139         iksfilter *f;
140         ikstack *stack;
141         enum aji_state state;
142         int port;
143         int debug;
144         int usetls;
145         int forcessl;
146         int usesasl;
147         int keepalive;
148         int allowguest;
149         int timeout;
150         int message_timeout;
151         int authorized;
152         unsigned int flags;
153         int component; /* 0 client,  1 component */
154         struct aji_buddy_container buddies;
155         AST_LIST_HEAD(messages,aji_message) messages;
156         void *jingle;
157         pthread_t thread;
158         int priority;
159         enum ikshowtype status;
160 };
161
162 struct aji_client_container{
163         ASTOBJ_CONTAINER_COMPONENTS(struct aji_client);
164 };
165
166 /*! Send jabber message from connected client to jabber URI */
167 int ast_aji_send(struct aji_client *client, const char *address, const char *message);
168 /*! Disconnect jabber client */
169 int ast_aji_disconnect(struct aji_client *client);
170 int ast_aji_check_roster(void);
171 void ast_aji_increment_mid(char *mid);
172 /*! Open Chat session */
173 int ast_aji_create_chat(struct aji_client *client,char *room, char *server, char *topic);
174 /*! Invite to opened Chat session */
175 int ast_aji_invite_chat(struct aji_client *client, char *user, char *room, char *message);
176 /*! Join existing Chat session */
177 int ast_aji_join_chat(struct aji_client *client,char *room);
178 struct aji_client *ast_aji_get_client(const char *name);
179 struct aji_client_container *ast_aji_get_clients(void);
180
181 #endif