/**************************************************************************
 *
 *      Demonstrationsprogramm :
 *      HALLO
 *
 *      im Rahmen des C-Kurses auf der GetiT
 *
 * Beschreibung :
 * HALLO wird mit einem optionalen Argument aufgerufen. Es wird ein
 * Fenster geöffnet und dort das Argument ausgedruckt. ( Ist kein
 * Argument angegeben, so wird "Aufwachen !" ausgedruckt. )
 *  Das Fenster kann dann geschlossen ( durch Mausklick auf Close-
 * Gadget oder ins Fenster ) werden. Es verschwindet nach 100 Sekunden
 * von selbst.
 *
 * Geschrieben von Peter Fischer, RP.-Ebert-Str. 6, 3257 Springe 1
 *
 ***********************************************************************/

/* Include-Files einladen. */
#include <libraries/arpbase.h>
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <devices/timer.h>

/* Nur für Aztec-Compiler : 
 * Es wird ein eigener Prozeß gestartet, da mit detach.o gelinkt wird.
 */
ULONG _stack = 4000L;
long _priority = 1L;
long _BackGroundIO = 0L;
char *_procname = "GetiT-Wecker";

/* Variablendeklarationen und -definitionen für Fenster, Libraries etc. */
struct NewWindow 
  NewWindow =
  { 0,10,640,30,1,2,CLOSEWINDOW | MOUSEBUTTONS | RAWKEY,
    WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | NOCAREREFRESH | RMBTRAP,
    NULL,NULL,"Nachricht :",NULL,NULL,0,0,0,0,WBENCHSCREEN
  };
struct ArpBase *ArpBase;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

main ( argn,args )
int argn;
char *args[];
{ /* Zwischenspeicher für empfangenes Signal. */
  ULONG sig;
  /* Zeiger auf empfangene Message. */
  struct Message *msg;
  /* Geöffnetes Fenster. */
  struct Window *Window;
  /* Briefkasten für Antwort vom TIMER.DEVICE. */
  struct MessagePort *RplyPort;
  /* Struktur für Spezifikation des Befehls an den Timer. */
  struct timerequest *tr;
  /* Zwischenspeicher für den auszugebenden Text. */
  char text[128];

  /* Die ARP.LIBRARY öffnen und Zeiger auf Intuition- und Graphics-
   * Library herausziehen.
   */
  ArpBase = OpenLibrary ( "arp.library",ArpVersion );
  if ( ArpBase == NULL )
    exit();
  IntuitionBase = ArpBase->IntuiBase;
  GfxBase = ArpBase->GfxBase;

  /* Text übernehmen oder default einsetzen. */
  if ( argn == 2 )
    strcpy ( text,args[1] );
  else
    strcpy ( text,"Aufwachen !" );

  /* Briefkasten vom System anfordern. */
  RplyPort = CreatePort ( NULL,0 );
  if ( RplyPort == NULL )
  { CloseLibrary ( ArpBase );
    exit();
  }
  /* Request-Struktur anfordern. */
  tr = CreateExtIO ( RplyPort,sizeof( struct timerequest ) );
  if ( tr == NULL )
  { DeletePort ( RplyPort );
    CloseLibrary ( ArpBase );
    exit();
  }
  /* Gerät öffnen. */
  if ( OpenDevice( TIMERNAME,UNIT_VBLANK,tr,0 ) )
  { DeletePort ( RplyPort );
    DeleteExtIO ( tr );
    CloseLibrary ( ArpBase );
    exit();
  }
  /* WBenchScreen nach vorne holen, damit Fenster sichtbar. */
  WBenchToFront();
  /* Fenster öffnen. */
  Window = OpenWindow ( &NewWindow );
  if ( Window != NULL )
  { /* Text ausgeben. */
    Move ( Window->RPort,10,22 );
    Text ( Window->RPort,text,strlen(text) );
    /* Alle Screens aufblitzen lassen. */
    DisplayBeep(NULL);
    /* Den Auftrag an den Timer spezifizieren. */
    tr->tr_node.io_Command = TR_ADDREQUEST;
    tr->tr_node.io_Message.mn_ReplyPort = RplyPort;
    tr->tr_time.tv_secs = 100L;
    tr->tr_time.tv_micro = 0L;
    /* Abschicken. */
    SendIO ( tr );
    /* Auf ein Ereignis warten : Entweder vom Timer oder vom Fenster. */
    sig = Wait ( (1<<RplyPort->mp_SigBit) | (1<<Window->UserPort->mp_SigBit) );
    /* Das Signal kommt vom Fenster */
    if ( sig & (1<<Window->UserPort->mp_SigBit) )
    { while ( msg = GetMsg( Window->UserPort ) )
        ReplyMsg ( msg );
    }
    /* Das Signal kommt NICHT vom Timer */
    if ( ! ( sig & (1<<RplyPort->mp_SigBit) ) )
    { /* Abbruch verlangen. */
      AbortIO(tr);
      /* Und auf Meldung warten. */
      WaitPort ( RplyPort );
    }
    /* Fenster schließen. */
    CloseWindow ( Window );
  }
  /* Weitere Resourcen schließen. */
  CloseDevice ( tr );
  DeleteExtIO ( tr );
  CloseLibrary ( ArpBase );
}
