Mercurial > pidgin.yaz
diff libpurple/protocols/zephyr/ZAsyncLocate.c @ 15374:5fe8042783c1
Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sat, 20 Jan 2007 02:32:10 +0000 |
parents | |
children | a8cc50c2279f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/zephyr/ZAsyncLocate.c Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,162 @@ +/* This file is part of the Project Athena Zephyr Notification System. + * It contains source for asynchronous location functions. + * + * Created by: Marc Horowitz + * + * Copyright (c) 1990,1991 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ + +#include "internal.h" + +Code_t ZRequestLocations(user, zald, kind, auth) + const char *user; + ZAsyncLocateData_t *zald; + ZNotice_Kind_t kind; /* UNSAFE, UNACKED, or ACKED */ + Z_AuthProc auth; +{ + int retval; + ZNotice_t notice; + + if (ZGetFD() < 0) + if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE) + return (retval); + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_kind = kind; + notice.z_port = __Zephyr_port; + notice.z_class = LOCATE_CLASS; + notice.z_class_inst = user; + notice.z_opcode = LOCATE_LOCATE; + notice.z_sender = 0; + notice.z_recipient = ""; + notice.z_default_format = ""; + notice.z_message_len = 0; + + if ((retval = ZSendNotice(¬ice, auth)) != ZERR_NONE) + return(retval); + + if ((zald->user = (char *) malloc(strlen(user)+1)) == NULL) { + return(ENOMEM); + } + if ((zald->version = (char *) malloc(strlen(notice.z_version)+1)) == NULL) { + free(zald->user); + return(ENOMEM); + } + zald->uid = notice.z_multiuid; + strcpy(zald->user,user); + strcpy(zald->version,notice.z_version); + + return(ZERR_NONE); +} + +Code_t ZParseLocations(notice,zald,nlocs,user) + ZNotice_t *notice; + ZAsyncLocateData_t *zald; + int *nlocs; + char **user; +{ + char *ptr, *end; + int i; + + ZFlushLocations(); /* This never fails (this function is part of the + library, so it is allowed to know this). */ + + /* non-matching protocol version numbers means the + server is probably an older version--must punt */ + + if (zald && strcmp(notice->z_version, zald->version)) + return(ZERR_VERS); + + if (notice->z_kind == SERVNAK) + return (ZERR_SERVNAK); + + /* flag ACKs as special */ + if (notice->z_kind == SERVACK && + !strcmp(notice->z_opcode, LOCATE_LOCATE)) { + *nlocs = -1; + return(ZERR_NONE); + } + + if (notice->z_kind != ACKED) + return (ZERR_INTERNAL); + + end = notice->z_message+notice->z_message_len; + + __locate_num = 0; + + for (ptr=notice->z_message;ptr<end;ptr++) + if (!*ptr) + __locate_num++; + + __locate_num /= 3; + + if (__locate_num) + { + __locate_list = (ZLocations_t *)malloc((unsigned)__locate_num* + sizeof(ZLocations_t)); + if (!__locate_list) + return (ENOMEM); + } else { + __locate_list = 0; + } + + for (ptr=notice->z_message, i=0; i<__locate_num; i++) { + unsigned int len; + + len = strlen (ptr) + 1; + __locate_list[i].host = (char *) malloc(len); + if (!__locate_list[i].host) + return (ENOMEM); + (void) strcpy(__locate_list[i].host, ptr); + ptr += len; + + len = strlen (ptr) + 1; + __locate_list[i].time = (char *) malloc(len); + if (!__locate_list[i].time) + return (ENOMEM); + (void) strcpy(__locate_list[i].time, ptr); + ptr += len; + + len = strlen (ptr) + 1; + __locate_list[i].tty = (char *) malloc(len); + if (!__locate_list[i].tty) + return (ENOMEM); + (void) strcpy(__locate_list[i].tty, ptr); + ptr += len; + } + + __locate_next = 0; + *nlocs = __locate_num; + if (user) { + if (zald) { + if ((*user = (char *) malloc(strlen(zald->user)+1)) == NULL) + return(ENOMEM); + strcpy(*user,zald->user); + } else { + if ((*user = (char *) malloc(strlen(notice->z_class_inst)+1)) == NULL) + return(ENOMEM); + strcpy(*user,notice->z_class_inst); + } + } + return (ZERR_NONE); +} + +int ZCompareALDPred(notice, zald) + ZNotice_t *notice; + void *zald; +{ + return(ZCompareUID(&(notice->z_multiuid), + &(((ZAsyncLocateData_t *) zald)->uid))); +} + +void ZFreeALD(zald) + ZAsyncLocateData_t *zald; +{ + if (!zald) return; + + if (zald->user) free(zald->user); + if (zald->version) free(zald->version); + (void) memset(zald, 0, sizeof(*zald)); +}