home *** CD-ROM | disk | FTP | other *** search
/ Total C++ 2 / TOTALCTWO.iso / borland / 32snipit.pak / CONFIG.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  6KB  |  186 lines

  1. // BDE32 3.x - (C) Copyright 1996 by Borland International
  2.  
  3. // config.c
  4. #include "snipit.h"
  5.  
  6. static void DisplayCfgFile(pCHAR CfgPath, UINT16 Level) ;
  7.  
  8. //=====================================================================
  9. //  Function:
  10. //          Configuration();
  11. //
  12. //  Description:
  13. //          This example dumps the information contained in the
  14. //          IDAPI configuration file, as well as displaying which
  15. //          configuration file is being used.
  16. //=====================================================================
  17. void
  18. Configuration (void)
  19. {
  20.     SYSConfig   sysConfig;  // Used for storing the system configuration
  21.                             // information - used to determine the
  22.                             // location of the configuration file.
  23.     DBIResult   rslt;       // Return value from IDAPI functions.
  24.  
  25.     Screen("*** Configuration Example ***\r\n");
  26.  
  27.     BREAK_IN_DEBUGGER();
  28.  
  29.     Screen("    Initializing IDAPI...");
  30.     rslt = DbiInit(NULL);
  31.     if (ChkRslt(rslt, "Init") != DBIERR_NONE)
  32.     {
  33.         Screen("\r\n*** End of Example ***");
  34.         return;
  35.     }
  36.  
  37.     // Determine which configuration file is being used.
  38.     rslt = DbiGetSysConfig(&sysConfig);
  39.     ChkRslt(rslt, "GetSysConfig");
  40.  
  41.     Screen("\r\n    Display the information in the currently used"
  42.            " configuration file:\r\n\r\n\t\t %s\r\n", sysConfig.szIniFile);
  43.  
  44.     // Call the recursive function which dumps information from the
  45.     //   configuration file.                 
  46.     DisplayCfgFile ("\\", 0) ;
  47.  
  48.     // Close IDAPI
  49.     Screen("\r\n    Exiting IDAPI...");
  50.     rslt = DbiExit();
  51.     ChkRslt(rslt, "Exit");
  52.  
  53.     Screen("\r\n*** End of Example ***");
  54. }
  55.  
  56. //=====================================================================
  57. //  Function:
  58. //          DisplayCfgFile();
  59. //
  60. //  Input:  CfgPath -   Path within the CFG file to the desired
  61. //                      option within the configuration file. Starts
  62. //                      at "\\" for the root of the configuration tree.
  63. //          Level   -   Depth of Recursion.
  64. //
  65. //  Return: None.
  66. //
  67. //  Desc:   This recursive function is used to display all information
  68. //          within the configuration file.
  69. //=====================================================================
  70. void
  71. DisplayCfgFile (pCHAR CfgPath, UINT16 Level)
  72. {
  73.     hDBICur     hCur = 0;   // Handle to the cursor
  74.     DBIResult   rslt;       // Value to return
  75.     pCHAR       szNode;     // String which contains the name of the node
  76.     pCFGDesc    CfgDesc;    // Configuration descriptor
  77.     int         iLoop;      // Loop variable - used for indenting
  78.     UINT16      BaseSize;   // Length of the current node
  79.  
  80.     // Open the Configuration file - returns the configuration options
  81.     //   for the current level in a schema table referenced by hCur.
  82.     rslt = DbiOpenCfgInfoList(NULL, dbiREADONLY, cfgPersistent, CfgPath,
  83.                               &hCur);
  84.     if (ChkRslt(rslt, "OpenCfgInfoList") == DBIERR_NONE)
  85.     {
  86.         // Allocate resources - make block large enough to contain all
  87.         //   information.
  88.         szNode = (pCHAR)malloc(512 * sizeof(CHAR));
  89.         if (! szNode)
  90.         {
  91.             Screen("    Error - Out of memory");
  92.             return;
  93.         }
  94.  
  95.         CfgDesc = (pCFGDesc)malloc(sizeof(CFGDesc));
  96.         if (! CfgDesc)
  97.         {
  98.             Screen("    Error - Out of memory");
  99.             return;
  100.         }
  101.  
  102.         // Initialize descriptor to 0
  103.         memset((void *)CfgDesc, 0, sizeof(CFGDesc));
  104.  
  105.         // Process all nodes/paths
  106.         //   Get the next record in the table - contains the next option
  107.         //   of the given level in the tree.
  108.         while (DbiGetNextRecord(hCur, dbiNOLOCK, (pBYTE)CfgDesc, NULL)
  109.                == DBIERR_NONE)
  110.         {
  111.             // Clear the szNode variable
  112.             szNode[0] = 0;
  113.  
  114.             // Indent according to the depth of the configuration option
  115.             for (iLoop = 0; iLoop < Level; iLoop++)
  116.             {
  117.                 strcat(szNode, "    ");
  118.             }
  119.  
  120.             // Output this node, copying the name of the node to the
  121.             //   szNode variable.
  122.             strcat(szNode, CfgDesc->szNodeName);
  123.             Screen(szNode);
  124.  
  125.             // Process this node if it has sub-nodes
  126.             if (CfgDesc->bHasSubnodes)
  127.             {
  128.                 // Determine if this is a base node
  129.                 if (Level == 0)
  130.                 {
  131.                     sprintf(szNode, "%s%s", CfgPath, CfgDesc->szNodeName);
  132.                 }
  133.                 else // if not a base node
  134.                 {
  135.                     sprintf(szNode, "%s\\%s", CfgPath,
  136.                             CfgDesc->szNodeName);
  137.                 }
  138.  
  139.                 // Recursively call this function to get information about
  140.                 //   sub-nodes.
  141.                 DisplayCfgFile(szNode, (UINT16)(Level + 1));
  142.             }
  143.             else    // No sub-nodes...
  144.             {
  145.                 // Clear the szNode variable
  146.                 szNode[0] = 0;
  147.  
  148.                 // Indent according to the depth of the config option
  149.                 for (iLoop = 0; iLoop <= Level; iLoop++)
  150.                 {
  151.                     strcat(szNode, "    ");
  152.                 }
  153.  
  154.                 // Determine the length of the string
  155.                 BaseSize = (UINT16)strlen(szNode);
  156.  
  157.                 // Display the remaining information & description
  158.                 sprintf(&szNode[BaseSize], "Desc: %s",
  159.                         CfgDesc->szDescription);
  160.                 Screen(szNode);
  161.  
  162.                 // Display the type of the node
  163.                 sprintf(&szNode[BaseSize], "Type: %d",
  164.                         CfgDesc->iDataType);
  165.                 Screen(szNode);
  166.  
  167.                 // Display the value of the node
  168.                 sprintf(&szNode[BaseSize], " Val: %s", CfgDesc->szValue);
  169.                 Screen(szNode);
  170.             }
  171.  
  172.             // Initialize descriptor to 0
  173.             memset((void *) CfgDesc, 0, sizeof(CFGDesc));
  174.         }
  175.  
  176.         // Clean up
  177.         free(szNode);
  178.         free((pCHAR)CfgDesc);
  179.         if (hCur)
  180.         {
  181.             rslt = DbiCloseCursor(&hCur);
  182.             ChkRslt(rslt, "CloseCursor");
  183.         }
  184.     }
  185. }
  186.