}
+void CfgZoneTempl(StrBuf *TemplBuffer, void *Context)
+{
+
+}
+
void
InitModule_PREFERENCES
RegisterNamespace("PREF:VALUE", 1, 1, tmplput_CFG_Value);
RegisterNamespace("PREF:DESCR", 1, 1, tmplput_CFG_Descr);
+ RegisterIterator("PREF:ZONE", ZoneHash, NULL, CfgZoneTempl, NULL);
}
/*@}*/
* \brief Read Citadel variformat text and spit it out as HTML.
* \param align html align string
*/
-void fmout(char *align)
+inline void fmout(char *align)
+{
+ _fmout(WC->WBuf, align);
+}
+
+void _fmout(StrBuf *Target, char *align)
{
int intext = 0;
int bq = 0;
char buf[SIZ];
- wprintf("<div align=%s>\n", align);
+ StrBufAppendPrintf(Target, "<div align=%s>\n", align);
while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
if ((intext == 1) && (isspace(buf[0]))) {
* " >" quotes and will convert to <BLOCKQUOTE> tags.
*/
if ((bq == 0) && (!strncmp(buf, " >", 2))) {
- wprintf("<BLOCKQUOTE>");
+ StrBufAppendBufPlain(Target, HKEY("<BLOCKQUOTE>"), 0);
bq = 1;
} else if ((bq == 1) && (strncmp(buf, " >", 2))) {
- wprintf("</BLOCKQUOTE>");
+ StrBufAppendBufPlain(Target, HKEY("</BLOCKQUOTE>"), 0);
bq = 0;
}
if ((bq == 1) && (!strncmp(buf, " >", 2))) {
/** Activate embedded URL's */
url(buf, sizeof(buf));
- escputs(buf);
- wprintf("\n");
+ escputs(buf);//// TODO: Target
+ StrBufAppendBufPlain(Target, HKEY("\n"), 0);
}
if (bq == 1) {
wprintf("</I>");
#include "webcit.h"
#include "webserver.h"
+
+HashList *ZoneHash = NULL;
+
+
+
+void LoadZoneFiles(void)
+{
+ icalarray *zones;
+ int z;
+ long len;
+ char this_zone[128];
+ char *ZName;
+ HashPos *it;
+
+ ZoneHash = NewHash(1, NULL);
+ len = sizeof("UTC") + 1;
+ ZName = malloc(len + 1);
+ memcpy(ZName, "UTC", len + 1);
+ Put(ZoneHash, ZName, len, ZName, NULL);
+ zones = icaltimezone_get_builtin_timezones();
+ for (z = 0; z < zones->num_elements; ++z) {
+ strcpy(this_zone, icaltimezone_get_location(icalarray_element_at(zones, z)));
+ len = strlen(this_zone);
+ ZName = (char*)malloc(len +1);
+ memcpy(ZName, this_zone, len + 1);
+ Put(ZoneHash, ZName, len, ZName, NULL);
+ }
+ SortByHashKey(ZoneHash, 0);
+}
+
+
+
+
/*
* \brief display all configuration items
*/
+void SVPUTBuf(const char *keyname, int keylen, StrBuf *Buf, int ref)
+{
+ wcsubst *ptr;
+ void *vPtr;
+ struct wcsession *WCC = WC;
+
+ /**
+ * First look if we're doing a replacement of
+ * an existing key
+ */
+ /*PrintHash(WCC->vars, VarPrintTransition, VarPrintEntry);*/
+ if (GetHash(WCC->vars, keyname, keylen, &vPtr)) {
+ ptr = (wcsubst*)vPtr;
+ if (ptr->wcs_value != NULL)
+ free(ptr->wcs_value);///TODO: respect type
+ }
+ else /** Otherwise allocate a new one */
+ {
+ ptr = (wcsubst *) malloc(sizeof(wcsubst));
+ safestrncpy(ptr->wcs_key, keyname, sizeof ptr->wcs_key);
+ Put(WCC->vars, keyname, keylen, ptr, deletevar);
+ }
+
+ ptr->wcs_value = NULL;
+ ptr->wcs_type = (ref)?WCS_STRBUF:WCS_STRBUF_REF;
+ ptr->wcs_function = (var_callback_fptr) Buf; ////TODO
+}
+
/**
* \brief back end for print_value_of() ... does a server command
* \param servcmd server command to execute on the citadel server
*/
-void pvo_do_cmd(char *servcmd) {
+void pvo_do_cmd(StrBuf *Target, char *servcmd) {
char buf[SIZ];
+ int len;
serv_puts(servcmd);
- serv_getln(buf, sizeof buf);
+ len = serv_getln(buf, sizeof buf);
switch(buf[0]) {
case '2':
case '3':
case '5':
- wprintf("%s\n", &buf[4]);
+ StrBufAppendPrintf(Target, "%s\n", &buf[4]);
break;
case '1':
- fmout("CENTER");
+ _fmout(Target, "CENTER");
break;
case '4':
- wprintf("%s\n", &buf[4]);
+ StrBufAppendPrintf(Target, "%s\n", &buf[4]);
serv_puts("000");
break;
}
* \brief Print the value of a variable
* \param keyname get a key to print
*/
-void print_value_of(const char *keyname, size_t keylen) {
+void print_value_of(StrBuf *Target, const char *keyname, size_t keylen) {
struct wcsession *WCC = WC;
wcsubst *ptr;
void *fcn();
ptr = (wcsubst*) vVar;
switch(ptr->wcs_type) {
case WCS_STRING:
- wprintf("%s", (const char*)ptr->wcs_value);
+ StrBufAppendBufPlain(Target, (const char*)ptr->wcs_value, -1, 0);
break;
case WCS_SERVCMD:
- pvo_do_cmd(ptr->wcs_value);
+ pvo_do_cmd(Target, ptr->wcs_value);
break;
case WCS_FUNCTION:
(*ptr->wcs_function) ();
break;
+ case WCS_STRBUF:
+ case WCS_STRBUF_REF:
+ StrBufAppendBuf(Target, (StrBuf*) ptr->wcs_function, 0);
+ break;
default:
lprintf(1,"WARNING: invalid value in SV-Hash at %s!", keyname);
}
}
else {
StrBufPeek(Buf, pch, -1, '\0');
+ lprintf(1, "DBG: got param [%s]\n", pchs);
Parm->Start = pchs;
Parm->len = pche - pchs;
pch ++; /* move after trailing quote */
}
else {
Parm->lvalue = 0;
- lprintf(1, "Error evalating template long param [%s]", *pCh);
+ lprintf(1, "Error evaluating template long param [%s]", *pCh);
free(Parm);
return NULL;
}
while ((*pch == ' ' )||
(*pch == '\t')||
(*pch == '\r')||
+ (*pch == ',' )||
(*pch == '\n')) pch ++;
*pCh = pch;
NewToken->HaveParameters = 0;;
NewToken->nParameters = 0;
- while (pch <= pTmplEnd - 1) {
+ while (pch < pTmplEnd - 1) {
if (*pch == '(') {
StrBufPeek(Buf, pch, -1, '\0');
NewToken->NameEnd = pch - NewToken->pName;
pch ++;
- while (pch <= pTmplEnd - 1) {
+ while (pch < pTmplEnd - 1) {
Param = GetNextParamter(Buf, &pch, pTmplEnd - 1);
if (Param != NULL) {
NewToken->HaveParameters = 1;
HashHandler *Handler;
Handler = (HashHandler*) vVar;
if ((Token->nParameters < Handler->nMinArgs) ||
- (Token->nParameters < Handler->nMaxArgs)) {
+ (Token->nParameters > Handler->nMaxArgs)) {
lprintf(1, "Handler [%s] doesn't work with %ld params",
Token->pName,
Token->nParameters);
}
}
else {
- print_value_of(Token->pName, Token->NameEnd);
+ print_value_of(Target, Token->pName, Token->NameEnd);
}
}
i = 0;
while (!done) {
if (i >= Tmpl->nTokensUsed) {
- StrBufAppendBufPlain(Target, pData, len, 0);
+ StrBufAppendBufPlain(Target,
+ pData,
+ len - (pData - pS), 0);
done = 1;
}
else {
HashList *Static;
HashList *StaticLocal;
void *vTmpl;
-
+
+ if (Target == NULL)
+ Target = WC->WBuf;
if (WC->is_mobile) {
Static = WirelessTemplateCache;
StaticLocal = WirelessLocalTemplateCache;
}
if (vTmpl == NULL)
return;
- ProcessTemplate(vTmpl, WC->WBuf, Context);
+ ProcessTemplate(vTmpl, Target, Context);
}
int LoadTemplateDir(const char *DirName, HashList *wireless, HashList *big)
it = GetNewHashPos();
while (GetNextHashPos(List, it, &len, &Key, &vContext)) {
It->DoSubTemplate(SubBuf, vContext);
- DoTemplate(Tokens->Params[0]->Start,
- Tokens->Params[0]->len,
+ DoTemplate(Tokens->Params[1]->Start,
+ Tokens->Params[1]->len,
vContext, SubBuf);
StrBufAppendBuf(Target, SubBuf, 0);
* A template has been requested
*/
void url_do_template(void) {
- do_template(bstr("template"), NULL);
+ const StrBuf *Tmpl = sbstr("template");
+ begin_burst();
+ DoTemplate(ChrPtr(Tmpl), StrLength(Tmpl), NULL, NULL);
+ end_burst();
}
BuffSize = ContentLength + SIZ;
content = malloc(BuffSize);
memset(content, 0, BuffSize);
- snprintf(content, BuffSize, "Content-type: %s\n"
- "Content-length: %d\n\n",
- ContentType, ContentLength);
+ hprintf("Content-type: %s\n"
+ "Content-length: %d\n\n",
+ ContentType, ContentLength);
body_start = strlen(content);
/** Read the entire input data at once. */
RetrieveHashlistFunc GetHash,
SubTemplFunc DoSubTempl,
HashDestructorFunc Destructor);
-#define RegisterIterator(a, b, c, d) RegisterITERATOR(a, sizeof(a)-1, b, c, d)
+#define RegisterIterator(a, b, c, d, e) RegisterITERATOR(a, sizeof(a)-1, b, c, d, e)
/**
* \brief Values for wcs_type
*/
enum {
- WCS_STRING, /**< its a string */
- WCS_FUNCTION, /**< its a function callback */
- WCS_SERVCMD /**< its a command to send to the citadel server */
+ WCS_STRING, /**< its a string */
+ WCS_FUNCTION, /**< its a function callback */
+ WCS_SERVCMD, /**< its a command to send to the citadel server */
+ WCS_STRBUF, /**< its a strbuf we own */
+ WCS_STRBUF_REF /**< its a strbuf we mustn't free */
};
/**
extern HashList *LocalTemplateCache;
extern HashList *GlobalNS;
extern HashList *Iterators;
+extern HashList *ZoneHash;
+
+
void InitialiseSemaphores(void);
void begin_critical_section(int which_one);
void who_inner_div(void);
void ajax_mini_calendar(void);
void fmout(char *align);
+void _fmout(StrBuf *Targt, char *align);
void pullquote_fmout(void);
void wDumpContent(int);
void SVCallback(char *keyname, size_t keylen, var_callback_fptr fcn_ptr);
#define svcallback(a, b) SVCallback(a, sizeof(a) - 1, b)
+void SVPUTBuf(const char *keyname, int keylen, StrBuf *Buf, int ref);
+#define SVPutBuf(a, b, c); SVPUTBuf(a, sizeof(a) - 1, b, c)
+
void DoTemplate(const char *templatename, long len, void *Context, StrBuf *Target);
#define do_template(a, b) DoTemplate(a, sizeof(a) -1, b, NULL);
#endif
void InitTemplateCache(void);
+extern void LoadZoneFiles(void);
/*
* \brief Here's where it all begins.
* \param argc number of commandline args
TemplateCache = NewHash(1, NULL);
GlobalNS = NewHash(1, NULL);
Iterators = NewHash(1, NULL);
+ LoadZoneFiles();
#ifdef DBG_PRINNT_HOOKS_AT_START
#include "webcit.h"
typedef struct UserStateStruct {
- char *UserName;
- long UserNameLen;
- char *Room;
- long RoomLen;
- char *Host;
- long HostLen;
- char *RealRoom;
- long RealRoomLen;
- char *RealHost;
- long RealHostLen;
+ StrBuf *UserName;
+ StrBuf *Room;
+ StrBuf *Host;
+ StrBuf *RealRoom;
+ StrBuf *RealHost;
long LastActive;
int Session;
int Idle;
void DestroyUserStruct(void *vUser)
{
UserStateStruct *User = (UserStateStruct*) vUser;
- free(User->UserName);
- free(User->Room);
- free(User->Host);
- free(User->RealRoom);
- free(User->RealHost);
+ FreeStrBuf(&User->UserName);
+ FreeStrBuf(&User->Room);
+ FreeStrBuf(&User->Host);
+ FreeStrBuf(&User->RealRoom);
+ FreeStrBuf(&User->RealHost);
free(User);
}
if (User1->Idle != User2->Idle)
return User1->Idle > User2->Idle;
- return strcasecmp(User1->UserName, User2->UserName);
+ return strcasecmp(ChrPtr(User1->UserName),
+ ChrPtr(User2->UserName));
}
int GetWholistSection(HashList *List, time_t now)
{
+ StrBuf *Buf, *XBuf;
struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */
UserStateStruct *User, *OldUser;
void *VOldUser;
- char buf[SIZ], user[SIZ], room[SIZ], host[SIZ],
- realroom[SIZ], realhost[SIZ];
size_t BufLen;
+ char buf[SIZ];
serv_puts("RWHO");
serv_getln(buf, sizeof buf);
if (buf[0] == '1') {
- while (BufLen = serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+ Buf = NewStrBuf();
+ XBuf = NewStrBuf();
+ while (BufLen = StrBuf_ServGetln(Buf), strcmp(ChrPtr(Buf), "000")) {
if (BufLen <= 0)
continue;
User = (UserStateStruct*) malloc(sizeof(UserStateStruct));
- User->Session = extract_int(buf, 0);
+ User->Session = StrBufExtract_int(Buf, 0, '|');
- User->UserNameLen = extract_token(user, buf, 1, '|', sizeof user);
- User->UserName = malloc(User->UserNameLen + 1);
- memcpy(User->UserName, user, User->UserNameLen + 1);
+ StrBufExtract_token(XBuf, Buf, 1, '|');
+ User->UserName = NewStrBufDup(XBuf);
- User->RoomLen = extract_token(room, buf, 2, '|', sizeof room);
- User->Room = malloc(User->RoomLen + 1);
- memcpy(User->Room, room, User->RoomLen + 1);
+ StrBufExtract_token(XBuf, Buf, 2, '|');
+ User->Room = NewStrBufDup(XBuf);
- User->HostLen = extract_token(host, buf, 3, '|', sizeof host);
- User->Host = malloc(User->HostLen + 1);
- memcpy(User->Host, host, User->HostLen + 1);
+ StrBufExtract_token(XBuf, Buf, 3, '|');
+ User->Host = NewStrBufDup(XBuf);
- User->RealRoomLen = extract_token(realroom, buf, 9, '|', sizeof realroom);
- User->RealRoom = malloc(User->RealRoomLen + 1);
- memcpy(User->RealRoom, realroom, User->RealRoomLen + 1);
+ StrBufExtract_token(XBuf, Buf, 9, '|');
+ User->RealRoom = NewStrBufDup(XBuf);
- User->RealHostLen = extract_token(realhost, buf, 10, '|', sizeof realhost);
- User->RealHost = malloc(User->RealHostLen + 1);
- memcpy(User->RealHost, realhost, User->RealHostLen + 1);
+ StrBufExtract_token(XBuf, Buf, 10, '|');
+ User->RealHost = NewStrBufDup(XBuf);
- User->LastActive = extract_long(buf, 5);
+ User->LastActive = StrBufExtract_long(Buf, 5, '|');
User->Idle = (now - User->LastActive) > 900L;
User->SessionCount = 1;
- if (GetHash(List, User->UserName, User->UserNameLen, &VOldUser)) {
+ if (GetHash(List,
+ ChrPtr(User->UserName),
+ StrLength(User->UserName),
+ &VOldUser)) {
OldUser = VOldUser;
OldUser->SessionCount++;
if (!User->Idle) {
DestroyUserStruct(User);
}
else
- Put(List, User->UserName, User->UserNameLen, User, DestroyUserStruct);
+ Put(List,
+ ChrPtr(User->UserName),
+ StrLength(User->UserName),
+ User, DestroyUserStruct);
}
SortByPayload(List, CompareUserStruct);
+
+ FreeStrBuf(&XBuf);
+ FreeStrBuf(&Buf);
return 1;
}
else
/* (link to page this user) */
wprintf("<td width=\"5%%\"><a href=\"display_page?recp=");
- urlescputs(User->UserName);
+ urlescputs(ChrPtr(User->UserName));
wprintf("\">"
"<img align=\"middle\" "
"src=\"static/citadelchat_24x.gif\" "
/* username (link to user bio/photo page) */
wprintf("<a href=\"showuser?who=");
- urlescputs(User->UserName);
+ urlescputs(ChrPtr(User->UserName));
wprintf("\">");
- escputs(User->UserName);
+ escputs(ChrPtr(User->UserName));
if (User->SessionCount > 1)
wprintf(" [%d] ", User->SessionCount);
wprintf("</a>");
/* room */
wprintf("</td>\n\t<td>");
- escputs(User->Room);
- if (!IsEmptyStr(User->RealRoom) ) {
+ escputs(ChrPtr(User->Room));
+ if (StrLength(User->RealRoom) > 0) {
wprintf("<br /><i>");
escputs(User->RealRoom);
wprintf("</i>");
wprintf("</td>\n\t<td class=\"host_col\">");
/* hostname */
- escputs(User->Host);
- if (!IsEmptyStr(User->RealHost)) {
+ escputs(ChrPtr(User->Host));
+ if (StrLength(User->RealHost) > 0) {
wprintf("<br /><i>");
escputs(User->RealHost);
wprintf("</i>");
it = GetNewHashPos();
while (GetNextHashPos(List, it, &len, &UserName, &VUser)) {
User = VUser;
- if (strcmp(User->UserName, NLI)) {
+ if (strcmp(ChrPtr(User->UserName), NLI)) {
wprintf("<li class=\"");
if (User->Idle) {
wprintf("inactiveuser");
wprintf("activeuser");
}
wprintf("\"><a href=\"showuser?who=");
- urlescputs(User->UserName);
+ urlescputs(ChrPtr(User->UserName));
wprintf("\">");
- escputs(User->UserName);
+ escputs(ChrPtr(User->UserName));
wprintf("</a></li>");
}
}
terminate_session();
}
+HashList *GetWholistHash(void)
+{
+ HashList *List;
+ 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);
+ GetWholistSection(List, now);
+ return List;
+}
+
+void WholistSubst(StrBuf *TemplBuffer, void *vContext)
+{
+ UserStateStruct *User = (UserStateStruct*) vContext;
+
+ 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);
+ svprintf(HKEY("WHO:LASTACTIVE"), WCS_STRING, "%ld", User->LastActive);
+ svprintf(HKEY("WHO:SESSION"), WCS_STRING, "%d", User->Session);
+ svprintf(HKEY("WHO:IDLE"), WCS_STRING, "%s", (User->Idle)? "Idle":"Active");
+ svprintf(HKEY("WHO:NSESSIONS"), WCS_STRING, "%d", User->SessionCount);
+
+}
+
+void DeleteWholistHash(HashList *KillMe)
+{
+ DeleteHash(&KillMe);
+}
+
void
InitModule_WHO
(void)
WebcitAddUrlHandler(HKEY("wholist_section"), wholist_section, AJAX);
WebcitAddUrlHandler(HKEY("terminate_session"), _terminate_session, 0);
WebcitAddUrlHandler(HKEY("edit_me"), edit_me, 0);
+
+ RegisterIterator("WHOLIST", NULL, GetWholistHash, WholistSubst, DeleteWholistHash);
}