#include <pragma/exec_lib.h>
#include <pragma/intuition_lib.h>
#include <dos/dos.h>
#include "class.h"

struct ClassBase:Library
{
BPTR sb_SegList;
IClass *cb_Class;
SignalSemaphore cb_Lock;
};

#pragma libbase ClassBase

extern "C"
{
IClass *ObtainClass(register __a6 ClassBase *cb);
long LibExpunge(register __a6 ClassBase *cb);
}

extern APTR Dispatcher;

char LibNameString[]="rgfx.datatype";

Library *DataTypesBase;
Library *IFFParseBase;
Library *SuperClassBase;
Library *RenderBase;
Library *XpkBase;
Library *CyberGfxBase;

extern "C" void INIT_7_LibInit(register __a6 ClassBase *cb)
{
InitSemaphore(&cb->cb_Lock);
}

static IClass *InitClass(register __a6 ClassBase *cb)
{
IClass *cl;
if(cl=MakeClass(LibNameString,"picture.datatype",0,sizeof(Data),0))
	{
	cl->h_Entry=&Dispatcher;
	cl->cl_UserData=ULONG(cb);
	AddClass(cl);
	}
return cl;
}

extern "C" long LibOpen(register __a6 ClassBase *cb)
{
long retval=long(cb);
BOOL ok=1;
ObtainSemaphore(&cb->cb_Lock);
cb->lib_OpenCnt++;
cb->lib_Flags&=~LIBF_DELEXP;
if(cb->lib_OpenCnt==1)
	{
	if(!(cb->cb_Class))
		{
		ok=0;
		if(DataTypesBase=OpenLibrary("datatypes.library",39))
			{
			if(IFFParseBase=OpenLibrary("iffparse.library",39))
				{
				if(RenderBase=OpenLibrary("render.library",30))
					{
					if(XpkBase=OpenLibrary("xpkmaster.library",5))
						{
						if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",39))
							{
							CyberGfxBase=OpenLibrary("cybergraphics.library",40);
							if(cb->cb_Class=InitClass(cb)) ok=1;
							}
						}
					}
				}
			}
		}
	}
if(!ok)
	{
	CloseLibrary(DataTypesBase);
	CloseLibrary(IFFParseBase);
	CloseLibrary(RenderBase);
	CloseLibrary(XpkBase);
	CloseLibrary(SuperClassBase);
	CloseLibrary(CyberGfxBase);
	DataTypesBase=0;
	IFFParseBase=0;
	RenderBase=0;
	XpkBase=0;
	SuperClassBase=0;
	CyberGfxBase=0;
	cb->lib_OpenCnt--;
	retval=0;
	}
ReleaseSemaphore(&cb->cb_Lock);
return retval;
}

extern "C" long LibClose(register __a6 ClassBase *cb)
{
long retval=0;
ObtainSemaphore(&cb->cb_Lock);
if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
if((cb->lib_OpenCnt==0)&&cb->cb_Class)
	{
	if(FreeClass(cb->cb_Class))
		{
		cb->cb_Class=0;
		CloseLibrary(DataTypesBase);
		CloseLibrary(IFFParseBase);
		CloseLibrary(RenderBase);
		CloseLibrary(XpkBase);
		CloseLibrary(SuperClassBase);
		CloseLibrary(CyberGfxBase);
		}
	else cb->lib_Flags|=LIBF_DELEXP;
	}
ReleaseSemaphore(&cb->cb_Lock);
if(cb->lib_Flags&LIBF_DELEXP) retval=LibExpunge(cb);
return retval;
}

extern "C" IClass *ObtainClass(register __a6 ClassBase *cb)
{
return cb->cb_Class;
}
