#include "Header.h"
#include "GlobHdr.h"
#include <stdlib.h>
#include <string.h>
#include "swis.h"

#include "FStream.h"
#include "mem.h"

#define Service_TaskManagerAcknowledgements 0x42680

GlobHdr* Glb = NULL;

extern _kernel_oserror* check_hardware(void);

_kernel_oserror* Module_Initialize(const char* cmd_tail, int podule_base, void* pw)
{
	_kernel_oserror* e = check_hardware();

	IGNORE(cmd_tail);
	IGNORE(podule_base);

	if (e) return e;

	Glb = malloc(sizeof(*Glb));

	memset(Glb, 0, sizeof(*Glb));
	Glb->pw = pw;
	Glb->pmodname = Module_Title;
	Glb->cfg.inputbufsize = 128;
	Glb->cfg.outputbufsize = 1024;

#ifdef MAKEABS
	if ((e = mem_init(EMem_CPP)) != NULL)
		return e;
#else
	if ((e = mem_init(0)) != NULL)
		return e;
#endif

	_swix(OS_ServiceCall, _INR(1,2), Service_TaskManagerAcknowledgements, 0);

	return Streams_Init(Glb, pw);
}

_kernel_oserror* Module_Finalize(int fatal, int podule, void* pw)
{
	_kernel_oserror* e;

	IGNORE(fatal);
	IGNORE(podule);

    e = Streams_Finalize(Glb, pw);
	if (e) return e;

	_swix(OS_ServiceCall, _INR(1,2), Service_TaskManagerAcknowledgements, 0);

	mem_finalise();

	free(Glb);
	Glb = NULL;

	return NULL;
}

typedef void (*addmessages_func)( unsigned int group, char const *title
                                , char const *message);

void Module_Service(int service_number, _kernel_swi_regs* r, void* pw)
{
	IGNORE(pw);

	if (service_number == Service_TaskManagerAcknowledgements)
	{
		addmessages_func func = (addmessages_func) r->r[2];

		if (func != NULL)
			func(0x4000, Module_Title, "Work based on liba52 (http://liba52.sourceforge.net/)");
	}
}

_kernel_oserror* Module_Swis(int swi_offset, _kernel_swi_regs* r, void* pw)
{
	IGNORE(pw);

	switch(swi_offset)
	{
		case 0x00: return swi_Configure(Glb, r);
		case 0x01: return swi_StreamOpen(Glb, r);
		case 0x02: return swi_StreamClose(Glb, r);
		case 0x03: return swi_StreamInfo(Glb, r);
		case 0x04: return swi_StreamClear(Glb, r);
		case 0x05: return swi_StreamProcess(Glb, r);
	}

	return error_BAD_SWI;
}
