499 lines
12 KiB
C++
499 lines
12 KiB
C++
|
||
/* ------------------------------------------------------------
|
||
* Filename ............... ProMisc.Cpp
|
||
*
|
||
* General Purpose ........ some miscellaneous functions
|
||
* ------------------------------------------------------------
|
||
* First date ............. 15 dec 1993
|
||
*
|
||
* First in version ....... 2.00
|
||
*
|
||
* Written by ............. Alain Schellinck
|
||
* ------------------------------------------------------------
|
||
* Revisions:
|
||
* ----------
|
||
*
|
||
* Date | By | Purpose |
|
||
* ---------+----+--------------------------------------------+
|
||
* | | |
|
||
* | | |
|
||
* | | |
|
||
*/
|
||
|
||
/*-------------------------------------------------------------------------*/
|
||
|
||
#include <ctype.h>
|
||
#include <string.h>
|
||
|
||
#include "ThProCfg.Hpp"
|
||
|
||
/*-------------------------------------------------------------------------*/
|
||
|
||
/*
|
||
* Routine : enterPwd
|
||
* Purpose : let the user enter a password
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: None
|
||
* Return : None
|
||
*
|
||
*/
|
||
|
||
KEY
|
||
enterPwd(IntT mode, Window& w, IntT x, IntT y, ChrT attr, AnyP data)
|
||
{
|
||
User *user = (User *) data;
|
||
tsw_cursoroff();
|
||
|
||
if(mode == TRUE)
|
||
{
|
||
Window w(10, 5, 40, 7, setFBColor(hWhite, nMagenta));
|
||
w.open();
|
||
w << " Password: ";
|
||
|
||
w.attrib(setFBColor(hYellow, nMagenta));
|
||
|
||
tsw_cursoron();
|
||
|
||
ChrT buffer[16];
|
||
|
||
if(user->passWord[0] == '\0')
|
||
{
|
||
buffer[0] = '\0';
|
||
|
||
w.scan(buffer, 15, 16);
|
||
|
||
if(buffer[0])
|
||
{
|
||
strcpy(user->passWord , buffer);
|
||
|
||
user->passWordCRC = RaCrc(user->passWord);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
strcpy(buffer, user->passWord);
|
||
|
||
w.scan(buffer, 15, 16);
|
||
tsw_cursoroff();
|
||
|
||
strcpy(user->passWord, buffer);
|
||
|
||
user->passWordCRC = RaCrc(user->passWord);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(user->passWord[0] == '\0')
|
||
{
|
||
w.direct(x,y,attr,String(cfg.pwdchar,16));
|
||
}
|
||
else
|
||
{
|
||
String str(user->passWord);
|
||
|
||
if(cfg.hidePassword == TRUE)
|
||
str = String(cfg.pwdchar, strlen(user->passWord));
|
||
|
||
str.justify(String::left, 16);
|
||
w.direct(x, y, attr, str);
|
||
}
|
||
}
|
||
|
||
tsw_cursoron();
|
||
|
||
return 0;
|
||
}
|
||
|
||
/*
|
||
* Routine : askYesNo()
|
||
* Purpose : ask YES or NO
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: Title
|
||
* Return : -1 = ESC, TRUE = YES, FALSE = NO
|
||
*
|
||
*/
|
||
|
||
ShrtT askYesNo(ChrP title)
|
||
{
|
||
ShrtT ret_val = -1;
|
||
|
||
Window w(16, 9, 65, 16, setFBColor(hWhite, nBlack), SHADOW|CENTERED_X);
|
||
w.open();
|
||
|
||
w.centerLine(2, title, setFBColor(hYellow, nBlack));
|
||
|
||
menu_item yesNoMenu[]=
|
||
{
|
||
{ 'Y', 18,18, " YES " },
|
||
{ 'N', 17,17, " NO " },
|
||
{ 0 , 0,0, NULL }
|
||
};
|
||
|
||
PopMenu menu(yesNoMenu, setFBColor(nBlack, nWhite), setFBColor(hWhite, nBlack));
|
||
menu.open(18, 13, 63, 14, setFBColor(nWhite, nBlack), NOBORDER|CENTERED_X);
|
||
|
||
tsw_cursoroff();
|
||
ShrtT choice = menu.process();
|
||
|
||
if(choice > 0)
|
||
ret_val = 2 - choice;
|
||
|
||
return(ret_val);
|
||
}
|
||
|
||
|
||
|
||
//**************************************************************************
|
||
//
|
||
// Calculate the raw string width of a help line, without color codes
|
||
//
|
||
// Prototype: int CalcHelpWidth( char *pData );
|
||
//
|
||
// Parameters: pData ... Help data to calculate the length of
|
||
//
|
||
// Returns: The length, without any color codes
|
||
//
|
||
// Remarks:
|
||
//
|
||
// This routine takes a help line, and calculates how long it is without any
|
||
// color codes. A color code is a three byte sequence starting with 0x01,
|
||
// then two hex-encoded digits (i.e., "71" would indicate blue on a gray
|
||
// background.)
|
||
//
|
||
// -------------------------------------------------------------------------
|
||
//
|
||
// Created on: 08/06/99 (Jeff Reeder)
|
||
// Last modified: 08/06/99 (Jeff Reeder) Created
|
||
//
|
||
//**************************************************************************
|
||
|
||
int CalcHelpWidth( char *pData )
|
||
{
|
||
int cLength = 0;
|
||
|
||
|
||
while ( pData &&
|
||
*pData )
|
||
{
|
||
if ( *pData == 0x01 )
|
||
{
|
||
pData++;
|
||
|
||
|
||
if ( *pData &&
|
||
isxdigit( *pData ) )
|
||
{
|
||
pData++;
|
||
|
||
|
||
if ( *pData &&
|
||
isxdigit( *pData ) )
|
||
{
|
||
pData++;
|
||
}
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
cLength++;
|
||
pData++;
|
||
}
|
||
}
|
||
|
||
|
||
return cLength;
|
||
}
|
||
|
||
|
||
|
||
//**************************************************************************
|
||
//
|
||
// Converts a single hex character to a numerical value from 0-15
|
||
//
|
||
// Prototype: int HexCharToInt( char iChar );
|
||
//
|
||
// Parameters: iChar ... Hex value to convert
|
||
//
|
||
// Returns: A value from 0 through 15.
|
||
//
|
||
// Remarks:
|
||
//
|
||
// If the character value is not a valid hex digit, then a value of 0 is
|
||
// returned.
|
||
//
|
||
// -------------------------------------------------------------------------
|
||
//
|
||
// Created on: 08/06/99 (Jeff Reeder)
|
||
// Last modified: 08/06/99 (Jeff Reeder) Created
|
||
//
|
||
//**************************************************************************
|
||
|
||
int HexCharToInt( char iChar )
|
||
{
|
||
if ( isxdigit( iChar ) )
|
||
{
|
||
if ( iChar >= '0' &&
|
||
iChar <= '9' )
|
||
{
|
||
return iChar - '0';
|
||
}
|
||
else
|
||
{
|
||
return toupper( iChar ) - 'A' + 10;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//------------------
|
||
// Invalid hex digit
|
||
//------------------
|
||
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//**************************************************************************
|
||
//
|
||
//
|
||
//
|
||
// Prototype: void helpShowLine( Window &w, int iLine, char *pText );
|
||
//
|
||
// Parameters: w ... Window to show line of help text in
|
||
// iLine ... Line number in window to receive the text
|
||
// iDefAttr ... Default color attribute
|
||
// pText ... Text to show
|
||
//
|
||
// Returns: Nothing
|
||
//
|
||
// Remarks:
|
||
//
|
||
// This routine displays a single line of text to the help window. It
|
||
// properly handles all color codes, and displays data appropriately.
|
||
//
|
||
// If the help line doesn't contain any color codes, then it is displayed in
|
||
// the default color attribute <iDefAttr>.
|
||
//
|
||
// -------------------------------------------------------------------------
|
||
//
|
||
// Created on: 08/06/99 (Jeff Reeder)
|
||
// Last modified: 08/06/99 (Jeff Reeder) Created
|
||
//
|
||
//**************************************************************************
|
||
|
||
static
|
||
void helpShowLine( Window &w,
|
||
int iLine,
|
||
ATTR iDefAttr,
|
||
char *pText )
|
||
{
|
||
int iPos = 0;
|
||
int cLength = strlen( pText );
|
||
ATTR iCurAttr = iDefAttr;
|
||
|
||
|
||
for ( int i = 0; i < cLength; i++ )
|
||
{
|
||
if ( pText[ i ] == 0x01 )
|
||
{
|
||
//------------------------
|
||
// Looks like a color code
|
||
//------------------------
|
||
|
||
if ( isxdigit( pText[ i + 1 ] ) &&
|
||
isxdigit( pText[ i + 2 ] ) )
|
||
{
|
||
//----------------------------
|
||
// We have a valid color code!
|
||
//----------------------------
|
||
|
||
int iBack;
|
||
int iFore;
|
||
|
||
|
||
//-----------------------------------------
|
||
// Get the foreground and background colors
|
||
//-----------------------------------------
|
||
|
||
iBack = HexCharToInt( pText[ i + 1 ] );
|
||
iFore = HexCharToInt( pText[ i + 2 ] );
|
||
|
||
|
||
iCurAttr = ( ( iBack & 0x0F ) << 4 ) |
|
||
( iFore & 0x0F );
|
||
|
||
i += 2;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
tsw_maputc( w.minX + iPos,
|
||
w.minY + iLine - 1,
|
||
iCurAttr,
|
||
pText[ i ] );
|
||
|
||
iPos++;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//**************************************************************************
|
||
//
|
||
// Display a help message
|
||
//
|
||
// Prototype: void showHelp( ChrP hlp[], char *pTitle, FlgT center );
|
||
//
|
||
// Parameters: hlp ... An array of help lines to display
|
||
// pTitle ... Help window title
|
||
// center ... TRUE to center each line, FALSE otherwise
|
||
//
|
||
// Returns: Nothing
|
||
//
|
||
// Remarks:
|
||
//
|
||
//
|
||
//
|
||
// -------------------------------------------------------------------------
|
||
//
|
||
// Created on: ??/??/???? (Philippe Leybaert)
|
||
// Last modified: 08/06/1999 (Jeff Reeder) Modified to support custom
|
||
// color codes in individual lines in the message
|
||
//
|
||
//**************************************************************************
|
||
|
||
void showHelp( ChrP hlp[],
|
||
char *pTitle,
|
||
FlgT center )
|
||
{
|
||
int bHasCodes = 0;
|
||
|
||
|
||
tsw_cursoroff();
|
||
|
||
|
||
ShrtT lines = 0;
|
||
ShrtT width = 0;
|
||
|
||
|
||
while ( hlp[ lines ] != NULL )
|
||
{
|
||
if ( strchr( hlp[ lines ], 0x01 ) )
|
||
{
|
||
bHasCodes = 1;
|
||
}
|
||
|
||
|
||
width = max( width,
|
||
CalcHelpWidth( hlp[ lines ] ) + ( center * 4 ) );
|
||
|
||
lines++;
|
||
}
|
||
|
||
|
||
ShrtT hFree = tsw_hsize - ( width + 3 );
|
||
ShrtT vFree = tsw_vsize - ( lines + 1 );
|
||
ShrtT ux = hFree / 2;
|
||
ShrtT uy = vFree / 2;
|
||
|
||
|
||
Window w( ux,
|
||
uy,
|
||
ux + width + 3,
|
||
uy + lines + 1,
|
||
0x5F,
|
||
( pTitle && *pTitle )
|
||
? ( SHADOW | BRACKETS )
|
||
: SHADOW,
|
||
CHISEL_BORDER,
|
||
0x5D,
|
||
NULL,
|
||
0x50 );
|
||
|
||
|
||
w.open();
|
||
|
||
|
||
if ( pTitle &&
|
||
*pTitle )
|
||
{
|
||
w.title( pTitle, 0x5F );
|
||
}
|
||
|
||
|
||
for ( ShrtT cnt = 0; cnt < lines; cnt++ )
|
||
{
|
||
if ( bHasCodes )
|
||
{
|
||
helpShowLine( w,
|
||
cnt + 1,
|
||
0x5F,
|
||
hlp[ cnt ] );
|
||
}
|
||
else
|
||
{
|
||
String txt( hlp[ cnt ] );
|
||
|
||
|
||
if ( center == TRUE )
|
||
{
|
||
txt.justify( String::centered, width );
|
||
txt.rtrim();
|
||
}
|
||
|
||
|
||
w << ChrP( txt );
|
||
|
||
|
||
if (
|
||
( cnt + 1 != lines ) &&
|
||
( txt.len() < width )
|
||
)
|
||
{
|
||
w << "\n";
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
tsw_showfooter( "Press any key to continue.", BAR_NORM );
|
||
|
||
|
||
KB.get();
|
||
}
|
||
|
||
/*
|
||
* Routine : showAbout()
|
||
* Purpose : show the about screen
|
||
* ------------------------------------------------------------------------
|
||
* Parameters: None
|
||
* Return : None
|
||
*
|
||
*/
|
||
|
||
void showAbout()
|
||
{
|
||
LCL ChrP aboutText[] =
|
||
{
|
||
" ",
|
||
" 5EProBoard v" VERSION " Configuration Utility",
|
||
" ",
|
||
" Copyright (c) 2019 John Riley ",
|
||
" All Rights Reserved ",
|
||
" ",
|
||
" Developed by the ProBoard Development Ninja Team ",
|
||
" ",
|
||
" 5DPortions written by Alain Schellinck ",
|
||
" ",
|
||
NULL
|
||
};
|
||
|
||
|
||
showHelp( aboutText, "About ProBoard" );
|
||
}
|
||
|
||
/*---------------------------] END OF THE CODE [---------------------------*/
|