
 /* SV_SuperVisor.c
    - SuperVising (global exit) Functions for SVO-Support -
    (c) 1990-93 by Andreas R. Kleinert
    Last changes : 19.12.1993
 */

#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);

/* *************************************************** */
/* *						     * */
/* * 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 */
  }

 return(handle);
}

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

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

 SVO_CloseDisplay(SVObjectHandle);
 SVO_FreeResources(SVObjectHandle);

 FreeVec(SVObjectHandle);
}

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

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

 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;
  }
}

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

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

 if(SVObjectHandle)
  {
   if(SVObjectHandle->ah_filehandle_source)  Close(SVObjectHandle->ah_filehandle_source);
   if(SVObjectHandle->ah_filehandle_source2) Close(SVObjectHandle->ah_filehandle_source2);
   if(SVObjectHandle->ah_filehandle_dest)    Close(SVObjectHandle->ah_filehandle_dest);
   if(SVObjectHandle->ah_filehandle_dest2)   Close(SVObjectHandle->ah_filehandle_dest2);
   if(SVObjectHandle->ah_ramhandle)          AIM_FreeMemList(SVObjectHandle->ah_ramhandle);

   if(SVObjectHandle->ah_SVOHeader)
    {
     FreeVec(SVObjectHandle->ah_SVOHeader);

     if(SVObjectHandle->ah_XpkBuffer) FreeMem(SVObjectHandle->ah_XpkBuffer, SVObjectHandle->ah_XpkBufferSize);

     SVObjectHandle->ah_SVOHeader = N;
     SVObjectHandle->ah_XpkBuffer = N;
    }
  }
}
