/*************************************************************************/
/* Autor      : RTA                                                      */
/* Computer   : Amiga                                                    */
/* Sprache    : Ansi C                                                   */
/* Compiler   : SAS C-Compiler Version 5.1a                              */
/* Dateiname  : system.c                                                 */
/* Projekt    : OnlineHelp                                               */
/* Erstellt am: 11 Nov 1991,16:20                                        */
/*************************************************************************/

#include "online.h"

/*************************************************************************/
/* Sendet QUITOH an OnlineHelp, falls es sich schon im Speicher befindet */
/*************************************************************************/
void quitoh()
{
	struct RexxMsg rexxmessage;
	struct MsgPort *rexxport,*lockport;
	char buf[]="OHQUIT";

	Forbid();
	if(!(rexxport=FindPort(HOST_PORT_NAME)))
		{
      Permit();
	   if (_Backstdout)
	   	{
			Write(_Backstdout,errortext.error,strlen(errortext.error));
			Write(_Backstdout,errortext.nooh,strlen(errortext.nooh));
			Close(_Backstdout);
         }
      exit(20);
		}
	Permit();


	if(!(lockport=CreatePort(NULL,0)))
		{
	   if (_Backstdout)
	   	{
			Write(_Backstdout,errortext.error,strlen(errortext.error));
			Write(_Backstdout,errortext.nomem,strlen(errortext.nomem));
			Close(_Backstdout);
         }
      exit(20);
		}

	rexxmessage.rm_Args[0]=buf;
	rexxmessage.rm_Node.mn_Node.ln_Type=NT_MESSAGE;
	rexxmessage.rm_Node.mn_ReplyPort=lockport;

	PutMsg(rexxport,(struct Message *)&rexxmessage);
	WaitPort(lockport);

	while(GetMsg(lockport));
	DeletePort(lockport);
	if(_Backstdout)Close(_Backstdout);
	exit(0);
}

/*************************************************************************/
/*     Überprüft anhand der Ports, ob OnlineHelp schon im System ist     */
/*************************************************************************/
void checkbeing()
{
	Forbid();
	if(FindPort(HOST_PORT_NAME) || FindPort(PORT_NAME))
		{
		Permit();
	   if (_Backstdout)
	   	{
			Write(_Backstdout,errortext.error,strlen(errortext.error));
			Write(_Backstdout,errortext.bethere,strlen(errortext.bethere));
			}
		closeall(NULL);
		}
	Permit();
}


/**********************************************************************/
/* Schließt alle geöffneten Windows,Screens,Librarys...               */
/**********************************************************************/
void closeall(char *text)
{
	/* Schließe Status falls offen */
	closestatus();

	/* Gebe Fehlertext aus ... */
	if(text)	
		if(_Backstdout)
			{
			Write(_Backstdout,errortext.error,strlen(errortext.error));
		 	Write(_Backstdout,text,strlen(text));
		 	Write(_Backstdout,"\n",strlen("\n"));
		 	}
		else if(ReqBase)	SimpleRequest("%s",text);

	/* Warte auf AREXX und schließe alle Ports */
  	wait_rexx();

   /* Schließe das Window */
  	closewin();

  	/* Gebe die Files vom FileRequester der Req.library frei */
	if(ReqBase)	PurgeFiles(&fr);

   /* Schließe IO falls offen */
  	if (_Backstdout) Close(_Backstdout);

  	/* Schließe die Req.library */
  	if(ReqBase) CloseLibrary((struct Library *)ReqBase);

	/* Und Raus hier */
   exit(0L);
}

/**********************************************************************/
/* Öffnet die Req-Library,den Screen und das Window. Außerdem wird    */
/* der Pointer des Windows in der Process-Struktur auf das geöffnete  */
/* verbogen, damit alle Requester etc. auf dem Window von OnlineHelp  */
/* erscheinen soll.                                                   */
/**********************************************************************/

void openall()
{
   FILE *out;

	if (!(ReqBase = (struct ReqLib *)OpenLibrary("req.library", 0L)))
      {
      out=fopen("CON:0/0/640/50/OnlineHelp","w");
      if(out)
      	{
			fputs(errortext.noreq,out);
			Delay(500);
	      fclose(out);
	      }
		closeall(NULL);
      }
   IntuitionBase = (struct IntuitionBase *)ReqBase->IntuiLib;
   GfxBase       = (struct GfxBase *)ReqBase->GfxLib;
   RexxSysBase   = (struct RexxSysBase *)ReqBase->RexxSysBase;
	rexx_port=setup_rexx_port();
   if(!rexx_port)closeall(NULL);

 }
/***************************************************************************/
/* Öffnet das ConsoleDevice                                                */
/***************************************************************************/
BOOL opencon()
{
   if(!(conwriteport=(struct Port *)CreatePort(PORT_NAME,0)))
      {

      SimpleRequest("%s",errortext.noport);
      return(FALSE);
      }
   if(!(conwritemsg=(struct IOStdReq *)CreateStdIO(conwriteport)))
      {
      SimpleRequest("%s",errortext.noio);
      return(FALSE);
      }

   conwritemsg->io_Data=(APTR)mywindow;
   conwritemsg->io_Length=(LONG)sizeof(struct Window);

   if(OpenDevice("console.device",0,conwritemsg,0))
      {
      SimpleRequest("%s",errortext.conerror);
      return(FALSE);
      }
   cursoroff();
   return(TRUE);
}

