#include	"libdata.h"

#define	DEBUG_DISPATCH(x)	;

ULONG	CLASS_Dispatch(void);

struct EmulLibEntry	GATE_Dispatch=
{
	TRAP_LIB, 0, (void (*)(void)) CLASS_Dispatch
};

ULONG	CLASS_Dispatch(void)
{
Class		*MyClass=(Class*) REG_A0;
Msg		MyMsg=(Msg) REG_A1;
Object		*MyObject=(Object*) REG_A2;
ULONG		Result;

  DEBUG_DISPATCH(dprintf("CLASS_Dispatch: Class 0x%lx Object 0x%lx Msg 0x%lx\n",
                         MyClass,
                         MyObject,
                         MyMsg));

  if (MyMsg->MethodID==OM_NEW)
  {
    DEBUG_DISPATCH(dprintf("OM_NEW:\n"));
    if (Result=DoSuperMethodA(MyClass,
                              MyObject,
                              MyMsg))
    {
      DEBUG_DISPATCH(dprintf("OM_NEW: Object 0x%lx\n",
                             Result));
      if (!ReadPBM(MyClass,
                   (Object *)Result,
                   ((struct opSet *)MyMsg)->ops_AttrList))
      {
        DEBUG_DISPATCH(dprintf("OM_NEW: ReadPBM failed\n"));
        CoerceMethod(MyClass,
                     (Object *)Result,
                     OM_DISPOSE);
        Result	=	0L;
      }
    }
  }
  else
  {
    DEBUG_DISPATCH(dprintf("Method 0x%lx\n",
                           MyMsg->MethodID));

    Result	=	DoSuperMethodA(MyClass,
                                       MyObject,
                                       MyMsg);
  }
  return(Result);
}

Class	*InitClass(struct LibBase	*MyLibBase)
{
Class	*MyClass;

  if (MyClass=MakeClass(CLASSNAME,
                        PICTUREDTCLASS,
                        NULL,
                        0L,
                        0L))
  {
    MyClass->cl_Dispatcher.h_Entry	=(ULONG (*)(void)) &GATE_Dispatch;
    MyClass->cl_UserData		=(ULONG) MyLibBase;
    AddClass(MyClass);
  }
  return(MyClass);
}

ULONG	LIB_DeleteClass(struct LibBase		*MyLibBase,
                        Class			*MyClass)
{
  if (!FreeClass(MyClass))
  {
    AddClass(MyClass);
    return(FALSE);
  }

  CloseLibrary(SuperClassBase);
  CloseLibrary(IFFParseBase);
  CloseLibrary(UtilityBase);
  CloseLibrary(DataTypesBase);
  CloseLibrary(&DOSBase->dl_lib);
  CloseLibrary(&IntuitionBase->LibNode);
  CloseLibrary(&GfxBase->LibNode);
  return(TRUE);
}



#undef GfxBase
#undef IntuitionBase
#undef DOSBase
#undef DataTypesBase
#undef UtilityBase
#undef IFFParseBase
#undef SuperClassBase


Class	*LIB_CreateClass(struct LibBase		*MyLibBase)
{
Class	*MyClass;

  if (MyLibBase->GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",39L))
  {
    if (MyLibBase->IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",39L))
    {
      if (MyLibBase->DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",39L))
      {
        if (MyLibBase->DataTypesBase=OpenLibrary("datatypes.library",39L))
        {
          if (MyLibBase->UtilityBase=OpenLibrary("utility.library",39L))
          {
            if (MyLibBase->IFFParseBase=OpenLibrary("iffparse.library",39L))
            {
              if (MyLibBase->SuperClassBase=OpenLibrary("datatypes/picture.datatype",43L))
              {
                if (MyClass=InitClass(MyLibBase))
                {
                  MyClass->cl_UserData	=(ULONG) MyLibBase;
                  return(MyClass);
                }
                CloseLibrary(MyLibBase->SuperClassBase);
              }
              CloseLibrary(MyLibBase->IFFParseBase);
            }
            CloseLibrary(MyLibBase->UtilityBase);
          }
          CloseLibrary(MyLibBase->DataTypesBase);
        }
        CloseLibrary(&MyLibBase->DOSBase->dl_lib);
      }
      CloseLibrary(&MyLibBase->IntuitionBase->LibNode);
    }
    CloseLibrary(&MyLibBase->GfxBase->LibNode);
  }
  return NULL;
}

