* remove the now unneccesary stuff from embed_room_banner()
[citadel.git] / webcit / roomops.c
index eba4ce174553da7fb81cd2da82f7a6a71a2d715b..a5243ebca34eea84ba6fba10c769e203ef2558f0 100644 (file)
@@ -9,8 +9,6 @@
 
 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.
  */
@@ -18,19 +16,37 @@ char *viewdefs[9];                  /* the different kinds of available views */
 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");
 }
 
 /*
@@ -325,29 +341,6 @@ void embed_room_banner(char *got, int navbar_style) {
        WC->new_mail = extract_int(&got[4], 9);
        WC->CurRoom.view = extract_int(&got[4], 11);
 
-       /* Is this a directory room and does it contain files and how many? */
-       if ((WC->CurRoom.QRFlags & QR_DIRECTORY) && (WC->CurRoom.QRFlags & QR_VISDIR))
-       {
-               serv_puts("RDIR");
-               serv_getln(buf2, sizeof buf2);
-               if (buf2[0] == '1') while (serv_getln(buf2, sizeof buf2), strcmp(buf2, "000"))
-                                           file_count++;
-               snprintf (with_files, sizeof with_files, 
-                         "; <a href=\"do_template?template=files\"> %d %s </a>", 
-                         file_count, 
-                         ((file_count>1) || (file_count == 0)  ? _("files") : _("file")));
-       }
-       else
-               strcpy (with_files, "");
-       
-       svprintf(HKEY("NUMMSGS"), WCS_STRING,
-                _("%d new of %d messages%s"),
-                extract_int(&got[4], 1),
-                extract_int(&got[4], 2),
-                with_files
-               );
-       svcallback("VIEWOMATIC", embed_view_o_matic); 
        do_template("roombanner", NULL);
        /* roombanner contains this for mobile */
        if (navbar_style != navbar_none && (WC->is_mobile < 1)) { 
@@ -859,7 +852,7 @@ void LoadRoomXA (void)
                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... */
 
        }
@@ -951,6 +944,55 @@ void tmplput_CurrentRoomInfoText(StrBuf *Target, WCTemplputParams *TP)
        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;
@@ -979,11 +1021,26 @@ void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP)
 {
        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)
 {
@@ -1007,14 +1064,69 @@ int ConditionalThisRoomDefView(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);
+}
+
+void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP) 
+{
+       long CheckThis;
+       StrBuf *Buf;
+
+       CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
+       if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+       {
+               LogTemplateError(Target, "Token", ERR_PARM2, TP,
+                                "Roomview [%ld] not valid\n", 
+                                CheckThis);
+               return;
+       }
+
+       Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
+       StrBufAppendTemplate(Target, TP, Buf, 0);
+       FreeStrBuf(&Buf);
+}
 
 
 /*
@@ -3445,18 +3557,26 @@ InitModule_ROOMOPS
        RegisterConditional(HKEY("COND:ROOM:FLAG:UA"), 0, ConditionalRoomHas_UAFlag, CTX_ROOMS);
 
        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, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
+       RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, 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);