From: Wilfried Goesgens Date: Fri, 24 Aug 2012 10:37:43 +0000 (+0200) Subject: SUBST: Dynamicaly generate contexts X-Git-Tag: v8.20~245 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=5d38a76f8f06640e3a3f097d584ac52336110f7c SUBST: Dynamicaly generate contexts - so far we needed to add contexts to subst.h + subst.c; Now we simply register new ones before registering tokens using them. - RegisterCTX is duplicate safe, so you can call it several times for the same context. That way you can make shure the context is there before registering handlers in several .c files. --- diff --git a/webcit/dav_main.c b/webcit/dav_main.c index 157c95397..06466f2bb 100644 --- a/webcit/dav_main.c +++ b/webcit/dav_main.c @@ -16,6 +16,7 @@ #include "webserver.h" #include "dav.h" +CtxType CTX_DAVNS = CTX_NONE; extern HashList *HandlerHash; HashList *DavNamespaces = NULL; @@ -333,6 +334,7 @@ void InitModule_GROUPDAV (void) { + RegisterCTX(CTX_DAVNS); RegisterDAVNamespace(HKEY("groupdav"), HKEY("GroupDAV"), dav_main, GroupdavDispatchREST, XHTTP_COMMANDS|COOKIEUNNEEDED|FORCE_SESSIONCLOSE diff --git a/webcit/downloads.c b/webcit/downloads.c index f7f9c9dc5..f39622495 100644 --- a/webcit/downloads.c +++ b/webcit/downloads.c @@ -13,6 +13,8 @@ #include "webcit.h" #include "webserver.h" +CtxType CTX_FILELIST = CTX_NONE; + extern void output_static(const char* What); extern char* static_dirs[]; @@ -420,6 +422,7 @@ void InitModule_DOWNLOAD (void) { + RegisterCTX(CTX_FILELIST); RegisterIterator("ROOM:FILES", 0, NULL, LoadFileList, NULL, DeleteHash, CTX_FILELIST, CTX_NONE, diff --git a/webcit/ical_subst.c b/webcit/ical_subst.c index 852fcc87b..aceb56c28 100644 --- a/webcit/ical_subst.c +++ b/webcit/ical_subst.c @@ -15,7 +15,7 @@ extern IcalEnumMap icalproperty_kind_map[]; HashList *IcalComponentMap = NULL; - +CtxType CTX_ICAL = CTX_NONE; #if 0 void SortPregetMatter(HashList *Cals) { @@ -123,6 +123,7 @@ void InitModule_ICAL_SUBST (void) { + RegisterCTX(CTX_ICAL); CreateIcalComponendKindLookup (); } diff --git a/webcit/messages.h b/webcit/messages.h index 21ae47467..3129b18e0 100644 --- a/webcit/messages.h +++ b/webcit/messages.h @@ -1,4 +1,4 @@ - +extern CtxType CTX_MAILSUM; extern HashList *MsgHeaderHandler; extern HashList *MimeRenderHandler; extern HashList *ReadLoopHandler; diff --git a/webcit/msg_renderers.c b/webcit/msg_renderers.c index 3e5c29fce..8de9f45d5 100644 --- a/webcit/msg_renderers.c +++ b/webcit/msg_renderers.c @@ -2,7 +2,8 @@ #include "webserver.h" #include "dav.h" - +CtxType CTX_MAILSUM = CTX_NONE; +CtxType CTX_MIME_ATACH = CTX_NONE; inline void CheckConvertBufs(struct wcsession *WCC) { @@ -618,40 +619,6 @@ void render_MIME_VCard(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundC } -void render_MIME_VNote(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset) -{ - if (StrLength(Mime->Data) == 0) - MimeLoadData(Mime); - if (StrLength(Mime->Data) > 0) { - struct vnote *v; - StrBuf *Buf; - char *vcard; - - Buf = NewStrBuf(); - vcard = SmashStrBuf(&Mime->Data); - v = vnote_new_from_str(vcard); - free (vcard); - if (v) { - WCTemplputParams TP; - - memset(&TP, 0, sizeof(WCTemplputParams)); - TP.Filter.ContextType = CTX_VNOTE; - TP.Context = v; - DoTemplate(HKEY("mail_vnoteitem"), - Buf, &TP); - - vnote_free(v); - Mime->Data = Buf; - } - else { - if (Mime->Data == NULL) - Mime->Data = NewStrBuf(); - else - FlushStrBuf(Mime->Data); - } - } -} - void render_MIME_ICS(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset) { if (StrLength(Mime->Data) == 0) { @@ -1481,6 +1448,8 @@ void InitModule_MSGRENDERERS (void) { + RegisterCTX(CTX_MAILSUM); + RegisterCTX(CTX_MIME_ATACH); RegisterReadLoopHandlerset( VIEW_MAILBOX, mailview_GetParamsGetServerCall, @@ -1594,7 +1563,6 @@ InitModule_MSGRENDERERS /* mime renderers translate an attachment into webcit viewable html text */ RegisterMimeRenderer(HKEY("message/rfc822"), render_MAIL, 0, 150); - RegisterMimeRenderer(HKEY("text/vnote"), render_MIME_VNote, 1, 300); RegisterMimeRenderer(HKEY("text/x-vcard"), render_MIME_VCard, 1, 201); RegisterMimeRenderer(HKEY("text/vcard"), render_MIME_VCard, 1, 200); RegisterMimeRenderer(HKEY("text/calendar"), render_MIME_ICS, 1, 501); diff --git a/webcit/netconf.c b/webcit/netconf.c index 4dd20d45e..83c391429 100644 --- a/webcit/netconf.c +++ b/webcit/netconf.c @@ -2,6 +2,7 @@ void display_netconf(void); +CtxType CTX_NODECONF = CTX_NONE; /*----------------------------------------------------------------------*/ /* Business Logic */ /*----------------------------------------------------------------------*/ @@ -287,6 +288,7 @@ void InitModule_NETCONF (void) { + RegisterCTX(CTX_NODECONF); WebcitAddUrlHandler(HKEY("display_edit_node"), "", 0, display_edit_node, 0); WebcitAddUrlHandler(HKEY("aide_ignetconf_edit_node"), "", 0, edit_node, 0); diff --git a/webcit/notes.c b/webcit/notes.c index 114124840..df39e36a3 100644 --- a/webcit/notes.c +++ b/webcit/notes.c @@ -3,6 +3,8 @@ #include "dav.h" #include "webserver.h" +CtxType CTX_VNOTE = CTX_NONE; + int pastel_palette[9][3] = { { 0x80, 0x80, 0x80 }, { 0xff, 0x80, 0x80 }, @@ -433,11 +435,48 @@ int notes_Cleanup(void **ViewSpecific) return 0; } +void render_MIME_VNote(wc_mime_attachment *Mime, StrBuf *RawData, StrBuf *FoundCharset) +{ + if (StrLength(Mime->Data) == 0) + MimeLoadData(Mime); + if (StrLength(Mime->Data) > 0) { + struct vnote *v; + StrBuf *Buf; + char *vcard; + + Buf = NewStrBuf(); + vcard = SmashStrBuf(&Mime->Data); + v = vnote_new_from_str(vcard); + free (vcard); + if (v) { + WCTemplputParams TP; + + memset(&TP, 0, sizeof(WCTemplputParams)); + TP.Filter.ContextType = CTX_VNOTE; + TP.Context = v; + DoTemplate(HKEY("mail_vnoteitem"), + Buf, &TP); + + vnote_free(v); + Mime->Data = Buf; + } + else { + if (Mime->Data == NULL) + Mime->Data = NewStrBuf(); + else + FlushStrBuf(Mime->Data); + } + } +} + + void InitModule_NOTES (void) { + RegisterCTX(CTX_VNOTE); + RegisterReadLoopHandlerset( VIEW_NOTES, notes_GetParamsGetServerCall, @@ -461,4 +500,6 @@ InitModule_NOTES RegisterNamespace("VNOTE:BGCOLOR", 0, 0,tmpl_vcard_put_bgcolor, NULL, CTX_VNOTE); RegisterNamespace("VNOTE:MSG", 0, 1, tmpl_vcard_put_message, NULL, CTX_VNOTE); RegisterNamespace("VNOTE:UID", 0, 0, tmpl_vcard_put_uid, NULL, CTX_VNOTE); + + RegisterMimeRenderer(HKEY("text/vnote"), render_MIME_VNote, 1, 300); } diff --git a/webcit/roomlist.c b/webcit/roomlist.c index 5ade41ead..3dad18a29 100644 --- a/webcit/roomlist.c +++ b/webcit/roomlist.c @@ -5,6 +5,7 @@ #include "webcit.h" #include "webserver.h" + HashList *GetWhoKnowsHash(StrBuf *Target, WCTemplputParams *TP) { StrBuf *Line; @@ -680,6 +681,9 @@ void InitModule_ROOMLIST (void) { + /* we duplicate this, just to be shure its already done. */ + RegisterCTX(CTX_ROOMS); + RegisterCTX(CTX_FLOORS); RegisterIterator("ITERATE:THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG); RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUFARR, CTX_NONE, IT_NOFLAG); diff --git a/webcit/roomops.h b/webcit/roomops.h index 516c00d78..d64cf1f04 100644 --- a/webcit/roomops.h +++ b/webcit/roomops.h @@ -149,3 +149,6 @@ int CompareRooms(const folder *room1, const folder *room2); #define REST_GOT_LOCAL_PART (1<<4) #define REST_NONEXIST (1<<5) + +extern CtxType CTX_ROOMS; +extern CtxType CTX_FLOORS; diff --git a/webcit/roomtokens.c b/webcit/roomtokens.c index 7a993dd6a..57d21443e 100644 --- a/webcit/roomtokens.c +++ b/webcit/roomtokens.c @@ -15,6 +15,8 @@ #include "webcit.h" #include "webserver.h" +CtxType CTX_ROOMS = CTX_NONE; +CtxType CTX_FLOORS = CTX_NONE; /* * Embed the room banner @@ -570,6 +572,10 @@ void InitModule_ROOMTOKENS (void) { + /* we duplicate this, just to be shure its already done. */ + RegisterCTX(CTX_ROOMS); + RegisterCTX(CTX_FLOORS); + RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, NULL, CTX_NONE); RegisterNamespace("FLOOR:ID", 0, 0, tmplput_FLOOR_ID, NULL, CTX_FLOORS); diff --git a/webcit/roomviews.c b/webcit/roomviews.c index 7cdbac4b2..e7ff823b2 100644 --- a/webcit/roomviews.c +++ b/webcit/roomviews.c @@ -249,6 +249,10 @@ void InitModule_ROOMVIEWS (void) { + /* we duplicate this, just to be shure its already done. */ + RegisterCTX(CTX_ROOMS); + RegisterCTX(CTX_FLOORS); + initialize_viewdefs(); RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE); diff --git a/webcit/sieve.c b/webcit/sieve.c index a49d6b30d..214e7b446 100644 --- a/webcit/sieve.c +++ b/webcit/sieve.c @@ -14,6 +14,9 @@ #include "webcit.h" +CtxType CTX_SIEVELIST = CTX_NONE; +CtxType CTX_SIEVESCRIPT = CTX_NONE; + #define MAX_SCRIPTS 100 #define MAX_RULES 50 #define RULES_SCRIPT "__WebCit_Generated_Script__" @@ -890,6 +893,8 @@ void InitModule_SIEVE (void) { + RegisterCTX(CTX_SIEVELIST); + RegisterCTX(CTX_SIEVESCRIPT); REGISTERTokenParamDefine(from); REGISTERTokenParamDefine(tocc); REGISTERTokenParamDefine(subject); diff --git a/webcit/siteconfig.c b/webcit/siteconfig.c index dede75768..f755b54f9 100644 --- a/webcit/siteconfig.c +++ b/webcit/siteconfig.c @@ -15,6 +15,8 @@ #include "webcit.h" #include "webserver.h" +CtxType CTX_SRVLOG = CTX_NONE; + HashList *ZoneHash = NULL; ConstStr ExpirePolicyString = {CStrOf(roompolicy) }; @@ -472,6 +474,7 @@ void InitModule_SITECONFIG (void) { + RegisterCTX(CTX_SRVLOG); WebcitAddUrlHandler(HKEY("siteconfig"), "", 0, siteconfig, CTX_NONE); RegisterNamespace("SERV:CFG", 1, 2, tmplput_servcfg, NULL, CTX_NONE); diff --git a/webcit/smtpqueue.c b/webcit/smtpqueue.c index 8bf02a7f6..2004bad8c 100644 --- a/webcit/smtpqueue.c +++ b/webcit/smtpqueue.c @@ -3,6 +3,8 @@ */ #include "webcit.h" +CtxType CTX_MAILQITEM = CTX_NONE; +CtxType CTX_MAILQ_RCPT = CTX_NONE; HashList *QItemHandlers = NULL; @@ -406,6 +408,8 @@ void InitModule_SMTP_QUEUE (void) { + RegisterCTX(CTX_MAILQITEM); + RegisterCTX(CTX_MAILQ_RCPT); RegisterQItemHandler(HKEY("msgid"), QItem_Handle_MsgID); RegisterQItemHandler(HKEY("envelope_from"), QItem_Handle_EnvelopeFrom); diff --git a/webcit/subst.c b/webcit/subst.c index 83f780875..52f50f448 100644 --- a/webcit/subst.c +++ b/webcit/subst.c @@ -83,44 +83,70 @@ typedef struct _SortStruct { CompareFunc Reverse; CompareFunc GroupChange; - long ContextType; + CtxType ContextType; }SortStruct; -const char *CtxNames[] = { - "Context NONE", - "Context SITECFG", - "Context SESSION", - "Context INETCFG", - "Context VNOTE", - "Context WHO", - "Context PREF", - "Context NODECONF", - "Context USERLIST", - "Context MAILSUM", - "Context MIME_ATACH", - "Context FILELIST", - "Context STRBUF", - "Context STRBUFARR", - "Context LONGVECTOR", - "Context ROOMS", - "Context FLOORS", - "Context ITERATE", - "Context ICAL", - "Context DavNamespace", - "Context TAB", - "Context VCARD", - "Context SIEVE List", - "Context SIEVE Script", - "Context MailQ-Item", - "Context MailQ-Recipient", - "Context ServLogStatus", - "Context UNKNOWN" -}; +HashList *CtxList = NULL; + +static CtxType CtxCounter = CTX_NONE; + +CtxType CTX_STRBUF = CTX_NONE; +CtxType CTX_STRBUFARR = CTX_NONE; +CtxType CTX_LONGVECTOR = CTX_NONE; + +CtxType CTX_ITERATE = CTX_NONE; +CtxType CTX_TAB = CTX_NONE; + +void HFreeContextType(void *pCtx) +{ + CtxTypeStruct *FreeStruct = (CtxTypeStruct *) pCtx; + FreeStrBuf(&FreeStruct->Name); + free(FreeStruct); +} +void PutContextType(const char *name, long len, CtxType TheCtx) +{ + CtxTypeStruct *NewStruct; + + NewStruct = (CtxTypeStruct*) malloc(sizeof(CtxTypeStruct)); + NewStruct->Name = NewStrBufPlain(name, len); + NewStruct->Type = TheCtx; + + Put(CtxList, IKEY(NewStruct->Type), NewStruct, HFreeContextType); +} +void RegisterContextType(const char *name, long len, CtxType *TheCtx) +{ + if (*TheCtx != CTX_NONE) + return; + + *TheCtx = ++CtxCounter; + PutContextType(name, len, *TheCtx); +} + +CtxTypeStruct *GetContextType(CtxType Type) +{ + void *pv = NULL; + GetHash(CtxList, IKEY(Type), &pv); + return pv; +} + +const char *UnknownContext = "CTX_UNKNOWN"; + +const char *ContextName(CtxType ContextType) +{ + CtxTypeStruct *pCtx; + + pCtx = GetContextType(ContextType); + + if (pCtx != NULL) + return ChrPtr(pCtx->Name); + else + return UnknownContext; +} void StackContext(WCTemplputParams *Super, WCTemplputParams *Sub, void *Context, - int ContextType, + CtxType ContextType, int nArgs, WCTemplateToken *Tokens) { @@ -146,7 +172,7 @@ void UnStackContext(WCTemplputParams *Sub) } } -void *GetContextPayload(WCTemplputParams *TP, int ContextType) +void *GetContextPayload(WCTemplputParams *TP, CtxType ContextType) { WCTemplputParams *whichTP = TP; @@ -167,13 +193,6 @@ void DestroySortStruct(void *vSort) free (Sort); } -const char *ContextName(int ContextType) -{ - if (ContextType < CTX_UNKNOWN) - return CtxNames[ContextType]; - else - return CtxNames[CTX_UNKNOWN]; -} void LogTemplateError (StrBuf *Target, const char *Type, int ErrorPos, WCTemplputParams *TP, const char *Format, ...) { @@ -322,7 +341,7 @@ void RegisterNS(const char *NSName, int nMaxArgs, WCHandlerFunc HandlerFunc, WCPreevalFunc PreevalFunc, - int ContextRequired) + CtxType ContextRequired) { HashHandler *NewHandler; @@ -1077,8 +1096,7 @@ WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf, } else { LogTemplateError( NULL, "Token ", ERR_NAME, &TP, - " isn't known to us.", - NULL); + " isn't known to us."); } break; case SV_GETTEXT: @@ -1815,8 +1833,8 @@ void tmplput_Comment(StrBuf *Target, WCTemplputParams *TP) typedef struct _HashIterator { HashList *StaticList; int AdditionalParams; - int ContextType; - int XPectContextType; + CtxType ContextType; + CtxType XPectContextType; int Flags; RetrieveHashlistFunc GetHash; HashDestructorFunc Destructor; @@ -1829,8 +1847,8 @@ void RegisterITERATOR(const char *Name, long len, RetrieveHashlistFunc GetHash, SubTemplFunc DoSubTempl, HashDestructorFunc Destructor, - int ContextType, - int XPectContextType, + CtxType ContextType, + CtxType XPectContextType, int Flags) { HashIterator *It; @@ -2400,7 +2418,7 @@ void RegisterSortFunc(const char *name, long len, CompareFunc Forward, CompareFunc Reverse, CompareFunc GroupChange, - long ContextType) + CtxType ContextType) { SortStruct *NewSort; @@ -2756,6 +2774,9 @@ void InitModule_SUBST (void) { + RegisterCTX(CTX_TAB); + RegisterCTX(CTX_ITERATE); + memset(&NoCtx, 0, sizeof(WCTemplputParams)); RegisterNamespace("--", 0, 2, tmplput_Comment, NULL, CTX_NONE); RegisterNamespace("SORT:ICON", 1, 2, tmplput_SORT_ICON, NULL, CTX_NONE); @@ -2812,6 +2833,13 @@ ServerStartModule_SUBST Conditionals = NewHash(1, NULL); SortHash = NewHash(1, NULL); Defines = NewHash(1, NULL); + CtxList = NewHash(1, NULL); + + PutContextType(HKEY("CTX_NONE"), 0); + + RegisterCTX(CTX_STRBUF); + RegisterCTX(CTX_STRBUFARR); + RegisterCTX(CTX_LONGVECTOR); } void @@ -2833,6 +2861,7 @@ ServerShutdownModule_SUBST DeleteHash(&Conditionals); DeleteHash(&SortHash); DeleteHash(&Defines); + DeleteHash(&CtxList); } diff --git a/webcit/subst.h b/webcit/subst.h index f0aa90c24..75bbf3e33 100644 --- a/webcit/subst.h +++ b/webcit/subst.h @@ -36,35 +36,20 @@ enum { }; #define CTX_NONE 0 -#define CTX_SITECFG 1 -#define CTX_SESSION 2 -#define CTX_INETCFG 3 -#define CTX_VNOTE 4 -#define CTX_WHO 5 -#define CTX_PREF 6 -#define CTX_NODECONF 7 -#define CTX_USERLIST 8 -#define CTX_MAILSUM 9 -#define CTX_MIME_ATACH 10 -#define CTX_FILELIST 11 -#define CTX_STRBUF 12 -#define CTX_STRBUFARR 13 -#define CTX_LONGVECTOR 14 -#define CTX_ROOMS 15 -#define CTX_FLOORS 16 -#define CTX_ITERATE 17 -#define CTX_ICAL 18 -#define CTX_DAVNS 19 -#define CTX_TAB 20 -#define CTX_VCARD 21 -#define CTX_SIEVELIST 22 -#define CTX_SIEVESCRIPT 23 -#define CTX_MAILQITEM 24 -#define CTX_MAILQ_RCPT 25 -#define CTX_SRVLOG 26 - -#define CTX_UNKNOWN 27 +typedef int CtxType; +typedef struct __CtxTypeStruct { + CtxType Type; + StrBuf *Name; +} CtxTypeStruct; + +CtxTypeStruct *GetContextType(CtxType Type); +void RegisterContextType(const char *name, long len, CtxType *TheCtx); +#define RegisterCTX(a) RegisterContextType(#a, sizeof(#a) - 1, &a) + +extern CtxType CTX_STRBUF; +extern CtxType CTX_STRBUFARR; +extern CtxType CTX_LONGVECTOR; /** * @ingroup subst @@ -74,7 +59,7 @@ enum { * if not, we will log/print an error and refuse to call it. */ typedef struct _contexts { - int ContextType; /* do we require a User Context ? */ + CtxType ContextType; /* do we require a User Context ? */ int nMinArgs; /* How many arguments do we need at least? */ int nMaxArgs; /* up to how many arguments can we handle? */ } ContextFilter; @@ -93,7 +78,7 @@ typedef int (*WCPreevalFunc)(WCTemplateToken *Token); /* make a template token a lookup key: */ #define TKEY(a) TP->Tokens->Params[a]->Start, TP->Tokens->Params[a]->len -void *GetContextPayload(WCTemplputParams *TP, int ContextType); +void *GetContextPayload(WCTemplputParams *TP, CtxType ContextType); #define CTX(a) GetContextPayload(TP, a) /** @@ -356,8 +341,8 @@ void RegisterITERATOR(const char *Name, long len, /* Our identifier */ RetrieveHashlistFunc GetHash, /* else retrieve the hashlist by calling this function */ SubTemplFunc DoSubTempl, /* call this function on each iteration for svput & friends */ HashDestructorFunc Destructor, /* use this function to shut down the hash; NULL if its a reference */ - int ContextType, /* which context do we provide to the subtemplate? */ - int XPectContextType, /* which context do we expct to be called in? */ + CtxType ContextType, /* which context do we provide to the subtemplate? */ + CtxType XPectContextType, /* which context do we expct to be called in? */ int Flags); @@ -365,7 +350,7 @@ void RegisterITERATOR(const char *Name, long len, /* Our identifier */ void StackContext(WCTemplputParams *Super, WCTemplputParams *Sub, void *Context, - int ContextType, + CtxType ContextType, int nArgs, WCTemplateToken *Tokens); @@ -382,7 +367,7 @@ void RegisterSortFunc(const char *name, long len, CompareFunc Forward, CompareFunc Reverse, CompareFunc GroupChange, - long ContextType); + CtxType ContextType); void dbg_print_longvector(long *LongVector); diff --git a/webcit/useredit.c b/webcit/useredit.c index 657588a0d..9e70f81d3 100644 --- a/webcit/useredit.c +++ b/webcit/useredit.c @@ -13,7 +13,7 @@ #include "webcit.h" #include "webserver.h" - +CtxType CTX_USERLIST = CTX_NONE; /* * show a list of available users to edit them * message the header message??? @@ -806,6 +806,7 @@ void InitModule_USEREDIT (void) { + RegisterCTX(CTX_USERLIST); WebcitAddUrlHandler(HKEY("select_user_to_edit"), "", 0, _select_user_to_edit, 0); WebcitAddUrlHandler(HKEY("display_edituser"), "", 0, _display_edituser, 0); WebcitAddUrlHandler(HKEY("edituser"), "", 0, edituser, 0); diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c index 8be73cd87..950fae6f4 100644 --- a/webcit/vcard_edit.c +++ b/webcit/vcard_edit.c @@ -14,7 +14,7 @@ #include "webserver.h" #include "calendar.h" - +CtxType CTX_VCARD = CTX_NONE; ConstStr VCStr [] = { {HKEY("n")}, /* N is name, but only if there's no FN already there */ @@ -1511,6 +1511,7 @@ void InitModule_VCARD (void) { + RegisterCTX(CTX_VCARD); RegisterReadLoopHandlerset( VIEW_ADDRESSBOOK, vcard_GetParamsGetServerCall, diff --git a/webcit/who.c b/webcit/who.c index de0160e7f..156001137 100644 --- a/webcit/who.c +++ b/webcit/who.c @@ -1,6 +1,8 @@ #include "webcit.h" +CtxType CTX_WHO = CTX_NONE; + typedef struct UserStateStruct { StrBuf *UserName; StrBuf *Room; @@ -307,7 +309,7 @@ void InitModule_WHO (void) { - + RegisterCTX(CTX_WHO); WebcitAddUrlHandler(HKEY("terminate_session"), "", 0, _terminate_session, 0); WebcitAddUrlHandler(HKEY("edit_me"), "", 0, edit_me, 0);