/* How to compile:
** sc MyCapi.c
** sc CallerID.c
** sc capi-usr.c
** slink from LIB:c.o MyCAPI.o CallerID.o to CallerID LIB capi-usr.o LIB:sc.lib
*/

#include <proto/dos.h>
#include <proto/exec.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <dos.h>
#include <dos/rdargs.h>
#include <exec/types.h>

#include "os.h"
#include "capi-usr.h"
#include "MyCAPI.h"

/*
** Globals
*/
U8		 outputbuff[256];
U8		*actioncmd = NULL;
U8		*phonebook = NULL;
U8		*version = "$VER: CallerID 2.1 (18.11.97) © Frederic Steinfels";
BOOL	 debugcapi = FALSE;
struct	 Task *maintask;
FILE	*phonebookfile;


/*
** Locals
*/
static U32  ctrlnum = 1;
static U8 *logname = NULL;
static FILE *logfile;


/*
** Code
*/

/****************************************************************************
**	Um die CTRL-C Behandlungsroutine vom SAS-C lahmzulegen.
*/
int brk(void)
{
	return 0;
}


/****************************************************************************
** Oeffnet das Logfile, wenn flag 1 ist, wird das alte geloescht.
*/
static BOOL openlog(BOOL flag)
{
	if (logname != NULL) {
		if (logfile = fopen(logname, flag ? "w" : "a"))
			return TRUE;
	}
	return FALSE;
}


/****************************************************************************
** Schliesst das Logfile
*/
static VOID closelog(VOID)
{
	if (logfile) {
		fclose(logfile);
		logfile = NULL;
	}
}



/****************************************************************************
** Ausgaberoutine (inkl. Datum/Uhrzeit)
** Achtung, diese Routine wird auch vom CAPI-SignalHandler Callback
** benuetzt !
*/
VOID myoutput(U8 *fmt, ...)
{
	struct DateStamp ds;
	struct DateTime dt;
	U8 day[32], date[32], time[32], buff[256];
	va_list arg;

	/*
	** Datum/Uhrzeit voranstellen
	*/
	DateStamp(&ds);
	dt.dat_Stamp = ds;
	dt.dat_Format = FORMAT_CDN;
	dt.dat_Flags = 0;
	dt.dat_StrDay = day;
	dt.dat_StrDate = date;
	dt.dat_StrTime = time;
	DateToStr(&dt);
	sprintf(buff, "%.3s %s %s ", day, date, time);
	if (openlog(0)) {
		fwrite(buff, strlen(buff), 1, logfile);
		closelog();
	}
	printf(buff);

	/*
	** Text ausgeben
	*/
	va_start(arg, fmt);
	vsprintf(buff, fmt, arg);
	va_end(arg);
	if (openlog(0)) {
		fwrite(buff, strlen(buff), 1, logfile);
		fwrite("\n", 1, 1, logfile);
		closelog();
	}
	puts(buff);
}


/****************************************************************************
** Das Programm ...
*/
void main(int argc, char **argv)
{
	#define TEMPLATE "CONTROLLER/N,DEBUG/S,LOGFILE/K,PHONEBOOK/K,ACTIONCOMMAND/K"
	#define OPT_CONTROLLER 0
	#define OPT_DEBUG 1
	#define OPT_LOGFILE 2
	#define OPT_PHONEBOOK 3
	#define OPT_ACTIONCOMMAND 4
	#define OPT_COUNT 5
	
	LONG result[OPT_COUNT];
	U32 *val;
	unsigned char *valc;
	
	struct RDArgs *rdargs;
	
	maintask = FindTask(NULL);

	/*
	** Erstmal testen, ob CAPI ueberhaupt installiert ist ...
	*/
	if (U_CAPI_INSTALLED()) {
		myoutput("FEHLER: CAPI 2.0 nicht installiert !");
		return;
	}

	/*
	** Kommandozeile auswerten
	*/

	result[OPT_CONTROLLER] = 0;
	result[OPT_DEBUG] = FALSE;
	result[OPT_LOGFILE] = NULL;
	result[OPT_PHONEBOOK] = NULL;
	result[OPT_ACTIONCOMMAND] = NULL;

	if (rdargs = ReadArgs(TEMPLATE, result, NULL))
	{
		debugcapi = FALSE;
		if (result[OPT_DEBUG])
		{
			debugcapi = TRUE;
		}
		ctrlnum = 1;
		if (val = (U32 *)result[OPT_CONTROLLER])
		{
			ctrlnum = *val;
		}
		logname = NULL;
		if (valc = (U8 *)result[OPT_LOGFILE])
		{
			logname = valc;
		}
		phonebook = NULL;
		if (valc = (U8 *)result[OPT_PHONEBOOK])
		{
			phonebook = valc;
		}
		actioncmd = NULL;
		if (valc = (U8 *)result[OPT_ACTIONCOMMAND])
		{
			actioncmd = valc;
		}

		/*
		** CTRL-C ausschalten
		*/
		if (onbreak(&brk)) {
			myoutput("FEHLER: Kann CTRL-C nicht ausschalten!");
			return;
		}
	
		/*
		** CAPI initialisieren
		*/
		if (MYCAPI_Init(ctrlnum)) {
			for (;;) {
				if (Wait(SIGBREAKF_CTRL_C | SIGF_SINGLE) & SIGBREAKF_CTRL_C)
					break;
				myoutput(outputbuff);
			}
		} else
			myoutput("FEHLER: CAPI-Initialisierung fehlgeschlagen!");
	
		/*
		** CAPI-Resourcen wieder freigeben (immer nach MYCAPI_Init()!)
		*/
		MYCAPI_Exit();
	
	}
	FreeArgs(rdargs);
}
