* GetNetConfigHash(): fix some edge cases
[citadel.git] / webcit / roomlist.c
index c9ca82537f182894f8fd71d023cb90b752c70ebc..ec6ef59248efcdc661650a46f5cb0da1fe595679 100644 (file)
@@ -125,12 +125,24 @@ 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;
@@ -138,6 +150,7 @@ void FlushFolder(folder *room)
        FreeStrBuf(&room->XAPass);
        FreeStrBuf(&room->Directory);
        FreeStrBuf(&room->RoomAide);
+       FreeStrBuf(&room->XInfoText);
 
        FreeStrBuf(&room->name);
        if (room->IgnetCfgs[0] == (HashList*) StrBufNOTNULL)
@@ -152,6 +165,7 @@ void FlushFolder(folder *room)
                        FreeStrBuf(&room->RoomNameParts[i]);
                free(room->RoomNameParts);
        }
+       memset(room, 0, sizeof(folder));
 }
 
 void vDeleteFolder(void *vFolder)
@@ -200,7 +214,7 @@ HashList *GetRoomListHash(StrBuf *Target, WCTemplputParams *TP)
 
                                room->QRFlags = StrBufExtractNext_long(Buf, &Pos, '|');
                                room->floorid = StrBufExtractNext_int(Buf, &Pos, '|');
-                               room->listorder = StrBufExtractNext_long(Buf, &Pos, '|');
+                               room->Order = StrBufExtractNext_long(Buf, &Pos, '|');
                                room->QRFlags2 = StrBufExtractNext_long(Buf, &Pos, '|');
 
                                room->RAFlags = StrBufExtractNext_long(Buf, &Pos, '|');
@@ -277,13 +291,13 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
        long PutTo;
        long State;
        
-       WantThisOne = GetTemplateTokenNumber(Target, TP, 5, 0);
-       if (WantThisOne == 0)
+       WantThisOne = GetTemplateTokenNumber(Target, TP, 5, -1);
+       if ((WantThisOne < 0) || (WantThisOne > maxRoomNetCfg))
                return NULL;
-       if (WCC->CurRoom.IgnetCfgs[0] == (HashList*) StrBufNOTNULL)
+       if (WCC->CurRoom.IgnetCfgs[maxRoomNetCfg] == (HashList*) StrBufNOTNULL)
                return WCC->CurRoom.IgnetCfgs[WantThisOne];
 
-       WCC->CurRoom.IgnetCfgs[0] = (HashList*) StrBufNOTNULL;
+       WCC->CurRoom.IgnetCfgs[maxRoomNetCfg] = (HashList*) StrBufNOTNULL;
        serv_puts("GNET");
        Line = NewStrBuf();
        Token = NewStrBuf();
@@ -294,7 +308,7 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
                StrBuf_ServGetln(Line);
                StrBufExtract_NextToken(Token, Line, &Pos, '|');
                PutTo = GetTokenDefine(SKEY(Token), -1);
-               if ((PutTo > 0) && 
+               if ((PutTo >= 0) && 
                    (PutTo < maxRoomNetCfg) &&
                    (Pos != StrBufNOTNULL))
                {
@@ -302,13 +316,20 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
                        HashList *SubH;
 
                        if (WCC->CurRoom.IgnetCfgs[PutTo] == NULL)
+                       {
+                               n = 0;
                                WCC->CurRoom.IgnetCfgs[PutTo] = NewHash(1, NULL);
+                       }
+                       else 
+                       {
+                               n = GetCount(WCC->CurRoom.IgnetCfgs[PutTo]);
+                       }
                        SubH = NewHash(1, NULL);
-                       n = GetCount(WCC->CurRoom.IgnetCfgs[PutTo]) + 1;
                        Put(WCC->CurRoom.IgnetCfgs[PutTo], 
                            IKEY(n),
                            SubH, 
                            HDeleteHash);
+                       n = 0;
                        while (Pos != StrBufNOTNULL) {
                                Content = NewStrBuf();
                                StrBufExtract_NextToken(Content, Line, &Pos, '|');
@@ -316,6 +337,7 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
                                    IKEY(n),
                                    Content, 
                                    HFreeStrBuf);
+                               n++;
                        }
                }
        }
@@ -333,8 +355,8 @@ int SortRoomsByListOrder(const void *room1, const void *room2)
        folder *r1 = (folder*) GetSearchPayload(room1);
        folder *r2 = (folder*) GetSearchPayload(room2);
   
-       if (r1->listorder == r2->listorder) return 0;
-       if (r1->listorder > r2->listorder) return 1;
+       if (r1->Order == r2->Order) return 0;
+       if (r1->Order > r2->Order) return 1;
        return -1;
 }
 
@@ -526,6 +548,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) 
@@ -584,7 +614,7 @@ void tmplput_ROOM_FLOORID(StrBuf *Target, WCTemplputParams *TP)
 void tmplput_ROOM_LISTORDER(StrBuf *Target, WCTemplputParams *TP) 
 {
        folder *Folder = (folder *)CTX;
-       StrBufAppendPrintf(Target, "%d", Folder->listorder);
+       StrBufAppendPrintf(Target, "%d", Folder->Order);
 }
 void tmplput_ROOM_VIEW(StrBuf *Target, WCTemplputParams *TP) 
 {
@@ -697,6 +727,12 @@ 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)
 {
@@ -827,6 +863,7 @@ InitModule_ROOMLIST
        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_STRBUFARR, CTX_NONE, IT_NOFLAG);
@@ -834,10 +871,12 @@ InitModule_ROOMLIST
        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);