proboard/procfg/EDITPVT.CPP

441 lines
12 KiB
C++

/* ------------------------------------------------------------
* Filename ............... EditPvt.Cpp
*
* General Purpose ........ Edit private files settings
* ------------------------------------------------------------
* First date ............. 19 dec 1993
*
* First in version ....... 2.00
*
* Written by ............. Alain Schellinck
* ------------------------------------------------------------
* Revisions:
* ----------
*
* Date | By | Purpose |
* ---------+----+--------------------------------------------+
* | | |
* | | |
* | | |
*/
/*-------------------------------------------------------------------------*/
#include <io.h>
#include <stdlib.h>
#include <string.h>
#define Use_LinkedList
#include <TsWin.Hpp>
#define Uses_PbUsersIdx
#define Uses_PbUsersPb
#define Uses_PbUsersBbs
#include "ThProCfg.Hpp"
#include "Template.Hpp"
struct FileEntry
{
FileName fname;
LngT size;
Date date;
Time time;
};
LinkedList<_PrivateFile> far pvtfiles;
LinkedList<FileEntry> far filelist;
/*--] Code [-------------------------------------] sortedFileList [--------*/
/*
* Routine : compare()
* Purpose : compare two objects from the linked list
* ------------------------------------------------------------------------
* Parameters: pointer to 2 objects
* Return : return code from stricmp()
*
*/
int
CompareFileEntry(FileEntry& e1,FileEntry& e2)
{
return stricmp(e1.fname, e2.fname);
}
/*--] Code [-------------------------------------] File pick functions [---*/
/*
* Routine : listFile()
* Purpose : list the specified private file record
* ------------------------------------------------------------------------
* Parameters: record number, X and Y coordinates
* Return : None
*
*/
LCL void listFile(IntT recno, IntT x, IntT y)
{
ChrT c = '+';
char lp = '(';
char rp = ')';
FileName fn(pvtfiles[recno].fname);
if(strchr(fn,'\\'))
{
if(access(fn,0))
c = '-';
}
else
{
lp = rp = ' ';
if(access(FileName(cfg.pvtuploadpath, fn), 0))
c = '-';
}
fn.stripPath();
String keep_kill;
if(pvtfiles[recno].attr & PVTFILE_KEEP)
keep_kill = "KEEP";
else
keep_kill = "KILL";
tsw_maputs(x + 1, y, setFBColor(hYellow, nMagenta), form("[%c] %s %c%-12s%c - %-28.28s [%4s]",
c,
ChrP(pvtfiles[recno].date.format("DD MMM YY")),
lp,(char *)fn,rp,
pvtfiles[recno].to,
(char *)keep_kill
)
);
}
/*
* Routine : listFileEntry()
* Purpose : list the specified file from private files directory
* ------------------------------------------------------------------------
* Parameters: record number, X and Y coordinates
* Return : None
*
*/
LCL void listFileEntry(IntT recno, IntT x, IntT y)
{
FileEntry entry = filelist[recno];
tsw_maputs(x + 1, y, setFBColor(hYellow, nBlue), form("%-12.12s %s %s %6lu",
(char *)entry.fname,
(char *)entry.date.format("DD MMM CCYY"),
(char *)entry.time.format("HH:MM.SS"),
entry.size
)
);
}
/*
* Routine : editPvtFile()
* Purpose : edit private files
* ------------------------------------------------------------------------
* Parameters: None
* Return : None
*
*/
void editPvtFile()
{
KEY hotkeys[] =
{
KEY_INS,
KEY_DEL,
0
};
Field frm[]=
{
/* TYPE dataPtr choices hookFunc flags len width x y */
/* ------------------------------------------------------------------------------------------------------- */
{ FRM_STRING ,0 ,0 ,0 ,FRM_UPPER ,79 ,50 ,13 ,2 },
{ FRM_STRING ,0 ,0 ,0 ,0 ,35 ,36 ,13 ,4 },
{ FRM_STRING ,0 ,0 ,0 ,0 ,35 ,36 ,13 ,5 },
{ FRM_YESNO ,0 ,0 ,0 ,0 ,3 ,3 ,13 ,7 }
};
pvtfiles.kill();
File f;
if(f.open(FileName(syspath,"PVTFILES.PB")))
{
for(;;)
{
_PrivateFile tmp;
if(f.read(&tmp,sizeof(tmp)) != sizeof(tmp))
break;
if(tmp.fname[0])
pvtfiles.add(tmp);
}
f.close();
}
SelectWindow sw( pvtfiles.count(),
0x70,
listFile,
0,
NULL,
hotkeys );
sw.open( 3,
4,
77,
21,
0x5F,
SHADOW | BRACKETS,
CHISEL_BORDER,
0x5D,
NULL,
0x51 );
sw.title( "Personal Files", 0x5E );
for(;;)
{
tsw_showfooter( "\x1<Del>\x1 - Delete \x1<Ins>\x1 - Add \x1<Enter>\x1 - Edit", BAR_NORM, BAR_HIGH );
sw.redefine(pvtfiles.count());
ShrtT choice = sw.process();
if(choice == SL_ESC)
break;
if(choice == SL_HOTKEY)
{
switch(sw.hotkey)
{
case KEY_INS:
{
_PrivateFile tmp;
CLEAR_OBJECT(tmp);
choice = pvtfiles.count();
sw.current = choice;
tmp.date.today();
strcpy(tmp.from,cfg.sysopname);
pvtfiles.add(tmp);
}
break;
case KEY_DEL:
{
if(!pvtfiles.count())
{
tsw_beep();
continue;
}
FileName fn(cfg.pvtuploadpath,pvtfiles[sw.current].fname);
if(!access(fn,0))
if(askYesNo(form("Delete file %s ?",pvtfiles[sw.current].fname)) == TRUE)
unlink(fn);
pvtfiles.get(sw.current);
pvtfiles.remove();
continue;
}
}
}
ShrtT recno = choice;
KEY pickkeys[]=
{
KEY_ALTL , // list
NULL
};
FormWindow w( 7,
8,
74,
17,
0x3F,
SHADOW | BRACKETS,
CHISEL_BORDER,
0x3B,
NULL,
0x31 );
w.define( frm,
4,
0x31,
0x4E,
pickkeys,
NULL );
w.open();
w.title( "Edit Personal File", 0x3E );
w.attrib( 0x3F );
w << "\n FileName:\n"
"\n From user:"
"\n To user:\n"
"\n Delete?:";
bool kill_file = !(pvtfiles[recno].attr & PVTFILE_KEEP);
frm[0].value = pvtfiles[recno].fname;
frm[1].value = pvtfiles[recno].from;
frm[2].value = pvtfiles[recno].to;
frm[3].value = &kill_file;
for(;;)
{
tsw_showfooter("[\001ALT-L\001] Show file- or userlist", BAR_NORM, BAR_HIGH );
tsw_cursoron();
ShrtT choice = w.process();
if(choice == ED_ESC)
break;
if(choice == ED_HOT)
{
switch(w.scanHotKey)
{
case KEY_ALTL:
{
User user;
User::setDir(cfg.msgpath);
NumUsers = ShrtT(User::numUsers());
userFilter filter;
fillUserList(filter);
CLEAR_OBJECT(usrFind);
switch(w.getField())
{
case 0: // filename
{
FileName mask(cfg.pvtuploadpath);
mask.appendBS();
mask << "*.*";
filelist.kill();
{
DirScan find;
int status = find.first(mask);
while(status == TRUE)
{
FileEntry entry;
entry.fname = find.name();
entry.size = find.size();
entry.date = find.date();
entry.time = find.time();
filelist.add(entry);
status = find.next();
}
}
if(filelist.count() != 0)
{
filelist.sort(CompareFileEntry);
SelectWindow sw( filelist.count(),
0x70,
listFileEntry,
0,
NULL,
NULL );
sw.open( 13,
6,
67,
19,
0x17,
SHADOW | BRACKETS,
CHISEL_BORDER,
0x19,
NULL,
0x10 );
sw.title( ChrP( mask ), 0x1E );
tsw_cursoroff();
int fileno = sw.process();
if(fileno != SL_ESC)
{
strcpy(pvtfiles[recno].fname, filelist[fileno].fname);
}
}
continue;
}
case 1: // from user
{
ShrtT userno = pickUser(0);
if(userno != -1)
{
user.read(getDiskRecNo(userno));
strcpy(pvtfiles[recno].from, user.name);
}
continue;
}
case 2: // to user
{
ShrtT userno = pickUser(0);
if(userno != -1)
{
user.read(getDiskRecNo(userno));
strcpy(pvtfiles[recno].to, user.name);
}
continue;
}
}
}
}
}
}
pvtfiles[choice].attr = 0;
if(!kill_file)
pvtfiles[choice].attr |= PVTFILE_KEEP;
}
if(f.open(FileName(syspath,"PVTFILES.PB"),fmode_create))
{
for(pvtfiles.rewind(); !pvtfiles.eol();pvtfiles++)
{
if(f.write(&pvtfiles.get(),sizeof(_PrivateFile)) != sizeof(_PrivateFile))
break;
}
f.close();
}
tsw_cursoroff();
}
/*---------------------------] END OF THE CODE [---------------------------*/