/*
 * MODULE: JMHSUBS.C
 *
 *    Collection of standard routines.
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

#include "common.h"


extern struct Library       *DosBase;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase       *GfxBase;
extern struct Library       *GadToolsBase;
extern struct Library       *AslBase;
extern struct Library       *UtilityBase;
extern struct Library       *MUIMasterBase;

extern struct MyGlobals MG;


//
// Startup
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define NUM_ARGS        1
#define ARG_FILE        0


/*
 *             -------======= ROUTINES =======-------
 *
 * JMH_About():    show program info, basename, author, free mem, etc...
 * JMH_Error():    error routine that also provides help
 * JMH_InitVars(): initialize variables to default values
 * JMH_Quit():     close down everything we've opened and JMH_Quit
 * JMH_Startup():  handle arguments, setup environment, init vars/GUI...
 *
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//
// JMH_About(): show program info, basename, author, free memory, etc...
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_About( void )
{
   char  *pszVersion, *pszAuth, *pszCopyright, *pszBase, *pszDescrip;
   char   szAbout[1024];
   ULONG  ulChipFree, ulFastFree;


   get( MG.App, MUIA_Application_Version,     &pszVersion );
   get( MG.App, MUIA_Application_Author,      &pszAuth );
   get( MG.App, MUIA_Application_Copyright,   &pszCopyright );
   get( MG.App, MUIA_Application_Base,        &pszBase );
   get( MG.App, MUIA_Application_Description, &pszDescrip );

   ulChipFree = AvailMem( MEMF_CHIP );
   ulFastFree = AvailMem( MEMF_FAST );

   sprintf( szAbout, "\33c\33b%s\n\33c%s\n\33c%s\n\n\33c%s %s\n\n%s\n\n\
Graphics memory: %lu\nOther memory: %lu\n\nUsing Magic User Interface (MUI) by Stefan Stuntz",
                     pszVersion+6,
                     pszAuth,
                     pszCopyright,
                     "BASENAME:",
                     pszBase,
                     pszDescrip,
                     ulChipFree,
                     ulFastFree
          );

   MUI_Request( MG.App, NULL, 0, NULL, "*OK", szAbout, NULL );
}

//
// JMH_Error(): error routine that also provides help
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LONG JMH_Error( char *pszMsg, APTR pWindowObj,
                char *pszHelpFile, char *pszHelpNode, LONG lHelpLine )
{
   LONG  l;
   char *pszResponses;
   char *pszHelp   = "*OK|Help";
   char *pszNoHelp = "*OK";


   if ( pszHelpFile )   pszResponses = pszHelp;
   else                 pszResponses = pszNoHelp;

redisplay:
   l = MUI_Request( MG.App, pWindowObj, 0, NULL, pszResponses, pszMsg, NULL );
   if ( ( l == 0 ) && ( pszHelpFile ) )
   {
      DoMethod( MG.App, MUIM_Application_ShowHelp, pWindowObj,
                pszHelpFile, pszHelpNode, lHelpLine );
      goto redisplay;
   }
   return( l );
}

//
// JMH_InitVars(): initialize variables to default values
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VOID JMH_InitVars()
{
   //
   // init window objects to NULL
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   MG.WIN_Main      = NULL;
   MG.WIN_Settings  = NULL;
   strcpy( MG.szProjectSpec  , "" );
   strcpy( MG.szSettingsSpec , "" );


   //
   // open libraries
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DosBase = OpenLibrary( "dos.library", 37L );
   if ( !DosBase ) JMH_Quit("Cannot open dos.library 37+");

   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37L);
   if (!IntuitionBase) JMH_Quit("Cannot open intuition.library 37+");

   GadToolsBase = (struct Library *)OpenLibrary("gadtools.library", 37L);
   if (!GadToolsBase) JMH_Quit("Cannot open gadtools.library 37+");

   GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37L);
   if (!GfxBase) JMH_Quit("Cannot open graphics.library 37+");

   AslBase = OpenLibrary("asl.library",37L);
   if (!AslBase) JMH_Quit("Cannot open asl.library 37+");

   UtilityBase = (struct Library *)OpenLibrary("utility.library",37L);
   if (!UtilityBase) JMH_Quit("Cannot open utility.library 37+" );

   MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN);
   if (!MUIMasterBase)
   {
      printf("Cannot open muimaster.library" );
      JMH_Quit( NULL );
   }

   if ( MG.pClipMP = CreatePort(0,0) )
   {
      if ( MG.pClipIO = (struct IOClipReq *)CreateExtIO( MG.pClipMP, sizeof( struct IOClipReq ) ) )
      {
         if ( OpenDevice( "clipboard.device", 0L, (struct IORequest *)MG.pClipIO, 0 ) )
         {
            JMH_Quit("Cannot open clipboard.device");
         }
      }
      else
      {
         JMH_Quit("Cannot allocate clipboard IO request buffer.");
      }
   }
   else
   {
      JMH_Quit("Cannot create clipboard message port");
   }
}

//
// JMH_Quit(): close down everything we've opened and JMH_Quit
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_Quit( char *t )
{
   char   szQuitBuf[256+20];
   ULONG  ulStat;


   if (t)
   {
      get( MG.App, MUIA_Application_ForceQuit, &ulStat );
      if ( !ulStat )
      {
         sprintf( szQuitBuf, "%s\nExiting...", t );
         MUI_Request( MG.App, NULL, 0, NULL, "*OK", szQuitBuf, NULL );
      }
   }

   // free disk object (icon)
   if ( MG.dobj_App )   FreeDiskObject( MG.dobj_App );

   // free app object
   if ( MG.App )        MUI_DisposeObject( MG.App );

   // free clipboard.device resources
   CloseDevice( (struct IORequest *)MG.pClipIO );
   if ( MG.pClipIO )    DeleteExtIO( (struct IORequest *)MG.pClipIO );
   if ( MG.pClipMP )    DeletePort( MG.pClipMP );

   // free shared libraries
   if (MUIMasterBase)   CloseLibrary(MUIMasterBase);
   if (UtilityBase)     CloseLibrary(UtilityBase);
   if (AslBase)         CloseLibrary(AslBase);
   if (GfxBase)         CloseLibrary((struct Library *)GfxBase);
   if (GadToolsBase)    CloseLibrary(GadToolsBase);
   if (IntuitionBase)   CloseLibrary((struct Library *)IntuitionBase);
   if (DosBase)         CloseLibrary(DosBase);

   exit(0);
}

//
// JMH_Startup(): handle arguments, setup environment, init vars/GUI...
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void JMH_Startup( int argc, char *argv[] )
{
   static char       *programname = "MUILabeler";
   static char        programpath[512];
   BPTR               tmplock;
   struct WBStartup  *WBenchMsg   = NULL;
   LONG               rda_Arguments[NUM_ARGS];
   USHORT             us;
   struct RDArgs     *rda_Args;


   JMH_InitVars();

   for ( us=0; us < NUM_ARGS; us++ )   rda_Arguments[us] = 0;

   // run from Workbench or CLI/Shell?
   if ( argc > 0 )
   {
      // set defaults
      strcpy( MG.szProjectSpec  , "" );
      strcpy( MG.szSettingsSpec , "" );

      // get opts from command line
      if (rda_Args = ReadArgs( "FILE/A", rda_Arguments, NULL ))
      {
         if ( rda_Arguments[ARG_FILE] )
         {
            strcpy( MG.szProjectSpec, (char *)rda_Arguments[ARG_FILE] );
         }
         FreeArgs( rda_Args );
      }

      //
      // get program name so we can lock icon...
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      GetProgramName( programpath, FMSIZE );
   }
   else
   {
      //
      // get program name so we can lock icon...
      // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      WBenchMsg   = (struct WBStartup *)argv;
      programname = WBenchMsg->sm_ArgList->wa_Name;

      tmplock  = Lock( programname, ACCESS_READ );
      NameFromLock( tmplock, programpath, 256 );
      UnLock( tmplock );
   }

   // try to get disk object
   MG.dobj_App = GetDiskObjectNew( programpath );

   //
   // set up the MUI application object
   // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   MG.App = ApplicationObject,
      MUIA_Application_Title      , "MUILabeler",
      MUIA_Application_Version    , "$VER: MUILabeler 1.3 (28.05.95)",
      MUIA_Application_Copyright  , "(C) 1994  John M Haubrich Jr",
      MUIA_Application_Author     , "John M Haubrich Jr",
      MUIA_Application_Description, "Prints labels to printer.",
      MUIA_Application_Base       , "MUILabeler",
      MUIA_Application_DiskObject , MG.dobj_App,
      MUIA_HelpFile               , "PROGDIR:MUILabeler.guide",
      End;

   if ( !MG.App )
      JMH_Quit( "Failed to create Application." );
}
