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};
+
+void display_whok(void);
+
/*
* Initialize the viewdefs with localized strings
*/
/*
* Free a session's march list
*/
-void free_march_list(struct wcsession *wcf)
+void free_march_list(wcsession *wcf)
{
struct march *mptr;
/*
* remove a room from the march list
*/
-void remove_march(char *aaa)
+void remove_march(const StrBuf *aaa)
{
struct march *mptr, *mptr2;
if (WC->march == NULL)
return;
- if (!strcasecmp(WC->march->march_name, aaa)) {
+ if (!strcasecmp(WC->march->march_name, ChrPtr(aaa))) {
mptr = WC->march->next;
free(WC->march);
WC->march = mptr;
}
mptr2 = WC->march;
for (mptr = WC->march; mptr != NULL; mptr = mptr->next) {
- if (!strcasecmp(mptr->march_name, aaa)) {
+ if (!strcasecmp(mptr->march_name, ChrPtr(aaa))) {
mptr2->next = mptr->next;
free(mptr);
mptr = mptr2;
*/
void zapped_list(void)
{
+ WCTemplputParams SubTP;
+ StrBuf *Buf;
+
output_headers(1, 1, 1, 0, 0, 0);
+ memset(&SubTP, 0, sizeof(WCTemplputParams));
+ Buf = NewStrBufPlain(_("Zapped (forgotten) rooms"), -1);
+ SubTP.ContextType = CTX_STRBUF;
+ SubTP.Context = Buf;
+ DoTemplate(HKEY("beginbox"), NULL, &SubTP);
- svput("BOXTITLE", WCS_STRING, _("Zapped (forgotten) rooms"));
- do_template("beginbox");
+ FreeStrBuf(&Buf);
listrms("LZRM -1");
wprintf("<br /><br />\n");
wprintf(_("Click on any room to un-zap it and goto that room.\n"));
- do_template("endbox");
+ do_template("endbox", NULL);
wDumpContent(1);
}
/**
* \brief read this room's info file (set v to 1 for verbose mode)
*/
-void readinfo(void)
+void readinfo(StrBuf *Target, WCTemplputParams *TP)
{
char buf[256];
char briefinfo[128];
* keep the browser from using a cached icon from
* another room.
*/
-void embed_room_graphic(void) {
+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("<img height=\"64px\" src=\"image&name=_roompic_&room=");
- urlescputs(WC->wc_roomname);
+ urlescputs(ChrPtr(WC->wc_roomname));
wprintf("\">");
serv_puts("CLOS");
serv_getln(buf, sizeof buf);
/**
* \brief Display the current view and offer an option to change it
*/
-void embed_view_o_matic(void) {
+void embed_view_o_matic(StrBuf *Target, WCTemplputParams *TP)
+{
int i;
wprintf("<form name=\"viewomatic\" action=\"changeview\">\n");
/**
* \brief Display a search box
*/
-void embed_search_o_matic(void) {
+void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP)
+{
wprintf("<form name=\"searchomatic\" action=\"do_search\">\n");
wprintf("<div style=\"display: inline;\"><input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
wprintf("<label for=\"search_name\">");
wprintf(_("Search: "));
wprintf("</label><input ");
wprintf("%s", serv_info.serv_fulltext_enabled ? "" : "disabled ");
- wprintf("type=\"text\" name=\"query\" size=\"15\" maxlength=\"128\" "
+ wprintf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" "
"id=\"search_name\" class=\"inputbox\">\n"
);
wprintf("</div></form>\n");
void embed_room_banner(char *got, int navbar_style) {
char buf[256];
char buf2[1024];
- char sanitized_roomname[256];
char with_files[256];
int file_count=0;
* If it isn't supplied, we fake it by issuing our own GOTO.
*/
if (got == NULL) {
- serv_printf("GOTO %s", WC->wc_roomname);
+ memset(buf, '0', 20);
+ buf[20] = '\0';
+ serv_printf("GOTO %s", ChrPtr(WC->wc_roomname));
serv_getln(buf, sizeof buf);
got = buf;
}
* a "skip" or "gotonext" or something like that.
*/
snprintf(WC->this_page, sizeof(WC->this_page), "dotskip&room=%s",
- WC->wc_roomname);
+ ChrPtr(WC->wc_roomname));
/** Check for new mail. */
WC->new_mail = extract_int(&got[4], 9);
if (buf2[0] == '1') while (serv_getln(buf2, sizeof buf2), strcmp(buf2, "000"))
file_count++;
snprintf (with_files, sizeof with_files,
- "; <a href=\"display_room_directory\"> %d %s </a>",
+ "; <a href=\"do_template?template=files\"> %d %s </a>",
file_count,
((file_count>1) || (file_count == 0) ? _("files") : _("file")));
}
else
strcpy (with_files, "");
-
- stresc(sanitized_roomname, 256, WC->wc_roomname, 1, 1);
- svprintf(HKEY("ROOMNAME"), WCS_STRING, "%s", sanitized_roomname);
+
svprintf(HKEY("NUMMSGS"), WCS_STRING,
_("%d new of %d messages%s"),
extract_int(&got[4], 1),
);
svcallback("ROOMPIC", embed_room_graphic);
svcallback("ROOMINFO", readinfo);
- svcallback("VIEWOMATIC", embed_view_o_matic);
+ svcallback("VIEWOMATIC", embed_view_o_matic);
svcallback("SEARCHOMATIC", embed_search_o_matic);
- svcallback("START", offer_start_page);
-
- do_template("roombanner");
- if (navbar_style != navbar_none) {
+ svcallback("START", offer_start_page);
+
+ do_template("roombanner", NULL);
+ /* roombanner contains this for mobile */
+ if (navbar_style != navbar_none && !WC->is_mobile) {
wprintf("<div id=\"navbar\"><ul>");
case VIEW_MAILBOX:
wprintf(
"<li class=\"readallmess\">"
- "<a href=\"readfwd\">"
+ "<a id=\"m_refresh\" href=\"readfwd\">"
"<img src=\"static/readallmess3_24x.gif\" "
"alt=\"\">"
"<span class=\"navbar_link\">"
"%s"
- "</span></a></li>\n", _("View message list")
+ "</span></a></li>\n", _("Refresh message list")
);
break;
case VIEW_WIKI:
/*
* back end routine to take the session to a new room
*/
-int gotoroom(char *gname)
+long gotoroom(const StrBuf *gname)
{
- char buf[SIZ];
+ StrBuf *Buf;
static long ls = (-1L);
- int err = 0;
+ long err = 0;
/* store ungoto information */
- strcpy(WC->ugname, WC->wc_roomname);
+ strcpy(WC->ugname, ChrPtr(WC->wc_roomname));
WC->uglsn = ls;
-
+ Buf = NewStrBuf();
/** move to the new room */
- serv_printf("GOTO %s", gname);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') {
- buf[3] = 0;
- err = atoi(buf);
+ serv_printf("GOTO %s", ChrPtr(gname));
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, &err) != 2) {
serv_puts("GOTO _BASEROOM_");
- serv_getln(buf, sizeof buf);
- }
- if (buf[0] != '2') {
- buf[3] = 0;
- err = atoi(buf);
- return err;
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, &err) != 2) {
+ FreeStrBuf(&Buf);
+ return err;
+ }
}
- extract_token(WC->wc_roomname, &buf[4], 0, '|', sizeof WC->wc_roomname);
- WC->room_flags = extract_int(&buf[4], 4);
+
+ 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 = extract_int(&buf[4],7);
- ls = extract_long(&buf[4], 6);
- WC->wc_floor = extract_int(&buf[4], 10);
- WC->wc_view = extract_int(&buf[4], 11);
- WC->wc_default_view = extract_int(&buf[4], 12);
- WC->wc_is_trash = extract_int(&buf[4], 13);
- WC->room_flags2 = extract_int(&buf[4], 14);
+ 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) extract_int(&buf[4], 8);
+ WC->is_room_aide = (char) StrBufExtract_int(Buf, 8, '|');
remove_march(WC->wc_roomname);
- if (!strcasecmp(gname, "_BASEROOM_"))
+ if (!strcasecmp(ChrPtr(gname), "_BASEROOM_"))
remove_march(gname);
+ FreeStrBuf(&Buf);
return err;
}
struct march *mptr = NULL;
struct march *mptr2 = NULL;
char room_name[128];
- char next_room[128];
+ StrBuf *next_room;
int ELoop = 0;
/*
continue;
}
extract_token(room_name, buf, 0, '|', sizeof room_name);
- if (strcasecmp(room_name, WC->wc_roomname)) {
+ 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);
remove_march(WC->wc_roomname);
}
if (WC->march != NULL) {
- strcpy(next_room, pop_march(-1));
+ next_room = NewStrBufPlain(pop_march(-1), -1);/*TODO: migrate march to strbuf */
} else {
- strcpy(next_room, "_BASEROOM_");
+ next_room = NewStrBufPlain(HKEY("_BASEROOM_"));
}
smart_goto(next_room);
+ FreeStrBuf(&next_room);
}
/*
* goto next room
*/
-void smart_goto(char *next_room) {
+void smart_goto(const StrBuf *next_room) {
gotoroom(next_room);
- readloop("readnew");
+ readloop(readnew);
}
*/
void ungoto(void)
{
- char buf[SIZ];
+ StrBuf *Buf;
if (!strcmp(WC->ugname, "")) {
smart_goto(WC->wc_roomname);
return;
}
serv_printf("GOTO %s", WC->ugname);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') {
+ Buf = NewStrBuf();
+ 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);
- serv_getln(buf, sizeof buf);
+ StrBuf_ServGetln(Buf);
}
- strcpy(buf, WC->ugname);
+ FlushStrBuf(Buf);
+ StrBufAppendBufPlain(Buf, WC->ugname, -1, 0);
strcpy(WC->ugname, "");
- smart_goto(buf);
+ smart_goto(Buf);
+ FreeStrBuf(&Buf);
}
typedef struct __room_states {
wprintf("<tr><td>");
wprintf(_("Message expire policy for this room"));
wprintf("<br />(");
- escputs(WC->wc_roomname);
+ escputs(ChrPtr(WC->wc_roomname));
wprintf(")</td><td>");
wprintf("<input type=\"radio\" NAME=\"roompolicy\" VALUE=\"0\" %s>",
((roompolicy == 0) ? "CHECKED" : "") );
wprintf("<td>%s</td>", extract_int(buf, 4) ? _("Yes") : _("No"));
- wprintf("<td>%ld</td>", extract_long(buf, 5)); // Fetching interval
+ wprintf("<td>%ld</td>", extract_long(buf, 5)); /* Fetching interval */
wprintf("<td class=\"button_link\">");
wprintf(" <a href=\"netedit&cmd=remove&tab=feeds&line=pop3client|");
*/
void editroom(void)
{
- char buf[SIZ];
- char er_name[128];
- char er_password[10];
- char er_dirname[15];
- char er_roomaide[26];
+ const StrBuf *Ptr;
+ StrBuf *Buf;
+ StrBuf *er_name;
+ StrBuf *er_password;
+ StrBuf *er_dirname;
+ StrBuf *er_roomaide;
int er_floor;
unsigned er_flags;
int er_listingorder;
return;
}
serv_puts("GETR");
- serv_getln(buf, sizeof buf);
-
- if (buf[0] != '2') {
- strcpy(WC->ImportantMessage, &buf[4]);
+ Buf = NewStrBuf();
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ StrBufCutLeft(Buf, 4);
+ strcpy(WC->ImportantMessage, ChrPtr(Buf));
display_editroom();
+ FreeStrBuf(&Buf);
return;
}
- extract_token(er_name, &buf[4], 0, '|', sizeof er_name);
- extract_token(er_password, &buf[4], 1, '|', sizeof er_password);
- extract_token(er_dirname, &buf[4], 2, '|', sizeof er_dirname);
- er_flags = extract_int(&buf[4], 3);
- er_listingorder = extract_int(&buf[4], 5);
- er_defaultview = extract_int(&buf[4], 6);
- er_flags2 = extract_int(&buf[4], 7);
-
- strcpy(er_roomaide, bstr("er_roomaide"));
- if (IsEmptyStr(er_roomaide)) {
+ StrBufCutLeft(Buf, 4);
+ StrBufExtract_token(er_name, Buf, 0, '|');
+ StrBufExtract_token(er_password, Buf, 1, '|');
+ StrBufExtract_token(er_dirname, Buf, 2, '|');
+ er_flags = StrBufExtract_int(Buf, 3, '|');
+ er_listingorder = StrBufExtract_int(Buf, 5, '|');
+ er_defaultview = StrBufExtract_int(Buf, 6, '|');
+ er_flags2 = StrBufExtract_int(Buf, 7, '|');
+
+ er_roomaide = NewStrBufDup(sbstr("er_roomaide"));
+ if (StrLength(er_roomaide) == 0) {
serv_puts("GETA");
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') {
- strcpy(er_roomaide, "");
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ FlushStrBuf(er_roomaide);
} else {
- extract_token(er_roomaide, &buf[4], 0, '|', sizeof er_roomaide);
+ StrBufCutLeft(Buf, 4);
+ StrBufExtract_token(er_roomaide, Buf, 0, '|');
}
}
- strcpy(buf, bstr("er_name"));
- buf[128] = 0;
- if (!IsEmptyStr(buf)) {
- strcpy(er_name, buf);
+ Ptr = sbstr("er_name");
+ if (StrLength(Ptr) > 0) {
+ FlushStrBuf(er_name);
+ StrBufAppendBuf(er_name, Ptr, 0);
}
- strcpy(buf, bstr("er_password"));
- buf[10] = 0;
- if (!IsEmptyStr(buf))
- strcpy(er_password, buf);
+ Ptr = sbstr("er_password");
+ if (StrLength(Ptr) > 0) {
+ FlushStrBuf(er_password);
+ StrBufAppendBuf(er_password, Ptr, 0);
+ }
+
+
+ Ptr = sbstr("er_dirname");
+ if (StrLength(Ptr) > 0) { /* todo: cut 15 */
+ FlushStrBuf(er_dirname);
+ StrBufAppendBuf(er_dirname, Ptr, 0);
+ }
- strcpy(buf, bstr("er_dirname"));
- buf[15] = 0;
- if (!IsEmptyStr(buf))
- strcpy(er_dirname, buf);
- strcpy(buf, bstr("type"));
+ Ptr = sbstr("type");
er_flags &= !(QR_PRIVATE | QR_PASSWORDED | QR_GUESSNAME);
- if (!strcmp(buf, "invonly")) {
+ if (!strcmp(ChrPtr(Ptr), "invonly")) {
er_flags |= (QR_PRIVATE);
}
- if (!strcmp(buf, "hidden")) {
+ if (!strcmp(ChrPtr(Ptr), "hidden")) {
er_flags |= (QR_PRIVATE | QR_GUESSNAME);
}
- if (!strcmp(buf, "passworded")) {
+ if (!strcmp(ChrPtr(Ptr), "passworded")) {
er_flags |= (QR_PRIVATE | QR_PASSWORDED);
}
- if (!strcmp(buf, "personal")) {
+ if (!strcmp(ChrPtr(Ptr), "personal")) {
er_flags |= QR_MAILBOX;
} else {
er_flags &= ~QR_MAILBOX;
er_flags &= ~QR_VISDIR;
}
- strcpy(buf, bstr("anon"));
+ Ptr = sbstr("anon");
er_flags &= ~(QR_ANONONLY | QR_ANONOPT);
- if (!strcmp(buf, "anononly"))
+ if (!strcmp(ChrPtr(Ptr), "anononly"))
er_flags |= QR_ANONONLY;
- if (!strcmp(buf, "anon2"))
+ if (!strcmp(ChrPtr(Ptr), "anon2"))
er_flags |= QR_ANONOPT;
- bump = 0;
- if (!strcmp(bstr("bump"), "yes"))
- bump = 1;
+ bump = yesbstr("bump");
er_floor = ibstr("er_floor");
- sprintf(buf, "SETR %s|%s|%s|%u|%d|%d|%d|%d|%u",
- er_name, er_password, er_dirname, er_flags, bump, er_floor,
- er_listingorder, er_defaultview, er_flags2);
- serv_puts(buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') {
- strcpy(WC->ImportantMessage, &buf[4]);
+ StrBufPrintf(Buf, "SETR %s|%s|%s|%u|%d|%d|%d|%d|%u",
+ ChrPtr(er_name),
+ ChrPtr(er_password),
+ ChrPtr(er_dirname),
+ er_flags,
+ bump,
+ er_floor,
+ er_listingorder,
+ er_defaultview,
+ er_flags2);
+ serv_putbuf(Buf);
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ strcpy(WC->ImportantMessage, &ChrPtr(Buf)[4]);
display_editroom();
+ FreeStrBuf(&Buf);
+ FreeStrBuf(&er_name);
+ FreeStrBuf(&er_password);
+ FreeStrBuf(&er_dirname);
+ FreeStrBuf(&er_roomaide);
return;
}
gotoroom(er_name);
- if (!IsEmptyStr(er_roomaide)) {
- sprintf(buf, "SETA %s", er_roomaide);
- serv_puts(buf);
- serv_getln(buf, sizeof buf);
- if (buf[0] != '2') {
- strcpy(WC->ImportantMessage, &buf[4]);
+ if (StrLength(er_roomaide) > 0) {
+ serv_printf("SETA %s", ChrPtr(er_roomaide));
+ StrBuf_ServGetln(Buf);
+ if (GetServerStatus(Buf, NULL) != 2) {
+ strcpy(WC->ImportantMessage, &ChrPtr(Buf)[4]);
display_main_menu();
+ FreeStrBuf(&Buf);
+ FreeStrBuf(&er_name);
+ FreeStrBuf(&er_password);
+ FreeStrBuf(&er_dirname);
+ FreeStrBuf(&er_roomaide);
return;
}
}
gotoroom(er_name);
strcpy(WC->ImportantMessage, _("Your changes have been saved."));
display_editroom();
+ FreeStrBuf(&Buf);
+ FreeStrBuf(&er_name);
+ FreeStrBuf(&er_password);
+ FreeStrBuf(&er_dirname);
+ FreeStrBuf(&er_roomaide);
return;
}
output_headers(1, 1, 1, 0, 0, 0);
svprintf(HKEY("BOXTITLE"), WCS_STRING, _("Create a new room"));
- do_template("beginbox");
+ do_template("beginbox", NULL);
wprintf("<form name=\"create_room_form\" method=\"POST\" action=\"entroom\">\n");
wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
fmout("LEFT");
}
- do_template("endbox");
+ do_template("endbox", NULL);
wDumpContent(1);
}
void entroom(void)
{
char buf[SIZ];
- char er_name[SIZ];
- char er_type[SIZ];
- char er_password[SIZ];
+ const StrBuf *er_name;
+ const StrBuf *er_type;
+ const StrBuf *er_password;
int er_floor;
int er_num_type;
int er_view;
display_main_menu();
return;
}
- strcpy(er_name, bstr("er_name"));
- strcpy(er_type, bstr("type"));
- strcpy(er_password, bstr("er_password"));
+ er_name = sbstr("er_name");
+ er_type = sbstr("type");
+ er_password = sbstr("er_password");
er_floor = ibstr("er_floor");
er_view = ibstr("er_view");
er_num_type = 0;
- if (!strcmp(er_type, "hidden"))
+ if (!strcmp(ChrPtr(er_type), "hidden"))
er_num_type = 1;
- if (!strcmp(er_type, "passworded"))
+ else if (!strcmp(ChrPtr(er_type), "passworded"))
er_num_type = 2;
- if (!strcmp(er_type, "invonly"))
+ else if (!strcmp(ChrPtr(er_type), "invonly"))
er_num_type = 3;
- if (!strcmp(er_type, "personal"))
+ else if (!strcmp(ChrPtr(er_type), "personal"))
er_num_type = 4;
- sprintf(buf, "CRE8 1|%s|%d|%s|%d|%d|%d",
- er_name, er_num_type, er_password, er_floor, 0, er_view);
- serv_puts(buf);
+ serv_printf("CRE8 1|%s|%d|%s|%d|%d|%d",
+ ChrPtr(er_name),
+ er_num_type,
+ ChrPtr(er_password),
+ er_floor,
+ 0,
+ er_view);
+
serv_getln(buf, sizeof buf);
if (buf[0] != '2') {
strcpy(WC->ImportantMessage, &buf[4]);
*/
void display_private(char *rname, int req_pass)
{
+ WCTemplputParams SubTP;
+ StrBuf *Buf;
output_headers(1, 1, 1, 0, 0, 0);
- svprintf(HKEY("BOXTITLE"), WCS_STRING, _("Go to a hidden room"));
- do_template("beginbox");
+ Buf = NewStrBufPlain(_("Go to a hidden room"), -1);
+ memset(&SubTP, 0, sizeof(WCTemplputParams));
+ SubTP.ContextType = CTX_STRBUF;
+ SubTP.Context = Buf;
+ DoTemplate(HKEY("beginbox"), NULL, &SubTP);
+
+ FreeStrBuf(&Buf);
wprintf("<p>");
wprintf(_("If you know the name of a hidden (guess-name) or "
);
wprintf("</div></form>\n");
- do_template("endbox");
+ do_template("endbox", NULL);
wDumpContent(1);
}
display_main_menu();
return;
}
- strcpy(hold_rm, WC->wc_roomname);
- strcpy(buf, "GOTO ");
- strcat(buf, bstr("gr_name"));
- strcat(buf, "|");
- strcat(buf, bstr("gr_pass"));
- serv_puts(buf);
+ strcpy(hold_rm, ChrPtr(WC->wc_roomname));
+ serv_printf("GOTO %s|%s",
+ bstr("gr_name"),
+ bstr("gr_pass"));
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
- smart_goto(bstr("gr_name"));
+ smart_goto(sbstr("gr_name"));
return;
}
if (!strncmp(buf, "540", 3)) {
wprintf("<div id=\"content\" class=\"service\">\n");
wprintf(_("If you select this option, <em>%s</em> will "
- "disappear from your room list. Is this what you wish "
- "to do?<br />\n"), WC->wc_roomname);
+ "disappear from your room list. Is this what you wish "
+ "to do?<br />\n"), ChrPtr(WC->wc_roomname));
wprintf("<form method=\"POST\" action=\"zap\">\n");
wprintf("<input type=\"hidden\" name=\"nonce\" value=\"%d\">\n", WC->nonce);
void zap(void)
{
char buf[SIZ];
- char final_destination[SIZ];
+ StrBuf *final_destination;
/**
* If the forget-room routine fails for any reason, we fall back
* to the current room; otherwise, we go to the Lobby
*/
- strcpy(final_destination, WC->wc_roomname);
+ final_destination = NewStrBufDup(WC->wc_roomname);
if (havebstr("ok_button")) {
- serv_printf("GOTO %s", WC->wc_roomname);
+ serv_printf("GOTO %s", ChrPtr(WC->wc_roomname));
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
serv_puts("FORG");
serv_getln(buf, sizeof buf);
if (buf[0] == '2') {
- strcpy(final_destination, "_BASEROOM_");
+ FlushStrBuf(final_destination);
+ StrBufAppendBufPlain(final_destination, HKEY("_BASEROOM_"), 0);
}
}
}
smart_goto(final_destination);
+ FreeStrBuf(&final_destination);
}
display_main_menu();
return;
} else {
- smart_goto("_BASEROOM_");
+ StrBuf *Buf;
+
+ Buf = NewStrBufPlain(HKEY("_BASEROOM_"));
+ smart_goto(Buf);
+ FreeStrBuf(&Buf);
}
}
char cmpb0[SIZ];
char cmpb1[SIZ];
int i, num_addrs;
- // TODO: do line dynamic!
+ /*/ TODO: do line dynamic! */
if (havebstr("line_pop3host")) {
strcpy(line, bstr("prefix"));
strcat(line, bstr("line_pop3host"));
char buf[256];
char floor_name[256];
char old_floor_name[256];
- char boxtitle[256];
int levels, oldlevels;
int i, t;
int num_boxes = 0;
if ( (strcasecmp(floor_name, old_floor_name))
&& (!IsEmptyStr(old_floor_name)) ) {
/* End inner box */
- do_template("endbox");
+ do_template("endbox", NULL);
wprintf("<br>");
++num_boxes;
strcpy(old_floor_name, floor_name);
if (levels == 1) {
- /** Begin inner box */
- stresc(boxtitle, 256, floor_name, 1, 0);
- svprintf(HKEY("BOXTITLE"), WCS_STRING, boxtitle);
- do_template("beginbox");
+ StrBuf *Buf;
+ WCTemplputParams SubTP;
+
+ Buf = NewStrBufPlain(floor_name, -1);
+ memset(&SubTP, 0, sizeof(WCTemplputParams));
+ SubTP.ContextType = CTX_STRBUF;
+ SubTP.Context = Buf;
+ DoTemplate(HKEY("beginbox"), NULL, &SubTP);
+
+ FreeStrBuf(&Buf);
}
oldlevels = levels;
}
}
/** End the final inner box */
- do_template("endbox");
+ do_template("endbox", NULL);
wprintf("</td></tr></table>\n");
}
* \brief print a floor div???
* \param which_floordiv name of the floordiv???
*/
-void set_floordiv_expanded(char *which_floordiv) {
- begin_ajax_response();
- StrBufPrintf(WC->floordiv_expanded, "%s", which_floordiv);
- end_ajax_response();
+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;
}
/**
char floordiv_id[32];
int levels, oldlevels;
int i, t;
- int num_drop_targets = 0;
char *icon = NULL;
strcpy(floor_name, "");
wprintf("</div>\n"); /** floordiv */
- /** BEGIN: The old invisible pixel trick, to get our JavaScript to initialize */
- wprintf("<img src=\"static/blank.gif\" onLoad=\"\n");
-
- num_drop_targets = 0;
-
- for (i=0; i<max_folders; ++i) {
- levels = num_tokens(fold[i].name, '|');
- if (levels > 1) {
- wprintf("drop_targets_elements[%d]=$('roomdiv%d');\n", num_drop_targets, i);
- wprintf("drop_targets_roomnames[%d]='", num_drop_targets);
- jsescputs(fold[i].room);
- wprintf("';\n");
- ++num_drop_targets;
- }
- }
-
- wprintf("num_drop_targets = %d;\n", num_drop_targets);
- if ((ChrPtr(WC->floordiv_expanded)[0] != '\0')&&
- (ChrPtr(WC->floordiv_expanded)[1] != '\0')){
- wprintf("which_div_expanded = '%s';\n", ChrPtr(WC->floordiv_expanded));
- }
-
- wprintf("\">\n");
- /** END: The old invisible pixel trick, to get our JavaScript to initialize */
}
floor_mapping[fold[i].floor]=i;
/** refresh the messages index for this room */
-// serv_puts("GOTO ");
-// while (serv_getln(buf, sizeof buf), strcmp(buf, "000"));
+/* TODO serv_puts("GOTO ");
+ while (serv_getln(buf, sizeof buf), strcmp(buf, "000")); */
/** Now add rooms */
serv_puts("LKRA");
serv_getln(buf, sizeof buf);
/** offer the ability to switch views */
wprintf("<ul class=\"room_actions\">\n");
wprintf("<li class=\"start_page\">");
- offer_start_page();
+ offer_start_page(NULL, &NoCtx);
wprintf("</li>");
wprintf("<li><form name=\"roomlistomatic\">\n"
"<select name=\"newview\" size=\"1\" "
if (WC->axlevel >= 6) {
strcat(WC->ImportantMessage, "<br />\n");
- serv_printf("SPEX floor|%d|%d", ibstr("floorpolicy"), bstr("floorvalue"));
+ serv_printf("SPEX floor|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue"));
serv_getln(buf, sizeof buf);
strcat(WC->ImportantMessage, &buf[4]);
}
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")) {
+ floor = NewHash(1, NULL);
+ int a;
+ const char *floorNum;
+ for(a=0; a<FLOOR_PARAM_LEN; a++) {
+ Buf2 = NewStrBuf();
+ StrBufExtract_token(Buf2, Buf, a, '|');
+ if (a==0) {
+ floorNum = ChrPtr(Buf2); // hmm, should we copy Buf2 first?
+ }
+ Put(floor, FPKEY(a), Buf2, NULL);
+ }
+ Put(floors, HKEY(floorNum), floor, NULL);
+ }
+ FreeStrBuf(&Buf);
+ return floors;
+}
+
+void tmplput_FLOOR_Value(StrBuf *TemplBuffer, WCTemplputParams *TP) {
+ HashList *floor = (HashList *)(TP->Context);
+ void *value;
+ GetHash(floor, TKEY(0), &value);
+ StrBuf *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")) {
+ room = NewHash(1, NULL);
+ int i;
+ const char *rmName;
+ for(i=0; i<ROOM_PARAM_LEN; i++) {
+ buf2 = NewStrBuf();
+ StrBufExtract_token(buf2, buf, i, '|');
+ if (i==0) {
+ rmName = ChrPtr(buf2);
+ }
+ Put(room, RPKEY(i), buf2, NULL);
+ }
+ Put(rooms, rmName, strlen(rmName), room, NULL);
+ }
+ SortByHashKey(rooms, 1);
+ //SortByPayload(rooms, SortRoomsByListOrder);
+ FreeStrBuf(&buf);
+ return rooms;
+}
+/** Unused function that orders rooms by the listorder flag */
+int SortRoomsByListOrder(const void *room1, const void *room2) {
+ HashList *r1 = (HashList *)GetSearchPayload(room1);
+ HashList *r2 = (HashList *)GetSearchPayload(room2);
+ StrBuf *listOrderBuf1;
+ StrBuf *listOrderBuf2;
+
+ GetHash(r1, RPKEY(3), (void *)&listOrderBuf1);
+ GetHash(r2, RPKEY(3), (void *)&listOrderBuf2);
+ int l1 = atoi(ChrPtr(listOrderBuf1));
+ int l2 = atoi(ChrPtr(listOrderBuf2));
+ if (l1 < l2) return -1;
+ else if (l1 > l2) return +1;
+ else return 0;
+}
+void tmplput_ROOM_Value(StrBuf *TemplBuffer, WCTemplputParams *TP) {
+ HashList *room = (HashList *)(TP->Context);
+ void *value;
+ GetHash(room, TKEY(0), &value);
+ StrBuf *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(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);
+}
+
+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 */
+ slrp_highest();
+ }
+ smart_goto(sbstr("room"));
+}
+
+void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP)
+{
+ wprintf("<div id=\"banner\">\n");
+ embed_room_banner(NULL, navbar_default);
+ wprintf("</div>\n");
+}
+
+
+void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ if ((WCC!=NULL) &&
+ (!IsEmptyStr(WCC->ugname)))
+ StrBufAppendBufPlain(Target, WCC->ugname, -1, 0);
+}
+
+
+int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ (!IsEmptyStr(WCC->ugname)) &&
+ (strcasecmp(WCC->ugname, ChrPtr(WCC->wc_roomname)) == 0));
+}
+
+int ConditionalRoomHas_QR_PERMANENT(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_PERMANENT) != 0));
+}
+
+int ConditionalRoomHas_QR_INUSE(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_INUSE) != 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)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_PASSWORDED) != 0));
+}
+
+int ConditionalRoomHas_QR_GUESSNAME(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_GUESSNAME) != 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)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_DOWNLOAD) != 0));
+}
+
+int ConditionalRoomHas_QR_VISDIR(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_VISDIR) != 0));
+}
+
+int ConditionalRoomHas_QR_ANONONLY(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_ANONONLY) != 0));
+}
+
+int ConditionalRoomHas_QR_ANONOPT(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_ANONOPT) != 0));
+}
+
+int ConditionalRoomHas_QR_NETWORK(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_NETWORK) != 0));
+}
+
+int ConditionalRoomHas_QR_PREFONLY(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_PREFONLY) != 0));
+}
+
+int ConditionalRoomHas_QR_READONLY(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_READONLY) != 0));
+}
+
+int ConditionalRoomHas_QR_MAILBOX(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ((WCC!=NULL) &&
+ ((WCC->room_flags & QR_MAILBOX) != 0));
+}
+
+
+int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP)
+{
+ wcsession *WCC = WC;
+
+ return ( (WCC!= NULL) &&
+ ((WCC->axlevel >= 6) ||
+ (WCC->is_room_aide) ||
+ (WCC->is_mailbox) ));
+}
+
+void
+InitModule_ROOMOPS
+(void)
+{
+ RegisterPreference(HKEY("roomlistview"),
+ _("Room list view"),
+ PRF_STRING,
+ NULL);
+ RegisterPreference(HKEY("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);
+
+ 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);
+}
+
/*@}*/