X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Froomops.c;h=04e251dffec2ba2ec15ad4870024290be9155886;hb=43f31099eaba09e5f9918279ff114940c7607798;hp=ef14c2026c6eb6caa1ea3581a8e34e678132e6da;hpb=1a9e08616fa839db9a46a4f2c6d9e34420150b81;p=citadel.git diff --git a/webcit/roomops.c b/webcit/roomops.c index ef14c2026..04e251dff 100644 --- a/webcit/roomops.c +++ b/webcit/roomops.c @@ -5,393 +5,130 @@ #include "webcit.h" #include "webserver.h" -#define MAX_FLOORS 128 -char floorlist[MAX_FLOORS][SIZ]; /* list of our floor names */ +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 */ + +ROOM_VIEWS allowed_default_views[VIEW_MAX] = { + 1, /* VIEW_BBS Bulletin board view */ + 1, /* VIEW_MAILBOX Mailbox summary */ + 1, /* VIEW_ADDRESSBOOK Address book view */ + 1, /* VIEW_CALENDAR Calendar view */ + 1, /* VIEW_TASKS Tasks view */ + 1, /* VIEW_NOTES Notes view */ + 1, /* VIEW_WIKI Wiki view */ + 0, /* VIEW_CALBRIEF Brief Calendar view */ + 0, /* VIEW_JOURNAL Journal view */ + 0 /* VIEW_BLOG Blog view (not yet implemented) */ +}; -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. - */ - -void display_whok(void); /* * 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"); -} - -/* - * Determine which views are allowed as the default for creating a new room. - */ -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); - case VIEW_WIKI: return(1); - case VIEW_CALBRIEF: return(0); - case VIEW_JOURNAL: return(0); - default: return(0); /* should never get here */ - } -} - - -/* - * load the list of floors - */ -void load_floorlist(StrBuf *Buf) -{ - int a; - int Done = 0; - - for (a = 0; a < MAX_FLOORS; ++a) - floorlist[a][0] = 0; - - serv_puts("LFLR"); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 1) { - strcpy(floorlist[0], "Main Floor"); - return; - } - 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]); - } -} - - - - -/* - * display rooms in tree structure - */ -void room_tree_list(struct roomlisting *rp) -{ - char rmname[64]; - int f; - - if (rp == NULL) { - return; - } - - room_tree_list(rp->lnext); - - strcpy(rmname, rp->rlname); - f = rp->rlflags; - - wc_printf(""); - escputs1(rmname, 1, 1); - if ((f & QR_DIRECTORY) && (f & QR_NETWORK)) - wc_printf("}"); - else if (f & QR_DIRECTORY) - wc_printf("]"); - else if (f & QR_NETWORK) - wc_printf(")"); - else - wc_printf(">"); - wc_printf(" \n"); - - room_tree_list(rp->rnext); - free(rp); -} - - -/* - * Room ordering stuff (compare first by floor, then by order) - */ -int rordercmp(struct roomlisting *r1, struct roomlisting *r2) -{ - if ((r1 == NULL) && (r2 == NULL)) - return (0); - if (r1 == NULL) - return (-1); - if (r2 == NULL) - return (1); - if (r1->rlfloor < r2->rlfloor) - return (-1); - if (r1->rlfloor > r2->rlfloor) - return (1); - if (r1->rlorder < r2->rlorder) - return (-1); - if (r1->rlorder > r2->rlorder) - return (1); - return (0); -} - - -/* - * Common code for all room listings - */ -void listrms(char *variety) -{ - char buf[SIZ]; - int num_rooms = 0; - - struct roomlisting *rl = NULL; - struct roomlisting *rp; - struct roomlisting *rs; - - /* Ask the server for a room list */ - serv_puts(variety); - serv_getln(buf, sizeof buf); - if (buf[0] != '1') { - wc_printf(" "); - return; - } - - while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - ++num_rooms; - rp = malloc(sizeof(struct roomlisting)); - extract_token(rp->rlname, buf, 0, '|', sizeof rp->rlname); - rp->rlflags = extract_int(buf, 1); - rp->rlfloor = extract_int(buf, 2); - rp->rlorder = extract_int(buf, 3); - rp->lnext = NULL; - rp->rnext = NULL; - - rs = rl; - if (rl == NULL) { - rl = rp; - } else - while (rp != NULL) { - if (rordercmp(rp, rs) < 0) { - if (rs->lnext == NULL) { - rs->lnext = rp; - rp = NULL; - } else { - rs = rs->lnext; - } - } else { - if (rs->rnext == NULL) { - rs->rnext = rp; - rp = NULL; - } else { - rs = rs->rnext; - } - } - } - } - - room_tree_list(rl); - - /* - * If no rooms were listed, print an nbsp to make the cell - * borders show up anyway. - */ - if (num_rooms == 0) wc_printf(" "); -} - - -/* - * list all forgotten rooms - */ -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.Filter.ContextType = CTX_STRBUF; - SubTP.Context = Buf; - DoTemplate(HKEY("beginbox"), NULL, &SubTP); - - FreeStrBuf(&Buf); - - listrms("LZRM -1"); - - wc_printf("

\n"); - wc_printf(_("Click on any room to un-zap it and goto that room.\n")); - do_template("endbox", NULL); - wDumpContent(1); + 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"); } - -/* - * read this room's info file (set v to 1 for verbose mode) - */ -void readinfo(StrBuf *Target, WCTemplputParams *TP) +ConstStr QRFlagList[] = { + {HKEY(strof(QR_PERMANENT))}, + {HKEY(strof(QR_INUSE))}, + {HKEY(strof(QR_PRIVATE))}, + {HKEY(strof(QR_PASSWORDED))}, + {HKEY(strof(QR_GUESSNAME))}, + {HKEY(strof(QR_DIRECTORY))}, + {HKEY(strof(QR_UPLOAD))}, + {HKEY(strof(QR_DOWNLOAD))}, + {HKEY(strof(QR_VISDIR))}, + {HKEY(strof(QR_ANONONLY))}, + {HKEY(strof(QR_ANONOPT))}, + {HKEY(strof(QR_NETWORK))}, + {HKEY(strof(QR_PREFONLY))}, + {HKEY(strof(QR_READONLY))}, + {HKEY(strof(QR_MAILBOX))} +}; +ConstStr QR2FlagList[] = { + {HKEY(strof(QR2_SYSTEM))}, + {HKEY(strof(QR2_SELFLIST))}, + {HKEY(strof(QR2_COLLABDEL))}, + {HKEY(strof(QR2_SUBJECTREQ))}, + {HKEY(strof(QR2_SMTP_PUBLIC))}, + {HKEY(strof(QR2_MODERATED))}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")}, + {HKEY("")} +}; + +void DBG_QR(long QR) { - char buf[256]; - char briefinfo[128]; - char fullinfo[8192]; - int fullinfo_len = 0; + int i = 1; + int j=0; + StrBuf *QRVec; - 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); - } + QRVec = NewStrBufPlain(NULL, 256); + while (i != 0) + { + if ((QR & i) != 0) { + if (StrLength(QRVec) > 0) + StrBufAppendBufPlain(QRVec, HKEY(" | "), 0); + StrBufAppendBufPlain(QRVec, CKEY(QRFlagList[j]), 0); } - - safestrncpy(briefinfo, fullinfo, sizeof briefinfo); - strcpy(&briefinfo[50], "..."); - - wc_printf("
" - ); - escputs(briefinfo); - wc_printf("
"); - wc_printf("\"%s\"", - _("Close window") - ); - escputs(fullinfo); - wc_printf("
"); - } - else { - wc_printf(" "); + i = i << 1; + j++; } + lprintf(9, "DBG: QR-Vec [%ld] [%s]\n", QR, ChrPtr(QRVec)); + FreeStrBuf(&QRVec); } - -/* - * 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) +void DBG_QR2(long QR2) { - char buf[SIZ]; - - serv_puts("OIMG _roompic_"); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - wc_printf("CurRoom.name)); - wc_printf("\">"); - serv_puts("CLOS"); - serv_getln(buf, sizeof buf); - } - else if (WC->CurRoom.view == VIEW_ADDRESSBOOK) { - wc_printf("\"\"" - ); - } - else if ( (WC->CurRoom.view == VIEW_CALENDAR) || (WC->CurRoom.view == VIEW_CALBRIEF) ) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_TASKS) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_NOTES) { - wc_printf("\"\"" - ); - } - else if (WC->CurRoom.view == VIEW_MAILBOX) { - wc_printf("\"\"" - ); - } - else { - wc_printf("\"\"" - ); - } - -} - + int i = 1; + int j=0; + StrBuf *QR2Vec; - -/* - * Display the current view and offer an option to change it - */ -void embed_view_o_matic(StrBuf *Target, WCTemplputParams *TP) -{ - int i; - - wc_printf("
\n"); - wc_printf("\t
\n\t\n", WC->nonce); - wc_printf(" " - "
\n"); -} - - -/* - * Display a search box - */ -void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP) -{ - wc_printf("
\n"); - wc_printf("
\n", WC->nonce); - wc_printf("serv_info->serv_fulltext_enabled ? "" : "disabled "); - wc_printf("type=\"text\" name=\"query\" id=\"srchquery\" size=\"15\" maxlength=\"128\" class=\"inputbox\">\n" - ); - wc_printf("
\n"); + lprintf(9, "DBG: QR2-Vec [%ld] [%s]\n", QR2, ChrPtr(QR2Vec)); + FreeStrBuf(&QR2Vec); } @@ -403,31 +140,20 @@ void embed_search_o_matic(StrBuf *Target, WCTemplputParams *TP) * */ -void embed_room_banner(char *got, int navbar_style) { +void embed_room_banner(void) +{ 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->CurRoom.name)); - serv_getln(buf, sizeof buf); - got = buf; - } + + /* refresh current room states... */ + /* dosen't work??? gotoroom(NULL); */ /* 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, @@ -440,315 +166,264 @@ void embed_room_banner(char *got, int navbar_style) { StrBufPrintf(WCC->Hdr->this_page, "dotskip?room=%s", ChrPtr(WC->CurRoom.name) - ); - - /* Check for new mail. */ - WC->new_mail = extract_int(&got[4], 9); - WC->CurRoom.view = extract_int(&got[4], 11); - - /* Is this a directory room and does it contain files and how many? */ - if ((WC->CurRoom.QRFlags & QR_DIRECTORY) && (WC->CurRoom.QRFlags & QR_VISDIR)) - { - serv_puts("RDIR"); - serv_getln(buf2, sizeof buf2); - if (buf2[0] == '1') while (serv_getln(buf2, sizeof buf2), strcmp(buf2, "000")) - file_count++; - snprintf (with_files, sizeof with_files, - "; %d %s ", - file_count, - ((file_count>1) || (file_count == 0) ? _("files") : _("file"))); - } - else - strcpy (with_files, ""); - - svprintf(HKEY("NUMMSGS"), WCS_STRING, - _("%d new of %d messages%s"), - extract_int(&got[4], 1), - 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 < 1)) { + if (WC->is_mobile) + return; - wc_printf("
\n"); } @@ -763,12 +438,16 @@ long gotoroom(const StrBuf *gname) long err = 0; /* store ungoto information */ - strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name)); + if (StrLength(gname) > 0) + strcpy(WCC->ugname, ChrPtr(WCC->CurRoom.name)); WCC->uglsn = ls; Buf = NewStrBuf(); /* move to the new room */ - serv_printf("GOTO %s", ChrPtr(gname)); + if (StrLength(gname) > 0) + serv_printf("GOTO %s", ChrPtr(gname)); + else /* or just refresh the current state... */ + serv_printf("GOTO 00000000000000000000"); StrBuf_ServGetln(Buf); if (GetServerStatus(Buf, &err) != 2) { serv_puts("GOTO _BASEROOM_"); @@ -783,17 +462,22 @@ long gotoroom(const StrBuf *gname) return err; } } + FlushFolder(&WCC->CurRoom); ParseGoto(&WCC->CurRoom, Buf); - remove_march(WCC->CurRoom.name); - if (!strcasecmp(ChrPtr(gname), "_BASEROOM_")) - remove_march(gname); + if (StrLength(gname) > 0) + { + remove_march(WCC->CurRoom.name); + if (!strcasecmp(ChrPtr(gname), "_BASEROOM_")) + remove_march(gname); + } FreeStrBuf(&Buf); return err; } + void ParseGoto(folder *room, StrBuf *Line) { wcsession *WCC = WC; @@ -838,14 +522,17 @@ void ParseGoto(folder *room, StrBuf *Line) room->QRFlags = StrBufExtractNext_long(Line, &Pos, '|'); //CurRoom->QRFlags + DBG_QR(room->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) + if (WCC->is_aide || flag) { room->RAFlags |= UA_ADMINALLOWED; + } room->UsersNewMAilboxMessages = StrBufExtractNext_long(Line, &Pos, '|'); @@ -860,6 +547,7 @@ void ParseGoto(folder *room, StrBuf *Line) room->RAFlags |= UA_ISTRASH; // wc_is_trash room->QRFlags2 = StrBufExtractNext_long(Line, &Pos, '|'); // CurRoom->QRFlags2 + DBG_QR2(room->QRFlags2); /* find out, whether we are in a sub-room */ room->nRoomNameParts = StrBufNum_tokens(room->name, '\\'); @@ -892,1142 +580,564 @@ void ParseGoto(folder *room, StrBuf *Line) } /* get a pointer to the floor we're on: */ + if (WCC->Floors == NULL) + GetFloorListHash(NULL, NULL); + GetHash(WCC->Floors, IKEY(room->floorid), &vFloor); room->Floor = (const Floor*) vFloor; } +void LoadRoomAide(void) +{ + wcsession *WCC = WC; + StrBuf *Buf; + + if (WCC->CurRoom.RoomAideLoaded) + return; -/* - * goto next room - */ -void smart_goto(const StrBuf *next_room) { - gotoroom(next_room); - readloop(readnew, eUseDefault); -} + WCC->CurRoom.RoomAideLoaded = 1; + Buf = NewStrBuf(); + serv_puts("GETA"); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + FlushStrBuf(WCC->CurRoom.RoomAide); + AppendImportantMessage (ChrPtr(Buf) + 4, + StrLength(Buf) - 4); + } else { + const char *Pos; + Pos = ChrPtr(Buf) + 4; + FreeStrBuf(&WCC->CurRoom.RoomAide); + WCC->CurRoom.RoomAide = NewStrBufPlain (NULL, StrLength (Buf)); -/* - * mark all messages in current room as having been read - */ -void slrp_highest(void) -{ - char buf[256]; + StrBufExtract_NextToken(WCC->CurRoom.RoomAide, Buf, &Pos, '|'); + } + FreeStrBuf (&Buf); +} - serv_puts("SLRP HIGHEST"); - serv_getln(buf, sizeof buf); +int SaveRoomAide(folder *Room) +{ + StrBuf *Buf; + Buf = NewStrBuf (); + serv_printf("SETA %s", ChrPtr(Room->RoomAide)); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + StrBufCutLeft(Buf, 4); + AppendImportantMessage (SKEY(Buf)); + FreeStrBuf(&Buf); + return 0; + } + FreeStrBuf(&Buf); + return 1; } +void tmplput_CurrentRoomFloorName(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + folder *Folder = &WCC->CurRoom; + const Floor *pFloor; -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 (Folder == NULL) + return; + pFloor = Folder->Floor; + if (pFloor == NULL) + return; + StrBufAppendTemplate(Target, TP, pFloor->Name, 0); +} +void tmplput_CurrentRoomAide(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; -/* - * 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. - */ + LoadRoomAide(); -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; + StrBufAppendTemplate(Target, TP, WCC->CurRoom.RoomAide, 0); +} +int GetCurrentRoomFlags(folder *Room) +{ + StrBuf *Buf; + + Buf = NewStrBuf(); 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); - order = extract_int(&buf[4], 5); - view = extract_int(&buf[4], 6); - flags2 = extract_int(&buf[4], 7); - - if (flags2 & QR2_SELFLIST) { - current_value = 1; - } - else { - current_value = 0; - } + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + FlushStrBuf(Room->XAPass); + FlushStrBuf(Room->Directory); + StrBufCutLeft(Buf, 4); + AppendImportantMessage (SKEY(Buf)); + FreeStrBuf(&Buf); + return 0; + } else { + const char *Pos; - if (newval == 1) { - flags2 = flags2 | QR2_SELFLIST; - } - else if (newval == 0) { - flags2 = flags2 & ~QR2_SELFLIST; - } - else { - return(current_value); - } + Pos = ChrPtr(Buf) + 4; - if (newval != current_value) { - serv_printf("SETR %s|%s|%s|%d|0|%d|%d|%d|%d", - name, password, dirname, flags, - floor, order, view, flags2); - serv_getln(buf, sizeof buf); - } + FreeStrBuf(&Room->XAPass); + FreeStrBuf(&Room->Directory); - return(newval); + Room->XAPass = NewStrBufPlain (NULL, StrLength (Buf)); + Room->Directory = NewStrBufPlain (NULL, StrLength (Buf)); + FreeStrBuf(&Room->name); + Room->name = NewStrBufPlain(NULL, StrLength(Buf)); + StrBufExtract_NextToken(Room->name, Buf, &Pos, '|'); + + StrBufExtract_NextToken(Room->XAPass, Buf, &Pos, '|'); + StrBufExtract_NextToken(Room->Directory, Buf, &Pos, '|'); + + Room->QRFlags = StrBufExtractNext_long(Buf, &Pos, '|'); + Room->floorid = StrBufExtractNext_long(Buf, &Pos, '|'); + Room->Order = StrBufExtractNext_long(Buf, &Pos, '|'); + Room->defview = StrBufExtractNext_long(Buf, &Pos, '|'); + Room->QRFlags2 = StrBufExtractNext_long(Buf, &Pos, '|'); + FreeStrBuf (&Buf); + Room->XALoaded = 1; + return 1; + } } -int is_selflist(room_states *RoomFlags) + +int SetCurrentRoomFlags(folder *Room) { - return ((RoomFlags->flags2 & QR2_SELFLIST) != 0); + StrBuf *Buf; + + Buf = NewStrBuf(); + serv_printf("SETR %s|%s|%s|%ld|%d|%d|%ld|%ld|%ld", + ChrPtr(Room->name), + ChrPtr(Room->XAPass), + ChrPtr(Room->Directory), + Room->QRFlags, + Room->BumpUsers, + Room->floorid, + Room->Order, + Room->defview, + Room->QRFlags2); + + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, NULL) != 2) { + StrBufCutLeft(Buf, 4); + AppendImportantMessage (SKEY(Buf)); + FreeStrBuf(&Buf); + return 0; + } else { + FreeStrBuf(&Buf); + return 1; + } } -int is_publiclist(room_states *RoomFlags) +void LoadRoomXA (void) { - return ((RoomFlags->flags2 & QR2_SMTP_PUBLIC) != 0); + wcsession *WCC = WC; + + if (WCC->CurRoom.XALoaded) + return; + + GetCurrentRoomFlags(&WCC->CurRoom); } -int is_moderatedlist(room_states *RoomFlags) + +void LoadXRoomPic(void) { - return ((RoomFlags->flags2 & QR2_MODERATED) != 0); -} + wcsession *WCC = WC; + StrBuf *Buf; + + if (WCC->CurRoom.XHaveRoomPicLoaded) + return; -/* - * 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. - */ + 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 get_roomflags(room_states *RoomOps) +int ConditionalThisRoomXHavePic(StrBuf *Target, WCTemplputParams *TP) { - char buf[SIZ]; + wcsession *WCC = WC; - serv_puts("GETR"); - serv_getln(buf, sizeof buf); - if (buf[0] != '2') return(0); + if (WCC == NULL) + return 0; - extract_token(RoomOps->name, &buf[4], 0, '|', sizeof RoomOps->name); - extract_token(RoomOps->password, &buf[4], 1, '|', sizeof RoomOps->password); - extract_token(RoomOps->dirname, &buf[4], 2, '|', sizeof RoomOps->dirname); - RoomOps->flags = extract_int(&buf[4], 3); - RoomOps->floor = extract_int(&buf[4], 4); - RoomOps->order = extract_int(&buf[4], 5); - RoomOps->view = extract_int(&buf[4], 6); - RoomOps->flags2 = extract_int(&buf[4], 7); - return (1); + LoadXRoomPic(); + return WCC->CurRoom.XHaveRoomPic == 1; } -int set_roomflags(room_states *RoomOps) +void LoadXRoomInfoText(void) { - char buf[SIZ]; + wcsession *WCC = WC; + StrBuf *Buf; + int Done = 0; + + if (WCC->CurRoom.XHaveInfoTextLoaded) + return; - serv_printf("SETR %s|%s|%s|%d|0|%d|%d|%d|%d", - RoomOps->name, - RoomOps->password, - RoomOps->dirname, - RoomOps->flags, - RoomOps->floor, - RoomOps->order, - RoomOps->view, - RoomOps->flags2); - serv_getln(buf, sizeof buf); - return (1); + 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); +} -/* - * display the form for editing a room - */ -void display_editroom(void) +void LoadXRoomXCountFiles(void) { + wcsession *WCC = WC; StrBuf *Buf; - char buf[SIZ]; - char cmd[1024]; - char node[256]; - char remote_room[128]; - char recp[1024]; - char er_name[128]; - char er_password[10]; - char er_dirname[15]; - char er_roomaide[26]; - unsigned er_flags; - unsigned er_flags2; - int er_floor; - int i, j; - char *tab; - char *shared_with; - char *not_shared_with; - int roompolicy = 0; - int roomvalue = 0; - int floorpolicy = 0; - int floorvalue = 0; - char pop3_host[128]; - char pop3_user[32]; - int bg = 0; - - tab = bstr("tab"); - if (IsEmptyStr(tab)) tab = "admin"; + int Done = 0; + + if (WCC->CurRoom.XHaveDownloadCount) + return; + + WCC->CurRoom.XHaveDownloadCount = 1; Buf = NewStrBuf(); - load_floorlist(Buf); - FreeStrBuf(&Buf); - output_headers(1, 1, 1, 0, 0, 0); + 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++; + } + } - wc_printf("
"); + FreeStrBuf (&Buf); +} - wc_printf("
\n"); +void tmplput_CurrentRoomXNFiles(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - /* print the tabbed dialog */ - wc_printf("
"); - wc_printf("" - "" - ); + LoadXRoomXCountFiles(); - wc_printf("\n"); - wc_printf("\n"); + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.XDownloadCount); +} - if ( (WC->axlevel >= 6) || (WC->is_room_aide) ) { +void tmplput_CurrentRoomX_FileString(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - wc_printf("\n"); - wc_printf("\n"); + LoadXRoomXCountFiles(); - wc_printf("\n"); - wc_printf("\n"); - - wc_printf("\n"); - wc_printf("\n"); + if (WCC->CurRoom.XDownloadCount == 1) + StrBufAppendBufPlain(Target, _("file"), -1, 0); + else + StrBufAppendBufPlain(Target, _("files"), -1, 0); +} - wc_printf("\n"); - wc_printf("\n"); +void tmplput_CurrentRoomPass(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - wc_printf("\n"); - wc_printf("\n"); + LoadRoomXA(); - } + StrBufAppendTemplate(Target, TP, WCC->CurRoom.XAPass, 0); +} +void tmplput_CurrentRoomDirectory(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - wc_printf("\n"); - wc_printf("\n"); + LoadRoomXA(); - wc_printf("
 "); - wc_printf(_("Administration")); - } - else { - wc_printf("< tab_cell_edit\">"); - wc_printf(_("Administration")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Configuration")); - } - else { - wc_printf(" tab_cell_edit\">"); - wc_printf(_("Configuration")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Message expire policy")); - } - else { - wc_printf(" tab_cell_edit\">"); - wc_printf(_("Message expire policy")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Access controls")); - } - else { - wc_printf(" tab_cell_edit\">"); - wc_printf(_("Access controls")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Sharing")); - } - else { - wc_printf(" tab_cell_edit\">"); - wc_printf(_("Sharing")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Mailing list service")); - } - else { - wc_printf("< tab_cell_edit\">"); - wc_printf(_("Mailing list service")); - wc_printf(""); - } - wc_printf(" "); - wc_printf(_("Remote retrieval")); - } - else { - wc_printf("< tab_cell_edit\">"); - wc_printf(_("Remote retrieval")); - wc_printf(""); - } - wc_printf(" 
\n"); - wc_printf("
\n"); - /* end tabbed dialog */ + StrBufAppendTemplate(Target, TP, WCC->CurRoom.Directory, 0); +} +void tmplput_CurrentRoomOrder(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - wc_printf("" - ); + LoadRoomXA(); - /* begin content of whatever tab is open now */ - - if (!strcmp(tab, "admin")) { - wc_printf("
"); - wc_printf(""); - wc_printf("
"); - } - - if (!strcmp(tab, "config")) { - wc_printf("
"); - serv_puts("GETR"); - serv_getln(buf, sizeof buf); + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.Order); +} +void tmplput_CurrentRoomDefView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - if (!strncmp(buf, "550", 3)) { - wc_printf("

%s


\n", - _("Higher access is required to access this function.") - ); - } - else if (buf[0] != '2') { - wc_printf("

%s


\n", &buf[4]); - } - else { - 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_floor = extract_int(&buf[4], 4); - er_flags2 = extract_int(&buf[4], 7); - - wc_printf("
\n"); - wc_printf("\n", WC->nonce); - - wc_printf("
  • "); - wc_printf(_("Name of room: ")); - wc_printf("\n", - er_name, - (sizeof(er_name)-1) - ); - - wc_printf("
  • "); - wc_printf(_("Resides on floor: ")); - wc_printf("\n"); + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.defview); +} - wc_printf("
  • "); - wc_printf(_("Type of room:")); - wc_printf("
      \n"); - - wc_printf("
    • "); - wc_printf(_("Public (automatically appears to everyone)")); - wc_printf("\n"); - - wc_printf("
    • "); - wc_printf(_("Private - hidden (accessible to anyone who knows its name)")); - - wc_printf("\n
    • "); - wc_printf(_("Private - require password: ")); - wc_printf("\n\n", - er_password); - - wc_printf("
    • "); - wc_printf(_("Private - invitation only")); - - wc_printf("\n
    • "); - wc_printf(_("Personal (mailbox for you only)")); - - wc_printf("\n
    • "); - wc_printf(_("If private, cause current users to forget room")); - - wc_printf("\n
    \n"); - - wc_printf("
  • "); - wc_printf(_("Preferred users only")); - - wc_printf("\n
  • "); - wc_printf(_("Read-only room")); - - wc_printf("\n
  • "); - wc_printf(_("All users allowed to post may also delete messages")); - - /** directory stuff */ - wc_printf("\n
  • "); - wc_printf(_("File directory room")); - - wc_printf("\n
    • "); - wc_printf(_("Directory name: ")); - wc_printf("\n", - er_dirname); - - wc_printf("
    • "); - wc_printf(_("Uploading allowed")); - - wc_printf("\n
    • "); - wc_printf(_("Downloading allowed")); - - wc_printf("\n
    • "); - wc_printf(_("Visible directory")); - wc_printf("
    \n"); - - /** end of directory stuff */ - - wc_printf("
  • "); - wc_printf(_("Network shared room")); - - wc_printf("\n
  • "); - wc_printf(_("Permanent (does not auto-purge)")); - - wc_printf("\n
  • "); - wc_printf(_("Subject Required (Force users to specify a message subject)")); - - /** start of anon options */ - - wc_printf("\n
  • "); - wc_printf(_("Anonymous messages")); - wc_printf("
      \n"); - - wc_printf("
    • "); - wc_printf(_("No anonymous messages")); - - wc_printf("\n
    • "); - wc_printf(_("All messages are anonymous")); - - wc_printf("\n
    • "); - wc_printf(_("Prompt user when entering messages")); - wc_printf("
    \n"); - - /* end of anon options */ - - wc_printf("
  • "); - wc_printf(_("Room aide: ")); - serv_puts("GETA"); - serv_getln(buf, sizeof buf); - if (buf[0] != '2') { - wc_printf("%s\n", &buf[4]); - } else { - extract_token(er_roomaide, &buf[4], 0, '|', sizeof er_roomaide); - wc_printf("\n", er_roomaide); - } - - wc_printf("
\n"); - wc_printf("\n" - "" - " " - "" - "
\n", - _("Save changes"), - _("Cancel") - ); - } - wc_printf("
"); - } +void tmplput_CurrentRoom_nNewMessages(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + LoadRoomXA(); - /* Sharing the room with other Citadel nodes... */ - if (!strcmp(tab, "sharing")) { - wc_printf("
"); + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nNewMessages); +} - shared_with = strdup(""); - not_shared_with = strdup(""); +void tmplput_CurrentRoom_nTotalMessages(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; - /** Learn the current configuration */ - serv_puts("CONF getsys|application/x-citadel-ignet-config"); - serv_getln(buf, sizeof buf); - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(node, buf, 0, '|', sizeof node); - not_shared_with = realloc(not_shared_with, - strlen(not_shared_with) + 32); - strcat(not_shared_with, node); - strcat(not_shared_with, "\n"); - } + LoadRoomXA(); - serv_puts("GNET"); - serv_getln(buf, sizeof buf); - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(cmd, buf, 0, '|', sizeof cmd); - extract_token(node, buf, 1, '|', sizeof node); - extract_token(remote_room, buf, 2, '|', sizeof remote_room); - if (!strcasecmp(cmd, "ignet_push_share")) { - shared_with = realloc(shared_with, - strlen(shared_with) + 32); - strcat(shared_with, node); - if (!IsEmptyStr(remote_room)) { - strcat(shared_with, "|"); - strcat(shared_with, remote_room); - } - strcat(shared_with, "\n"); - } - } + StrBufAppendPrintf(Target, "%d", WCC->CurRoom.nTotalMessages); +} - for (i=0; i
" - "" - "" - "\n" - "" - "
"); - wc_printf(_("Shared with")); - wc_printf(""); - wc_printf(_("Not shared with")); - wc_printf("
\n"); - - wc_printf("\n"); - - for (i=0; i"); - wc_printf("\n", WC->nonce); - wc_printf("\n", node); - - wc_printf(""); + if (WCC == NULL) + return 0; - wc_printf("\n"); - } - } + LoadRoomXA(); - wc_printf("
"); - wc_printf(_("Remote node name")); - wc_printf(""); - wc_printf(_("Remote room name")); - wc_printf(""); - wc_printf(_("Actions")); - wc_printf("
%s"); - if (!IsEmptyStr(remote_room)) { - escputs(remote_room); - } - wc_printf(""); - - wc_printf(""); - wc_printf("\n"); - wc_printf("\n"); - wc_printf("", _("Unshare")); - wc_printf("
\n"); - wc_printf("
\n"); - wc_printf("\n"); - - for (i=0; i"); - wc_printf("\n", WC->nonce); - wc_printf("\n"); - } - } + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + return CheckThis == WCC->CurRoom.Order; +} - wc_printf("
"); - wc_printf(_("Remote node name")); - wc_printf(""); - wc_printf(_("Remote room name")); - wc_printf(""); - wc_printf(_("Actions")); - wc_printf("
"); - escputs(node); - wc_printf("" - "" - ""); - wc_printf(""); - wc_printf("\n"); - wc_printf("\n"); - wc_printf("", _("Share")); - wc_printf("
\n"); - wc_printf("

\n" - "%s
  • ", _("Notes:")); - 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" - " to send messages out to your system as well. " - "
  • If the remote room name is blank, it is assumed " - "that the room name is identical on the remote node." - "
  • If the remote room name is different, the remote " - "node must also configure the name of the room here." - "

\n" - )); - - wc_printf("
"); - } - - /* Mailing list management */ - if (!strcmp(tab, "listserv")) { - room_states RoomFlags; - wc_printf("
"); - - wc_printf("
" - "" - "
"); - - wc_printf(_("The contents of this room are being " - "mailed as individual messages " - "to the following list recipients:" - "

\n")); - - serv_puts("GNET"); - serv_getln(buf, sizeof buf); - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(cmd, buf, 0, '|', sizeof cmd); - if (!strcasecmp(cmd, "listrecp")) { - extract_token(recp, buf, 1, '|', sizeof recp); - - escputs(recp); - wc_printf(" "); - wc_printf(_("(remove)")); - wc_printf("
"); - } - } - wc_printf("
\n" - "\n" - "\n"); - wc_printf("\n", WC->nonce); - wc_printf("\n"); - wc_printf("", _("Add")); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf(_("The contents of this room are being " - "mailed in digest form " - "to the following list recipients:" - "

\n")); +int ConditionalThisRoomDefView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + long CheckThis; - serv_puts("GNET"); - serv_getln(buf, sizeof buf); - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(cmd, buf, 0, '|', sizeof cmd); - if (!strcasecmp(cmd, "digestrecp")) { - extract_token(recp, buf, 1, '|', sizeof recp); - - escputs(recp); - wc_printf(" "); - wc_printf(_("(remove)")); - wc_printf("
"); - } - } - wc_printf("
\n" - "\n" - "\n"); - wc_printf("\n", WC->nonce); - wc_printf("\n"); - wc_printf("", _("Add")); - wc_printf("
\n"); - - wc_printf("
\n"); - - /** Pop open an address book -- begin **/ - wc_printf("
" - "" - "" - " %s" - "
", - _("List"), - _("Digest"), - _("Add recipients from Contacts or other address books"), - _("Add recipients from Contacts or other address books") - ); - /* Pop open an address book -- end **/ + if (WCC == NULL) + return 0; - wc_printf("
\n
\n"); + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + return CheckThis == WCC->CurRoom.defview; +} - get_roomflags (&RoomFlags); - - /* Self Service subscription? */ - wc_printf("\n" - " \n", - (is_https ? "https" : "http"), - ChrPtr(WC->Hdr->HR.http_host)); - /* Public posting? */ - wc_printf("\n", - (is_publiclist(&RoomFlags))?"checked":""); - - /* Moderated List? */ - wc_printf("\n", - (is_moderatedlist(&RoomFlags))?"checked":""); +int ConditionalThisRoomCurrView(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + long CheckThis; + if (WCC == NULL) + return 0; - wc_printf("", _("Save changes")); - wc_printf("
\n"); - wc_printf(_("Allow self-service subscribe/unsubscribe requests.")); - wc_printf("
\n", - (is_selflist(&RoomFlags))?"checked":""); - wc_printf(_("The URL for subscribe/unsubscribe is: ")); - wc_printf("%s://%s/listsub
"); - wc_printf(_("Allow non-subscribers to mail to this room.")); - wc_printf("
"); - wc_printf(_("Room post publication needs Aide permission.")); - wc_printf("
" - "
"); - + CheckThis = GetTemplateTokenNumber(Target, TP, 2, 0); + return CheckThis == WCC->CurRoom.view; +} - wc_printf("
\n"); - wc_printf("
"); +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; +} - /* Configuration of The Dreaded Auto-Purger */ - if (!strcmp(tab, "expire")) { - wc_printf("
"); +void tmplput_CurrentRoomViewString(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + StrBuf *Buf; - serv_puts("GPEX room"); - serv_getln(buf, sizeof buf); - if (!strncmp(buf, "550", 3)) { - wc_printf("

%s


\n", - _("Higher access is required to access this function.") - ); - } - else if (buf[0] != '2') { - wc_printf("

%s


\n", &buf[4]); - } - else { - roompolicy = extract_int(&buf[4], 0); - roomvalue = extract_int(&buf[4], 1); - - serv_puts("GPEX floor"); - serv_getln(buf, sizeof buf); - if (buf[0] == '2') { - floorpolicy = extract_int(&buf[4], 0); - floorvalue = extract_int(&buf[4], 1); - } - - wc_printf("
\n"); - wc_printf("\n", WC->nonce); - wc_printf("\n"); - wc_printf("\n"); - - if (WC->axlevel >= 6) { - wc_printf("\n"); - 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" : "") ); - wc_printf(_("Use the default policy for this floor")); - wc_printf("
\n"); - wc_printf("", - ((roompolicy == 1) ? "CHECKED" : "") ); - wc_printf(_("Never automatically expire messages")); - wc_printf("
\n"); - wc_printf("", - ((roompolicy == 2) ? "CHECKED" : "") ); - wc_printf(_("Expire by message count")); - wc_printf("
\n"); - wc_printf("", - ((roompolicy == 3) ? "CHECKED" : "") ); - wc_printf(_("Expire by message age")); - wc_printf("
"); - wc_printf(_("Number of messages or days: ")); - wc_printf("", roomvalue); - wc_printf("

"); - wc_printf(_("Message expire policy for this floor")); - wc_printf("
("); - escputs(floorlist[WC->CurRoom.floorid]); - wc_printf(")
"); - wc_printf("", - ((floorpolicy == 0) ? "CHECKED" : "") ); - wc_printf(_("Use the system default")); - wc_printf("
\n"); - wc_printf("", - ((floorpolicy == 1) ? "CHECKED" : "") ); - wc_printf(_("Never automatically expire messages")); - wc_printf("
\n"); - wc_printf("", - ((floorpolicy == 2) ? "CHECKED" : "") ); - wc_printf(_("Expire by message count")); - wc_printf("
\n"); - wc_printf("", - ((floorpolicy == 3) ? "CHECKED" : "") ); - wc_printf(_("Expire by message age")); - wc_printf("
"); - wc_printf(_("Number of messages or days: ")); - wc_printf("", - floorvalue); - } - - wc_printf("
\n"); - wc_printf("

\n"); - wc_printf("", _("Save changes")); - wc_printf(" "); - wc_printf("", _("Cancel")); - wc_printf("
\n" - "\n" - "
\n" - ); - } + 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; - wc_printf("
"); + 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; } - /* Access controls */ - if (!strcmp(tab, "access")) { - wc_printf("
"); - display_whok(); - wc_printf("
"); + Buf = NewStrBufPlain(_(viewdefs[CheckThis]), -1); + StrBufAppendTemplate(Target, TP, Buf, 0); + FreeStrBuf(&Buf); +} + + +int ConditionalIsAllowedDefaultView(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; } - /* Fetch messages from remote locations */ - if (!strcmp(tab, "feeds")) { - wc_printf("
"); + return allowed_default_views[CheckThis] != 0; +} - wc_printf(""); - wc_printf(_("Retrieve messages from these remote POP3 accounts and store them in this room:")); - wc_printf("
\n"); +/* + * goto next room + */ +void smart_goto(const StrBuf *next_room) { + gotoroom(next_room); + readloop(readnew, eUseDefault); +} - wc_printf("" - ""); - serv_puts("GNET"); - serv_getln(buf, sizeof buf); - bg = 1; - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(cmd, buf, 0, '|', sizeof cmd); - if (!strcasecmp(cmd, "pop3client")) { - safestrncpy(recp, &buf[11], sizeof recp); - - bg = 1 - bg; - wc_printf("", - (bg ? "even" : "odd") - ); - wc_printf(""); +/* + * mark all messages in current room as having been read + */ +void slrp_highest(void) +{ + char buf[256]; - wc_printf(""); + serv_puts("SLRP HIGHEST"); + serv_getln(buf, sizeof buf); +} - wc_printf(""); /* Don't show the password */ - wc_printf("", extract_int(buf, 4) ? _("Yes") : _("No")); - wc_printf("", extract_long(buf, 5)); /* Fetching interval */ - - wc_printf(""); - - wc_printf(""); - } - } +/* + * 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. + */ - wc_printf("\n" - "" - "" - "\n"); - wc_printf("\n", WC->nonce); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf("
"); - 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("
"); - extract_token(pop3_host, buf, 1, '|', sizeof pop3_host); - escputs(pop3_host); - wc_printf(""); - extract_token(pop3_user, buf, 2, '|', sizeof pop3_user); - escputs(pop3_user); - wc_printf("*****%s%ld"); - wc_printf(" "); - wc_printf(_("(remove)")); - wc_printf("
"); - wc_printf("\n"); - wc_printf(""); - wc_printf("\n"); - wc_printf(""); - wc_printf("\n"); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf(""); - wc_printf("", _("Add")); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf(""); - wc_printf(_("Fetch the following RSS feeds and store them in this room:")); - wc_printf("
\n"); - - wc_printf("" - ""); - - serv_puts("GNET"); - serv_getln(buf, sizeof buf); - bg = 1; - if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { - extract_token(cmd, buf, 0, '|', sizeof cmd); - if (!strcasecmp(cmd, "rssclient")) { - safestrncpy(recp, &buf[10], sizeof recp); - - bg = 1 - bg; - wc_printf("", - (bg ? "even" : "odd") - ); +int self_service(int newval) { + int current_value = 0; + wcsession *WCC = WC; - wc_printf(""); - - wc_printf(""); - - wc_printf(""); - } - } + if (GetCurrentRoomFlags (&WCC->CurRoom) == 0) + { + return 0; + } - wc_printf("\n" - "" - "" - "\n"); - wc_printf("\n", WC->nonce); - wc_printf(""); - wc_printf(""); - wc_printf("
"); - wc_printf("\" "); - wc_printf(_("Feed URL")); - wc_printf(""); - wc_printf("
"); - extract_token(pop3_host, buf, 1, '|', sizeof pop3_host); - escputs(pop3_host); - wc_printf(""); - wc_printf(" "); - wc_printf(_("(remove)")); - wc_printf("
"); - wc_printf("\n"); - wc_printf(""); - wc_printf("", _("Add")); - wc_printf("
\n"); + if ((WCC->CurRoom.QRFlags2 & QR2_SELFLIST) != 0) { + current_value = 1; + } + else { + current_value = 0; + } - wc_printf("
"); + if (newval == 1) { + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SELFLIST; + } + else if (newval == 0) { + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SELFLIST; + } + else { + return(current_value); } + if (newval != current_value) { + SetCurrentRoomFlags(&WCC->CurRoom); + } - /* end content of whatever tab is open now */ - wc_printf("
\n"); + return(newval); - address_book_popup(); - wDumpContent(1); } + /* * Toggle self-service list subscription */ void toggle_self_service(void) { - room_states RoomFlags; + wcsession *WCC = WC; - get_roomflags (&RoomFlags); + if (GetCurrentRoomFlags (&WCC->CurRoom) == 0) + return; if (yesbstr("QR2_SelfList")) - RoomFlags.flags2 = RoomFlags.flags2 | QR2_SELFLIST; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SELFLIST; else - RoomFlags.flags2 = RoomFlags.flags2 & ~QR2_SELFLIST; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SELFLIST; if (yesbstr("QR2_SMTP_PUBLIC")) - RoomFlags.flags2 = RoomFlags.flags2 | QR2_SMTP_PUBLIC; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SMTP_PUBLIC; else - RoomFlags.flags2 = RoomFlags.flags2 & ~QR2_SMTP_PUBLIC; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SMTP_PUBLIC; if (yesbstr("QR2_Moderated")) - RoomFlags.flags2 = RoomFlags.flags2 | QR2_MODERATED; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_MODERATED; else - RoomFlags.flags2 = RoomFlags.flags2 & ~QR2_MODERATED; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_MODERATED; if (yesbstr("QR2_SubsOnly")) - RoomFlags.flags2 = RoomFlags.flags2 | QR2_SMTP_PUBLIC; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 | QR2_SMTP_PUBLIC; else - RoomFlags.flags2 = RoomFlags.flags2 & ~QR2_SMTP_PUBLIC; + WCC->CurRoom.QRFlags2 = WCC->CurRoom.QRFlags2 & ~QR2_SMTP_PUBLIC; - set_roomflags (&RoomFlags); + SetCurrentRoomFlags (&WCC->CurRoom); - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); } @@ -2037,85 +1147,33 @@ void toggle_self_service(void) { */ void editroom(void) { + wcsession *WCC = WC; const StrBuf *Ptr; - StrBuf *Buf; - StrBuf *er_name; - StrBuf *er_password; - StrBuf *er_dirname; - StrBuf *er_roomaide; - int er_floor; + const StrBuf *er_name; + const StrBuf *er_password; + const StrBuf *er_dirname; + const StrBuf *er_roomaide; unsigned er_flags; - int er_listingorder; - int er_defaultview; unsigned er_flags2; - int bump; - + int succ1, succ2; if (!havebstr("ok_button")) { strcpy(WC->ImportantMessage, _("Cancelled. Changes were not saved.")); - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } - serv_puts("GETR"); - Buf = NewStrBuf(); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) { - StrBufCutLeft(Buf, 4); - strcpy(WC->ImportantMessage, ChrPtr(Buf)); - display_editroom(); - FreeStrBuf(&Buf); + if (GetCurrentRoomFlags (&WCC->CurRoom) == 0) return; - } - - er_name = NewStrBuf(); - er_password = NewStrBuf(); - er_dirname = NewStrBuf(); - er_roomaide = NewStrBuf(); - - 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"); - StrBuf_ServGetln(Buf); - if (GetServerStatus(Buf, NULL) != 2) { - FlushStrBuf(er_roomaide); - } else { - StrBufCutLeft(Buf, 4); - StrBufExtract_token(er_roomaide, Buf, 0, '|'); - } - } - Ptr = sbstr("er_name"); - if (StrLength(Ptr) > 0) { - FlushStrBuf(er_name); - StrBufAppendBuf(er_name, Ptr, 0); - } - Ptr = sbstr("er_password"); - if (StrLength(Ptr) > 0) { - FlushStrBuf(er_password); - StrBufAppendBuf(er_password, Ptr, 0); - } - + LoadRoomAide(); - Ptr = sbstr("er_dirname"); - if (StrLength(Ptr) > 0) { /* todo: cut 15 */ - FlushStrBuf(er_dirname); - StrBufAppendBuf(er_dirname, Ptr, 0); - } + er_flags = WCC->CurRoom.QRFlags; + er_flags &= !(QR_PRIVATE | QR_PASSWORDED | QR_GUESSNAME); + er_flags2 = WCC->CurRoom.QRFlags2; Ptr = sbstr("type"); - er_flags &= !(QR_PRIVATE | QR_PASSWORDED | QR_GUESSNAME); - if (!strcmp(ChrPtr(Ptr), "invonly")) { er_flags |= (QR_PRIVATE); } @@ -2130,6 +1188,8 @@ void editroom(void) } else { er_flags &= ~QR_MAILBOX; } + + if (yesbstr("prefonly")) { er_flags |= QR_PREFONLY; @@ -2192,6 +1252,7 @@ void editroom(void) er_flags &= ~QR_VISDIR; } + Ptr = sbstr("anon"); er_flags &= ~(QR_ANONONLY | QR_ANONOPT); @@ -2200,338 +1261,102 @@ void editroom(void) if (!strcmp(ChrPtr(Ptr), "anon2")) er_flags |= QR_ANONOPT; - bump = yesbstr("bump"); - - er_floor = ibstr("er_floor"); - - 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 (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; -} - - -/* - * Display form for Invite, Kick, and show Who Knows a room - */ -void do_invt_kick(void) { - char buf[SIZ], room[SIZ], username[SIZ]; - - serv_puts("GETR"); - serv_getln(buf, sizeof buf); - - if (buf[0] != '2') { - escputs(&buf[4]); - return; - } - extract_token(room, &buf[4], 0, '|', sizeof room); - - strcpy(username, bstr("username")); - - if (havebstr("kick_button")) { - sprintf(buf, "KICK %s", username); - serv_puts(buf); - serv_getln(buf, sizeof buf); + er_name = sbstr("er_name"); + er_dirname = sbstr("er_dirname"); + er_roomaide = sbstr("er_roomaide"); + er_password = sbstr("er_password"); - if (buf[0] != '2') { - strcpy(WC->ImportantMessage, &buf[4]); - } else { - sprintf(WC->ImportantMessage, - _("User %s kicked out of room %s.\n"), - username, room); - } - } + FlushStrBuf(WCC->CurRoom.name); + StrBufAppendBuf(WCC->CurRoom.name, er_name, 0); - if (havebstr("invite_button")) { - sprintf(buf, "INVT %s", username); - serv_puts(buf); - serv_getln(buf, sizeof buf); - - if (buf[0] != '2') { - strcpy(WC->ImportantMessage, &buf[4]); - } else { - sprintf(WC->ImportantMessage, - _("User %s invited to room %s.\n"), - username, room); - } - } + FlushStrBuf(WCC->CurRoom.Directory); + StrBufAppendBuf(WCC->CurRoom.Directory, er_dirname, 0); - display_editroom(); -} + FlushStrBuf(WCC->CurRoom.RoomAide); + StrBufAppendBuf(WCC->CurRoom.RoomAide, er_roomaide, 0); + FlushStrBuf(WCC->CurRoom.XAPass); + StrBufAppendBuf(WCC->CurRoom.XAPass, er_password, 0); + WCC->CurRoom.BumpUsers = yesbstr("bump"); -/* - * Display form for Invite, Kick, and show Who Knows a room - */ -void display_whok(void) -{ - char buf[SIZ], room[SIZ], username[SIZ]; + WCC->CurRoom.floorid = ibstr("er_floor"); - serv_puts("GETR"); - serv_getln(buf, sizeof buf); + succ1 = SetCurrentRoomFlags(&WCC->CurRoom); - if (buf[0] != '2') { - escputs(&buf[4]); - return; - } - extract_token(room, &buf[4], 0, '|', sizeof 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'.")); - wc_printf("

"); + succ2 = SaveRoomAide (&WCC->CurRoom); - wc_printf("
\n"); - wc_printf("\n", WC->nonce); - wc_printf("\n"); - wc_printf("
\n"); - - wc_printf("", _("Kick")); - wc_printf("
\n"); - - wc_printf("
"); - wc_printf(_("To grant another user access to this room, enter the " - "user name in the box below and click 'Invite'.")); - 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 **/ - wc_printf( - "" - "" - " %s", - _("User"), - _("Users"), _("Users") - ); - /* Pop open an address book -- end **/ - - wc_printf("
\n"); - address_book_popup(); - wDumpContent(1); + if (succ1 + succ2 == 0) + AppendImportantMessage (_("Your changes have been saved."), -1); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); + return; } - /* - * display the form for entering a new room + * Display form for Invite, Kick, and show Who Knows a room */ -void display_entroom(void) +void do_invt_kick(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; - } - - output_headers(1, 1, 1, 0, 0, 0); - - svprintf(HKEY("BOXTITLE"), WCS_STRING, _("Create a new room")); - do_template("beginbox", NULL); - - wc_printf("
\n"); - wc_printf("\n", WC->nonce); + StrBuf *Buf, *User; + const StrBuf *UserNames; + int Kick, Invite; + wcsession *WCC = WC; - wc_printf(" "); - wc_printf(""); + if (GetCurrentRoomFlags(&WCC->CurRoom) == 1) + { + const char *Pos; + UserNames = sbstr("username"); + Kick = havebstr("kick_button"); + Invite = havebstr("invite_button"); - wc_printf(""); - - /* - * Our clever little snippet of JavaScript automatically selects - * a public room if the view is set to Bulletin Board or wiki, and - * it selects a mailbox room otherwise. The user can override this, - * of course. We also disable the floor selector for mailboxes. - */ - wc_printf(""); - - wc_printf("
"); - wc_printf(_("Name of room: ")); - wc_printf(""); - wc_printf("\n"); - wc_printf("
"); - wc_printf(_("Resides on floor: ")); - wc_printf(""); - load_floorlist(Buf); - wc_printf("\n"); - wc_printf("
"); - wc_printf(_("Default view for room: ")); - wc_printf(""); - wc_printf("\n"); - wc_printf("
"); - wc_printf(_("Type of room:")); - wc_printf(""); - wc_printf("
    \n"); - - wc_printf("
  • "); - wc_printf(_("Public (automatically appears to everyone)")); - wc_printf("
  • "); - - wc_printf("\n
  • "); - wc_printf(_("Private - hidden (accessible to anyone who knows its name)")); - wc_printf("
  • "); - - wc_printf("\n
  • "); - wc_printf(_("Private - require password: ")); - wc_printf("\n"); - wc_printf("
  • "); - - wc_printf("
  • "); - wc_printf(_("Private - invitation only")); - wc_printf("
  • "); - - wc_printf("\n
  • "); - wc_printf(_("Personal (mailbox for you only)")); - wc_printf("
  • "); - - wc_printf("\n
\n"); - wc_printf("
\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') { - fmout("LEFT"); - } - - do_template("endbox", NULL); + } - wDumpContent(1); - FreeStrBuf(&Buf); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); } - - - /* * support function for entroom() -- sets the default view */ @@ -2580,6 +1405,7 @@ void entroom(void) int er_floor; int er_num_type; int er_view; + wcsession *WCC = WC; if (!havebstr("ok_button")) { strcpy(WC->ImportantMessage, @@ -2613,137 +1439,67 @@ 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 */ - burn_folder_cache(0); /* burn the old folder cache */ - - + /** TODO: Room created, now update the left hand icon bar for this user */ gotoroom(er_name); - do_change_view(er_view); /* Now go there */ -} - - -/** - * \brief display the screen to enter a private room - */ -void display_private(char *rname, int req_pass) -{ - WCTemplputParams SubTP; - StrBuf *Buf; - output_headers(1, 1, 1, 0, 0, 0); - Buf = NewStrBufPlain(_("Go to a hidden room"), -1); - memset(&SubTP, 0, sizeof(WCTemplputParams)); - SubTP.Filter.ContextType = CTX_STRBUF; - SubTP.Context = Buf; - DoTemplate(HKEY("beginbox"), NULL, &SubTP); - - FreeStrBuf(&Buf); - - 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.")); - wc_printf("

"); - - wc_printf("
\n"); - wc_printf("\n", WC->nonce); - - wc_printf(" " - "
"); - wc_printf(_("Enter room name:")); - wc_printf("" - "\n", rname); - - if (req_pass) { - wc_printf("
"); - wc_printf(_("Enter room password:")); - wc_printf(""); - wc_printf("\n"); - } - wc_printf("
\n"); - - wc_printf("
\n"); - wc_printf("" - " " - "", - _("Go there"), - _("Cancel") - ); - wc_printf("
\n"); + serv_printf("VIEW %d", er_view); + serv_getln(buf, sizeof buf); + WCC->CurRoom.view = er_view; - do_template("endbox", NULL); + if ( (WCC != NULL) && ( (WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) ) { + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); + } else { + do_change_view(er_view); /* Now go there */ + } - wDumpContent(1); } + /** * \brief goto a private room */ void goto_private(void) { char hold_rm[SIZ]; - char buf[SIZ]; + StrBuf *Buf; + const StrBuf *gr_name; + long err; if (!havebstr("ok_button")) { display_main_menu(); return; } + gr_name = sbstr("gr_name"); + Buf = NewStrBuf(); strcpy(hold_rm, ChrPtr(WC->CurRoom.name)); serv_printf("GOTO %s|%s", - bstr("gr_name"), + ChrPtr(gr_name), bstr("gr_pass")); - serv_getln(buf, sizeof buf); - - if (buf[0] == '2') { - smart_goto(sbstr("gr_name")); + StrBuf_ServGetln(Buf); + if (GetServerStatus(Buf, &err) == 2) { + FlushRoomlist(); + smart_goto(gr_name); + FreeStrBuf(&Buf); return; } - if (!strncmp(buf, "540", 3)) { - display_private(bstr("gr_name"), 1); + if (err == 540) { + DoTemplate(HKEY("room_display_private"), NULL, &NoCtx); + FreeStrBuf(&Buf); return; } - output_headers(1, 1, 1, 0, 0, 0); - wc_printf("%s\n", &buf[4]); - wDumpContent(1); + StrBufCutLeft(Buf, 4); + AppendImportantMessage (SKEY(Buf)); + Buf = NewStrBufPlain(HKEY("_BASEROOM_")); + smart_goto(Buf); + FreeStrBuf(&Buf); return; } -/** - * \brief display the screen to zap a room - */ -void display_zap(void) -{ - output_headers(1, 1, 2, 0, 0, 0); - - wc_printf("
\n"); - wc_printf("

"); - wc_printf(_("Zap (forget/unsubscribe) the current room")); - wc_printf("

\n"); - wc_printf("
\n"); - - wc_printf("
\n"); - - wc_printf(_("If you select this option, %s will " - "disappear from your room list. Is this what you wish " - "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); -} - /** * \brief zap a room @@ -2770,6 +1526,7 @@ void zap(void) StrBufAppendBufPlain(final_destination, HKEY("_BASEROOM_"), 0); } } + FlushRoomlist (); } smart_goto(final_destination); FreeStrBuf(&final_destination); @@ -2787,7 +1544,7 @@ void delete_room(void) serv_puts("KILL 1"); serv_getln(buf, sizeof buf); - burn_folder_cache(0); /* Burn the cahce of known rooms to update the icon bar */ + if (buf[0] != '2') { strcpy(WC->ImportantMessage, &buf[4]); display_main_menu(); @@ -2795,6 +1552,7 @@ void delete_room(void) } else { StrBuf *Buf; + FlushRoomlist (); Buf = NewStrBufPlain(HKEY("_BASEROOM_")); smart_goto(Buf); FreeStrBuf(&Buf); @@ -2835,14 +1593,14 @@ void netedit(void) { strcat(line, bstr("suffix")); } else { - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } fp = tmpfile(); if (fp == NULL) { - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } @@ -2850,7 +1608,7 @@ void netedit(void) { serv_getln(buf, sizeof buf); if (buf[0] != '1') { fclose(fp); - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } @@ -2871,7 +1629,7 @@ void netedit(void) { serv_getln(buf, sizeof buf); if (buf[0] != '4') { fclose(fp); - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } @@ -2901,54 +1659,10 @@ void netedit(void) { serv_puts("000"); fclose(fp); - display_editroom(); -} - - - -/** - * \brief Convert a room name to a folder-ish-looking name. - * \param folder the folderish name - * \param room the room name - * \param floor the floor name - * \param is_mailbox is it a mailbox? - */ -void room_to_folder(char *folder, char *room, int floor, int is_mailbox) -{ - int i, len; - - /** - * For mailboxes, just do it straight... - */ - if (is_mailbox) { - sprintf(folder, "My folders|%s", room); - } - - /** - * Otherwise, prefix the floor name as a "public folders" moniker - */ - else { - if (floor > MAX_FLOORS) { - wc_backtrace (); - sprintf(folder, "%%%%%%|%s", room); - } - else { - sprintf(folder, "%s|%s", floorlist[floor], room); - } - } - - /** - * Replace "\" characters with "|" for pseudo-folder-delimiting - */ - len = strlen (folder); - for (i=0; icache_fold != NULL) { - if ((time(NULL) - WC->cache_timestamp) > age) { - free(WC->cache_fold); - WC->cache_fold = NULL; - } - } -} - - - /** * \brief Do either a known rooms list or a folders list, depending on the * user's preference @@ -3006,19 +1702,22 @@ void knrooms(void) 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(HKEY("rooms")); set_preference("roomlistview", ListView, 0); + ListView = NULL; } else { - StrBufPlain(ListView, HKEY("rooms")); - save_preferences(); + ListView = NewStrBufPlain(HKEY("rooms")); + set_preference("roomlistview", ListView, 0); + ListView = NULL; } } + FreeStrBuf(&ListView); url_do_template(); } @@ -3033,22 +1732,22 @@ void set_room_policy(void) { if (!havebstr("ok_button")) { strcpy(WC->ImportantMessage, _("Cancelled. Changes were not saved.")); - display_editroom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); return; } - serv_printf("SPEX room|%d|%d", ibstr("roompolicy"), ibstr("roomvalue")); + serv_printf("SPEX roompolicy|%d|%d", ibstr("roompolicy"), ibstr("roomvalue")); serv_getln(buf, sizeof buf); strcpy(WC->ImportantMessage, &buf[4]); if (WC->axlevel >= 6) { strcat(WC->ImportantMessage, "
\n"); - serv_printf("SPEX floor|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue")); + serv_printf("SPEX floorpolicy|%d|%d", ibstr("floorpolicy"), ibstr("floorvalue")); serv_getln(buf, sizeof buf); strcat(WC->ImportantMessage, &buf[4]); } - - display_editroom(); + ReloadCurrentRoom(); + http_transmit_thing(ChrPtr(do_template("room_edit", NULL)), 0); } void tmplput_RoomName(StrBuf *Target, WCTemplputParams *TP) @@ -3056,11 +1755,6 @@ void tmplput_RoomName(StrBuf *Target, WCTemplputParams *TP) StrBufAppendTemplate(Target, TP, WC->CurRoom.name, 0); } - -void _display_private(void) { - display_private("", 0); -} - void dotgoto(void) { if (!havebstr("room")) { readloop(readnew, eUseDefault); @@ -3087,7 +1781,7 @@ void tmplput_current_room(StrBuf *Target, WCTemplputParams *TP) void tmplput_roombanner(StrBuf *Target, WCTemplputParams *TP) { wc_printf("
\n"); - embed_room_banner(NULL, navbar_default); + embed_room_banner(); wc_printf("
\n"); } @@ -3104,14 +1798,15 @@ void tmplput_ungoto(StrBuf *Target, WCTemplputParams *TP) int ConditionalRoomAide(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; - return (WCC != NULL)? (WCC->is_room_aide == 0) : 0; + return (WCC != NULL)? + ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) : 0; } int ConditionalRoomAcessDelete(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; return (WCC == NULL)? 0 : - ( (WCC->is_room_aide) || /////TODO! + ( ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) || (WCC->CurRoom.is_inbox) || (WCC->CurRoom.QRFlags2 & QR2_COLLABDEL) ); } @@ -3125,6 +1820,22 @@ int ConditionalHaveUngoto(StrBuf *Target, WCTemplputParams *TP) (strcasecmp(WCC->ugname, ChrPtr(WCC->CurRoom.name)) == 0)); } + +int ConditionalRoomHas_UAFlag(StrBuf *Target, WCTemplputParams *TP) +{ + folder *Folder = (folder *)(TP->Context); + long UA_CheckFlag; + + UA_CheckFlag = GetTemplateTokenNumber(Target, TP, 2, 0); + if (UA_CheckFlag == 0) + LogTemplateError(Target, "Conditional", ERR_PARM1, TP, + "requires one of the #\"UA_*\"- defines or an integer flag 0 is invalid!"); + + return ((Folder->RAFlags & UA_CheckFlag) != 0); +} + + + int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP) { long QR_CheckFlag; @@ -3134,9 +1845,15 @@ int ConditionalCurrentRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP) if (QR_CheckFlag == 0) LogTemplateError(Target, "Conditional", ERR_PARM1, TP, "requires one of the #\"QR*\"- defines or an integer flag 0 is invalid!"); + + if (WCC == NULL) + return 0; - return ((WCC!=NULL) && - ((WCC->CurRoom.QRFlags & QR_CheckFlag) != 0)); + if ((TP->Tokens->Params[2]->MaskBy == eOR) || + (TP->Tokens->Params[2]->MaskBy == eNO)) + return (WCC->CurRoom.QRFlags & QR_CheckFlag) != 0; + else + return (WCC->CurRoom.QRFlags & QR_CheckFlag) == QR_CheckFlag; } int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP) @@ -3148,7 +1865,46 @@ int ConditionalRoomHas_QRFlag(StrBuf *Target, WCTemplputParams *TP) 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); + + if ((TP->Tokens->Params[2]->MaskBy == eOR) || + (TP->Tokens->Params[2]->MaskBy == eNO)) + return (Folder->QRFlags & QR_CheckFlag) != 0; + else + return (Folder->QRFlags & QR_CheckFlag) == QR_CheckFlag; +} + + +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!"); + + + if (WCC == NULL) + return 0; + + if ((TP->Tokens->Params[2]->MaskBy == eOR) || + (TP->Tokens->Params[2]->MaskBy == eNO)) + return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) != 0; + else + return (WCC->CurRoom.QRFlags2 & QR2_CheckFlag) == QR2_CheckFlag; +} + +int ConditionalRoomHas_QRFlag2(StrBuf *Target, WCTemplputParams *TP) +{ + 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); } @@ -3158,7 +1914,7 @@ int ConditionalHaveRoomeditRights(StrBuf *Target, WCTemplputParams *TP) return ( (WCC!= NULL) && ((WCC->axlevel >= 6) || - (WCC->is_room_aide) || + ((WCC->CurRoom.RAFlags & UA_ADMINALLOWED) != 0) || (WCC->CurRoom.is_inbox) )); } @@ -3167,39 +1923,96 @@ int ConditionalIsRoomtype(StrBuf *Target, WCTemplputParams *TP) wcsession *WCC = WC; if ((WCC == NULL) || - (TP->Tokens->nParameters < 3) || - (TP->Tokens->Params[2]->Type != TYPE_STR)|| - (TP->Tokens->Params[2]->len < 7)) - return 0; + (TP->Tokens->nParameters < 3)) + { + return ((WCC->CurRoom.view < VIEW_BBS) || + (WCC->CurRoom.view > VIEW_MAX)); + } - switch(WCC->CurRoom.view) { - case VIEW_BBS: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_BBS")); - case VIEW_MAILBOX: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_MAILBOX")); - case VIEW_ADDRESSBOOK: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_ADDRESSBOOK")); - case VIEW_TASKS: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_TASKS")); - case VIEW_NOTES: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_NOTES")); - case VIEW_WIKI: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_WIKI")); - case VIEW_JOURNAL: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_JOURNAL")); - case VIEW_CALENDAR: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALENDAR")); - case VIEW_CALBRIEF: - return (!strcasecmp(TP->Tokens->Params[2]->Start, "VIEW_CALBRIEF")); - default: - return 0; + return WCC->CurRoom.view == GetTemplateTokenNumber(Target, TP, 2, VIEW_BBS); +} + + +HashList *GetWhoKnowsHash(StrBuf *Target, WCTemplputParams *TP) +{ + wcsession *WCC = WC; + StrBuf *Line; + StrBuf *Token; + long State; + HashList *Whok = NULL; + int Done = 0; + int n; + + serv_puts("WHOK"); + Line = NewStrBuf(); + 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); + n++; + } } + else if (State == 550) + StrBufAppendBufPlain(WCC->ImportantMsg, + _("Higher access is required to access this function."), -1, 0); + + + FreeStrBuf(&Line); + return Whok; +} + + + +void _FlushRoomList(wcsession *WCC) +{ + free_march_list(WCC); + DeleteHash(&WCC->Floors); + DeleteHash(&WCC->Rooms); + DeleteHash(&WCC->FloorsByName); + FlushFolder(&WCC->CurRoom); +} + +void ReloadCurrentRoom(void) +{ + wcsession *WCC = WC; + StrBuf *CurRoom; + + CurRoom = WCC->CurRoom.name; + WCC->CurRoom.name = NULL; + _FlushRoomList(WCC); + gotoroom(CurRoom); + FreeStrBuf(&CurRoom); +} + +void FlushRoomlist(void) +{ + wcsession *WCC = WC; + _FlushRoomList(WCC); } + void InitModule_ROOMOPS (void) { + initialize_viewdefs(); RegisterPreference("roomlistview", _("Room list view"), PRF_STRING, @@ -3208,19 +2021,16 @@ InitModule_ROOMOPS 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); @@ -3233,6 +2043,35 @@ InitModule_ROOMOPS 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); + RegisterConditional(HKEY("COND:ALLOWED_DEFAULT_VIEW"), 0, ConditionalIsAllowedDefaultView, 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:CURR_VIEW"), 0, ConditionalThisRoomCurrView, 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); @@ -3279,6 +2118,34 @@ InitModule_ROOMOPS 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); @@ -3298,12 +2165,8 @@ void SessionDestroyModule_ROOMOPS (wcsession *sess) { - FlushFolder(&sess->CurRoom); - if (sess->cache_fold != NULL) { - free(sess->cache_fold); - } - - free_march_list(sess); - DeleteHash(&sess->Floors); + _FlushRoomList (sess); } + + /*@}*/