* FlushFolder (): memset (0) the struct, so flags etc. go away too.
[citadel.git] / webcit / roomlist.c
index 9b00be970c27c1b4258bd4c20a58b96a307005b6..24017f291a1bccad8e087eba374b5360660dd551 100644 (file)
@@ -125,16 +125,33 @@ HashList *GetRoomListHashLKRA(StrBuf *Target, WCTemplputParams *TP)
 
        if (WCC->Floors == NULL)
                GetFloorListHash(Target, TP);
-       serv_puts("LKRA");
        if (WCC->Rooms == NULL) 
+       {
+               serv_puts("LKRA");
                WCC->Rooms =  GetRoomListHash(Target, TP);
+       }
        return WCC->Rooms;
 }
 
+HashList *GetZappedRoomListHash(StrBuf *Target, WCTemplputParams *TP) 
+{
+       wcsession *WCC = WC;
+
+       if (WCC->Floors == NULL)
+               GetFloorListHash(Target, TP);
+       serv_puts("LZRM -1");
+       return GetRoomListHash(Target, TP);
+}
+
 void FlushFolder(folder *room)
 {
        int i;
 
+       FreeStrBuf(&room->XAPass);
+       FreeStrBuf(&room->Directory);
+       FreeStrBuf(&room->RoomAide);
+       FreeStrBuf(&room->XInfoText);
+
        FreeStrBuf(&room->name);
        if (room->IgnetCfgs[0] == (HashList*) StrBufNOTNULL)
        {
@@ -148,6 +165,7 @@ void FlushFolder(folder *room)
                        FreeStrBuf(&room->RoomNameParts[i]);
                free(room->RoomNameParts);
        }
+       memset(room, 0, sizeof(folder));
 }
 
 void vDeleteFolder(void *vFolder)
@@ -271,6 +289,7 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
        StrBuf *Content;
        long WantThisOne;
        long PutTo;
+       long State;
        
        WantThisOne = GetTemplateTokenNumber(Target, TP, 5, 0);
        if (WantThisOne == 0)
@@ -283,27 +302,42 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
        Line = NewStrBuf();
        Token = NewStrBuf();
        StrBuf_ServGetln(Line);
-       if (GetServerStatus(Line, NULL) == 1) 
+       if (GetServerStatus(Line, &State) == 1) 
        {
                const char *Pos = NULL;
                StrBuf_ServGetln(Line);
                StrBufExtract_NextToken(Token, Line, &Pos, '|');
                PutTo = GetTokenDefine(SKEY(Token), -1);
-               if ((PutTo > 0) && (PutTo < maxRoomNetCfg))
+               if ((PutTo > 0) && 
+                   (PutTo < maxRoomNetCfg) &&
+                   (Pos != StrBufNOTNULL))
                {
                        int n;
+                       HashList *SubH;
 
                        if (WCC->CurRoom.IgnetCfgs[PutTo] == NULL)
                                WCC->CurRoom.IgnetCfgs[PutTo] = NewHash(1, NULL);
-                       Content = NewStrBuf();
-                       StrBufExtract_NextToken(Content, Line, &Pos, '|');
+                       SubH = NewHash(1, NULL);
                        n = GetCount(WCC->CurRoom.IgnetCfgs[PutTo]) + 1;
                        Put(WCC->CurRoom.IgnetCfgs[PutTo], 
                            IKEY(n),
-                           Content, 
-                           HFreeStrBuf);
+                           SubH, 
+                           HDeleteHash);
+                       while (Pos != StrBufNOTNULL) {
+                               Content = NewStrBuf();
+                               StrBufExtract_NextToken(Content, Line, &Pos, '|');
+                               Put(SubH, 
+                                   IKEY(n),
+                                   Content, 
+                                   HFreeStrBuf);
+                               n++;
+                       }
                }
        }
+       else if (State == 550)
+               StrBufAppendBufPlain(WCC->ImportantMsg,
+                                    _("Higher access is required to access this function."), -1, 0);
+
 
        return WCC->CurRoom.IgnetCfgs[WantThisOne];
 }
@@ -494,7 +528,12 @@ int GroupchangeRoomListByFloorRoomPrivFirst(const void *room1, const void *room2
 }
 
 
-
+int CompareRooms(const folder *room1, const folder *room2) 
+{
+       if ((room1 == NULL) || (room2 == NULL))
+               return -1;
+       return CompareRoomListByFloorRoomPrivFirst(room1, room2);
+}
 
 
 
@@ -502,6 +541,14 @@ void tmplput_ROOM_NAME(StrBuf *Target, WCTemplputParams *TP)
 {
        folder *Folder = (folder *)CTX;
 
+       if (Folder == NULL)
+       {
+               wcsession *WCC = WC;
+
+               if (WCC == NULL)
+                       return;
+               Folder = &WCC->CurRoom;
+       }
        StrBufAppendTemplate(Target, TP, Folder->name, 0);
 }
 void tmplput_ROOM_BASENAME(StrBuf *Target, WCTemplputParams *TP) 
@@ -611,48 +658,6 @@ void tmplput_ROOM_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP)
 
 
 
-int ConditionalRoomHas_UA_KNOWN(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_KNOWN) != 0;
-}
-
-int ConditionalRoomHas_UA_GOTOALLOWED(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_GOTOALLOWED) != 0;
-}
-
-int ConditionalRoomHas_UA_HASNEWMSGS(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_HASNEWMSGS) != 0;
-}
-
-int ConditionalRoomHas_UA_ZAPPED(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_ZAPPED) != 0;
-}
-
-int ConditionalRoomHas_UA_POSTALLOWED(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_POSTALLOWED) != 0;
-}
-
-int ConditionalRoomHas_UA_ADMINALLOWED(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_ADMINALLOWED) != 0;
-}
-
-int ConditionalRoomHas_UA_DELETEALLOWED(StrBuf *Target, WCTemplputParams *TP)
-{
-       folder *Folder = (folder *)CTX;
-       return (Folder->RAFlags & UA_DELETEALLOWED) != 0;
-}
-
 
 int ConditionalRoomIsInbox(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -715,6 +720,21 @@ int ConditionalFloorIsRESTSubFloor(StrBuf *Target, WCTemplputParams *TP)
        return WCC->CurrentFloor == MyFloor;
 }
 
+int ConditionalFloorIsVirtual(StrBuf *Target, WCTemplputParams *TP)
+{
+       Floor *MyFloor = (Floor *)CTX;
+
+       return MyFloor->ID == VIRTUAL_MY_FLOOR;
+}
+
+int ConditionalFloorIsSUBROOM(StrBuf *Target, WCTemplputParams *TP)
+{
+       wcsession  *WCC = WC;
+       Floor *MyFloor = (Floor *)CTX;
+
+       return WCC->CurRoom.floorid == MyFloor->ID;
+}
+
 
 int ConditionalRoomIsRESTSubRoom(StrBuf *Target, WCTemplputParams *TP)
 {
@@ -811,37 +831,45 @@ void jsonRoomFlr(void)
        end_burst(); 
 }
 
-
-void 
-SessionDetachModule_ROOMLIST
-(wcsession *sess)
-{
-       DeleteHash(&sess->Floors);
-       DeleteHash(&sess->Rooms);
-       DeleteHash(&sess->FloorsByName);
-}
+#define POP3_HOST 0
+#define POP3_USERNAME 1
+#define POP3_PASSWORD 2
+#define POP3_KEEP 3
+#define POP3_INTERVAL 4
 
 void 
 InitModule_ROOMLIST
 (void)
 {
+
+       REGISTERTokenParamDefine(POP3_HOST);
+       REGISTERTokenParamDefine(POP3_USERNAME);
+       REGISTERTokenParamDefine(POP3_PASSWORD);
+       REGISTERTokenParamDefine(POP3_KEEP);
+       REGISTERTokenParamDefine(POP3_INTERVAL);
+
+
        WebcitAddUrlHandler(HKEY("json_roomflr"), "", 0, jsonRoomFlr, 0);
 
 
        RegisterNamespace("FLOOR:ID", 0, 0, tmplput_FLOOR_ID, NULL, CTX_FLOORS);
        RegisterNamespace("FLOOR:NAME", 0, 1, tmplput_FLOOR_NAME, NULL, CTX_FLOORS);
        RegisterNamespace("FLOOR:NROOMS", 0, 0, tmplput_FLOOR_NROOMS, NULL, CTX_FLOORS);
+       RegisterConditional(HKEY("COND:FLOOR:ISSUBROOM"), 0, ConditionalFloorIsSUBROOM, CTX_FLOORS);
+       RegisterConditional(HKEY("COND:FLOOR:ISVIRTUAL"), 0, ConditionalFloorIsVirtual, CTX_FLOORS);
        RegisterConditional(HKEY("COND:ROOM:REST:ISSUBFLOOR"), 0, ConditionalFloorIsRESTSubFloor, CTX_FLOORS);
 
-       RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+       RegisterIterator("ITERATE:THISROOM:GNET", 1, NULL, GetNetConfigHash, NULL, NULL, CTX_STRBUFARR, CTX_NONE, IT_NOFLAG);
 
        RegisterIterator("LFLR", 0, NULL, GetFloorListHash, NULL, NULL, CTX_FLOORS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
 
        RegisterIterator("LKRA", 0, NULL, GetRoomListHashLKRA, NULL, NULL, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+       RegisterIterator("LZRM", 0, NULL, GetZappedRoomListHash, NULL, DeleteHash, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+
 
        RegisterNamespace("ROOM:INFO:FLOORID", 0, 1, tmplput_ROOM_FLOORID, NULL, CTX_ROOMS);
        RegisterNamespace("ROOM:INFO:NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_ROOMS);
-       RegisterNamespace("ROOM:INFO:PRINT_NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_ROOMS);/// TODO!
+       RegisterNamespace("ROOM:INFO:PRINT_NAME", 0, 1, tmplput_ROOM_NAME, NULL, CTX_NONE);
        RegisterNamespace("ROOM:INFO:BASENAME", 0, 1, tmplput_ROOM_BASENAME, NULL, CTX_ROOMS);
        RegisterNamespace("ROOM:INFO:LEVELNTIMES", 1, 2, tmplput_ROOM_LEVEL_N_TIMES, NULL, CTX_ROOMS);
 
@@ -860,13 +888,6 @@ InitModule_ROOMLIST
        RegisterConditional(HKEY("COND:ROOM:REST:ISSUBROOM"), 0, ConditionalRoomIsRESTSubRoom, CTX_ROOMS);
 
        RegisterConditional(HKEY("COND:ROOM:INFO:IS_INBOX"), 0, ConditionalRoomIsInbox, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_KNOWN"), 0, ConditionalRoomHas_UA_KNOWN, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_GOTOALLOWED"), 0, ConditionalRoomHas_UA_GOTOALLOWED, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_HASNEWMSGS"), 0, ConditionalRoomHas_UA_HASNEWMSGS, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_ZAPPED"), 0, ConditionalRoomHas_UA_ZAPPED, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_POSTALLOWED"), 0, ConditionalRoomHas_UA_POSTALLOWED, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_ADMINALLOWED"), 0, ConditionalRoomHas_UA_ADMINALLOWED, CTX_ROOMS);
-       RegisterConditional(HKEY("COND:ROOM:FLAGS:UA_DELETEALLOWED"), 0, ConditionalRoomHas_UA_DELETEALLOWED, CTX_ROOMS);
        RegisterConditional(HKEY("COND:ROOM:GROUPDAV_CONTENT"), 0, ConditionalRoomHasGroupdavContent, CTX_ROOMS);