home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / DC-POS24.LZX / pOS / pOS_RKRM.lzx / pOS_RKRM / pPrefs / SerialPrefsLib_example / prog.c next >
Encoding:
C/C++ Source or Header  |  1997-03-18  |  10.6 KB  |  385 lines

  1. #ifndef __INC_PROG_C
  2. #define __INC_PROG_C
  3. /*******************************************************************
  4.  $CRT 18 Oct 1996 : hp
  5.  
  6.  $AUT Holger Papajewski
  7.  $DAT >>prog.c<<   03 Dec 1996    09:43:10 - (C) ProDAD
  8. *******************************************************************/
  9.  
  10. //##private
  11. // assign ABC: p://posprg/PrefsLibs/Serial
  12.  
  13. /***********************************************************
  14.   pOS programing example - Copyright (C) 1995-97 proDAD
  15.  
  16.   This code was written as an easy to understand example,
  17.   how to program pOS features. It is provided 'as-is',
  18.   without any express or implied warranty.
  19.  
  20.   Permission is hereby granted to use, copy and modify
  21.   this source code for any purpose, without fee, subject
  22.   to the following conditions:
  23.  
  24.     (1) This notice may not be removed or altered from any
  25.         source distribution.
  26.  
  27.     (2) Altered source versions must be plainly marked as
  28.         such, and must not be misrepresented as being
  29.         the original source code.
  30.  
  31.     (3) If only executable code is distributed, then the
  32.         accompanying documentation have to state that
  33.         "this software is based in part on examples of
  34.         the pOS developer packet".
  35.  
  36.     (4) Permission for use of this code is granted only
  37.         if the user accepts full responsibility for any
  38.         undesirable consequences. proDAD accept NO LIABILITY
  39.         for damages of any kind.
  40.  
  41.   ©proDAD
  42. ***********************************************************/
  43.  
  44. #include "ABC:hs/prog.h"
  45.  
  46. #include "p:pExec/Library.h"
  47. #include "p:pExec/Resident.h"
  48. #include "p:pExec/Memory.h"
  49. #include "p:pExec/Sema.h"
  50. #include "p:pExec/Class.h"
  51. #include "p:pExec/Diagnos.h"
  52. #include "p:pExec/TstTags.h"
  53. #include "p:pDOS/Segment.h"
  54. #include "p:pDOS/DosSig.h"
  55. #include "p:pDOS/DosTags.h"
  56. #include "p:pGadget/Gadget.h"
  57. #include "p:pIntui/Tags.h"
  58. #include "p:pLocale/LocTags.h"
  59. #include "p:proto/pList.h"
  60. #include "p:proto/pLibExt.h"
  61. #include "p:proto/pExec2.h"
  62. #include "p:proto/pDOS2.h"
  63. #include "p:proto/pUtil2.h"
  64. #include "p:proto/pLocale2.h"
  65. #include "p:pPrefs/PrefsLibData.h"
  66. #include "p:pPrefs/PrefsTags.h"
  67.  
  68. #include "p://pOSPrg/SysCatalog/Sys_Cat.h"
  69.  
  70.  
  71.  
  72. #ifdef _____ME_____
  73.   #include "grund/inc_string.h"
  74.   #include "grund/inc_limits.h"
  75.   #include "grund/inc_stdio.h"
  76.   #include "grund/inc_stdlib.h"
  77. #else
  78.  #ifdef __cplusplus
  79.  extern "C" {
  80.  #endif
  81.   #include <string.h>
  82.   #include <limits.h>
  83.   #include <stdio.h>
  84.   #include <stdlib.h>
  85.  #ifdef __cplusplus
  86.  }
  87.  #endif
  88. #endif
  89.  
  90.  
  91. #include "ABC:SerialPrefsGad.h"
  92.  
  93.  
  94.  
  95. extern struct pOS_DosBase     *gb_DosBase;
  96. extern struct pOS_IntuiDevice *gb_IntuiBase;
  97. extern struct pOS_UtilityBase *gb_UtilityBase;
  98. extern struct pOS_GadgetBase  *gb_GadgetBase;
  99. extern struct pOS_LocaleBase  *gb_LocaleBase;
  100.  
  101. struct SerPrefsLib
  102. {
  103.   pOS_Library   sp_Lib;
  104.  
  105.   pOS_NClass   *sp_SerialGadClass;
  106.  
  107.   pOS_Catalog  *sp_Catalog;
  108. };
  109.  
  110.  
  111. /*\
  112. *** Die Objekt-Data-Struktur der SerialPrefsGad.class beginnt mit
  113. *** den Pointern auf die Standard-Funktionen Save, Load & Reset
  114. *** Diese Struktur dient nur zum casten.
  115. \*/
  116. struct PrefsObjStdFuncs
  117. {
  118.   BOOL   (*Load_func)(_R_A0 APTR,_R_A1 pOS_FileHandle*);
  119.   BOOL   (*Save_func)(_R_A0 APTR,_R_A1 pOS_FileHandle*,_R_D0 ULONG);
  120.   VOID   (*Reset_func)(_R_A0 APTR);
  121. };
  122.  
  123.  
  124. extern ULONG *FuncTable[];
  125. const CHAR LibraryName[]  ="serial_prefs.library";
  126. const CHAR LibraryIDName[]="serial_prefs.library 1.0 ("__DATE2__")";
  127. const CHAR DataTypeName[] ="$DTT:SysPrefs.Library/serial";
  128. const pOS_TagItem LibraryDescribe[]=
  129. {
  130.   EXTSTTAG_MainOSID, pOS_MAINOSID,
  131.   EXTSTTAG_GetDTT, (ULONG)&DataTypeName[5],
  132.   TAG_END
  133. };
  134.  
  135. BOOL pLibMain(_R_LB pOS_ExecBase*,_R_A0 SerPrefsLib*);
  136.  
  137.  
  138. pOS_ResidentLibInit InitTable=
  139. {
  140.   sizeof(SerPrefsLib),
  141.   FuncTable,
  142.   NULL,
  143.   (BOOL(*)(_R_LB pOS_ExecBase*,_R_A0 pOS_Library*))pLibMain
  144. };
  145.  
  146.  
  147. /*----------------------------------
  148.  Wird in dieser Library nicht benötigt.
  149. -----------------------------------*/
  150. BOOL Open_func(_R_LB SerPrefsLib*)      { return(1); }
  151. VOID Close_func(_R_LB SerPrefsLib*)     {}
  152. ULONG Reserved_func(_R_LB SerPrefsLib*) { return(0); }
  153.  
  154.  
  155.  
  156. /*----------------------------------
  157. -----------------------------------*/
  158. pOS_SegmentLst* Expunge_func(_R_LB SerPrefsLib* lib)
  159. {
  160.   lib->sp_Lib.lib_Flags |= LIBF_DELEXP;     /* verzögertes Schließen aktivieren */
  161.   if(lib->sp_Lib.lib_OpenCnt==0) {          /* alle Verwender aben pOS_CloseLibrary() aufgerufen */
  162.     pOS_SegmentLst* Seg=lib->sp_Lib.lib_Segm;
  163.  
  164. /*\
  165. *** LibNode aushängen, ACHTUNG: Expunge wird im FORBID aufgerufen
  166. \*/
  167.     pOS_ListRemove((pOS_Node*)&lib->sp_Lib.lib_Node);
  168.  
  169.  
  170.     if(lib->sp_SerialGadClass)
  171.       pOS_DeleteClass(lib->sp_SerialGadClass);
  172.  
  173.     pOS_CloseCatalog(lib->sp_Catalog);
  174.  
  175.     _pOS_FreeLibraryMem2(&lib->sp_Lib); /* Lib-Memory freigeben */
  176.  
  177.     pOS_CloseLibrary((pOS_Library*)gb_LocaleBase);
  178.     pOS_CloseLibrary((pOS_Library*)gb_GadgetBase);
  179.     pOS_CloseLibrary((pOS_Library*)gb_IntuiBase); /* alle Libs schließen */
  180.     pOS_CloseLibrary((pOS_Library*)gb_DosBase);
  181.     pOS_CloseLibrary((pOS_Library*)gb_UtilityBase);
  182.     return(Seg);
  183.   }
  184.   return(0);
  185. }
  186.  
  187.  
  188. /*----------------------------------
  189. Library-Funktion zum Laden der Prefs eines ihrer Gadgets
  190. -----------------------------------*/
  191. BOOL LoadPrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad,
  192.                     _R_A1 pOS_FileHandle *fh )
  193. {
  194.   PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;
  195.  
  196.   return( (std->Load_func)(std,fh) );
  197. }
  198.  
  199.  
  200. /*----------------------------------
  201. Library-Funktion zum Speichern der Prefs eines ihrer Gadgets
  202. -----------------------------------*/
  203. BOOL SavePrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad,
  204.                     _R_A1 pOS_FileHandle *fh, _R_D0 ULONG flags )
  205. {
  206.   PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;
  207.  
  208.   return( (std->Save_func)(std,fh,flags) );
  209. }
  210.  
  211.  
  212. /*----------------------------------
  213. Library-Funktion zum zurücksetzen der Daten eines ihrer Gadgets
  214. -----------------------------------*/
  215. VOID ResetPrefs_func(_R_LB SerPrefsLib *lib, _R_A0 pOS_Gadget *gad )
  216. {
  217.   PrefsObjStdFuncs *std = (PrefsObjStdFuncs*)gad->gad_SpecialInfo;
  218.  
  219.   (std->Reset_func)(std);
  220. }
  221.  
  222.  
  223. /*\
  224. *** globale Information-Strukturen zu allen Gadgets der Library
  225. \*/
  226. pOS_PrefsLibData gb_LibData[] =
  227. {
  228.   {"Serial","Serial","Sys",PRFF_Restore|PRFF_LastSaved|PRFF_Default,TAG_DONE},
  229. };
  230.  
  231. /*----------------------------------
  232. -----------------------------------*/
  233. const pOS_PrefsLibData* GetPrefsData_func(_R_LB SerPrefsLib *lib,
  234.                    _R_D0 ULONG index)
  235. {
  236.   if( index < sizeof(gb_LibData)/sizeof(pOS_PrefsLibData))
  237.     return( &gb_LibData[index] );
  238.   else
  239.     return( NULL );
  240. }
  241.  
  242.  
  243.  
  244. /*\
  245. *** default Werte für das SerialPrefsGadget
  246. \*/
  247. const ULONG gb_SerRates[]    = {2400,4800,9600,14400,19200,28800,
  248.                                 57600,115200,230400,460800,921600,0};
  249. const ULONG gb_SerBuffers[]  = {512,1024,2048,4096,8192,16384,32768,65536,0};
  250. const CHAR *gb_SerProtocols[]= {"XON/XOFF","RTS/CTS","None",NULL};
  251. const CHAR *gb_SerParities[] = {"None","Even","Odd","Mark","Space",NULL};
  252. const CHAR *gb_SerDataBits[] = {"7","8",NULL};
  253. const CHAR *gb_SerStopBits[] = {"1","2",NULL};
  254.  
  255. /*----------------------------------
  256. Library-Funktion zum Erzeugen der einzelnen PrefsGadgets
  257. -----------------------------------*/
  258. pOS_Gadget *CreatePrefsGadgetA_func(_R_LB SerPrefsLib *lib,
  259.                       _R_A0 const pOS_TagItem *tags)
  260. {
  261.   ww_w("Ser_Prefs.lib:CreatePrefsGadgetA");
  262.   ww_rp(lib);
  263.   ww_rp(tags);
  264.   ww_endN(NULL);
  265.  
  266.   pOS_Gadget   *PGad=NULL;
  267.   ULONG index = pOS_FindTagData(PRFTAG_GadgetNum,tags,-1);
  268.  
  269.  
  270.   switch( index ) {
  271.     case 0:
  272.       PGad=(pOS_Gadget*)pOS_NewIObject(lib->sp_SerialGadClass,NULL,NULL,
  273.              ICLTAG_Gwk, 1,
  274.              PRFSERTAG_AvailBautRates,   (ULONG)&gb_SerRates[0],
  275.              PRFSERTAG_AvailBufferSizes, (ULONG)&gb_SerBuffers[0],
  276.              PRFSERTAG_AvailProtocols,   (ULONG)&gb_SerProtocols[0],
  277.              PRFSERTAG_AvailParities,    (ULONG)&gb_SerParities[0],
  278.              PRFSERTAG_AvailDataBits,    (ULONG)&gb_SerDataBits[0],
  279.              PRFSERTAG_AvailStopBits,    (ULONG)&gb_SerStopBits[0],
  280.              TAG_MORE, (ULONG)tags, TAG_DONE );
  281.       break;
  282.  
  283.     default:
  284.       break;
  285.   }
  286.  
  287.   return( PGad );
  288. }
  289.  
  290.  
  291.  
  292. ULONG *FuncTable[]=
  293. {
  294.  (ULONG*)Open_func,
  295.  (ULONG*)Close_func,
  296.  (ULONG*)Expunge_func,
  297. // ------------
  298.  (ULONG*)Reserved_func,
  299.  (ULONG*)Reserved_func,
  300.  (ULONG*)Reserved_func,
  301.  (ULONG*)Reserved_func,
  302.  (ULONG*)Reserved_func,
  303.  (ULONG*)Reserved_func,
  304.  (ULONG*)Reserved_func,
  305.  (ULONG*)Reserved_func,
  306. // ------------
  307.  (ULONG*)LoadPrefs_func,
  308.  (ULONG*)SavePrefs_func,
  309.  (ULONG*)ResetPrefs_func,
  310.  (ULONG*)GetPrefsData_func,
  311.  (ULONG*)CreatePrefsGadgetA_func,
  312.  (ULONG*)ULONG_MAX
  313. };
  314.  
  315.  
  316.  
  317. /*******************************************************************************/
  318.  
  319. /*******************************************************************************/
  320.  
  321.  
  322.  
  323. /*----------------------------------
  324. -----------------------------------*/
  325. BOOL pLibMain(_R_LB pOS_ExecBase* exec,_R_A0 SerPrefsLib* lib)
  326. {
  327. #ifdef __pOS_EXECPRECODE
  328.   extern struct pOS_ExecBase* gb_ExecBase;
  329.   extern struct pOS_ExecLibFunction* gb_ExecLib;
  330.  
  331.   gb_ExecBase=(struct pOS_ExecBase*)exec;
  332.   gb_ExecLib=*((struct pOS_ExecLibFunction**)lib->sp_Lib.lib_Segm->sel_Seg.seg_Reserved2);
  333.   gb_DosBase  =(pOS_DosBase*)pOS_OpenLibrary("pdos.library",0);
  334.   gb_IntuiBase=(pOS_IntuiDevice*)pOS_OpenLibrary("pintui.library",0);
  335.   gb_UtilityBase=(pOS_UtilityBase*)pOS_OpenLibrary("putility.library",0);
  336.   gb_GadgetBase=(pOS_GadgetBase*)pOS_OpenLibrary("pgadget.library",0);
  337.   gb_LocaleBase=(pOS_LocaleBase*)pOS_OpenLibrary("plocale.library",0);
  338. #else
  339.  #error hier fehlt etwas
  340. #endif
  341.  
  342.  
  343.   lib->sp_Catalog = pOS_OpenCatalog(NULL,"sys/sys.catalog",
  344.     LOCTAG_BuiltInLanguage,"english",TAG_DONE);
  345.  
  346.   /* None - Kein */
  347.   gb_SerProtocols[2]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_None,gb_SerProtocols[2]);
  348.   /* None - Keine */
  349.   gb_SerParities[0]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_None1,gb_SerParities[0]);
  350.   /* Even - Gerade */
  351.   gb_SerParities[1]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Even,gb_SerParities[1]);
  352.   /* Odd - Ungerade */
  353.   gb_SerParities[2]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Odd,gb_SerParities[2]);
  354.   /* Mark - Bitwert 1*/
  355.   gb_SerParities[3]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Mark,gb_SerParities[3]);
  356.   /* Space - Bitwert 0 */
  357.   gb_SerParities[4]=pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Space,gb_SerParities[4]);
  358.  
  359.   /* Serial */
  360.   gb_LibData[0].pld_Name = pOS_GetCatalogStr(lib->sp_Catalog,MSG_Sys_Serial,gb_LibData[0].pld_Name);
  361.  
  362.  
  363.   lib->sp_SerialGadClass =
  364.      pOS_CreateClass("SerialPrefsGad.class","grpgad.class",NULL,
  365.                      (APTR)SerialDispatcher,
  366.                      sizeof(SerialData),0);
  367.  
  368.  
  369.   return(lib->sp_SerialGadClass != NULL );
  370. }
  371.  
  372.  
  373.  
  374. #ifdef _____ME_____
  375.   #include "ci:grund/debug.cpp"
  376.   #ifdef MYDEBUG
  377.     struct Library *TimerBase;
  378.     ULONG HB_Memory_FlushErrCounter;
  379.   #endif
  380. #endif
  381.  
  382.  
  383.  
  384. #endif
  385.