#ifndef __INC_PROG_C
#define __INC_PROG_C
/*******************************************************************
 $CRT 18 Oct 1996 : hp

 $AUT Holger Papajewski
 $DAT >>prog.c<<   03 Dec 1996    09:43:10 - (C) ProDAD
*******************************************************************/

//##private
// assign ABC: p://posprg/PrefsLibs/Serial

/***********************************************************
  pOS programing example - Copyright (C) 1995-97 proDAD

  This code was written as an easy to understand example,
  how to program pOS features. It is provided 'as-is',
  without any express or implied warranty.

  Permission is hereby granted to use, copy and modify
  this source code for any purpose, without fee, subject
  to the following conditions:

    (1) This notice may not be removed or altered from any
        source distribution.

    (2) Altered source versions must be plainly marked as
        such, and must not be misrepresented as being
        the original source code.

    (3) If only executable code is distributed, then the
        accompanying documentation have to state that
        "this software is based in part on examples of
        the pOS developer packet".

    (4) Permission for use of this code is granted only
        if the user accepts full responsibility for any
        undesirable consequences. proDAD accept NO LIABILITY
        for damages of any kind.

  ©proDAD
***********************************************************/

#include "ABC:hs/prog.h"

#include "p:pExec/Library.h"
#include "p:pExec/Resident.h"
#include "p:pExec/Memory.h"
#include "p:pExec/Sema.h"
#include "p:pExec/Class.h"
#include "p:pExec/Diagnos.h"
#include "p:pExec/TstTags.h"
#include "p:pDOS/Segment.h"
#include "p:pDOS/DosSig.h"
#include "p:pDOS/DosTags.h"
#include "p:pGadget/Gadget.h"
#include "p:pIntui/Tags.h"
#include "p:pLocale/LocTags.h"
#include "p:pProto/pList.h"
#include "p:pProto/pLibExt.h"
#include "p:pProto/pExec2.h"
#include "p:pProto/pDOS2.h"
#include "p:pProto/pUtil2.h"
#include "p:pProto/pLocale2.h"
#include "p:pPrefs/PrefsLibData.h"
#include "p:pPrefs/PrefsTags.h"

#include "p://pOSPrg/SysCatalog/Sys_Cat.h"



#ifdef _____ME_____
  #include "grund/inc_string.h"
  #include "grund/inc_limits.h"
  #include "grund/inc_stdio.h"
  #include "grund/inc_stdlib.h"
#else
 #ifdef __cplusplus
 extern "C" {
 #endif
  #include <string.h>
  #include <limits.h>
  #include <stdio.h>
  #include <stdlib.h>
 #ifdef __cplusplus
 }
 #endif
#endif


#include "ABC:SerialPrefsGad.h"



extern struct pOS_DosBase     *gb_DosBase;
extern struct pOS_IntuiDevice *gb_IntuiBase;
extern struct pOS_UtilityBase *gb_UtilityBase;
extern struct pOS_GadgetBase  *gb_GadgetBase;
extern struct pOS_LocaleBase  *gb_LocaleBase;

struct SerPrefsLib
{
  pOS_Library   sp_Lib;

  pOS_NClass   *sp_SerialGadClass;

  pOS_Catalog  *sp_Catalog;
};


/*\
*** Die Objekt-Data-Struktur der SerialPrefsGad.class beginnt mit
*** den Pointern auf die Standard-Funktionen Save, Load & Reset
*** Diese Struktur dient nur zum casten.
\*/
struct PrefsObjStdFuncs
{
  BOOL   (*Load_func)(_R_A0 APTR,_R_A1 pOS_FileHandle*);
  BOOL   (*Save_func)(_R_A0 APTR,_R_A1 pOS_FileHandle*,_R_D0 ULONG);
  VOID   (*Reset_func)(_R_A0 APTR);
};


extern ULONG *FuncTable[];
const CHAR LibraryName[]  ="serial_prefs.library";
const CHAR LibraryIDName[]="serial_prefs.library 1.0 ("__DATE2__")";
const CHAR DataTypeName[] ="$DTT:SysPrefs.Library/serial";
const pOS_TagItem LibraryDescribe[]=
{
  EXTSTTAG_MainOSID, pOS_MAINOSID,
  EXTSTTAG_GetDTT, (ULONG)&DataTypeName[5],
  TAG_END
};

BOOL pLibMain(_R_LB pOS_ExecBase*,_R_A0 SerPrefsLib*);


pOS_ResidentLibInit InitTable=
{
  sizeof(SerPrefsLib),
  FuncTable,
  NULL,
  (BOOL(*)(_R_LB pOS_ExecBase*,_R_A0 pOS_Library*))pLibMain
};


/*----------------------------------
 Wird in dieser Library nicht benötigt.
-----------------------------------*/
BOOL Open_func(_R_LB SerPrefsLib*)      { return(1); }
VOID Close_func(_R_LB SerPrefsLib*)     {}
ULONG Reserved_func(_R_LB SerPrefsLib*) { return(0); }



/*----------------------------------
-----------------------------------*/
pOS_SegmentLst* Expunge_func(_R_LB SerPrefsLib* lib)
{
  lib->sp_Lib.lib_Flags |= LIBF_DELEXP;     /* verzögertes Schließen aktivieren */
  if(lib->sp_Lib.lib_OpenCnt==0) {          /* alle Verwender aben pOS_CloseLibrary() aufgerufen */
    pOS_SegmentLst* Seg=lib->sp_Lib.lib_Segm;

/*\
*** LibNode aushängen, ACHTUNG: Expunge wird im FORBID aufgerufen
\*/
    pOS_ListRemove((pOS_Node*)&lib->sp_Lib.lib_Node);


    if(lib->sp_SerialGadClass)
      pOS_DeleteClass(lib->sp_SerialGadClass);

    pOS_CloseCatalog(lib->sp_Catalog);

    _pOS_FreeLibraryMem2(&lib->sp_Lib); /* Lib-Memory freigeben */

    pOS_CloseLibrary((pOS_Library*)gb_LocaleBase);
    pOS_CloseLibrary((pOS_Library*)gb_GadgetBase);
    pOS_CloseLibrary((pOS_Library*)gb_IntuiBase); /* alle Libs schließen */
    pOS_CloseLibrary((pOS_Library*)gb_DosBase);
    pOS_CloseLibrary((pOS_Library*)gb_UtilityBase);
    return(Seg);
  }
  return(0);
}


/*----------------------------------
Library-Funktion zum Laden der Prefs eines ihrer Gadgets
-----------------------------------*/
BOOL LoadPrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad,
                    _R_A1 pOS_FileHandle *fh )
{
  PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;

  return( (std->Load_func)(std,fh) );
}


/*----------------------------------
Library-Funktion zum Speichern der Prefs eines ihrer Gadgets
-----------------------------------*/
BOOL SavePrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad,
                    _R_A1 pOS_FileHandle *fh, _R_D0 ULONG flags )
{
  PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;

  return( (std->Save_func)(std,fh,flags) );
}


/*----------------------------------
Library-Funktion zum zurücksetzen der Daten eines ihrer Gadgets
-----------------------------------*/
VOID ResetPrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad )
{
  PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;

  (std->Reset_func)(std);
}


/*\
*** globale Information-Strukturen zu allen Gadgets der Library
\*/
pOS_PrefsLibData gb_LibData[] =
{
  {"Serial","Serial","Sys",PRFF_Restore|PRFF_LastSaved|PRFF_Default,TAG_DONE},
};

/*----------------------------------
-----------------------------------*/
const pOS_PrefsLibData* GetPrefsData_func(_R_LB SerPrefsLib *lib,
                   _R_D0 ULONG index)
{
  if( index < sizeof(gb_LibData)/sizeof(pOS_PrefsLibData))
    return( &gb_LibData[index] );
  else
    return( NULL );
}



/*\
*** default Werte für das SerialPrefsGadget
\*/
const ULONG gb_SerRates[]    = {2400,4800,9600,14400,19200,28800,
                                57600,115200,230400,460800,921600,0};
const ULONG gb_SerBuffers[]  = {512,1024,2048,4096,8192,16384,32768,65536,0};
const CHAR *gb_SerProtocols[]= {"XON/XOFF","RTS/CTS","None",NULL};
const CHAR *gb_SerParities[] = {"None","Even","Odd","Mark","Space",NULL};
const CHAR *gb_SerDataBits[] = {"7","8",NULL};
const CHAR *gb_SerStopBits[] = {"1","2",NULL};

/*----------------------------------
Library-Funktion zum Erzeugen der einzelnen PrefsGadgets
-----------------------------------*/
pOS_Gadget *CreatePrefsGadgetA_func(_R_LB SerPrefsLib *lib,
                      _R_A0 const pOS_TagItem *tags)
{
  ww_w("Ser_Prefs.lib:CreatePrefsGadgetA");
  ww_rp(lib);
  ww_rp(tags);
  ww_endN(NULL);

  pOS_Gadget   *PGad=NULL;
  ULONG index = pOS_FindTagData(PRFTAG_GadgetNum,tags,-1);


  switch( index ) {
    case 0:
      PGad=(pOS_Gadget*)pOS_NewIObject(lib->sp_SerialGadClass,NULL,NULL,
             ICLTAG_Gwk, 1,
             PRFSERTAG_AvailBautRates,   (ULONG)&gb_SerRates[0],
             PRFSERTAG_AvailBufferSizes, (ULONG)&gb_SerBuffers[0],
             PRFSERTAG_AvailProtocols,   (ULONG)&gb_SerProtocols[0],
             PRFSERTAG_AvailParities,    (ULONG)&gb_SerParities[0],
             PRFSERTAG_AvailDataBits,    (ULONG)&gb_SerDataBits[0],
             PRFSERTAG_AvailStopBits,    (ULONG)&gb_SerStopBits[0],
             TAG_MORE, (ULONG)tags, TAG_DONE );
      break;

    default:
      break;
  }

  return( PGad );
}



ULONG *FuncTable[]=
{
 (ULONG*)Open_func,
 (ULONG*)Close_func,
 (ULONG*)Expunge_func,
// ------------
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
 (ULONG*)Reserved_func,
// ------------
 (ULONG*)LoadPrefs_func,
 (ULONG*)SavePrefs_func,
 (ULONG*)ResetPrefs_func,
 (ULONG*)GetPrefsData_func,
 (ULONG*)CreatePrefsGadgetA_func,
 (ULONG*)ULONG_MAX
};



/*******************************************************************************/

/*******************************************************************************/



/*----------------------------------
-----------------------------------*/
BOOL pLibMain(_R_LB pOS_ExecBase* exec,_R_A0 SerPrefsLib* lib)
{
#ifdef __pOS_EXECPRECODE
  extern struct pOS_ExecBase* gb_ExecBase;
  extern struct pOS_ExecLibFunction* gb_ExecLib;

  gb_ExecBase=(struct pOS_ExecBase*)exec;
  gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->sp_Lib.lib_Segm->sel_Seg.seg_Reserved2);
  gb_DosBase  =(pOS_DosBase*)pOS_OpenLibrary("pdos.library",0);
  gb_IntuiBase=(pOS_IntuiDevice*)pOS_OpenLibrary("pintui.library",0);
  gb_UtilityBase=(pOS_UtilityBase*)pOS_OpenLibrary("putility.library",0);
  gb_GadgetBase=(pOS_GadgetBase*)pOS_OpenLibrary("pgadget.library",0);
  gb_LocaleBase=(pOS_LocaleBase*)pOS_OpenLibrary("plocale.library",0);
#else
 #error hier fehlt etwas
#endif


  lib->sp_Catalog = pOS_OpenCatalog(NULL,"sys/sys.catalog",
    LOCTAG_BuiltInLanguage,"english",TAG_DONE);

  /* None - Kein */
  gb_SerProtocols[2]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_None,gb_SerProtocols[2]);
  /* None - Keine */
  gb_SerParities[0]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_None1,gb_SerParities[0]);
  /* Even - Gerade */
  gb_SerParities[1]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Even,gb_SerParities[1]);
  /* Odd - Ungerade */
  gb_SerParities[2]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Odd,gb_SerParities[2]);
  /* Mark - Bitwert 1*/
  gb_SerParities[3]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Mark,gb_SerParities[3]);
  /* Space - Bitwert 0 */
  gb_SerParities[4]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Space,gb_SerParities[4]);

  /* Serial */
  gb_LibData[0].pld_Name = pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Serial,gb_LibData[0].pld_Name);


  lib->sp_SerialGadClass =
     pOS_CreateClass("SerialPrefsGad.class","grpgad.class",NULL,
                     (APTR)SerialDispatcher,
                     sizeof(SerialData),0);


  return(lib->sp_SerialGadClass != NULL );
}



#ifdef _____ME_____
  #include "ci:grund/debug.cpp"
  #ifdef MYDEBUG
    struct Library *TimerBase;
    ULONG HB_Memory_FlushErrCounter;
  #endif
#endif



#endif
