* set_room_policy(): use modern representations of the policy names
[citadel.git] / webcit / roomops.c
index 0cd8ecd11efad68a2f4e7983f3b3493845c2a3bb..79323c9f8a110fd892d64a3c9d6b6f7c879aa254 100644 (file)
@@ -33,7 +33,7 @@ ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = { /* the different kinds of
        };
 /* the brief calendar view is disabled: VIEW_CALBRIEF */
 
-allowed_default_views[VIEW_MAX] = {
+ROOM_VIEWS allowed_default_views[VIEW_MAX] = {
        1, /* VIEW_BBS          Bulletin board view */
        1, /* VIEW_MAILBOX              Mailbox summary */
        1, /* VIEW_ADDRESSBOOK  Address book view */
@@ -167,6 +167,15 @@ void embed_room_banner(void)
                        "%s"
                        "</span></a></li>\n", _("View contacts")
                        );
+               wc_printf(
+                       "<li class=\"addnewcontact\">"
+                       "<a href=\"display_enter\">"
+                       "<img src=\"static/addnewcontact_24x.gif\" "
+                       "alt=\"\" width=\"24\" height=\"24\">"
+                       "<span class=\"navbar_link\">"
+                       "%s"
+                       "</span></a></li>\n", _("Add new contact")
+                       );
                break;
        case VIEW_CALENDAR:
                wc_printf(
@@ -187,6 +196,17 @@ void embed_room_banner(void)
                        "%s"
                        "</span></a></li>\n", _("Month view")
                        );
+               wc_printf("<li class=\"addevent\"><a href=\"display_enter");
+               if (havebstr("year" )) wc_printf("?year=%s", bstr("year"));
+               if (havebstr("month")) wc_printf("?month=%s", bstr("month"));
+               if (havebstr("day"  )) wc_printf("?day=%s", bstr("day"));
+               wc_printf("\">"
+                         "<img  src=\"static/addevent_24x.gif\" "
+                         "alt=\"\" width=\"24\" height=\"24\">"
+                         "<span class=\"navbar_link\">"
+                         "%s"
+                         "</span></a></li>\n", _("Add new event")
+                       );
                break;
        case VIEW_CALBRIEF:
                wc_printf(
@@ -209,6 +229,15 @@ void embed_room_banner(void)
                        "%s"
                        "</span></a></li>\n", _("View tasks")
                        );
+               wc_printf(
+                       "<li class=\"newmess\">"
+                       "<a href=\"display_enter\">"
+                       "<img  src=\"static/newmess3_24x.gif\" "
+                       "alt=\"\" width=\"24\" height=\"24\">"
+                       "<span class=\"navbar_link\">"
+                       "%s"
+                       "</span></a></li>\n", _("Add new task")
+                       );
                break;
        case VIEW_NOTES:
                wc_printf(
@@ -220,30 +249,26 @@ void embed_room_banner(void)
                        "%s"
                        "</span></a></li>\n", _("View notes")
                        );
-               break;
-       case VIEW_MAILBOX:
                wc_printf(
-                       "<li class=\"readallmess\">"
-                       "<a id=\"m_refresh\" href=\"readfwd\">"
-                       "<img src=\"static/readallmess3_24x.gif\" "
+                       "<li class=\"enternewnote\">"
+                       "<a href=\"add_new_note\">"
+                       "<img  src=\"static/enternewnote_24x.gif\" "
                        "alt=\"\" width=\"24\" height=\"24\">"
                        "<span class=\"navbar_link\">"
                        "%s"
-                       "</span></a></li>\n", _("Refresh message list")
+                       "</span></a></li>\n", _("Add new note")
                        );
                break;
-       case VIEW_WIKI:
+       case VIEW_MAILBOX:
                wc_printf(
                        "<li class=\"readallmess\">"
-                       "<a href=\"wiki?page=home\">"
+                       "<a id=\"m_refresh\" href=\"readfwd\">"
                        "<img src=\"static/readallmess3_24x.gif\" "
                        "alt=\"\" width=\"24\" height=\"24\">"
                        "<span class=\"navbar_link\">"
                        "%s"
-                       "</span></a></li>\n", _("Wiki home")
+                       "</span></a></li>\n", _("Refresh message list")
                        );
-               break;
-       default:
                wc_printf(
                        "<li class=\"readallmess\">"
                        "<a href=\"readfwd\">"
@@ -253,36 +278,6 @@ void embed_room_banner(void)
                        "%s"
                        "</span></a></li>\n", _("Read all messages")
                        );
-               break;
-       }
-       
-       switch(WC->CurRoom.view) {
-       case VIEW_ADDRESSBOOK:
-               wc_printf(
-                       "<li class=\"addnewcontact\">"
-                       "<a href=\"display_enter\">"
-                       "<img src=\"static/addnewcontact_24x.gif\" "
-                       "alt=\"\" width=\"24\" height=\"24\">"
-                       "<span class=\"navbar_link\">"
-                       "%s"
-                       "</span></a></li>\n", _("Add new contact")
-                       );
-               break;
-       case VIEW_CALENDAR:
-       case VIEW_CALBRIEF:
-               wc_printf("<li class=\"addevent\"><a href=\"display_enter");
-               if (havebstr("year" )) wc_printf("?year=%s", bstr("year"));
-               if (havebstr("month")) wc_printf("?month=%s", bstr("month"));
-               if (havebstr("day"  )) wc_printf("?day=%s", bstr("day"));
-               wc_printf("\">"
-                         "<img  src=\"static/addevent_24x.gif\" "
-                         "alt=\"\" width=\"24\" height=\"24\">"
-                         "<span class=\"navbar_link\">"
-                         "%s"
-                         "</span></a></li>\n", _("Add new event")
-                       );
-               break;
-       case VIEW_TASKS:
                wc_printf(
                        "<li class=\"newmess\">"
                        "<a href=\"display_enter\">"
@@ -290,21 +285,19 @@ void embed_room_banner(void)
                        "alt=\"\" width=\"24\" height=\"24\">"
                        "<span class=\"navbar_link\">"
                        "%s"
-                       "</span></a></li>\n", _("Add new task")
+                       "</span></a></li>\n", _("Write mail")
                        );
                break;
-       case VIEW_NOTES:
+       case VIEW_WIKI:
                wc_printf(
-                       "<li class=\"enternewnote\">"
-                       "<a href=\"add_new_note\">"
-                       "<img  src=\"static/enternewnote_24x.gif\" "
+                       "<li class=\"readallmess\">"
+                       "<a href=\"wiki?page=home\">"
+                       "<img src=\"static/readallmess3_24x.gif\" "
                        "alt=\"\" width=\"24\" height=\"24\">"
                        "<span class=\"navbar_link\">"
                        "%s"
-                       "</span></a></li>\n", _("Add new note")
+                       "</span></a></li>\n", _("Wiki home")
                        );
-               break;
-       case VIEW_WIKI:
                safestrncpy(buf, bstr("page"), sizeof buf);
                if (IsEmptyStr(buf)) {
                        safestrncpy(buf, "home", sizeof buf);
@@ -345,26 +338,17 @@ void embed_room_banner(void)
                                );
                }
                break;
-       case VIEW_MAILBOX:
+               break;
+       default:
                wc_printf(
-                       "<li class=\"newmess\">"
-                       "<a href=\"display_enter\">"
-                       "<img  src=\"static/newmess3_24x.gif\" "
+                       "<li class=\"readallmess\">"
+                       "<a href=\"readfwd\">"
+                       "<img src=\"static/readallmess3_24x.gif\" "
                        "alt=\"\" width=\"24\" height=\"24\">"
                        "<span class=\"navbar_link\">"
                        "%s"
-                       "</span></a></li>\n", _("Write mail")
-                       );
-               wc_printf(
-                       "<li class=\"newmess\">"
-                       "<a href=\"javascript:deleteAllSelectedMessages();\">"
-                       "<img  src=\"static/delete.gif\" "
-                       "alt=\"\" width=\"24\" height=\"24\"><span class=\"navbar_link\">"
-                       "%s"
-                       "</span></a></li>\n", _("Delete")
+                       "</span></a></li>\n", _("Read all messages")
                        );
-               break;
-       default:
                wc_printf(
                        "<li class=\"newmess\">"
                        "<a href=\"display_enter\">"
@@ -440,6 +424,7 @@ long gotoroom(const StrBuf *gname)
                        return err;
                }
        }
+       FlushFolder(&WCC->CurRoom);
        ParseGoto(&WCC->CurRoom, Buf);
 
        if (StrLength(gname) > 0)
@@ -453,6 +438,85 @@ long gotoroom(const StrBuf *gname)
        return err;
 }
 
+void DBG_QR(long QR)
+{
+       const char *QRFlagList[15] = {
+               strof(QR_PERMANENT),
+               strof(QR_INUSE),
+               strof(QR_PRIVATE),
+               strof(QR_PASSWORDED),
+               strof(QR_GUESSNAME),
+               strof(QR_DIRECTORY),
+               strof(QR_UPLOAD),
+               strof(QR_DOWNLOAD),
+               strof(QR_VISDIR),
+               strof(QR_ANONONLY),
+               strof(QR_ANONOPT),
+               strof(QR_NETWORK),
+               strof(QR_PREFONLY),
+               strof(QR_READONLY),
+               strof(QR_MAILBOX)
+       };
+       int i = 1;
+       int j=0;
+       StrBuf *QRVec;
+
+       QRVec = NewStrBufPlain(NULL, 256);
+       while (i != 0)
+       {
+               if ((QR & i) != 0) {
+                       if (StrLength(QRVec) > 0)
+                               StrBufAppendBufPlain(QRVec, HKEY(" | "), 0);
+                       StrBufAppendBufPlain(QRVec, QRFlagList[j], -1, 0);
+               }
+               i = i << 1;
+               j++;
+       }
+       lprintf(9, "DBG: QR-Vec [%ld] [%s]\n", QR, ChrPtr(QRVec));
+       FreeStrBuf(&QRVec);
+}
+
+
+
+void DBG_QR2(long QR2)
+{
+       const char *QR2FlagList[15] = {
+               strof(QR2_SYSTEM),
+               strof(QR2_SELFLIST),
+               strof(QR2_COLLABDEL),
+               strof(QR2_SUBJECTREQ),
+               strof(QR2_SMTP_PUBLIC),
+               strof(QR2_MODERATED),
+               "", 
+               "", 
+               "", 
+               "", 
+               "", 
+               "", 
+               "", 
+               "", 
+               ""
+       };
+       int i = 1;
+       int j=0;
+       StrBuf *QR2Vec;
+
+       QR2Vec = NewStrBufPlain(NULL, 256);
+       while (i != 0)
+       {
+               if ((QR2 & i) != 0) {
+                       if (StrLength(QR2Vec) > 0)
+                               StrBufAppendBufPlain(QR2Vec, HKEY(" | "), 0);
+                       StrBufAppendBufPlain(QR2Vec, QR2FlagList[j], -1, 0);
+               }
+               i = i << 1;
+               j++;
+       }
+       lprintf(9, "DBG: QR2-Vec [%ld] [%s]\n", QR2, ChrPtr(QR2Vec));
+       FreeStrBuf(&QR2Vec);
+}
+
+
 
 void ParseGoto(folder *room, StrBuf *Line)
 {
@@ -498,6 +562,8 @@ void ParseGoto(folder *room, StrBuf *Line)
        
        room->QRFlags = StrBufExtractNext_long(Line, &Pos, '|'); //CurRoom->QRFlags
 
+       DBG_QR(room->QRFlags);
+
        room->HighestRead = StrBufExtractNext_long(Line, &Pos, '|');
        room->LastMessageRead = StrBufExtractNext_long(Line, &Pos, '|');
 
@@ -521,6 +587,7 @@ void ParseGoto(folder *room, StrBuf *Line)
                room->RAFlags |= UA_ISTRASH; // wc_is_trash
 
        room->QRFlags2 = StrBufExtractNext_long(Line, &Pos, '|'); // CurRoom->QRFlags2
+       DBG_QR2(room->QRFlags2);
 
        /* find out, whether we are in a sub-room */
        room->nRoomNameParts = StrBufNum_tokens(room->name, '\\');
@@ -620,7 +687,7 @@ void LoadRoomXA (void)
 
        WCC->CurRoom.XALoaded = 1;
        Buf = NewStrBuf();
-       serv_puts("GETA");
+       serv_puts("GETR");
        StrBuf_ServGetln(Buf);
        if (GetServerStatus(Buf, NULL) != 2) {
                FlushStrBuf(WCC->CurRoom.XAPass);
@@ -1042,6 +1109,7 @@ int self_service(int newval) {
                serv_getln(buf, sizeof buf);
        }
 
+       FlushRoomlist ();
        return(newval);
 
 }
@@ -1101,6 +1169,8 @@ int set_roomflags(room_states *RoomOps)
                    RoomOps->view, 
                    RoomOps->flags2);
        serv_getln(buf, sizeof buf);
+       FlushRoomlist ();
+
        return (1);
 }
 
@@ -2085,7 +2155,7 @@ void toggle_self_service(void) {
 
        set_roomflags (&RoomFlags);
        
-       do_template("room_edit", NULL);
+       http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
 }
 
 
@@ -2112,7 +2182,7 @@ void editroom(void)
        if (!havebstr("ok_button")) {
                strcpy(WC->ImportantMessage,
                       _("Cancelled.  Changes were not saved."));
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
        serv_puts("GETR");
@@ -2121,11 +2191,13 @@ void editroom(void)
        if (GetServerStatus(Buf, NULL) != 2) {
                StrBufCutLeft(Buf, 4);
                strcpy(WC->ImportantMessage, ChrPtr(Buf));
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                FreeStrBuf(&Buf);
                return;
        }
 
+       FlushRoomlist ();
+
        er_name = NewStrBuf();
        er_password = NewStrBuf();
        er_dirname = NewStrBuf();
@@ -2276,7 +2348,7 @@ void editroom(void)
        StrBuf_ServGetln(Buf);
        if (GetServerStatus(Buf, NULL) != 2) {
                strcpy(WC->ImportantMessage, &ChrPtr(Buf)[4]);
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                FreeStrBuf(&Buf);
                FreeStrBuf(&er_name);
                FreeStrBuf(&er_password);
@@ -2302,7 +2374,7 @@ void editroom(void)
        }
        gotoroom(er_name);
        strcpy(WC->ImportantMessage, _("Your changes have been saved."));
-       do_template("room_edit", NULL);
+       http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
        FreeStrBuf(&Buf);
        FreeStrBuf(&er_name);
        FreeStrBuf(&er_password);
@@ -2357,7 +2429,7 @@ void do_invt_kick(void) {
                 }
         }
 
-       do_template("room_edit", NULL);
+       http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
 }
 
 
@@ -2522,7 +2594,7 @@ void entroom(void)
        }
        /** TODO: Room created, now update the left hand icon bar for this user */
        burn_folder_cache(0);   /* burn the old folder cache */
-       FlushRoomlist ();
+
        gotoroom(er_name);
 
        serv_printf("VIEW %d", er_view);
@@ -2530,7 +2602,7 @@ void entroom(void)
        WCC->CurRoom.view = er_view;
 
        if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) )  {
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
        } else {
                do_change_view(er_view);                /* Now go there */
        }
@@ -2665,14 +2737,14 @@ void netedit(void) {
                strcat(line, bstr("suffix"));
        }
        else {
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
 
 
        fp = tmpfile();
        if (fp == NULL) {
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
 
@@ -2680,7 +2752,7 @@ void netedit(void) {
        serv_getln(buf, sizeof buf);
        if (buf[0] != '1') {
                fclose(fp);
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
 
@@ -2701,7 +2773,7 @@ void netedit(void) {
        serv_getln(buf, sizeof buf);
        if (buf[0] != '4') {
                fclose(fp);
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
 
@@ -2731,7 +2803,7 @@ void netedit(void) {
 
        serv_puts("000");
        fclose(fp);
-       do_template("room_edit", NULL);
+       http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
 }
 
 
@@ -2866,22 +2938,22 @@ void set_room_policy(void) {
        if (!havebstr("ok_button")) {
                strcpy(WC->ImportantMessage,
                       _("Cancelled.  Changes were not saved."));
-               do_template("room_edit", NULL);
+               http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
                return;
        }
 
-       serv_printf("SPEX room|%d|%d", ibstr("roompolicy"), ibstr("roomvalue"));
+       serv_printf("SPEX roompolicy|%d|%d", ibstr("roompolicy"), ibstr("roomvalue"));
        serv_getln(buf, sizeof buf);
        strcpy(WC->ImportantMessage, &buf[4]);
 
        if (WC->axlevel >= 6) {
                strcat(WC->ImportantMessage, "<br />\n");
-               serv_printf("SPEX floor|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue"));
+               serv_printf("SPEX floorpolicy|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue"));
                serv_getln(buf, sizeof buf);
                strcat(WC->ImportantMessage, &buf[4]);
        }
-
-       do_template("room_edit", NULL);
+       FlushRoomlist();
+       http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0);
 }
 
 void tmplput_RoomName(StrBuf *Target, WCTemplputParams *TP)
@@ -2979,9 +3051,15 @@ int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
        if (QR_CheckFlag == 0)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+       
+       if (WCC == NULL)
+               return 0;
 
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags & QR_CheckFlag) != 0));
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags & QR_CheckFlag) == QR_CheckFlag;
 }
 
 int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
@@ -2993,7 +3071,12 @@ int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
        if (QR_CheckFlag == 0)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
-       return ((Folder->QRFlags & QR_CheckFlag) != 0);
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (Folder->QRFlags & QR_CheckFlag) != 0;
+       else
+               return (Folder->QRFlags & QR_CheckFlag) == QR_CheckFlag;
 }
 
 
@@ -3007,8 +3090,15 @@ int ConditionalCurrentRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
                LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
                                 "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
 
-       return ((WCC!=NULL) &&
-               ((WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0));
+       
+       if (WCC == NULL)
+               return 0;
+
+       if ((TP->Tokens->Params[2]->MaskBy == eOR) ||
+           (TP->Tokens->Params[2]->MaskBy == eNO))
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0;
+       else
+               return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) == QR2_CheckFlag;
 }
 
 int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)