From f2e5d296098eb72c5525e26a8e191c539d6fd4c9 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Tue, 5 May 2015 23:19:28 +0200 Subject: [PATCH] Implement dynamic vcard tokens --- webcit/vcard_edit.c | 274 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 227 insertions(+), 47 deletions(-) diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index 1a9f11a67..e7395e232 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -15,42 +15,195 @@ #include "calendar.h" CtxType CTX_VCARD = CTX_NONE; +int VCEnumCounter = 0; + +typedef enum _VCStrEnum { + FlatString, + StringCluster, + PhoneNumber, + EmailAddr, + Street, + Number, + AliasFor, + Base64BinaryAttachment, + TerminateList +}VCStrEnum; +typedef struct vcField vcField; +struct vcField { + ConstStr STR; + VCStrEnum Type; + vcField *Sub; + int cval; +}; + +vcField VCStr_Ns [] = { + {{HKEY("last")}, FlatString, NULL, 0}, + {{HKEY("first")}, FlatString, NULL, 0}, + {{HKEY("middle")}, FlatString, NULL, 0}, + {{HKEY("prefix")}, FlatString, NULL, 0}, + {{HKEY("suffix")}, FlatString, NULL, 0}, + {{HKEY("")}, TerminateList, NULL, 0} +}; + +vcField VCStr_Addrs [] = { + {{HKEY("POBox")}, FlatString, NULL, 0}, + {{HKEY("address")}, FlatString, NULL, 0}, + {{HKEY("address2")}, FlatString, NULL, 0}, + {{HKEY("city")}, FlatString, NULL, 0}, + {{HKEY("state")}, FlatString, NULL, 0}, + {{HKEY("zip")}, FlatString, NULL, 0}, + {{HKEY("country")}, FlatString, NULL, 0}, + {{HKEY("")}, TerminateList, NULL, 0} +}; + +vcField VCStrE [] = { + {{HKEY("n")}, StringCluster, VCStr_Ns, 0}, /* N is name, but only if there's no FN already there */ + {{HKEY("fn")}, FlatString, NULL, 0}, /* FN (full name) is a true 'display name' field */ + {{HKEY("title")}, FlatString, NULL, 0}, /* title */ + {{HKEY("org")}, FlatString, NULL, 0}, /* organization */ + {{HKEY("email")}, EmailAddr, NULL, 0}, + {{HKEY("tel")}, PhoneNumber, NULL, 0}, + {{HKEY("adr")}, StringCluster, VCStr_Addrs, 0}, + {{HKEY("photo")}, Base64BinaryAttachment, NULL, 0}, + {{HKEY("version")}, Number, NULL, 0}, + {{HKEY("rev")}, Number, NULL, 0}, + {{HKEY("label")}, FlatString, NULL, 0}, + {{HKEY("uid")}, FlatString, NULL, 0}, + {{HKEY("")}, TerminateList, NULL, 0} +}; ConstStr VCStr [] = { + {HKEY("")}, {HKEY("n")}, /* N is name, but only if there's no FN already there */ {HKEY("fn")}, /* FN (full name) is a true 'display name' field */ {HKEY("title")}, /* title */ {HKEY("org")}, /* organization */ {HKEY("email")}, {HKEY("tel")}, - {HKEY("tel_tel")}, - {HKEY("tel_work")}, - {HKEY("tel_home")}, - {HKEY("tel_cell")}, + {HKEY("work")}, + {HKEY("home")}, + {HKEY("cell")}, {HKEY("adr")}, {HKEY("photo")}, {HKEY("version")}, {HKEY("rev")}, - {HKEY("label")} + {HKEY("label")}, + {HKEY("uid")} }; -typedef enum _eVC{ - VC_n, - VC_fn, - VC_title, - VC_org, - VC_email, - VC_tel, - VC_tel_tel, - VC_tel_work, - VC_tel_home, - VC_tel_cell, - VC_adr, - VC_photo, - VC_version, - VC_rev, - VC_label -} eVC; + +HashList *DefineToToken = NULL; +HashList *vcNames = NULL; /* todo: fill with the name strings */ +void RegisterVCardToken(vcField* vf, StrBuf *name, int enumCounter, int inTokenCount) +{ + RegisterTokenParamDefine(SKEY(name), enumCounter); + Put(DefineToToken, LKEY(enumCounter), vf, reference_free_handler); + syslog(LOG_DEBUG, "Token: %s -> %d, %d", + ChrPtr(name), + enumCounter, + inTokenCount); + +} + +void autoRegisterTokens(int *enumCounter, vcField* vf, StrBuf *BaseStr) +{ + int i = 0; + while (vf[i].STR.len > 0) { + StrBuf *subStr = NewStrBuf(); + vf[i].cval = (*enumCounter) ++; + StrBufAppendBuf(subStr, BaseStr, 0); + if (StrLength(subStr) > 0) { + StrBufAppendBufPlain(subStr, HKEY("."), 0); + } + StrBufAppendBufPlain(subStr, CKEY(vf[i].STR), 0); + switch (vf[i].Type) { + case FlatString: + break; + case StringCluster: + { + autoRegisterTokens(enumCounter, vf[i].Sub, subStr); + i++; + continue; + } + break; + case PhoneNumber: + break; + case EmailAddr: + break; + case Street: + break; + case Number: + break; + case AliasFor: + break; + case Base64BinaryAttachment: + break; + case TerminateList: + break; + } + RegisterVCardToken(&vf[i], subStr, *enumCounter, i); + i++; + } +} + +int preeval_vcard_item(WCTemplateToken *Token) +{ + WCTemplputParams TPP; + WCTemplputParams *TP; + int searchFieldNo; + StrBuf *Target = NULL; + + memset(&TPP, 0, sizeof(WCTemplputParams)); + TP = &TPP; + TP->Tokens = Token; + searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0); + if (searchFieldNo >= VCEnumCounter) { + LogTemplateError(NULL, "VCardItem", ERR_PARM1, TP, + "Invalid define"); + return 0; + } + return 1; +} + +void tmpl_vcard_item(StrBuf *Target, WCTemplputParams *TP) +{ + void *vItem; + int searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0); + HashList *vc = (HashList*) CTX(CTX_VCARD); + if (GetHash(vc, IKEY(searchFieldNo), &vItem) && (vItem != NULL)) { + StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1); + } +} + +int preeval_vcard_name_str(WCTemplateToken *Token) +{ + WCTemplputParams TPP; + WCTemplputParams *TP; + int searchFieldNo; + StrBuf *Target = NULL; + + memset(&TPP, 0, sizeof(WCTemplputParams)); + TP = &TPP; + TP->Tokens = Token; + searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0); + if (searchFieldNo >= VCEnumCounter) { + LogTemplateError(NULL, "VCardName", ERR_PARM1, TP, + "Invalid define"); + return 0; + } + return 1; +} + +void tmpl_vcard_name_str(StrBuf *Target, WCTemplputParams *TP) +{ + void *vItem; + int searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0); + /* todo: get descriptive string for this vcard type */ + if (GetHash(vcNames, IKEY(searchFieldNo), &vItem) && (vItem != NULL)) { + StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1); + } +} + HashList *VCToEnum = NULL; @@ -361,7 +514,7 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, wc_mime_att utf8ify_rfc822_string(&v->prop[i].value); if (is_qp) { - // %ff can become 6 bytes in utf8 + /* %ff can become 6 bytes in utf8 */ thisvalue = malloc(len * 2 + 3); j = CtdlDecodeQuotedPrintable( thisvalue, v->prop[i].value, @@ -369,7 +522,7 @@ void display_parsed_vcard(StrBuf *Target, struct vCard *v, int full, wc_mime_att thisvalue[j] = 0; } else if (is_b64) { - // ff will become one byte.. + /* ff will become one byte.. */ thisvalue = malloc(len + 50); CtdlDecodeBase64( thisvalue, v->prop[i].value, @@ -554,12 +707,13 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, int full, wc_mim { StrBuf *Val = NULL; StrBuf *Swap = NULL; - int i, j; - char buf[SIZ]; + int i, j, k; + char buf[20]; //SIZ]; int is_qp = 0; int is_b64 = 0; + int ntokens, len; StrBuf *thisname = NULL; - char firsttoken[SIZ]; + char firsttoken[20]; ///SIZ]; void *V; Swap = NewStrBuf (); @@ -567,21 +721,36 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, int full, wc_mim for (i=0; i<(v->numprops); ++i) { is_qp = 0; is_b64 = 0; + syslog(LOG_DEBUG, "i: %d oneprop: %s - value: %s", i, v->prop[i].name, v->prop[i].value); StrBufPlain(thisname, v->prop[i].name, -1); StrBufLowerCase(thisname); /*len = */extract_token(firsttoken, ChrPtr(thisname), 0, ';', sizeof firsttoken); - - for (j=0; j k: %d %s - %s", evc, k, buf, VCStr[evc[k]].Key); + k++; + } + + } } /* copy over the payload into a StrBuf */ @@ -600,8 +769,10 @@ void parse_vcard(StrBuf *Target, struct vCard *v, HashList *VC, int full, wc_mim StrBufDecodeBase64(Val); } - syslog(LOG_DEBUG, "%s [%s][%s]", +#if 0 + syslog(LOG_DEBUG, "-> firsttoken: %s thisname: %s Value: [%s][%s]", firsttoken, + ChrPtr(thisname), ChrPtr(Val), v->prop[i].value); if (GetHash(VCToEnum, firsttoken, strlen(firsttoken), &V)) @@ -642,10 +813,10 @@ TODO: check for layer II } */ - +#endif FreeStrBuf(&Val); - free(thisname); - thisname = NULL; + ////free(thisname); + /// thisname = NULL; } } @@ -653,7 +824,7 @@ TODO: check for layer II void tmplput_VCARD_ITEM(StrBuf *Target, WCTemplputParams *TP) { HashList *VC = CTX(CTX_VCARD); - eVC evc; + int evc; void *vStr; evc = GetTemplateTokenNumber(Target, TP, 0, -1); @@ -737,6 +908,7 @@ void display_vcard(StrBuf *Target, ((!isalpha(alpha)) && (!isalpha(this_alpha))) ) { +#define XXX_XXX 1 #ifdef XXX_XXX new_vcard (Target, v, full, Mime); #else @@ -1525,24 +1697,23 @@ InitModule_VCARD WebcitAddUrlHandler(HKEY("edit_vcard"), "", 0, edit_vcard, 0); WebcitAddUrlHandler(HKEY("submit_vcard"), "", 0, submit_vcard, 0); WebcitAddUrlHandler(HKEY("vcardphoto"), "", 0, display_vcard_photo_img, NEED_URL); - +/* Put(VCToEnum, HKEY("n"), (void*)VC_n, reference_free_handler); Put(VCToEnum, HKEY("fn"), (void*)VC_fn, reference_free_handler); Put(VCToEnum, HKEY("title"), (void*)VC_title, reference_free_handler); Put(VCToEnum, HKEY("org"), (void*)VC_org, reference_free_handler); Put(VCToEnum, HKEY("email"), (void*)VC_email, reference_free_handler); Put(VCToEnum, HKEY("tel"), (void*)VC_tel, reference_free_handler); - Put(VCToEnum, HKEY("tel_tel"), (void*)VC_tel_tel, reference_free_handler); - Put(VCToEnum, HKEY("tel_work"), (void*)VC_tel_work, reference_free_handler); - Put(VCToEnum, HKEY("tel_home"), (void*)VC_tel_home, reference_free_handler); - Put(VCToEnum, HKEY("tel_cell"), (void*)VC_tel_cell, reference_free_handler); + Put(VCToEnum, HKEY("work"), (void*)VC_work, reference_free_handler); + Put(VCToEnum, HKEY("home"), (void*)VC_home, reference_free_handler); + Put(VCToEnum, HKEY("cell"), (void*)VC_cell, reference_free_handler); Put(VCToEnum, HKEY("adr"), (void*)VC_adr, reference_free_handler); Put(VCToEnum, HKEY("photo"), (void*)VC_photo, reference_free_handler); Put(VCToEnum, HKEY("version"), (void*)VC_version, reference_free_handler); Put(VCToEnum, HKEY("rev"), (void*)VC_rev, reference_free_handler); Put(VCToEnum, HKEY("label"), (void*)VC_label, reference_free_handler); - - +*/ +/* RegisterNamespace("VC", 1, 2, tmplput_VCARD_ITEM, NULL, CTX_VCARD); REGISTERTokenParamDefine(VC_n); @@ -1551,15 +1722,24 @@ InitModule_VCARD REGISTERTokenParamDefine(VC_org); REGISTERTokenParamDefine(VC_email); REGISTERTokenParamDefine(VC_tel); - REGISTERTokenParamDefine(VC_tel_tel); - REGISTERTokenParamDefine(VC_tel_work); - REGISTERTokenParamDefine(VC_tel_home); - REGISTERTokenParamDefine(VC_tel_cell); + REGISTERTokenParamDefine(VC_work); + REGISTERTokenParamDefine(VC_home); + REGISTERTokenParamDefine(VC_cell); REGISTERTokenParamDefine(VC_adr); REGISTERTokenParamDefine(VC_photo); REGISTERTokenParamDefine(VC_version); REGISTERTokenParamDefine(VC_rev); REGISTERTokenParamDefine(VC_label); +*/ + { + StrBuf *Prefix = NewStrBufPlain(HKEY("VC:")); + DefineToToken = NewHash(1, lFlathash); + autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix); + FreeStrBuf(&Prefix); + } + RegisterCTX(CTX_VCARD); + RegisterNamespace("VC:ITEM", 2, 2, tmpl_vcard_item, preeval_vcard_item, CTX_VCARD); + RegisterNamespace("VC:NAME", 1, 1, tmpl_vcard_name_str, preeval_vcard_name_str, CTX_VCARD); } -- 2.30.2