*/
void display_whok(void);
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP);
/*
* Initialize the viewdefs with localized strings
wDumpContent(1);
}
-
-/*
- * read this room's info file (set v to 1 for verbose mode)
- */
-void readinfo(StrBuf *Target, WCTemplputParams *TP)
-{
- char buf[256];
- char briefinfo[128];
- char fullinfo[8192];
- int fullinfo_len = 0;
-
- serv_puts("RINF");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '1') {
-
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- if (fullinfo_len < (sizeof fullinfo - sizeof buf)) {
- strcpy(&fullinfo[fullinfo_len], buf);
- fullinfo_len += strlen(buf);
- }
- }
-
- safestrncpy(briefinfo, fullinfo, sizeof briefinfo);
- strcpy(&briefinfo[50], "...");
-
- wc_printf("<div class=\"infos\" "
- "onclick=\"javascript:Effect.Appear('room_infos', { duration: 0.5 });\" "
- ">"
- );
- escputs(briefinfo);
- wc_printf("</div><div id=\"room_infos\" style=\"display:none;\">");
- wc_printf("<img class=\"close_infos\" "
- "onclick=\"javascript:Effect.Fade('room_infos', { duration: 0.5 });\" "
- "src=\"static/closewindow.gif\" alt=\"%s\" width=\"16\" height=\"16\">",
- _("Close window")
- );
- escputs(fullinfo);
- wc_printf("</div>");
- }
- else {
- wc_printf(" ");
- }
-}
-
-
-
-
-/*
- * Display room banner icon.
- * The server doesn't actually need the room name, but we supply it in
- * order to keep the browser from using a cached icon from another room.
- */
-void embed_room_graphic(StrBuf *Target, WCTemplputParams *TP)
-{
- char buf[SIZ];
-
- serv_puts("OIMG _roompic_");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '2') {
- wc_printf("<img height=\"64px\" src=\"image?name=_roompic_&room=");
- urlescputs(ChrPtr(WC->CurRoom.name));
- wc_printf("\">");
- serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
- }
- else if (WC->CurRoom.view == VIEW_ADDRESSBOOK) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/viewcontacts_48x.gif"
- "\" >"
- );
- }
- else if ( (WC->CurRoom.view == VIEW_CALENDAR) || (WC->CurRoom.view == VIEW_CALBRIEF) ) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/calarea_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_TASKS) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/taskmanag_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_NOTES) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/storenotes_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else if (WC->CurRoom.view == VIEW_MAILBOX) {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/privatemess_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
- else {
- wc_printf("<img class=\"roompic\" alt=\"\" src=\""
- "static/chatrooms_48x.gif"
- "\" width=\"48\" height=\"48\">"
- );
- }
-
-}
-
-
-
/*
* Display the current view and offer an option to change it
*/
}
-/*
- * Display a search box
- */
-void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP)
-{
- wc_printf("<form name=\"searchomatic\" action=\"do_search\">\n");
- wc_printf("<div style=\"display: inline;\"><input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
- wc_printf("<label for=\"srchquery\">");
- wc_printf(_("Search: "));
- wc_printf("</label><input ");
- wc_printf("%s", WC->serv_info->serv_fulltext_enabled ? "" : "disabled ");
- wc_printf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" class=\"inputbox\">\n"
- );
- wc_printf("</div></form>\n");
-}
-
/*
* Embed the room banner
extract_int(&got[4], 2),
with_files
);
- svcallback("ROOMPIC", embed_room_graphic);
- svcallback("ROOMINFO", readinfo);
svcallback("VIEWOMATIC", embed_view_o_matic);
- svcallback("SEARCHOMATIC", embed_search_o_matic);
- svcallback("START", offer_start_page);
do_template("roombanner", NULL);
/* roombanner contains this for mobile */
room->is_inbox = StrBufExtractNext_long(Line, &Pos, '|'); // is_mailbox
flag = StrBufExtractNext_long(Line, &Pos, '|');
- if (WCC->is_aide || flag)
+ if (WCC->is_aide || flag) {
room->RAFlags |= UA_ADMINALLOWED;
+ }
room->UsersNewMAilboxMessages = StrBufExtractNext_long(Line, &Pos, '|');
}
/* get a pointer to the floor we're on: */
+ if (WCC->Floors == NULL)
+ GetFloorListHash(NULL, NULL);
+
GetHash(WCC->Floors, IKEY(room->floorid), &vFloor);
room->Floor = (const Floor*) vFloor;
}
+void LoadRoomAide(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+
+ if (WCC->CurRoom.RoomAideLoaded)
+ return;
+
+ WCC->CurRoom.RoomAideLoaded = 1;
+ Buf = NewStrBuf();
+ serv_puts("GETA");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ FlushStrBuf(WCC->CurRoom.RoomAide);
+ AppendImportantMessage (ChrPtr(Buf) + 4,
+ StrLength(Buf) - 4);
+ } else {
+ const char *Pos;
+
+ Pos = ChrPtr(Buf) + 4;
+
+ FreeStrBuf(&WCC->CurRoom.RoomAide);
+ WCC->CurRoom.RoomAide = NewStrBufPlain (NULL, StrLength (Buf));
+
+ StrBufExtract_NextToken(WCC->CurRoom.RoomAide, Buf, &Pos, '|');
+ }
+ FreeStrBuf (&Buf);
+}
+void tmplput_CurrentRoomFloorName(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ folder *Folder = &WCC->CurRoom;
+ const Floor *pFloor = Folder->Floor;
+
+ if (pFloor == NULL)
+ return;
+
+ StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+}
+
+void tmplput_CurrentRoomAide(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomAide();
+
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0);
+}
+
+
+void LoadRoomXA (void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+
+ if (WCC->CurRoom.XALoaded)
+ return;
+
+ WCC->CurRoom.XALoaded = 1;
+ Buf = NewStrBuf();
+ serv_puts("GETA");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ FlushStrBuf(WCC->CurRoom.XAPass);
+ FlushStrBuf(WCC->CurRoom.Directory);
+
+ AppendImportantMessage (ChrPtr(Buf) + 4,
+ StrLength(Buf) - 4);
+ } else {
+ const char *Pos;
+
+ Pos = ChrPtr(Buf) + 4;
+
+ FreeStrBuf(&WCC->CurRoom.XAPass);
+ FreeStrBuf(&WCC->CurRoom.Directory);
+
+ WCC->CurRoom.XAPass = NewStrBufPlain (NULL, StrLength (Buf));
+ WCC->CurRoom.Directory = NewStrBufPlain (NULL, StrLength (Buf));
+
+ StrBufSkip_NTokenS(Buf, &Pos, '|', 1); /* The Name, we already know... */
+ StrBufExtract_NextToken(WCC->CurRoom.XAPass, Buf, &Pos, '|');
+ StrBufExtract_NextToken(WCC->CurRoom.Directory, Buf, &Pos, '|');
+ StrBufSkip_NTokenS(Buf, &Pos, '|', 2); /* QRFlags, FloorNum we already know... */
+ WCC->CurRoom.Order = StrBufExtractNext_long(Buf, &Pos, '|');
+ WCC->CurRoom.DefView = StrBufExtractNext_long(Buf, &Pos, '|');
+ /* QR2Flags, we already know them... */
+
+ }
+ FreeStrBuf (&Buf);
+}
+
+
+void LoadXRoomPic(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+
+ if (WCC->CurRoom.XHaveRoomPicLoaded)
+ return;
+
+ WCC->CurRoom.XHaveRoomPicLoaded = 1;
+ Buf = NewStrBuf();
+ serv_puts("OIMG _roompic_");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ WCC->CurRoom.XHaveRoomPic = 0;
+ } else {
+ WCC->CurRoom.XHaveRoomPic = 1;
+ }
+ serv_puts("CLOS");
+ StrBuf_ServGetln(Buf);
+ GetServerStatus(Buf, NULL);
+ FreeStrBuf (&Buf);
+}
+
+int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadXRoomPic();
+ return WCC->CurRoom.XHaveRoomPic == 1;
+}
+
+void LoadXRoomInfoText(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+ int Done = 0;
+
+ if (WCC->CurRoom.XHaveInfoTextLoaded)
+ return;
+
+ WCC->CurRoom.XHaveInfoTextLoaded = 1;
+ Buf = NewStrBuf();
+
+ serv_puts("RINF");
+
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+ WCC->CurRoom.XInfoText = NewStrBuf ();
+
+ while (!Done && StrBuf_ServGetln(Buf)>=0) {
+ if ( (StrLength(Buf)==3) &&
+ !strcmp(ChrPtr(Buf), "000"))
+ Done = 1;
+ else
+ StrBufAppendBuf(WCC->CurRoom.XInfoText, Buf, 0);
+ }
+ }
+
+ FreeStrBuf (&Buf);
+}
+
+int ConditionalThisRoomXHaveInfoText(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadXRoomInfoText();
+ return (StrLength(WCC->CurRoom.XInfoText)>0);
+}
+
+void tmplput_CurrentRoomInfoText(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomInfoText();
+
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 1);
+}
+
+void LoadXRoomXCountFiles(void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+ int Done = 0;
+
+ if (WCC->CurRoom.XHaveDownloadCount)
+ return;
+
+ WCC->CurRoom.XHaveDownloadCount = 1;
+
+ Buf = NewStrBuf();
+ serv_puts("RDIR");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) == 1) {
+
+ while (!Done && StrBuf_ServGetln(Buf)>=0) {
+ if ( (StrLength(Buf)==3) &&
+ !strcmp(ChrPtr(Buf), "000"))
+ Done = 1;
+ else
+ WCC->CurRoom.XDownloadCount++;
+ }
+ }
+
+ FreeStrBuf (&Buf);
+}
+
+void tmplput_CurrentRoomXNFiles(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomXCountFiles();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount);
+}
+
+void tmplput_CurrentRoomX_FileString(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadXRoomXCountFiles();
+
+ if (WCC->CurRoom.XDownloadCount == 1)
+ StrBufAppendBufPlain(Target, _("file"), -1, 0);
+ else
+ StrBufAppendBufPlain(Target, _("files"), -1, 0);
+}
+
+void tmplput_CurrentRoomPass(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 0);
+}
+void tmplput_CurrentRoomDirectory(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.Directory, 0);
+}
+void tmplput_CurrentRoomOrder(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.Order);
+}
+void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.DefView);
+}
+
+void tmplput_CurrentRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages);
+}
+
+void tmplput_CurrentRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ LoadRoomXA();
+
+ StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages);
+}
+
+int ConditionalThisRoomOrder(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ long CheckThis;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadRoomXA();
+
+ CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+ return CheckThis == WCC->CurRoom.Order;
+}
+
+int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ long CheckThis;
+
+ if (WCC == NULL)
+ return 0;
+
+ LoadRoomXA();
+
+ CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+ return CheckThis == WCC->CurRoom.DefView;
+}
+
+
+
+
/*
* goto next room
wc_printf("</td>\n");
wc_printf("<td> </td>\n");
- if ( (WC->axlevel >= 6) || (WC->is_room_aide) ) {
+ if ( ConditionalHaveRoomeditRights(NULL, NULL)) {
wc_printf("<td class=\"");
if (!strcmp(tab, "config")) {
serv_getln(buf, sizeof buf);
WCC->CurRoom.view = er_view;
- if (WCC->is_aide || WCC->is_room_aide)
+ if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ) {
display_editroom ();
- else
+ } else {
do_change_view(er_view); /* Now go there */
+ }
}
int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
- return (WCC != NULL)? (WCC->is_room_aide == 0) : 0;
+ return (WCC != NULL)?
+ ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0;
}
int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
return (WCC == NULL)? 0 :
- ( (WCC->is_room_aide) || /////TODO!
+ ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
(WCC->CurRoom.is_inbox) ||
(WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) );
}
(strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0));
}
+
+int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP)
+{
+ folder *Folder = (folder *)(TP->Context);
+ long UA_CheckFlag;
+
+ UA_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if (UA_CheckFlag == 0)
+ LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+ "requires one of the #\"UA_*\"- defines or an integer flag 0 is invalid!");
+
+ return ((Folder->RAFlags & UA_CheckFlag) != 0);
+}
+
+
+
int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
{
long QR_CheckFlag;
return ( (WCC!= NULL) &&
((WCC->axlevel >= 6) ||
- (WCC->is_room_aide) ||
+ ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
(WCC->CurRoom.is_inbox) ));
}
if ((WCC == NULL) ||
(TP->Tokens->nParameters < 3))
- return 0;
+ {
+ return ((WCC->CurRoom.view < VIEW_BBS) ||
+ (WCC->CurRoom.view > VIEW_MAX));
+ }
+
return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
}
+
+HashList *GetWhoKnowsHash(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ StrBuf *Line;
+ StrBuf *Token;
+ long State;
+ HashList *Whok = NULL;
+ int Done = 0;
+ int n;
+
+ serv_puts("WHOK");
+ Line = NewStrBuf();
+ Token = NewStrBuf();
+ StrBuf_ServGetln(Line);
+ if (GetServerStatus(Line, &State) == 1)
+ {
+ Whok = NewHash(1, Flathash);
+ while(!Done && StrBuf_ServGetln(Line))
+ if ( (StrLength(Line)==3) &&
+ !strcmp(ChrPtr(Line), "000"))
+ {
+ Done = 1;
+ }
+ else
+ {
+
+ const char *Pos = NULL;
+ Token = NewStrBufPlain (NULL, StrLength(Line));
+ StrBufExtract_NextToken(Token, Line, &Pos, '|');
+
+ Put(Whok,
+ IKEY(n),
+ Token,
+ HFreeStrBuf);
+ }
+ }
+ else if (State == 550)
+ StrBufAppendBufPlain(WCC->ImportantMsg,
+ _("Higher access is required to access this function."), -1, 0);
+
+
+ return Whok;
+}
+
void
InitModule_ROOMOPS
(void)
{
+ initialize_viewdefs();
RegisterPreference("roomlistview",
_("Room list view"),
PRF_STRING,
RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, NULL, CTX_NONE);
+
WebcitAddUrlHandler(HKEY("knrooms"), "", 0, knrooms, 0);
WebcitAddUrlHandler(HKEY("dotgoto"), "", 0, dotgoto, NEED_URL);
WebcitAddUrlHandler(HKEY("dotskip"), "", 0, dotskip, NEED_URL);
RegisterConditional(HKEY("COND:THISROOM:FLAG:QR2"), 0, ConditionalCurrentRoomHas_QRFlag2, CTX_NONE);
RegisterConditional(HKEY("COND:ROOM:FLAG:QR2"), 0, ConditionalRoomHas_QRFlag2, CTX_ROOMS);
+ RegisterConditional(HKEY("COND:ROOM:FLAG:UA"), 0, ConditionalRoomHas_UAFlag, CTX_ROOMS);
+
+ RegisterIterator("ITERATE:THISROOM:WHO_KNOWS", 0, NULL, GetWhoKnowsHash, NULL, DeleteHash, CTX_STRBUF, CTX_NONE, IT_NOFLAG);
+ RegisterNamespace("THISROOM:MSGS:NEW", 0, 0, tmplput_CurrentRoom_nNewMessages, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:MSGS:TOTAL", 0, 0, tmplput_CurrentRoom_nTotalMessages, NULL, CTX_NONE);
+
+ RegisterNamespace("THISROOM:FLOOR:NAME", 0, 1, tmplput_CurrentRoomFloorName, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:AIDE", 0, 1, tmplput_CurrentRoomAide, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:PASS", 0, 1, tmplput_CurrentRoomPass, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:DIRECTORY", 0, 1, tmplput_CurrentRoomDirectory, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:ORDER", 0, 0, tmplput_CurrentRoomOrder, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:DEFAULT_VIEW", 0, 0, tmplput_CurrentRoomDefView, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:INFOTEXT", 1, 2, tmplput_CurrentRoomInfoText, NULL, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:ORDER"), 0, ConditionalThisRoomOrder, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:DEFAULT_VIEW"), 0, ConditionalThisRoomDefView, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_PIC"), 0, ConditionalThisRoomXHavePic, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_INFOTEXT"), 0, ConditionalThisRoomXHaveInfoText, CTX_NONE);
+ RegisterNamespace("THISROOM:FILES:N", 0, 1, tmplput_CurrentRoomXNFiles, NULL, CTX_NONE);
+ RegisterNamespace("THISROOM:FILES:STR", 0, 1, tmplput_CurrentRoomX_FileString, NULL, CTX_NONE);
REGISTERTokenParamDefine(QR_PERMANENT);
REGISTERTokenParamDefine(QR_INUSE);
REGISTERTokenParamDefine(VIEW_JOURNAL);
REGISTERTokenParamDefine(VIEW_BLOG);
-
+ /* GNET types: */
REGISTERTokenParamDefine(ignet_push_share);
+ { /* these are the parts of an IGNET push config */
+ REGISTERTokenParamDefine(GNET_IGNET_NODE);
+ REGISTERTokenParamDefine(GNET_IGNET_ROOM);
+ }
REGISTERTokenParamDefine(listrecp);
REGISTERTokenParamDefine(digestrecp);
REGISTERTokenParamDefine(pop3client);
+ { /* These are the parts of a pop3 client line... */
+ REGISTERTokenParamDefine(GNET_POP3_HOST);
+ REGISTERTokenParamDefine(GNET_POP3_USER);
+ REGISTERTokenParamDefine(GNET_POP3_DONT_DELETE_REMOTE);
+ REGISTERTokenParamDefine(GNET_POP3_INTERVAL);
+ }
REGISTERTokenParamDefine(rssclient);
REGISTERTokenParamDefine(participate);
free_march_list(sess);
DeleteHash(&sess->Floors);
+ DeleteHash(&sess->Rooms);
+ DeleteHash(&sess->FloorsByName);
}
+
+
/*@}*/