home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / fsrc1241.zip / cfgfile_interface.c < prev    next >
C/C++ Source or Header  |  1999-02-14  |  8KB  |  209 lines

  1. /*---------------------------------------------------------------------------+
  2.  | Titel: CFGFILE_INTERFACE.C                                                |
  3.  +-----------------------------------------+---------------------------------+
  4.  | Erstellt von: Michael Hohner            | Am: 12.01.1995                  |
  5.  +-----------------------------------------+---------------------------------+
  6.  | System: OS/2 2.x                                                          |
  7.  +---------------------------------------------------------------------------+
  8.  | Beschreibung:                                                             |
  9.  |                                                                           |
  10.  |     Dynamisches CFG-Interface                                             |
  11.  |                                                                           |
  12.  |                                                                           |
  13.  +---------------------------------------------------------------------------+
  14.  | Bemerkungen:                                                              |
  15.  +---------------------------------------------------------------------------*/
  16.  
  17. /*----------------------------- Header-Dateien ------------------------------*/
  18. #pragma strings(readonly)
  19.  
  20. #define INCL_BASE
  21. #include <os2.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25.  
  26. #include "main.h"
  27. #include "structs.h"
  28.  
  29. #include "areaman\areaman.h"
  30. #include "cfgfile_interface.h"
  31.  
  32. /*--------------------------------- Defines ---------------------------------*/
  33.  
  34. #define CFGDLL_MASK    "FLTCF_??.DLL"
  35.  
  36. /*---------------------------------- Typen ----------------------------------*/
  37.  
  38. /*---------------------------- Globale Variablen ----------------------------*/
  39.  
  40. /*--------------------------- Funktionsprototypen ---------------------------*/
  41.  
  42. /*----------------------- interne Funktionsprototypen -----------------------*/
  43.  
  44. /*-----------------------------------------------------------------------------
  45.  | Funktionsname: CFG_ReadFormatList
  46.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  47.  | Beschreibung: Erstellt eine Liste der CFG-DLLs mit den unterstützten
  48.  |               Formaten
  49.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  50.  | Parameter: -
  51.  |
  52.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  53.  | Rückgabewerte: Zeiger auf Anfang der Liste
  54.  |
  55.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  56.  | Sonstiges: -
  57.  |
  58.  +---------------------------------------------------------------------------*/
  59.  
  60. PCFGDLL CFG_ReadFormatList(void)
  61. {
  62.    PCFGDLL pRetList=NULL, pRetListLast=NULL;
  63.    LOADEDCFGDLL LoadedDLL;
  64.    FILEFINDBUF3 FindBuf;
  65.    HDIR FindHandle = HDIR_CREATE;
  66.    ULONG ulNumFiles=1;
  67.    APIRET rc;
  68.    char pchCurrentDir[LEN_PATHNAME+1];
  69.    char pchDLLName[LEN_PATHNAME+1];
  70.    ULONG ulLen = sizeof(pchCurrentDir);
  71.    ULONG ulDisk, ulMapping;
  72.  
  73.    DosQueryCurrentDisk(&ulDisk, &ulMapping);
  74.    DosQueryCurrentDir(0, pchCurrentDir, &ulLen);
  75.  
  76.    rc = DosFindFirst(CFGDLL_MASK, &FindHandle, FILE_ARCHIVED, &FindBuf, sizeof(FindBuf),
  77.                      &ulNumFiles, FIL_STANDARD);
  78.  
  79.    while (!rc)
  80.    {
  81.       char *pchTemp;
  82.  
  83.       /* gefundene DLL pruefen */
  84.       sprintf(pchDLLName, "%c:\\%s\\%s", '@'+ulDisk, pchCurrentDir, FindBuf.achName);
  85.  
  86.       /* DLL laden */
  87.       if (!CFG_LoadDLL(pchDLLName, &LoadedDLL))
  88.       {
  89.          /* korrekte DLL, Daten holen */
  90.          if (pRetList)
  91.          {
  92.             pRetListLast->next = calloc(1, sizeof(CFGDLL));
  93.             pRetListLast = pRetListLast->next;
  94.          }
  95.          else
  96.             pRetList = pRetListLast = calloc(1, sizeof(CFGDLL));
  97.  
  98.          strcpy(pRetListLast->pchDLLName, pchDLLName);
  99.          pRetListLast->ulFormatID = LoadedDLL.QueryFormatID();
  100.          pchTemp = LoadedDLL.QueryFormatName();
  101.          if (pchTemp)
  102.             strcpy(pRetListLast->pchFormatName, pchTemp);
  103.          else
  104.             _itoa(pRetListLast->ulFormatID, pRetListLast->pchFormatName, 10);
  105.  
  106.          /* DLL wieder freigeben */
  107.          DosFreeModule(LoadedDLL.hmodCfgDLL);
  108.       }
  109.  
  110.       /* naechste DLL suchen */
  111.       ulNumFiles = 1;
  112.       rc = DosFindNext(FindHandle, &FindBuf, sizeof(FindBuf), &ulNumFiles);
  113.    }
  114.  
  115.    if (FindHandle != HDIR_CREATE)
  116.       DosFindClose(FindHandle);
  117.  
  118.    return pRetList;
  119. }
  120.  
  121. /*-----------------------------------------------------------------------------
  122.  | Funktionsname: CFG_FindFormat
  123.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  124.  | Beschreibung: Sucht ein Format in der Liste
  125.  |
  126.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  127.  | Parameter: pList: Anfang der Liste
  128.  |            ulFormatID: Gesuchtes Format (CFGTYPE_ANY = beliebig)
  129.  |            pPrev: vorheriges gefundenes (NULL = vom Anfang)
  130.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  131.  | Rückgabewerte: NULL   nicht gefunden/Ende der Liste
  132.  |                sonst  Pointer auf Element
  133.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  134.  | Sonstiges: -
  135.  |
  136.  +---------------------------------------------------------------------------*/
  137.  
  138. PCFGDLL CFG_FindFormat(PCFGDLL pList, ULONG ulFormatID, PCFGDLL pPrev)
  139. {
  140.    if (!pPrev)
  141.       pPrev = pList;       /* vom Anfang */
  142.    else
  143.       pPrev = pPrev->next; /* vom naechsten Element */
  144.  
  145.    while (pPrev &&
  146.           (ulFormatID != CFGTYPE_ANY) &&
  147.           (pPrev->ulFormatID !=ulFormatID))
  148.       pPrev = pPrev->next;
  149.  
  150.    return pPrev;
  151. }
  152.  
  153. /*-----------------------------------------------------------------------------
  154.  | Funktionsname: CFG_LoadDLL
  155.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  156.  | Beschreibung: Laedt eine CFG-DLL
  157.  |
  158.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  159.  | Parameter: pchDLLName: Name der DLL
  160.  |            pLoadedCfgDLL: Lade-Block
  161.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  162.  | Rückgabewerte: LOADCFGDLL_OK          kein Fehler
  163.  |                LOADCFGDLL_CANTLOAD    DLL nicht ladbar
  164.  |                LOADCFGDLL_FUNCMISSING Funktion fehlt
  165.  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  166.  | Sonstiges: -
  167.  |
  168.  +---------------------------------------------------------------------------*/
  169.  
  170. int CFG_LoadDLL(PCHAR pchDLLName, PLOADEDCFGDLL pLoadedCfgDLL)
  171. {
  172.    char fail[50]="";
  173.    APIRET rc=0;
  174.  
  175.    if (!(rc = DosLoadModule(fail, sizeof(fail), pchDLLName, &pLoadedCfgDLL->hmodCfgDLL)))
  176.    {
  177.       if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYVER, NULL,
  178.                                 (PFN*)&pLoadedCfgDLL->QueryVer)))
  179.       {
  180.          if ((rc=pLoadedCfgDLL->QueryVer()) == CURRENT_CFGVER)
  181.          {
  182.             if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYID, NULL,
  183.                                   (PFN*)&pLoadedCfgDLL->QueryFormatID)))
  184.                if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_QUERYNAME, NULL,
  185.                                      (PFN*)&pLoadedCfgDLL->QueryFormatName)))
  186.                   if (!(rc=DosQueryProcAddr(pLoadedCfgDLL->hmodCfgDLL, ORDINAL_READCFG, NULL,
  187.                                         (PFN*)&pLoadedCfgDLL->ReadCfgFile)))
  188.                      return LOADCFGDLL_OK;
  189.          }
  190.          else
  191.          {
  192.             DosFreeModule(pLoadedCfgDLL->hmodCfgDLL);
  193.             return LOADCFGDLL_VERSION;
  194.          }
  195.       }
  196.  
  197.       /* Fehler */
  198.       DosFreeModule(pLoadedCfgDLL->hmodCfgDLL);
  199.       return LOADCFGDLL_FUNCMISSING;
  200.    }
  201.    else
  202.    {
  203.       return LOADCFGDLL_CANTLOAD;
  204.    }
  205. }
  206.  
  207. /*-------------------------------- Modulende --------------------------------*/
  208.  
  209.