/*
**
** Beispiel zur AmigaGuide-Library
**
**
** von Stephan Fuhrmann
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/amigaguide.h>
#include <proto/intuition.h>

#include <exec/execbase.h>
#include <libraries/amigaguide.h>
#include <utility/hooks.h>

extern struct ExecBase *SysBase;
struct Library *AmigaGuideBase;

char prozessor[80];
char matheprozessor[80];
char betriebssystem[80];


STRPTR Cont[]=
{
	"MAIN",
	"ABOUT"
};

/* diese Funktion ruft später "hostEntry" auf */
ULONG __asm hookEntry(
	register __a0 struct Hook *h,
	register __a2 VOID *obj,
	register __a1 VOID *msg)
{
	/* Pass the parameters on the stack */
	return ((h->h_SubEntry)(h, obj, msg));
}

/* diese Funktion behandelt die AmigaGuideHost-Nachrichten */
ULONG __saveds __stdargs hostEntry(struct Hook *h,STRPTR db,Msg msg)
{
	ULONG ergebnis=0;
	
	switch (msg->MethodID)
	{
		case HM_FINDNODE:
		{
			struct opFindHost *opfh=(struct opFindHost *)msg;

			printf ("FindNode [%s]\n",opfh->ofh_Node);

			if (!stricmp(opfh->ofh_Node,"MAIN"))
				ergebnis=1;

			if (!stricmp(opfh->ofh_Node,"CPU"))
			{
				opfh->ofh_Title="Prozessor";
				ergebnis=1;
			}

			if (!stricmp(opfh->ofh_Node,"FPU"))
			{
				opfh->ofh_Title="Mathe-Prozessor";
				ergebnis=1;
			}

			if (!stricmp(opfh->ofh_Node,"OS"))
			{
				opfh->ofh_Title="Betriebssystem-Version";
				ergebnis=1;
			}

			break;
		}
		case HM_OPENNODE:
		{
			struct opNodeIO *opni=(struct opNodeIO *)msg;

			printf ("OpenNode [%s]\n",opni->onm_Node);

			if (!stricmp(opni->onm_Node,"CPU"))
			{
				ULONG len;
				ULONG proz=68000;

				if (SysBase->AttnFlags & AFF_68040)
					proz+=40;
				else
				{
					if (SysBase->AttnFlags & AFF_68030)
						proz+=30;
					else
					{
						if (SysBase->AttnFlags & AFF_68020)
							proz+=20;
						else
						{
							if (SysBase->AttnFlags & AFF_68010)
								proz+=10;
						}
					}
				}

				opni->onm_DocBuffer=prozessor;

				len=sprintf (prozessor,"Sie besitzen einen Motorola %ld Prozessor!\n",proz);

				opni->onm_BuffLen=len;
				opni->onm_Flags=HTNF_KEEP|HTNF_ASCII;

				ergebnis=1;
			}

			if (!stricmp(opni->onm_Node,"FPU"))
			{
				ULONG len;
				ULONG proz=0;

				if (!(SysBase->AttnFlags & AFF_68881))
					proz=0;
				else
				{
					if (SysBase->AttnFlags & AFF_FPU40)
						proz=68040;
					else
					{
						if (SysBase->AttnFlags & AFF_68882)
							proz=68882;
						else
						{
							if (SysBase->AttnFlags & AFF_68881)
								proz=68881;
						}
					}
				}

				opni->onm_DocBuffer=matheprozessor;

				if (proz)
					len=sprintf (matheprozessor,"Sie besitzen einen Motorola %ld Coprozessor!\n",proz);
				else
					len=sprintf (matheprozessor,"Sie besitzen keinen Motorola Coprozessor!\n");

				opni->onm_BuffLen=len;
				opni->onm_Flags=HTNF_KEEP|HTNF_ASCII;

				ergebnis=1;
			}

			if (!stricmp(opni->onm_Node,"OS"))
			{
				ULONG len;

				opni->onm_DocBuffer=betriebssystem;

				len=sprintf (betriebssystem,"Ihr Amiga verfügt über das Betriebssystem v%ld.%ld!\n",SysBase->LibNode.lib_Version,SysBase->SoftVer);

				opni->onm_BuffLen=len;
				opni->onm_Flags=HTNF_KEEP|HTNF_ASCII;

				ergebnis=1;
			}

			break;
		}

		case HM_CLOSENODE:
		{
			struct opNodeIO *opni=(struct opNodeIO *)msg;

			printf ("CloseNode [%s]\n",opni->onm_Node);


			break;
		}
		case HM_EXPUNGE:
		{
			printf ("Expunge\n");
			break;
		}		
	}

	return (ergebnis);
}

void main(void)
{
	struct Hook hook;
	struct NewAmigaGuide NAG;

	AMIGAGUIDECONTEXT MyContext;
	AMIGAGUIDEHOST MyHost;

	if (AmigaGuideBase=OpenLibrary ("amigaguide.library",33))
	{

		ULONG sigs,agsig,bekommen;
		struct AmigaGuideMsg *agm;
		int schluss=0;

		/* Dokument ist im aktuellen Verzeichnis */
		NAG.nag_Lock=CurrentDir(CurrentDir(0));
		NAG.nag_Name="SystemDaten.guide";
		NAG.nag_Screen=0;
		NAG.nag_PubScreen=0;
		NAG.nag_HostPort=0;
		NAG.nag_ClientPort="SystemDaten-HELP";
		NAG.nag_BaseName="SystemDaten";
		/* beim Start alles Laden */
		NAG.nag_Flags=HTF_LOAD_ALL;
		NAG.nag_Context=0;
		NAG.nag_Node=0;
		NAG.nag_Line=0;
		NAG.nag_Extens=0;
		NAG.nag_Client=0;

		hook.h_Entry=(ULONG (* )())hookEntry;
		hook.h_SubEntry=(ULONG (* )())hostEntry;

		/* Host einrichten */
		if (MyHost=AddAmigaGuideHost (&hook,"ExampleHost", NULL))
		{
			/* Asynchronen Prozeß starten */
			if (MyContext=OpenAmigaGuideAsyncA(&NAG,0))
			{
				/* Signal d. Dokumentes herausfinden */
				agsig=AmigaGuideSignal (MyContext);

				sigs=agsig | SIGBREAKF_CTRL_C;
				printf ("Bitte aktivieren Sie dieses Fenster, drücken Sie CTRL-C und klicken\n");
				printf ("Sie auf das Schließ-Symbol, um das Programm zu beenden.\n");

				/* warten, bis Prozeß 'oben' ist */
				Delay (2);

				/* Inhaltsverzeichnis auf den Schirm bringen */
				SendAmigaGuideCmdA (MyContext,"ALINK MAIN",0);

				do
				{
					/* auf alle Signale warten */
					bekommen=Wait (sigs);

					if (bekommen & agsig)
					{
						while (agm=GetAmigaGuideMsg(MyContext))
						{
							printf ("Message bekommen: ");
							switch (agm->agm_Type)
							{
								case StartupMsgID:
									printf ("StartupMsgID\n");
									break;
								case LoginToolID:
									printf ("LoginToolID\n");
									break;
								case LogoutToolID:
									printf ("LogoutToolID\n");
									break;
								case ShutdownMsgID:
									printf ("ShutdownMsgID\n");
									break;
								case ActivateToolID:
									printf ("ActivateToolID\n");
									break;
								case DeactivateToolID:
									printf ("DeactivateToolID\n");
									break;
								case ActiveToolID:
									printf ("ActiveToolID\n");
									break;
								case InactiveToolID:
									printf ("InactiveToolID\n");
									break;
								case ToolStatusID:
									printf ("ToolStatusID\n");
									break;
								case ToolCmdID:
									printf ("ToolCmdID\n");
									break;
								case ToolCmdReplyID:
									printf ("ToolCmdReplyID\n");
									break;
								case ShutdownToolID:
									printf ("ShutdownToolID\n");
									break;
								default:
									printf ("Unbekannt!\n");
							}

							if (agm->agm_Pri_Ret)
								printf ("Fehler: %s!",GetAmigaGuideString (agm->agm_Sec_Ret));

							ReplyAmigaGuideMsg (agm);
						}
					}
				} while (!(bekommen & SIGBREAKF_CTRL_C) && !schluss);

				CloseAmigaGuide (MyContext);
			}
			else
				printf ("Konnte AmigaGuide-Dokument nicht öffnen!\n");

			/* Schleife, bis Host entfernt */
			while (RemoveAmigaGuideHost (MyHost,0)>0)
			{
				/* Verzögerung, damit das Multitasking nicht belastet wird */
				Delay (1);
			}
		}
		else
			printf ("Konnte Host nicht einrichten (läuft noch einer?)!\n");

		CloseLibrary (AmigaGuideBase);
	}
	else
		puts ("Konnte AmigaGuide-Library nicht öffnen!");
}
