+vcField VCStr_Addrs [] = {
+ {{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, 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 [] = {
+ {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("work")},
+ {HKEY("home")},
+ {HKEY("cell")},
+ {HKEY("adr")},
+ {HKEY("photo")},
+ {HKEY("version")},
+ {HKEY("rev")},
+ {HKEY("label")},
+ {HKEY("uid")}
+};
+
+
+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);
+
+ syslog(LOG_DEBUG, "Token: %s -> %ld, %d",
+ ChrPtr(name),
+ vf->cval,
+ inTokenCount);
+
+}
+
+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);