X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Froomops.c;h=eaf928e9e07a93d3caede1cd84191139ef65193b;hb=c36dda02a2ef9abccff593fe60f67d324ec9fc0a;hp=f8664cf156dd673da228bfac61557080fa699d24;hpb=3d5b49aae445e1178110a721aaebd9dbe71c4b53;p=citadel.git
diff --git a/webcit/roomops.c b/webcit/roomops.c
index f8664cf15..eaf928e9e 100644
--- a/webcit/roomops.c
+++ b/webcit/roomops.c
@@ -6,41 +6,47 @@
#include "webcit.h"
#include "webserver.h"
#define MAX_FLOORS 128
-char floorlist[MAX_FLOORS][SIZ]; /**< list of our floor names */
-
-char *viewdefs[9]; /**< the different kinds of available views */
-
-/** See GetFloorListHash and GetRoomListHash for info on these. Basically we pull LFLR/LKRA etc. and set up a room HashList with these keys. */
-const char FLOOR_PARAM_NAMES[(FLOOR_PARAM_LEN + 1)][15] = {"ID",
- "NAME",
- "ROOMS"};
-const char ROOM_PARAM_NAMES[(ROOM_PARAM_LEN + 1)][20] = {"NAME",
- "FLAG",
- "FLOOR",
- "LISTORDER",
- "ACL",
- "CURVIEW",
- "DEFVIEW",
- "LASTCHANGE"};
-/* Because avoiding strlen at run time is a Good Thing(TM) */
-const int FLOOR_PARAM_NAMELEN[(FLOOR_PARAM_LEN +1)] = {2, 4, 5};
-const int ROOM_PARAM_NAMELEN[(ROOM_PARAM_LEN +1)] = {4, 4, 5, 9, 3, 7, 7, 8};
+
+char floorlist[MAX_FLOORS][SIZ]; /* list of our floor names */
+
+/* See GetFloorListHash and GetRoomListHash for info on these.
+ * Basically we pull LFLR/LKRA etc. and set up a room HashList with these keys.
+ */
void display_whok(void);
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP);
+
+
+char *viewdefs[VIEW_MAX]; /* the different kinds of available views */
+
+ROOM_VIEWS exchangeable_views[VIEW_MAX][VIEW_MAX] = { /* the different kinds of available views for a view */
+{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_BBS, VIEW_MAILBOX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_ADDRESSBOOK, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX /*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_TASKS, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_NOTES, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_WIKI, VIEW_MAX, VIEW_MAX, VIEW_MAX},
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_CALENDAR, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX/*VIEW_CALBRIEF*/, VIEW_MAX, VIEW_MAX},
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_JOURNAL, VIEW_MAX },
+{VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_MAX, VIEW_BLOG },
+ };
+/* the brief calendar view is disabled: VIEW_CALBRIEF */
/*
* Initialize the viewdefs with localized strings
*/
void initialize_viewdefs(void) {
- viewdefs[0] = _("Bulletin Board");
- viewdefs[1] = _("Mail Folder");
- viewdefs[2] = _("Address Book");
- viewdefs[3] = _("Calendar");
- viewdefs[4] = _("Task List");
- viewdefs[5] = _("Notes List");
- viewdefs[6] = _("Wiki");
- viewdefs[7] = _("Calendar List");
- viewdefs[8] = _("Journal");
+ viewdefs[VIEW_BBS] = _("Bulletin Board");
+ viewdefs[VIEW_MAILBOX] = _("Mail Folder");
+ viewdefs[VIEW_ADDRESSBOOK] = _("Address Book");
+ viewdefs[VIEW_CALENDAR] = _("Calendar");
+ viewdefs[VIEW_TASKS] = _("Task List");
+ viewdefs[VIEW_NOTES] = _("Notes List");
+ viewdefs[VIEW_WIKI] = _("Wiki");
+ viewdefs[VIEW_CALBRIEF] = _("Calendar List");
+ viewdefs[VIEW_JOURNAL] = _("Journal");
+ viewdefs[VIEW_BLOG] = _("Blog");
}
/*
@@ -49,22 +55,16 @@ void initialize_viewdefs(void) {
int is_view_allowed_as_default(int which_view)
{
switch(which_view) {
- case VIEW_BBS: return(1);
- case VIEW_MAILBOX: return(1);
- case VIEW_ADDRESSBOOK: return(1);
- case VIEW_CALENDAR: return(1);
- case VIEW_TASKS: return(1);
- case VIEW_NOTES: return(1);
-
-#ifdef TECH_PREVIEW
- case VIEW_WIKI: return(1);
-#else /* TECH_PREVIEW */
- case VIEW_WIKI: return(0); /* because it isn't finished yet */
-#endif /* TECH_PREVIEW */
-
- case VIEW_CALBRIEF: return(0);
- case VIEW_JOURNAL: return(0);
- default: return(0); /* should never get here */
+ case VIEW_BBS: return(1);
+ case VIEW_MAILBOX: return(1);
+ case VIEW_ADDRESSBOOK: return(1);
+ case VIEW_CALENDAR: return(1);
+ case VIEW_TASKS: return(1);
+ case VIEW_NOTES: return(1);
+ case VIEW_WIKI: return(1);
+ case VIEW_CALBRIEF: return(0);
+ case VIEW_JOURNAL: return(0);
+ default: return(0); /* should never get here */
}
}
@@ -72,68 +72,27 @@ int is_view_allowed_as_default(int which_view)
/*
* load the list of floors
*/
-void load_floorlist(void)
+void load_floorlist(StrBuf *Buf)
{
int a;
- char buf[SIZ];
+ int Done = 0;
for (a = 0; a < MAX_FLOORS; ++a)
floorlist[a][0] = 0;
serv_puts("LFLR");
- serv_getln(buf, sizeof buf);
- if (buf[0] != '1') {
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 1) {
strcpy(floorlist[0], "Main Floor");
return;
}
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- extract_token(floorlist[extract_int(buf, 0)], buf, 1, '|', sizeof floorlist[0]);
- }
-}
-
-
-/*
- * Free a session's march list
- */
-void free_march_list(wcsession *wcf)
-{
- struct march *mptr;
-
- while (wcf->march != NULL) {
- mptr = wcf->march->next;
- free(wcf->march);
- wcf->march = mptr;
- }
-
-}
-
-
-
-/*
- * remove a room from the march list
- */
-void remove_march(const StrBuf *aaa)
-{
- struct march *mptr, *mptr2;
-
- if (WC->march == NULL)
- return;
-
- if (!strcasecmp(WC->march->march_name, ChrPtr(aaa))) {
- mptr = WC->march->next;
- free(WC->march);
- WC->march = mptr;
- return;
- }
- mptr2 = WC->march;
- for (mptr = WC->march; mptr != NULL; mptr = mptr->next) {
- if (!strcasecmp(mptr->march_name, ChrPtr(aaa))) {
- mptr2->next = mptr->next;
- free(mptr);
- mptr = mptr2;
- } else {
- mptr2 = mptr;
+ while (!Done && (StrBuf_ServGetln(Buf)>=0)) {
+ if ( (StrLength(Buf)==3) &&
+ !strcmp(ChrPtr(Buf), "000")) {
+ Done = 1;
+ break;
}
+ extract_token(floorlist[StrBufExtract_int(Buf, 0, '|')], ChrPtr(Buf), 1, '|', sizeof floorlist[0]);
}
}
@@ -157,31 +116,28 @@ void room_tree_list(struct roomlisting *rp)
strcpy(rmname, rp->rlname);
f = rp->rlflags;
- wprintf("");
+ wc_printf("\"");
+ wc_printf(">");
escputs1(rmname, 1, 1);
if ((f & QR_DIRECTORY) && (f & QR_NETWORK))
- wprintf("}");
+ wc_printf("}");
else if (f & QR_DIRECTORY)
- wprintf("]");
+ wc_printf("]");
else if (f & QR_NETWORK)
- wprintf(")");
+ wc_printf(")");
else
- wprintf(">");
- wprintf(" \n");
+ wc_printf(">");
+ wc_printf(" \n");
room_tree_list(rp->rnext);
free(rp);
}
-/**
- * \brief Room ordering stuff (compare first by floor, then by order)
- * \param r1 first roomlist to compare
- * \param r2 second roomlist co compare
- * \return are they the same???
+/*
+ * Room ordering stuff (compare first by floor, then by order)
*/
int rordercmp(struct roomlisting *r1, struct roomlisting *r2)
{
@@ -203,9 +159,8 @@ int rordercmp(struct roomlisting *r1, struct roomlisting *r2)
}
-/**
- * \brief Common code for all room listings
- * \param variety what???
+/*
+ * Common code for all room listings
*/
void listrms(char *variety)
{
@@ -216,11 +171,11 @@ void listrms(char *variety)
struct roomlisting *rp;
struct roomlisting *rs;
- /** Ask the server for a room list */
+ /* Ask the server for a room list */
serv_puts(variety);
serv_getln(buf, sizeof buf);
if (buf[0] != '1') {
- wprintf(" ");
+ wc_printf(" ");
return;
}
@@ -259,16 +214,16 @@ void listrms(char *variety)
room_tree_list(rl);
- /**
+ /*
* If no rooms were listed, print an nbsp to make the cell
* borders show up anyway.
*/
- if (num_rooms == 0) wprintf(" ");
+ if (num_rooms == 0) wc_printf(" ");
}
-/**
- * \brief list all forgotten rooms
+/*
+ * list all forgotten rooms
*/
void zapped_list(void)
{
@@ -286,228 +241,108 @@ void zapped_list(void)
listrms("LZRM -1");
- wprintf(" \n");
- wprintf(_("Click on any room to un-zap it and goto that room.\n"));
+ wc_printf(" \n");
+ wc_printf(_("Click on any room to un-zap it and goto that room.\n"));
do_template("endbox", NULL);
wDumpContent(1);
}
-
-/**
- * \brief 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], "...");
-
- wprintf("
");
- escputs(briefinfo);
- wprintf("
");
- wprintf("
",
- _("Close window")
- );
- escputs(fullinfo);
- wprintf("
");
- }
- else {
- wprintf(" ");
- }
-}
-
-
-
-
-/**
- * \brief 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') {
- wprintf(" wc_roomname));
- wprintf("\">");
- serv_puts("CLOS");
- serv_getln(buf, sizeof buf);
- }
- else if (WC->wc_view == VIEW_ADDRESSBOOK) {
- wprintf(" "
- );
- }
- else if ( (WC->wc_view == VIEW_CALENDAR) || (WC->wc_view == VIEW_CALBRIEF) ) {
- wprintf(" "
- );
- }
- else if (WC->wc_view == VIEW_TASKS) {
- wprintf(" "
- );
- }
- else if (WC->wc_view == VIEW_NOTES) {
- wprintf(" "
- );
- }
- else if (WC->wc_view == VIEW_MAILBOX) {
- wprintf(" "
- );
- }
- else {
- wprintf(" "
- );
- }
-
-}
-
-
-
-/**
- * \brief Display the current view and offer an option to change it
+/*
+ * Display the current view and offer an option to change it
*/
void embed_view_o_matic(StrBuf *Target, WCTemplputParams *TP)
{
int i;
- wprintf("\n");
}
-/**
- * \brief Display a search box
- */
-void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP)
-{
- wprintf("\n");
- wprintf(" \n", WC->nonce);
- wprintf("");
- wprintf(_("Search: "));
- wprintf(" serv_info->serv_fulltext_enabled ? "" : "disabled ");
- wprintf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" class=\"inputbox\">\n"
- );
- wprintf("
\n");
-}
-
-/**
- * \brief Embed the room banner
+/*
+ * Embed the room banner
*
- * \param got The information returned from a GOTO server command
- * \param navbar_style Determines which navigation buttons to display
+ * got The information returned from a GOTO server command
+ * navbar_style Determines which navigation buttons to display
*
*/
void embed_room_banner(char *got, int navbar_style) {
+ wcsession *WCC = WC;
char buf[256];
char buf2[1024];
char with_files[256];
int file_count=0;
- /**
+ /*
* We need to have the information returned by a GOTO server command.
* If it isn't supplied, we fake it by issuing our own GOTO.
*/
if (got == NULL) {
memset(buf, '0', 20);
buf[20] = '\0';
- serv_printf("GOTO %s", ChrPtr(WC->wc_roomname));
+ serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name));
serv_getln(buf, sizeof buf);
got = buf;
}
- /** The browser needs some information for its own use */
- wprintf("\n",
- WC->wc_is_trash
- );
+ /* The browser needs some information for its own use */
+ wc_printf("\n",
+ ((WC->CurRoom.RAFlags & UA_ISTRASH) != 0)
+ );
- /**
+ /*
* If the user happens to select the "make this my start page" link,
* we want it to remember the URL as a "/dotskip" one instead of
* a "skip" or "gotonext" or something like that.
*/
- if (WC->this_page == NULL)
- WC->this_page = NewStrBuf();
- StrBufPrintf(WC->this_page,
- "dotskip&room=%s",
- ChrPtr(WC->wc_roomname));
+ if (WCC->Hdr->this_page == NULL) {
+ WCC->Hdr->this_page = NewStrBuf();
+ }
+ StrBufPrintf(WCC->Hdr->this_page,
+ "dotskip?room=%s",
+ ChrPtr(WC->CurRoom.name)
+ );
- /** Check for new mail. */
+ /* Check for new mail. */
WC->new_mail = extract_int(&got[4], 9);
- WC->wc_view = extract_int(&got[4], 11);
+ WC->CurRoom.view = extract_int(&got[4], 11);
/* Is this a directory room and does it contain files and how many? */
- if ((WC->room_flags & QR_DIRECTORY) && (WC->room_flags & QR_VISDIR))
+ if ((WC->CurRoom.QRFlags & QR_DIRECTORY) && (WC->CurRoom.QRFlags & QR_VISDIR))
{
serv_puts("RDIR");
serv_getln(buf2, sizeof buf2);
@@ -527,130 +362,126 @@ void embed_room_banner(char *got, int navbar_style) {
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 */
- if (navbar_style != navbar_none && !WC->is_mobile) {
+ if (navbar_style != navbar_none && (WC->is_mobile < 1)) {
- wprintf("");
+ wc_printf("");
- if (navbar_style == navbar_default) wprintf(
+ if (navbar_style == navbar_default) wc_printf(
""
""
- " "
+ " "
"%s "
" \n", _("Ungoto")
);
- if ( (navbar_style == navbar_default) && (WC->wc_view == VIEW_BBS) ) {
- wprintf(
+ if ( (navbar_style == navbar_default) && (WC->CurRoom.view == VIEW_BBS) ) {
+ wc_printf(
""
""
- " "
+ " "
"%s "
" \n", _("Read new messages")
);
}
if (navbar_style == navbar_default) {
- switch(WC->wc_view) {
+ switch(WC->CurRoom.view) {
case VIEW_ADDRESSBOOK:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("View contacts")
);
break;
case VIEW_CALENDAR:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Day view")
);
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Month view")
);
break;
case VIEW_CALBRIEF:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Calendar list")
);
break;
case VIEW_TASKS:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("View tasks")
);
break;
case VIEW_NOTES:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("View notes")
);
break;
case VIEW_MAILBOX:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Refresh message list")
);
break;
case VIEW_WIKI:
- wprintf(
+ wc_printf(
""
- ""
+ " "
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Wiki home")
);
break;
default:
- wprintf(
+ wc_printf(
""
""
" "
+ "alt=\"\" width=\"24\" height=\"24\">"
""
"%s"
" \n", _("Read all messages")
@@ -660,86 +491,121 @@ void embed_room_banner(char *got, int navbar_style) {
}
if (navbar_style == navbar_default) {
- switch(WC->wc_view) {
+ switch(WC->CurRoom.view) {
case VIEW_ADDRESSBOOK:
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Add new contact")
);
break;
case VIEW_CALENDAR:
case VIEW_CALBRIEF:
- wprintf(""
+ wc_printf(""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Add new event")
);
break;
case VIEW_TASKS:
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Add new task")
);
break;
case VIEW_NOTES:
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Add new note")
);
break;
case VIEW_WIKI:
safestrncpy(buf, bstr("page"), sizeof buf);
+ if (IsEmptyStr(buf)) {
+ safestrncpy(buf, "home", sizeof buf);
+ }
str_wiki_index(buf);
- wprintf(
+ wc_printf(
""
- ""
+ " "
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", buf, _("Edit this page")
);
+
+ if (bmstrcasestr((char *)ChrPtr(WCC->Hdr->HR.ReqLine), "wiki_history")) {
+ /* already viewing history; display a link to the current page */
+ wc_printf(
+ ""
+ ""
+ " "
+ ""
+ "%s"
+ " \n", buf, _("Current version")
+ );
+ }
+ else {
+ /* display a link to the history */
+ wc_printf(
+ ""
+ ""
+ " "
+ ""
+ "%s"
+ " \n", buf, _("History")
+ );
+ }
break;
case VIEW_MAILBOX:
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Write mail")
);
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
"%s"
" \n", _("Delete")
);
break;
default:
- wprintf(
+ wc_printf(
""
""
""
+ "alt=\"\" width=\"24\" height=\"24\">"
+ ""
"%s"
" \n", _("Enter a message")
);
@@ -747,29 +613,31 @@ void embed_room_banner(char *got, int navbar_style) {
}
}
- if (navbar_style == navbar_default) wprintf(
+ if (navbar_style == navbar_default) wc_printf(
""
""
- " "
+ " "
"%s "
" \n",
_("Leave all messages marked as unread, go to next room with unread messages"),
_("Skip this room")
);
- if (navbar_style == navbar_default) wprintf(
+ if (navbar_style == navbar_default) wc_printf(
""
""
- " "
+ " "
"%s "
" \n",
_("Mark all messages as read, go to next room with unread messages"),
_("Goto next room")
);
- wprintf(" \n");
+ wc_printf(" \n");
}
}
@@ -780,51 +648,35 @@ void embed_room_banner(char *got, int navbar_style) {
*/
long gotoroom(const StrBuf *gname)
{
+ wcsession *WCC = WC;
StrBuf *Buf;
static long ls = (-1L);
long err = 0;
/* store ungoto information */
- strcpy(WC->ugname, ChrPtr(WC->wc_roomname));
- WC->uglsn = ls;
+ strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name));
+ WCC->uglsn = ls;
Buf = NewStrBuf();
- /** move to the new room */
+
+ /* move to the new room */
serv_printf("GOTO %s", ChrPtr(gname));
StrBuf_ServGetln(Buf);
if (GetServerStatus(Buf, &err) != 2) {
serv_puts("GOTO _BASEROOM_");
StrBuf_ServGetln(Buf);
- if (GetServerStatus(Buf, &err) != 2) {
+ /*
+ * well, we know that this is the fallback case,
+ * but we're interested that the first command
+ * didn't work out in first place.
+ */
+ if (GetServerStatus(Buf, NULL) != 2) {
FreeStrBuf(&Buf);
return err;
}
}
+ ParseGoto(&WCC->CurRoom, Buf);
- if (WC->wc_roomname == NULL)
- WC->wc_roomname = NewStrBuf();
- else
- FlushStrBuf(WC->wc_roomname);
-
- StrBufExtract_token(WC->wc_roomname, Buf, 0, '|');
- StrBufCutLeft(WC->wc_roomname, 4);
- WC->room_flags = StrBufExtract_int(Buf, 4, '|');
- /* highest_msg_read = extract_int(&buf[4],6);
- maxmsgnum = extract_int(&buf[4],5);
- */
- WC->is_mailbox = StrBufExtract_int(Buf, 7, '|');
- ls = StrBufExtract_long(Buf, 6, '|');
- WC->wc_floor = StrBufExtract_int(Buf, 10, '|');
- WC->wc_view = StrBufExtract_int(Buf, 11, '|');
- WC->wc_default_view = StrBufExtract_int(Buf, 12, '|');
- WC->wc_is_trash = StrBufExtract_int(Buf, 13, '|');
- WC->room_flags2 = StrBufExtract_int(Buf, 14, '|');
-
- if (WC->is_aide)
- WC->is_room_aide = WC->is_aide;
- else
- WC->is_room_aide = (char) StrBufExtract_int(Buf, 8, '|');
-
- remove_march(WC->wc_roomname);
+ remove_march(WCC->CurRoom.name);
if (!strcasecmp(ChrPtr(gname), "_BASEROOM_"))
remove_march(gname);
FreeStrBuf(&Buf);
@@ -833,222 +685,531 @@ long gotoroom(const StrBuf *gname)
}
-/**
- * \brief Locate the room on the march list which we most want to go to.
- * Each room
- * is measured given a "weight" of preference based on various factors.
- * \param desired_floor the room number on the citadel server
- * \return the roomname
- */
-char *pop_march(int desired_floor)
-{
- static char TheRoom[128];
- int TheFloor = 0;
- int TheOrder = 32767;
- int TheWeight = 0;
- int weight;
- struct march *mptr = NULL;
-
- strcpy(TheRoom, "_BASEROOM_");
- if (WC->march == NULL)
- return (TheRoom);
-
- for (mptr = WC->march; mptr != NULL; mptr = mptr->next) {
- weight = 0;
- if ((strcasecmp(mptr->march_name, "_BASEROOM_")))
- weight = weight + 10000;
- if (mptr->march_floor == desired_floor)
- weight = weight + 5000;
-
- weight = weight + ((128 - (mptr->march_floor)) * 128);
- weight = weight + (128 - (mptr->march_order));
-
- if (weight > TheWeight) {
- TheWeight = weight;
- strcpy(TheRoom, mptr->march_name);
- TheFloor = mptr->march_floor;
- TheOrder = mptr->march_order;
- }
+void ParseGoto(folder *room, StrBuf *Line)
+{
+ wcsession *WCC = WC;
+ const char *Pos;
+ int flag;
+ void *vFloor = NULL;
+ StrBuf *pBuf;
+
+ if (StrLength(Line) < 4) {
+ return;
}
- return (TheRoom);
-}
+
+ /* ignore the commandstate... */
+ Pos = ChrPtr(Line) + 4;
+ if (room->RoomNameParts != NULL)
+ {
+ int i;
+ for (i=0; i < room->nRoomNameParts; i++)
+ FreeStrBuf(&room->RoomNameParts[i]);
+ free(room->RoomNameParts);
+ room->RoomNameParts = NULL;
+ }
+ pBuf = room->name;
+ if (pBuf == NULL)
+ pBuf = NewStrBufPlain(NULL, StrLength(Line));
+ else
+ FlushStrBuf(pBuf);
+ memset(room, 0, sizeof(folder));
+ room->name = pBuf;
-/*
- * Goto next room having unread messages.
- *
- * We want to skip over rooms that the user has already been to, and take the
- * user back to the lobby when done. The room we end up in is placed in
- * newroom - which is set to 0 (the lobby) initially.
- * We start the search in the current room rather than the beginning to prevent
- * two or more concurrent users from dragging each other back to the same room.
- */
-void gotonext(void)
-{
- char buf[256];
- struct march *mptr = NULL;
- struct march *mptr2 = NULL;
- char room_name[128];
- StrBuf *next_room;
- int ELoop = 0;
+ StrBufExtract_NextToken(room->name, Line, &Pos, '|'); // WC->CurRoom->name
- /*
- * First check to see if the march-mode list is already allocated.
- * If it is, pop the first room off the list and go there.
- */
+ room->nNewMessages = StrBufExtractNext_long(Line, &Pos, '|');
+ if (room->nNewMessages > 0)
+ room->RAFlags |= UA_HASNEWMSGS;
- if (WC->march == NULL) {
- serv_puts("LKRN");
- serv_getln(buf, sizeof buf);
- if (buf[0] == '1')
- while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- if (IsEmptyStr(buf)) {
- if (ELoop > 10000)
- return;
- if (ELoop % 100 == 0)
- sleeeeeeeeeep(1);
- ELoop ++;
- continue;
- }
- extract_token(room_name, buf, 0, '|', sizeof room_name);
- if (strcasecmp(room_name, ChrPtr(WC->wc_roomname))) {
- mptr = (struct march *) malloc(sizeof(struct march));
- mptr->next = NULL;
- safestrncpy(mptr->march_name, room_name, sizeof mptr->march_name);
- mptr->march_floor = extract_int(buf, 2);
- mptr->march_order = extract_int(buf, 3);
- if (WC->march == NULL)
- WC->march = mptr;
- else
- mptr2->next = mptr;
- mptr2 = mptr;
- }
- buf[0] = '\0';
- }
- /*
- * add _BASEROOM_ to the end of the march list, so the user will end up
- * in the system base room (usually the Lobby>) at the end of the loop
- */
- mptr = (struct march *) malloc(sizeof(struct march));
- mptr->next = NULL;
- mptr->march_order = 0;
- mptr->march_floor = 0;
- strcpy(mptr->march_name, "_BASEROOM_");
- if (WC->march == NULL) {
- WC->march = mptr;
- } else {
- mptr2 = WC->march;
- while (mptr2->next != NULL)
- mptr2 = mptr2->next;
- mptr2->next = mptr;
- }
- /*
- * ...and remove the room we're currently in, so a oto doesn't make us
- * walk around in circles
- */
- remove_march(WC->wc_roomname);
- }
- if (WC->march != NULL) {
- next_room = NewStrBufPlain(pop_march(-1), -1);/*TODO: migrate march to strbuf */
- } else {
- next_room = NewStrBufPlain(HKEY("_BASEROOM_"));
+ room->nTotalMessages = StrBufExtractNext_long(Line, &Pos, '|');
+
+ room->ShowInfo = StrBufExtractNext_long(Line, &Pos, '|');
+
+ room->QRFlags = StrBufExtractNext_long(Line, &Pos, '|'); //CurRoom->QRFlags
+
+ room->HighestRead = StrBufExtractNext_long(Line, &Pos, '|');
+ room->LastMessageRead = StrBufExtractNext_long(Line, &Pos, '|');
+
+ room->is_inbox = StrBufExtractNext_long(Line, &Pos, '|'); // is_mailbox
+
+ flag = StrBufExtractNext_long(Line, &Pos, '|');
+ if (WCC->is_aide || flag) {
+ room->RAFlags |= UA_ADMINALLOWED;
}
+ room->UsersNewMAilboxMessages = StrBufExtractNext_long(Line, &Pos, '|');
- smart_goto(next_room);
- FreeStrBuf(&next_room);
-}
+ room->floorid = StrBufExtractNext_int(Line, &Pos, '|'); // wc_floor
+ room->view = StrBufExtractNext_long(Line, &Pos, '|'); // CurRoom->view
-/*
- * goto next room
- */
-void smart_goto(const StrBuf *next_room) {
- gotoroom(next_room);
- readloop(readnew);
-}
+ room->defview = StrBufExtractNext_long(Line, &Pos, '|'); // CurRoom->defview
+ flag = StrBufExtractNext_long(Line, &Pos, '|');
+ if (flag)
+ room->RAFlags |= UA_ISTRASH; // wc_is_trash
+ room->QRFlags2 = StrBufExtractNext_long(Line, &Pos, '|'); // CurRoom->QRFlags2
-/*
- * mark all messages in current room as having been read
- */
-void slrp_highest(void)
-{
- char buf[256];
+ /* find out, whether we are in a sub-room */
+ room->nRoomNameParts = StrBufNum_tokens(room->name, '\\');
+ if (room->nRoomNameParts > 1)
+ {
+ int i;
+
+ Pos = NULL;
+ room->RoomNameParts = malloc(sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+ memset(room->RoomNameParts, 0, sizeof(StrBuf*) * (room->nRoomNameParts + 1));
+ for (i=0; i < room->nRoomNameParts; i++)
+ {
+ room->RoomNameParts[i] = NewStrBuf();
+ StrBufExtract_NextToken(room->RoomNameParts[i],
+ room->name, &Pos, '\\');
+ }
+ }
- serv_puts("SLRP HIGHEST");
- serv_getln(buf, sizeof buf);
-}
+ /* Private mailboxes on the main floor get remapped to the personal folder */
+ if ((room->QRFlags & QR_MAILBOX) &&
+ (room->floorid == 0))
+ {
+ room->floorid = VIRTUAL_MY_FLOOR;
+ if ((room->nRoomNameParts == 1) &&
+ (StrLength(room->name) == 4) &&
+ (strcmp(ChrPtr(room->name), "Mail") == 0))
+ {
+ room->is_inbox = 1;
+ }
+
+ }
+ /* 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;
+}
-/*
- * un-goto the previous room
- */
-void ungoto(void)
+void LoadRoomAide(void)
{
+ wcsession *WCC = WC;
StrBuf *Buf;
-
- if (!strcmp(WC->ugname, "")) {
- smart_goto(WC->wc_roomname);
+
+ if (WCC->CurRoom.RoomAideLoaded)
return;
- }
- serv_printf("GOTO %s", WC->ugname);
+
+ WCC->CurRoom.RoomAideLoaded = 1;
Buf = NewStrBuf();
+ serv_puts("GETA");
StrBuf_ServGetln(Buf);
if (GetServerStatus(Buf, NULL) != 2) {
- smart_goto(WC->wc_roomname);
- FreeStrBuf(&Buf);
- return;
- }
- if (WC->uglsn >= 0L) {
- serv_printf("SLRP %ld", WC->uglsn);
- StrBuf_ServGetln(Buf);
+ 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, '|');
}
- FlushStrBuf(Buf);
- StrBufAppendBufPlain(Buf, WC->ugname, -1, 0);
- strcpy(WC->ugname, "");
- smart_goto(Buf);
- FreeStrBuf(&Buf);
+ FreeStrBuf (&Buf);
}
+void tmplput_CurrentRoomFloorName(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ folder *Folder = &WCC->CurRoom;
+ const Floor *pFloor = Folder->Floor;
-typedef struct __room_states {
- char password[SIZ];
- char dirname[SIZ];
- char name[SIZ];
- int flags;
- int floor;
- int order;
- int view;
- int flags2;
-} room_states;
+ if (pFloor == NULL)
+ return;
+ StrBufAppendTemplate(Target, TP, pFloor->Name, 0);
+}
+void tmplput_CurrentRoomAide(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ LoadRoomAide();
-/*
- * Set/clear/read the "self-service list subscribe" flag for a room
- *
- * set newval to 0 to clear, 1 to set, any other value to leave unchanged.
- * returns the new value.
- */
+ StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0);
+}
-int self_service(int newval) {
- int current_value = 0;
- char buf[SIZ];
+
+void LoadRoomXA (void)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
- char name[SIZ];
- char password[SIZ];
- char dirname[SIZ];
- int flags, floor, order, view, flags2;
+ if (WCC->CurRoom.XALoaded)
+ return;
- serv_puts("GETR");
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') return(0);
+ 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);
- extract_token(name, &buf[4], 0, '|', sizeof name);
- extract_token(password, &buf[4], 1, '|', sizeof password);
+ 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, '|');
+ /* defview, we already know you. */
+ /* 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;
+
+ 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;
+
+ CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+ return CheckThis == WCC->CurRoom.defview;
+}
+
+int ConditionalThisRoomHaveView(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ long CheckThis;
+
+ if (WCC == NULL)
+ return 0;
+
+ CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+ {
+ LogTemplateError(Target, "Conditional", ERR_PARM2, TP,
+ "Roomview [%ld] not valid\n",
+ CheckThis);
+ return 0;
+ }
+
+ return exchangeable_views [WCC->CurRoom.defview][CheckThis] != VIEW_MAX;
+}
+
+void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+ StrBuf *Buf;
+
+ if ((WCC == NULL) ||
+ (WCC->CurRoom.defview >= VIEW_MAX) ||
+ (WCC->CurRoom.defview < VIEW_BBS))
+ {
+ LogTemplateError(Target, "Token", ERR_PARM2, TP,
+ "Roomview [%ld] not valid\n",
+ (WCC != NULL)?
+ WCC->CurRoom.defview : -1);
+ return;
+ }
+
+ Buf = NewStrBufPlain(_(viewdefs[WCC->CurRoom.defview]), -1);
+ StrBufAppendTemplate(Target, TP, Buf, 0);
+ FreeStrBuf(&Buf);
+}
+
+void tmplput_RoomViewString(StrBuf *Target, WCTemplputParams *TP)
+{
+ long CheckThis;
+ StrBuf *Buf;
+
+ CheckThis = GetTemplateTokenNumber(Target, TP, 0, 0);
+ if ((CheckThis >= VIEW_MAX) || (CheckThis < VIEW_BBS))
+ {
+ LogTemplateError(Target, "Token", ERR_PARM2, TP,
+ "Roomview [%ld] not valid\n",
+ CheckThis);
+ return;
+ }
+
+ Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1);
+ StrBufAppendTemplate(Target, TP, Buf, 0);
+ FreeStrBuf(&Buf);
+}
+
+
+/*
+ * goto next room
+ */
+void smart_goto(const StrBuf *next_room) {
+ gotoroom(next_room);
+ readloop(readnew, eUseDefault);
+}
+
+
+
+/*
+ * mark all messages in current room as having been read
+ */
+void slrp_highest(void)
+{
+ char buf[256];
+
+ serv_puts("SLRP HIGHEST");
+ serv_getln(buf, sizeof buf);
+}
+
+
+typedef struct __room_states {
+ char password[SIZ];
+ char dirname[SIZ];
+ char name[SIZ];
+ int flags;
+ int floor;
+ int order;
+ int view;
+ int flags2;
+} room_states;
+
+
+
+
+/*
+ * Set/clear/read the "self-service list subscribe" flag for a room
+ *
+ * set newval to 0 to clear, 1 to set, any other value to leave unchanged.
+ * returns the new value.
+ */
+
+int self_service(int newval) {
+ int current_value = 0;
+ char buf[SIZ];
+
+ char name[SIZ];
+ char password[SIZ];
+ char dirname[SIZ];
+ int flags, floor, order, view, flags2;
+
+ serv_puts("GETR");
+ serv_getln(buf, sizeof buf);
+ if (buf[0] != '2') return(0);
+
+ extract_token(name, &buf[4], 0, '|', sizeof name);
+ extract_token(password, &buf[4], 1, '|', sizeof password);
extract_token(dirname, &buf[4], 2, '|', sizeof dirname);
flags = extract_int(&buf[4], 3);
floor = extract_int(&buf[4], 4);
@@ -1152,6 +1313,7 @@ int set_roomflags(room_states *RoomOps)
*/
void display_editroom(void)
{
+ StrBuf *Buf;
char buf[SIZ];
char cmd[1024];
char node[256];
@@ -1167,7 +1329,7 @@ void display_editroom(void)
int i, j;
char *tab;
char *shared_with;
- char *not_shared_with;
+ char *not_shared_with = NULL;
int roompolicy = 0;
int roomvalue = 0;
int floorpolicy = 0;
@@ -1179,119 +1341,121 @@ void display_editroom(void)
tab = bstr("tab");
if (IsEmptyStr(tab)) tab = "admin";
- load_floorlist();
+ Buf = NewStrBuf();
+ load_floorlist(Buf);
+ FreeStrBuf(&Buf);
output_headers(1, 1, 1, 0, 0, 0);
- wprintf("");
+ wc_printf("
");
- wprintf("
\n");
+ wc_printf("
\n");
/* print the tabbed dialog */
- wprintf("
");
- wprintf("
");
+ wc_printf("\n");
- wprintf("\n");
+ wc_printf("
\n");
+ wc_printf("
\n");
/* end tabbed dialog */
- wprintf(""
);
@@ -1299,36 +1463,38 @@ void display_editroom(void)
/* begin content of whatever tab is open now */
if (!strcmp(tab, "admin")) {
- wprintf("
");
- wprintf("
"
+ wc_printf("");
+ wc_printf("
");
- wprintf("
");
+ wc_printf(" ");
}
if (!strcmp(tab, "config")) {
- wprintf("
");
+ wc_printf("
");
serv_puts("GETR");
serv_getln(buf, sizeof buf);
if (!strncmp(buf, "550", 3)) {
- wprintf("
%s
\n",
+ wc_printf("
%s
\n",
_("Higher access is required to access this function.")
);
}
else if (buf[0] != '2') {
- wprintf("
%s
\n", &buf[4]);
+ wc_printf("
%s
\n", &buf[4]);
}
else {
extract_token(er_name, &buf[4], 0, '|', sizeof er_name);
@@ -1338,209 +1504,209 @@ void display_editroom(void)
er_floor = extract_int(&buf[4], 4);
er_flags2 = extract_int(&buf[4], 7);
- wprintf("
\n");
- wprintf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf(" \n", WC->nonce);
- wprintf("");
- wprintf(_("Name of room: "));
- wprintf(" \n",
+ wc_printf("");
+ wc_printf(_("Name of room: "));
+ wc_printf(" \n",
er_name,
(sizeof(er_name)-1)
);
- wprintf(" ");
- wprintf(_("Resides on floor: "));
- wprintf("");
+ wc_printf(_("Resides on floor: "));
+ wc_printf("\n");
+ wc_printf("disabled >\n");
for (i = 0; i < 128; ++i)
if (!IsEmptyStr(floorlist[i])) {
- wprintf("", i);
+ wc_printf("SELECTED ");
+ wc_printf("VALUE=\"%d\">", i);
escputs(floorlist[i]);
- wprintf(" \n");
+ wc_printf("\n");
}
- wprintf(" \n");
+ wc_printf(" \n");
- wprintf(" ");
- wprintf(_("Type of room:"));
- wprintf("\n");
+ wc_printf("");
+ wc_printf(_("Type of room:"));
+ wc_printf("\n");
+ wc_printf("\n \n");
- wprintf(" ");
- wprintf(_("Preferred users only"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Preferred users only"));
- wprintf("\n ");
- wprintf(_("Read-only room"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Read-only room"));
- wprintf("\n ");
- wprintf(_("All users allowed to post may also delete messages"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("All users allowed to post may also delete messages"));
/** directory stuff */
- wprintf("\n ");
- wprintf(_("File directory room"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("File directory room"));
- wprintf("\n\n");
/** end of directory stuff */
- wprintf(" ");
- wprintf(_("Network shared room"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Network shared room"));
- wprintf("\n ");
- wprintf(_("Permanent (does not auto-purge)"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Permanent (does not auto-purge)"));
- wprintf("\n ");
- wprintf(_("Subject Required (Force users to specify a message subject)"));
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Subject Required (Force users to specify a message subject)"));
/** start of anon options */
- wprintf("\n");
- wprintf(_("Anonymous messages"));
- wprintf("\n");
+ wc_printf("\n");
+ wc_printf(_("Anonymous messages"));
+ wc_printf("\n");
+ wc_printf("CHECKED ");
+ wc_printf("> ");
+ wc_printf(_("Prompt user when entering messages"));
+ wc_printf(" \n");
/* end of anon options */
- wprintf(" ");
- wprintf(_("Room aide: "));
+ wc_printf(" ");
+ wc_printf(_("Room aide: "));
serv_puts("GETA");
serv_getln(buf, sizeof buf);
if (buf[0] != '2') {
- wprintf("%s \n", &buf[4]);
+ wc_printf("%s \n", &buf[4]);
} else {
extract_token(er_roomaide, &buf[4], 0, '|', sizeof er_roomaide);
- wprintf(" \n", er_roomaide);
+ wc_printf(" \n", er_roomaide);
}
- wprintf(" \n");
- wprintf(" \n"
+ wc_printf(" \n");
+ wc_printf(" \n"
" "
" "
" "
@@ -1549,13 +1715,13 @@ void display_editroom(void)
_("Cancel")
);
}
- wprintf(" ");
+ wc_printf("
");
}
/* Sharing the room with other Citadel nodes... */
if (!strcmp(tab, "sharing")) {
- wprintf("
");
+ wc_printf("
");
shared_with = strdup("");
not_shared_with = strdup("");
@@ -1601,99 +1767,99 @@ void display_editroom(void)
}
/* Display the stuff */
- wprintf("
"
+ wc_printf(" "
""
"");
- wprintf(_("Shared with"));
- wprintf(" "
+ wc_printf(_("Shared with"));
+ wc_printf(""
"");
- wprintf(_("Not shared with"));
- wprintf(" \n"
+ wc_printf(_("Not shared with"));
+ wc_printf("\n"
"\n");
- wprintf("");
- wprintf(_("Remote node name"));
- wprintf(" ");
- wprintf(_("Remote room name"));
- wprintf(" ");
- wprintf(_("Actions"));
- wprintf(" \n");
+ wc_printf("\n");
- wprintf("\n");
- wprintf("");
- wprintf(_("Remote node name"));
- wprintf(" ");
- wprintf(_("Remote room name"));
- wprintf(" ");
- wprintf(_("Actions"));
- wprintf(" \n");
+ wc_printf("
\n");
+ wc_printf(" \n");
+ wc_printf("\n");
- wprintf(" "
+ wc_printf("
\n");
+ wc_printf(" "
"
\n"
"%s ", _("Notes:"));
- wprintf(_("When sharing a room, "
+ wc_printf(_("When sharing a room, "
"it must be shared from both ends. Adding a node to "
"the 'shared' list sends messages out, but in order to"
" receive messages, the other nodes must be configured"
@@ -1705,19 +1871,22 @@ void display_editroom(void)
" \n"
));
- wprintf("");
+ wc_printf("
");
}
+ if (not_shared_with != NULL)
+ free (not_shared_with);
+
/* Mailing list management */
if (!strcmp(tab, "listserv")) {
room_states RoomFlags;
- wprintf("
");
+ wc_printf("
");
- wprintf("
"
+ wc_printf(""
""
"");
- wprintf(_("The contents of this room are being "
+ wc_printf(_("The contents of this room are being "
"mailed as individual messages "
"to the following list recipients:"
" \n"));
@@ -1730,24 +1899,24 @@ void display_editroom(void)
extract_token(recp, buf, 1, '|', sizeof recp);
escputs(recp);
- wprintf(" ");
- wprintf(_("(remove)"));
- wprintf(" ");
+ wc_printf("\">");
+ wc_printf(_("(remove)"));
+ wc_printf(" ");
}
}
- wprintf("\n"
+ wc_printf(" \n"
" \n"
" \n");
- wprintf(" \n", WC->nonce);
- wprintf(" \n");
- wprintf(" ", _("Add"));
- wprintf(" \n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf(" ", _("Add"));
+ wc_printf("\n");
- wprintf(" \n");
+ wc_printf(" \n");
- wprintf(_("The contents of this room are being "
+ wc_printf(_("The contents of this room are being "
"mailed in digest form "
"to the following list recipients:"
" \n"));
@@ -1760,26 +1929,26 @@ void display_editroom(void)
extract_token(recp, buf, 1, '|', sizeof recp);
escputs(recp);
- wprintf(" ");
- wprintf(_("(remove)"));
- wprintf(" ");
+ wc_printf("\">");
+ wc_printf(_("(remove)"));
+ wc_printf(" ");
}
}
- wprintf("\n"
+ wc_printf(" \n"
" \n"
" \n");
- wprintf(" \n", WC->nonce);
- wprintf(" \n");
- wprintf(" ", _("Add"));
- wprintf(" \n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf(" ", _("Add"));
+ wc_printf("\n");
- wprintf("
\n");
+ wc_printf("\n");
/** Pop open an address book -- begin **/
- wprintf(""
+ wc_printf("
");
+ wc_printf("\n");
+ wc_printf("
");
}
/* Configuration of The Dreaded Auto-Purger */
if (!strcmp(tab, "expire")) {
- wprintf("");
+ wc_printf("
");
serv_puts("GPEX room");
serv_getln(buf, sizeof buf);
if (!strncmp(buf, "550", 3)) {
- wprintf("
%s
\n",
+ wc_printf("
%s
\n",
_("Higher access is required to access this function.")
);
}
else if (buf[0] != '2') {
- wprintf("
%s
\n", &buf[4]);
+ wc_printf("
%s
\n", &buf[4]);
}
else {
roompolicy = extract_int(&buf[4], 0);
@@ -1854,105 +2023,105 @@ void display_editroom(void)
floorvalue = extract_int(&buf[4], 1);
}
- wprintf("
\n");
- wprintf(" \n", WC->nonce);
- wprintf("\n");
- wprintf("");
- wprintf(_("Message expire policy for this room"));
- wprintf(" (");
- escputs(ChrPtr(WC->wc_roomname));
- wprintf(") ");
- wprintf(" ",
+ wc_printf("\n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf("\n");
+ wc_printf("");
+ wc_printf(_("Message expire policy for this room"));
+ wc_printf(" (");
+ escputs(ChrPtr(WC->CurRoom.name));
+ wc_printf(") ");
+ wc_printf(" ",
((roompolicy == 0) ? "CHECKED" : "") );
- wprintf(_("Use the default policy for this floor"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Use the default policy for this floor"));
+ wc_printf(" \n");
+ wc_printf(" ",
((roompolicy == 1) ? "CHECKED" : "") );
- wprintf(_("Never automatically expire messages"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Never automatically expire messages"));
+ wc_printf(" \n");
+ wc_printf(" ",
((roompolicy == 2) ? "CHECKED" : "") );
- wprintf(_("Expire by message count"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Expire by message count"));
+ wc_printf(" \n");
+ wc_printf(" ",
((roompolicy == 3) ? "CHECKED" : "") );
- wprintf(_("Expire by message age"));
- wprintf(" ");
- wprintf(_("Number of messages or days: "));
- wprintf(" ", roomvalue);
- wprintf(" \n");
+ wc_printf(_("Expire by message age"));
+ wc_printf(" ");
+ wc_printf(_("Number of messages or days: "));
+ wc_printf(" ", roomvalue);
+ wc_printf("\n");
if (WC->axlevel >= 6) {
- wprintf(" \n");
- wprintf("");
- wprintf(_("Message expire policy for this floor"));
- wprintf(" (");
- escputs(floorlist[WC->wc_floor]);
- wprintf(") ");
- wprintf(" ",
+ wc_printf(" \n");
+ wc_printf("");
+ wc_printf(_("Message expire policy for this floor"));
+ wc_printf(" (");
+ escputs(floorlist[WC->CurRoom.floorid]);
+ wc_printf(") ");
+ wc_printf(" ",
((floorpolicy == 0) ? "CHECKED" : "") );
- wprintf(_("Use the system default"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Use the system default"));
+ wc_printf(" \n");
+ wc_printf(" ",
((floorpolicy == 1) ? "CHECKED" : "") );
- wprintf(_("Never automatically expire messages"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Never automatically expire messages"));
+ wc_printf(" \n");
+ wc_printf(" ",
((floorpolicy == 2) ? "CHECKED" : "") );
- wprintf(_("Expire by message count"));
- wprintf(" \n");
- wprintf(" ",
+ wc_printf(_("Expire by message count"));
+ wc_printf(" \n");
+ wc_printf(" ",
((floorpolicy == 3) ? "CHECKED" : "") );
- wprintf(_("Expire by message age"));
- wprintf(" ");
- wprintf(_("Number of messages or days: "));
- wprintf(" ",
+ wc_printf(_("Expire by message age"));
+ wc_printf(" ");
+ wc_printf(_("Number of messages or days: "));
+ wc_printf(" ",
floorvalue);
}
- wprintf("\n");
- wprintf("\n");
- wprintf(" ", _("Save changes"));
- wprintf(" ");
- wprintf(" ", _("Cancel"));
- wprintf(" \n");
+ wc_printf("\n");
+ wc_printf("\n");
+ wc_printf(" ", _("Save changes"));
+ wc_printf(" ");
+ wc_printf(" ", _("Cancel"));
+ wc_printf(" \n");
- wprintf("
\n"
+ wc_printf("
\n"
" \n"
" \n"
);
}
- wprintf("
");
+ wc_printf("
");
}
/* Access controls */
if (!strcmp(tab, "access")) {
- wprintf("");
+ wc_printf("
");
display_whok();
- wprintf("
");
+ wc_printf("
");
}
/* Fetch messages from remote locations */
if (!strcmp(tab, "feeds")) {
- wprintf("");
+ wc_printf("
");
- wprintf("
");
- wprintf(_("Retrieve messages from these remote POP3 accounts and store them in this room:"));
- wprintf(" \n");
+ wc_printf("
");
+ wc_printf(_("Retrieve messages from these remote POP3 accounts and store them in this room:"));
+ wc_printf(" \n");
- wprintf("
"
+ wc_printf(""
"");
- wprintf(_("Remote host"));
- wprintf(" ");
- wprintf(_("User name"));
- wprintf(" ");
- wprintf(_("Password"));
- wprintf(" ");
- wprintf(_("Keep messages on server?"));
- wprintf(" ");
- wprintf(_("Interval"));
- wprintf(" ");
+ wc_printf(_("Remote host"));
+ wc_printf("");
+ wc_printf(_("User name"));
+ wc_printf(" ");
+ wc_printf(_("Password"));
+ wc_printf(" ");
+ wc_printf(_("Keep messages on server?"));
+ wc_printf(" ");
+ wc_printf(_("Interval"));
+ wc_printf(" ");
serv_puts("GNET");
serv_getln(buf, sizeof buf);
@@ -1963,74 +2132,74 @@ void display_editroom(void)
safestrncpy(recp, &buf[11], sizeof recp);
bg = 1 - bg;
- wprintf("",
+ wc_printf(" ",
(bg ? "even" : "odd")
);
- wprintf("");
+ wc_printf(" ");
extract_token(pop3_host, buf, 1, '|', sizeof pop3_host);
escputs(pop3_host);
- wprintf(" ");
+ wc_printf("");
- wprintf("");
+ wc_printf(" ");
extract_token(pop3_user, buf, 2, '|', sizeof pop3_user);
escputs(pop3_user);
- wprintf(" ");
+ wc_printf("");
- wprintf("***** "); /* Don't show the password */
+ wc_printf("***** "); /* Don't show the password */
- wprintf("%s ", extract_int(buf, 4) ? _("Yes") : _("No"));
+ wc_printf("%s ", extract_int(buf, 4) ? _("Yes") : _("No"));
- wprintf("%ld ", extract_long(buf, 5)); /* Fetching interval */
+ wc_printf("%ld ", extract_long(buf, 5)); /* Fetching interval */
- wprintf("");
- wprintf(" ");
+ wc_printf(" ");
- wprintf(_("(remove)"));
- wprintf(" ");
+ wc_printf("\">");
+ wc_printf(_("(remove)"));
+ wc_printf("");
- wprintf(" ");
+ wc_printf("");
}
}
- wprintf("\n"
+ wc_printf(" \n"
""
" "
" \n");
- wprintf(" \n", WC->nonce);
- wprintf("");
- wprintf(" \n");
- wprintf(" ");
- wprintf("");
- wprintf(" \n");
- wprintf(" ");
- wprintf("");
- wprintf(" \n");
- wprintf(" ");
- wprintf("");
- wprintf(" ");
- wprintf(" ");
- wprintf("");
- wprintf(" ");
- wprintf(" ");
- wprintf("");
- wprintf(" ", _("Add"));
- wprintf(" ");
- wprintf("
\n");
-
- wprintf(" \n");
-
- wprintf("");
- wprintf(_("Fetch the following RSS feeds and store them in this room:"));
- wprintf(" \n");
-
- wprintf("\n");
+
+ wc_printf(" \n");
+
+ wc_printf("");
+ wc_printf(_("Fetch the following RSS feeds and store them in this room:"));
+ wc_printf(" \n");
+
+ wc_printf(""
"");
- wprintf(" ");
- wprintf(_("Feed URL"));
- wprintf(" ");
- wprintf(" ");
+ wc_printf(" ");
+ wc_printf(_("Feed URL"));
+ wc_printf("");
+ wc_printf(" ");
serv_puts("GNET");
serv_getln(buf, sizeof buf);
@@ -2041,46 +2210,46 @@ void display_editroom(void)
safestrncpy(recp, &buf[10], sizeof recp);
bg = 1 - bg;
- wprintf("",
+ wc_printf(" ",
(bg ? "even" : "odd")
);
- wprintf("");
+ wc_printf(" ");
extract_token(pop3_host, buf, 1, '|', sizeof pop3_host);
escputs(pop3_host);
- wprintf(" ");
+ wc_printf("");
- wprintf("");
- wprintf(" ");
+ wc_printf(" ");
- wprintf(_("(remove)"));
- wprintf(" ");
+ wc_printf("\">");
+ wc_printf(_("(remove)"));
+ wc_printf("");
- wprintf(" ");
+ wc_printf("");
}
}
- wprintf("\n"
+ wc_printf(" \n"
""
" "
" \n");
- wprintf(" \n", WC->nonce);
- wprintf("");
- wprintf(" \n", WC->nonce);
+ wc_printf(" ");
+ wc_printf(" \n");
- wprintf(" ");
- wprintf("");
- wprintf(" ", _("Add"));
- wprintf(" ");
- wprintf("
\n");
+ wc_printf("");
+ wc_printf("");
+ wc_printf(" ", _("Add"));
+ wc_printf(" ");
+ wc_printf("
\n");
- wprintf("
");
+ wc_printf("
");
}
/* end content of whatever tab is open now */
- wprintf(" \n");
+ wc_printf("
\n");
address_book_popup();
wDumpContent(1);
@@ -2410,47 +2579,47 @@ void display_whok(void)
extract_token(room, &buf[4], 0, '|', sizeof room);
- wprintf("
");
- wprintf(_("The users listed below have access to this room. "
+ wc_printf("");
+ wc_printf(_("The users listed below have access to this room. "
"To remove a user from the access list, select the user "
"name from the list and click 'Kick'."));
- wprintf(" ");
+ wc_printf(" ");
- wprintf("\n");
- wprintf(" \n", WC->nonce);
- wprintf(" \n");
- wprintf("\n");
+ wc_printf("\n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf("\n");
serv_puts("WHOK");
serv_getln(buf, sizeof buf);
if (buf[0] == '1') {
while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
extract_token(username, buf, 0, '|', sizeof username);
- wprintf("");
+ wc_printf(" ");
escputs(username);
- wprintf("\n");
+ wc_printf("\n");
}
}
- wprintf(" \n");
+ wc_printf(" \n");
- wprintf(" ", _("Kick"));
- wprintf(" \n");
+ wc_printf(" ", _("Kick"));
+ wc_printf("\n");
- wprintf(" ");
- wprintf(_("To grant another user access to this room, enter the "
+ wc_printf(" ");
+ wc_printf(_("To grant another user access to this room, enter the "
"user name in the box below and click 'Invite'."));
- wprintf(" ");
-
- wprintf("\n");
- wprintf(" \n");
- wprintf(" \n", WC->nonce);
- wprintf(_("Invite:"));
- wprintf(" ");
- wprintf(" \n"
+ wc_printf(" ");
+
+ wc_printf("\n");
+ wc_printf(" \n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf(_("Invite:"));
+ wc_printf(" ");
+ wc_printf(" \n"
" "
" "
" \n", _("Invite"));
/* Pop open an address book -- begin **/
- wprintf(
+ wc_printf(
""
" "
@@ -2460,7 +2629,7 @@ void display_whok(void)
);
/* Pop open an address book -- end **/
- wprintf("
\n");
+ wc_printf("
\n");
address_book_popup();
wDumpContent(1);
}
@@ -2472,15 +2641,18 @@ void display_whok(void)
*/
void display_entroom(void)
{
+ StrBuf *Buf;
int i;
char buf[SIZ];
+ Buf = NewStrBuf();
serv_puts("CRE8 0");
serv_getln(buf, sizeof buf);
if (buf[0] != '2') {
strcpy(WC->ImportantMessage, &buf[4]);
display_main_menu();
+ FreeStrBuf(&Buf);
return;
}
@@ -2489,31 +2661,31 @@ void display_entroom(void)
svprintf(HKEY("BOXTITLE"), WCS_STRING, _("Create a new room"));
do_template("beginbox", NULL);
- wprintf("
\n");
- wprintf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf(" \n", WC->nonce);
- wprintf("\n");
+
+ wc_printf("\n");
+ wc_printf(" ", _("Create new room"));
+ wc_printf(" ");
+ wc_printf(" ", _("Cancel"));
+ wc_printf("
\n");
+ wc_printf(" \n
");
serv_printf("MESG roomaccess");
serv_getln(buf, sizeof buf);
if (buf[0] == '1') {
@@ -2612,6 +2784,7 @@ void display_entroom(void)
do_template("endbox", NULL);
wDumpContent(1);
+ FreeStrBuf(&Buf);
}
@@ -2665,6 +2838,7 @@ void entroom(void)
int er_floor;
int er_num_type;
int er_view;
+ wcsession *WCC = WC;
if (!havebstr("ok_button")) {
strcpy(WC->ImportantMessage,
@@ -2698,16 +2872,25 @@ void entroom(void)
serv_getln(buf, sizeof buf);
if (buf[0] != '2') {
- strcpy(WC->ImportantMessage, &buf[4]);
+ strcpy(WCC->ImportantMessage, &buf[4]);
display_main_menu();
return;
}
- /** TODO: Room created, now udate the left hand icon bar for this user */
+ /** TODO: Room created, now update the left hand icon bar for this user */
burn_folder_cache(0); /* burn the old folder cache */
-
gotoroom(er_name);
- do_change_view(er_view); /* Now go there */
+
+ serv_printf("VIEW %d", er_view);
+ serv_getln(buf, sizeof buf);
+ WCC->CurRoom.view = er_view;
+
+ if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ) {
+ display_editroom ();
+ } else {
+ do_change_view(er_view); /* Now go there */
+ }
+
}
@@ -2728,40 +2911,40 @@ void display_private(char *rname, int req_pass)
FreeStrBuf(&Buf);
- wprintf("
");
- wprintf(_("If you know the name of a hidden (guess-name) or "
+ wc_printf("
");
+ wc_printf(_("If you know the name of a hidden (guess-name) or "
"passworded room, you can enter that room by typing "
"its name below. Once you gain access to a private "
"room, it will appear in your regular room listings "
"so you don't have to keep returning here."));
- wprintf("
");
+ wc_printf("");
- wprintf("
\n");
- wprintf(" \n", WC->nonce);
+ wc_printf(" \n");
+ wc_printf(" \n", WC->nonce);
- wprintf(" "
+ wc_printf("\n");
+ wc_printf("
\n");
- wprintf(" \n");
do_template("endbox", NULL);
@@ -2780,7 +2963,7 @@ void goto_private(void)
display_main_menu();
return;
}
- strcpy(hold_rm, ChrPtr(WC->wc_roomname));
+ strcpy(hold_rm, ChrPtr(WC->CurRoom.name));
serv_printf("GOTO %s|%s",
bstr("gr_name"),
bstr("gr_pass"));
@@ -2795,7 +2978,7 @@ void goto_private(void)
return;
}
output_headers(1, 1, 1, 0, 0, 0);
- wprintf("%s\n", &buf[4]);
+ wc_printf("%s\n", &buf[4]);
wDumpContent(1);
return;
}
@@ -2808,24 +2991,24 @@ void display_zap(void)
{
output_headers(1, 1, 2, 0, 0, 0);
- wprintf("
\n");
- wprintf("
");
- wprintf(_("Zap (forget/unsubscribe) the current room"));
- wprintf(" \n");
- wprintf("\n");
+ wc_printf("
\n");
+ wc_printf("
");
+ wc_printf(_("Zap (forget/unsubscribe) the current room"));
+ wc_printf(" \n");
+ wc_printf("\n");
- wprintf("
\n");
+ wc_printf("
\n");
- wprintf(_("If you select this option,
%s will "
+ wc_printf(_("If you select this option,
%s will "
"disappear from your room list. Is this what you wish "
- "to do?
\n"), ChrPtr(WC->wc_roomname));
-
- wprintf("
\n");
- wprintf(" \n", WC->nonce);
- wprintf(" ", _("Zap this room"));
- wprintf(" ");
- wprintf(" ", _("Cancel"));
- wprintf(" \n");
+ "to do?
\n"), ChrPtr(WC->CurRoom.name));
+
+ wc_printf("
\n");
+ wc_printf(" \n", WC->nonce);
+ wc_printf(" ", _("Zap this room"));
+ wc_printf(" ");
+ wc_printf(" ", _("Cancel"));
+ wc_printf(" \n");
wDumpContent(1);
}
@@ -2842,10 +3025,10 @@ void zap(void)
* If the forget-room routine fails for any reason, we fall back
* to the current room; otherwise, we go to the Lobby
*/
- final_destination = NewStrBufDup(WC->wc_roomname);
+ final_destination = NewStrBufDup(WC->CurRoom.name);
if (havebstr("ok_button")) {
- serv_printf("GOTO %s", ChrPtr(WC->wc_roomname));
+ serv_printf("GOTO %s", ChrPtr(WC->CurRoom.name));
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
serv_puts("FORG");
@@ -3043,8 +3226,8 @@ void do_change_view(int newview) {
serv_printf("VIEW %d", newview);
serv_getln(buf, sizeof buf);
- WC->wc_view = newview;
- smart_goto(WC->wc_roomname);
+ WC->CurRoom.view = newview;
+ smart_goto(WC->CurRoom.name);
}
@@ -3059,560 +3242,22 @@ void change_view(void) {
do_change_view(view);
}
-
/**
- * \brief One big expanded tree list view --- like a folder list
- * \param fold the folder to view
- * \param max_folders how many folders???
- * \param num_floors hom many floors???
+ * \brief Burn the cached folder list.
+ * \param age How old the cahce needs to be before we burn it.
*/
-void do_folder_view(struct folder *fold, int max_folders, int num_floors) {
- char buf[SIZ];
- int levels;
- int i;
- int has_subfolders = 0;
- int *parents;
-
- parents = malloc(max_folders * sizeof(int));
-
- /** BEGIN TREE MENU */
- wprintf("
Loading folder list...
\n");
-
- /** include NanoTree */
- wprintf("\n");
-
- /** initialize NanoTree */
- wprintf("\n"
- );
-
- free(parents);
- /** END TREE MENU */
-}
-
-/**
- * \brief Boxes and rooms and lists ... oh my!
- * \param fold the folder to view
- * \param max_folders how many folders???
- * \param num_floors hom many floors???
- */
-void do_rooms_view(struct folder *fold, int max_folders, int num_floors) {
- char buf[256];
- char floor_name[256];
- char old_floor_name[256];
- int levels, oldlevels;
- int i, t;
- int num_boxes = 0;
- static int columns = 3;
- int boxes_per_column = 0;
- int current_column = 0;
- int nf;
-
- strcpy(floor_name, "");
- strcpy(old_floor_name, "");
-
- nf = num_floors;
- while (nf % columns != 0) ++nf;
- boxes_per_column = (nf / columns);
- if (boxes_per_column < 1) boxes_per_column = 1;
-
- /** Outer table (for columnization) */
- wprintf("
"
- "");
-
- levels = 0;
- oldlevels = 0;
- for (i=0; i");
-
- ++num_boxes;
- if ((num_boxes % boxes_per_column) == 0) {
- ++current_column;
- if (current_column < columns) {
- wprintf(" \n");
- }
- }
- }
- strcpy(old_floor_name, floor_name);
-
- if (levels == 1) {
- StrBuf *Buf;
- WCTemplputParams SubTP;
-
- Buf = NewStrBufPlain(floor_name, -1);
- memset(&SubTP, 0, sizeof(WCTemplputParams));
- SubTP.Filter.ContextType = CTX_STRBUF;
- SubTP.Context = Buf;
- DoTemplate(HKEY("beginbox"), NULL, &SubTP);
-
- FreeStrBuf(&Buf);
- }
-
- oldlevels = levels;
-
- if (levels > 1) {
- wprintf(" ");
- if (levels>2) for (t=0; t<(levels-2); ++t) wprintf(" ");
- if (fold[i].selectable) {
- wprintf("");
- }
- else {
- wprintf("");
- }
- if (fold[i].hasnewmsgs) {
- wprintf("");
- }
- else {
- wprintf("");
- }
- extract_token(buf, fold[i].name, levels-1, '|', sizeof buf);
- escputs(buf);
- wprintf(" ");
- if (fold[i].selectable) {
- wprintf(" ");
- }
- else {
- wprintf("");
- }
- if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
- wprintf(" (INBOX)");
- }
- wprintf(" \n");
- }
- }
- /** End the final inner box */
- do_template("endbox", NULL);
-
- wprintf("
\n");
-}
-
-/**
- * \brief print a floor div???
- * \param which_floordiv name of the floordiv???
- */
-void set_floordiv_expanded(void) {
- wcsession *WCC = WC;
- StrBuf *FloorDiv;
-
- FloorDiv = NewStrBuf();
- StrBufAppendBuf(FloorDiv, WCC->UrlFragment2, 0);
- set_preference("floordiv_expanded", FloorDiv, 1);
- WCC->floordiv_expanded = FloorDiv;
-}
-
-/**
- * \brief view the iconbar
- * \param fold the folder to view
- * \param max_folders how many folders???
- * \param num_floors hom many floors???
- */
-void do_iconbar_view(struct folder *fold, int max_folders, int num_floors) {
- char buf[256];
- char floor_name[256];
- char old_floor_name[256];
- char floordivtitle[256];
- char floordiv_id[32];
- int levels, oldlevels;
- int i, t;
- char *icon = NULL;
-
- strcpy(floor_name, "");
- strcpy(old_floor_name, "");
-
- levels = 0;
- oldlevels = 0;
- for (i=0; i
\n");
- wprintf(" \n"); /** floordiv */
- }
- strcpy(old_floor_name, floor_name);
-
- if (levels == 1) {
- /** Begin floor */
- stresc(floordivtitle, 256, floor_name, 0, 0);
- sprintf(floordiv_id, "floordiv%d", i);
- wprintf("
"
- "%s \n", floordiv_id, floordivtitle);
- wprintf("
",
- floordiv_id,
- (!strcasecmp(floordiv_id, ChrPtr(WC->floordiv_expanded)) ? "block" : "none")
- );
- }
-
- oldlevels = levels;
-
- if (levels > 1) {
- wprintf("
\n"); /** roomdiv */
- }
- }
- wprintf("
\n"); /** floordiv */
-
-
-}
-
-
-
-/**
- * \brief Burn the cached folder list.
- * \param age How old the cahce needs to be before we burn it.
- */
-
-void burn_folder_cache(time_t age)
-{
- /** If our cached folder list is very old, burn it. */
- if (WC->cache_fold != NULL) {
- if ((time(NULL) - WC->cache_timestamp) > age) {
- free(WC->cache_fold);
- WC->cache_fold = NULL;
- }
- }
-}
-
-
-
-
-/**
- * \brief Show the room list.
- * (only should get called by
- * knrooms() because that's where output_headers() is called from)
- * \param viewpref the view preferences???
- */
-
-void list_all_rooms_by_floor(const char *viewpref) {
- char buf[SIZ];
- int swap = 0;
- struct folder *fold = NULL;
- struct folder ftmp;
- int max_folders = 0;
- int alloc_folders = 0;
- int *floor_mapping;
- int IDMax;
- int i, j;
- int ShowEmptyFloors;
- int ra_flags = 0;
- int flags = 0;
- int num_floors = 1; /** add an extra one for private folders */
- char buf3[SIZ];
-
- /** If our cached folder list is very old, burn it. */
- burn_folder_cache(300);
-
- /** Can we do the iconbar roomlist from cache? */
- if ((WC->cache_fold != NULL) && (!strcasecmp(viewpref, "iconbar"))) {
- do_iconbar_view(WC->cache_fold, WC->cache_max_folders, WC->cache_num_floors);
- return;
- }
-
- /** Grab the floor table so we know how to build the list... */
- load_floorlist();
-
- /** Start with the mailboxes */
- max_folders = 1;
- alloc_folders = 1;
- fold = malloc(sizeof(struct folder));
- memset(fold, 0, sizeof(struct folder));
- strcpy(fold[0].name, "My folders");
- fold[0].is_mailbox = 1;
-
- /** Then add floors */
- serv_puts("LFLR");
- serv_getln(buf, sizeof buf);
- if (buf[0]=='1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
- if (max_folders >= alloc_folders) {
- alloc_folders = max_folders + 100;
- fold = realloc(fold,
- alloc_folders * sizeof(struct folder));
- }
- memset(&fold[max_folders], 0, sizeof(struct folder));
- extract_token(fold[max_folders].name, buf, 1, '|', sizeof fold[max_folders].name);
- extract_token(buf3, buf, 0, '|', SIZ);
- fold[max_folders].floor = atol (buf3);
- ++max_folders;
- ++num_floors;
- }
- IDMax = 0;
- for (i=0; i
= alloc_folders) {
- alloc_folders = max_folders + 100;
- fold = realloc(fold,
- alloc_folders * sizeof(struct folder));
- }
- memset(&fold[max_folders], 0, sizeof(struct folder));
- extract_token(fold[max_folders].room, buf, 0, '|', sizeof fold[max_folders].room);
- ra_flags = extract_int(buf, 5);
- flags = extract_int(buf, 1);
- fold[max_folders].floor = extract_int(buf, 2);
- fold[max_folders].hasnewmsgs =
- ((ra_flags & UA_HASNEWMSGS) ? 1 : 0 );
- if (flags & QR_MAILBOX) {
- fold[max_folders].is_mailbox = 1;
- }
- fold[max_folders].view = extract_int(buf, 6);
- room_to_folder(fold[max_folders].name,
- fold[max_folders].room,
- fold[max_folders].floor,
- fold[max_folders].is_mailbox);
- fold[max_folders].selectable = 1;
- /* Increase the room count for the associtaed floor */
- if (fold[max_folders].is_mailbox) {
- fold[0].num_rooms++;
- }
- else {
- i = floor_mapping[fold[max_folders].floor];
- fold[i].num_rooms++;
- }
- ++max_folders;
- }
-
- /*
- * Remove any floors that don't have rooms
- */
- get_pref_yesno("emptyfloors", &ShowEmptyFloors, 0);
- if (ShowEmptyFloors)
- {
- for (i=0; i 0) {
- memcpy(&ftmp, &fold[j], sizeof(struct folder));
- memcpy(&fold[j], &fold[j+1],
- sizeof(struct folder));
- memcpy(&fold[j+1], &ftmp,
- sizeof(struct folder));
- }
- }
- }
-
-
- if (!strcasecmp(viewpref, "folders")) {
- do_folder_view(fold, max_folders, num_floors);
- }
- else if (!strcasecmp(viewpref, "hackish_view")) {
- for (i=0; i \n");
- }
- }
- else if (!strcasecmp(viewpref, "iconbar")) {
- do_iconbar_view(fold, max_folders, num_floors);
- }
- else {
- do_rooms_view(fold, max_folders, num_floors);
- }
-
- /* Don't free the folder list ... cache it for future use! */
- if (WC->cache_fold != NULL) {
- free(WC->cache_fold);
- }
- WC->cache_fold = fold;
- WC->cache_max_folders = max_folders;
- WC->cache_num_floors = num_floors;
- WC->cache_timestamp = time(NULL);
- free(floor_mapping);
-}
/**
@@ -3623,75 +3268,29 @@ void knrooms(void)
{
StrBuf *ListView = NULL;
- output_headers(1, 1, 2, 0, 0, 0);
-
/** Determine whether the user is trying to change views */
if (havebstr("view")) {
- ListView = NewStrBufPlain(bstr("view"), -1);
+ ListView = NewStrBufDup(SBSTR("view"));
set_preference("roomlistview", ListView, 1);
}
/** Sanitize the input so its safe */
- if(!get_preference("roomlistview", &ListView) ||
+ if((get_preference("roomlistview", &ListView) != 0)||
((strcasecmp(ChrPtr(ListView), "folders") != 0) &&
(strcasecmp(ChrPtr(ListView), "table") != 0)))
{
if (ListView == NULL) {
- ListView = NewStrBufPlain("rooms", sizeof("rooms") - 1);
+ ListView = NewStrBufPlain(HKEY("rooms"));
set_preference("roomlistview", ListView, 0);
+ ListView = NULL;
}
else {
- StrBufPrintf(ListView, "rooms");
- save_preferences();
+ ListView = NewStrBufPlain(HKEY("rooms"));
+ set_preference("roomlistview", ListView, 0);
+ ListView = NULL;
}
}
-
- /** title bar */
- wprintf("\n");
- wprintf("
");
- wprintf("
");
- if (!strcasecmp(ChrPtr(ListView), "rooms")) {
- wprintf(_("Room list"));
- }
- else if (!strcasecmp(ChrPtr(ListView), "folders")) {
- wprintf(_("Folder list"));
- }
- else if (!strcasecmp(ChrPtr(ListView), "table")) {
- wprintf(_("Room list"));
- }
- wprintf(" \n");
-
- /** offer the ability to switch views */
- wprintf("
");
- wprintf("
\n");
- wprintf("");
- offer_start_page(NULL, &NoCtx);
- wprintf(" ");
- wprintf("\n"
- "\n");
-
- wprintf(""
- "View as room list"
- " \n",
- ( !strcasecmp(ChrPtr(ListView), "rooms") ? "SELECTED" : "" )
- );
-
- wprintf(""
- "View as folder list"
- " \n",
- ( !strcasecmp(ChrPtr(ListView), "folders") ? "SELECTED" : "" )
- );
-
- wprintf(" ");
- wprintf(" ");
- wprintf(" \n");
-
- wprintf("\n");
-
- /** Display the room list in the user's preferred format */
- list_all_rooms_by_floor(ChrPtr(ListView));
- wDumpContent(1);
+ FreeStrBuf(&ListView);
+ url_do_template();
}
@@ -3723,138 +3322,44 @@ void set_room_policy(void) {
display_editroom();
}
-HashList *GetFloorListHash(StrBuf *Target, WCTemplputParams *TP) {
- /* todo: check context */
- const char *Err;
- StrBuf *Buf;
- StrBuf *Buf2;
- HashList *floors;
- HashList *floor;
- floors = NewHash(1, NULL);
- Buf = NewStrBuf();
- serv_puts("LFLR"); /* get floors */
- StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err); /* '100', we hope */
- if (ChrPtr(Buf)[0] == '1') while(StrBufTCP_read_line(Buf, &WC->serv_sock, 0, &Err), strcmp(ChrPtr(Buf), "000")) {
- int a;
- const char *floorNum;
- floor = NewHash(1, NULL);
- for(a=0; a
Context);
- void *value;
- GetHash(floor, TKEY(0), &value);
- val = (StrBuf *)value;
- StrECMAEscAppend(TemplBuffer, val, 0);
-}
-HashList *GetRoomListHashLKRA(StrBuf *Target, WCTemplputParams *TP)
-{
- serv_puts("LKRA");
- return GetRoomListHash(Target, TP);
-}
-HashList *GetRoomListHash(StrBuf *Target, WCTemplputParams *TP)
-{
- /* TODO: Check context */
- HashList *rooms;
- HashList *room;
- StrBuf *buf;
- StrBuf *buf2;
- const char *Err;
- buf = NewStrBuf();
- rooms = NewHash(1, NULL);
- StrBufTCP_read_line(buf, &WC->serv_sock, 0, &Err);
- if (ChrPtr(buf)[0] == '1') while(StrBufTCP_read_line(buf, &WC->serv_sock, 0, &Err), strcmp(ChrPtr(buf), "000")) {
- int i;
- const char *rmName;
- room = NewHash(1, NULL);
- for(i=0; i l2) return +1;
- else return 0;
-}
-void tmplput_ROOM_Value(StrBuf *TemplBuffer, WCTemplputParams *TP)
-{
- void *value;
- StrBuf *val;
- HashList *room = (HashList *)(TP->Context);
-
- GetHash(room, TKEY(0), &value);
- val = (StrBuf *)value;
- StrECMAEscAppend(TemplBuffer, val, 0);
-}
-void jsonRoomFlr(void) {
- /* Send as our own (application/json) content type */
- hprintf("HTTP/1.1 200 OK\r\n");
- hprintf("Content-type: application/json; charset=utf-8\r\n");
- hprintf("Server: %s / %s\r\n", PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software));
- hprintf("Connection: close\r\n");
- hprintf("Pragma: no-cache\r\nCache-Control: no-store\r\nExpires:-1\r\n");
- begin_burst();
- DoTemplate(HKEY("json_roomflr"),NULL,&NoCtx);
- end_burst();
-}
void tmplput_RoomName(StrBuf *Target, WCTemplputParams *TP)
{
- StrBufAppendTemplate(Target, TP, WC->wc_roomname, 0);
+ StrBufAppendTemplate(Target, TP, WC->CurRoom.name, 0);
+}
+
+
+void _display_private(void) {
+ display_private("", 0);
}
-void _gotonext(void) { slrp_highest(); gotonext(); }
-void dotskip(void) {smart_goto(sbstr("room"));}
-void _display_private(void) { display_private("", 0); }
void dotgoto(void) {
- if (WC->wc_view != VIEW_MAILBOX) { /* dotgoto acts like dotskip when we're in a mailbox view */
+ if (!havebstr("room")) {
+ readloop(readnew, eUseDefault);
+ return;
+ }
+ if (WC->CurRoom.view != VIEW_MAILBOX) { /* dotgoto acts like dotskip when we're in a mailbox view */
slrp_highest();
}
smart_goto(sbstr("room"));
}
+
+
+void tmplput_current_room(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if (WCC != NULL)
+ StrBufAppendTemplate(Target, TP,
+ WCC->CurRoom.name,
+ 0);
+}
+
void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP)
{
- wprintf("\n");
+ wc_printf("
\n");
embed_room_banner(NULL, navbar_default);
- wprintf("
\n");
+ wc_printf("
\n");
}
@@ -3867,209 +3372,338 @@ void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP)
StrBufAppendBufPlain(Target, WCC->ugname, -1, 0);
}
-
-int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- (!IsEmptyStr(WCC->ugname)) &&
- (strcasecmp(WCC->ugname, ChrPtr(WCC->wc_roomname)) == 0));
+ return (WCC != NULL)?
+ ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0;
}
-int ConditionalRoomHas_QR_PERMANENT(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_PERMANENT) != 0));
+ return (WCC == NULL)? 0 :
+ ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
+ (WCC->CurRoom.is_inbox) ||
+ (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) );
}
-int ConditionalRoomHas_QR_INUSE(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_INUSE) != 0));
+ return ((WCC!=NULL) &&
+ (!IsEmptyStr(WCC->ugname)) &&
+ (strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0));
}
-int ConditionalRoomHas_QR_PRIVATE(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_PRIVATE) != 0));
-}
-int ConditionalRoomHas_QR_PASSWORDED(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP)
{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_PASSWORDED) != 0));
-}
+ 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!");
-int ConditionalRoomHas_QR_GUESSNAME(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_GUESSNAME) != 0));
+ return ((Folder->RAFlags & UA_CheckFlag) != 0);
}
-int ConditionalRoomHas_QR_DIRECTORY(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_DIRECTORY) != 0));
-}
-int ConditionalRoomHas_QR_UPLOAD(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_UPLOAD) != 0));
-}
-int ConditionalRoomHas_QR_DOWNLOAD(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
{
+ long QR_CheckFlag;
wcsession *WCC = WC;
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_DOWNLOAD) != 0));
-}
+ QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if (QR_CheckFlag == 0)
+ LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+ "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
-int ConditionalRoomHas_QR_VISDIR(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_VISDIR) != 0));
+ ((WCC->CurRoom.QRFlags & QR_CheckFlag) != 0));
}
-int ConditionalRoomHas_QR_ANONONLY(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP)
{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_ANONONLY) != 0));
-}
+ long QR_CheckFlag;
+ folder *Folder = (folder *)(TP->Context);
-int ConditionalRoomHas_QR_ANONOPT(StrBuf *Target, WCTemplputParams *TP)
-{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_ANONOPT) != 0));
+ QR_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if (QR_CheckFlag == 0)
+ LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+ "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!");
+ return ((Folder->QRFlags & QR_CheckFlag) != 0);
}
-int ConditionalRoomHas_QR_NETWORK(StrBuf *Target, WCTemplputParams *TP)
+
+int ConditionalCurrentRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
{
+ long QR2_CheckFlag;
wcsession *WCC = WC;
+ QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if (QR2_CheckFlag == 0)
+ LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+ "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
+
return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_NETWORK) != 0));
+ ((WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0));
}
-int ConditionalRoomHas_QR_PREFONLY(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP)
{
- wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_PREFONLY) != 0));
+ long QR2_CheckFlag;
+ folder *Folder = (folder *)(TP->Context);
+
+ QR2_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0);
+ if (QR2_CheckFlag == 0)
+ LogTemplateError(Target, "Conditional", ERR_PARM1, TP,
+ "requires one of the #\"QR2*\"- defines or an integer flag 0 is invalid!");
+ return ((Folder->QRFlags2 & QR2_CheckFlag) != 0);
}
-int ConditionalRoomHas_QR_READONLY(StrBuf *Target, WCTemplputParams *TP)
+
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_READONLY) != 0));
+
+ return ( (WCC!= NULL) &&
+ ((WCC->axlevel >= 6) ||
+ ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ||
+ (WCC->CurRoom.is_inbox) ));
}
-int ConditionalRoomHas_QR_MAILBOX(StrBuf *Target, WCTemplputParams *TP)
+int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP)
{
wcsession *WCC = WC;
-
- return ((WCC!=NULL) &&
- ((WCC->room_flags & QR_MAILBOX) != 0));
+
+ if ((WCC == NULL) ||
+ (TP->Tokens->nParameters < 3))
+ {
+ return ((WCC->CurRoom.view < VIEW_BBS) ||
+ (WCC->CurRoom.view > VIEW_MAX));
+ }
+
+ return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS);
}
-int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
+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 ( (WCC!= NULL) &&
- ((WCC->axlevel >= 6) ||
- (WCC->is_room_aide) ||
- (WCC->is_mailbox) ));
+
+ return Whok;
}
void
InitModule_ROOMOPS
(void)
{
+ initialize_viewdefs();
RegisterPreference("roomlistview",
_("Room list view"),
PRF_STRING,
NULL);
RegisterPreference("emptyfloors", _("Show empty floors"), PRF_YESNO, NULL);
- RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, 0);
-
- WebcitAddUrlHandler(HKEY("knrooms"), knrooms, 0);
- WebcitAddUrlHandler(HKEY("gotonext"), _gotonext, NEED_URL);
- WebcitAddUrlHandler(HKEY("skip"), gotonext, NEED_URL);
- WebcitAddUrlHandler(HKEY("ungoto"), ungoto, NEED_URL);
- WebcitAddUrlHandler(HKEY("dotgoto"), dotgoto, NEED_URL);
- WebcitAddUrlHandler(HKEY("dotskip"), dotskip, NEED_URL);
- WebcitAddUrlHandler(HKEY("display_private"), _display_private, 0);
- WebcitAddUrlHandler(HKEY("goto_private"), goto_private, NEED_URL);
- WebcitAddUrlHandler(HKEY("zapped_list"), zapped_list, 0);
- WebcitAddUrlHandler(HKEY("display_zap"), display_zap, 0);
- WebcitAddUrlHandler(HKEY("zap"), zap, 0);
- WebcitAddUrlHandler(HKEY("display_entroom"), display_entroom, 0);
- WebcitAddUrlHandler(HKEY("entroom"), entroom, 0);
- WebcitAddUrlHandler(HKEY("display_whok"), display_whok, 0);
- WebcitAddUrlHandler(HKEY("do_invt_kick"), do_invt_kick, 0);
- WebcitAddUrlHandler(HKEY("display_editroom"), display_editroom, 0);
- WebcitAddUrlHandler(HKEY("netedit"), netedit, 0);
- WebcitAddUrlHandler(HKEY("editroom"), editroom, 0);
- WebcitAddUrlHandler(HKEY("delete_room"), delete_room, 0);
- WebcitAddUrlHandler(HKEY("set_room_policy"), set_room_policy, 0);
- WebcitAddUrlHandler(HKEY("set_floordiv_expanded"), set_floordiv_expanded, NEED_URL|AJAX);
- WebcitAddUrlHandler(HKEY("changeview"), change_view, 0);
- WebcitAddUrlHandler(HKEY("toggle_self_service"), toggle_self_service, 0);
- WebcitAddUrlHandler(HKEY("json_roomflr"), jsonRoomFlr, 0);
- RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, 0);
-
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PERMANENT"), 0, ConditionalRoomHas_QR_PERMANENT, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_INUSE"), 0, ConditionalRoomHas_QR_INUSE, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PRIVATE"), 0, ConditionalRoomHas_QR_PRIVATE, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PASSWORDED"), 0, ConditionalRoomHas_QR_PASSWORDED, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_GUESSNAME"), 0, ConditionalRoomHas_QR_GUESSNAME, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_DIRECTORY"), 0, ConditionalRoomHas_QR_DIRECTORY, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_UPLOAD"), 0, ConditionalRoomHas_QR_UPLOAD, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_DOWNLOAD"), 0, ConditionalRoomHas_QR_DOWNLOAD, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_VISIDIR"), 0, ConditionalRoomHas_QR_VISDIR, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_ANONONLY"), 0, ConditionalRoomHas_QR_ANONONLY, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_ANONOPT"), 0, ConditionalRoomHas_QR_ANONOPT, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_NETWORK"), 0, ConditionalRoomHas_QR_NETWORK, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_PREFONLY"), 0, ConditionalRoomHas_QR_PREFONLY, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_READONLY"), 0, ConditionalRoomHas_QR_READONLY, CTX_NONE);
- RegisterConditional(HKEY("COND:ROOM:FLAGS:QR_MAILBOX"), 0, ConditionalRoomHas_QR_MAILBOX, CTX_NONE);
+ 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);
+ WebcitAddUrlHandler(HKEY("display_private"), "", 0, _display_private, 0);
+ WebcitAddUrlHandler(HKEY("goto_private"), "", 0, goto_private, NEED_URL);
+ WebcitAddUrlHandler(HKEY("zapped_list"), "", 0, zapped_list, 0);
+ WebcitAddUrlHandler(HKEY("display_zap"), "", 0, display_zap, 0);
+ WebcitAddUrlHandler(HKEY("zap"), "", 0, zap, 0);
+ WebcitAddUrlHandler(HKEY("display_entroom"), "", 0, display_entroom, 0);
+ WebcitAddUrlHandler(HKEY("entroom"), "", 0, entroom, 0);
+ WebcitAddUrlHandler(HKEY("display_whok"), "", 0, display_whok, 0);
+ WebcitAddUrlHandler(HKEY("do_invt_kick"), "", 0, do_invt_kick, 0);
+ WebcitAddUrlHandler(HKEY("display_editroom"), "", 0, display_editroom, 0);
+ WebcitAddUrlHandler(HKEY("netedit"), "", 0, netedit, 0);
+ WebcitAddUrlHandler(HKEY("editroom"), "", 0, editroom, 0);
+ WebcitAddUrlHandler(HKEY("delete_room"), "", 0, delete_room, 0);
+ WebcitAddUrlHandler(HKEY("set_room_policy"), "", 0, set_room_policy, 0);
+ WebcitAddUrlHandler(HKEY("changeview"), "", 0, change_view, 0);
+ WebcitAddUrlHandler(HKEY("toggle_self_service"), "", 0, toggle_self_service, 0);
+ RegisterNamespace("ROOMBANNER", 0, 1, tmplput_roombanner, NULL, CTX_NONE);
+
+ RegisterConditional(HKEY("COND:ROOM:TYPE_IS"), 0, ConditionalIsRoomtype, CTX_NONE);
+ RegisterConditional(HKEY("COND:THISROOM:FLAG:QR"), 0, ConditionalCurrentRoomHas_QRFlag, CTX_NONE);
+ RegisterConditional(HKEY("COND:ROOM:FLAG:QR"), 0, ConditionalRoomHas_QRFlag, CTX_ROOMS);
+
+ 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);
+ RegisterConditional(HKEY("COND:THISROOM:HAVE_VIEW"), 0, ConditionalThisRoomHaveView, CTX_NONE);
+ RegisterNamespace("THISROOM:VIEW_STRING", 0, 1, tmplput_CurrentRoomViewString, NULL, CTX_NONE);
+ RegisterNamespace("ROOM:VIEW_STRING", 1, 2, tmplput_RoomViewString, 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(QR_PRIVATE);
+ REGISTERTokenParamDefine(QR_PASSWORDED);
+ REGISTERTokenParamDefine(QR_GUESSNAME);
+ REGISTERTokenParamDefine(QR_DIRECTORY);
+ REGISTERTokenParamDefine(QR_UPLOAD);
+ REGISTERTokenParamDefine(QR_DOWNLOAD);
+ REGISTERTokenParamDefine(QR_VISDIR);
+ REGISTERTokenParamDefine(QR_ANONONLY);
+ REGISTERTokenParamDefine(QR_ANONOPT);
+ REGISTERTokenParamDefine(QR_NETWORK);
+ REGISTERTokenParamDefine(QR_PREFONLY);
+ REGISTERTokenParamDefine(QR_READONLY);
+ REGISTERTokenParamDefine(QR_MAILBOX);
+ REGISTERTokenParamDefine(QR2_SYSTEM);
+ REGISTERTokenParamDefine(QR2_SELFLIST);
+ REGISTERTokenParamDefine(QR2_COLLABDEL);
+ REGISTERTokenParamDefine(QR2_SUBJECTREQ);
+ REGISTERTokenParamDefine(QR2_SMTP_PUBLIC);
+ REGISTERTokenParamDefine(QR2_MODERATED);
+
+ REGISTERTokenParamDefine(UA_KNOWN);
+ REGISTERTokenParamDefine(UA_GOTOALLOWED);
+ REGISTERTokenParamDefine(UA_HASNEWMSGS);
+ REGISTERTokenParamDefine(UA_ZAPPED);
+ REGISTERTokenParamDefine(UA_POSTALLOWED);
+ REGISTERTokenParamDefine(UA_ADMINALLOWED);
+ REGISTERTokenParamDefine(UA_DELETEALLOWED);
+ REGISTERTokenParamDefine(UA_ISTRASH);
+
+ REGISTERTokenParamDefine(US_NEEDVALID);
+ REGISTERTokenParamDefine(US_PERM);
+ REGISTERTokenParamDefine(US_LASTOLD);
+ REGISTERTokenParamDefine(US_EXPERT);
+ REGISTERTokenParamDefine(US_UNLISTED);
+ REGISTERTokenParamDefine(US_NOPROMPT);
+ REGISTERTokenParamDefine(US_PROMPTCTL);
+ REGISTERTokenParamDefine(US_DISAPPEAR);
+ REGISTERTokenParamDefine(US_REGIS);
+ REGISTERTokenParamDefine(US_PAGINATOR);
+ REGISTERTokenParamDefine(US_INTERNET);
+ REGISTERTokenParamDefine(US_FLOORS);
+ REGISTERTokenParamDefine(US_COLOR);
+ REGISTERTokenParamDefine(US_USER_SET);
+
+ REGISTERTokenParamDefine(VIEW_BBS);
+ REGISTERTokenParamDefine(VIEW_MAILBOX);
+ REGISTERTokenParamDefine(VIEW_ADDRESSBOOK);
+ REGISTERTokenParamDefine(VIEW_CALENDAR);
+ REGISTERTokenParamDefine(VIEW_TASKS);
+ REGISTERTokenParamDefine(VIEW_NOTES);
+ REGISTERTokenParamDefine(VIEW_WIKI);
+ REGISTERTokenParamDefine(VIEW_CALBRIEF);
+ 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);
+
+ RegisterConditional(HKEY("COND:ROOMAIDE"), 2, ConditionalRoomAide, CTX_NONE);
+ RegisterConditional(HKEY("COND:ACCESS:DELETE"), 2, ConditionalRoomAcessDelete, CTX_NONE);
RegisterConditional(HKEY("COND:UNGOTO"), 0, ConditionalHaveUngoto, CTX_NONE);
RegisterConditional(HKEY("COND:ROOM:EDITACCESS"), 0, ConditionalHaveRoomeditRights, CTX_NONE);
- RegisterNamespace("ROOM:UNGOTO", 0, 0, tmplput_ungoto, 0);
- RegisterIterator("FLOORS", 0, NULL, GetFloorListHash, NULL, DeleteHash, CTX_FLOORS, CTX_NONE, IT_NOFLAG);
- RegisterNamespace("FLOOR:INFO", 1, 2, tmplput_FLOOR_Value, CTX_FLOORS);
- RegisterIterator("LKRA", 0, NULL, GetRoomListHashLKRA, NULL, NULL, CTX_ROOMS, CTX_NONE, IT_NOFLAG);
- RegisterNamespace("ROOM:INFO", 1, 2, tmplput_ROOM_Value, CTX_ROOMS);
+ RegisterNamespace("CURRENT_ROOM", 0, 1, tmplput_current_room, NULL, CTX_NONE);
+ RegisterNamespace("ROOM:UNGOTO", 0, 0, tmplput_ungoto, NULL, CTX_NONE);
+ RegisterIterator("FLOORS", 0, NULL, GetFloorListHash, NULL, NULL, CTX_FLOORS, CTX_NONE, IT_NOFLAG);
+
+
}
+
+void
+SessionDestroyModule_ROOMOPS
+(wcsession *sess)
+{
+ FlushFolder(&sess->CurRoom);
+ if (sess->cache_fold != NULL) {
+ free(sess->cache_fold);
+ }
+
+ free_march_list(sess);
+ DeleteHash(&sess->Floors);
+ DeleteHash(&sess->Rooms);
+ DeleteHash(&sess->FloorsByName);
+}
+
+
/*@}*/