const char *Err;
StrBuf *Buf;
HashList *floors;
+ HashList *floorsbyname;
HashPos *it;
Floor *pFloor;
void *vFloor;
if (WCC->Floors != NULL)
return WCC->Floors;
WCC->Floors = floors = NewHash(1, Flathash);
+ WCC->FloorsByName = floorsbyname = NewHash(1, NULL);
Buf = NewStrBuf();
pFloor = (Floor*) malloc(sizeof(Floor));
pFloor->NRooms = 0;
Put(floors, IKEY(pFloor->ID), pFloor, DeleteFloor);
+ Put(floorsbyname, SKEY(pFloor->Name), pFloor, reference_free_handler);
serv_puts("LFLR"); /* get floors */
StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err); /* '100', we hope */
pFloor->NRooms = StrBufExtractNext_long(Buf, &Pos, '|');
Put(floors, IKEY(pFloor->ID), pFloor, DeleteFloor);
+ Put(floorsbyname, SKEY(pFloor->Name), pFloor, reference_free_handler);
}
}
FreeStrBuf(&Buf);
void tmplput_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP)
{
- Floor *pFloor = (Floor *)(TP->Context);
+ Floor *myFloor = (Floor *)CTX;
- StrBufAppendPrintf(Target, "%d", pFloor->ID);
+ StrBufAppendPrintf(Target, "%d", myFloor->ID);
}
void tmplput_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP)
{
- Floor *pFloor = (Floor *)(TP->Context);
+ Floor *myFloor = (Floor *)CTX;
- StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+ StrBufAppendTemplate(Target, TP, myFloor->Name, 0);
}
void tmplput_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP)
{
- Floor *pFloor = (Floor *)(TP->Context);
+ Floor *myFloor = (Floor *)CTX;
- StrBufAppendPrintf(Target, "%d", pFloor->NRooms);
+ StrBufAppendPrintf(Target, "%d", myFloor->NRooms);
}
HashList *GetRoomListHashLKRA(StrBuf *Target, WCTemplputParams *TP)
{
if (WCC->Floors == NULL)
GetFloorListHash(Target, TP);
serv_puts("LKRA");
- return GetRoomListHash(Target, TP);
+ if (WCC->Rooms == NULL)
+ WCC->Rooms = GetRoomListHash(Target, TP);
+ return WCC->Rooms;
}
void FlushFolder(folder *room)
void tmplput_ROOM_NAME(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendTemplate(Target, TP, Folder->name, 0);
}
void tmplput_ROOM_BASENAME(StrBuf *Target, WCTemplputParams *TP)
{
- folder *room = (folder *)(TP->Context);
+ folder *room = (folder *)CTX;
if (room->nRoomNameParts > 1)
StrBufAppendTemplate(Target, TP,
}
void tmplput_ROOM_LEVEL_N_TIMES(StrBuf *Target, WCTemplputParams *TP)
{
- folder *room = (folder *)(TP->Context);
+ folder *room = (folder *)CTX;
int i;
const char *AppendMe;
long AppendMeLen;
void tmplput_ROOM_ACL(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%ld", Folder->RAFlags, 0);
}
void tmplput_ROOM_QRFLAGS(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->QRFlags);
}
void tmplput_ROOM_FLOORID(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->floorid);
}
void tmplput_ROOM_LISTORDER(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->listorder);
}
void tmplput_ROOM_VIEW(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->view);
}
void tmplput_ROOM_DEFVIEW(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->defview);
}
void tmplput_ROOM_LASTCHANGE(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
StrBufAppendPrintf(Target, "%d", Folder->lastchange);
}
void tmplput_ROOM_FLOOR_ID(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
const Floor *pFloor = Folder->Floor;
if (pFloor == NULL)
void tmplput_ROOM_FLOOR_NAME(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
const Floor *pFloor = Folder->Floor;
if (pFloor == NULL)
void tmplput_ROOM_FLOOR_NROOMS(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
const Floor *pFloor = Folder->Floor;
if (pFloor == NULL)
int ConditionalRoomHas_UA_KNOWN(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_KNOWN) != 0;
}
int ConditionalRoomHas_UA_GOTOALLOWED(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_GOTOALLOWED) != 0;
}
int ConditionalRoomHas_UA_HASNEWMSGS(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_HASNEWMSGS) != 0;
}
int ConditionalRoomHas_UA_ZAPPED(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_ZAPPED) != 0;
}
int ConditionalRoomHas_UA_POSTALLOWED(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_POSTALLOWED) != 0;
}
int ConditionalRoomHas_UA_ADMINALLOWED(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_ADMINALLOWED) != 0;
}
int ConditionalRoomHas_UA_DELETEALLOWED(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return (Folder->RAFlags & UA_DELETEALLOWED) != 0;
}
int ConditionalRoomIsInbox(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
return Folder->is_inbox;
}
void tmplput_ROOM_COLLECTIONTYPE(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
switch(Folder->view) {
case VIEW_CALENDAR:
case VIEW_JOURNAL:
StrBufAppendBufPlain(Target, HKEY("vjournal"), 0);
break;
+ case VIEW_WIKI:
+ StrBufAppendBufPlain(Target, HKEY("wiki"), 0);
+ break;
}
}
int ConditionalRoomHasGroupdavContent(StrBuf *Target, WCTemplputParams *TP)
{
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
+
+ lprintf(0, "-> %s: %ld\n", ChrPtr(Folder->name), Folder->view);
return ((Folder->view == VIEW_CALENDAR) ||
(Folder->view == VIEW_TASKS) ||
int ConditionalFloorIsRESTSubFloor(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
-
- /** If we have dav_depth the client just wants the _current_ room without subfloors */
- if (WCC->Hdr->HR.dav_depth == 0)
- return 0;
-
- return 1;
+ Floor *MyFloor = (Floor *)CTX;
+ /** if we have dav_depth the client just wants the subfloors */
+ if ((WCC->Hdr->HR.dav_depth == 1) &&
+ (GetCount(WCC->Directory) == 0))
+ return 1;
+ return WCC->CurrentFloor == MyFloor;
}
int ConditionalRoomIsRESTSubRoom(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
- folder *Folder = (folder *)(TP->Context);
+ folder *Folder = (folder *)CTX;
HashPos *it;
StrBuf * Dir;
void *vDir;
long len;
const char *Key;
- int i;
-
+ int i, j, urlp;
+ int delta;
+ /* list only folders relative to the current floor... */
if (Folder->Floor != WCC->CurrentFloor)
return 0;
- if (GetCount(WCC->Directory) != Folder->nRoomNameParts)
+ urlp = GetCount(WCC->Directory);
+ delta = Folder->nRoomNameParts - urlp + 1;
+
+ lprintf(0, "\n->%s: %ld - %ld ", ChrPtr(Folder->name), urlp,
+ Folder->nRoomNameParts);
+ /* list only the floors which are in relation to the dav_depth header */
+ if (WCC->Hdr->HR.dav_depth != delta) {
+ lprintf(0, "1\n");
return 0;
+ }
+
it = GetNewHashPos(WCC->Directory, 0);
- for (i = 0; i < Folder->nRoomNameParts; i++)
- {
- if (!GetNextHashPos(WCC->Directory, it, &len, &Key, &vDir) ||
- (vDir == NULL))
+ /* Fast forward the floorname we checked above... */
+ GetNextHashPos(WCC->Directory, it, &len, &Key, &vDir);
+
+ if (Folder->nRoomNameParts > 1) {
+ for (i = 0, j = 1;
+ (i > Folder->nRoomNameParts) && (j > urlp);
+ i++, j++)
{
- DeleteHashPos(&it);
- return 0;
+ if (!GetNextHashPos(WCC->Directory,
+ it, &len, &Key, &vDir) ||
+ (vDir == NULL))
+ {
+ DeleteHashPos(&it);
+
+ lprintf(0, "3\n");
+ return 0;
+ }
+ Dir = (StrBuf*) vDir;
+ if (strcmp(ChrPtr(Folder->RoomNameParts[i]),
+ ChrPtr(Dir)) != 0)
+ {
+ DeleteHashPos(&it);
+ lprintf(0, "4\n");
+ return 0;
+ }
}
- Dir = (StrBuf*) vDir;
- if (strcmp(ChrPtr(Folder->RoomNameParts[i]),
- ChrPtr(Dir)) != 0)
+ DeleteHashPos(&it);
+ return 1;
+ }
+ else {
+ if (!GetNextHashPos(WCC->Directory,
+ it, &len, &Key, &vDir) ||
+ (vDir == NULL))
{
DeleteHashPos(&it);
- return 0;
+
+ lprintf(0, "5\n");
+ return WCC->Hdr->HR.dav_depth == 1;
}
- }
- DeleteHashPos(&it);
+ DeleteHashPos(&it);
+ Dir = (StrBuf*) vDir;
+ if (WCC->Hdr->HR.dav_depth == 0) {
+ return (strcmp(ChrPtr(Folder->name),
+ ChrPtr(Dir))
+ == 0);
- /** If we have dav_depth the client just wants the _current_ room without subfloors */
- if ((WCC->Hdr->HR.dav_depth == 0) &&
- (i != Folder->nRoomNameParts))
+ }
return 0;
-
- return 1;
+ }
}
end_burst();
}
+
void
SessionDetachModule_ROOMLIST
(wcsession *sess)
{
DeleteHash(&sess->Floors);
+ DeleteHash(&sess->Rooms);
+ DeleteHash(&sess->FloorsByName);
}
-
void
InitModule_ROOMLIST
(void)
RegisterIterator("LFLR", 0, NULL, GetFloorListHash, NULL, NULL, CTX_FLOORS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
- RegisterIterator("LKRA", 0, NULL, GetRoomListHashLKRA, NULL, DeleteHash, CTX_ROOMS, CTX_NONE, IT_FLAG_DETECT_GROUPCHANGE);
+ RegisterIterator("LKRA", 0, NULL, GetRoomListHashLKRA, NULL, NULL, 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);