}
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 {
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);
if (*aptr == ':') {
have_colon = 1;
}
+ else if ((*aptr == '%') &&
+ (*(aptr + 1) == '3') &&
+ ((*(aptr + 2) == 'A') ||
+ (*(aptr + 1) == 'a')
+ ))
+ {
+ have_colon = 2;
+ }
aptr++;
}
if (*aptr != '=') {
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;
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);
+}
/*
<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>
- <?_("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">
- <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>
- <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>
- <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">
<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>
</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="submit" name="ok_button" value="Save changes"> <input type="submit" name="cancel_button" value="Cancel"></div></form>
+<input type="submit" name="ok_button" value="Save changes"> <input type="submit" name="cancel_button" value="Cancel"></div>
</td></tr></table>
+</form>
<?=("box_end")>
+</div>
Number,
AliasFor,
Base64BinaryAttachment,
+ UnKnown,
TerminateList
}VCStrEnum;
typedef struct vcField 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 [] = {
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);
}
-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);
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 Address:
break;
+ case UnKnown:
+ break;
}
RegisterVCardToken(&vf[i], subStr, i);
i++;
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;
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);
}
else if (is_b64) {
StrBufDecodeBase64(Val);
-
}
#if 0
syslog(LOG_DEBUG, "-> firsttoken: %s thisname: %s Value: [%s][%s]",
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);
}
}
+ 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))
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")
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) {
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);
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);