* more syntax error detections and warnings in the template engine...
* change trailing_js to be a static template hook too
* pre-evaluate conditionals too
* swap startup sequence so pre-evaluation actualy works (first register hooks, then parse templates)
* global function to be used by string tmplput hooks which evaluates escaping demanded by template tokens in a central place
* fix spelling in some mobile templates
* move SERV: template hooks into serv_func.c
}
+
+
+
+
int GetServerStatus(StrBuf *Line, long* FullState)
{
if (FullState != NULL)
return ChrPtr(Line)[0] - 48;
}
+
+void tmplput_serv_ip(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrBufAppendPrintf(Target, "%d", WC->ctdl_pid);
+}
+
+void tmplput_serv_nodename(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, serv_info.serv_nodename, 0, 0);
+}
+
+void tmplput_serv_humannode(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, serv_info.serv_humannode, 0, 0);
+}
+
+void tmplput_serv_fqdn(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, serv_info.serv_fqdn, 0, 0);
+}
+
+void tmmplput_serv_software(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, serv_info.serv_software, 0, 0);
+}
+
+void tmplput_serv_rev_level(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrBufAppendPrintf(Target, "%d.%02d",
+ serv_info.serv_rev_level / 100,
+ serv_info.serv_rev_level % 100);
+}
+
+void tmmplput_serv_bbs_city(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, serv_info.serv_bbs_city, 0, 0);
+}
+
+void tmplput_current_user(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, WC->wc_fullname, 0, 0);
+}
+
+void tmplput_current_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
+{
+ StrEscAppend(Target, NULL, WC->wc_roomname, 0, 0);
+}
+
+
+
+
+
+void
+InitModule_SERVFUNC
+(void)
+{
+ RegisterNamespace("CURRENT_USER", 0, 0, tmplput_current_user, CTX_NONE);
+ RegisterNamespace("CURRENT_ROOM", 0, 0, tmplput_current_room, CTX_NONE);
+ RegisterNamespace("SERV:PID", 0, 0, tmplput_serv_ip, CTX_NONE);
+ RegisterNamespace("SERV:NODENAME", 0, 0, tmplput_serv_nodename, CTX_NONE);
+ RegisterNamespace("SERV:HUMANNODE", 0, 0, tmplput_serv_humannode, CTX_NONE);
+ RegisterNamespace("SERV:FQDN", 0, 0, tmplput_serv_fqdn, CTX_NONE);
+ RegisterNamespace("SERV:SOFTWARE", 0, 0, tmmplput_serv_software, CTX_NONE);
+ RegisterNamespace("SERV:REV_LEVEL", 0, 0, tmplput_serv_rev_level, CTX_NONE);
+ RegisterNamespace("SERV:BBS_CITY", 0, 0, tmmplput_serv_bbs_city, CTX_NONE);
+/// RegisterNamespace("SERV:LDAP_SUPP", 0, 0, tmmplput_serv_ldap_enabled, 0);
+}
+
/*@}*/
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title><?CURRENT_USER> - <?SERV_HUMANNODE></title>
+<title><?CURRENT_USER> - <?SERV:HUMANNODE></title>
<meta name="MSSmartTagsPreventParsing" content="TRUE" >
<meta name="keywords" content="groupware messaging collaboration" >
<link href="static/mobile.css" rel="stylesheet" type="text/css">
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
-<title><?CURRENT_USER> - <?SERV_HUMANNODE></title>
+<title><?CURRENT_USER> - <?SERV:HUMANNODE></title>
<meta name="MSSmartTagsPreventParsing" content="TRUE" >
<meta name="keywords" content="groupware messaging collaboration" >
<link href="/static/mobile.css" rel="stylesheet" type="text/css">
<br /><br />
<div align=center>
<i>(Note: this does not change your browser's home page.
-It changes the page you begin on when you log on to <?SERV_HUMANNODE>).</i>
+It changes the page you begin on when you log on to <?SERV:HUMANNODE>).</i>
<br /><br />
<a href="javascript:history.back()">Back...</a>
</div>
</div>
-<! newstartpage.html end>
\ No newline at end of file
+<! newstartpage.html end>
<div class="room_banner">
<img src="static/usermanag_48x.gif">
<h1>
-<?_("Users currently on ")><?SERV_HUMANNODE>
+<?_("Users currently on ")><?SERV:HUMANNODE>
</h1></div>
<ul class="room_actions">
<li class="start_page">
-<?_("Users currently on")> <?SERV_HUMANNODE>
+<?_("Users currently on")> <?SERV:HUMANNODE>
<tr class="<?ITERATE:ODDEVEN>">
<td class="edit_col">
-<??("COND:AIDE", 1)><??("COND:SUBST", 2, "WHO:ISME")>
+<??("COND:AIDE", 1)><??("WHO:ISME", 2)>
<a href="terminate_session?which_session=<?WHO:SESSION>&template=who" onClick="return ConfirmKill();"><?_("(kill)")></a>
<??("X", 2)><??("X", 1)>
-<?!("COND:SUBST", 3, "WHO:ISME")> <a href="edit_me">(<?_("edit")>)</a> <?!("X", 3)>
+<?!("WHO:ISME", 3)> <a href="edit_me">(<?_("edit")>)</a> <?!("X", 3)>
</td>
<!-- link to page this user -->
<td width="5%"><a href="display_page?recp=<?WHO:NAME("X")>">
</td>
<!-- idle flag -->
<td width="5%">
-<?!("COND:SUBST", 4, "WHO:IDLE")> <img align="middle" src="static/inactiveuser_24x.gif" alt="(<?_("idle since")>s <?WHO:IDLESINCE> <?_("Minutes")>)" border="0" /> <?!("X", 4)>
-<??("COND:SUBST", 5, "WHO:IDLE")> <img align="middle" src="static/activeuser_24x.gif" alt="(<?_("active")>)" border="0" /> <?!("X", 5)>
+<?!("WHO:IDLE", 4)> <img align="middle" src="static/inactiveuser_24x.gif" alt="(<?_("idle since")>s <?WHO:IDLESINCE> <?_("Minutes")>)" border="0" /> <?!("X", 4)>
+<??("WHO:IDLE", 5)> <img align="middle" src="static/activeuser_24x.gif" alt="(<?_("active")>)" border="0" /> <?!("X", 5)>
</td>
<td>
<!-- username (link to user bio/photo page) -->
<a href="showuser?who=<?WHO:NAME("U")>"> <?WHO:NAME("U")></a>
-<??("COND:SUBST", 6, "WHO:NSESSIONS", 1)>[<?WHO:NSESSIONS>] </a><?!("X", 6)>
+<??("WHO:NSESSIONS", 6, 1)>[<?WHO:NSESSIONS>] </a><?!("X", 6)>
<!-- room -->
</td><td>
<?WHO:ROOM>
-<?!("WHO:REALROOM", 7> <br /><i> <?WHO:REALROOM("X")> </i> <?!("X", 7)>
+<?!("WHO:REALROOM", 7)> <br /><i> <?WHO:REALROOM("X")> </i> <?!("X", 7)>
</td>
<td class="host_col">
<!-- hostname -->
-<li class="<??("COND:SUBST", 4, "WHO:IDLE")>activeuser<?!("X", 4)><?!("COND:SUBST", 5, "WHO:IDLE")>inactiveuser<?!("X", 5)>"><a href='showuser?who=<?WHO:NAME("U")>'><?WHO:NAME("U")></a></li>
+<li class="<??("WHO:IDLE", 4, )>activeuser<?!("X", 4)><?!("COND:SUBST", 5, "WHO:IDLE")>inactiveuser<?!("X", 5)>"><a href='showuser?who=<?WHO:NAME("U")>'><?WHO:NAME("U")></a></li>
<!-- room -->
</td><td>
<?WHO:ROOM>
-<?!("WHO:REALROOM", 7> <br /><i> <?WHO:REALROOM("X")> </i> <?!("X", 7)>
+<?!("WHO:REALROOM", 7)> <br /><i> <?WHO:REALROOM("X")> </i> <?!("X", 7)>
</td>
</tr>
HashList *GlobalNS;
HashList *Iterators;
-HashList *Contitionals;
+HashList *Conditionals;
int LoadTemplates = 0;
}
}
+
+/**
+ * \brief puts string into the template and computes which escape methon we should use
+ * \param Source the string we should put into the template
+ * \param FormatTypeIndex where should we look for escape types if?
+ */
+void StrBufAppendTemplate(StrBuf *Target,
+ int nArgs,
+ WCTemplateToken *Tokens,
+ void *Context, int ContextType,
+ StrBuf *Source, int FormatTypeIndex)
+{
+ char EscapeAs = ' ';
+
+
+
+ switch(EscapeAs)
+ {
+
+ case 'X':
+ StrEscAppend(Target, Source, NULL, 0, 0);
+ break;
+ default:
+ StrBufAppendBuf(Target, Source, 0);
+ }
+}
+
+
/**
* \brief Print the value of a variable
* \param keyname get a key to print
StrBufAppendPrintf(Target, "<pre>WARNING: \ninvalid value in SV-Hash at %s!\n</pre>", Token->pName);
}
}
- else
+ else {
lprintf(1, "didn't find Handler [%s] (in '%s' line %ld); "
" [%s]\n",
Token->pName,
ChrPtr(Token->FileName),
Token->Line,
ChrPtr(Token->FlatToken));
-
+ wc_backtrace();
+ }
}
int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup)
long Line,
WCTemplate *pTmpl)
{
+ void *vVar;
const char *pch;
TemplateParam *Param;
WCTemplateToken *NewToken = (WCTemplateToken*)malloc(sizeof(WCTemplateToken));
StrBufPeek(Buf, pch, -1, '\0');
NewToken->NameEnd = pch - NewToken->pName;
pch ++;
+ if (*(pTmplEnd - 1) != ')') {
+ lprintf(1, "Warning, Non welformed Token; missing right parenthesis (in '%s' line %ld); "
+ "[%s]\n",
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ ChrPtr(NewToken->FlatToken));
+ }
while (pch < pTmplEnd - 1) {
Param = GetNextParameter(Buf, &pch, pTmplEnd - 1, NewToken, pTmpl);
if (Param != NULL) {
(NewToken->HaveParameters == 1))
{
- if ((NewToken->nParameters == 1) &&
- (*(NewToken->pName) == '_'))
+ if (*(NewToken->pName) == '_')
NewToken->Flags = SV_GETTEXT;
- else if ((NewToken->nParameters == 1) &&
- (*(NewToken->pName) == '='))
+ else if (*(NewToken->pName) == '=')
NewToken->Flags = SV_SUBTEMPL;
- else if ((NewToken->nParameters >= 2) &&
- (*(NewToken->pName) == '%'))
+ else if (*(NewToken->pName) == '%')
NewToken->Flags = SV_CUST_STR_CONDITIONAL;
- else if ((NewToken->nParameters >= 2) &&
- (*(NewToken->pName) == '?'))
+ else if (*(NewToken->pName) == '?')
NewToken->Flags = SV_CONDITIONAL;
- else if ((NewToken->nParameters >=2) &&
- (*(NewToken->pName) == '!'))
+ else if (*(NewToken->pName) == '!')
NewToken->Flags = SV_NEG_CONDITIONAL;
}
}
else pch ++;
}
- if (NewToken->Flags == 0) {
+ switch (NewToken->Flags) {
+ case 0:
/* If we're able to find out more about the token, do it now while its fresh. */
- void *vVar;
if (GetHash(GlobalNS, NewToken->pName, NewToken->NameEnd, &vVar)) {
HashHandler *Handler;
Handler = (HashHandler*) vVar;
NewToken->PreEval = Handler;
NewToken->Flags = SV_PREEVALUATED;
}
- }
+ }
+ break;
+ case SV_GETTEXT:
+ if (NewToken->nParameters !=1) {
+ lprintf(1, "Gettext (in '%s' line %ld); "
+ "requires exactly 1 parameter, yau gave %ld params [%s]\n",
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ NewToken->nParameters,
+ ChrPtr(NewToken->FlatToken));
+ break;
+ }
+ break;
+ case SV_SUBTEMPL:
+ if (NewToken->nParameters != 1) {
+ lprintf(1, "Subtemplates (in '%s' line %ld); "
+ "require exactly 1 parameter, yau gave %ld params [%s]\n",
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ NewToken->nParameters,
+ ChrPtr(NewToken->FlatToken));
+ break;
+ }
+ break;
+ case SV_CUST_STR_CONDITIONAL:
+ case SV_CONDITIONAL:
+ case SV_NEG_CONDITIONAL:
+ if (NewToken->nParameters <2) {
+ lprintf(1, "Conditional (in '%s' line %ld); "
+ "require at least 2 parameters, yau gave %ld params [%s]\n",
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ NewToken->nParameters,
+ ChrPtr(NewToken->FlatToken));
+ break;
+ }
+ if (!GetHash(Conditionals,
+ NewToken->Params[0]->Start,
+ NewToken->Params[0]->len,
+ &vVar) ||
+ (vVar == NULL)) {
+ if ((NewToken->Params[0]->len == 1) &&
+ (NewToken->Params[0]->Start[0] == 'X'))
+ break;
+ lprintf(1, "Conditional [%s] (in '%s' line %ld); Not found![%s]\n",
+ NewToken->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ ChrPtr(NewToken->FlatToken));
+/*
+ NewToken->Error = NewStrBuf();
+ StrBufAppendPrintf(
+ NewToken->Error,
+ "<pre>\nConditional [%s] (in '%s' line %ld); Not found!\n[%s]\n</pre>\n",
+ NewToken->Params[0]->Start,
+ ChrPtr(pTmpl->FileName),
+ NewToken->Line,
+ ChrPtr(NewToken->FlatToken));
+*/
+ }
+ else {
+ NewToken->PreEval = vVar;
+ }
+ break;
}
-
return NewToken;
}
int EvaluateConditional(StrBuf *Target, WCTemplateToken *Token, WCTemplate *pTmpl, void *Context, int Neg, int state, int ContextType)
{
- void *vConditional = NULL;
ConditionalStruct *Cond;
if ((Token->Params[0]->len == 1) &&
(Token->Params[0]->Start[0] == 'X'))
return (state != 0)?Token->Params[1]->lvalue:0;
-
- if (!GetHash(Contitionals,
- Token->Params[0]->Start,
- Token->Params[0]->len,
- &vConditional) ||
- (vConditional == NULL)) {
- lprintf(1, "Conditional [%s] (in '%s' line %ld); Not found![%s]\n",
- Token->Params[0]->Start,
- ChrPtr(pTmpl->FileName),
- Token->Line,
- ChrPtr(Token->FlatToken));
- StrBufAppendPrintf(
- Target,
- "<pre>\nConditional [%s] (in '%s' line %ld); Not found!\n[%s]\n</pre>\n",
- Token->Params[0]->Start,
- ChrPtr(pTmpl->FileName),
- Token->Line,
- ChrPtr(Token->FlatToken));
- return 0;
- }
- Cond = (ConditionalStruct *) vConditional;
+ Cond = (ConditionalStruct *) Token->PreEval;
if (Token->nParameters < Cond->nParams) {
lprintf(1, "Conditional [%s] (in '%s' line %ld); needs %ld Params![%s]\n",
return 0;
}
+/**
+ * \brief executes one token
+ * \param Target buffer to append to
+ * \param Token da to process.
+ * \param Template we're iterating
+ * \param Context Contextpoointer to pass in
+ * \param state are we in conditional state?
+ * \param ContextType what type of information does context giv us?
+ */
int EvaluateToken(StrBuf *Target, WCTemplateToken *Token, WCTemplate *pTmpl, void *Context, int state, int ContextType)
{
HashHandler *Handler;
if (LoadTemplates > 1)
lprintf(1, "DBG: ----- loading: [%s] ------ \n",
ChrPtr(Tmpl->FileName));
+
pTmpl = load_template(Tmpl->FileName, NULL, NULL);
if(pTmpl == NULL) {
StrBufAppendPrintf(
*MinorPtr = '\0';
StrBufPlain(Tag, filedir_entry->d_name, MinorPtr - filedir_entry->d_name);
-
- lprintf(1, "%s %d %s\n",ChrPtr(FileName), IsMobile, ChrPtr(Tag));
+ if (LoadTemplates > 1)
+ lprintf(1, "%s %d %s\n",ChrPtr(FileName), IsMobile, ChrPtr(Tag));
if (LoadTemplates == 0)
load_template(FileName, Tag, (IsMobile)?wireless:big);
else
LocalTemplateCache);
}
-void tmplput_serv_ip(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrBufAppendPrintf(Target, "%d", WC->ctdl_pid);
-}
-
-void tmplput_serv_nodename(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, serv_info.serv_nodename, 0, 0);
-}
-
-void tmplput_serv_humannode(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, serv_info.serv_humannode, 0, 0);
-}
-
-void tmplput_serv_fqdn(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, serv_info.serv_fqdn, 0, 0);
-}
-
-void tmmplput_serv_software(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, serv_info.serv_software, 0, 0);
-}
-
-void tmplput_serv_rev_level(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrBufAppendPrintf(Target, "%d.%02d",
- serv_info.serv_rev_level / 100,
- serv_info.serv_rev_level % 100);
-}
-
-void tmmplput_serv_bbs_city(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, serv_info.serv_bbs_city, 0, 0);
-}
-
-void tmplput_current_user(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, WC->wc_fullname, 0, 0);
-}
-
-void tmplput_current_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
-{
- StrEscAppend(Target, NULL, WC->wc_roomname, 0, 0);
-}
typedef struct _HashIterator {
Cond->nParams = nParams;
Cond->CondF = CondF;
Cond->ContextRequired = ContextRequired;
- Put(Contitionals, Name, len, Cond, NULL);
+ Put(Conditionals, Name, len, Cond, NULL);
}
void tmpl_do_boxed(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType)
InitModule_SUBST
(void)
{
- RegisterNamespace("SERV:PID", 0, 0, tmplput_serv_ip, CTX_NONE);
- RegisterNamespace("SERV:NODENAME", 0, 0, tmplput_serv_nodename, CTX_NONE);
- RegisterNamespace("SERV:HUMANNODE", 0, 0, tmplput_serv_humannode, CTX_NONE);
- RegisterNamespace("SERV:FQDN", 0, 0, tmplput_serv_fqdn, CTX_NONE);
- RegisterNamespace("SERV:SOFTWARE", 0, 0, tmmplput_serv_software, CTX_NONE);
- RegisterNamespace("SERV:REV_LEVEL", 0, 0, tmplput_serv_rev_level, CTX_NONE);
- RegisterNamespace("SERV:BBS_CITY", 0, 0, tmmplput_serv_bbs_city, CTX_NONE);
-/// RegisterNamespace("SERV:LDAP_SUPP", 0, 0, tmmplput_serv_ldap_enabled, 0);
- RegisterNamespace("CURRENT_USER", 0, 0, tmplput_current_user, CTX_NONE);
- RegisterNamespace("CURRENT_ROOM", 0, 0, tmplput_current_room, CTX_NONE);
RegisterNamespace("ITERATE", 2, 100, tmpl_iterate_subtmpl, CTX_NONE);
RegisterNamespace("DOBOXED", 1, 2, tmpl_do_boxed, CTX_NONE);
RegisterNamespace("DOTABBED", 2, 100, tmpl_do_tabbed, CTX_NONE);
}
-void put_trailing_javascript(void) {
- wprintf("%s", ChrPtr(WC->trailing_javascript));
+void tmplput_trailing_javascript(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ struct wcsession *WCC = WC;
+ StrBufAppendBuf(WCC->WBuf, WCC->trailing_javascript, 0);
}
/*
{
if (print_standard_html_footer) {
wprintf("</div> <!-- end of 'content' div -->\n");
- svcallback("TRAILING_JAVASCRIPT", put_trailing_javascript);
do_template("trailing", NULL);
}
RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, CTX_NONE);
RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, CTX_NONE);
RegisterNamespace("OFFERSTARTPAGE", 0, 0, offer_start_page, CTX_NONE);
+ RegisterNamespace("TRAILING_JAVASCRIPT", 0, 0, tmplput_trailing_javascript, CTX_NONE);
}
int CompareSubstToToken(TemplateParam *ParamToCompare, TemplateParam *ParamToLookup);
int CompareSubstToStrBuf(StrBuf *Compare, TemplateParam *ParamToLookup);
+void StrBufAppendTemplate(StrBuf *Target,
+ int nArgs,
+ WCTemplateToken *Tokens,
+ void *Context, int ContextType,
+ StrBuf *Source, int FormatTypeIndex);
extern HashList *GlobalNS;
extern HashList *Iterators;
extern HashList *ZoneHash;
-extern HashList *Contitionals;
+extern HashList *Conditionals;
extern HashList *MsgHeaderHandler;
extern HashList *MimeRenderHandler;
TemplateCache = NewHash(1, NULL);
GlobalNS = NewHash(1, NULL);
Iterators = NewHash(1, NULL);
- Contitionals = NewHash(1, NULL);
+ Conditionals = NewHash(1, NULL);
MsgHeaderHandler = NewHash(1, NULL);
MimeRenderHandler = NewHash(1, NULL);
perror("chdir");
}
LoadIconDir(static_icon_dir);
- InitTemplateCache();
initialise_modules();
initialize_viewdefs();
initialize_axdefs();
+ InitTemplateCache();
+
if (!access("static.local/webcit.css", R_OK)) {
csslocal = NewStrBufPlain(HKEY("<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\">"));
}
DeleteHash(&LocalTemplateCache);
DeleteHash(&Iterators);
DeleteHash(&MimeRenderHandler);
- DeleteHash(&Contitionals);
+ DeleteHash(&Conditionals);
DeleteHash(&MsgHeaderHandler);
#ifdef ENABLE_NLS
ShutdownLocale();
long LastActive;
int Session;
int Idle;
+ int IdleSince;
int SessionCount;
} UserStateStruct;
User->LastActive = StrBufExtract_long(Buf, 5, '|');
User->Idle = (now - User->LastActive) > 900L;
+ User->IdleSince = (now - User->LastActive) / 60;
User->SessionCount = 1;
if (GetHash(List,
return 0;
}
-/*
- * Display inner div of Wholist
- * /
-void who_inner_div(void) {
- UserStateStruct *User;
- void *VUser;
- char buf[SIZ];
- struct wcsession *WCC = WC;
- HashList *List;
- HashPos *it;
- const char *UserName;
- long len;
- time_t now;
- int bg = 0;
- wprintf("<table class=\"altern\">"
- "<tr>\n");
- wprintf("<th class=\"edit_col\"> </th>\n");
- wprintf("<th colspan=\"2\"> </th>\n");
- wprintf("<th>%s</th>\n", _("User name"));
- wprintf("<th>%s</th>", _("Room"));
- wprintf("<th class=\"host_col\">%s</th>\n</tr>\n", _("From host"));
-
- serv_puts("TIME");
- serv_getln(buf, sizeof buf);
-
- if (buf[0] == '2') {
- now = extract_long(&buf[4], 0);
- }
- else {
- now = time(NULL);
- }
-
- List = NewHash(1, NULL);
-
- if (GetWholistSection(List, now)) {
- it = GetNewHashPos();
- while (GetNextHashPos(List, it, &len, &UserName, &VUser)) {
- User = VUser;
- bg = 1 - bg;
- wprintf("<tr class=\"%s\">",
- (bg ? "even" : "odd")
- );
-
-
- wprintf("<td class=\"edit_col\">");
- if ((WCC->is_aide) &&
- (User->Session != WCC->ctdl_pid)) {
- wprintf(" <a href=\"terminate_session?which_session=%d", User->Session);
- wprintf("\" onClick=\"return ConfirmKill();\">%s</a>", _("(kill)"));
- }
- if (User->Session == WCC->ctdl_pid) {
- wprintf(" <a href=\"edit_me\">%s</a>", _("(edit)"));
- }
- wprintf("</td>");
-
- / * (link to page this user) * /
- wprintf("<td width=\"5%%\"><a href=\"display_page?recp=");
- UrlescPutStrBuf(User->UserName);
- wprintf("\">"
- "<img align=\"middle\" "
- "src=\"static/citadelchat_24x.gif\" "
- "alt=\"(p)\""
- " border=\"0\" /></a> ");
- wprintf("</td>");
-
- / * (idle flag) * /
- wprintf("<td width=\"5%%\">");
- if (User->Idle) {
- wprintf(" "
- "<img align=\"middle\" "
- "src=\"static/inactiveuser_24x.gif\" "
- "alt=\"(%s %ld %s)\" border=\"0\" />",
- _("idle since"),
- (now - User->LastActive) / 60,
- _("Minutes")
- );
-
- }
- else {
- wprintf(" "
- "<img align=\"middle\" "
- "src=\"static/activeuser_24x.gif\" "
- "alt=\"(active)\" border=\"0\" />");
- }
- wprintf("</td>\n<td>");
-
- / * username (link to user bio/photo page) * /
- wprintf("<a href=\"showuser?who=");
- UrlescPutStrBuf(User->UserName);
- wprintf("\">");
- StrEscPuts(User->UserName);
- if (User->SessionCount > 1)
- wprintf(" [%d] ", User->SessionCount);
- wprintf("</a>");
-
- / * room * /
- wprintf("</td>\n\t<td>");
- StrEscPuts(User->Room);
- if (StrLength(User->RealRoom) > 0) {
- wprintf("<br /><i>");
- StrEscPuts(User->RealRoom);
- wprintf("</i>");
- }
- wprintf("</td>\n\t<td class=\"host_col\">");
-
- / * hostname * /
- StrEscPuts(User->Host);
- if (StrLength(User->RealHost) > 0) {
- wprintf("<br /><i>");
- StrEscPuts(User->RealHost);
- wprintf("</i>");
- }
- wprintf("</td>\n</tr>");
- }
- DeleteHashPos(&it);
- }
- wprintf("</table>");
- DeleteHash(&List);
-}
-*/
-
-
-#if 0
-/*
- * Display a list of users currently logged in to the system
- * /
-void who(void)
-{
- char title[256];
-
- output_headers(1, 1, 2, 0, 0, 0);
-
- wprintf("<script type=\"text/javascript\">\n"
- "function ConfirmKill() { \n"
- "return confirm('%s');\n"
- "}\n"
- "</script>\n", _("Do you really want to kill this session?")
- );
-#endif
-
- wprintf("<div id=\"banner\">\n");
- wprintf("<div class=\"room_banner\">");
- wprintf("<img src=\"static/usermanag_48x.gif\">");
- wprintf("<h1>");
- snprintf(title, sizeof title, _("Users currently on %s"), serv_info.serv_humannode);
- escputs(title);
- wprintf("</h1></div>");
- wprintf("<ul class=\"room_actions\">\n");
- wprintf("<li class=\"start_page\">");
- offer_start_page();
- wprintf("</li></ul>");
- wprintf("</div>");
-
- wprintf("<div id=\"content\" class=\"fix_scrollbar_bug who_is_online\">\n");
- wprintf("<div class=\"box\">");
- wprintf("<div class=\"boxlabel\">");
- snprintf(title, sizeof title, _("Users currently on %s"), serv_info.serv_humannode);
- escputs(title);
- wprintf("</div>");
- wprintf("<div class=\"boxcontent\">");
- wprintf("<div id=\"who_inner\" >");
- who_inner_div();
- wprintf("</div>");
-
- wprintf("<div class=\"instructions\">");
- wprintf(_("Click on a name to read user info. Click on %s "
- "to send an instant message to that user."),
- "<img align=\"middle\" src=\"static/citadelchat_16x.gif\" alt=\"(p)\" border=\"0\">"
- );
- wprintf("</div></div>\n");
-
- / *
- * JavaScript to make the ajax refresh happen:
- * See http://www.sergiopereira.com/articles/prototype.js.html for info on Ajax.PeriodicalUpdater
- * It wants: 1. The div being updated
- * 2. The URL of the update source
- * 3. Other flags (such as the HTTP method and the refresh frequency)
- * /
- wprintf(
- "<script type=\"text/javascript\"> "
- " new Ajax.PeriodicalUpdater('who_inner', 'who_inner_html', "
- " { method: 'get', frequency: 30 } ); "
- "</script> \n"
- );
- wDumpContent(1);
-}
-*/
-#endif
-
/*
* end session
*/
}
}
-/*
- * Wholist section
- * /
-void wholist_section(void) {
- UserStateStruct *User;
- void *VUser;
- HashList *List;
- HashPos *it;
- const char *UserName;
- long len;
- char buf[SIZ];
- time_t now;
-
- serv_puts("TIME");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- now = extract_long(&buf[4], 0);
- }
- else {
- now = time(NULL);
- }
-
- List = NewHash(1, NULL);
-
- if (GetWholistSection(List, now)) {
- SortByPayload(List, CompareUserStruct);
- it = GetNewHashPos();
- while (GetNextHashPos(List, it, &len, &UserName, &VUser)) {
- User = VUser;
- if (strcmp(ChrPtr(User->UserName), NLI)) {
- wprintf("<li class=\"");
- if (User->Idle) {
- wprintf("inactiveuser");
- }
- else {
- wprintf("activeuser");
- }
- wprintf("\"><a href=\"showuser?who=");
- UrlescPutStrBuf(User->UserName);
- wprintf("\">");
- StrEscPuts(User->UserName);
- wprintf("</a></li>");
- }
- }
- DeleteHashPos(&it);
- }
- DeleteHash(&List);
-}
-*/
-
void _terminate_session(void) {
slrp_highest();
terminate_session();
return List;
}
-void WholistSubst(StrBuf *TemplBuffer, void *vContext, WCTemplateToken *Token)
+
+void DeleteWholistHash(HashList **KillMe)
+{
+ DeleteHash(KillMe);
+}
+
+void tmplput_who_username(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
{
UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->UserName, 0);
+}
- SVPutBuf("WHO:NAME", User->UserName, 1);
- SVPutBuf("WHO:ROOM", User->Room, 1);
- SVPutBuf("WHO:HOST", User->Host, 1);
- SVPutBuf("WHO:REALROOM", User->RealRoom, 1);
- SVPutBuf("WHO:REALHOST", User->RealHost, 1);
- svputlong("WHO:LASTACTIVE", User->LastActive);
- ///svputlong("WHO:IDLESINCE",(now - User->LastActive) / 60);//// todo
- svputlong("WHO:SESSION", User->Session);
- svputlong("WHO:IDLE", User->Idle);
- svputlong("WHO:NSESSIONS", User->SessionCount);
- svputlong("WHO:ISME", (User->Session == WC->ctdl_pid));
+void tmplput_who_room(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Room, 0);
}
-void DeleteWholistHash(HashList **KillMe)
+void tmplput_who_host(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
{
- DeleteHash(KillMe);
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->Host, 0);
+}
+
+void tmplput_who_realroom(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealRoom, 0);
+}
+int conditional_who_realroom(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return StrLength(User->RealRoom) > 0;
+}
+
+void tmplput_who_realhost(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendTemplate(Target, nArgs, Tokens, vContext, ContextType, User->RealHost, 0);
+}
+
+void tmplput_who_lastactive(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->LastActive);
+}
+
+void tmplput_who_idlesince(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->IdleSince);
+}
+
+void tmplput_who_session(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->Session);
+}
+
+int conditional_who_idle(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return User->Idle;
+}
+
+int conditional_who_nsessions(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return User->SessionCount;
+}
+
+void tmplput_who_nsessions(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ StrBufAppendPrintf(Target, "%d", User->SessionCount);
+}
+
+int conditional_who_isme(WCTemplateToken *Tokens, void *vContext, int ContextType)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+ return (User->Session == WC->ctdl_pid);
}
void
InitModule_WHO
(void)
{
-/// WebcitAddUrlHandler(HKEY("who"), who, 0);
-// WebcitAddUrlHandler(HKEY("who_inner_html"), who_inner_div, AJAX);
-// WebcitAddUrlHandler(HKEY("wholist_section"), wholist_section, AJAX);
WebcitAddUrlHandler(HKEY("terminate_session"), _terminate_session, 0);
WebcitAddUrlHandler(HKEY("edit_me"), edit_me, 0);
- RegisterIterator("WHOLIST", 0, NULL, GetWholistHash, WholistSubst, DeleteWholistHash, CTX_WHO, CTX_NONE);
+ RegisterIterator("WHOLIST", 0, NULL, GetWholistHash, NULL, DeleteWholistHash, CTX_WHO, CTX_NONE);
+
+ RegisterNamespace("WHO:NAME", 0, 1, tmplput_who_username, CTX_WHO);
+ RegisterNamespace("WHO:ROOM", 0, 1, tmplput_who_room, CTX_WHO);
+ RegisterNamespace("WHO:HOST", 0, 1, tmplput_who_host, CTX_WHO);
+ RegisterNamespace("WHO:REALROOM", 0, 1, tmplput_who_realroom, CTX_WHO);
+ RegisterNamespace("WHO:REALHOST", 0, 1, tmplput_who_realhost, CTX_WHO);
+ RegisterNamespace("WHO:LASTACTIVE", 0, 1, tmplput_who_lastactive, CTX_WHO);
+ RegisterNamespace("WHO:IDLESINCE", 0, 1, tmplput_who_idlesince, CTX_WHO);
+ RegisterNamespace("WHO:SESSION", 0, 1, tmplput_who_session, CTX_WHO);
+ RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, CTX_WHO);
+ RegisterNamespace("WHO:NSESSIONS", 0, 1, tmplput_who_nsessions, CTX_WHO);
+
+ RegisterConditional(HKEY("WHO:IDLE"), 1, conditional_who_idle, CTX_WHO);
+ RegisterConditional(HKEY("WHO:NSESSIONS"), 1, conditional_who_nsessions, CTX_WHO);
+ RegisterConditional(HKEY("WHO:ISME"), 1, conditional_who_isme, CTX_WHO);
+ RegisterConditional(HKEY("WHO:REALROOM"), 1, conditional_who_realroom, CTX_WHO);
}