From: Wilfried Goesgens Date: Sun, 18 Oct 2015 18:15:48 +0000 (+0200) Subject: Finalize vcard editing: X-Git-Tag: Release_902~148 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=b98d9f087b3a24a9549470ab066c2aea187ecfba Finalize vcard editing: - 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. --- diff --git a/webcit/addressbook_popup.c b/webcit/addressbook_popup.c index 995ec6fd0..c119cc18e 100644 --- a/webcit/addressbook_popup.c +++ b/webcit/addressbook_popup.c @@ -28,7 +28,7 @@ HashList* GetAddressbookList() long BufLen; int IsLocalAddrBook; - WhichAddrBook = SBSTR("which_addr_book"); + WhichAddrBook = sbstr("which_addr_book"); IsLocalAddrBook = strcasecmp(ChrPtr(WhichAddrBook), "__LOCAL_USERS__") == 1; if (IsLocalAddrBook) { diff --git a/webcit/debian/rules b/webcit/debian/rules index fd7a2fc9c..46eecdca8 100755 --- a/webcit/debian/rules +++ b/webcit/debian/rules @@ -59,7 +59,7 @@ endif --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 \ @@ -96,7 +96,7 @@ install: build 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 diff --git a/webcit/messages.c b/webcit/messages.c index 020e81665..70cd85ab8 100644 --- a/webcit/messages.c +++ b/webcit/messages.c @@ -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); - UID = SBSTR("qquuid"); + UID = sbstr("qquuid"); if (UID) att->PartNum = NewStrBufDup(UID); diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 5bfc364e5..ed8de1fe9 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -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); - View = SBSTR("view"); + View = sbstr("view"); if (View != NULL) { StrBufAppendBufPlain(perma_link, HKEY("?view="), 0); StrBufAppendBuf(perma_link, View, 0); diff --git a/webcit/paramhandling.c b/webcit/paramhandling.c index bfc8ac7ff..15905caa8 100644 --- a/webcit/paramhandling.c +++ b/webcit/paramhandling.c @@ -62,7 +62,7 @@ void PutSubstructUrlKey(HashList *list, urlcontent *u, char **keys, long *length } 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 { @@ -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)) { - 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); @@ -122,6 +154,14 @@ void ParseURLParams(StrBuf *url) if (*aptr == ':') { have_colon = 1; } + else if ((*aptr == '%') && + (*(aptr + 1) == '3') && + ((*(aptr + 2) == 'A') || + (*(aptr + 1) == 'a') + )) + { + have_colon = 2; + } aptr++; } if (*aptr != '=') { @@ -299,17 +339,6 @@ long LBstr(const char *key, size_t keylen) 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; @@ -343,41 +372,133 @@ int HaveBstr(const char *key, size_t keylen) return (0); } -int HAVEBSTR(const char *key) +int YesBstr(const char *key, size_t keylen) { 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); } - -int YesBstr(const char *key, size_t keylen) +int YESBSTR(const char *key) { 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); } -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)) - 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); } +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); +} /* diff --git a/webcit/paramhandling.h b/webcit/paramhandling.h index 4aaddea71..1b2f62d02 100644 --- a/webcit/paramhandling.h +++ b/webcit/paramhandling.h @@ -20,7 +20,6 @@ void ParseURLParams(StrBuf *url); /* 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) @@ -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); -long LBSTR(const char *key); #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); -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); +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); diff --git a/webcit/static/t/vcard/edit.html b/webcit/static/t/vcard/edit.html index cc0430a6c..b5fc7aa74 100644 --- a/webcit/static/t/vcard/edit.html +++ b/webcit/static/t/vcard/edit.html @@ -14,41 +14,41 @@ - - - - - + + + + +
-


-


-


+


+


+


- - - - - - - + + + + + + +
- - + + - - + +
@@ -57,7 +57,7 @@
@@ -65,14 +65,16 @@

-
+

- + + + + +
- 
+  + + diff --git a/webcit/static/t/vcard/msg_display.html b/webcit/static/t/vcard/msg_display.html index b0d0b999b..a55b03dca 100644 --- a/webcit/static/t/vcard/msg_display.html +++ b/webcit/static/t/vcard/msg_display.html @@ -34,8 +34,8 @@ :
-
-
+
+
diff --git a/webcit/subst.c b/webcit/subst.c index 688299b23..7aa54bff8 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -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; - SortOrder = LBSTR("SortOrder"); + SortOrder = lbstr("SortOrder"); 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")) { - SortOrder = LBSTR("SortOrder"); + SortOrder = lbstr("SortOrder"); } 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")) { - *SortOrder = LBSTR("SortOrder"); + *SortOrder = lbstr("SortOrder"); } else { /** Try to fallback to our remembered values... */ if ((*Param)->PrefPrepend == NULL) { diff --git a/webcit/tabs.c b/webcit/tabs.c index a81c41432..90dac77b0 100644 --- a/webcit/tabs.c +++ b/webcit/tabs.c @@ -201,7 +201,7 @@ void StrEndTab(StrBuf *Target, int tabnum, int num_tabs) { "\n", tabnum, num_tabs ); } - if (HAVEBSTR("last_tabsel")) + if (havebstr("last_tabsel")) { StrBufAppendPrintf(Target, "", BSTR("last_tabsel")); } diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index 1f0b979c2..27ba6495b 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -28,6 +28,7 @@ typedef enum _VCStrEnum { Number, AliasFor, Base64BinaryAttachment, + UnKnown, TerminateList }VCStrEnum; typedef struct vcField vcField; @@ -36,48 +37,50 @@ struct vcField { VCStrEnum Type; vcField *Sub; long cval; + long parentCVal; 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 [] = { - {{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 [] = { - {{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 [] = { @@ -103,10 +106,13 @@ ConstStr VCStr [] = { 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) { + 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); @@ -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) ++; + vf[i].parentCVal = parentCVal; 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: { - autoRegisterTokens(enumCounter, vf[i].Sub, subStr, 1); - i++; - continue; + autoRegisterTokens(enumCounter, vf[i].Sub, subStr, 1, vf[i].cval); } break; case PhoneNumber: @@ -159,6 +164,8 @@ void autoRegisterTokens(long *enumCounter, vcField* vf, StrBuf *BaseStr, int lay break; case Address: break; + case UnKnown: + break; } 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; - char buf[20]; //SIZ]; + char buf[SIZ]; 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; @@ -701,10 +707,31 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachme break; case Base64BinaryAttachment: case TerminateList: + case UnKnown: 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); @@ -719,7 +746,6 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, wc_mime_attachme } else if (is_b64) { StrBufDecodeBase64(Val); - } #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; - char buf[SIZ]; 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); @@ -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)) @@ -1115,7 +1154,7 @@ void submit_vcard(void) { 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") @@ -1128,41 +1167,100 @@ void submit_vcard(void) { 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; iSub != 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) { @@ -1172,6 +1270,7 @@ void submit_vcard(void) { 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); @@ -1395,7 +1494,7 @@ InitModule_VCARD 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); diff --git a/webcit/webcit.c b/webcit/webcit.c index bca779a3a..4e3b2f86a 100644 --- a/webcit/webcit.c +++ b/webcit/webcit.c @@ -504,7 +504,7 @@ void push_destination(void) { } 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");