home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 9
/
FreshFishVol9-CD2.bin
/
bbs
/
util
/
gblanker-38.8.lha
/
GBlanker
/
GSource
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-12-02
|
5KB
|
202 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 <devices/timer.h>
#include <string.h>
#include "includes.h"
#include "libraries.h"
#include "protos/protos.h"
__far extern LONG RangeSeed;
STATIC const UBYTE VersTag[] = VERSTAG;
LONG Blanking = FALSE, BlankAfterInit = FALSE;
struct MsgPort *ServerPort, *TimerPort;
struct timerequest *TimeOutIO;
struct List *BlankerEntries;
struct Task *ServerTask, *PingTask = 0L;
BlankerPrefs *Prefs;
BYTE ProgName[108];
LONG RetVal;
int main( void )
{
LONG Sigs;
RangeSeed = ( LONG )( ServerTask = FindTask( 0L ));
if( RetVal = AllocResources())
{
FreeResources( RetVal );
return RETURN_FAIL;
}
Prefs = LoadDefaultPrefs();
BlankerEntries = LoadBlankerEntries( Prefs->bp_Dir );
if(!( Prefs->bp_Flags & BF_REPLACE )||
Stricmp( Prefs->bp_Blanker, "Random" ))
LoadModule( Prefs->bp_Dir, Prefs->bp_Blanker );
if( SetupCX() == QUIT )
{
FreeResources( 0 );
return RETURN_WARN;
}
if( Prefs->bp_PopUp )
RetVal = OpenInterface();
do
{
Sigs = Wait( SIG_CX | ISigs() | SIG_SERVPORT | SIGBREAKF_CTRL_C |
SIGBREAKF_CTRL_D );
if( Sigs & SIG_SERVPORT )
RetVal = HandleServerMsg();
if( Sigs & SIG_CX )
RetVal = HandleCxMess();
if( Sigs & SIGBREAKF_CTRL_C )
RetVal = 0L;
if( Sigs & SIGBREAKF_CTRL_D )
RetVal = HandleMouseCheck();
if( Sigs & ISigs())
RetVal = HandleInterface();
switch( RetVal )
{
case CLOSEWIN:
CloseInterface();
break;
case RESTART:
CloseInterface();
ShutdownCX();
FreeBlankerEntries( BlankerEntries );
Prefs = LoadDefaultPrefs();
BlankerEntries = LoadBlankerEntries( Prefs->bp_Dir );
if(( RetVal = SetupCX()) == OK )
RetVal = OpenInterface();
break;
}
}
while( RetVal );
FreeResources( 0 );
return RETURN_OK;
}
VOID SafeKill( STRPTR PortName )
{
ULONG Sigs;
if( !FindPort( PortName ))
return;
MessageModule( PortName, BM_DOQUIT );
if( !CheckIO(( struct IORequest * )TimeOutIO ))
{
AbortIO(( struct IORequest * )TimeOutIO );
WaitIO(( struct IORequest * )TimeOutIO );
SetSignal( 0L, SIG_TIMER );
}
TimeOutIO->tr_node.io_Command = TR_ADDREQUEST;
TimeOutIO->tr_time.tv_secs = 2;
TimeOutIO->tr_time.tv_micro = 0;
SendIO(( struct IORequest * )TimeOutIO );
Sigs = Wait( SIG_SERVPORT | SIG_TIMER );
if( Sigs & SIG_SERVPORT )
{
AbortIO(( struct IORequest * )TimeOutIO );
HandleServerMsg();
}
WaitIO(( struct IORequest * )TimeOutIO );
SetSignal( 0L, SIG_TIMER );
}
VOID FreeResources( LONG Level )
{
switch( Level )
{
case 0:
if( PingTask )
{
Signal( PingTask, SIGBREAKF_CTRL_C );
SetTaskPri( PingTask, 1 );
PingTask = 0L;
}
SafeKill( "GarshneClient" );
SafeKill( "GarshnePrefs" );
case 1:
CloseInterface();
case 2:
FreeBlankerEntries( BlankerEntries );
case 3:
if( TimeOutIO )
{
if( TimeOutIO->tr_node.io_Device )
CloseDevice(( struct IORequest * )TimeOutIO );
DeleteExtIO(( struct IORequest * )TimeOutIO );
}
case 4:
if( TimerPort )
DeletePort( TimerPort );
if( ServerPort )
DeletePort( ServerPort );
case 5:
ShutdownCX();
case 6:
CloseLibraries();
}
}
LONG AllocResources( VOID )
{
struct Process *Proc;
Proc = ( struct Process * )ServerTask;
if( !Proc->pr_CLI )
strcpy( ProgName, WBenchMsg->sm_ArgList->wa_Name );
else
strcpy( ProgName, "PROGDIR:Garshneblanker" );
if( OpenLibraries() == 1L )
return 6L;
if( CheckCX() == QUIT )
return 6L;
ServerPort = CreatePort( "GarshneServer", 0 );
TimerPort = CreatePort( 0L, 0 );
if( !ServerPort || !TimerPort )
return 5L;
TimeOutIO = ( struct timerequest * )
CreateExtIO( TimerPort, sizeof( struct timerequest ));
if( !TimeOutIO )
return 4L;
if( OpenDevice( "timer.device", UNIT_VBLANK,
( struct IORequest * )TimeOutIO, 0L ))
return 3L;
return 0L;
}