char floorlist[MAX_FLOORS][SIZ]; /* list of our floor names */
-char *viewdefs[9]; /* the different kinds of available views */
-
/* See GetFloorListHash and GetRoomListHash for info on these.
* Basically we pull LFLR/LKRA etc. and set up a room HashList with these keys.
*/
void display_whok(void);
int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP);
+
+char *viewdefs[VIEW_MAX]; /* the different kinds of available views */
+
+ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = { /* the different kinds of available views for a view */
+{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_ADDRESSBOOK, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX /*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_TASKS, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_NOTES, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_WIKI, VIEW_MAX, VIEW_MAX, VIEW_MAX},
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX/*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX},
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_JOURNAL, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_BLOG },
+ };
+/* the brief calendar view is disabled: VIEW_CALBRIEF */
+
/*
* Initialize the viewdefs with localized strings
*/
void initialize_viewdefs(void) {
- viewdefs[0] = _("Bulletin Board");
- viewdefs[1] = _("Mail Folder");
- viewdefs[2] = _("Address Book");
- viewdefs[3] = _("Calendar");
- viewdefs[4] = _("Task List");
- viewdefs[5] = _("Notes List");
- viewdefs[6] = _("Wiki");
- viewdefs[7] = _("Calendar List");
- viewdefs[8] = _("Journal");
+ viewdefs[VIEW_BBS] = _("Bulletin Board");
+ viewdefs[VIEW_MAILBOX] = _("Mail Folder");
+ viewdefs[VIEW_ADDRESSBOOK] = _("Address Book");
+ viewdefs[VIEW_CALENDAR] = _("Calendar");
+ viewdefs[VIEW_TASKS] = _("Task List");
+ viewdefs[VIEW_NOTES] = _("Notes List");
+ viewdefs[VIEW_WIKI] = _("Wiki");
+ viewdefs[VIEW_CALBRIEF] = _("Calendar List");
+ viewdefs[VIEW_JOURNAL] = _("Journal");
+ viewdefs[VIEW_BLOG] = _("Blog");
}
/*
wDumpContent(1);
}
-
-/*
- * read this room's info file (set v to 1 for verbose mode)
- */
-void readinfo(StrBuf *Target, WCTemplputParams *TP)
-{
- char buf[256];
- char briefinfo[128];
- char fullinfo[8192];
- int fullinfo_len = 0;
-
- serv_puts("RINF");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '1') {
-
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- if (fullinfo_len < (sizeof fullinfo - sizeof buf)) {
- strcpy(&fullinfo[fullinfo_len], buf);
- fullinfo_len += strlen(buf);
- }
- }
-
- safestrncpy(briefinfo, fullinfo, sizeof briefinfo);
- strcpy(&briefinfo[50], "...");
-
- wc_printf("<div class=\"infos\" "
- "onclick=\"javascript:Effect.Appear('room_infos', { duration: 0.5 });\" "
- ">"
- );
- escputs(briefinfo);
- wc_printf("</div><div id=\"room_infos\" style=\"display:none;\">");
- wc_printf("<img class=\"close_infos\" "
- "onclick=\"javascript:Effect.Fade('room_infos', { duration: 0.5 });\" "
- "src=\"static/closewindow.gif\" alt=\"%s\" width=\"16\" height=\"16\">",
- _("Close window")
- );
- escputs(fullinfo);
- wc_printf("</div>");
- }
- else {
- wc_printf(" ");
- }
-}
-
-
-
-
-/*
- * Display room banner icon.
- * The server doesn't actually need the room name, but we supply it in
- * order to keep the browser from using a cached icon from another room.
- */
-void embed_room_graphic(StrBuf *Target, WCTemplputParams *TP)
-{
- char buf[SIZ];
-
- serv_puts("OIMG _roompic_");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- wc_printf("<img height=\"64px\" src=\"image?name=_roompic_&room=");
- urlescputs(ChrPtr(WC->CurRoom.name));
- wc_printf("\">");
- serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
- }
- else if (WC->CurRoom.view == VIEW_ADDRESSBOOK) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/viewcontacts_48x.gif"
- "\" >"
- );
- }
- else if ( (WC->CurRoom.view == VIEW_CALENDAR) || (WC->CurRoom.view == VIEW_CALBRIEF) ) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/calarea_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_TASKS) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/taskmanag_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_NOTES) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/storenotes_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_MAILBOX) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/privatemess_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/chatrooms_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
-
-}
-
-
-
/*
* Display the current view and offer an option to change it
*/
}
-/*
- * Display a search box
- */
-void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP)
-{
- wc_printf("<form name=\"searchomatic\" action=\"do_search\">\n");
- wc_printf("<div style=\"display: inline;\"><input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
- wc_printf("<label for=\"srchquery\">");
- wc_printf(_("Search: "));
- wc_printf("</label><input ");
- wc_printf("%s", WC->serv_info->serv_fulltext_enabled ? "" : "disabled ");
- wc_printf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" class=\"inputbox\">\n"
- );
- wc_printf("</div></form>\n");
-}
-
/*
* Embed the room banner
extract_int(&got[4], 2),
with_files
);
- svcallback("ROOMPIC", embed_room_graphic);
- svcallback("ROOMINFO", readinfo);
svcallback("VIEWOMATIC", embed_view_o_matic);
- svcallback("SEARCHOMATIC", embed_search_o_matic);
- svcallback("START", offer_start_page);
do_template("roombanner", NULL);
/* roombanner contains this for mobile */
}
/* get a pointer to the floor we're on: */
+ if (WCC->Floors == NULL)
+ GetFloorListHash(NULL, NULL);
+
GetHash(WCC->Floors, IKEY(room->floorid), &vFloor);
room->Floor = (const Floor*) vFloor;
}
}
FreeStrBuf (&Buf);
}
+void tmplput_CurrentRoomFloorName(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ folder *Folder = &WCC->CurRoom;
+ const Floor *pFloor = Folder->Floor;
+
+ if (pFloor == NULL)
+ return;
+
+ StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+}
void tmplput_CurrentRoomAide(StrBuf *Target, WCTemplputParams *TP)
{
StrBufExtract_NextToken(WCC->CurRoom.Directory, Buf, &Pos, '|');
StrBufSkip_NTokenS(Buf, &Pos, '|', 2); /* QRFlags, FloorNum we already know... */
WCC->CurRoom.Order = StrBufExtractNext_long(Buf, &Pos, '|');
- WCC->CurRoom.DefView = StrBufExtractNext_long(Buf, &Pos, '|');
+ /* defview, we already know you. */
/* QR2Flags, we already know them... */
}
FreeStrBuf (&Buf);
}
+
+void LoadXRoomPic(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+
+ if (WCC->CurRoom.XHaveRoomPicLoaded)
+ return;
+
+ WCC->CurRoom.XHaveRoomPicLoaded = 1;
+ Buf = NewStrBuf();
+ serv_puts("OIMG _roompic_");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ WCC->CurRoom.XHaveRoomPic = 0;
+ } else {
+ WCC->CurRoom.XHaveRoomPic = 1;
+ }
+ serv_puts("CLOS");
+ StrBuf_ServGetln(Buf);
+ GetServerStatus(Buf, NULL);
+ FreeStrBuf (&Buf);
+}
+
+int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadXRoomPic();
+ return WCC->CurRoom.XHaveRoomPic == 1;
+}
+
+void LoadXRoomInfoText(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+ int Done = 0;
+
+ if (WCC->CurRoom.XHaveInfoTextLoaded)
+ return;
+
+ WCC->CurRoom.XHaveInfoTextLoaded = 1;
+ Buf = NewStrBuf();
+
+ serv_puts("RINF");
+
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+ WCC->CurRoom.XInfoText = NewStrBuf ();
+
+ while (!Done && StrBuf_ServGetln(Buf)>=0) {
+ if ( (StrLength(Buf)==3) &&
+ !strcmp(ChrPtr(Buf), "000"))
+ Done = 1;
+ else
+ StrBufAppendBuf(WCC->CurRoom.XInfoText, Buf, 0);
+ }
+ }
+
+ FreeStrBuf (&Buf);
+}
+
+int ConditionalThisRoomXHaveInfoText(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadXRoomInfoText();
+ return (StrLength(WCC->CurRoom.XInfoText)>0);
+}
+
+void tmplput_CurrentRoomInfoText(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomInfoText();
+
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 1);
+}
+
+void LoadXRoomXCountFiles(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+ int Done = 0;
+
+ if (WCC->CurRoom.XHaveDownloadCount)
+ return;
+
+ WCC->CurRoom.XHaveDownloadCount = 1;
+
+ Buf = NewStrBuf();
+ serv_puts("RDIR");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+
+ while (!Done && StrBuf_ServGetln(Buf)>=0) {
+ if ( (StrLength(Buf)==3) &&
+ !strcmp(ChrPtr(Buf), "000"))
+ Done = 1;
+ else
+ WCC->CurRoom.XDownloadCount++;
+ }
+ }
+
+ FreeStrBuf (&Buf);
+}
+
+void tmplput_CurrentRoomXNFiles(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomXCountFiles();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount);
+}
+
+void tmplput_CurrentRoomX_FileString(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomXCountFiles();
+
+ if (WCC->CurRoom.XDownloadCount == 1)
+ StrBufAppendBufPlain(Target, _("file"), -1, 0);
+ else
+ StrBufAppendBufPlain(Target, _("files"), -1, 0);
+}
+
void tmplput_CurrentRoomPass(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
{
wcsession *WCC = WC;
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview);
+}
+
+void tmplput_CurrentRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
LoadRoomXA();
- StrBufAppendPrintf(Target, "%d", WCC->CurRoom.DefView);
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages);
}
+void tmplput_CurrentRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages);
+}
int ConditionalThisRoomOrder(StrBuf *Target, WCTemplputParams *TP)
{
if (WCC == NULL)
return 0;
- LoadRoomXA();
+ CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+ return CheckThis == WCC->CurRoom.defview;
+}
+
+int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ long CheckThis;
+
+ if (WCC == NULL)
+ return 0;
CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
- return CheckThis == WCC->CurRoom.DefView;
+ if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+ {
+ LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
+ "Roomview [%ld] not valid\n",
+ CheckThis);
+ return 0;
+ }
+
+ return exchangeable_views [WCC->CurRoom.defview][CheckThis] != VIEW_MAX;
}
+void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+ if ((WCC == NULL) ||
+ (WCC->CurRoom.defview >= VIEW_MAX) ||
+ (WCC->CurRoom.defview < VIEW_BBS))
+ {
+ LogTemplateError(Target, "Token", ERR_PARM2, TP,
+ "Roomview [%ld] not valid\n",
+ (WCC != NULL)?
+ WCC->CurRoom.defview : -1);
+ return;
+ }
+ Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
+ StrBufAppendTemplate(Target, TP, Buf, 0);
+ FreeStrBuf(&Buf);
+}
/*
if ((WCC == NULL) ||
(TP->Tokens->nParameters < 3))
- return 0;
+ {
+ return ((WCC->CurRoom.view < VIEW_BBS) ||
+ (WCC->CurRoom.view > VIEW_MAX));
+ }
+
return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
}
InitModule_ROOMOPS
(void)
{
+ initialize_viewdefs();
RegisterPreference("roomlistview",
_("Room list view"),
PRF_STRING,
RegisterConditional(HKEY("COND:ROOM:FLAG:QR2"), 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS);
RegisterConditional(HKEY("COND:ROOM:FLAG:UA"), 0, ConditionalRoomHas_UAFlag, CTX_ROOMS);
- RegisterIterator("THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+ RegisterIterator("ITERATE:THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+ RegisterNamespace("THISROOM:MSGS:NEW", 0, 0, tmplput_CurrentRoom_nNewMessages, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:MSGS:TOTAL", 0, 0, tmplput_CurrentRoom_nTotalMessages, NULL, CTX_NONE);
+
+ RegisterNamespace("THISROOM:FLOOR:NAME", 0, 1, tmplput_CurrentRoomFloorName, NULL, CTX_NONE);
RegisterNamespace("THISROOM:AIDE", 0, 1, tmplput_CurrentRoomAide, NULL, CTX_NONE);
RegisterNamespace("THISROOM:PASS", 0, 1, tmplput_CurrentRoomPass, NULL, CTX_NONE);
RegisterNamespace("THISROOM:DIRECTORY", 0, 1, tmplput_CurrentRoomDirectory, NULL, CTX_NONE);
RegisterNamespace("THISROOM:ORDER", 0, 0, tmplput_CurrentRoomOrder, NULL, CTX_NONE);
RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_VIEW"), 0, ConditionalThisRoomHaveView, CTX_NONE);
+ RegisterNamespace("THISROOM:VIEW_STRING", 0, 0, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
+
+ RegisterNamespace("THISROOM:INFOTEXT", 1, 2, tmplput_CurrentRoomInfoText, NULL, CTX_NONE);
RegisterConditional(HKEY("COND:THISROOM:ORDER"), 0, ConditionalThisRoomOrder, CTX_NONE);
RegisterConditional(HKEY("COND:THISROOM:DEFAULT_VIEW"), 0, ConditionalThisRoomDefView, CTX_NONE);
-
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_PIC"), 0, ConditionalThisRoomXHavePic, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_INFOTEXT"), 0, ConditionalThisRoomXHaveInfoText, CTX_NONE);
+ RegisterNamespace("THISROOM:FILES:N", 0, 1, tmplput_CurrentRoomXNFiles, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:FILES:STR", 0, 1, tmplput_CurrentRoomX_FileString, NULL, CTX_NONE);
REGISTERTokenParamDefine(QR_PERMANENT);
REGISTERTokenParamDefine(QR_INUSE);
REGISTERTokenParamDefine(VIEW_JOURNAL);
REGISTERTokenParamDefine(VIEW_BLOG);
-
+ /* GNET types: */
REGISTERTokenParamDefine(ignet_push_share);
+ { /* these are the parts of an IGNET push config */
+ REGISTERTokenParamDefine(GNET_IGNET_NODE);
+ REGISTERTokenParamDefine(GNET_IGNET_ROOM);
+ }
REGISTERTokenParamDefine(listrecp);
REGISTERTokenParamDefine(digestrecp);
REGISTERTokenParamDefine(pop3client);
+ { /* These are the parts of a pop3 client line... */
+ REGISTERTokenParamDefine(GNET_POP3_HOST);
+ REGISTERTokenParamDefine(GNET_POP3_USER);
+ REGISTERTokenParamDefine(GNET_POP3_DONT_DELETE_REMOTE);
+ REGISTERTokenParamDefine(GNET_POP3_INTERVAL);
+ }
REGISTERTokenParamDefine(rssclient);
REGISTERTokenParamDefine(participate);
free_march_list(sess);
DeleteHash(&sess->Floors);
+ DeleteHash(&sess->Rooms);
+ DeleteHash(&sess->FloorsByName);
}
+
+
/*@}*/