
 /* SV_SuperVisor.c
    - supervising functions: entry, exit, freeing resources -
    (c) 1990-95 by Andreas R. Kleinert
    Last changes : 21.07.1995
 */

#include "svobject.h"

struct SVObjectHandle * __saveds __asm SVO_AllocHandle( register __a1 APTR future_a1);
void __saveds __asm SVO_FreeHandle( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
void __saveds __asm SVO_CloseDisplay( register __a1 struct SVObjectHandle *SVObjectHandle_a1);
void __saveds __asm SVO_FreeResources( register __a1 struct SVObjectHandle *SVObjectHandle_a1);

void __saveds __stdargs SVLI_SetSVDriver(struct SVObjectHandle *SVObjectHandle);

/* *************************************************** */
/* *						     * */
/* * SVO_AllocHandle : Free SVObjectHandle and more  * */
/* *						     * */
/* *************************************************** */

struct SVObjectHandle * __saveds __asm SVO_AllocHandle( register __a1 APTR future_a1)
{
 APTR future = future_a1;
 struct SVObjectHandle *handle;


 handle = (APTR) AllocVec(sizeof(struct SVObjectHandle), (MEMF_CLEAR|MEMF_PUBLIC));
 if(handle)
  {
   handle->ah_Type      = SV_SUBTYPE_NONE;
   handle->ah_WriteMode = SV_SUBTYPE_NONE;
   handle->ah_Medium    = AKO_MEDIUM_DISK; /* default */

   SVLI_SetSVDriver(handle);
  }

 return(handle);
}

void __saveds __stdargs SVLI_SetSVDriver(struct SVObjectHandle *SVObjectHandle)
{
 struct SVDriverBase  *SVDriverBase  = N;
 struct SuperViewBase *SuperViewBase = N;
 struct SVD_DriverNode *entry;
 char open_name [256];

 SVDriverBase = SVObjectHandle->ah_DriverBase;
 if(SVDriverBase)
  {
   if(SVObjectHandle->ah_SVDriverHandle) SVD_FreeHandle(SVObjectHandle->ah_SVDriverHandle);

   CloseLibrary((APTR) SVDriverBase);

   SVObjectHandle->ah_DriverBase     = N;
   SVObjectHandle->ah_SVDriverHandle = N;
  }

 SuperViewBase = (APTR) OpenLibrary("superview.library", 12);
 if(SuperViewBase)
  {
   if(!SVL_GetGlobalDriver(&entry, N))
    {
     strcpy(open_name, "LIBS:svdrivers/");
     strcat(open_name, entry->svd_FileName);

     if(SVDriverBase = (APTR) OpenLibrary(open_name, 1))
      {
       if(SVObjectHandle->ah_SVDriverHandle = SVD_AllocHandle(N))
        {
         SVObjectHandle->ah_DriverBase   = SVDriverBase;
         SVObjectHandle->ah_SVDriver     = entry;

         if(LibVer((APTR)SVDriverBase) > 2) if(SVObjectHandle->ah_ProgressFunc) SVD_SetProgressFunc(SVObjectHandle->ah_SVDriverHandle, SVObjectHandle->ah_ProgressFunc, SVObjectHandle->ah_ProgressData, SVObjectHandle->ah_ProgressFuture);

        }else CloseLibrary((APTR) SVDriverBase);
      }
    }

   CloseLibrary(SuperViewBase);
  }
}

/* *************************************************** */
/* *						     * */
/* * SVO_FreeHandle : Free SVObjectHandle and more   * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SVO_FreeHandle( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
 struct SVDriverBase *SVDriverBase = N;

 SVO_CloseDisplay(SVObjectHandle);
 SVO_FreeResources(SVObjectHandle);

 SVDriverBase = SVObjectHandle->ah_DriverBase;
 if(SVDriverBase)
  {
   if(SVObjectHandle->ah_SVDriverHandle) SVD_FreeHandle(SVObjectHandle->ah_SVDriverHandle);

   CloseLibrary((APTR) SVDriverBase);

   SVObjectHandle->ah_DriverBase     = N;
   SVObjectHandle->ah_SVDriverHandle = N;
  }

 FreeVec(SVObjectHandle);
}

/* *************************************************** */
/* *						     * */
/* * SVO_CloseDisplay : Close Display, ...           * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SVO_CloseDisplay( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
 struct SVDriverBase *SVDriverBase = N;
 APTR msg;

 if(!SVObjectHandle) return;

 if(SVObjectHandle->ah_Screen)
  {
   if(SVObjectHandle->ah_Window)
    {
     while( msg = GetMsg(SVObjectHandle->ah_Window->UserPort) ) ReplyMsg(msg);

     CloseWindow(SVObjectHandle->ah_Window);
    }

   CloseScreen(SVObjectHandle->ah_Screen);

   SVObjectHandle->ah_Window = N;
   SVObjectHandle->ah_Screen = N;
  }

 SVDriverBase = SVObjectHandle->ah_DriverBase;
 if(SVDriverBase) if(SVObjectHandle->ah_SVDriverHandle) SVD_CloseDisplay(SVObjectHandle->ah_SVDriverHandle);
}

/* *************************************************** */
/* *						     * */
/* * SVO_FreeResources : Free Memory and more        * */
/* *						     * */
/* *************************************************** */

void __saveds __asm SVO_FreeResources( register __a1 struct SVObjectHandle *SVObjectHandle_a1)
{
 struct SVObjectHandle *SVObjectHandle = SVObjectHandle_a1;
 struct SVDriverBase *SVDriverBase = N;

 if(!SVObjectHandle) return;

 if(SVObjectHandle->ah_filehandle_source) Close(SVObjectHandle->ah_filehandle_source);
 if(SVObjectHandle->ah_filehandle_dest)   Close(SVObjectHandle->ah_filehandle_dest);

 if(SVObjectHandle->ah_FILE_source) fclose(SVObjectHandle->ah_FILE_source);
 if(SVObjectHandle->ah_FILE_dest)   fclose(SVObjectHandle->ah_FILE_dest);

 if(SVObjectHandle->ah_ramhandle)         SVSUP_FreeMemList(SVObjectHandle->ah_ramhandle);

 SVDriverBase = SVObjectHandle->ah_DriverBase;
 if(SVDriverBase) if(SVObjectHandle->ah_SVDriverHandle) SVD_FreeResources(SVObjectHandle->ah_SVDriverHandle);

 if(SVObjectHandle->ah_SV_GfxBuffer)
  {
   if(SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer) FreeVec(SVObjectHandle->ah_SV_GfxBuffer->svgfx_Buffer);

   FreeVec(SVObjectHandle->ah_SV_GfxBuffer);
  }

 SVObjectHandle->ah_filehandle_source = N;
 SVObjectHandle->ah_filehandle_dest   = N;

 SVObjectHandle->ah_FILE_source       = N;
 SVObjectHandle->ah_FILE_dest         = N;

 SVObjectHandle->ah_ramhandle         = N;
 SVObjectHandle->ah_SV_GfxBuffer      = N;
}
