/*
* $Id$
*/
-/**
- * \defgroup DislpayWho Display a list of all users currently logged on to the Citadel server.
- * \ingroup WebcitDisplayItems
- */
-/*@{*/
-#include "webcit.h"
+#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
return 0;
}
-/**
- * \brief Display inner div of Wholist
- */
+/*
+ * Display inner div of Wholist
+ * /
void who_inner_div(void) {
UserStateStruct *User;
void *VUser;
char buf[SIZ];
- struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */
+ struct wcsession *WCC = WC;
HashList *List;
HashPos *it;
- char *UserName;
+ const char *UserName;
long len;
time_t now;
int bg = 0;
-
wprintf("<table class=\"altern\">"
"<tr>\n");
wprintf("<th class=\"edit_col\"> </th>\n");
now = time(NULL);
}
- List = NewHash();
+ List = NewHash(1, NULL);
if (GetWholistSection(List, now)) {
it = GetNewHashPos();
}
wprintf("</td>");
- /** (link to page this user) */
- wprintf("<td width=\"5%\"><a href=\"display_page?recp=");
- urlescputs(User->UserName);
+ / * (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\" "
" border=\"0\" /></a> ");
wprintf("</td>");
- /** (idle flag) */
- wprintf("<td width=\"5%\">");
+ / * (idle flag) * /
+ wprintf("<td width=\"5%%\">");
if (User->Idle) {
wprintf(" "
"<img align=\"middle\" "
"src=\"static/inactiveuser_24x.gif\" "
- "alt=\"(%s %d %s)\" border=\"0\" />",
+ "alt=\"(%s %ld %s)\" border=\"0\" />",
_("idle since"),
(now - User->LastActive) / 60,
_("Minutes")
}
wprintf("</td>\n<td>");
- /** username (link to user bio/photo page) */
+ / * username (link to user bio/photo page) * /
wprintf("<a href=\"showuser?who=");
- urlescputs(User->UserName);
+ UrlescPutStrBuf(User->UserName);
wprintf("\">");
- escputs(User->UserName);
+ StrEscPuts(User->UserName);
if (User->SessionCount > 1)
wprintf(" [%d] ", User->SessionCount);
wprintf("</a>");
- /** room */
+ / * room * /
wprintf("</td>\n\t<td>");
- escputs(User->Room);
- if (!IsEmptyStr(User->RealRoom) ) {
+ StrEscPuts(User->Room);
+ if (StrLength(User->RealRoom) > 0) {
wprintf("<br /><i>");
- escputs(User->RealRoom);
+ StrEscPuts(User->RealRoom);
wprintf("</i>");
}
wprintf("</td>\n\t<td class=\"host_col\">");
- /** hostname */
- escputs(User->Host);
- if (!IsEmptyStr(User->RealHost)) {
+ / * hostname * /
+ StrEscPuts(User->Host);
+ if (StrLength(User->RealHost) > 0) {
wprintf("<br /><i>");
- escputs(User->RealHost);
+ StrEscPuts(User->RealHost);
wprintf("</i>");
}
wprintf("</td>\n</tr>");
}
wprintf("</table>");
DeleteHash(&List);
-
}
+*/
-/**
- * \brief who is on?
- */
+/*
+ * Display a list of users currently logged in to the system
+ * /
void who(void)
{
char title[256];
);
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', "
);
wDumpContent(1);
}
+*/
-/**
- * \brief end session \todo what??? does this belong here?
+/*
+ * end session
*/
void terminate_session(void)
{
serv_printf("TERM %s", bstr("which_session"));
serv_getln(buf, sizeof buf);
- who();
+ ///who();
+ url_do_template();
}
-/**
- * \brief Change your session info (fake roomname and hostname)
+/*
+ * Change your session info (fake roomname and hostname)
*/
void edit_me(void)
{
wprintf("<br />\n");
wprintf("<form method=\"POST\" action=\"edit_me\">\n");
- wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%ld\">\n", WC->nonce);
+ wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
wprintf("<table border=0 width=100%%>\n");
}
}
-/**
- * \brief Wholist section
- */
+/*
+ * Wholist section
+ * /
void wholist_section(void) {
UserStateStruct *User;
void *VUser;
HashList *List;
HashPos *it;
- char *UserName;
+ const char *UserName;
long len;
char buf[SIZ];
time_t now;
now = time(NULL);
}
- List = NewHash();
+ List = NewHash(1, NULL);
if (GetWholistSection(List, now)) {
SortByPayload(List, CompareUserStruct);
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);
+ UrlescPutStrBuf(User->UserName);
wprintf("\">");
- escputs(User->UserName);
+ StrEscPuts(User->UserName);
wprintf("</a></li>");
}
}
}
DeleteHash(&List);
}
+*/
+void _terminate_session(void) {
+ slrp_highest();
+ terminate_session();
+}
+HashList *GetWholistHash(WCTemplateToken *Token)
+{
+ 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, WCTemplateToken *Token)
+{
+ 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);
+ 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 DeleteWholistHash(HashList **KillMe)
+{
+ DeleteHash(KillMe);
+}
+
+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);
+}