387 lines
7.4 KiB
C++
387 lines
7.4 KiB
C++
#define Use_MsgBase
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "proboard.hpp"
|
|
|
|
void select_filegroup(char *);
|
|
void select_msggroup(char *);
|
|
|
|
void
|
|
set_msgarea(char *data)
|
|
{
|
|
MsgArea ma;
|
|
int areanum = 0;
|
|
String param[50];
|
|
word group = 0;
|
|
int columns = 2;
|
|
bool group_specified = FALSE;
|
|
bool listareas = FALSE;
|
|
bool show_lastread = TRUE;
|
|
bool list_specified = FALSE;
|
|
|
|
BitArray arealist(MAX_MSG_AREAS,1);
|
|
|
|
int npara = parse_data(data,param);
|
|
|
|
for(int i=0;i<npara;i++)
|
|
{
|
|
param[i].upperCase();
|
|
|
|
if(param[i] == "/L")
|
|
listareas = TRUE;
|
|
|
|
if(param[i] == "/N")
|
|
show_lastread = FALSE;
|
|
|
|
if(!strnicmp(param[i],"/C=",3))
|
|
{
|
|
columns = atoi(¶m[i][3]);
|
|
}
|
|
|
|
if(param[i] == "/MG")
|
|
{
|
|
group = user.msgGroup;
|
|
group_specified = TRUE;
|
|
}
|
|
|
|
if(!strnicmp(param[i],"/MG=",4))
|
|
{
|
|
group = atoi(¶m[i][4]);
|
|
group_specified = TRUE;
|
|
}
|
|
|
|
if(param[i][0] != '/') list_specified = TRUE;
|
|
}
|
|
|
|
if(list_specified)
|
|
{
|
|
create_arealist(param,npara,arealist,TRUE);
|
|
}
|
|
else
|
|
{
|
|
for(i = 1 ; i <= MAX_MSG_AREAS ; i++)
|
|
arealist.set(i);
|
|
}
|
|
|
|
if(group_specified && group == 0)
|
|
{
|
|
select_msggroup("");
|
|
|
|
group = user.msgGroup;
|
|
|
|
if(!group)
|
|
return;
|
|
|
|
io << '\n';
|
|
}
|
|
|
|
for(bool shown=FALSE;;shown=TRUE)
|
|
{
|
|
if(!listareas)
|
|
{
|
|
io << '\n' << S_ENTER_MESSAGE_AREA_NUMBER;
|
|
if(!shown) io << S_PRESS_ENTER_TO_LIST;
|
|
io << ": ";
|
|
if(io.read(areanum,5)>=0) break;
|
|
|
|
if(shown) return;
|
|
|
|
io << "\n\f\n" << S_SELECT_MESSAGE_AREA_TITLE << "\n\n";
|
|
|
|
linecounter(3);
|
|
}
|
|
|
|
io.enablestop();
|
|
|
|
for(int i=1,count=0;i<=MsgArea::highAreaNum();i++)
|
|
{
|
|
String newmail = " ";
|
|
|
|
if(!arealist[i] || !ma.read(i) || !check_access(ma.readLevel,ma.readFlags,ma.readFlagsNot)) continue;
|
|
|
|
if(group && !ma.allGroups)
|
|
{
|
|
for(int g=0;g<4;g++)
|
|
{
|
|
if(ma.groups[g] == group)
|
|
break;
|
|
}
|
|
|
|
if(g==4)
|
|
continue;
|
|
}
|
|
|
|
if(!listareas && show_lastread)
|
|
if(ma.lastRead(user_recnr) < ma.highMsg())
|
|
newmail = "\7*";
|
|
|
|
io << form("\3%4d. %s \6%-*.*s ",i,(char *)newmail,80/columns-10,80/columns-10,ma.name);
|
|
|
|
if(stopped) break;
|
|
|
|
if(!((++count)%columns))
|
|
{
|
|
io << '\n';
|
|
if(linecounter()) break;
|
|
}
|
|
}
|
|
|
|
if(count%columns) io << '\n';
|
|
|
|
if(listareas) break;
|
|
}
|
|
|
|
if(!listareas)
|
|
{
|
|
io << '\n';
|
|
|
|
if(!arealist[areanum] || !ma.read(areanum) || (!check_access(ma.readLevel,ma.readFlags,ma.readFlagsNot) && !ma.sysopAccess()))
|
|
{
|
|
io << '\n' << S_UNKNOWN_MESSAGE_AREA << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
return;
|
|
}
|
|
|
|
user.msgArea = areanum;
|
|
|
|
updatemenu = TRUE;
|
|
}
|
|
}
|
|
|
|
void
|
|
set_filearea(char *data)
|
|
{
|
|
FileArea fa;
|
|
word group = 0;
|
|
int areanum = 0;
|
|
bool arealist_created = FALSE;
|
|
bool group_specified = FALSE;
|
|
int columns = 2;
|
|
String param[50];
|
|
BitArray arealist(MAX_FILE_AREAS , 1);
|
|
|
|
int npara=parse_data(data,param);
|
|
|
|
for(int i=0;i<npara;i++)
|
|
{
|
|
param[i].upperCase();
|
|
|
|
if(param[i] == "/FG")
|
|
{
|
|
group = user.fileGroup;
|
|
group_specified = TRUE;
|
|
}
|
|
if(!strnicmp(param[i],"/FG=",4))
|
|
{
|
|
group = atoi(¶m[i][4]);
|
|
group_specified = TRUE;
|
|
}
|
|
|
|
if(!strnicmp(param[i],"/C=",3))
|
|
{
|
|
columns = atoi(¶m[i][3]);
|
|
}
|
|
}
|
|
|
|
|
|
if(group_specified && group == 0)
|
|
{
|
|
select_filegroup("");
|
|
|
|
group = user.fileGroup;
|
|
|
|
if(!group)
|
|
return;
|
|
|
|
io << '\n';
|
|
}
|
|
|
|
for(bool shown=FALSE;;shown=TRUE)
|
|
{
|
|
io << '\n' << S_ENTER_FILE_AREA_NUMBER;
|
|
if(!shown) io << S_PRESS_ENTER_TO_LIST;
|
|
io << ": ";
|
|
if(io.read(areanum,4)>=0) break;
|
|
|
|
if(shown) return;
|
|
|
|
io << "\f\n" << S_SELECT_FILE_AREA_TITLE << "\n\n";
|
|
|
|
io << "\x17.";
|
|
|
|
create_arealist(param,npara,arealist);
|
|
arealist_created = TRUE;
|
|
|
|
io << '\r';
|
|
|
|
linecounter(3);
|
|
io.enablestop();
|
|
|
|
for(int i=1,count=0;i<=FileArea::highAreaNum();i++)
|
|
{
|
|
if(!arealist[i] || !fa.read(i)) continue;
|
|
|
|
if(!check_access(fa.level,fa.flags,fa.flagsNot)) continue;
|
|
|
|
if(group && !fa.allGroups)
|
|
{
|
|
for(int g=0;g<4;g++)
|
|
{
|
|
if(fa.groups[g] == group)
|
|
break;
|
|
}
|
|
|
|
if(g==4)
|
|
continue;
|
|
}
|
|
|
|
io << form("\3%4d. \6%-*.*s ",i,80/columns-8,80/columns-8,fa.name);
|
|
|
|
if(stopped) break;
|
|
if(!((++count)%columns))
|
|
{
|
|
io <<'\n';
|
|
if(linecounter()) break;
|
|
}
|
|
}
|
|
|
|
if(count%columns) io << '\n';
|
|
}
|
|
|
|
io << '\n';
|
|
|
|
if((arealist_created && !arealist[areanum]) || !fa.read(areanum) || !check_access(fa.level,fa.flags,fa.flagsNot))
|
|
{
|
|
io << '\n' << S_UNKNOWN_FILE_AREA << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
return;
|
|
}
|
|
|
|
user.fileArea = areanum;
|
|
|
|
updatemenu = TRUE;
|
|
}
|
|
|
|
void
|
|
select_filegroup(char *)
|
|
{
|
|
File f;
|
|
AreaGroup group;
|
|
|
|
f.open(FileName(syspath,"FGROUPS.PB"));
|
|
|
|
io << "\f\n" << S_SELECT_FILE_AREA_GROUP_TITLE << "\n\n";
|
|
|
|
linecounter(3);
|
|
io.enablestop();
|
|
|
|
for(int i=1,count=0;;i++)
|
|
{
|
|
if(f.read(&group,sizeof(group)) != sizeof(group))
|
|
break;
|
|
|
|
if(!check_access(group.level,group.flags,group.flagsNot))
|
|
continue;
|
|
|
|
if(!group.name[0])
|
|
continue;
|
|
|
|
io << form(" \3%3d. \6%-29.29s ",i,group.name);
|
|
|
|
if(stopped) break;
|
|
|
|
if((count++)%2)
|
|
{
|
|
io <<'\n';
|
|
if(linecounter()) break;
|
|
}
|
|
}
|
|
|
|
if(count%2) io << '\n';
|
|
|
|
int groupnum = 0;
|
|
|
|
io << '\n' << S_ENTER_GROUP_NUMBER;
|
|
|
|
if(io.read(groupnum,3) < 0) return;
|
|
|
|
io << '\n';
|
|
|
|
if(groupnum < 1 || groupnum > 255)
|
|
io << '\n' << S_UNKNOWN_GROUP << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
|
|
f.seek(long(groupnum-1) * sizeof(group));
|
|
|
|
if(f.read(&group,sizeof(group)) != sizeof(group) || !check_access(group.level,group.flags,group.flagsNot))
|
|
io << '\n' << S_UNKNOWN_GROUP << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
|
|
user.fileGroup = groupnum;
|
|
|
|
updatemenu = TRUE;
|
|
}
|
|
|
|
void
|
|
select_msggroup(char *)
|
|
{
|
|
File f;
|
|
AreaGroup group;
|
|
|
|
f.open(FileName(syspath,"MGROUPS.PB"));
|
|
|
|
io << "\f\n" << S_SELECT_MSG_AREA_GROUP_TITLE << "\n\n";
|
|
|
|
linecounter(3);
|
|
io.enablestop();
|
|
|
|
for(int i=1,count=0;;i++)
|
|
{
|
|
if(f.read(&group,sizeof(group)) != sizeof(group))
|
|
break;
|
|
|
|
if(!check_access(group.level,group.flags,group.flagsNot))
|
|
continue;
|
|
|
|
if(!group.name[0])
|
|
continue;
|
|
|
|
io << form(" \3%3d. \6%-29.29s ",i,group.name);
|
|
|
|
if(stopped) break;
|
|
|
|
if((count++)%2)
|
|
{
|
|
io <<'\n';
|
|
if(linecounter()) break;
|
|
}
|
|
}
|
|
|
|
if(count%2) io << '\n';
|
|
|
|
int groupnum = 0;
|
|
|
|
io << '\n' << S_ENTER_GROUP_NUMBER;
|
|
|
|
if(io.read(groupnum,3) < 0) return;
|
|
|
|
io << '\n';
|
|
|
|
if(groupnum < 1 || groupnum > 255)
|
|
{
|
|
io << '\n' << S_UNKNOWN_GROUP << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
return;
|
|
}
|
|
|
|
f.seek(long(groupnum-1) * sizeof(group));
|
|
|
|
if(f.read(&group,sizeof(group)) != sizeof(group) || !check_access(group.level,group.flags,group.flagsNot))
|
|
{
|
|
io << '\n' << S_UNKNOWN_GROUP << ' ' << S_PRESS_ENTER_TO_CONTINUE;
|
|
return;
|
|
}
|
|
|
|
user.msgGroup = groupnum;
|
|
|
|
updatemenu = TRUE;
|
|
}
|
|
|
|
|