1 /* iksemel (XML parser for Jabber) 2 ** Copyright (C) 2000-2007 Gurer Ozen 3 ** This code is free software; you can redistribute it and/or 4 ** modify it under the terms of GNU Lesser General Public License. 5 */ 6 7 #ifndef IKSEMEL_H 8 #define IKSEMEL_H 1 9 10 #ifdef __cplusplus 11 #include <cstddef> /* size_t for C++ */ 12 extern "C" { 13 #else 14 #include <stddef.h> /* size_t for C */ 15 #endif 16 17 /***** object stack *****/ 18 19 struct ikstack_struct; 20 typedef struct ikstack_struct ikstack; 21 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); 28 29 /***** utilities *****/ 30 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)); 34 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); 44 45 /***** dom tree *****/ 46 47 enum ikstype { 48 IKS_NONE = 0, 49 IKS_TAG, 50 IKS_ATTRIBUTE, 51 IKS_CDATA 52 }; 53 54 struct iks_struct; 55 typedef struct iks_struct iks; 56 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 iks *iks_append (iks *x, const char *name); 64 iks *iks_prepend (iks *x, const char *name); 65 iks *iks_append_cdata (iks *x, const char *data, size_t len); 66 iks *iks_prepend_cdata (iks *x, const char *data, size_t len); 67 void iks_hide (iks *x); 68 void iks_delete (iks *x); 69 iks *iks_next (iks *x); 70 iks *iks_next_tag (iks *x); 71 iks *iks_prev (iks *x); 72 iks *iks_prev_tag (iks *x); 73 iks *iks_parent (iks *x); 74 iks *iks_root (iks *x); 75 iks *iks_child (iks *x); 76 iks *iks_first_tag (iks *x); 77 iks *iks_attrib (iks *x); 78 iks *iks_find (iks *x, const char *name); 79 char *iks_find_cdata (iks *x, const char *name); 80 char *iks_find_attrib (iks *x, const char *name); 81 iks *iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value); 82 ikstack *iks_stack (iks *x); 83 enum ikstype iks_type (iks *x); 84 char *iks_name (iks *x); 85 char *iks_cdata (iks *x); 86 size_t iks_cdata_size (iks *x); 87 int iks_has_children (iks *x); 88 int iks_has_attribs (iks *x); 89 char *iks_string (ikstack *s, iks *x); 90 iks *iks_copy (iks *x); 91 iks *iks_copy_within (iks *x, ikstack *s); 92 93 /***** sax parser *****/ 94 95 enum ikserror { 96 IKS_OK = 0, 97 IKS_NOMEM, 98 IKS_BADXML, 99 IKS_HOOK 100 }; 101 102 enum ikstagtype { 103 IKS_OPEN, 104 IKS_CLOSE, 105 IKS_SINGLE 106 }; 107 108 typedef int (iksTagHook)(void *user_data, char *name, char **atts, int type); 109 typedef int (iksCDataHook)(void *user_data, char *data, size_t len); 110 typedef void (iksDeleteHook)(void *user_data); 111 112 struct iksparser_struct; 113 typedef struct iksparser_struct iksparser; 114 115 iksparser *iks_sax_new (void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook); 116 iksparser *iks_sax_extend (ikstack *s, void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook, iksDeleteHook *deleteHook); 117 ikstack *iks_parser_stack (iksparser *prs); 118 void *iks_user_data (iksparser *prs); 119 unsigned long iks_nr_bytes (iksparser *prs); 120 unsigned long iks_nr_lines (iksparser *prs); 121 int iks_parse (iksparser *prs, const char *data, size_t len, int finish); 122 void iks_parser_reset (iksparser *prs); 123 void iks_parser_delete (iksparser *prs); 124 125 /***** dom parser *****/ 126 127 enum iksfileerror { 128 IKS_FILE_NOFILE = 4, 129 IKS_FILE_NOACCESS, 130 IKS_FILE_RWERR 131 }; 132 133 iksparser *iks_dom_new (iks **iksptr); 134 void iks_set_size_hint (iksparser *prs, size_t approx_size); 135 iks *iks_tree (const char *xml_str, size_t len, int *err); 136 int iks_load (const char *fname, iks **xptr); 137 int iks_save (const char *fname, iks *x); 138 139 /***** transport layer *****/ 140 141 enum iksasyncevents { 142 IKS_ASYNC_RESOLVED, 143 IKS_ASYNC_CONNECTED, 144 IKS_ASYNC_WRITE, 145 IKS_ASYNC_WRITTEN, 146 IKS_ASYNC_READ, 147 IKS_ASYNC_CLOSED, 148 IKS_ASYNC_ERROR 149 }; 150 151 typedef struct iksasyncevent_struct { 152 int event; 153 int data0; 154 int data1; 155 } iksasyncevent; 156 157 typedef void (iksTClose)(void *socket); 158 typedef int (iksTConnect)(iksparser *prs, void **socketptr, const char *server, int port); 159 typedef int (iksTSend)(void *socket, const char *data, size_t len); 160 typedef int (iksTRecv)(void *socket, char *buffer, size_t buf_len, int timeout); 161 typedef int (iksAsyncNotify)(void *user_data, iksasyncevent *event); 162 typedef int (iksTConnectAsync)(iksparser *prs, void **socketptr, const char *server, const char *server_name, int port, void *notify_data, iksAsyncNotify *notify_func); 163 164 #define IKS_TRANSPORT_V1 0 165 166 typedef const struct ikstransport_struct { 167 int abi_version; 168 /* basic api, connect can be NULL if only async api is provided */ 169 iksTConnect *connect; 170 iksTSend *send; 171 iksTRecv *recv; 172 iksTClose *close; 173 /* optional async api */ 174 iksTConnectAsync *connect_async; 175 } ikstransport; 176 177 extern ikstransport iks_default_transport; 178 179 /***** stream parser *****/ 180 181 enum iksneterror { 182 IKS_NET_NODNS = 4, 183 IKS_NET_NOSOCK, 184 IKS_NET_NOCONN, 185 IKS_NET_RWERR, 186 IKS_NET_NOTSUPP, 187 IKS_NET_TLSFAIL, 188 IKS_NET_DROPPED, 189 IKS_NET_UNKNOWN 190 }; 191 192 enum iksnodetype { 193 IKS_NODE_START, 194 IKS_NODE_NORMAL, 195 IKS_NODE_ERROR, 196 IKS_NODE_STOP 197 }; 198 199 enum ikssasltype { 200 IKS_SASL_PLAIN, 201 IKS_SASL_DIGEST_MD5 202 }; 203 204 #define IKS_JABBER_PORT 5222 205 206 typedef int (iksStreamHook)(void *user_data, int type, iks *node); 207 typedef void (iksLogHook)(void *user_data, const char *data, size_t size, int is_incoming); 208 209 iksparser *iks_stream_new (char *name_space, void *user_data, iksStreamHook *streamHook); 210 void *iks_stream_user_data (iksparser *prs); 211 void iks_set_log_hook (iksparser *prs, iksLogHook *logHook); 212 int iks_connect_tcp (iksparser *prs, const char *server, int port); 213 int iks_connect_fd (iksparser *prs, int fd); 214 int iks_connect_via (iksparser *prs, const char *server, int port, const char *server_name); 215 int iks_connect_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans); 216 int iks_connect_async (iksparser *prs, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func); 217 int iks_connect_async_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans, void *notify_data, iksAsyncNotify *notify_func); 218 int iks_fd (iksparser *prs); 219 int iks_recv (iksparser *prs, int timeout); 220 int iks_send_header (iksparser *prs, const char *to); 221 int iks_send (iksparser *prs, iks *x); 222 int iks_send_raw (iksparser *prs, const char *xmlstr); 223 void iks_disconnect (iksparser *prs); 224 int iks_has_tls (void); 225 int iks_is_secure (iksparser *prs); 226 int iks_start_tls (iksparser *prs); 227 int iks_start_sasl (iksparser *prs, enum ikssasltype type, char *username, char *pass); 228 229 /***** jabber *****/ 230 231 #define IKS_NS_CLIENT "jabber:client" 232 #define IKS_NS_SERVER "jabber:server" 233 #define IKS_NS_AUTH "jabber:iq:auth" 234 #define IKS_NS_AUTH_0K "jabber:iq:auth:0k" 235 #define IKS_NS_REGISTER "jabber:iq:register" 236 #define IKS_NS_ROSTER "jabber:iq:roster" 237 #define IKS_NS_XROSTER "jabber:x:roster" 238 #define IKS_NS_OFFLINE "jabber:x:offline" 239 #define IKS_NS_AGENT "jabber:iq:agent" 240 #define IKS_NS_AGENTS "jabber:iq:agents" 241 #define IKS_NS_BROWSE "jabber:iq:browse" 242 #define IKS_NS_CONFERENCE "jabber:iq:conference" 243 #define IKS_NS_DELAY "jabber:x:delay" 244 #define IKS_NS_VERSION "jabber:iq:version" 245 #define IKS_NS_TIME "jabber:iq:time" 246 #define IKS_NS_VCARD "vcard-temp" 247 #define IKS_NS_PRIVATE "jabber:iq:private" 248 #define IKS_NS_SEARCH "jabber:iq:search" 249 #define IKS_NS_OOB "jabber:iq:oob" 250 #define IKS_NS_XOOB "jabber:x:oob" 251 #define IKS_NS_ADMIN "jabber:iq:admin" 252 #define IKS_NS_FILTER "jabber:iq:filter" 253 #define IKS_NS_GATEWAY "jabber:iq:gateway" 254 #define IKS_NS_LAST "jabber:iq:last" 255 #define IKS_NS_SIGNED "jabber:x:signed" 256 #define IKS_NS_ENCRYPTED "jabber:x:encrypted" 257 #define IKS_NS_ENVELOPE "jabber:x:envelope" 258 #define IKS_NS_EVENT "jabber:x:event" 259 #define IKS_NS_EXPIRE "jabber:x:expire" 260 #define IKS_NS_XHTML "http://www.w3.org/1999/xhtml" 261 #define IKS_NS_XMPP_SASL "urn:ietf:params:xml:ns:xmpp-sasl" 262 #define IKS_NS_XMPP_BIND "urn:ietf:params:xml:ns:xmpp-bind" 263 #define IKS_NS_XMPP_SESSION "urn:ietf:params:xml:ns:xmpp-session" 264 265 #define IKS_ID_USER 1 266 #define IKS_ID_SERVER 2 267 #define IKS_ID_RESOURCE 4 268 #define IKS_ID_PARTIAL IKS_ID_USER | IKS_ID_SERVER 269 #define IKS_ID_FULL IKS_ID_USER | IKS_ID_SERVER | IKS_ID_RESOURCE 270 271 #define IKS_STREAM_STARTTLS 1 272 #define IKS_STREAM_SESSION 2 273 #define IKS_STREAM_BIND 4 274 #define IKS_STREAM_SASL_PLAIN 8 275 #define IKS_STREAM_SASL_MD5 16 276 277 typedef struct iksid_struct { 278 char *user; 279 char *server; 280 char *resource; 281 char *partial; 282 char *full; 283 } iksid; 284 285 iksid *iks_id_new (ikstack *s, const char *jid); 286 int iks_id_cmp (iksid *a, iksid *b, int parts); 287 288 enum ikspaktype { 289 IKS_PAK_NONE = 0, 290 IKS_PAK_MESSAGE, 291 IKS_PAK_PRESENCE, 292 IKS_PAK_IQ, 293 IKS_PAK_S10N 294 }; 295 296 enum iksubtype { 297 IKS_TYPE_NONE = 0, 298 IKS_TYPE_ERROR, 299 300 IKS_TYPE_CHAT, 301 IKS_TYPE_GROUPCHAT, 302 IKS_TYPE_HEADLINE, 303 304 IKS_TYPE_GET, 305 IKS_TYPE_SET, 306 IKS_TYPE_RESULT, 307 308 IKS_TYPE_SUBSCRIBE, 309 IKS_TYPE_SUBSCRIBED, 310 IKS_TYPE_UNSUBSCRIBE, 311 IKS_TYPE_UNSUBSCRIBED, 312 IKS_TYPE_PROBE, 313 IKS_TYPE_AVAILABLE, 314 IKS_TYPE_UNAVAILABLE 315 }; 316 317 enum ikshowtype { 318 IKS_SHOW_UNAVAILABLE = 0, 319 IKS_SHOW_AVAILABLE, 320 IKS_SHOW_CHAT, 321 IKS_SHOW_AWAY, 322 IKS_SHOW_XA, 323 IKS_SHOW_DND 324 }; 325 326 typedef struct ikspak_struct { 327 iks *x; 328 iksid *from; 329 iks *query; 330 char *ns; 331 char *id; 332 enum ikspaktype type; 333 enum iksubtype subtype; 334 enum ikshowtype show; 335 } ikspak; 336 337 ikspak *iks_packet (iks *x); 338 339 iks *iks_make_auth (iksid *id, const char *pass, const char *sid); 340 iks *iks_make_msg (enum iksubtype type, const char *to, const char *body); 341 iks *iks_make_s10n (enum iksubtype type, const char *to, const char *msg); 342 iks *iks_make_pres (enum ikshowtype show, const char *status); 343 iks *iks_make_iq (enum iksubtype type, const char *xmlns); 344 iks *iks_make_resource_bind(iksid *id); 345 iks *iks_make_session(void); 346 int iks_stream_features(iks *x); 347 348 /***** jabber packet filter *****/ 349 350 #define IKS_RULE_DONE 0 351 #define IKS_RULE_ID 1 352 #define IKS_RULE_TYPE 2 353 #define IKS_RULE_SUBTYPE 4 354 #define IKS_RULE_FROM 8 355 #define IKS_RULE_FROM_PARTIAL 16 356 #define IKS_RULE_NS 32 357 358 enum iksfilterret { 359 IKS_FILTER_PASS, 360 IKS_FILTER_EAT 361 }; 362 363 typedef int (iksFilterHook)(void *user_data, ikspak *pak); 364 365 struct iksfilter_struct; 366 typedef struct iksfilter_struct iksfilter; 367 struct iksrule_struct; 368 typedef struct iksrule_struct iksrule; 369 370 iksfilter *iks_filter_new (void); 371 iksrule *iks_filter_add_rule (iksfilter *f, iksFilterHook *filterHook, void *user_data, ...); 372 void iks_filter_remove_rule (iksfilter *f, iksrule *rule); 373 void iks_filter_remove_hook (iksfilter *f, iksFilterHook *filterHook); 374 void iks_filter_packet (iksfilter *f, ikspak *pak); 375 void iks_filter_delete (iksfilter *f); 376 377 /***** sha1 *****/ 378 379 struct iksha_struct; 380 typedef struct iksha_struct iksha; 381 382 iksha *iks_sha_new (void); 383 void iks_sha_reset (iksha *sha); 384 void iks_sha_hash (iksha *sha, const unsigned char *data, size_t len, int finish); 385 void iks_sha_print (iksha *sha, char *hash); 386 void iks_sha_delete (iksha *sha); 387 void iks_sha (const char *data, char *hash); 388 389 /***** md5 *****/ 390 391 struct ikmd5_struct; 392 typedef struct iksmd5_struct iksmd5; 393 394 iksmd5 *iks_md5_new(void); 395 void iks_md5_reset(iksmd5 *md5); 396 void iks_md5_hash(iksmd5 *md5, const unsigned char *data, size_t slen, int finish); 397 void iks_md5_delete(iksmd5 *md5); 398 void iks_md5_print(iksmd5 *md5, char *buf); 399 void iks_md5_digest(iksmd5 *md5, unsigned char *digest); 400 void iks_md5(const char *data, char *buf); 401 402 /***** base64 *****/ 403 404 char *iks_base64_decode(const char *buf); 405 char *iks_base64_encode(const char *buf, int len); 406 407 #ifdef __cplusplus 408 } 409 #endif 410 411 #endif /* IKSEMEL_H */ 412