martin: server/imap Makefile, NONE, 1.1 README, NONE, 1.1 imap.annotate.patch, NONE, 1.1 kolab.patch, NONE, 1.1

cvs at intevation.de cvs at intevation.de
Sat Jun 11 18:52:43 CEST 2005


Author: martin

Update of /kolabrepository/server/imap
In directory doto:/tmp/cvs-serv2132/imap

Added Files:
	Makefile README imap.annotate.patch kolab.patch 
Log Message:
Martin Konold: Initial work for makeing a Kolab specific version of University of Washington c-client imap library. Adding support for IMAP ANNOTATEMORE


--- NEW FILE: Makefile ---
ifeq "x$(KOLABPKGURI)" "x"
  KOLABPKGURI = ftp://ftp.openpkg.org/release/2.3/SRC
endif
ifeq "x$(KOLABRPMSRC)" "x"
  KOLABRPMSRC = /kolab/RPM/SRC
endif
ifeq "x$(KOLABCVSDIR)" "x"
  KOLABCVSDIR = $(CURDIR)
endif

PACKAGE=imap
VERSION=2004a
RELEASE=2.2.0_kolab1

RPM=/kolab/bin/openpkg rpm
 
all: $(PACKAGE)-$(VERSION)-$(RELEASE).src.rpm
	$(RPM) -ihv $(PACKAGE)-$(VERSION)-$(RELEASE).src.rpm

	cp $(KOLABCVSDIR)/kolab.patch $(KOLABRPMSRC)/$(PACKAGE)/           # Patch for imap.spec
	cp $(KOLABCVSDIR)/imap.annotate.patch $(KOLABRPMSRC)/$(PACKAGE)/   # Patch to add annotate support   
	
	cd $(KOLABRPMSRC)/$(PACKAGE) && patch < $(KOLABCVSDIR)/kolab.patch && $(RPM) -ba $(PACKAGE).spec --define 'with_annotate yes'
	
imap-$(VERSION)-$(RELEASE).src.rpm:
	wget -c $(KOLABPKGURI)/imap-$(VERSION)-$(RELEASE).src.rpm

clean:
	rm -rf /kolab/RPM/TMP/imap-*

--- NEW FILE: README ---
maintain patches for the openpkg imap source rpm

to build imap for kolab run make

Patches maintained here:
========================

imap_annotation.patch: Add support for IMAP annotations to UW library.
                       This patch already committed upstream

kolab.patch: Patch to the OpenPKG specfile
             Needs be send upstream to the OpenPKG people

--- NEW FILE: imap.annotate.patch ---
diff -ru imap-2004e.DEV.SNAP-0505252319/src/c-client/imap4r1.c imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/imap4r1.c
--- imap-2004e.DEV.SNAP-0505252319/src/c-client/imap4r1.c	2005-05-26 08:09:54.000000000 +0200
+++ imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/imap4r1.c	2005-06-06 11:07:01.000000000 +0200
@@ -125,7 +125,8 @@
 #define MULTIAPPEND 13
 #define SNLIST 14
 #define MULTIAPPENDREDO 15
-
+#define QLIST 16
+#define QSTRING 17
 
 /* Append data */
 
@@ -195,12 +196,15 @@
 void imap_gc_body (BODY *body);
 void imap_capability (MAILSTREAM *stream);
 long imap_acl_work (MAILSTREAM *stream,char *command,IMAPARG *args[]);
+long imap_annotation_work (MAILSTREAM *stream,char *command,IMAPARG *args[]);
 
 IMAPPARSEDREPLY *imap_send (MAILSTREAM *stream,char *cmd,IMAPARG *args[]);
 IMAPPARSEDREPLY *imap_sout (MAILSTREAM *stream,char *tag,char *base,char **s);
 long imap_soutr (MAILSTREAM *stream,char *string);
 IMAPPARSEDREPLY *imap_send_astring (MAILSTREAM *stream,char *tag,char **s,
 				    SIZEDTEXT *as,long wildok,char *limit);
+IMAPPARSEDREPLY *imap_send_qstring (MAILSTREAM *stream,char *tag,char **s,
+				    SIZEDTEXT *as,char *limit);
 IMAPPARSEDREPLY *imap_send_literal (MAILSTREAM *stream,char *tag,char **s,
 				    STRING *st);
 IMAPPARSEDREPLY *imap_send_spgm (MAILSTREAM *stream,char *tag,char *base,
@@ -2679,6 +2683,84 @@
     args[0] = &ambx; args[1] = NIL;
   return imap_acl_work (stream,"GETACL",args);
 }
+
+/* IMAP set annotation
+ * Accepts: mail stream
+ *          annotation struct
+ * Returns: T on success, NIL on failure
+ */
+
+long imap_setannotation (MAILSTREAM *stream,ANNOTATION *annotation)
+{
+  IMAPARG *args[4],ambx,apth,aval;
+  long ret;
+  
+  ambx.type = ASTRING;
+  ambx.text = (void *) annotation->mbox;
+  args[0] = &ambx;
+  
+  apth.type = QSTRING;
+  apth.text = (void *) annotation->entry;
+  args[1] = &apth;
+
+  STRINGLIST *st,*l;
+  ANNOTATION_VALUES *v;
+  
+  l = st = mail_newstringlist();
+  v = annotation->values;
+  while(v){
+    l->text.size = strlen((char *) (l->text.data = (unsigned char*)cpystr(v->attr)));
+    l->next = mail_newstringlist();
+    l = l->next;
+    l->text.size = strlen((char *) (l->text.data = (unsigned char*)cpystr(v->value)));
+    if(v->next){
+      l->next = mail_newstringlist();
+      l = l->next;
+    }
+    v = v->next;
+  }
+  
+  aval.type = QLIST;
+  aval.text = (void *)st;
+  args[2] = &aval;
+  args[3] = NIL;
+  
+  ret = imap_annotation_work(stream, "SETANNOTATION",args);
+  mail_free_stringlist(&st);
+  return ret;
+}
+  
+  
+  
+/* IMAP get annotation
+ * Accepts: mail stream
+ *          mailbox name
+ *          annotation entry list
+ *          annotation attribute list
+ * Returns: T on success with data returned via callback, NIL on failure
+ */
+
+long imap_getannotation (MAILSTREAM *stream,char *mailbox,STRINGLIST *entries, STRINGLIST *attributes)
+{
+  IMAPARG *args[4],ambx,apth,aattr;
+  long ret;
+  ambx.type = ASTRING;
+  ambx.text = (void*) mailbox;
+  args[0] = &ambx; 
+
+ 
+  apth.type = QLIST;
+  apth.text = (void*) entries;
+  args[1] = &apth;
+
+  aattr.type = QLIST;
+  aattr.text = (void*) attributes;
+  args[2] = &aattr;
+
+  args[3] = NIL;
+  ret = imap_annotation_work(stream, "GETANNOTATION",args);
+  return ret;
+}
 
 /* IMAP list rights
  * Accepts: mail stream
@@ -2731,6 +2813,16 @@
   else mm_log ("ACL not available on this IMAP server",ERROR);
   return ret;
 }
+ long imap_annotation_work(MAILSTREAM *stream, char *command,IMAPARG *args[])
+{
+  long ret = NIL;
+  IMAPPARSEDREPLY *reply;
+  if (imap_OK (stream,reply = imap_send (stream,command,args)))
+    ret = LONGT;
+  else mm_log (reply->text,ERROR);
+  return ret;
+}
+
 
 /* IMAP set quota
  * Accepts: mail stream
@@ -2863,6 +2955,11 @@
       if (reply = imap_send_astring (stream,tag,&s,&st,NIL,CMDBASE+MAXCOMMAND))
 	return reply;
       break;
+    case QSTRING:		/* atom or string, must be literal? */
+      st.size = strlen ((char *) (st.data = (unsigned char *) arg->text));
+      if (reply = imap_send_qstring (stream,tag,&s,&st,CMDBASE+MAXCOMMAND))
+	return reply;
+      break;
     case LITERAL:		/* literal, as a stringstruct */
       if (reply = imap_send_literal (stream,tag,&s,arg->text)) return reply;
       break;
@@ -2879,6 +2976,18 @@
       while (list = list->next);
       *s++ = ')';		/* close list */
       break;
+    case QLIST:			/* list of strings */
+      list = (STRINGLIST *) arg->text;
+      c = '(';			/* open paren */
+      do {			/* for each list item */
+	*s++ = c;		/* write prefix character */
+	if (reply = imap_send_qstring (stream,tag,&s,&list->text,
+				       CMDBASE+MAXCOMMAND)) return reply;
+	c = ' ';		/* prefix character for subsequent strings */
+      }
+      while (list = list->next);
+      *s++ = ')';		/* close list */
+      break;
     case SEARCHPROGRAM:		/* search program */
       if (reply = imap_send_spgm (stream,tag,CMDBASE,&s,arg->text,
 				  CMDBASE+MAXCOMMAND))
@@ -3046,6 +3155,32 @@
   mail_unlock (stream);		/* unlock stream */
   return reply;
 }
+
+/* IMAP send quoted-string
+ * Accepts: MAIL stream
+ *	    reply tag
+ *	    pointer to current position pointer of output bigbuf
+ *	    atom-string to output
+ *	    maximum to write as atom or qstring
+ * Returns: error reply or NIL if success
+ */
+
+IMAPPARSEDREPLY *imap_send_qstring (MAILSTREAM *stream,char *tag,char **s,
+				    SIZEDTEXT *as,char *limit)
+{
+  unsigned long j;
+  char c;
+  STRING st;
+				/* in case needed */
+  INIT (&st,mail_string,(void *) as->data,as->size);
+				/* always write literal if no space */
+  if ((*s + as->size) > limit) return imap_send_literal (stream,tag,s,&st);
+
+  *(*s)++ = '"';	/* write open quote */
+  for (j = 0; j < as->size; j++) *(*s)++ = as->data[j];
+  *(*s)++ = '"';	/* write close quote */
+  return NIL;
+}
 
 /* IMAP send atom-string
  * Accepts: MAIL stream
@@ -3948,6 +4083,50 @@
     }
   }
 
+  else if (!strcmp (reply->key,"ANNOTATION") && (s = reply->text)){
+    char * mbox;    
+    /* response looks like ANNOTATION "mailbox" "entry" ("attr" "value" ["attr" "value"]) ["entry" ("attr "value" ["attr" "value"] )]*/
+    getannotation_t an = (getannotation_t) mail_parameters (NIL,GET_ANNOTATION,NIL);
+    
+    mbox = imap_parse_astring (stream, &s, reply,NIL);
+    
+    while(*s){
+      ANNOTATION * al = mail_newannotation();    
+      al->mbox = cpystr(mbox);
+      t = imap_parse_astring (stream, &s, reply,NIL);
+      al->entry = t;
+      STRINGLIST *strlist;
+      if (s){while (*s == ' ')s++;}
+      
+      strlist = imap_parse_stringlist(stream, &s,reply);
+
+      ANNOTATION_VALUES *vlIter, *vlBegin;
+      vlIter = vlBegin = NIL;
+      if (strlist) {
+        while(strlist){	
+          if(vlIter){
+            vlIter->next = mail_newannotationvalue();
+            vlIter = vlIter->next;
+          }else{
+            vlIter = mail_newannotationvalue();
+            vlBegin = vlIter;
+          }
+          if ( strlist->text.size )
+            vlIter->attr = cpystr (strlist->text.data);        
+          strlist = strlist->next;        
+          if(!strlist) continue;
+          if ( strlist->text.size )
+            vlIter->value = cpystr (strlist->text.data);
+          strlist = strlist->next;
+        }
+      }
+      al->values = vlBegin;
+      if (an) 
+        (*an) (stream,al);
+      mail_free_annotation(&al);
+    }
+    fs_give ((void **)&mbox);
+  }
   else if (!strcmp (reply->key,"ACL") && (s = reply->text) &&
 	   (t = imap_parse_astring (stream,&s,reply,NIL))) {
     getacl_t ar = (getacl_t) mail_parameters (NIL,GET_ACL,NIL);
diff -ru imap-2004e.DEV.SNAP-0505252319/src/c-client/imap4r1.h imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/imap4r1.h
--- imap-2004e.DEV.SNAP-0505252319/src/c-client/imap4r1.h	2005-04-07 20:40:17.000000000 +0200
+++ imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/imap4r1.h	2005-06-03 14:22:14.000000000 +0200
@@ -232,3 +232,5 @@
 long imap_setquota (MAILSTREAM *stream,char *qroot,STRINGLIST *limits);
 long imap_getquota (MAILSTREAM *stream,char *qroot);
 long imap_getquotaroot (MAILSTREAM *stream,char *mailbox);
+long imap_getannotation (MAILSTREAM *stream,char *mailbox,STRINGLIST *entries,STRINGLIST *attributes);
+long imap_setannotation (MAILSTREAM *stream,ANNOTATION *annotation); 
diff -ru imap-2004e.DEV.SNAP-0505252319/src/c-client/mail.c imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/mail.c
--- imap-2004e.DEV.SNAP-0505252319/src/c-client/mail.c	2005-03-17 01:12:17.000000000 +0100
+++ imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/mail.c	2005-06-06 10:36:04.000000000 +0200
@@ -60,6 +60,7 @@
 static newsrcquery_t mailnewsrcquery = NIL;
 				/* ACL results callback */
 static getacl_t mailaclresults = NIL;
+static getannotation_t mailannotationresults = NIL;
 				/* list rights results callback */
 static listrights_t maillistrightsresults = NIL;
 				/* my rights results callback */
@@ -516,6 +517,11 @@
     ret = (void *) (debugsensitive ? VOIDT : NIL);
     break;
 
+  case SET_ANNOTATION:
+    mailannotationresults = (getannotation_t) value;
+  case GET_ANNOTATION:
+    ret = (void *) mailannotationresults;
+    break;
   case SET_ACL:
     mailaclresults = (getacl_t) value;
   case GET_ACL:
@@ -5487,7 +5493,15 @@
   return (ACLLIST *) memset (fs_get (sizeof (ACLLIST)),0,sizeof (ACLLIST));
 }
 
+ANNOTATION *mail_newannotation (void)
+{
+  return (ANNOTATION *) memset (fs_get (sizeof (ANNOTATION)),0,sizeof(ANNOTATION));
+}
 
+ANNOTATION_VALUES *mail_newannotationvalue (void)
+{
+  return (ANNOTATION_VALUES *) memset (fs_get (sizeof (ANNOTATION_VALUES)),0,sizeof(ANNOTATION_VALUES));
+}
 /* Mail instantiate new quotalist
  * Returns: new quotalist
  */
@@ -5810,6 +5824,25 @@
   }
 }
 
+static void mail_free_annotation_values(ANNOTATION_VALUES **val)
+{
+  if (*val) {
+    if ((*val)->attr) fs_give ((void**) &(*val)->attr);
+    if ((*val)->value) fs_give ((void**) &(*val)->value);
+    mail_free_annotation_values (&(*val)->next);
+    fs_give ((void **) val);
+  }
+}				
+void mail_free_annotation(ANNOTATION **al)
+{
+  if (*al) {
+    if((*al)->mbox) fs_give ((void**) &(*al)->mbox);
+    if((*al)->entry) fs_give ((void**) &(*al)->entry);
+    if((*al)->values)
+      mail_free_annotation_values(&(*al)->values);
+    fs_give ((void **) al);
+  }
+}
 
 /* Mail garbage collect quotalist
  * Accepts: pointer to quotalist pointer
diff -ru imap-2004e.DEV.SNAP-0505252319/src/c-client/mail.h imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/mail.h
--- imap-2004e.DEV.SNAP-0505252319/src/c-client/mail.h	2005-02-09 00:44:54.000000000 +0100
+++ imap-2004e.DEV.SNAP-0505252319_annotate/src/c-client/mail.h	2005-06-06 10:37:59.000000000 +0200
@@ -311,6 +311,8 @@
 #define SET_SNARFPRESERVE (long) 567
 #define GET_INBOXPATH (long) 568
 #define SET_INBOXPATH (long) 569
+#define GET_ANNOTATION (long) 570
+#define SET_ANNOTATION (long) 571
 
 /* Driver flags */
 
@@ -978,6 +980,24 @@
   ACLLIST *next;
 };
 
+/* ANNOTATION Response */
+
+#define ANNOTATION_VALUES struct annotation_value_list
+
+ANNOTATION_VALUES {
+	char *attr;
+	char *value;
+	ANNOTATION_VALUES *next;
+};
+
+#define ANNOTATION struct annotation
+
+ANNOTATION {
+	char *mbox;
+	char *entry;
+	ANNOTATION_VALUES * values;
+};
+
 /* Quota resource list */
 
 #define QUOTALIST struct quota_list
@@ -1262,6 +1282,7 @@
 typedef long (*sslcertificatequery_t) (char *reason,char *host,char *cert);
 typedef void (*sslfailure_t) (char *host,char *reason,unsigned long flags);
 typedef void (*logouthook_t) (void *data);
+typedef void (*getannotation_t) (MAILSTREAM *stream,ANNOTATION* annot);
 
 /* Globals */
 
@@ -1671,7 +1692,10 @@
 SORTPGM *mail_newsortpgm (void);
 THREADNODE *mail_newthreadnode (SORTCACHE *sc);
 ACLLIST *mail_newacllist (void);
+ANNOTATION* mail_newannotation(void);
+ANNOTATION_VALUES* mail_newannotationvalue(void);
 QUOTALIST *mail_newquotalist (void);
+void mail_free_annotation(ANNOTATION **a);
 void mail_free_body (BODY **body);
 void mail_free_body_data (BODY *body);
 void mail_free_body_parameter (PARAMETER **parameter);
diff -ru imap-2004e.DEV.SNAP-0505252319/src/mtest/mtest.c imap-2004e.DEV.SNAP-0505252319_annotate/src/mtest/mtest.c
--- imap-2004e.DEV.SNAP-0505252319/src/mtest/mtest.c	2005-04-07 20:40:57.000000000 +0200
+++ imap-2004e.DEV.SNAP-0505252319_annotate/src/mtest/mtest.c	2005-06-06 10:37:30.000000000 +0200
@@ -137,6 +137,8 @@
 #endif
   return NIL;
 }
+
+void mm_annotation (MAILSTREAM *stream, ANNOTATION *a);
 
 /* MM command loop
  * Accepts: MAIL stream
@@ -187,6 +189,28 @@
 	mail_setflag (stream,arg,"\\DELETED");
       else puts ("?Bad message number");
       break;
+    case 'A':
+      {
+        char parms[MAILTMPLEN];
+        prompt("Annotation: ",parms);
+        if (parms) {
+          mail_parameters(stream,SET_ANNOTATION,mm_annotation);
+          STRINGLIST *entries = mail_newstringlist();
+          STRINGLIST *cur = entries;
+          cur->text.size = strlen((char *) (cur->text.data = (unsigned char*)cpystr (parms)));
+          cur->next = NIL;
+          
+          STRINGLIST *attributes = mail_newstringlist();
+          cur = attributes;
+          cur->text.size = strlen((char *) (cur->text.data = (unsigned char*)cpystr ("*")));
+          cur->next = NIL;
+          
+          imap_getannotation(stream,"INBOX",entries,attributes);
+          mail_free_stringlist(&entries);
+          mail_free_stringlist(&attributes);
+        }
+      }
+      break;  
     case 'E':			/* Expunge command */
       mail_expunge (stream);
       last = 0;
@@ -339,7 +363,7 @@
     case '?':			/* ? command */
       puts ("Body, Check, Delete, Expunge, Find, GC, Headers, Literal,");
       puts (" MailboxStatus, New Mailbox, Overview, Ping, Quit, Send, Type,");
-      puts ("Undelete, Xit, +, -, or <RETURN> for next message");
+      puts ("Undelete, Xit,Annotation, +, -, or <RETURN> for next message");
       break;
     default:			/* bogus command */
       printf ("?Unrecognized command: %s\n",cmd);
@@ -587,6 +611,18 @@
 
 /* Interfaces to C-client */
 
+void mm_annotation (MAILSTREAM *stream, ANNOTATION *a)
+{
+  if(a){
+    fprintf(stderr,"mailbox: %s\nentry: %s\n",a->mbox,a->entry);
+    ANNOTATION_VALUES * v = a->values;
+    while(v){
+      fprintf(stderr,"attr: %s, value: %s\n",v->attr,v->value);
+      v = v->next;
+    }
+  }
+}
+
 
 void mm_searched (MAILSTREAM *stream,unsigned long number)
 {

--- NEW FILE: kolab.patch ---
--- imap.spec.orig	2005-06-11 13:19:01.000000000 +0200
+++ imap.spec	2005-06-11 18:45:54.000000000 +0200
@@ -39,16 +39,18 @@
 Group:        Mail
 License:      University of Washington's Free-Fork License
 Version:      %{V_here}
-Release:      2.2.0
+Release:      2.2.0_kolab1
 
 #   package options
 %option       with_ssl      yes
 %option       with_pam      no
 %option       with_daemons  no
 %option       with_mbxdef   no
+%option       with_annotate no
 
 #   list of sources
 Source0:      ftp://ftp.cac.washington.edu/imap/imap-%{V_real}.tar.Z
+Patch0:       imapd.patch
 
 #   build information
 Prefix:       %{l_prefix}
@@ -83,6 +85,10 @@
 %prep
     %setup -q -n imap-%{V_real}
 
+%if "%{with_annotate}" == "yes"
+    %patch -p0 -P 0
+%endif
+
 %build
     mflags="%{l_mflags}"
     cflags="%{l_cflags}"





More information about the commits mailing list