Finalize vcard editing:
authorWilfried Goesgens <willi@arangodb.com>
Sun, 18 Oct 2015 18:15:48 +0000 (20:15 +0200)
committerWilfried Goesgens <willi@arangodb.com>
Sun, 18 Oct 2015 18:15:48 +0000 (20:15 +0200)
  - remove deprecated paramhandling functions that une implicit strlen() and their easy errnous usecases
  - add handling for : (and url escaped:) splitting of parameters
  - implement posting of vcards to structured grammers.

12 files changed:
webcit/addressbook_popup.c
webcit/debian/rules
webcit/messages.c
webcit/msg_renderers.c
webcit/paramhandling.c
webcit/paramhandling.h
webcit/static/t/vcard/edit.html
webcit/static/t/vcard/msg_display.html
webcit/subst.c
webcit/tabs.c
webcit/vcard_edit.c
webcit/webcit.c

index 995ec6fd0219920ca92d36efd754171476e4123a..c119cc18ee0b206df714070fa64cfe5367e48dcf 100644 (file)
@@ -28,7 +28,7 @@ HashList* GetAddressbookList()
        long BufLen;
        int IsLocalAddrBook;
 
        long BufLen;
        int IsLocalAddrBook;
 
-       WhichAddrBook = SBSTR("which_addr_book");
+       WhichAddrBook = sbstr("which_addr_book");
        IsLocalAddrBook = strcasecmp(ChrPtr(WhichAddrBook), "__LOCAL_USERS__") == 1;
 
        if (IsLocalAddrBook) {
        IsLocalAddrBook = strcasecmp(ChrPtr(WhichAddrBook), "__LOCAL_USERS__") == 1;
 
        if (IsLocalAddrBook) {
index fd7a2fc9ce50e10178e10477823ce6db6d249b1d..46eecdca869c5cafa0136b225d36774eb46cd2ab 100755 (executable)
@@ -59,7 +59,7 @@ endif
                --with-wwwdir=/usr/share/citadel-webcit \
                --with-localedir=/usr/share/ \
                --with-editordir=/usr/share/tinymce/www/ \
                --with-wwwdir=/usr/share/citadel-webcit \
                --with-localedir=/usr/share/ \
                --with-editordir=/usr/share/tinymce/www/ \
-               --with-markdowneditordir=/usr/share/epic/www/ \
+               --with-markdowneditordir=/usr/share/citadel-webcit/epic/ \
                --with-rundir=/var/run/citadel \
                 --with-ssldir=/etc/ssl/webcit/ \
                --with-etcdir=/etc/citadel \
                --with-rundir=/var/run/citadel \
                 --with-ssldir=/etc/ssl/webcit/ \
                --with-etcdir=/etc/citadel \
@@ -96,7 +96,7 @@ install: build
        dh_testroot
        dh_clean -k 
        dh_installdirs
        dh_testroot
        dh_clean -k 
        dh_installdirs
-       $(MAKE) install-bin install-locale install-wwwdata install-cfg DESTDIR=$(DESTDIR)
+       $(MAKE) install-bin install-locale install-wwwdata install-cfg install-epic DESTDIR=$(DESTDIR)
        chmod a-x -R $(DESTDIR)/usr/share/citadel-webcit/static/*
        find $(DESTDIR)/usr/share/locale/ -name webcit.mo -exec chmod a-x {} \;
        rm $(DESTDIR)/usr/share/citadel-webcit/static/prototype.js
        chmod a-x -R $(DESTDIR)/usr/share/citadel-webcit/static/*
        find $(DESTDIR)/usr/share/locale/ -name webcit.mo -exec chmod a-x {} \;
        rm $(DESTDIR)/usr/share/citadel-webcit/static/prototype.js
index 020e81665ca46a1e60d666d723d10da052ab7dfe..70cd85ab80c794c3e8fb68bde5073ff20a8371a1 100644 (file)
@@ -1221,7 +1221,7 @@ void upload_attachment(void) {
        att->length = WCC->upload_length;
        att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1);
        att->FileName = NewStrBufDup(WCC->upload_filename);
        att->length = WCC->upload_length;
        att->ContentType = NewStrBufPlain(WCC->upload_content_type, -1);
        att->FileName = NewStrBufDup(WCC->upload_filename);
-       UID = SBSTR("qquuid");
+       UID = sbstr("qquuid");
        if (UID)
                att->PartNum = NewStrBufDup(UID);
 
        if (UID)
                att->PartNum = NewStrBufDup(UID);
 
index 5bfc364e5266bb6ad69184462e6443d625bbc605..ed8de1fe96b56f26fbd66f6b68c5290f7071224a 100644 (file)
@@ -932,7 +932,7 @@ void tmplput_MAIL_SUMM_PERMALINK(StrBuf *Target, WCTemplputParams *TP)
 
        perma_link = NewStrBufPlain(HKEY("/readfwd?go="));
        StrBufUrlescAppend(perma_link, WC->CurRoom.name, NULL);
 
        perma_link = NewStrBufPlain(HKEY("/readfwd?go="));
        StrBufUrlescAppend(perma_link, WC->CurRoom.name, NULL);
-       View = SBSTR("view");
+       View = sbstr("view");
        if (View != NULL) {
                StrBufAppendBufPlain(perma_link, HKEY("?view="), 0);
                StrBufAppendBuf(perma_link, View, 0);
        if (View != NULL) {
                StrBufAppendBufPlain(perma_link, HKEY("?view="), 0);
                StrBufAppendBuf(perma_link, View, 0);
index bfc8ac7ff1dfdead5a1132718425a9415e68e746..15905caa8b7caa0d30483c0f49247a665b290224 100644 (file)
@@ -62,7 +62,7 @@ void PutSubstructUrlKey(HashList *list, urlcontent *u, char **keys, long *length
 }
 
 void PutUrlKey(HashList *urlstrings, urlcontent *u, int have_colons) {
 }
 
 void PutUrlKey(HashList *urlstrings, urlcontent *u, int have_colons) {
-       if (!have_colons) {
+       if (have_colons == 0) {
                Put(urlstrings, u->url_key, u->klen, u, free_url);
        }
        else {
                Put(urlstrings, u->url_key, u->klen, u, free_url);
        }
        else {
@@ -78,22 +78,54 @@ void PutUrlKey(HashList *urlstrings, urlcontent *u, int have_colons) {
                pchs = pch = u->url_key;
                pche = u->url_key + u->klen;
                while ((i < 10) && (pch <= pche)) {
                pchs = pch = u->url_key;
                pche = u->url_key + u->klen;
                while ((i < 10) && (pch <= pche)) {
-                       if ((*pch != ':') && (pch != pche)){
-                               pch ++;
-                               continue;
-                       }
-                       *pch = '\0';
-                       if (i == 0) {
-                               /* Separate the toplevel key : */
-                               u->klen = pch - pchs;
+                       if ((have_colons == 2) &&
+                           (*pch == '%') &&
+                           (*(pch + 1) == '3') && 
+                           ((*(pch + 2) == 'A') ||
+                            (*(pch + 1) == 'a')
+                                   ))
+                       {
+                               *pch = '\0';
+
+                               if (i == 0) {
+                                       /* Separate the toplevel key : */
+                                       u->klen = pch - pchs;
+                               }
+
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
+
+                               pch += 3;
+
+                               pchs = pch;
+                               i++;
                        }
                        }
-                       /* sub-section: */
-                       keys[i] = pchs;
-                       lengths[i] = pch - pchs;
+                       else if ((have_colons == 1) &&
+                                (*pch == ':')) {
+                               *pch = '\0';
+                               if (i == 0) {
+                                       /* Separate the toplevel key : */
+                                       u->klen = pch - pchs;
+                               }
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
                        
                        
-                       pch++;
-                       pchs = pch;
-                       i++;
+                               pch++;
+                               pchs = pch;
+                               i++;
+                       }
+                       else if (pch == pche){
+                               /* sub-section: */
+                               keys[i] = pchs;
+                               lengths[i] = pch - pchs;
+                               i++;
+                               break;
+                       }
+                       else {
+                               pch ++;
+                       }
                }
                
                PutSubstructUrlKey(urlstrings, u, keys, lengths, i - 1, 0);
                }
                
                PutSubstructUrlKey(urlstrings, u, keys, lengths, i - 1, 0);
@@ -122,6 +154,14 @@ void ParseURLParams(StrBuf *url)
                        if (*aptr == ':') {
                                have_colon = 1;
                        }
                        if (*aptr == ':') {
                                have_colon = 1;
                        }
+                       else if ((*aptr == '%') &&
+                                (*(aptr + 1) == '3') && 
+                                ((*(aptr + 2) == 'A') ||
+                                 (*(aptr + 1) == 'a')
+                                        ))
+                       {
+                               have_colon = 2;
+                       }
                        aptr++;
                }
                if (*aptr != '=') {
                        aptr++;
                }
                if (*aptr != '=') {
@@ -299,17 +339,6 @@ long LBstr(const char *key, size_t keylen)
                return (0);
 }
 
                return (0);
 }
 
-long LBSTR(const char *key)
-{
-       void *U;
-
-       if ((WC->Hdr->urlstrings != NULL) && 
-           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
-               return StrTol(((urlcontent *)U)->url_data);
-       else    
-               return (0);
-}
-
 int IBstr(const char *key, size_t keylen)
 {
        void *U;
 int IBstr(const char *key, size_t keylen)
 {
        void *U;
@@ -343,41 +372,133 @@ int HaveBstr(const char *key, size_t keylen)
                return (0);
 }
 
                return (0);
 }
 
-int HAVEBSTR(const char *key)
+int YesBstr(const char *key, size_t keylen)
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
-           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
-               return (StrLength(((urlcontent *)U)->url_data) != 0);
+           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
        else    
                return (0);
 }
 
        else    
                return (0);
 }
 
-
-int YesBstr(const char *key, size_t keylen)
+int YESBSTR(const char *key)
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
-           GetHash(WC->Hdr->urlstrings, key, keylen, &U))
+           GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
                return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
        else    
                return (0);
 }
 
                return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
        else    
                return (0);
 }
 
-int YESBSTR(const char *key)
+
+/*
+ * Return a sub array that was separated by a colon:
+ */
+HashList* getSubStruct(const char *key, size_t keylen)
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
            GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
 {
        void *U;
 
        if ((WC->Hdr->urlstrings != NULL) && 
            GetHash(WC->Hdr->urlstrings, key, strlen(key), &U))
-               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
+               return ((urlcontent *)U)->sub;
+       else    
+               return NULL;
+}
+
+
+/*
+ * Return the value of a variable of a substruct provided by getSubStruct
+ */
+const char *XSubBstr(HashList *sub, const char *key, size_t keylen, size_t *len)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               *len = StrLength(((urlcontent *)U)->url_data);
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else {
+               *len = 0;
+               return ("");
+       }
+}
+
+const char *SubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return ChrPtr(((urlcontent *)U)->url_data);
+       }
+       else    
+               return ("");
+}
+
+const StrBuf *SSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return ((urlcontent *)U)->url_data;
+       }
+       else    
+               return NULL;
+}
+
+long LSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return StrTol(((urlcontent *)U)->url_data);
+       }
        else    
                return (0);
 }
 
        else    
                return (0);
 }
 
+int ISubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return StrTol(((urlcontent *)U)->url_data);
+       }
+       else    
+               return (0);
+}
+
+int HaveSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
+
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return (StrLength(((urlcontent *)U)->url_data) != 0);
+       }
+       else    
+               return (0);
+}
+
+int YesSubBstr(HashList *sub, const char *key, size_t keylen)
+{
+       void *U;
 
 
+       if ((sub != NULL) && 
+           GetHash(sub, key, keylen, &U)) {
+               return strcmp( ChrPtr(((urlcontent *)U)->url_data), "yes") == 0;
+       }
+       else    
+               return (0);
+}
 
 
 /*
 
 
 /*
index 4aaddea71cff0df7ea5a631a3415e7e43c87fd17..1b2f62d02e65730acad3a972aa568c5d1f4e24e7 100644 (file)
@@ -20,7 +20,6 @@ void ParseURLParams(StrBuf *url);
 
 /* These may return NULL if not foud */
 #define sbstr(a) SBstr(a, sizeof(a) - 1)
 
 /* These may return NULL if not foud */
 #define sbstr(a) SBstr(a, sizeof(a) - 1)
-const StrBuf *SBSTR(const char *key);
 const StrBuf *SBstr(const char *key, size_t keylen);
 
 #define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b)
 const StrBuf *SBstr(const char *key, size_t keylen);
 
 #define xbstr(a, b) (char*) XBstr(a, sizeof(a) - 1, b)
@@ -29,7 +28,6 @@ const char *XBSTR(const char *key, size_t *len);
 
 #define lbstr(a) LBstr(a, sizeof(a) - 1)
 long LBstr(const char *key, size_t keylen);
 
 #define lbstr(a) LBstr(a, sizeof(a) - 1)
 long LBstr(const char *key, size_t keylen);
-long LBSTR(const char *key);
 
 #define ibstr(a) IBstr(a, sizeof(a) - 1)
 #define ibcstr(a) IBstr(a.Key, a.len)
 
 #define ibstr(a) IBstr(a, sizeof(a) - 1)
 #define ibcstr(a) IBstr(a.Key, a.len)
@@ -38,12 +36,36 @@ int IBSTR(const char *key);
 
 #define havebstr(a) HaveBstr(a, sizeof(a) - 1)
 int HaveBstr(const char *key, size_t keylen);
 
 #define havebstr(a) HaveBstr(a, sizeof(a) - 1)
 int HaveBstr(const char *key, size_t keylen);
-int HAVEBSTR(const char *key);
 
 #define yesbstr(a) YesBstr(a, sizeof(a) - 1)
 int YesBstr(const char *key, size_t keylen);
 int YESBSTR(const char *key);
 
 
 #define yesbstr(a) YesBstr(a, sizeof(a) - 1)
 int YesBstr(const char *key, size_t keylen);
 int YESBSTR(const char *key);
 
+HashList* getSubStruct(const char *key, size_t keylen);
+
+/* These may return NULL if not foud */
+#define ssubbstr(s, a) SSubBstr(s, a, sizeof(a) - 1)
+const StrBuf *SSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define xsubbstr(s, a, b) (char*) XSubBstr(s, a, sizeof(a) - 1, b)
+const char *XSubBstr(HashList *sub, const char *key, size_t keylen, size_t *len);
+
+#define lsubbstr(s, a) LSubBstr(s, a, sizeof(a) - 1)
+long LSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define isubbstr(s, a) ISubBstr(s, a, sizeof(a) - 1)
+#define isubbcstr(s, a) ISubBstr(s, a.Key, a.len)
+int ISubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define havesubbstr(s, a) HaveSubBstr(s, a, sizeof(a) - 1)
+int HaveSubBstr(HashList *sub, const char *key, size_t keylen);
+
+#define yessubbstr(s, a) YesSubBstr(s, a, sizeof(a) - 1)
+int YesSubBstr(HashList *sub, const char *key, size_t keylen);
+
+
+
+
 /* TODO: get rid of the non-const-typecast */
 #define bstr(a) (char*) Bstr(a, sizeof(a) - 1)
 const char *BSTR(const char *key);
 /* TODO: get rid of the non-const-typecast */
 #define bstr(a) (char*) Bstr(a, sizeof(a) - 1)
 const char *BSTR(const char *key);
index cc0430a6c785e3f64ff40f49bd40e72cf432e92e..b5fc7aa74c1d0b27123b1a49c8dc6ecd235c152c 100644 (file)
   <td><?_("Suffix")></td>
 </tr>
 <tr>
   <td><?_("Suffix")></td>
 </tr>
 <tr>
-  <td><input type="text" name="prefix" value='<?VC:ITEM(#"VC:.n.prefix", "X")>' maxlength="5" size="5"></td>
-  <td><input type="text" name="firstname" value='<?VC:ITEM(#"VC:.n.first", "X")>' maxlength="29"></td>
-  <td><input type="text" name="middlename" value='<?VC:ITEM(#"VC:.n.middle", "X")>' maxlength="29"></td>
-  <td><input type="text" name="lastname" value='<?VC:ITEM(#"VC:.n.last", "X")>' maxlength="29"></td>
-  <td><input type="text" name="suffix" value='<?VC:ITEM(#"VC:.n.suffix", "X")>' maxlength="10" size="10"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.prefix")>' value='<?VC:ITEM(#"VC:.n.prefix", "X")>' maxlength="5" size="5"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.first")>' value='<?VC:ITEM(#"VC:.n.first", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.middle")>' value='<?VC:ITEM(#"VC:.n.middle", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.last")>' value='<?VC:ITEM(#"VC:.n.last", "X")>' maxlength="29"></td>
+  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.n.suffix")>' value='<?VC:ITEM(#"VC:.n.suffix", "X")>' maxlength="10" size="10"></td>
 </tr></table>
 
 <table  class="vcard_edit_background_alt">
 <tr>
   <td>
 </tr></table>
 
 <table  class="vcard_edit_background_alt">
 <tr>
   <td>
-    <?_("Display name:")><br> <input type="text" name="fullname" value='<?VC:ITEM(#"VC:.fn", "X")>' maxlength="40"><br><br>
-    <?_("Title:")><br><input type="text" name="title" value='<?VC:ITEM(#"VC:.title", "X")>' maxlength="40"><br><br>
-    <?_("Organization:")><br><input type="text" name="org" value='<?VC:ITEM(#"VC:.org", "X")>' maxlength="40"><br><br>
+    <?_("Display name:")><br> <input type="text" name='VC:<?DEF:VAL(#"VC:.fn")>' value='<?VC:ITEM(#"VC:.fn", "X")>' maxlength="40"><br><br>
+    <?_("Title:")><br><input type="text" name='VC:<?DEF:VAL(#"VC:.title")>' value='<?VC:ITEM(#"VC:.title", "X")>' maxlength="40"><br><br>
+    <?_("Organization:")><br><input type="text" name='VC:<?DEF:VAL(#"VC:.org")>' value='<?VC:ITEM(#"VC:.org", "X")>' maxlength="40"><br><br>
   </td>
 <td>
 
 <table border="0">
   </td>
 <td>
 
 <table border="0">
-  <tr><td><?_("PO box:")></td><td><input type="text" name="pobox" value='<?VC:ITEM(#"VC:.adr.POBox", "X")>' maxlength="29"></td></tr>
-  <tr><td><?_("Address:")></td><td><input type="text" name="extadr" value='<?VC:ITEM(#"VC:.adr.address", "X")>' maxlength="29"></td></tr>
-  <tr><td> </td><td><input type="text" name="street" value='<?VC:ITEM(#"VC:.adr.address2", "X")>' maxlength="29"></td></tr>
-  <tr><td><?_("City:")></td><td><input type="text" name="city" value='<?VC:ITEM(#"VC:.adr.city", "X")>' maxlength="29"></td></tr>
-  <tr><td><?_("State:")></td><td><input type="text" name="state" value='<?VC:ITEM(#"VC:.adr.state", "X")>' maxlength="29"></td></tr>
-  <tr><td><?_("ZIP code:")></td><td><input type="text" name="zipcode" value='<?VC:ITEM(#"VC:.adr.zip", "X")>' maxlength="10"></td></tr>
-  <tr><td><?_("Country:")></td><td><input type="text" name="country" value='<?VC:ITEM(#"VC:.adr.country", "X")>' maxlength="29" width="5"></td></tr>
+  <tr><td><?_("PO box:")></td>   <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.POBox")>' value='<?VC:ITEM(#"VC:.adr.POBox", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("Address:")></td>  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.extadr")>' value='<?VC:ITEM(#"VC:.adr.extadr", "X")>' maxlength="29"></td></tr>
+  <tr><td></td>                  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.street")>' value='<?VC:ITEM(#"VC:.adr.street", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("City:")></td>     <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.city")>' value='<?VC:ITEM(#"VC:.adr.city", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("State:")></td>    <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.state")>' value='<?VC:ITEM(#"VC:.adr.state", "X")>' maxlength="29"></td></tr>
+  <tr><td><?_("ZIP code:")></td> <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.zip")>' value='<?VC:ITEM(#"VC:.adr.zip", "X")>' maxlength="10"></td></tr>
+  <tr><td><?_("Country:")></td>  <td><input type="text" name='VC:<?DEF:VAL(#"VC:.adr.country")>' value='<?VC:ITEM(#"VC:.adr.country", "X")>' maxlength="29" width="5"></td></tr>
 </table>
 
 </table>
 <table border=0>
 <tr>
 </table>
 
 </table>
 <table border=0>
 <tr>
-  <td><?_("Home telephone:")></td><td><input type="text" name="hometel" value='<?VC:ITEM(#"VC:.tel;home", "X")>' maxlength="29"></td>
-  <td><?_("Work telephone:")></td><td><input type="text" name="worktel" value='<?VC:ITEM(#"VC:.tel;work", "X")>' maxlength="29"></td>
+  <td><?_("Home telephone:")></td><td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;home")>' value='<?VC:ITEM(#"VC:.tel;home", "X")>' maxlength="29"></td>
+  <td><?_("Work telephone:")></td><td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;work")>' value='<?VC:ITEM(#"VC:.tel;work", "X")>' maxlength="29"></td>
 </tr>
 <tr>
 </tr>
 <tr>
-  <td><?_("Mobile telephone:")></td><td><input type="text" name="mobiletel" value='<?VC:ITEM(#"VC:.tel;cell", "X")>' maxlength="29"></td>
-  <td><?_("Fax number:")></td><td><input type="text" name="faxtel" value='<?VC:ITEM(#"VC:.tel;fax", "X")>' maxlength="29"></td>
+  <td><?_("Mobile telephone:")></td> <td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;cell")>' value='<?VC:ITEM(#"VC:.tel;cell", "X")>' maxlength="29"></td>
+  <td><?_("Fax number:")></td>       <td><input type="text" name='VC:<?DEF:VAL(#"VC:.tel;fax")>' value='<?VC:ITEM(#"VC:.tel;fax", "X")>' maxlength="29"></td>
 </tr></table>
 
 <table class="vcard_edit_background_alt">
 </tr></table>
 
 <table class="vcard_edit_background_alt">
@@ -57,7 +57,7 @@
     <table border=0>
       <tr>
        <td valign=top><?_("Primary Internet e-mail address")><br>
     <table border=0>
       <tr>
        <td valign=top><?_("Primary Internet e-mail address")><br>
-         <input type="text" name="primary_inetemail" size=40 maxlength=60 value='<?VC:ITEM(#"VC:.email;internet", "X")>'><br>
+         <input type="text" name='VC:<?DEF:VAL(#"VC:.email;internet")>' size=40 maxlength=60 value='<?VC:ITEM(#"VC:.email;internet", "X")>'><br>
        </td>
        <td valign=top><?_("Internet e-mail aliases")><br><textarea name="other_inetemail" rows=5 cols=40 width=40><?ITERATE("VC:TYPE", ="vcard_edit_email", 0, 0, -1, #"EmailAddr")></textarea>
     </td>
        </td>
        <td valign=top><?_("Internet e-mail aliases")><br><textarea name="other_inetemail" rows=5 cols=40 width=40><?ITERATE("VC:TYPE", ="vcard_edit_email", 0, 0, -1, #"EmailAddr")></textarea>
     </td>
     </table>
 </td></tr></table>
 
     </table>
 </td></tr></table>
 
-<input type="hidden" name="extrafields" value="VERSION:2.1
-FBURL;PREF:http://flunder/willi.vfb
-UID:Citadel vCard: personal card for willi at flunder
-TODO
-">
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.version")>' value='<?VC:ITEM(#"VC:.version", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.rev")>' value='<?VC:ITEM(#"VC:.rev", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.label")>' value='<?VC:ITEM(#"VC:.label", "X")>'>
+<input type="hidden" name='VC:<?DEF:VAL(#"VC:.uid")>' value='<?VC:ITEM(#"VC:.uid", "X")>'>
+<input type="hidden" name="extrafields" value='<?VC:ITEM(#"VC:.uid", "X")>'>
 
 <input type="hidden" name="return_to" value="display_main_menu?go=Contacts">
 <div class="buttons">
 
 <input type="hidden" name="return_to" value="display_main_menu?go=Contacts">
 <div class="buttons">
-<input type="submit" name="ok_button" value="Save changes">&nbsp;<input type="submit" name="cancel_button" value="Cancel"></div></form>
+<input type="submit" name="ok_button" value="Save changes">&nbsp;<input type="submit" name="cancel_button" value="Cancel"></div>
 </td></tr></table>
 </td></tr></table>
+</form>
 <?=("box_end")>
 <?=("box_end")>
+</div>
index b0d0b999b50c088a2a516b7c5790a1f4aa3b1d2c..a55b03dca10d6ce79d9f6524519b7b8504f15766 100644 (file)
@@ -34,8 +34,8 @@
  <td><?VC:NAME(#"Address")>:</td>
  <td>
 <?VC:ITEM(#"VC:.adr.POBox", "X")><br>
  <td><?VC:NAME(#"Address")>:</td>
  <td>
 <?VC:ITEM(#"VC:.adr.POBox", "X")><br>
-<?VC:ITEM(#"VC:.adr.address", "X")><br>
-<?VC:ITEM(#"VC:.adr.address2", "X")><br>
+<?VC:ITEM(#"VC:.adr.extadr", "X")><br>
+<?VC:ITEM(#"VC:.adr.street", "X")><br>
 <?VC:ITEM(#"VC:.adr.city", "X")> <?VC:ITEM(#"VC:.adr.state", "X")> <?VC:ITEM(#"VC:.adr.zip", "X")> <?VC:ITEM(#"VC:.adr.country", "X")>
  </td>
 </tr>
 <?VC:ITEM(#"VC:.adr.city", "X")> <?VC:ITEM(#"VC:.adr.state", "X")> <?VC:ITEM(#"VC:.adr.zip", "X")> <?VC:ITEM(#"VC:.adr.country", "X")>
  </td>
 </tr>
index 688299b23c977d583ae709f0178e739e4d23c5bf..7aa54bff8ad451b36691366c016413487941051a 100644 (file)
@@ -2140,7 +2140,7 @@ void tmpl_iterate_subtmpl(StrBuf *Target, WCTemplputParams *TP)
                                /** Ok, its us, lets see in which direction we should sort... */
                                    (havebstr("SortOrder"))) {
                                        int SortOrder;
                                /** Ok, its us, lets see in which direction we should sort... */
                                    (havebstr("SortOrder"))) {
                                        int SortOrder;
-                                       SortOrder = LBSTR("SortOrder");
+                                       SortOrder = lbstr("SortOrder");
                                        if (SortOrder != 0)
                                                DetectGroupChange = 1;
                                }
                                        if (SortOrder != 0)
                                                DetectGroupChange = 1;
                                }
@@ -2663,7 +2663,7 @@ CompareFunc RetrieveSort(WCTemplputParams *TP,
 
        /** Ok, its us, lets see in which direction we should sort... */
        if (havebstr("SortOrder")) {
 
        /** Ok, its us, lets see in which direction we should sort... */
        if (havebstr("SortOrder")) {
-               SortOrder = LBSTR("SortOrder");
+               SortOrder = lbstr("SortOrder");
        }
        else { /** Try to fallback to our remembered values... */
                StrBuf *Buf = NULL;
        }
        else { /** Try to fallback to our remembered values... */
                StrBuf *Buf = NULL;
@@ -2755,7 +2755,7 @@ int GetSortMetric(WCTemplputParams *TP, SortStruct **Next, SortStruct **Param, l
 
        /** Ok, its us, lets see in which direction we should sort... */
        if (havebstr("SortOrder")) {
 
        /** Ok, its us, lets see in which direction we should sort... */
        if (havebstr("SortOrder")) {
-               *SortOrder = LBSTR("SortOrder");
+               *SortOrder = lbstr("SortOrder");
        }
        else { /** Try to fallback to our remembered values... */
                if ((*Param)->PrefPrepend == NULL) {
        }
        else { /** Try to fallback to our remembered values... */
                if ((*Param)->PrefPrepend == NULL) {
index a81c41432c5c7c9d26a8d9c963a64dd0d61ed0cf..90dac77b0be8c8e7e5e614e2f57163510adc649d 100644 (file)
@@ -201,7 +201,7 @@ void StrEndTab(StrBuf *Target, int tabnum, int num_tabs) {
                        "<!-- end tab %d of %d -->\n", tabnum, num_tabs
                );
        }
                        "<!-- end tab %d of %d -->\n", tabnum, num_tabs
                );
        }
-       if (HAVEBSTR("last_tabsel"))
+       if (havebstr("last_tabsel"))
        {
                StrBufAppendPrintf(Target, "<script type=\"text/javascript\">tabsel(%s);</script>", BSTR("last_tabsel"));
        }
        {
                StrBufAppendPrintf(Target, "<script type=\"text/javascript\">tabsel(%s);</script>", BSTR("last_tabsel"));
        }
index 1f0b979c2aa33537e399bc72ff6766659933b7a7..27ba6495b61327e0f61cd5465533d9cf30bef4e2 100644 (file)
@@ -28,6 +28,7 @@ typedef enum _VCStrEnum {
        Number,
        AliasFor,
        Base64BinaryAttachment,
        Number,
        AliasFor,
        Base64BinaryAttachment,
+       UnKnown,
        TerminateList
 }VCStrEnum;
 typedef struct vcField vcField;
        TerminateList
 }VCStrEnum;
 typedef struct vcField vcField;
@@ -36,48 +37,50 @@ struct vcField {
        VCStrEnum Type;
        vcField *Sub;
        long cval;
        VCStrEnum Type;
        vcField *Sub;
        long cval;
+       long parentCVal;
        ConstStr Name;
 };
 
 vcField VCStr_Ns [] = {
        ConstStr Name;
 };
 
 vcField VCStr_Ns [] = {
-       {{HKEY("last")},   FlatString,    NULL, 0, {HKEY("Last Name")}},
-       {{HKEY("first")},  FlatString,    NULL, 0, {HKEY("First Name")}},
-       {{HKEY("middle")}, FlatString,    NULL, 0, {HKEY("Middle Name")}},
-       {{HKEY("prefix")}, FlatString,    NULL, 0, {HKEY("Prefix")}},
-       {{HKEY("suffix")}, FlatString,    NULL, 0, {HKEY("Suffix")}},
-       {{HKEY("")},       TerminateList, NULL, 0, {HKEY("")}}
+       {{HKEY("last")},   FlatString,    NULL, 0, 0, {HKEY("Last Name")}},
+       {{HKEY("first")},  FlatString,    NULL, 0, 0, {HKEY("First Name")}},
+       {{HKEY("middle")}, FlatString,    NULL, 0, 0, {HKEY("Middle Name")}},
+       {{HKEY("prefix")}, FlatString,    NULL, 0, 0, {HKEY("Prefix")}},
+       {{HKEY("suffix")}, FlatString,    NULL, 0, 0, {HKEY("Suffix")}},
+       {{HKEY("")},       TerminateList, NULL, 0, 0, {HKEY("")}}
 };
 
 vcField VCStr_Addrs [] = {
 };
 
 vcField VCStr_Addrs [] = {
-       {{HKEY("POBox")},    Address,    NULL, 0, {HKEY("PO box")}},
-       {{HKEY("address")},  Address,    NULL, 0, {HKEY("Address")}},
-       {{HKEY("address2")}, Address,    NULL, 0, {HKEY("")}},
-       {{HKEY("city")},     Address,    NULL, 0, {HKEY("City")}},
-       {{HKEY("state")},    Address,    NULL, 0, {HKEY("State")}},
-       {{HKEY("zip")},      Address,    NULL, 0, {HKEY("ZIP code")}},
-       {{HKEY("country")},  Address,    NULL, 0, {HKEY("Country")}},
-       {{HKEY("")},         TerminateList, NULL, 0, {HKEY("")}}
+       {{HKEY("POBox")},    Address,       NULL, 0, 0, {HKEY("PO box")}},
+       {{HKEY("extadr")},   Address,       NULL, 0, 0, {HKEY("Address")}},
+       {{HKEY("street")},   Address,       NULL, 0, 0, {HKEY("")}},
+       {{HKEY("city")},     Address,       NULL, 0, 0, {HKEY("City")}},
+       {{HKEY("state")},    Address,       NULL, 0, 0, {HKEY("State")}},
+       {{HKEY("zip")},      Address,       NULL, 0, 0, {HKEY("ZIP code")}},
+       {{HKEY("country")},  Address,       NULL, 0, 0, {HKEY("Country")}},
+       {{HKEY("")},         TerminateList, NULL, 0, 0, {HKEY("")}}
 };
 
 vcField VCStrE [] = {
 };
 
 vcField VCStrE [] = {
-       {{HKEY("version")},         Number,                 NULL,        0, {HKEY("")}},
-       {{HKEY("rev")},             Number,                 NULL,        0, {HKEY("")}},
-       {{HKEY("label")},           FlatString,             NULL,        0, {HKEY("")}},
-       {{HKEY("uid")},             FlatString,             NULL,        0, {HKEY("")}},
-       {{HKEY("n")},               StringCluster,          VCStr_Ns,    0, {HKEY("")}}, /* N is name, but only if there's no FN already there */
-       {{HKEY("fn")},              FlatString,             NULL,        0, {HKEY("")}}, /* FN (full name) is a true 'display name' field */
-       {{HKEY("title")},           FlatString,             NULL,        0, {HKEY("Title:")}},
-       {{HKEY("org")},             FlatString,             NULL,        0, {HKEY("Organization:")}},/* organization */
-       {{HKEY("email")},           EmailAddr,              NULL,        0, {HKEY("E-mail:")}},
-       {{HKEY("tel")},             PhoneNumber,            NULL,        0, {HKEY("Telephone:")}},
-       {{HKEY("adr")},             StringCluster,          VCStr_Addrs, 0, {HKEY("Address:")}},
-       {{HKEY("photo")},           Base64BinaryAttachment, NULL,        0, {HKEY("Photo:")}},
-       {{HKEY("tel;home")},        PhoneNumber,            NULL,        0, {HKEY(" (home)")}},
-       {{HKEY("tel;work")},        PhoneNumber,            NULL,        0, {HKEY(" (work)")}},
-       {{HKEY("tel;fax")},         PhoneNumber,            NULL,        0, {HKEY(" (fax)")}},
-       {{HKEY("tel;cell")},        PhoneNumber,            NULL,        0, {HKEY(" (cell)")}},
-       {{HKEY("email;internet")},  EmailAddr,              NULL,        0, {HKEY("E-mail:")}},
-       {{HKEY("")},                TerminateList,          NULL,        0, {HKEY("")}}
+       {{HKEY("version")},         Number,                 NULL,        0, 0, {HKEY("")}},
+       {{HKEY("rev")},             Number,                 NULL,        0, 0, {HKEY("")}},
+       {{HKEY("label")},           FlatString,             NULL,        0, 0, {HKEY("")}},
+       {{HKEY("uid")},             FlatString,             NULL,        0, 0, {HKEY("")}},
+       {{HKEY("n")},               StringCluster,          VCStr_Ns,    0, 0, {HKEY("")}}, /* N is name, but only if there's no FN already there */
+       {{HKEY("fn")},              FlatString,             NULL,        0, 0, {HKEY("")}}, /* FN (full name) is a true 'display name' field */
+       {{HKEY("title")},           FlatString,             NULL,        0, 0, {HKEY("Title:")}},
+       {{HKEY("org")},             FlatString,             NULL,        0, 0, {HKEY("Organization:")}},/* organization */
+       {{HKEY("email")},           EmailAddr,              NULL,        0, 0, {HKEY("E-mail:")}},
+       {{HKEY("tel")},             PhoneNumber,            NULL,        0, 0, {HKEY("Telephone:")}},
+       {{HKEY("adr")},             StringCluster,          VCStr_Addrs, 0, 0, {HKEY("Address:")}},
+       {{HKEY("photo")},           Base64BinaryAttachment, NULL,        0, 0, {HKEY("Photo:")}},
+       {{HKEY("tel;home")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (home)")}},
+       {{HKEY("tel;work")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (work)")}},
+       {{HKEY("tel;fax")},         PhoneNumber,            NULL,        0, 0, {HKEY(" (fax)")}},
+       {{HKEY("tel;cell")},        PhoneNumber,            NULL,        0, 0, {HKEY(" (cell)")}},
+       {{HKEY("email;internet")},  EmailAddr,              NULL,        0, 0, {HKEY("E-mail:")}},
+       {{HKEY("UNKNOWN")},         UnKnown,                NULL,        0, 0, {HKEY("")}},
+       {{HKEY("")},                TerminateList,          NULL,        0, 0, {HKEY("")}}
 };
 
 ConstStr VCStr [] = {
 };
 
 ConstStr VCStr [] = {
@@ -103,10 +106,13 @@ ConstStr VCStr [] = {
 HashList *DefineToToken = NULL;
 HashList *VCTokenToDefine = NULL;
 HashList *vcNames = NULL; /* todo: fill with the name strings */
 HashList *DefineToToken = NULL;
 HashList *VCTokenToDefine = NULL;
 HashList *vcNames = NULL; /* todo: fill with the name strings */
-
+vcField* vcfUnknown = NULL;
 
 void RegisterVCardToken(vcField* vf, StrBuf *name, int inTokenCount)
 {
 
 void RegisterVCardToken(vcField* vf, StrBuf *name, int inTokenCount)
 {
+       if (vf->Type == UnKnown) {
+               vcfUnknown = vf;
+       }
        RegisterTokenParamDefine(SKEY(name), vf->cval);
        Put(DefineToToken, LKEY(vf->cval), vf, reference_free_handler);
        Put(vcNames, LKEY(vf->cval), NewStrBufPlain(CKEY(vf->Name)), HFreeStrBuf);
        RegisterTokenParamDefine(SKEY(name), vf->cval);
        Put(DefineToToken, LKEY(vf->cval), vf, reference_free_handler);
        Put(vcNames, LKEY(vf->cval), NewStrBufPlain(CKEY(vf->Name)), HFreeStrBuf);
@@ -118,13 +124,14 @@ void RegisterVCardToken(vcField* vf, StrBuf *name, int inTokenCount)
 
 }
 
 
 }
 
-void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int layer)
+void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int layer, long parentCVal)
 {
        int i = 0;
        StrBuf *subStr = NewStrBuf();
        while (vf[i].STR.len > 0) {
                FlushStrBuf(subStr);
                vf[i].cval = (*enumCounter) ++;
 {
        int i = 0;
        StrBuf *subStr = NewStrBuf();
        while (vf[i].STR.len > 0) {
                FlushStrBuf(subStr);
                vf[i].cval = (*enumCounter) ++;
+               vf[i].parentCVal = parentCVal;
                StrBufAppendBuf(subStr, BaseStr, 0);
                if (StrLength(subStr) > 0) {
                        StrBufAppendBufPlain(subStr, HKEY("."), 0);
                StrBufAppendBuf(subStr, BaseStr, 0);
                if (StrLength(subStr) > 0) {
                        StrBufAppendBufPlain(subStr, HKEY("."), 0);
@@ -138,9 +145,7 @@ void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int lay
                        break;
                case StringCluster:
                {
                        break;
                case StringCluster:
                {
-                       autoRegisterTokens(enumCounter, vf[i].Sub, subStr, 1);
-                       i++;
-                       continue;
+                       autoRegisterTokens(enumCounter, vf[i].Sub, subStr, 1, vf[i].cval);
                }
                break;
                case PhoneNumber:
                }
                break;
                case PhoneNumber:
@@ -159,6 +164,8 @@ void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int lay
                        break;
                case Address:
                        break;
                        break;
                case Address:
                        break;
+               case UnKnown:
+                       break;
                }
                RegisterVCardToken(&vf[i], subStr, i);
                i++;
                }
                RegisterVCardToken(&vf[i], subStr, i);
                i++;
@@ -608,13 +615,12 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachme
        StrBuf *Val = NULL;
        StrBuf *Swap = NULL;
        int i, j, k;
        StrBuf *Val = NULL;
        StrBuf *Swap = NULL;
        int i, j, k;
-       char buf[20]; //SIZ];
+       char buf[SIZ];
        int is_qp = 0;
        int is_b64 = 0;
        int ntokens, len;
        StrBuf *thisname = NULL;
        int is_qp = 0;
        int is_b64 = 0;
        int ntokens, len;
        StrBuf *thisname = NULL;
-       char firsttoken[20]; ///SIZ];
-       //void *V;
+       char firsttoken[SIZ];
        StrBuf *thisVCToken;
        void *vField = NULL;
 
        StrBuf *thisVCToken;
        void *vField = NULL;
 
@@ -701,10 +707,31 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachme
                                break;
                        case Base64BinaryAttachment:
                        case TerminateList:
                                break;
                        case Base64BinaryAttachment:
                        case TerminateList:
+                       case UnKnown:
                                break;
                        }
 
                }
                                break;
                        }
 
                }
+               else if (StrLength(thisVCToken) > 0) {
+                       /* Add it to the UNKNOWN field... */
+                       void *pv = NULL;
+                       StrBuf *oldVal;
+                       GetHash(VC, IKEY(vcfUnknown->cval), &pv);
+                       oldVal = (StrBuf*) pv;
+                       if (oldVal == NULL) {
+                               oldVal = NewStrBuf();
+                               Put(VC, IKEY(vcfUnknown->cval), oldVal, HFreeStrBuf);
+                       }
+                       else {
+                               StrBufAppendBufPlain(oldVal, HKEY("\n"), 0);
+                       }
+
+                       StrBufAppendBuf(oldVal, thisVCToken, 0);
+                       StrBufAppendBufPlain(oldVal, HKEY(":"), 0);
+                       StrBufAppendBufPlain(oldVal, v->prop[i].value, -1, 0);
+                       continue;
+               }
+
                /* copy over the payload into a StrBuf */
                Val = NewStrBufPlain(v->prop[i].value, -1);
                        
                /* copy over the payload into a StrBuf */
                Val = NewStrBufPlain(v->prop[i].value, -1);
                        
@@ -719,7 +746,6 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachme
                }
                else if (is_b64) {
                        StrBufDecodeBase64(Val);
                }
                else if (is_b64) {
                        StrBufDecodeBase64(Val);
-
                }
 #if 0
                syslog(LOG_DEBUG, "-> firsttoken: %s thisname: %s Value: [%s][%s]",
                }
 #if 0
                syslog(LOG_DEBUG, "-> firsttoken: %s thisname: %s Value: [%s][%s]",
@@ -1073,10 +1099,16 @@ void edit_vcard(void) {
 void submit_vcard(void) {
        struct vCard *v;
        char *serialized_vcard;
 void submit_vcard(void) {
        struct vCard *v;
        char *serialized_vcard;
-       char buf[SIZ];
        StrBuf *Buf;
        const StrBuf *ForceRoom;
        StrBuf *Buf;
        const StrBuf *ForceRoom;
-       int i;
+       HashList* postVcard;
+       HashPos *it, *itSub;
+       const char *Key;
+       long len;
+       void *pv;
+       StrBuf *SubStr;
+       const StrBuf *s;
+       const char *Pos = NULL;
 
        if (!havebstr("ok_button")) { 
                readloop(readnew, eUseDefault);
 
        if (!havebstr("ok_button")) { 
                readloop(readnew, eUseDefault);
@@ -1108,6 +1140,13 @@ void submit_vcard(void) {
                }
        }
 
                }
        }
 
+       postVcard = getSubStruct(HKEY("VC"));
+       if (postVcard == NULL) {
+               AppendImportantMessage(_("An error has occurred."), -1);
+               edit_vcard();
+               return;//// more details
+       }
+       
        Buf = NewStrBuf();
        serv_write(HKEY("ENT0 1|||4\n"));
        if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
        Buf = NewStrBuf();
        serv_write(HKEY("ENT0 1|||4\n"));
        if (!StrBuf_ServGetln(Buf) && (GetServerStatus(Buf, NULL) != 4))
@@ -1115,7 +1154,7 @@ void submit_vcard(void) {
                edit_vcard();
                return;
        }
                edit_vcard();
                return;
        }
-
+       
        /* Make a vCard structure out of the data supplied in the form */
        StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
                     bstr("extrafields")
        /* Make a vCard structure out of the data supplied in the form */
        StrBufPrintf(Buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
                     bstr("extrafields")
@@ -1128,41 +1167,100 @@ void submit_vcard(void) {
                return;
        }
 
                return;
        }
 
-       snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s",
-               bstr("lastname"),
-               bstr("firstname"),
-               bstr("middlename"),
-               bstr("prefix"),
-               bstr("suffix") );
-       vcard_add_prop(v, "n", buf);
-       
-       vcard_add_prop(v, "title", bstr("title"));
-       vcard_add_prop(v, "fn", bstr("fullname"));
-       vcard_add_prop(v, "org", bstr("org"));
-
-       snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s;%s;%s",
-               bstr("pobox"),
-               bstr("extadr"),
-               bstr("street"),
-               bstr("city"),
-               bstr("state"),
-               bstr("zipcode"),
-               bstr("country") );
-       vcard_add_prop(v, "adr", buf);
-
-       vcard_add_prop(v, "tel;home", bstr("hometel"));
-       vcard_add_prop(v, "tel;work", bstr("worktel"));
-       vcard_add_prop(v, "tel;fax", bstr("faxtel"));
-       vcard_add_prop(v, "tel;cell", bstr("mobiletel"));
-       vcard_add_prop(v, "email;internet", bstr("primary_inetemail"));
-
-       for (i=0; i<num_tokens(bstr("other_inetemail"), '\n'); ++i) {
-               extract_token(buf, bstr("other_inetemail"), i, '\n', sizeof buf);
-               if (!IsEmptyStr(buf)) {
-                       vcard_add_prop(v, "email;internet", buf);
+       SubStr = NewStrBuf();
+       it = GetNewHashPos(DefineToToken, 0);
+       while (GetNextHashPos(DefineToToken, it, &len, &Key, &pv) && 
+              (pv != NULL)) 
+       {
+               char buf[32];
+               long blen;
+               vcField *t = (vcField*) pv;
+
+               if (t->Sub != NULL){
+                       vcField *Sub;
+                       FlushStrBuf(SubStr);
+                       itSub = GetNewHashPos(DefineToToken, 0);
+                       while (GetNextHashPos(DefineToToken, itSub, &len, &Key, &pv) && 
+                              (pv != NULL)) 
+                       {
+                               Sub = (vcField*) pv;
+                               if (Sub->parentCVal == t->cval) {
+                                       if (StrLength(SubStr) > 0)
+                                               StrBufAppendBufPlain(SubStr, HKEY(";"), 0);
+
+
+
+                                       blen = snprintf(buf, sizeof(buf), "%ld", Sub->cval);
+                                       s = SSubBstr(postVcard, buf, blen);
+                       
+                                       if ((s != NULL) && (StrLength(s) > 0)) {
+                                               /// todo: utf8 qp
+                                               StrBufAppendBuf(SubStr, s, 0);
+                                       }
+                               }
+                       }
+                       if (StrLength(SubStr) > 0) {
+                               vcard_add_prop(v, t->STR.Key, ChrPtr(SubStr));
+                       }
+                       DeleteHashPos(&itSub);
+               }
+               else if (t->parentCVal == 0) {
+                       blen = snprintf(buf, sizeof(buf), "%ld", t->cval);
+                       s = SSubBstr(postVcard, buf, blen);
+                       
+                       if ((s != NULL) && (StrLength(s) > 0)) {
+                               vcard_add_prop(v, t->STR.Key, ChrPtr(s));
+                       }
+                       /*
+                   (vvcField != NULL))
+               {
+                       vcField *t = (vcField*) vvcField;
+                       if (t->layer == 0) switch (t->Type) {
+                               break;
+                       case StringCluster:
+                       {
+                               
+                               i++;
+                               continue;
+                       }
+                       break;
+                               break;
+                       case EmailAddr:
+                               break;
+                       case Street:
+                               break;
+                       case FlatString:
+                       case PhoneNumber:
+                       case Number:
+                               break;
+                       case AliasFor:
+                               break;
+                       case Base64BinaryAttachment:
+                               break;
+                       case TerminateList:
+                               break;
+                       case Address:
+                               break;
+
+                       }
+*/
+               }
+       }
+       DeleteHashPos(&it);
+
+       s = sbstr("other_inetemail");
+       if (StrLength(s) > 0) {
+               FlushStrBuf(SubStr);
+               while (StrBufSipLine(SubStr, s, &Pos), ((Pos!=StrBufNOTNULL) && (Pos!=NULL)) ) {
+                       if (StrLength(SubStr) > 0) {
+                               vcard_add_prop(v, "email;internet", ChrPtr(SubStr));
+                       }
                }
        }
 
                }
        }
 
+       FreeStrBuf(&SubStr);
+
+
        serialized_vcard = vcard_serialize(v);
        vcard_free(v);
        if (serialized_vcard == NULL) {
        serialized_vcard = vcard_serialize(v);
        vcard_free(v);
        if (serialized_vcard == NULL) {
@@ -1172,6 +1270,7 @@ void submit_vcard(void) {
                return;
        }
 
                return;
        }
 
+       printf("%s", serialized_vcard);
        serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
        serv_write(HKEY("\n"));
        serv_printf("%s\r\n", serialized_vcard);
        serv_write(HKEY("Content-type: text/x-vcard; charset=UTF-8\n"));
        serv_write(HKEY("\n"));
        serv_printf("%s\r\n", serialized_vcard);
@@ -1395,7 +1494,7 @@ InitModule_VCARD
                DefineToToken   = NewHash(1, lFlathash);
                vcNames         = NewHash(1, lFlathash);
                VCTokenToDefine = NewHash(1, NULL);
                DefineToToken   = NewHash(1, lFlathash);
                vcNames         = NewHash(1, lFlathash);
                VCTokenToDefine = NewHash(1, NULL);
-               autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0);
+               autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0, 0);
                FreeStrBuf(&Prefix);
        }
        RegisterCTX(CTX_VCARD);
                FreeStrBuf(&Prefix);
        }
        RegisterCTX(CTX_VCARD);
index bca779a3ad331009fd6355ce5da49a13f3f83577..4e3b2f86a3975099dd38b923a91f484dd37859f4 100644 (file)
@@ -504,7 +504,7 @@ void push_destination(void) {
        }
 
        FreeStrBuf(&WCC->PushedDestination);
        }
 
        FreeStrBuf(&WCC->PushedDestination);
-       WCC->PushedDestination = NewStrBufDup(SBSTR("url"));
+       WCC->PushedDestination = NewStrBufDup(sbstr("url"));
        if (verbose)
                syslog(LOG_DEBUG, "Push: %s", ChrPtr(WCC->PushedDestination));
        wc_printf("OK");
        if (verbose)
                syslog(LOG_DEBUG, "Push: %s", ChrPtr(WCC->PushedDestination));
        wc_printf("OK");