proboard/MSG.CPP

680 lines
11 KiB
C++

#define Use_MsgBase
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "proboard.hpp"
Message::Message( int n )
{
clear();
msgArea = new MsgArea;
if ( n )
{
msgArea->read( n );
}
}
Message::Message( Message *p,
int n )
{
if ( p != this )
{
memcpy( this,
p,
sizeof( *p ) );
}
msgArea = new MsgArea;
if ( n )
{
msgArea->read( n );
}
}
void Message::clear()
{
MsgArea *ma = msgArea;
CLEAR_OBJECT( *this );
msgArea = ma;
}
Message::~Message()
{
delete msgArea;
}
bool Message::readAccess()
{
if ( ! check_access( msgArea->readLevel,
msgArea->readFlags,
msgArea->readFlagsNot ) &&
!msgArea->sysopAccess() )
{
return FALSE;
}
if ( attr & MSGATTR_PRIVATE )
{
return ! ( strcmpl( to, user.name ) &&
strcmpl( from, user.name ) &&
(
strcmpl( to, user.alias ) ||
! msgArea->flags
)
&&
(
strcmpl( from, user.alias ) ||
! msgArea->flags
)
&&
! msgArea->sysopAccess() );
}
else
{
return TRUE;
}
}
int Message::areaNum()
{
return msgArea->areaNum;
}
bool Message::setArea( int n )
{
bool r = msgArea->read( n );
if ( ! r )
{
msgArea->areaNum = 0;
}
return r;
}
bool Message::read( long n,
int a )
{
if ( a )
{
if ( ! msgArea->read( a ) )
{
return FALSE;
}
}
long actual_n = msgBase()->readMsg( *this, n );
return ( n == actual_n )
? TRUE
: FALSE;
}
void Message::setFlag( dword msgflag )
{
if ( msgflag & MSGATTR_RECEIVED )
{
recvDate.today();
recvTime.now();
}
attr |= msgflag;
msgBase()->updateMsg( *this );
}
void Message::clearFlag( dword msgflag )
{
attr &= ~msgflag;
msgBase()->updateMsg( *this );
}
void Message::toggleFlag( dword msgflag )
{
attr ^= msgflag;
msgBase()->updateMsg( *this );
}
void clearmarked( char * )
{
markedmsglist.clear();
io << "\n\n"
<< S_UNMARKED_ALL_MESSAGES
<< ' '
<< S_PRESS_ENTER_TO_CONTINUE;
}
void Message::addOrigin()
{
aka a;
bool echo_area = FALSE;
File fo;
File fi( "MSGTMP", fmode_text );
if ( ! fi.opened() )
{
return;
}
fo.open( "MSGTMP.$$$",
fmode_create | fmode_text );
if ( msgArea->msgKind == MSG_NET )
{
a.read( msgArea->aka );
origZone = a.zone;
origNet = a.net;
origNode = a.node;
origPoint = a.point;
if ( msgArea->msgBaseType != MSGBASE_JAM )
{
if ( origPoint )
{
fo << form( "\1FMPT %d\n",
origPoint );
}
if ( destPoint )
{
fo << form( "\1TOPT %d\n",
destPoint );
}
}
}
if ( msgArea->msgKind == MSG_ECHO ||
msgArea->msgKind == MSG_PVTECHO )
{
a.read( msgArea->aka );
origZone = destZone = a.zone;
origNet = destNet = a.net;
origNode = destNode = a.node;
origPoint = destPoint = a.point;
echo_area = TRUE;
}
bool blankline = FALSE;
for ( ; ; )
{
String line;
String copiedline;
line = fi.readLine();
if ( line[ 0 ] == '\0' )
{
break;
}
line.delLast( '\n' );
copiedline = line;
copiedline.trim();
if ( line.len() >= 4 )
{
if ( ! strncmp( copiedline,
"--- ",
4 ) )
{
//-------------------
// Get rid of tagline
//-------------------
break;
}
if ( ! strncmp( copiedline,
"* Origin",
8 ) )
{
//------------------------
// Stop when *Origin found
//------------------------
break;
}
}
if ( ! strcmp( copiedline, "---" ) )
{
line.clear();
}
if ( line[ 0 ] != '\x01' )
{
fo << line
<< '\n';
}
blankline = ( line[ 0 ] == '\0' );
}
//----------------------------
// JDR: REGISTRATION REFERENCE
//----------------------------
if ( ! registered &&
(
pastFirstUse < 0 ||
pastFirstUse > 60
)
)
{
if ( pastFirstUse < 0 )
{
pastFirstUse = 61;
}
if ( ! blankline )
{
fo << '\n';
}
char *unr_str = "...This copy of ProBoard has been unregistered for %d days!\n\n";
if ( crc32( unr_str ) != 0xB3328DC5L )
{
exit_proboard();
}
fo << form( unr_str, pastFirstUse );
blankline = TRUE;
}
if ( echo_area )
{
if ( ! blankline )
{
fo << '\n';
}
fo << "--- ProBoard v" TEARVERSION;
//----------------------------
// JDR: REGISTRATION REFERENCE
//----------------------------
if ( registered )
{
fo << " [Reg]";
}
else
{
fo << " [EVALUATION]";
}
fo << "\n * Origin: ";
if ( msgArea->origin[ 0 ] )
{
fo << msgArea->origin;
}
else
{
fo << cfg.originline;
}
fo << form( " (%d:%d/%d",
a.zone,
a.net,
a.node );
if ( a.point )
{
fo << form( ".%d)\n", a.point );
}
else
{
fo << ")\n";
}
}
fo.close();
fi.close();
unlink( "MSGTMP" );
rename( "MSGTMP.$$$", "MSGTMP" );
}
long Message::add()
{
attr |= MSGATTR_LOCAL;
switch ( msgArea->msgKind )
{
case MSG_NET:
attr |= MSGATTR_NETMAIL;
break;
case MSG_PVTECHO:
case MSG_ECHO:
attr |= MSGATTR_ECHOMAIL;
break;
}
addOrigin();
if ( msgArea->tag[ 0 ] )
{
File f( FileName( syspath, "ECHOTOSS.LOG" ),
fmode_text |
fmode_copen |
fmode_rw |
fmode_append );
if ( f.opened() )
{
f << msgArea->tag
<< '\n';
}
}
long n = msgBase()->appendMsg( *this );
if ( n < 1 )
{
return -1;
}
switch ( msgArea->msgKind )
{
case MSG_NET:
net_entered++;
break;
case MSG_PVTECHO:
case MSG_ECHO:
echo_entered++;
break;
}
return n;
}
void Message::addReply( Message &org )
{
Message msg( org.areaNum() );
long n = org.id;
if ( ! msg.read( n ) )
{
return;
}
while ( msg.next )
{
if ( ! msg.read( msg.next ) )
{
break;
}
}
prev = msg.id;
msgBase()->updateMsg( *this );
msg.next = id;
msg.msgBase()->updateMsg( msg );
}
void Message::delReply()
{
Message msg( areaNum() );
if ( prev )
{
if ( msg.read( prev ) )
{
msg.next = next;
msg.msgBase()->updateMsg( msg );
}
}
if ( next )
{
if ( msg.read( next ) )
{
msg.prev = prev;
msg.msgBase()->updateMsg( msg );
}
}
if ( next ||
prev )
{
next = 0;
prev = 0;
msgBase()->updateMsg( *this );
}
}
int Message::pointNum( int mode )
{
if ( msgArea->msgBaseType != MSGBASE_HUDSON )
{
if ( mode )
{
return destPoint;
}
else
{
return origPoint;
}
}
String s;
int inkludge = 0;
bool msgdone = FALSE;
for ( long txt_off = 0; ! msgdone; txt_off += 255 )
{
char rec[ 256 ];
int l = readText( rec,
txt_off,
255 );
if ( l < 255 )
{
msgdone = TRUE;
}
for ( int j = 0; j < l; j++ )
{
switch ( rec[ j ] )
{
case '\n':
break;
case '\r':
if ( inkludge )
{
s.upperCase();
if ( mode )
{
if ( ! strncmp( s,
"TOPT",
4 ) )
{
return atoi(&s[5]);
}
}
else
{
if ( ! strncmp( s,
"FMPT",
4 ) )
{
return atoi( & s[ 5 ] );
}
}
}
inkludge = 0;
s = "";
break;
case 1:
s = "";
inkludge = 1;
break;
default:
if ( inkludge )
{
s << char( rec[ j ] );
}
break;
}
}
}
return 0;
}
void write_msgtmp( char *s )
{
File f( "MSGTMP", fmode_create );
f << s;
}