Mercurial > pidgin.yaz
diff src/protocols/oscar/aim.h @ 2270:d82efea341ef
[gaim-migrate @ 2280]
new libfaim. stupid bugs.
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Wed, 12 Sep 2001 00:39:51 +0000 |
parents | 933346315b9b |
children | 7ec21662ffc2 |
line wrap: on
line diff
--- a/src/protocols/oscar/aim.h Tue Sep 11 21:05:16 2001 +0000 +++ b/src/protocols/oscar/aim.h Wed Sep 12 00:39:51 2001 +0000 @@ -16,10 +16,6 @@ #include <faimconfig.h> #include <aim_cbtypes.h> -#if !defined(FAIM_USEPTHREADS) && !defined(FAIM_USEFAKELOCKS) && !defined(FAIM_USENOPLOCKS) -#error pthreads, fakelocks, or noplocks are currently required. -#endif - #include <stdio.h> #include <string.h> #include <fcntl.h> @@ -46,40 +42,6 @@ typedef fu32_t aim_snacid_t; typedef fu16_t flap_seqnum_t; -#ifdef FAIM_USEPTHREADS -#include <pthread.h> -#define faim_mutex_t pthread_mutex_t -#define faim_mutex_init(x) pthread_mutex_init(x, NULL) -#define faim_mutex_lock(x) pthread_mutex_lock(x) -#define faim_mutex_unlock(x) pthread_mutex_unlock(x) -#define faim_mutex_destroy(x) pthread_mutex_destroy(x) -#elif defined(FAIM_USEFAKELOCKS) -/* - * For platforms without pthreads, we also assume - * we're not linking against a threaded app. Which - * means we don't have to do real locking. The - * macros below do nothing really. They're a joke. - * But they get it to compile. - * - * XXX NOTE that locking hasn't really been tested in a long time, - * and most code written after dec2000 --is not thread safe--. You'll - * want to audit locking use before you use less-than-library level - * concurrency. - * - */ -#define faim_mutex_t fu8_t -#define faim_mutex_init(x) *x = 0 -#define faim_mutex_lock(x) while(*x != 0) {/* spin */}; *x = 1; -#define faim_mutex_unlock(x) while(*x != 0) {/* spin spin spin */}; *x = 0; -#define faim_mutex_destroy(x) while(*x != 0) {/* spiiiinnn */}; *x = 0; -#elif defined(FAIM_USENOPLOCKS) -#define faim_mutex_t fu8_t -#define faim_mutex_init(x) -#define faim_mutex_lock(x) -#define faim_mutex_unlock(x) -#define faim_mutex_destroy(x) -#endif - /* Portability stuff (DMP) */ #ifdef _WIN32 @@ -272,9 +234,8 @@ time_t lastactivity; /* time of last transmit */ int forcedlatency; void *handlerlist; - faim_mutex_t active; /* lock around read/writes */ - faim_mutex_t seqnum_lock; /* lock around ->seqnum changes */ void *sessv; /* pointer to parent session */ + void *inside; /* only accessible from inside libfaim */ struct aim_conn_s *next; } aim_conn_t; @@ -352,7 +313,6 @@ /* Connection information */ aim_conn_t *connlist; - faim_mutex_t connlistlock; /* * Transmit/receive queues. @@ -389,7 +349,6 @@ * XXX: Should these be per-connection? -mid */ void *snac_hash[FAIM_SNAC_HASH_SIZE]; - faim_mutex_t snac_hash_locks[FAIM_SNAC_HASH_SIZE]; aim_snacid_t snacid_next; struct { @@ -486,9 +445,10 @@ faim_internal int aim_addtlvtochain_raw(aim_tlvlist_t **list, const fu16_t t, const fu16_t l, const fu8_t *v); faim_internal int aim_addtlvtochain_caps(aim_tlvlist_t **list, const fu16_t t, const fu16_t caps); faim_internal int aim_addtlvtochain_noval(aim_tlvlist_t **list, const fu16_t type); +faim_internal int aim_addtlvtochain_userinfo(aim_tlvlist_t **list, fu16_t type, struct aim_userinfo_s *ui); faim_internal int aim_addtlvtochain_frozentlvlist(aim_tlvlist_t **list, fu16_t type, aim_tlvlist_t **tl); faim_internal int aim_counttlvchain(aim_tlvlist_t **list); -faim_export int aim_sizetlvchain(aim_tlvlist_t **list); +faim_internal int aim_sizetlvchain(aim_tlvlist_t **list); #endif /* FAIM_INTERNAL */ /* @@ -540,6 +500,7 @@ faim_export int aim_conn_addhandler(aim_session_t *, aim_conn_t *conn, u_short family, u_short type, aim_rxcallback_t newhandler, u_short flags); faim_export int aim_clearhandlers(aim_conn_t *conn); +faim_export aim_conn_t *aim_conn_findbygroup(aim_session_t *sess, fu16_t group); faim_export aim_session_t *aim_conn_getsess(aim_conn_t *conn); faim_export void aim_conn_close(aim_conn_t *deadconn); faim_export aim_conn_t *aim_newconn(aim_session_t *, int type, const char *dest); @@ -571,6 +532,7 @@ #define AIM_WARN_ANON 0x01 +faim_export int aim_sendpauseack(aim_session_t *sess, aim_conn_t *conn); faim_export int aim_send_warning(aim_session_t *sess, aim_conn_t *conn, const char *destsn, fu32_t flags); faim_export int aim_bos_nop(aim_session_t *, aim_conn_t *); faim_export int aim_flap_nop(aim_session_t *sess, aim_conn_t *conn); @@ -669,15 +631,50 @@ #define AIM_IMFLAGS_SUBENC_MACINTOSH 0x0040 /* damn that Steve Jobs! */ #define AIM_IMFLAGS_CUSTOMFEATURES 0x0080 /* features field present */ #define AIM_IMFLAGS_EXTDATA 0x0100 +#define AIM_IMFLAGS_CUSTOMCHARSET 0x0200 /* charset fields set */ +#define AIM_IMFLAGS_MULTIPART 0x0400 /* ->mpmsg section valid */ +/* + * Multipart message structures. + */ +typedef struct aim_mpmsg_section_s { + fu16_t charset; + fu16_t charsubset; + fu8_t *data; + fu16_t datalen; + struct aim_mpmsg_section_s *next; +} aim_mpmsg_section_t; + +typedef struct aim_mpmsg_s { + int numparts; + aim_mpmsg_section_t *parts; +} aim_mpmsg_t; + +faim_export int aim_mpmsg_init(aim_session_t *sess, aim_mpmsg_t *mpm); +faim_export int aim_mpmsg_addraw(aim_session_t *sess, aim_mpmsg_t *mpm, fu16_t charset, fu16_t charsubset, const fu8_t *data, fu16_t datalen); +faim_export int aim_mpmsg_addascii(aim_session_t *sess, aim_mpmsg_t *mpm, const char *ascii); +faim_export int aim_mpmsg_addunicode(aim_session_t *sess, aim_mpmsg_t *mpm, const fu16_t *unicode, fu16_t unicodelen); +faim_export void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm); + +/* + * Arguments to aim_send_im_ext(). + * + * This is really complicated. But immensely versatile. + * + */ struct aim_sendimext_args { /* These are _required_ */ const char *destsn; - fu32_t flags; + fu32_t flags; /* often 0 */ + + /* Only required if not using multipart messages */ const char *msg; int msglen; + /* Required if ->msg is not provided */ + aim_mpmsg_t *mpmsg; + /* Only used if AIM_IMFLAGS_HASICON is set */ fu32_t iconlen; time_t iconstamp; @@ -686,16 +683,34 @@ /* Only used if AIM_IMFLAGS_CUSTOMFEATURES is set */ fu8_t *features; fu8_t featureslen; + + /* Only used if AIM_IMFLAGS_CUSTOMCHARSET is set and mpmsg not used */ + fu16_t charset; + fu16_t charsubset; }; +/* + * This information is provided in the Incoming ICBM callback for + * Channel 1 ICBM's. + * + * Note that although CUSTOMFEATURES and CUSTOMCHARSET say they + * are optional, both are always set by the current libfaim code. + * That may or may not change in the future. It is mainly for + * consistency with aim_sendimext_args. + * + * Multipart messages require some explanation. If you want to use them, + * I suggest you read all the comments in im.c. + * + */ struct aim_incomingim_ch1_args { /* Always provided */ + aim_mpmsg_t mpmsg; + fu32_t icbmflags; /* some flags apply only to ->msg, not all mpmsg */ + + /* Only provided if message has a human-readable section */ char *msg; int msglen; - fu32_t icbmflags; - fu16_t flag1; - fu16_t flag2; /* Only provided if AIM_IMFLAGS_HASICON is set */ time_t iconstamp; @@ -709,6 +724,10 @@ /* Only provided if AIM_IMFLAGS_EXTDATA is set */ fu8_t extdatalen; fu8_t *extdata; + + /* Only used if AIM_IMFLAGS_CUSTOMCHARSET is set */ + fu16_t charset; + fu16_t charsubset; }; struct aim_incomingim_ch2_args {