home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
util
/
blank
/
gblanker
/
source
/
blankers
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-18
|
5KB
|
270 lines
/*
* Copyright (c) 1994 Michael D. Bayne.
* All rights reserved.
*
* Please see the documentation accompanying the distribution for distribution
* and disclaimer information.
*/
#include <exec/memory.h>
#include <dos/dos.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/dos_protos.h>
#include <string.h>
#include "/defs.h"
#include "main.h"
LONG PortRemoved = FALSE, Blanking = FALSE, *ServerBlanking, GotPing;
ULONG Seconds, Micros, LastTime;
struct IntuitionBase *IntuitionBase = 0L;
struct GfxBase *GfxBase = 0L;
struct Library *GarshnelibBase = 0L;
struct MsgPort *ClientPort;
VOID *CurPrefs;
extern __far LONG RangeSeed;
#define PREFSIZE 512
BYTE PrefsPath[128];
STRPTR NameSansParens( STRPTR Name )
{
BYTE Buf[64], *Ptr;
LONG Len = strlen( Name );
strcpy( Buf, Name );
if( Buf[Len - 1] == ')' )
{
for( Ptr = Buf; *Ptr != '('; Ptr++ );
strcpy( Ptr, Ptr + 1 );
Buf[Len - 2] = '\0';
}
return Buf;
}
VOID SavePrefs( VOID *Prefs )
{
BPTR PrefFile;
if( PrefFile = Open( PrefsPath, MODE_NEWFILE ))
{
Write( PrefFile, Prefs, PREFSIZE );
Close( PrefFile );
}
}
VOID *LoadPrefs( BYTE *PrefsName )
{
BPTR PrefFile;
VOID *Prefs;
strcpy( PrefsPath, PrefsName );
strcat( PrefsPath, ".prefs" );
if( Prefs = AllocVec( PREFSIZE, MEMF_CLEAR ))
{
if( PrefFile = Open( PrefsPath, MODE_OLDFILE ))
{
if( Read( PrefFile, Prefs, PREFSIZE ) != PREFSIZE )
FillDefaults( Prefs );
Close( PrefFile );
}
else
FillDefaults( Prefs );
}
return Prefs;
}
LONG MessageServer( LONG Type )
{
struct MsgPort *ServerPort;
BlankMsg *ClientMsg;
if( ServerPort = FindPort( "GarshneServer" ))
{
if( ClientMsg = AllocVec( sizeof( BlankMsg ), MEMF_PUBLIC|MEMF_CLEAR ))
{
ClientMsg->bm_Mess.mn_ReplyPort = ClientPort;
ClientMsg->bm_Mess.mn_Length = sizeof( BlankMsg );
ClientMsg->bm_Type = Type;
PutMsg( ServerPort, ( struct Message * )ClientMsg );
return OK;
}
}
return QUIT;
}
LONG HandleSignal( LONG Signal )
{
BlankMsg *CurMsg;
if( Signal & SIG_WIN )
DoPrefs( IDCMP, CurPrefs );
if( Signal & SIG_PORT )
{
while( CurMsg = ( BlankMsg * )GetMsg( ClientPort ))
{
LONG Type = CurMsg->bm_Type;
LONG Flags = CurMsg->bm_Flags;
if( Type == BM_DELAYEDQUIT )
{
RemPort( ClientPort );
PortRemoved = TRUE;
Delay( 60 );
}
ServerBlanking = ( LONG * )CurMsg->bm_Mess.mn_Node.ln_Name;
if( Flags & BF_REPLY )
FreeVec( CurMsg );
else
{
CurMsg->bm_Flags |= BF_REPLY;
ReplyMsg(( struct Message * )CurMsg );
}
switch( Type )
{
case BM_DOBLANK:
if( !Blanking )
{
Blanking = TRUE;
LastTime = 0L;
switch( Blank( CurPrefs ))
{
case FAILED:
MessageServer( BM_FAILED );
case QUIT:
return QUIT;
default:
Blanking = FALSE;
}
}
return OK;
case BM_DOPREFS:
if( !SIG_WIN )
DoPrefs( STARTUP, CurPrefs );
break;
case BM_UNBLANK:
return UNBLANK;
case BM_DELAYEDQUIT:
case BM_DOQUIT:
return QUIT;
case BM_PING:
GotPing = TRUE;
default:
break;
}
}
}
if( Signal & SIGBREAKF_CTRL_C )
{
MessageServer( BM_FAILED );
return QUIT;
}
return OK;
}
LONG ContinueBlanking( VOID )
{
LONG Sigs = SetSignal( 0L, SIG_PORT | SIGBREAKF_CTRL_C ), RetVal = OK;
if( Sigs )
RetVal = HandleSignal( Sigs );
if( RetVal == OK && !*ServerBlanking )
RetVal = UNBLANK;
return RetVal;
}
int main( int argc, char *argv[] )
{
BlankMsg *FreeMsg;
static BYTE PortName[] = "GarshneClient";
ULONG Seconds, Micros;
LONG RetVal = 0;
if( FindPort( PortName ))
return 1;
IntuitionBase =
( struct IntuitionBase * )OpenLibrary( "intuition.library", 37L );
GfxBase = ( struct GfxBase * )OpenLibrary( GRAPHICSNAME, 37L );
GarshnelibBase = OpenLibrary( "Garshnelib.library", 37L );
if( IntuitionBase && GfxBase && GarshnelibBase )
{
ClientPort = CreateMsgPort();
if( ClientPort )
{
ClientPort->mp_Node.ln_Name = PortName;
ClientPort->mp_Node.ln_Pri = 0L;
AddPort( ClientPort );
CurPrefs = LoadPrefs( NameSansParens( argv[0] ));
CurrentTime( &Seconds, &Micros );
RangeSeed = Seconds + Micros;
if( MessageServer( BM_INITMSG ) == OK )
while( HandleSignal( Wait( SIG_PORT | SIG_WIN |
SIGBREAKF_CTRL_C )) == OK );
if( SIG_WIN )
DoPrefs( KILL, CurPrefs );
while( FreeMsg = ( BlankMsg * )GetMsg( ClientPort ))
{
if( FreeMsg->bm_Type & BF_REPLY )
FreeVec( FreeMsg );
else
{
FreeMsg->bm_Type |= BF_REPLY;
ReplyMsg(( struct Message * )FreeMsg );
}
}
if( CurPrefs )
FreeVec( CurPrefs );
if( !PortRemoved )
RemPort( ClientPort );
DeleteMsgPort( ClientPort );
}
else
RetVal = 2;
}
else
RetVal = 1;
if( GarshnelibBase )
CloseLibrary( GarshnelibBase );
if( GfxBase )
CloseLibrary(( struct Library * )GfxBase );
if( IntuitionBase )
CloseLibrary(( struct Library * )IntuitionBase );
return RetVal;
}