* GetNetConfigHash(): fix some edge cases
[citadel.git] / webcit / roomlist.c
index f4edff91ba0ccc492ed1001fb79c4291d4304e63..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;
@@ -153,6 +165,7 @@ void FlushFolder(folder *room)
                        FreeStrBuf(&room->RoomNameParts[i]);
                free(room->RoomNameParts);
        }
+       memset(room, 0, sizeof(folder));
 }
 
 void vDeleteFolder(void *vFolder)
@@ -201,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, '|');
@@ -278,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();
@@ -295,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))
                {
@@ -303,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, '|');
@@ -317,6 +337,7 @@ HashList *GetNetConfigHash(StrBuf *Target, WCTemplputParams *TP)
                                    IKEY(n),
                                    Content, 
                                    HFreeStrBuf);
+                               n++;
                        }
                }
        }
@@ -334,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;
 }
 
@@ -593,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) 
 {
@@ -706,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)
 {
@@ -836,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);
@@ -843,6 +871,8 @@ 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);