diff libpurple/protocols/zephyr/ZRetSubs.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/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 *)&notice, 0, sizeof(notice));
+	notice.z_message = asciiport;
+	notice.z_message_len = strlen(asciiport)+1;
+	notice.z_opcode = CLIENT_GIMMESUBS;
+
+	return(Z_RetSubs(&notice, nsubs, ZAUTH));
+}
+
+#if 0
+Code_t ZRetrieveDefaultSubscriptions(nsubs)
+	int *nsubs;
+{
+	ZNotice_t notice;
+
+	(void) memset((char *)&notice, 0, sizeof(notice));
+	notice.z_message = (char *) 0;
+	notice.z_message_len = 0;
+	notice.z_opcode = CLIENT_GIMMEDEFS;
+
+	return(Z_RetSubs(&notice, 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,
+					  &notice->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);
+}