366 lines
8.5 KiB
C++
366 lines
8.5 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <tswin.hpp>
|
|
#include "procfg.hpp"
|
|
|
|
struct FileArea : _FileArea
|
|
{
|
|
static File f;
|
|
static int file_count;
|
|
public:
|
|
FileArea();
|
|
~FileArea();
|
|
|
|
bool read(int);
|
|
bool write(int);
|
|
bool clear(int);
|
|
|
|
int numAreas();
|
|
void truncate();
|
|
};
|
|
|
|
int FileArea::file_count = 0;
|
|
File FileArea::f;
|
|
|
|
FileArea::FileArea()
|
|
{
|
|
if(file_count <= 0)
|
|
{
|
|
f.open(FileName(syspath,"FILECFG.PRO"),fmode_rw | fmode_copen);
|
|
file_count = 0;
|
|
}
|
|
|
|
file_count++;
|
|
}
|
|
|
|
FileArea::~FileArea()
|
|
{
|
|
if(file_count <= 1)
|
|
{
|
|
f.close();
|
|
file_count = 1;
|
|
}
|
|
|
|
file_count--;
|
|
}
|
|
|
|
bool
|
|
FileArea::read(int rec)
|
|
{
|
|
f.seek(long(rec-1) * sizeof(_FileArea));
|
|
|
|
return (f.read(this,sizeof(*this)) == sizeof(*this)) ? TRUE : FALSE;
|
|
}
|
|
|
|
bool
|
|
FileArea::write(int rec)
|
|
{
|
|
f.seek(long(rec-1) * sizeof(_FileArea));
|
|
return (f.write(this,sizeof(*this)) == sizeof(*this)) ? TRUE : FALSE;
|
|
}
|
|
|
|
bool
|
|
FileArea::clear(int rec)
|
|
{
|
|
CLEAR_OBJECT(*this);
|
|
|
|
return write(rec);
|
|
}
|
|
|
|
int
|
|
FileArea::numAreas()
|
|
{
|
|
return int(f.len() / sizeof(_FileArea));
|
|
}
|
|
|
|
void
|
|
FileArea::truncate()
|
|
{
|
|
FileArea fa;
|
|
int i = numAreas();
|
|
|
|
for(;i>0;i--)
|
|
{
|
|
if(!fa.read(i)) continue;
|
|
|
|
if(fa.name[0])
|
|
{
|
|
f.seek(long(i) * sizeof(_FileArea));
|
|
f.cut();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!i)
|
|
{
|
|
f.seek(0);
|
|
f.cut();
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
farea_list_func(int i,int x,int y)
|
|
{
|
|
FileArea fa;
|
|
char *ptr;
|
|
|
|
if(!fa.read(i+1) || !fa.name[0])
|
|
ptr = form("%5d úúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúúú",i+1);
|
|
else
|
|
ptr = form("%5d %s",i+1,fa.name);
|
|
|
|
if(strlen(ptr)>43) ptr[43]=0;
|
|
|
|
tsw_maputs(x,y,0x5F,ptr);
|
|
tsw_maputc(x+6,y,0x5E,'³');
|
|
}
|
|
|
|
static void
|
|
helpfunction(int i)
|
|
{
|
|
char *txt[]=
|
|
{
|
|
"Name/description of this file area",
|
|
"Directory where files are located",
|
|
"Full path and filename of file listing for this area",
|
|
"Flags needed to download from this area (<Enter>=Edit)",
|
|
"Level needed to download from this area",
|
|
"Use CD-ROM specific listing format?",
|
|
"Include files from this area in TOPFILES.A??",
|
|
"Free area?",
|
|
"Group #1 this area belongs to",
|
|
"Group #2 this area belongs to",
|
|
"Group #3 this area belongs to",
|
|
"Group #4 this area belongs to",
|
|
"Does this area belong to all groups?",
|
|
"Maximum number of downloaded files per day for this area (0=unlimited)",
|
|
"Maximum number of downloaded Kbytes per day for this area (0=unlimited)",
|
|
"The date format that is used in FILES.BBS for this area (if listed)"
|
|
};
|
|
|
|
tsw_showfooter(txt[i], BAR_COLOR);
|
|
}
|
|
|
|
void
|
|
edit_files()
|
|
{
|
|
char *dateFormats[] =
|
|
{
|
|
"MM/DD/YY", "YY/MM/DD", "DD/MM/YY",
|
|
NULL
|
|
};
|
|
|
|
Field frm[]=
|
|
{
|
|
{ FRM_STRING , 0 , 0,0 , 0 , 79 , 45, 17,2 },
|
|
{ FRM_STRING , 0 , 0,0 , FRM_UPPER , 79 , 45, 17,4 },
|
|
{ FRM_STRING , 0 , 0,0 , FRM_UPPER , 79 , 45, 17,5 },
|
|
{ FRM_FUNCTION, 0 , 0,flagonoff_select ,0, 26 , 26, 17,7 },
|
|
{ FRM_UNSIGNED, 0 , 0,0 , 0 , 5 , 6 , 17,8 },
|
|
{ FRM_YESNO , 0 , 0,0 , 0 , 3 , 3 , 17,10 },
|
|
{ FRM_YESNO , 0 , 0,0 , 0 , 3 , 3 , 17,11 },
|
|
{ FRM_YESNO , 0 , 0,0 , 0 , 3 , 3 , 17,12 },
|
|
{ FRM_SHORT , 0 , 0,0 , 0 , 3 , 4 , 17,14 },
|
|
{ FRM_SHORT , 0 , 0,0 , 0 , 3 , 4 , 17,15 },
|
|
{ FRM_SHORT , 0 , 0,0 , 0 , 3 , 4 , 17,16 },
|
|
{ FRM_SHORT , 0 , 0,0 , 0 , 3 , 4 , 17,17 },
|
|
{ FRM_YESNO , 0 , 0,0 , 0 , 3 , 3 , 17,18 },
|
|
{ FRM_INT , 0 , 0,0 , 0 , 5 , 6 , 54,10 },
|
|
{ FRM_INT , 0 , 0,0 , 0 , 5 , 6 , 54,11 },
|
|
{ FRM_CHOICE , 0 ,dateFormats,0,0 , 8 , 8 , 54,13 }
|
|
};
|
|
|
|
FileArea fa;
|
|
|
|
int num_areas = fa.numAreas();
|
|
|
|
KEY hotkeys[]={ '1','2','3','4','5','6','7','8','9',KEY_INS, KEY_DEL , NULL };
|
|
|
|
SelectWindow sw;
|
|
sw.open(3,3,50,tsw_vsize-3,0x5E,SHADOW);
|
|
sw.title(" Select File Area ",0x5F);
|
|
sw.define(num_areas,0x70,farea_list_func,0,NULL,hotkeys);
|
|
|
|
sw.direct(7,0,'Ñ');
|
|
sw.direct(7 ,tsw_vsize-6,'Ï');
|
|
|
|
bool reselect = TRUE;
|
|
int choice;
|
|
|
|
for(;;)
|
|
{
|
|
if(reselect)
|
|
{
|
|
tsw_showfooter("\001<Ins>\001 - Add Area \001<Del>\001 - Delete Area \001<Enter>\001 - Edit Area", BAR_NORM, BAR_HIGH);
|
|
|
|
choice=sw.process();
|
|
|
|
if(choice==SL_ESC) break;
|
|
|
|
if(choice==SL_HOTKEY)
|
|
{
|
|
switch(sw.hotkey)
|
|
{
|
|
case KEY_DEL:
|
|
{
|
|
if(!fa.read(sw.current+1))
|
|
{
|
|
tsw_beep();
|
|
continue;
|
|
}
|
|
|
|
if(fa.name[0])
|
|
if(ask_save() == 0)
|
|
fa.clear(sw.current+1);
|
|
|
|
continue;
|
|
}
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9': KB.push((KEY)(char)sw.hotkey);
|
|
case KEY_INS:
|
|
{
|
|
CursorState _cursor(TRUE);
|
|
|
|
int newareanum = num_areas+1;
|
|
|
|
Window w(10,5,40,7,0x3F);
|
|
w.open();
|
|
w << " New area number: ";
|
|
w.attrib(0x3E);
|
|
w.scan(newareanum,5,6);
|
|
|
|
if(newareanum > MAX_FILEAREA || newareanum < 1) continue;
|
|
|
|
if(newareanum > num_areas)
|
|
{
|
|
for(int i=num_areas+1;i<=newareanum;i++) fa.clear(i);
|
|
|
|
num_areas = newareanum;
|
|
|
|
sw.redefine(num_areas);
|
|
}
|
|
|
|
choice = newareanum - 1;
|
|
|
|
sw.show(choice);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!fa.read(choice+1))
|
|
{
|
|
tsw_beep();
|
|
continue;
|
|
}
|
|
|
|
word crcvalue = crc(&fa,sizeof(fa));
|
|
|
|
if(!fa.name[0])
|
|
{
|
|
memset(&fa,0,sizeof(fa));
|
|
fa.level = 1;
|
|
}
|
|
|
|
AccessFlags *flags[2];
|
|
|
|
flags[0] = &fa.flags;
|
|
flags[1] = &fa.flagsNot;
|
|
|
|
int tops = (fa.notops) ? 0 : 1;
|
|
|
|
frm[0].value = fa.name;
|
|
frm[1].value = fa.filepath;
|
|
frm[2].value = fa.listpath;
|
|
frm[3].value = flags;
|
|
frm[4].value = &fa.level;
|
|
frm[5].value = &fa.cdrom;
|
|
frm[6].value = &tops;
|
|
frm[7].value = &fa.free;
|
|
frm[8].value = &fa.groups[0];
|
|
frm[9].value = &fa.groups[1];
|
|
frm[10].value = &fa.groups[2];
|
|
frm[11].value = &fa.groups[3];
|
|
frm[12].value = &fa.allGroups;
|
|
frm[13].value = &fa.maxfiles;
|
|
frm[14].value = &fa.maxkb;
|
|
frm[15].value = &fa.dateFormat;
|
|
|
|
KEY form_keys[] = { KEY_PGUP , KEY_PGDN, 0 };
|
|
|
|
FormWindow w(6,3,71,23,0x1F,SHADOW);
|
|
w.define(frm,16,0x1F,0x70,form_keys,helpfunction);
|
|
w.open();
|
|
w.title(form(" File Area #%d ",choice+1),0x1E);
|
|
w.attrib(0x1E);
|
|
|
|
w << "\n Area name :\n\n"
|
|
" File Location:\n"
|
|
" Listing file :\n\n"
|
|
" Access Flags :\n"
|
|
" Access Level :\n\n"
|
|
" Copy local : Max files:\n"
|
|
" In TOPFILES : Max Kb :\n"
|
|
" Free Area :\n"
|
|
" FILES.BBS Date Format:\n"
|
|
" Group #1 :\n"
|
|
" Group #2 :\n"
|
|
" Group #3 :\n"
|
|
" Group #4 :\n"
|
|
" All Groups :";
|
|
|
|
w.direct( 2,20,0x1B," <PgUp> Previous Area ");
|
|
w.direct(44,20,0x1B," <PgDn> Next Area ");
|
|
|
|
CursorState _cursor(TRUE);
|
|
|
|
int retval = w.process();
|
|
|
|
fa.notops = (tops) ? 0 : 1;
|
|
|
|
if(!fa.listpath[0] && fa.filepath[0])
|
|
{
|
|
strcpy(fa.listpath , fa.filepath);
|
|
append_backspace(fa.listpath);
|
|
strcat(fa.listpath , "FILES.BBS");
|
|
}
|
|
|
|
if(crcvalue != crc(&fa,sizeof(fa)) && fa.name[0])
|
|
{
|
|
if(ask_save() == 0)
|
|
{
|
|
fa.write(choice+1);
|
|
}
|
|
}
|
|
|
|
if(retval == ED_HOT)
|
|
{
|
|
if(w.scanHotKey == KEY_PGUP && choice > 0)
|
|
choice--;
|
|
if(w.scanHotKey == KEY_PGDN && choice < num_areas-1)
|
|
choice++;
|
|
|
|
reselect = FALSE;
|
|
}
|
|
else
|
|
reselect = TRUE;
|
|
|
|
}
|
|
|
|
if(fa.read(num_areas))
|
|
{
|
|
if(!fa.name[0])
|
|
fa.truncate();
|
|
}
|
|
}
|
|
|
|
|