Frameworks/libpurple.framework/Versions/0.6.2/Headers/jabber.h
author Zachary West <zacw@adium.im>
Fri Aug 21 13:25:11 2009 -0700 (2009-08-21)
changeset 2592 e8d15275025e
parent 2571 Frameworks/libpurple.framework/Versions/0.6.0/Headers/jabber.h@75fb8ee8f2e6
permissions -rw-r--r--
im.pidgin.adium.1-4 at 267c6165e02e34318a1823960bd04c0639952f73
Evan@653
     1
/**
Evan@653
     2
 * @file jabber.h
Evan@653
     3
 *
Evan@653
     4
 * purple
Evan@653
     5
 *
Evan@653
     6
 * Copyright (C) 2003 Nathan Walp <faceprint@faceprint.com>
Evan@653
     7
 *
Evan@653
     8
 * This program is free software; you can redistribute it and/or modify
Evan@653
     9
 * it under the terms of the GNU General Public License as published by
Evan@653
    10
 * the Free Software Foundation; either version 2 of the License, or
Evan@653
    11
 * (at your option) any later version.
Evan@653
    12
 *
Evan@653
    13
 * This program is distributed in the hope that it will be useful,
Evan@653
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Evan@653
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Evan@653
    16
 * GNU General Public License for more details.
Evan@653
    17
 *
Evan@653
    18
 * You should have received a copy of the GNU General Public License
Evan@653
    19
 * along with this program; if not, write to the Free Software
Evan@653
    20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
Evan@653
    21
 */
zacw@1759
    22
#ifndef PURPLE_JABBER_H_
zacw@1759
    23
#define PURPLE_JABBER_H_
Evan@653
    24
Evan@653
    25
typedef enum {
Evan@653
    26
	JABBER_CAP_NONE           = 0,
zacw@2536
    27
/*	JABBER_CAP_XHTML          = 1 << 0, */
zacw@2536
    28
/*	JABBER_CAP_COMPOSING      = 1 << 1, */
Evan@653
    29
	JABBER_CAP_SI             = 1 << 2,
Evan@653
    30
	JABBER_CAP_SI_FILE_XFER   = 1 << 3,
Evan@653
    31
	JABBER_CAP_BYTESTREAMS    = 1 << 4,
Evan@653
    32
	JABBER_CAP_IBB            = 1 << 5,
Evan@653
    33
	JABBER_CAP_CHAT_STATES    = 1 << 6,
Evan@653
    34
	JABBER_CAP_IQ_SEARCH      = 1 << 7,
Evan@653
    35
	JABBER_CAP_IQ_REGISTER    = 1 << 8,
Evan@653
    36
Evan@653
    37
	/* Google Talk extensions:
Evan@653
    38
	 * http://code.google.com/apis/talk/jep_extensions/extensions.html
Evan@653
    39
	 */
Evan@653
    40
	JABBER_CAP_GMAIL_NOTIFY   = 1 << 9,
Evan@653
    41
	JABBER_CAP_GOOGLE_ROSTER  = 1 << 10,
Evan@653
    42
Evan@653
    43
	JABBER_CAP_PING			  = 1 << 11,
Evan@653
    44
	JABBER_CAP_ADHOC		  = 1 << 12,
Evan@653
    45
	JABBER_CAP_BLOCKING       = 1 << 13,
Evan@653
    46
zacw@2489
    47
	JABBER_CAP_ITEMS          = 1 << 14,
zacw@2489
    48
Evan@653
    49
	JABBER_CAP_RETRIEVED      = 1 << 31
Evan@653
    50
} JabberCapabilities;
Evan@653
    51
Evan@653
    52
typedef struct _JabberStream JabberStream;
Evan@653
    53
Evan@653
    54
#include <libxml/parser.h>
Evan@653
    55
#include <glib.h>
Evan@653
    56
#include "circbuffer.h"
Evan@653
    57
#include "connection.h"
zacw@2489
    58
#include "dnsquery.h"
Evan@653
    59
#include "dnssrv.h"
zacw@1759
    60
#include "media.h"
zacw@1759
    61
#include "mediamanager.h"
Evan@653
    62
#include "roomlist.h"
Evan@653
    63
#include "sslconn.h"
Evan@653
    64
zacw@1759
    65
#include "iq.h"
Evan@653
    66
#include "jutil.h"
Evan@653
    67
#include "xmlnode.h"
Evan@653
    68
#include "buddy.h"
zacw@2069
    69
#include "bosh.h"
Evan@653
    70
Evan@653
    71
#ifdef HAVE_CYRUS_SASL
Evan@653
    72
#include <sasl/sasl.h>
Evan@653
    73
#endif
Evan@653
    74
zacw@2069
    75
#define CAPS0115_NODE "http://pidgin.im/"
Evan@653
    76
Evan@653
    77
/* Index into attention_types list */
Evan@653
    78
#define JABBER_BUZZ 0
Evan@653
    79
zacw@2250
    80
extern PurplePlugin *jabber_plugin;
zacw@2250
    81
Evan@653
    82
typedef enum {
Evan@653
    83
	JABBER_STREAM_OFFLINE,
Evan@653
    84
	JABBER_STREAM_CONNECTING,
Evan@653
    85
	JABBER_STREAM_INITIALIZING,
Evan@653
    86
	JABBER_STREAM_INITIALIZING_ENCRYPTION,
Evan@653
    87
	JABBER_STREAM_AUTHENTICATING,
Evan@653
    88
	JABBER_STREAM_REINITIALIZING,
Evan@653
    89
	JABBER_STREAM_CONNECTED
Evan@653
    90
} JabberStreamState;
Evan@653
    91
Evan@653
    92
struct _JabberStream
Evan@653
    93
{
Evan@653
    94
	int fd;
Evan@653
    95
Evan@653
    96
	PurpleSrvQueryData *srv_query_data;
Evan@653
    97
Evan@653
    98
	xmlParserCtxt *context;
Evan@653
    99
	xmlnode *current;
Evan@653
   100
Evan@653
   101
	enum {
Evan@653
   102
		JABBER_PROTO_0_9,
Evan@653
   103
		JABBER_PROTO_1_0
Evan@653
   104
	} protocol_version;
Evan@653
   105
	enum {
Evan@653
   106
		JABBER_AUTH_UNKNOWN,
Evan@653
   107
		JABBER_AUTH_DIGEST_MD5,
Evan@653
   108
		JABBER_AUTH_PLAIN,
Evan@653
   109
		JABBER_AUTH_IQ_AUTH,
Evan@653
   110
		JABBER_AUTH_CYRUS
Evan@653
   111
	} auth_type;
Evan@653
   112
	char *stream_id;
Evan@653
   113
	JabberStreamState state;
Evan@653
   114
Evan@653
   115
	/* SASL authentication */
Evan@653
   116
	char *expected_rspauth;
Evan@653
   117
Evan@653
   118
	GHashTable *buddies;
Evan@653
   119
Evan@653
   120
	/*
Evan@653
   121
	 * This boolean was added to eliminate a heinous bug where we would
Evan@653
   122
	 * get into a loop with the server and move a buddy back and forth
Evan@653
   123
	 * from one group to another.
Evan@653
   124
	 *
Evan@653
   125
	 * The sequence goes something like this:
Evan@653
   126
	 * 1. Our resource and another resource both approve an authorization
Evan@653
   127
	 *    request at the exact same time.  We put the buddy in group A and
Evan@653
   128
	 *    the other resource put the buddy in group B.
Evan@653
   129
	 * 2. The server receives the roster add for group B and sends us a
Evan@653
   130
	 *    roster push.
Evan@653
   131
	 * 3. We receive this roster push and modify our local blist.  This
Evan@653
   132
	 *    triggers us to send a roster add for group B.
Evan@653
   133
	 * 4. The server recieves our earlier roster add for group A and sends
Evan@653
   134
	 *    us a roster push.
Evan@653
   135
	 * 5. We receive this roster push and modify our local blist.  This
Evan@653
   136
	 *    triggers us to send a roster add for group A.
Evan@653
   137
	 * 6. The server receives our earlier roster add for group B and sends
Evan@653
   138
	 *    us a roster push.
Evan@653
   139
	 * (repeat steps 3 through 6 ad infinitum)
Evan@653
   140
	 *
Evan@653
   141
	 * This boolean is used to short-circuit the sending of a roster add
Evan@653
   142
	 * when we receive a roster push.
Evan@653
   143
	 *
Evan@653
   144
	 * See these bug reports:
Evan@653
   145
	 * http://trac.adiumx.com/ticket/8834
Evan@653
   146
	 * http://developer.pidgin.im/ticket/5484
Evan@653
   147
	 * http://developer.pidgin.im/ticket/6188
Evan@653
   148
	 */
Evan@653
   149
	gboolean currently_parsing_roster_push;
Evan@653
   150
Evan@653
   151
	GHashTable *chats;
Evan@653
   152
	GList *chat_servers;
Evan@653
   153
	PurpleRoomlist *roomlist;
Evan@653
   154
	GList *user_directories;
Evan@653
   155
Evan@653
   156
	GHashTable *iq_callbacks;
Evan@653
   157
	int next_id;
Evan@653
   158
Evan@653
   159
	GList *bs_proxies;
Evan@653
   160
	GList *oob_file_transfers;
Evan@653
   161
	GList *file_transfers;
Evan@653
   162
Evan@653
   163
	time_t idle;
zacw@2069
   164
	time_t old_idle;
Evan@653
   165
Evan@653
   166
	JabberID *user;
Evan@2571
   167
	JabberBuddy *user_jb;
Evan@2571
   168
Evan@653
   169
	PurpleConnection *gc;
Evan@653
   170
	PurpleSslConnection *gsc;
Evan@653
   171
Evan@653
   172
	gboolean registration;
Evan@653
   173
zacw@2069
   174
	char *initial_avatar_hash;
Evan@653
   175
	char *avatar_hash;
Evan@653
   176
	GSList *pending_avatar_requests;
Evan@653
   177
Evan@653
   178
	GSList *pending_buddy_info_requests;
Evan@653
   179
Evan@653
   180
	PurpleCircBuffer *write_buffer;
Evan@653
   181
	guint writeh;
Evan@653
   182
Evan@653
   183
	gboolean reinit;
Evan@653
   184
Evan@653
   185
	JabberCapabilities server_caps;
Evan@653
   186
	gboolean googletalk;
Evan@653
   187
	char *server_name;
Evan@653
   188
Evan@653
   189
	char *gmail_last_time;
Evan@653
   190
	char *gmail_last_tid;
Evan@653
   191
Evan@653
   192
	char *serverFQDN;
Evan@653
   193
Evan@653
   194
	/* OK, this stays at the end of the struct, so plugins can depend
Evan@653
   195
	 * on the rest of the stuff being in the right place
Evan@653
   196
	 */
Evan@653
   197
#ifdef HAVE_CYRUS_SASL
Evan@653
   198
	sasl_conn_t *sasl;
Evan@653
   199
	sasl_callback_t *sasl_cb;
Evan@653
   200
#else /* keep the struct the same size */
Evan@653
   201
	void *sasl;
Evan@653
   202
	void *sasl_cb;
Evan@653
   203
#endif
Evan@653
   204
	/* did someone say something about the end of the struct? */
Evan@653
   205
#ifdef HAVE_CYRUS_SASL
Evan@653
   206
	const char *current_mech;
Evan@653
   207
	int auth_fail_count;
Evan@653
   208
#endif
Evan@653
   209
Evan@653
   210
	int sasl_state;
Evan@653
   211
	int sasl_maxbuf;
Evan@653
   212
	GString *sasl_mechs;
Evan@653
   213
Evan@653
   214
	gboolean unregistration;
Evan@653
   215
	PurpleAccountUnregistrationCb unregistration_cb;
Evan@653
   216
	void *unregistration_user_data;
Evan@1427
   217
Evan@653
   218
	gboolean vcard_fetched;
Evan@2571
   219
	/* Timer at login to push updated avatar */
Evan@2571
   220
	guint vcard_timer;
Evan@653
   221
zacw@2069
   222
	/* Entity Capabilities hash */
zacw@2069
   223
	char *caps_hash;
zacw@2069
   224
Evan@653
   225
	/* does the local server support PEP? */
Evan@653
   226
	gboolean pep;
Evan@653
   227
Evan@653
   228
	/* Is Buzz enabled? */
Evan@653
   229
	gboolean allowBuzz;
Evan@1427
   230
Evan@653
   231
	/* A list of JabberAdHocCommands supported by the server */
Evan@653
   232
	GList *commands;
Evan@1427
   233
Evan@653
   234
	/* last presence update to check for differences */
Evan@653
   235
	JabberBuddyState old_state;
Evan@653
   236
	char *old_msg;
Evan@653
   237
	int old_priority;
Evan@653
   238
	char *old_avatarhash;
Evan@1427
   239
Evan@653
   240
	/* same for user tune */
Evan@653
   241
	char *old_artist;
Evan@653
   242
	char *old_title;
Evan@653
   243
	char *old_source;
Evan@653
   244
	char *old_uri;
Evan@653
   245
	int old_length;
Evan@653
   246
	char *old_track;
Evan@1427
   247
Evan@653
   248
	char *certificate_CN;
Evan@1427
   249
Evan@653
   250
	/* A purple timeout tag for the keepalive */
zacw@2489
   251
	guint keepalive_timeout;
zacw@2279
   252
Evan@653
   253
	PurpleSrvResponse *srv_rec;
Evan@653
   254
	guint srv_rec_idx;
Evan@653
   255
	guint max_srv_rec_idx;
zacw@2069
   256
zacw@2069
   257
	/* BOSH stuff */
zacw@2069
   258
	PurpleBOSHConnection *bosh;
zacw@2069
   259
Evan@653
   260
	/**
Evan@653
   261
	 * This linked list contains PurpleUtilFetchUrlData structs
Evan@653
   262
	 * for when we lookup buddy icons from a url
Evan@653
   263
	 */
Evan@653
   264
	GSList *url_datas;
zacw@1759
   265
zacw@1759
   266
	/* keep a hash table of JingleSessions */
zacw@1759
   267
	GHashTable *sessions;
zacw@1759
   268
zacw@1759
   269
	/* maybe this should only be present when USE_VV? */
zacw@1759
   270
	gchar *stun_ip;
zacw@1759
   271
	int stun_port;
zacw@1759
   272
	PurpleDnsQueryData *stun_query;
zacw@1759
   273
	/* later add stuff to handle TURN relays... */
Evan@653
   274
};
Evan@653
   275
zacw@2069
   276
typedef gboolean (JabberFeatureEnabled)(JabberStream *js, const gchar *namespace);
Evan@653
   277
Evan@653
   278
typedef struct _JabberFeature
Evan@653
   279
{
Evan@653
   280
	gchar *namespace;
Evan@653
   281
	JabberFeatureEnabled *is_enabled;
Evan@653
   282
} JabberFeature;
Evan@653
   283
zacw@2069
   284
typedef struct _JabberIdentity
zacw@2069
   285
{
zacw@2069
   286
	gchar *category;
zacw@2069
   287
	gchar *type;
zacw@2069
   288
	gchar *name;
zacw@2069
   289
	gchar *lang;
zacw@2069
   290
} JabberIdentity;
zacw@2069
   291
Evan@653
   292
typedef struct _JabberBytestreamsStreamhost {
Evan@653
   293
	char *jid;
Evan@653
   294
	char *host;
Evan@653
   295
	int port;
Evan@653
   296
	char *zeroconf;
Evan@653
   297
} JabberBytestreamsStreamhost;
Evan@653
   298
Evan@653
   299
/* what kind of additional features as returned from disco#info are supported? */
Evan@653
   300
extern GList *jabber_features;
zacw@2069
   301
extern GList *jabber_identities;
Evan@653
   302
zacw@2069
   303
void jabber_stream_features_parse(JabberStream *js, xmlnode *packet);
Evan@653
   304
void jabber_process_packet(JabberStream *js, xmlnode **packet);
Evan@653
   305
void jabber_send(JabberStream *js, xmlnode *data);
Evan@653
   306
void jabber_send_raw(JabberStream *js, const char *data, int len);
zacw@2489
   307
void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet,
zacw@2489
   308
                           gpointer unused);
Evan@653
   309
Evan@653
   310
void jabber_stream_set_state(JabberStream *js, JabberStreamState state);
Evan@653
   311
zacw@1759
   312
void jabber_register_parse(JabberStream *js, const char *from,
zacw@1759
   313
                           JabberIqType type, const char *id, xmlnode *query);
Evan@653
   314
void jabber_register_start(JabberStream *js);
Evan@653
   315
Evan@653
   316
char *jabber_get_next_id(JabberStream *js);
Evan@653
   317
Evan@653
   318
/** Parse an error into a human-readable string and optionally a disconnect
Evan@653
   319
 *  reason.
Evan@653
   320
 *  @param js     the stream on which the error occurred.
Evan@653
   321
 *  @param packet the error packet
Evan@653
   322
 *  @param reason where to store the disconnection reason, or @c NULL if you
Evan@653
   323
 *                don't care or you don't intend to close the connection.
Evan@653
   324
 */
Evan@653
   325
char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleConnectionError *reason);
Evan@653
   326
zacw@2069
   327
void jabber_add_feature(const gchar *namespace, JabberFeatureEnabled cb); /* cb may be NULL */
zacw@2069
   328
void jabber_remove_feature(const gchar *namespace);
zacw@2069
   329
zacw@2504
   330
/** Adds an identity to this jabber library instance. For list of valid values visit the
zacw@2504
   331
 *	website of the XMPP Registrar ( http://www.xmpp.org/registrar/disco-categories.html#client ).
zacw@2069
   332
 *  @param category the category of the identity.
zacw@2069
   333
 *  @param type the type of the identity.
zacw@2069
   334
 *  @param language the language localization of the name. Can be NULL.
zacw@2069
   335
 *  @param name the name of the identity.
zacw@2069
   336
 */
zacw@2069
   337
void jabber_add_identity(const gchar *category, const gchar *type, const gchar *lang, const gchar *name);
zacw@2069
   338
zacw@2069
   339
/**
zacw@2069
   340
 * Returns true if this connection is over a secure (SSL) stream. Use this
zacw@2069
   341
 * instead of checking js->gsc because BOSH stores its PurpleSslConnection
zacw@2069
   342
 * members in its own data structure.
zacw@2069
   343
 */
zacw@2069
   344
gboolean jabber_stream_is_ssl(JabberStream *js);
Evan@653
   345
Evan@653
   346
/** PRPL functions */
Evan@653
   347
const char *jabber_list_icon(PurpleAccount *a, PurpleBuddy *b);
Evan@653
   348
const char* jabber_list_emblem(PurpleBuddy *b);
Evan@653
   349
char *jabber_status_text(PurpleBuddy *b);
Evan@653
   350
void jabber_tooltip_text(PurpleBuddy *b, PurpleNotifyUserInfo *user_info, gboolean full);
Evan@653
   351
GList *jabber_status_types(PurpleAccount *account);
Evan@653
   352
void jabber_login(PurpleAccount *account);
Evan@653
   353
void jabber_close(PurpleConnection *gc);
Evan@653
   354
void jabber_idle_set(PurpleConnection *gc, int idle);
zacw@2397
   355
void jabber_blocklist_parse_push(JabberStream *js, const char *from,
zacw@2397
   356
                                 JabberIqType type, const char *id,
zacw@2397
   357
                                 xmlnode *child);
Evan@653
   358
void jabber_request_block_list(JabberStream *js);
Evan@653
   359
void jabber_add_deny(PurpleConnection *gc, const char *who);
Evan@653
   360
void jabber_rem_deny(PurpleConnection *gc, const char *who);
Evan@653
   361
void jabber_keepalive(PurpleConnection *gc);
Evan@653
   362
void jabber_register_gateway(JabberStream *js, const char *gateway);
Evan@653
   363
void jabber_register_account(PurpleAccount *account);
Evan@653
   364
void jabber_unregister_account(PurpleAccount *account, PurpleAccountUnregistrationCb cb, void *user_data);
Evan@653
   365
gboolean jabber_send_attention(PurpleConnection *gc, const char *username, guint code);
Evan@653
   366
GList *jabber_attention_types(PurpleAccount *account);
Evan@653
   367
void jabber_convo_closed(PurpleConnection *gc, const char *who);
Evan@653
   368
PurpleChat *jabber_find_blist_chat(PurpleAccount *account, const char *name);
Evan@653
   369
gboolean jabber_offline_message(const PurpleBuddy *buddy);
Evan@653
   370
int jabber_prpl_send_raw(PurpleConnection *gc, const char *buf, int len);
Evan@653
   371
GList *jabber_actions(PurplePlugin *plugin, gpointer context);
zacw@2069
   372
zacw@2069
   373
gboolean jabber_audio_enabled(JabberStream *js, const char *unused);
zacw@2489
   374
gboolean jabber_video_enabled(JabberStream *js, const char *unused);
zacw@1759
   375
gboolean jabber_initiate_media(PurpleAccount *account, const char *who,
zacw@1759
   376
		PurpleMediaSessionType type);
zacw@1759
   377
PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who);
zacw@2069
   378
Evan@653
   379
void jabber_register_commands(void);
zacw@2151
   380
void jabber_unregister_commands(void);
zacw@2069
   381
Evan@653
   382
void jabber_init_plugin(PurplePlugin *plugin);
zacw@2069
   383
void jabber_uninit_plugin(void);
Evan@653
   384
zacw@1759
   385
#endif /* PURPLE_JABBER_H_ */