1 /* iksemel (XML parser for Jabber)
2 ** Copyright (C) 2000-2004 Gurer Ozen <madcat@e-kolay.net>
3 ** This code is free software; you can redistribute it and/or
4 ** modify it under the terms of GNU Lesser General Public License.
11 #include <cstddef> /* size_t for C++ */
14 #include <stddef.h> /* size_t for C */
17 /***** object stack *****/
19 struct ikstack_struct;
20 typedef struct ikstack_struct ikstack;
22 ikstack *iks_stack_new (size_t meta_chunk, size_t data_chunk);
23 void *iks_stack_alloc (ikstack *s, size_t size);
24 char *iks_stack_strdup (ikstack *s, const char *src, size_t len);
25 char *iks_stack_strcat (ikstack *s, char *old, size_t old_len, const char *src, size_t src_len);
26 void iks_stack_stat (ikstack *s, size_t *allocated, size_t *used);
27 void iks_stack_delete (ikstack *s);
29 /***** utilities *****/
31 void *iks_malloc (size_t size);
32 void iks_free (void *ptr);
33 void iks_set_mem_funcs (void *(*malloc_func)(size_t size), void (*free_func)(void *ptr));
35 char *iks_strdup (const char *src);
36 char *iks_strcat (char *dest, const char *src);
37 int iks_strcmp (const char *a, const char *b);
38 int iks_strcasecmp (const char *a, const char *b);
39 int iks_strncmp (const char *a, const char *b, size_t n);
40 int iks_strncasecmp (const char *a, const char *b, size_t n);
41 size_t iks_strlen (const char *src);
42 char *iks_escape (ikstack *s, char *src, size_t len);
43 char *iks_unescape (ikstack *s, char *src, size_t len);
45 /***** dom tree *****/
55 typedef struct iks_struct iks;
57 iks *iks_new (const char *name);
58 iks *iks_new_within (const char *name, ikstack *s);
59 iks *iks_insert (iks *x, const char *name);
60 iks *iks_insert_cdata (iks *x, const char *data, size_t len);
61 iks *iks_insert_attrib (iks *x, const char *name, const char *value);
62 iks *iks_insert_node (iks *x, iks *y);
63 void iks_hide (iks *x);
64 void iks_delete (iks *x);
65 iks *iks_next (iks *x);
66 iks *iks_next_tag (iks *x);
67 iks *iks_prev (iks *x);
68 iks *iks_prev_tag (iks *x);
69 iks *iks_parent (iks *x);
70 iks *iks_root (iks *x);
71 iks *iks_child (iks *x);
72 iks *iks_first_tag (iks *x);
73 iks *iks_attrib (iks *x);
74 iks *iks_find (iks *x, const char *name);
75 char *iks_find_cdata (iks *x, const char *name);
76 char *iks_find_attrib (iks *x, const char *name);
77 iks *iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value);
78 ikstack *iks_stack (iks *x);
79 enum ikstype iks_type (iks *x);
80 char *iks_name (iks *x);
81 char *iks_cdata (iks *x);
82 size_t iks_cdata_size (iks *x);
83 int iks_has_children (iks *x);
84 int iks_has_attribs (iks *x);
85 char *iks_string (ikstack *s, iks *x);
86 iks *iks_copy (iks *x);
87 iks *iks_copy_within (iks *x, ikstack *s);
89 /***** sax parser *****/
104 typedef int (iksTagHook)(void *user_data, char *name, char **atts, int type);
105 typedef int (iksCDataHook)(void *user_data, char *data, size_t len);
106 typedef void (iksDeleteHook)(void *user_data);
108 struct iksparser_struct;
109 typedef struct iksparser_struct iksparser;
111 iksparser *iks_sax_new (void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook);
112 iksparser *iks_sax_extend (ikstack *s, void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook, iksDeleteHook *deleteHook);
113 ikstack *iks_parser_stack (iksparser *prs);
114 void *iks_user_data (iksparser *prs);
115 unsigned long iks_nr_bytes (iksparser *prs);
116 unsigned long iks_nr_lines (iksparser *prs);
117 int iks_parse (iksparser *prs, const char *data, size_t len, int finish);
118 void iks_parser_reset (iksparser *prs);
119 void iks_parser_delete (iksparser *prs);
121 /***** dom parser *****/
129 iksparser *iks_dom_new (iks **iksptr);
130 void iks_set_size_hint (iksparser *prs, size_t approx_size);
131 iks *iks_tree (const char *xml_str, size_t len, int *err);
132 int iks_load (const char *fname, iks **xptr);
133 int iks_save (const char *fname, iks *x);
135 /***** transport layer *****/
137 typedef void (iksTClose)(void *socket);
138 typedef int (iksTConnect)(iksparser *prs, void **socketptr, const char *server, int port);
139 typedef int (iksTSend)(void *socket, const char *data, size_t len);
140 typedef int (iksTRecv)(void *socket, char *buffer, size_t buf_len, int timeout);
141 typedef int (iksTConnectFD)(iksparser *prs, void **socketptr, void *fd);
142 typedef void *(iksTGetFD)(void *socket);
144 enum iksasyncevents {
154 typedef int (iksAsyncNotify)(void *user_data, int event, void *event_data);
155 typedef int (iksTConnectAsync)(iksparser *prs, void **socketptr, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func);
157 typedef struct ikstransport_struct {
158 /* basic api, connect can be NULL if one of the other connect funcs are used */
159 iksTConnect *connect;
163 /* optional fd api */
164 iksTConnectFD *connect_fd;
166 /* optional async api */
167 iksTConnectAsync *connect_async;
170 extern ikstransport iks_default_transport;
172 /***** stream parser *****/
195 #define IKS_JABBER_PORT 5222
197 typedef int (iksStreamHook)(void *user_data, int type, iks *node);
198 typedef void (iksLogHook)(void *user_data, const char *data, size_t size, int is_incoming);
200 iksparser *iks_stream_new (char *name_space, void *user_data, iksStreamHook *streamHook);
201 void *iks_stream_user_data (iksparser *prs);
202 void iks_set_log_hook (iksparser *prs, iksLogHook *logHook);
203 int iks_connect_tcp (iksparser *prs, const char *server, int port);
204 int iks_connect_fd (iksparser *prs, int fd);
205 int iks_connect_via (iksparser *prs, const char *server, int port, const char *server_name);
206 int iks_connect_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans);
207 int iks_connect_async (iksparser *prs, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func);
208 int iks_connect_async_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans, void *notify_data, iksAsyncNotify *notify_func);
209 int iks_fd (iksparser *prs);
210 int iks_recv (iksparser *prs, int timeout);
211 int iks_send_header (iksparser *prs, const char *to);
212 int iks_send (iksparser *prs, iks *x);
213 int iks_send_raw (iksparser *prs, const char *xmlstr);
214 void iks_disconnect (iksparser *prs);
215 int iks_has_tls (void);
216 int iks_is_secure (iksparser *prs);
217 int iks_start_tls (iksparser *prs);
218 int iks_start_sasl (iksparser *prs, enum ikssasltype type, char *username, char *pass);
222 #define IKS_NS_CLIENT "jabber:client"
223 #define IKS_NS_SERVER "jabber:server"
224 #define IKS_NS_AUTH "jabber:iq:auth"
225 #define IKS_NS_AUTH_0K "jabber:iq:auth:0k"
226 #define IKS_NS_REGISTER "jabber:iq:register"
227 #define IKS_NS_ROSTER "jabber:iq:roster"
228 #define IKS_NS_XROSTER "jabber:x:roster"
229 #define IKS_NS_OFFLINE "jabber:x:offline"
230 #define IKS_NS_AGENT "jabber:iq:agent"
231 #define IKS_NS_AGENTS "jabber:iq:agents"
232 #define IKS_NS_BROWSE "jabber:iq:browse"
233 #define IKS_NS_CONFERENCE "jabber:iq:conference"
234 #define IKS_NS_DELAY "jabber:x:delay"
235 #define IKS_NS_VERSION "jabber:iq:version"
236 #define IKS_NS_TIME "jabber:iq:time"
237 #define IKS_NS_VCARD "vcard-temp"
238 #define IKS_NS_PRIVATE "jabber:iq:private"
239 #define IKS_NS_SEARCH "jabber:iq:search"
240 #define IKS_NS_OOB "jabber:iq:oob"
241 #define IKS_NS_XOOB "jabber:x:oob"
242 #define IKS_NS_ADMIN "jabber:iq:admin"
243 #define IKS_NS_FILTER "jabber:iq:filter"
244 #define IKS_NS_GATEWAY "jabber:iq:gateway"
245 #define IKS_NS_LAST "jabber:iq:last"
246 #define IKS_NS_SIGNED "jabber:x:signed"
247 #define IKS_NS_ENCRYPTED "jabber:x:encrypted"
248 #define IKS_NS_ENVELOPE "jabber:x:envelope"
249 #define IKS_NS_EVENT "jabber:x:event"
250 #define IKS_NS_EXPIRE "jabber:x:expire"
251 #define IKS_NS_XHTML "http://www.w3.org/1999/xhtml"
252 #define IKS_NS_XMPP_SASL "urn:ietf:params:xml:ns:xmpp-sasl"
253 #define IKS_NS_XMPP_BIND "urn:ietf:params:xml:ns:xmpp-bind"
254 #define IKS_NS_XMPP_SESSION "urn:ietf:params:xml:ns:xmpp-session"
256 #define IKS_ID_USER 1
257 #define IKS_ID_SERVER 2
258 #define IKS_ID_RESOURCE 4
259 #define IKS_ID_PARTIAL IKS_ID_USER | IKS_ID_SERVER
260 #define IKS_ID_FULL IKS_ID_USER | IKS_ID_SERVER | IKS_ID_RESOURCE
262 #define IKS_STREAM_STARTTLS 1
263 #define IKS_STREAM_SESSION 2
264 #define IKS_STREAM_BIND 4
265 #define IKS_STREAM_SASL_PLAIN 8
266 #define IKS_STREAM_SASL_MD5 16
268 typedef struct iksid_struct {
276 iksid *iks_id_new (ikstack *s, const char *jid);
277 int iks_id_cmp (iksid *a, iksid *b, int parts);
301 IKS_TYPE_UNSUBSCRIBE,
302 IKS_TYPE_UNSUBSCRIBED,
309 IKS_SHOW_UNAVAILABLE = 0,
317 typedef struct ikspak_struct {
323 enum ikspaktype type;
324 enum iksubtype subtype;
325 enum ikshowtype show;
328 ikspak *iks_packet (iks *x);
330 iks *iks_make_auth (iksid *id, const char *pass, const char *sid);
331 iks *iks_make_msg (enum iksubtype type, const char *to, const char *body);
332 iks *iks_make_s10n (enum iksubtype type, const char *to, const char *msg);
333 iks *iks_make_pres (enum ikshowtype show, const char *status);
334 iks *iks_make_iq (enum iksubtype type, const char *xmlns);
335 iks *iks_make_resource_bind(iksid *id);
336 iks *iks_make_session(void);
337 int iks_stream_features(iks *x);
339 /***** jabber packet filter *****/
341 #define IKS_RULE_DONE 0
342 #define IKS_RULE_ID 1
343 #define IKS_RULE_TYPE 2
344 #define IKS_RULE_SUBTYPE 4
345 #define IKS_RULE_FROM 8
346 #define IKS_RULE_FROM_PARTIAL 16
347 #define IKS_RULE_NS 32
354 typedef int (iksFilterHook)(void *user_data, ikspak *pak);
356 struct iksfilter_struct;
357 typedef struct iksfilter_struct iksfilter;
358 struct iksrule_struct;
359 typedef struct iksrule_struct iksrule;
361 iksfilter *iks_filter_new (void);
362 iksrule *iks_filter_add_rule (iksfilter *f, iksFilterHook *filterHook, void *user_data, ...);
363 void iks_filter_remove_rule (iksfilter *f, iksrule *rule);
364 void iks_filter_remove_hook (iksfilter *f, iksFilterHook *filterHook);
365 void iks_filter_packet (iksfilter *f, ikspak *pak);
366 void iks_filter_delete (iksfilter *f);
371 typedef struct iksha_struct iksha;
373 iksha *iks_sha_new (void);
374 void iks_sha_reset (iksha *sha);
375 void iks_sha_hash (iksha *sha, const unsigned char *data, size_t len, int finish);
376 void iks_sha_print (iksha *sha, char *hash);
377 void iks_sha_delete (iksha *sha);
378 void iks_sha (const char *data, char *hash);
383 typedef struct iksmd5_struct iksmd5;
385 iksmd5 *iks_md5_new(void);
386 void iks_md5_reset(iksmd5 *md5);
387 void iks_md5_hash(iksmd5 *md5, const unsigned char *data, size_t slen, int finish);
388 void iks_md5_delete(iksmd5 *md5);
389 void iks_md5_print(iksmd5 *md5, char *buf);
390 void iks_md5_digest(iksmd5 *md5, unsigned char *digest);
391 void iks_md5(const char *data, char *buf);
395 char *iks_base64_decode(const char *buf);
396 char *iks_base64_encode(const char *buf, int len);
402 #endif /* IKSEMEL_H */