#include "calendar.h"
CtxType CTX_VCARD = CTX_NONE;
+CtxType CTX_VCARD_LIST = CTX_NONE;
CtxType CTX_VCARD_TYPE = CTX_NONE;
long VCEnumCounter = 0;
{HKEY("uid")}
};
+/*
+ * Address book entry (keep it short and sweet, it's just a quickie lookup
+ * which we can use to get to the real meat and bones later)
+ */
+typedef struct _addrbookent {
+ StrBuf *name;
+ HashList *VC;
+ long ab_msgnum; /* message number of address book entry */
+ StrBuf *msgNoStr;
+} addrbookent;
+
+void deleteAbEnt(void *v) {
+ addrbookent *vc = (addrbookent*)v;
+ DeleteHash(&vc->VC);
+ FreeStrBuf(&vc->name);
+ FreeStrBuf(&vc->msgNoStr);
+ free(vc);
+}
HashList *DefineToToken = NULL;
HashList *VCTokenToDefine = NULL;
{
void *vItem;
long searchFieldNo = GetTemplateTokenNumber(Target, TP, 0, 0);
- HashList *vc = (HashList*) CTX(CTX_VCARD);
- if (GetHash(vc, LKEY(searchFieldNo), &vItem) && (vItem != NULL)) {
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+ if (GetHash(ab->VC, LKEY(searchFieldNo), &vItem) && (vItem != NULL)) {
StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 1);
}
}
{
void *vItem;
vcField *t = (vcField*) CTX(CTX_VCARD_TYPE);
- HashList *vc = (HashList*) CTX(CTX_VCARD);
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
if (t == NULL) {
LogTemplateError(NULL, "VCard item", ERR_NAME, TP,
return;
}
- if (GetHash(vc, LKEY(t->cval), &vItem) && (vItem != NULL)) {
+ if (GetHash(ab->VC, LKEY(t->cval), &vItem) && (vItem != NULL)) {
StrBufAppendTemplate(Target, TP, (StrBuf*) vItem, 0);
}
else {
}
}
+void tmpl_vcard_msgno(StrBuf *Target, WCTemplputParams *TP)
+{
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+ if (ab->msgNoStr == NULL) {
+ ab->msgNoStr = NewStrBufPlain(NULL, 64);
+ }
+ StrBufPrintf(ab->msgNoStr, "%ld", ab->ab_msgnum);
+ StrBufAppendTemplate(Target, TP, ab->msgNoStr, 0);
+}
void tmpl_vcard_context_name_str(StrBuf *Target, WCTemplputParams *TP)
{
void *vItem;
searchType = GetTemplateTokenNumber(Target, TP, IT_ADDT_PARAM(0), 0);
if (vf->Type == searchType) {
- HashList *vc = (HashList*) CTX(CTX_VCARD);
- if (GetHash(vc, LKEY(vf->cval), &v) && v != NULL)
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
+ if (GetHash(ab->VC, LKEY(vf->cval), &v) && v != NULL)
return 1;
}
return rc;
HashList *getContextVcard(StrBuf *Target, WCTemplputParams *TP)
{
vcField *vf = (vcField*) CTX(CTX_VCARD_TYPE);
- HashList *vc = (HashList*) CTX(CTX_VCARD);
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
- if ((vf == NULL) || (vc == NULL)) {
+ if ((vf == NULL) || (ab == NULL)) {
LogTemplateError(NULL, "VCard item type", ERR_NAME, TP,
"Need VCard and Vcard type in context");
return NULL;
}
- return vc;
+ return ab->VC;
}
int filter_VC_ByContextType(const char* key, long len, void *Context, StrBuf *Target, WCTemplputParams *TP)
int conditional_VC_Havetype(StrBuf *Target, WCTemplputParams *TP)
{
- HashList *vc = (HashList*) CTX(CTX_VCARD);
+ addrbookent *ab = (addrbookent*) CTX(CTX_VCARD);
long HaveFieldType = GetTemplateTokenNumber(Target, TP, 2, 0);
int rc = 0;
void *vVCitem;
const char *Key;
long len;
- HashPos *it = GetNewHashPos(vc, 0);
- while (GetNextHashPos(vc, it, &len, &Key, &vVCitem) &&
+ HashPos *it = GetNewHashPos(ab->VC, 0);
+ while (GetNextHashPos(ab->VC, it, &len, &Key, &vVCitem) &&
(vVCitem != NULL))
{
void *vvcField;
void tmplput_VCARD_ITEM(StrBuf *Target, WCTemplputParams *TP)
{
- HashList *VC = CTX(CTX_VCARD);
+ addrbookent *ab = CTX(CTX_VCARD);
int evc;
void *vStr;
evc = GetTemplateTokenNumber(Target, TP, 0, -1);
if (evc != -1)
{
- if (GetHash(VC, IKEY(evc), &vStr))
+ if (GetHash(ab->VC, IKEY(evc), &vStr))
{
StrBufAppendTemplate(Target, TP,
(StrBuf*) vStr,
}
-void display_one_vcard (StrBuf *Target, HashList *VC, const char *tp_name, size_t tp_name_len)
+HashList *CtxGetVcardList(StrBuf *Target, WCTemplputParams *TP)
+{
+ HashList *pb = CTX(CTX_VCARD_LIST);
+ return pb;
+}
+
+void display_one_vcard (StrBuf *Target, addrbookent *ab, const char *tp_name, size_t tp_name_len)
{
WCTemplputParams *TP = NULL;
WCTemplputParams SubTP;
memset(&SubTP, 0, sizeof(WCTemplputParams));
- StackContext(TP, &SubTP, VC, CTX_VCARD, 0, NULL);
+ StackContext(TP, &SubTP, ab, CTX_VCARD, 0, NULL);
DoTemplate(tp_name, tp_name_len, Target, &SubTP);
UnStackContext(&SubTP);
wc_mime_attachment *VCAtt,
const char *return_to,
const char *force_room) {
- HashList *VC; WCTemplputParams SubTP;
+ WCTemplputParams SubTP;
wcsession *WCC = WC;
message_summary *Msg = NULL;
wc_mime_attachment *VCMime = NULL;
struct vCard *v;
char whatuser[256];
- VC = NewHash(0, lFlathash);
+ addrbookent ab;
+ memset(&ab, 0, sizeof(addrbookent));
+ ab.VC = NewHash(0, lFlathash);
/* Display the form */
output_headers(1, 1, 1, 0, 0, 0);
convenience_page("770000", _("Error"), "");/*TODO: important message*/
DestroyMessageSummary(Msg);
return;
+ DeleteHash(&ab.VC);
}
v = VCardLoad(VCMime->Data);
v = VCardLoad(VCAtt->Data);
}
- parse_vcard(WCC->WBuf, v, VC, NULL);
+ parse_vcard(WCC->WBuf, v, ab.VC, NULL);
vcard_free(v);
}
memset(&SubTP, 0, sizeof(WCTemplputParams));
-
{
WCTemplputParams *TP = NULL;
WCTemplputParams SubTP;
- StackContext(TP, &SubTP, VC, CTX_VCARD, 0, NULL);
+
+ StackContext(TP, &SubTP, &ab, CTX_VCARD, 0, NULL);
DoTemplate(HKEY("vcard_edit"), WCC->WBuf, &SubTP);
UnStackContext(&SubTP);
}
- DeleteHash(&VC);
+ DeleteHash(&ab.VC);
wDumpContent(1);
-/*
- * Address book entry (keep it short and sweet, it's just a quickie lookup
- * which we can use to get to the real meat and bones later)
- */
-typedef struct _addrbookent {
- StrBuf *name;
- HashList *VC;
- long ab_msgnum; /* message number of address book entry */
-} addrbookent;
-
-void deleteAbEnt(void *v) {
- addrbookent *vc = (addrbookent*)v;
- DeleteHash(&vc->VC);
- FreeStrBuf(&vc->name);
-}
-
typedef struct _vcardview_struct {
long is_singlecard;
HashList *addrbook;
abEntry->ab_msgnum = Msg->msgnum;
parse_vcard(WC->WBuf, v, abEntry->VC, VCMime);
- display_one_vcard(abEntry->name, abEntry->VC, HKEY("vcard_list_name"));
+ display_one_vcard(abEntry->name, abEntry, HKEY("vcard_list_name"));
if (StrLength(abEntry->name) == 0) {
StrBufPlain(abEntry->name, _("(no name)"), -1);
* addrbook the addressbook to render
* num_ab the number of the addressbook
*/
+static int NAMESPERPAGE = 60;
void do_addrbook_view(vcardview_struct* VS) {
long i = 0;
int displayed = 0;
int bg = 0;
- static int NAMESPERPAGE = 60;
int num_pages = 0;
int tabfirst = 0;
int tablast = 0;
int page = 0;
- char **tablabels;
+ const StrBuf **tablabels;
int num_ab = GetCount(VS->addrbook);
HashList *headlines;
HashPos *it;
num_pages = (GetCount(VS->addrbook) / NAMESPERPAGE) + 1;
- tablabels = malloc(num_pages * sizeof (char *));
+ tablabels = malloc(num_pages * sizeof (StrBuf *));
if (tablabels == NULL) {
return;
}
StrBufAppendBuf(headline, a2->name, 0);
}
}
+ tablabels[i] = headline;
Put(headlines, LKEY(i), headline, HFreeStrBuf);
}
-
- tabbed_dialog(num_pages, tablabels);
+ StrTabbedDialog(WC->WBuf, num_pages, tablabels);
page = (-1);
+
+ StackContext(TP, &SubTP, VS->addrbook, CTX_VCARD_LIST, 0, NULL);
+
+ DoTemplate(HKEY("vcard_list"), WCC->WBuf, &SubTP);
+ UnStackContext(&SubTP);
+/*
it = GetNewHashPos(VS->addrbook, 0);
for (i=0; i<num_ab; ++i) {
void *v;
if (v == NULL)
continue;
abEnt = (addrbookent *) v;
- if ((i / NAMESPERPAGE) != page) { /* New tab */
+ if ((i / NAMESPERPAGE) != page) { / * New tab * /
page = (i / NAMESPERPAGE);
if (page > 0) {
do_template("vcard_list_section_end");
}
- StackContext(TP, &SubTP, abEnt->VC, CTX_VCARD, 0, NULL);
+ StackContext(TP, &SubTP, abEnt, CTX_VCARD, 0, NULL);
DoTemplate(HKEY("vcard_list_entry"), WCC->WBuf, &SubTP);
UnStackContext(&SubTP);
++displayed;
}
DeleteHashPos(&it);
-
+*/
/* Placeholders for empty columns at end */
if ((num_ab % 4) != 0) {
for (i=0; i<(4-(num_ab % 4)); ++i) {
end_tab(num_pages, num_pages);
DeleteHash(&headlines);
+ free(tablabels);
wDumpContent(1);
}
if (v != NULL) {
HashList *VC;
-
- VC = NewHash(0, lFlathash);
+ addrbookent ab;
+ memset(&ab, 0, sizeof(addrbookent));
+
+ ab.VC = NewHash(0, lFlathash);
+ ab.ab_msgnum = Mime->msgnum;
+
parse_vcard(Target, v, VC, Mime);
- display_one_vcard (Target, VC, HKEY("vcard_msg_display"));
+ display_one_vcard (Target, &ab, HKEY("vcard_msg_display"));
DeleteHash(&VC);
}
VCTokenToDefine = NewHash(1, NULL);
autoRegisterTokens(&VCEnumCounter, VCStrE, Prefix, 0, 0);
FreeStrBuf(&Prefix);
+
+ REGISTERTokenParamDefine(NAMESPERPAGE);
+
+
RegisterCTX(CTX_VCARD);
+ RegisterCTX(CTX_VCARD_LIST);
RegisterCTX(CTX_VCARD_TYPE);
+
RegisterReadLoopHandlerset(
VIEW_ADDRESSBOOK,
vcard_GetParamsGetServerCall,
vcard_LoadMsgFromServer,
vcard_RenderView_or_Tail,
vcard_Cleanup);
+
+ RegisterIterator("MAIL:VCARDS", 0, NULL, CtxGetVcardList, NULL, NULL, CTX_VCARD, CTX_VCARD_LIST, IT_NOFLAG);
+
+
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);
RegisterNamespace("VC:ITEM", 2, 2, tmpl_vcard_item, preeval_vcard_item, CTX_VCARD);
RegisterNamespace("VC:CTXITEM", 1, 1, tmpl_vcard_context_item, NULL, CTX_VCARD_TYPE);
RegisterNamespace("VC:NAME", 1, 1, tmpl_vcard_name_str, preeval_vcard_name_str, CTX_VCARD);
+ RegisterNamespace("VC:MSGNO", 0, 1, tmpl_vcard_msgno, NULL, CTX_VCARD);
RegisterNamespace("VC:CTXNAME", 1, 1, tmpl_vcard_context_name_str, NULL, CTX_VCARD_TYPE);
REGISTERTokenParamDefine(FlatString);
REGISTERTokenParamDefine(StringCluster);