Mercurial > pidgin
diff libpurple/protocols/zephyr/ZRetSubs.c @ 15373: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/ZRetSubs.c Sat Jan 20 02:32:10 2007 +0000 @@ -0,0 +1,179 @@ +/* This file is part of the Project Athena Zephyr Notification System. + * It contains source for the ZRetrieveSubscriptions and + * ZRetrieveDefaultSubscriptions functions. + * + * Created by: Robert French + * + * Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology. + * For copying and distribution information, see the file + * "mit-copyright.h". + */ + +#include "internal.h" + +static Code_t Z_RetSubs(ZNotice_t *notice, int *nsubs, Z_AuthProc auth_routine); + +/* Need STDC definition when possible for unsigned short argument. */ +#ifdef __STDC__ +Code_t ZRetrieveSubscriptions(unsigned short port, int *nsubs) +#else +Code_t ZRetrieveSubscriptions(port,nsubs) + unsigned short port; + int *nsubs; +#endif +{ + int retval; + ZNotice_t notice; + char asciiport[50]; + + if (!port) /* use default port */ + port = __Zephyr_port; + + retval = ZMakeAscii16(asciiport, sizeof(asciiport), ntohs(port)); + if (retval != ZERR_NONE) + return (retval); + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_message = asciiport; + notice.z_message_len = strlen(asciiport)+1; + notice.z_opcode = CLIENT_GIMMESUBS; + + return(Z_RetSubs(¬ice, nsubs, ZAUTH)); +} + +#if 0 +Code_t ZRetrieveDefaultSubscriptions(nsubs) + int *nsubs; +{ + ZNotice_t notice; + + (void) memset((char *)¬ice, 0, sizeof(notice)); + notice.z_message = (char *) 0; + notice.z_message_len = 0; + notice.z_opcode = CLIENT_GIMMEDEFS; + + return(Z_RetSubs(¬ice, nsubs, ZNOAUTH)); + +} +#endif + +static Code_t Z_RetSubs(notice, nsubs, auth_routine) + register ZNotice_t *notice; + int *nsubs; + Z_AuthProc auth_routine; +{ + register int i; + int retval,nrecv,gimmeack; + ZNotice_t retnotice; + char *ptr,*end,*ptr2; + + retval = ZFlushSubscriptions(); + + if (retval != ZERR_NONE && retval != ZERR_NOSUBSCRIPTIONS) + return (retval); + + if (ZGetFD() < 0) + if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE) + return (retval); + + notice->z_kind = ACKED; + notice->z_port = __Zephyr_port; + notice->z_class = ZEPHYR_CTL_CLASS; + notice->z_class_inst = ZEPHYR_CTL_CLIENT; + notice->z_sender = 0; + notice->z_recipient = ""; + notice->z_default_format = ""; + + if ((retval = ZSendNotice(notice,auth_routine)) != ZERR_NONE) + return (retval); + + nrecv = 0; + gimmeack = 0; + __subscriptions_list = (ZSubscription_t *) 0; + + while (!nrecv || !gimmeack) { + retval = Z_WaitForNotice (&retnotice, ZCompareMultiUIDPred, + ¬ice->z_multiuid, SRV_TIMEOUT); + if (retval == ZERR_NONOTICE) + return ETIMEDOUT; + else if (retval != ZERR_NONE) + return retval; + + if (retnotice.z_kind == SERVNAK) { + ZFreeNotice(&retnotice); + return (ZERR_SERVNAK); + } + /* non-matching protocol version numbers means the + server is probably an older version--must punt */ + if (strcmp(notice->z_version,retnotice.z_version)) { + ZFreeNotice(&retnotice); + return(ZERR_VERS); + } + if (retnotice.z_kind == SERVACK && + !strcmp(retnotice.z_opcode,notice->z_opcode)) { + ZFreeNotice(&retnotice); + gimmeack = 1; + continue; + } + + if (retnotice.z_kind != ACKED) { + ZFreeNotice(&retnotice); + return (ZERR_INTERNAL); + } + + nrecv++; + + end = retnotice.z_message+retnotice.z_message_len; + + __subscriptions_num = 0; + for (ptr=retnotice.z_message;ptr<end;ptr++) + if (!*ptr) + __subscriptions_num++; + + __subscriptions_num = __subscriptions_num / 3; + + __subscriptions_list = (ZSubscription_t *) + malloc((unsigned)(__subscriptions_num* + sizeof(ZSubscription_t))); + if (__subscriptions_num && !__subscriptions_list) { + ZFreeNotice(&retnotice); + return (ENOMEM); + } + + for (ptr=retnotice.z_message,i = 0; i< __subscriptions_num; i++) { + __subscriptions_list[i].zsub_class = (char *) + malloc((unsigned)strlen(ptr)+1); + if (!__subscriptions_list[i].zsub_class) { + ZFreeNotice(&retnotice); + return (ENOMEM); + } + (void) strcpy(__subscriptions_list[i].zsub_class,ptr); + ptr += strlen(ptr)+1; + __subscriptions_list[i].zsub_classinst = (char *) + malloc((unsigned)strlen(ptr)+1); + if (!__subscriptions_list[i].zsub_classinst) { + ZFreeNotice(&retnotice); + return (ENOMEM); + } + (void) strcpy(__subscriptions_list[i].zsub_classinst,ptr); + ptr += strlen(ptr)+1; + ptr2 = ptr; + if (!*ptr2) + ptr2 = "*"; + __subscriptions_list[i].zsub_recipient = (char *) + malloc((unsigned)strlen(ptr2)+1); + if (!__subscriptions_list[i].zsub_recipient) { + ZFreeNotice(&retnotice); + return (ENOMEM); + } + (void) strcpy(__subscriptions_list[i].zsub_recipient,ptr2); + ptr += strlen(ptr)+1; + } + ZFreeNotice(&retnotice); + } + + __subscriptions_next = 0; + *nsubs = __subscriptions_num; + + return (ZERR_NONE); +}