3 * Lots of different room-related operations.
11 * Embed the room banner
13 * got The information returned from a GOTO server command
14 * navbar_style Determines which navigation buttons to display
17 void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP)
21 /* refresh current room states... */
22 /* dosen't work??? gotoroom(NULL); */
23 wc_printf("<div id=\"banner\">\n");
25 /* The browser needs some information for its own use */
26 wc_printf("<script type=\"text/javascript\"> \n"
27 " room_is_trash = %d; \n"
29 ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0)
33 * If the user happens to select the "make this my start page" link,
34 * we want it to remember the URL as a "/dotskip" one instead of
35 * a "skip" or "gotonext" or something like that.
37 if (WCC->Hdr->this_page == NULL) {
38 WCC->Hdr->this_page = NewStrBuf();
40 StrBufPrintf(WCC->Hdr->this_page,
42 ChrPtr(WC->CurRoom.name)
45 do_template("roombanner", NULL);
46 /* roombanner contains this for mobile */
50 do_template("navbar", NULL);
51 wc_printf("</div>\n");
55 /*******************************************************************************
56 ********************** FLOOR Tokens *******************************************
57 ******************************************************************************/
58 void tmplput_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP)
60 Floor *myFloor = (Floor *)CTX;
62 StrBufAppendPrintf(Target, "%d", myFloor->ID);
64 void tmplput_ROOM_FLOORID(StrBuf *Target, WCTemplputParams *TP)
66 folder *Folder = (folder *)CTX;
67 StrBufAppendPrintf(Target, "%d", Folder->floorid);
69 void tmplput_ROOM_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP)
71 folder *Folder = (folder *)CTX;
72 const Floor *pFloor = Folder->Floor;
77 StrBufAppendPrintf(Target, "%d", pFloor->ID);
80 void tmplput_ROOM_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP)
82 folder *Folder = (folder *)CTX;
83 const Floor *pFloor = Folder->Floor;
88 StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
90 void tmplput_ThisRoomFloorName(StrBuf *Target, WCTemplputParams *TP)
93 folder *Folder = &WCC->CurRoom;
99 pFloor = Folder->Floor;
103 StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
105 void tmplput_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP)
107 Floor *myFloor = (Floor *)CTX;
109 StrBufAppendTemplate(Target, TP, myFloor->Name, 0);
112 void tmplput_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP)
114 Floor *myFloor = (Floor *)CTX;
116 StrBufAppendPrintf(Target, "%d", myFloor->NRooms);
118 void tmplput_ROOM_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP)
120 folder *Folder = (folder *)CTX;
121 const Floor *pFloor = Folder->Floor;
125 StrBufAppendPrintf(Target, "%d", pFloor->NRooms);
127 int ConditionalFloorHaveNRooms(StrBuf *Target, WCTemplputParams *TP)
129 Floor *MyFloor = (Floor *)CTX;
132 HaveN = GetTemplateTokenNumber(Target, TP, 0, 0);
134 return HaveN == MyFloor->NRooms;
137 int ConditionalFloorIsRESTSubFloor(StrBuf *Target, WCTemplputParams *TP)
140 Floor *MyFloor = (Floor *)CTX;
141 /** if we have dav_depth the client just wants the subfloors */
142 if ((WCC->Hdr->HR.dav_depth == 1) &&
143 (GetCount(WCC->Directory) == 0))
145 return WCC->CurrentFloor == MyFloor;
147 int ConditionalFloorIsSUBROOM(StrBuf *Target, WCTemplputParams *TP)
150 Floor *MyFloor = (Floor *)CTX;
152 return WCC->CurRoom.floorid == MyFloor->ID;
156 int ConditionalFloorIsVirtual(StrBuf *Target, WCTemplputParams *TP)
158 Floor *MyFloor = (Floor *)CTX;
160 return MyFloor->ID == VIRTUAL_MY_FLOOR;
165 /*******************************************************************************
166 ********************** ROOM Tokens ********************************************
167 ******************************************************************************/
169 void tmplput_RoomName(StrBuf *Target, WCTemplputParams *TP)
171 StrBufAppendTemplate(Target, TP, WC->CurRoom.name, 0);
173 void tmplput_current_room(StrBuf *Target, WCTemplputParams *TP)
178 StrBufAppendTemplate(Target, TP,
182 void tmplput_ROOM_NAME(StrBuf *Target, WCTemplputParams *TP)
184 folder *Folder = (folder *)CTX;
192 Folder = &WCC->CurRoom;
194 StrBufAppendTemplate(Target, TP, Folder->name, 0);
196 void tmplput_ROOM_BASENAME(StrBuf *Target, WCTemplputParams *TP)
198 folder *room = (folder *)CTX;
200 if (room->nRoomNameParts > 1)
201 StrBufAppendTemplate(Target, TP,
202 room->RoomNameParts[room->nRoomNameParts - 1], 0);
204 StrBufAppendTemplate(Target, TP, room->name, 0);
206 void tmplput_ROOM_LEVEL_N_TIMES(StrBuf *Target, WCTemplputParams *TP)
208 folder *room = (folder *)CTX;
210 const char *AppendMe;
214 if (room->nRoomNameParts > 1)
216 GetTemplateTokenString(Target, TP, 0, &AppendMe, &AppendMeLen);
217 for (i = 0; i < room->nRoomNameParts; i++)
218 StrBufAppendBufPlain(Target, AppendMe, AppendMeLen, 0);
221 int ConditionalRoomIsInbox(StrBuf *Target, WCTemplputParams *TP)
223 folder *Folder = (folder *)CTX;
224 return Folder->is_inbox;
227 /****** Properties ******/
228 int ConditionalThisRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
233 QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
234 if (QR_CheckFlag == 0)
235 LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
236 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
241 if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
242 (TP->Tokens->Params[2]->MaskBy == eNO))
243 return (WCC->CurRoom.QRFlags & QR_CheckFlag) != 0;
245 return (WCC->CurRoom.QRFlags & QR_CheckFlag) == QR_CheckFlag;
247 int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
250 folder *Folder = (folder *)(TP->Context);
252 QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
253 if (QR_CheckFlag == 0)
254 LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
255 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
257 if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
258 (TP->Tokens->Params[2]->MaskBy == eNO))
259 return (Folder->QRFlags & QR_CheckFlag) != 0;
261 return (Folder->QRFlags & QR_CheckFlag) == QR_CheckFlag;
263 void tmplput_ROOM_QRFLAGS(StrBuf *Target, WCTemplputParams *TP)
265 folder *Folder = (folder *)CTX;
266 StrBufAppendPrintf(Target, "%d", Folder->QRFlags);
270 int ConditionalThisRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
275 QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
276 if (QR2_CheckFlag == 0)
277 LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
278 "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
284 if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
285 (TP->Tokens->Params[2]->MaskBy == eNO))
286 return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0;
288 return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) == QR2_CheckFlag;
290 int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
293 folder *Folder = (folder *)(TP->Context);
295 QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
296 if (QR2_CheckFlag == 0)
297 LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
298 "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
299 return ((Folder->QRFlags2 & QR2_CheckFlag) != 0);
302 int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP)
304 folder *Folder = (folder *)(TP->Context);
307 UA_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
308 if (UA_CheckFlag == 0)
309 LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
310 "requires one of the #\"UA_*\"- defines or an integer flag 0 is invalid!");
312 return ((Folder->RAFlags & UA_CheckFlag) != 0);
319 void tmplput_ROOM_ACL(StrBuf *Target, WCTemplputParams *TP)
321 folder *Folder = (folder *)CTX;
323 StrBufAppendPrintf(Target, "%ld", Folder->RAFlags, 0);
328 void tmplput_ROOM_RAFLAGS(StrBuf *Target, WCTemplputParams *TP)
330 folder *Folder = (folder *)(TP->Context);
331 StrBufAppendPrintf(Target, "%d", Folder->RAFlags);
335 void tmplput_ThisRoomAide(StrBuf *Target, WCTemplputParams *TP)
341 StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0);
343 int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP)
346 return (WCC != NULL)?
347 ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0;
350 int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
353 return (WCC == NULL)? 0 :
354 ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
355 (WCC->CurRoom.is_inbox) ||
356 (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) );
361 int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
365 return ( (WCC!= NULL) &&
366 ((WCC->axlevel >= 6) ||
367 ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
368 (WCC->CurRoom.is_inbox) ));
370 void tmplput_ThisRoomPass(StrBuf *Target, WCTemplputParams *TP)
376 StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 0);
384 void tmplput_ThisRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP)
390 StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages);
393 void tmplput_ThisRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP)
399 StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages);
407 void tmplput_ThisRoomOrder(StrBuf *Target, WCTemplputParams *TP)
413 StrBufAppendPrintf(Target, "%d", WCC->CurRoom.Order);
415 int ConditionalThisRoomOrder(StrBuf *Target, WCTemplputParams *TP)
425 CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
426 return CheckThis == WCC->CurRoom.Order;
428 void tmplput_ROOM_LISTORDER(StrBuf *Target, WCTemplputParams *TP)
430 folder *Folder = (folder *)CTX;
431 StrBufAppendPrintf(Target, "%d", Folder->Order);
438 int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP)
446 return WCC->CurRoom.XHaveRoomPic == 1;
450 int ConditionalThisRoomXHaveInfoText(StrBuf *Target, WCTemplputParams *TP)
458 return (StrLength(WCC->CurRoom.XInfoText)>0);
460 void tmplput_ThisRoomInfoText(StrBuf *Target, WCTemplputParams *TP)
466 StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 1);
476 void tmplput_ROOM_LASTCHANGE(StrBuf *Target, WCTemplputParams *TP)
478 folder *Folder = (folder *)CTX;
479 StrBufAppendPrintf(Target, "%d", Folder->lastchange);
489 void tmplput_ThisRoomDirectory(StrBuf *Target, WCTemplputParams *TP)
495 StrBufAppendTemplate(Target, TP, WCC->CurRoom.Directory, 0);
497 void tmplput_ThisRoomXNFiles(StrBuf *Target, WCTemplputParams *TP)
501 LoadXRoomXCountFiles();
503 StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount);
506 void tmplput_ThisRoomX_FileString(StrBuf *Target, WCTemplputParams *TP)
510 LoadXRoomXCountFiles();
512 if (WCC->CurRoom.XDownloadCount == 1)
513 StrBufAppendBufPlain(Target, _("file"), -1, 0);
515 StrBufAppendBufPlain(Target, _("files"), -1, 0);
520 InitModule_ROOMTOKENS
523 RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, NULL, CTX_NONE);
525 RegisterNamespace("FLOOR:ID", 0, 0, tmplput_FLOOR_ID, NULL, CTX_FLOORS);
526 RegisterNamespace("ROOM:INFO:FLOORID", 0, 1, tmplput_ROOM_FLOORID, NULL, CTX_ROOMS);
527 RegisterNamespace("ROOM:INFO:FLOOR:ID", 0, 0, tmplput_ROOM_FLOOR_ID, NULL, CTX_ROOMS);
529 RegisterNamespace("FLOOR:NAME", 0, 1, tmplput_FLOOR_NAME, NULL, CTX_FLOORS);
530 RegisterNamespace("ROOM:INFO:FLOOR:NAME", 0, 1, tmplput_ROOM_FLOOR_NAME, NULL, CTX_ROOMS);
531 RegisterNamespace("THISROOM:FLOOR:NAME", 0, 1, tmplput_ThisRoomFloorName, NULL, CTX_NONE);
533 RegisterNamespace("FLOOR:NROOMS", 0, 0, tmplput_FLOOR_NROOMS, NULL, CTX_FLOORS);
534 RegisterNamespace("ROOM:INFO:FLOOR:NROOMS", 0, 0, tmplput_ROOM_FLOOR_NROOMS, NULL, CTX_ROOMS);
536 RegisterConditional(HKEY("COND:FLOOR:ISSUBROOM"), 0, ConditionalFloorIsSUBROOM, CTX_FLOORS);
537 RegisterConditional(HKEY("COND:FLOOR:NROOMS"), 1, ConditionalFloorHaveNRooms, CTX_FLOORS);
538 RegisterConditional(HKEY("COND:ROOM:REST:ISSUBFLOOR"), 0, ConditionalFloorIsRESTSubFloor, CTX_FLOORS);
539 RegisterConditional(HKEY("COND:FLOOR:ISVIRTUAL"), 0, ConditionalFloorIsVirtual, CTX_FLOORS);
541 /**** Room... ******/
543 RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, NULL, CTX_NONE);
544 RegisterNamespace("CURRENT_ROOM", 0, 1, tmplput_current_room, NULL, CTX_NONE);
545 RegisterNamespace("ROOM:INFO:NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_ROOMS);
546 RegisterNamespace("ROOM:INFO:PRINT_NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_NONE);
547 RegisterNamespace("ROOM:INFO:BASENAME", 0, 1, tmplput_ROOM_BASENAME, NULL, CTX_ROOMS);
548 RegisterNamespace("ROOM:INFO:LEVELNTIMES", 1, 2, tmplput_ROOM_LEVEL_N_TIMES, NULL, CTX_ROOMS);
549 RegisterConditional(HKEY("COND:ROOM:INFO:IS_INBOX"), 0, ConditionalRoomIsInbox, CTX_ROOMS);
551 /****** Properties ******/
552 RegisterNamespace("ROOM:INFO:QRFLAGS", 0, 1, tmplput_ROOM_QRFLAGS, NULL, CTX_ROOMS);
553 RegisterConditional(HKEY("COND:THISROOM:FLAG:QR"), 0, ConditionalThisRoomHas_QRFlag, CTX_NONE);
554 RegisterConditional(HKEY("COND:ROOM:FLAG:QR"), 0, ConditionalRoomHas_QRFlag, CTX_ROOMS);
556 RegisterConditional(HKEY("COND:THISROOM:FLAG:QR2"), 0, ConditionalThisRoomHas_QRFlag2, CTX_NONE);
557 RegisterConditional(HKEY("COND:ROOM:FLAG:QR2"), 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS);
559 RegisterConditional(HKEY("COND:ROOM:FLAG:UA"), 0, ConditionalRoomHas_UAFlag, CTX_ROOMS);
560 RegisterNamespace("ROOM:INFO:RAFLAGS", 0, 1, tmplput_ROOM_RAFLAGS, NULL, CTX_ROOMS);
563 RegisterNamespace("ROOM:INFO:LISTORDER", 0, 1, tmplput_ROOM_LISTORDER, NULL, CTX_ROOMS);
564 RegisterNamespace("THISROOM:ORDER", 0, 0, tmplput_ThisRoomOrder, NULL, CTX_NONE);
565 RegisterConditional(HKEY("COND:THISROOM:ORDER"), 0, ConditionalThisRoomOrder, CTX_NONE);
567 RegisterNamespace("ROOM:INFO:LASTCHANGE", 0, 1, tmplput_ROOM_LASTCHANGE, NULL, CTX_ROOMS);
569 RegisterNamespace("THISROOM:MSGS:NEW", 0, 0, tmplput_ThisRoom_nNewMessages, NULL, CTX_NONE);
570 RegisterNamespace("THISROOM:MSGS:TOTAL", 0, 0, tmplput_ThisRoom_nTotalMessages, NULL, CTX_NONE);
572 RegisterNamespace("THISROOM:PASS", 0, 1, tmplput_ThisRoomPass, NULL, CTX_NONE);
573 RegisterNamespace("THISROOM:AIDE", 0, 1, tmplput_ThisRoomAide, NULL, CTX_NONE);
574 RegisterConditional(HKEY("COND:ROOMAIDE"), 2, ConditionalRoomAide, CTX_NONE);
575 RegisterConditional(HKEY("COND:ACCESS:DELETE"), 2, ConditionalRoomAcessDelete, CTX_NONE);
576 RegisterConditional(HKEY("COND:ROOM:EDITACCESS"), 0, ConditionalHaveRoomeditRights, CTX_NONE);
578 RegisterConditional(HKEY("COND:THISROOM:HAVE_PIC"), 0, ConditionalThisRoomXHavePic, CTX_NONE);
580 RegisterNamespace("THISROOM:INFOTEXT", 1, 2, tmplput_ThisRoomInfoText, NULL, CTX_NONE);
581 RegisterConditional(HKEY("COND:THISROOM:HAVE_INFOTEXT"), 0, ConditionalThisRoomXHaveInfoText, CTX_NONE);
583 RegisterNamespace("THISROOM:FILES:N", 0, 1, tmplput_ThisRoomXNFiles, NULL, CTX_NONE);
584 RegisterNamespace("THISROOM:FILES:STR", 0, 1, tmplput_ThisRoomX_FileString, NULL, CTX_NONE);
585 RegisterNamespace("THISROOM:DIRECTORY", 0, 1, tmplput_ThisRoomDirectory, NULL, CTX_NONE);
592 RegisterNamespace("ROOM:INFO:ACL", 0, 1, tmplput_ROOM_ACL, NULL, CTX_ROOMS);