home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ocl150a.zip / OCL / Source / OSysInfoVio.cpp < prev    next >
C/C++ Source or Header  |  1996-08-12  |  10KB  |  379 lines

  1. // OCL - OS/2 Class Library
  2. // (c) Cubus 1995
  3. // All Rights Reserved
  4. // OSysInfoVIO.cpp
  5. // System Utility Functions
  6.  
  7. // class member functions
  8.  
  9.  
  10. /*
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Neither the name Cubus nor the name Team OCL may be used to
  17.  *    endorse or promote products derived from this software
  18.  *    without specific prior written permission.
  19.  * 3. See OCL.INF for a detailed copyright notice.
  20.  *
  21.  *              THIS SOFTWARE IS PROVIDED ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. // $Header: W:/Projects/OCL/Source/rcs/OSysInfoVio.cpp 1.50 1996/08/11 23:49:32 B.STEIN Release $
  35.  
  36. #define __OCL_SOURCE__
  37.  
  38. #define OINCL_OSTRING
  39. #define OINCL_BASE
  40.  
  41. #include <ocl.hpp>
  42. #include <OSysInfo.hpp>
  43.  
  44. // Class OSysInfo
  45.  
  46.  
  47. OSysInfoVIO::OSysInfoVIO()
  48.   {}
  49.  
  50.  
  51. OSysInfoVIO::~OSysInfoVIO()
  52. {
  53.  SysInfoList.reset();
  54. }
  55.  
  56.  
  57. PSZ OSysInfoVIO::isOfType() const
  58.  return("OSysInfoVIO"); 
  59. }
  60.  
  61.  
  62. BOOL OSysInfoVIO::getDrives()
  63. {
  64.  ULONG   DriveNumber;
  65.  ULONG   LogicalDriveMap;
  66.  UCHAR   Drive[] = "C:";
  67.  ULONG   Temp;
  68.  HFILE   hfDiskHandle;
  69.  ULONG   Action;
  70.  CHAR    LABEL[30], tLABEL[30];
  71.  
  72.  if (DosQueryCurrentDisk(&DriveNumber, &LogicalDriveMap))
  73.     return(FALSE);
  74.  
  75.  for(Temp=(ULONG)Drive[0]-'A', LogicalDriveMap>>=2;
  76.      Temp<=(ULONG)('Z'-'A');
  77.      Temp++, Drive[0]++, LogicalDriveMap>>=1)
  78.       {
  79.        if(!(LogicalDriveMap&0x1))
  80.           continue;
  81.  
  82.        if (!DosOpen((PSZ)Drive, &hfDiskHandle, &Action, 0, FILE_NORMAL,
  83.                     OPEN_ACTION_OPEN_IF_EXISTS, OPEN_FLAGS_DASD |
  84.                     OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
  85.                     OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READONLY, 0))
  86.            {
  87.             struct _PPF
  88.              {
  89.               BYTE        bCommandInformation;
  90.               BYTE        bDriveUnit;
  91.              } PPF={0, 0};
  92.  
  93.             struct _DDF
  94.              {
  95.               BYTE        bData;
  96.              } DDF;
  97.  
  98.             ULONG       ulParamLengthInOut=sizeof(PPF);
  99.             ULONG       ulDataLengthInOut=sizeof(DDF);
  100.  
  101.             DosDevIOCtl(hfDiskHandle, IOCTL_DISK, DSK_BLOCKREMOVABLE,
  102.                         &PPF, ulParamLengthInOut, &ulParamLengthInOut,
  103.                         &DDF, ulDataLengthInOut, &ulDataLengthInOut);
  104.             DosClose(hfDiskHandle);
  105.             if(DDF.bData)
  106.               {
  107.                if (!DosQueryFSInfo(Drive[0]-'@', FSIL_VOLSER, tLABEL, sizeof(tLABEL)))
  108.                 sprintf(LABEL, " [%s]", &tLABEL[5]);
  109.               else
  110.                 strcpy(LABEL, " [ ]"); 
  111.              }
  112.            else
  113.               strcpy(LABEL, " [ ]");
  114.            SysInfoVar << (PSZ) Drive;
  115.            SysInfoVar + (PSZ) LABEL;
  116.            SysInfoList << SysInfoVar;
  117.           }
  118.      }
  119.  
  120.  return(TRUE);
  121. }
  122.  
  123.  
  124.  
  125. BOOL OSysInfoVIO::getAllDrives()
  126. {
  127.  ULONG   DriveNumber;
  128.  ULONG   LogicalDriveMap;
  129.  UCHAR   Drive[] = "C:";
  130.  ULONG   Temp;
  131.  HFILE   hfDiskHandle;
  132.  ULONG   Action;
  133.  CHAR    LABEL[30], tLABEL[30];
  134.  
  135.  if (DosQueryCurrentDisk(&DriveNumber, &LogicalDriveMap))
  136.     return(FALSE);
  137.  
  138.  for(Temp=(ULONG)Drive[0]-'A', LogicalDriveMap>>=2;
  139.      Temp<=(ULONG)('Z'-'A');
  140.      Temp++, Drive[0]++, LogicalDriveMap>>=1)
  141.       {
  142.        if(!(LogicalDriveMap&0x1))
  143.           continue;
  144.  
  145.        if (!DosOpen((PSZ)Drive, &hfDiskHandle, &Action, 0, FILE_NORMAL,
  146.                     OPEN_ACTION_OPEN_IF_EXISTS, OPEN_FLAGS_DASD |
  147.                     OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
  148.                     OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READONLY, 0))
  149.            {
  150.             struct _PPF
  151.              {
  152.               BYTE        bCommandInformation;
  153.               BYTE        bDriveUnit;
  154.              } PPF={0, 0};
  155.  
  156.             struct _DDF
  157.              {
  158.               BYTE        bData;
  159.              } DDF;
  160.  
  161.             ULONG       ulParamLengthInOut=sizeof(PPF);
  162.             ULONG       ulDataLengthInOut=sizeof(DDF);
  163.  
  164.             DosDevIOCtl(hfDiskHandle, IOCTL_DISK, DSK_BLOCKREMOVABLE,
  165.                         &PPF, ulParamLengthInOut, &ulParamLengthInOut,
  166.                         &DDF, ulDataLengthInOut, &ulDataLengthInOut);
  167.             DosClose(hfDiskHandle);
  168.             if(DDF.bData)
  169.               {
  170.                if (!DosQueryFSInfo(Drive[0]-'@', FSIL_VOLSER, tLABEL, sizeof(tLABEL)))
  171.                 sprintf(LABEL, " [%s]", &tLABEL[5]);
  172.                else
  173.                 strcpy(LABEL, " [ ]"); 
  174.              }
  175.            else
  176.               strcpy(LABEL, " [ ]");
  177.            SysInfoVar << (PSZ) Drive;
  178.            SysInfoVar + (PSZ) LABEL;
  179.            SysInfoList << SysInfoVar;
  180.           }
  181.       else
  182.        {  
  183.         strcpy(LABEL, " [ ]");
  184.         SysInfoVar << (PSZ) Drive;
  185.         SysInfoVar + (PSZ) LABEL;
  186.         SysInfoList << SysInfoVar;
  187.        }
  188.      }
  189.  
  190.  return(TRUE);
  191. }
  192.  
  193. // check if "Drive" is a non-removable local drive
  194.  
  195. BOOL OSysInfoVIO::checkRemovable(PCSZ Drive)
  196. {
  197.  HFILE    hfDiskHandle;
  198.  ULONG    Action;
  199.  OString  drive((PSZ)Drive);
  200.  
  201.  if (!DosOpen(drive, &hfDiskHandle, &Action, 0, FILE_NORMAL,
  202.               OPEN_ACTION_OPEN_IF_EXISTS, OPEN_FLAGS_DASD |
  203.               OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NOINHERIT |
  204.               OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READONLY, 0))
  205.    {
  206.     struct _PPF
  207.       {
  208.        BYTE        bCommandInformation;
  209.        BYTE        bDriveUnit;
  210.       } PPF={0, 0};
  211.  
  212.     struct _DDF
  213.       {
  214.        BYTE        bData;
  215.       } DDF;
  216.  
  217.      ULONG       ulParamLengthInOut=sizeof(PPF);
  218.      ULONG       ulDataLengthInOut=sizeof(DDF);
  219.  
  220.      DosDevIOCtl(hfDiskHandle, IOCTL_DISK, DSK_BLOCKREMOVABLE,
  221.                  &PPF, ulParamLengthInOut, &ulParamLengthInOut,
  222.                  &DDF, ulDataLengthInOut, &ulDataLengthInOut);
  223.      DosClose(hfDiskHandle);
  224.      if (DDF.bData) return(TRUE);
  225.   }
  226.  return(FALSE);
  227. }
  228.  
  229.  
  230. // get var from system environment
  231.  
  232. BOOL OSysInfoVIO::getEnv(PCSZ env)
  233. {
  234.  PCSZ Buffer = "";
  235.  
  236.  if(DosScanEnv(env, &Buffer))
  237.     return(FALSE);
  238.  else
  239.    {
  240.     SysInfoVar << (PSZ) Buffer;
  241.     return(TRUE);
  242.    }
  243. }
  244.  
  245.  
  246. // get boot drive
  247.  
  248. BOOL OSysInfoVIO::getBootDrive()
  249. {
  250.  ULONG      ulDrive;
  251.  UCHAR      Buffer[10];
  252.  
  253.  memset(&Buffer, 0, sizeof(Buffer));
  254.  
  255.  if(DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE, &ulDrive, sizeof(ulDrive)))
  256.    return(FALSE);
  257.  else
  258.    {
  259.     Buffer[0] = (char) (ulDrive + 'A' - 1 ) ;
  260.     Buffer[1] = ':';
  261.     Buffer[2] = '\0';
  262.     SysInfoVar << (PSZ) Buffer;
  263.     return(TRUE);
  264.    }
  265. }
  266.  
  267.  
  268. // get an env string from config.sys
  269.  
  270. BOOL OSysInfoVIO::getCfgEnv(PSZ env)
  271. {
  272.  ifstream config;
  273.  PSZ      Buffer;
  274.  OString  a(env);
  275.  
  276.  strupr(a);
  277.  
  278.  if (DosAllocMem((PPVOID) &Buffer,  0x0000ffffL, PAG_READ | PAG_WRITE | PAG_COMMIT))
  279.    return(FALSE);
  280.  
  281.  if (getBootDrive())
  282.    {
  283.     SysInfoVar + (PSZ) "\\CONFIG.SYS";
  284.     config.open(SysInfoVar);
  285.     if (config.rdbuf())
  286.      {
  287.       while (config.getline(Buffer, 0x0000ffffL))
  288.        {
  289.         OString b(strupr(Buffer));
  290.  
  291.         if (strstr(b, a))
  292.          {
  293.           config.close();
  294.           SysInfoVar << Buffer;
  295.           DosFreeMem(Buffer);
  296.           return(TRUE);
  297.          }
  298.        }
  299.       config.close();
  300.      }
  301.    }
  302.  
  303.  DosFreeMem(Buffer);
  304.  
  305.  return(FALSE);
  306. }
  307.  
  308.  
  309. // find a file in path
  310.  
  311. BOOL OSysInfoVIO::findPathFile(PCSZ file)
  312. {
  313.  BYTE  Buffer[CCHMAXPATH];
  314.  
  315.  if (getEnv("PATH")) {
  316.    if (!DosSearchPath(SEARCH_CUR_DIRECTORY, SysInfoVar, (PSZ) file, Buffer, sizeof(Buffer))) {
  317.      SysInfoVar << (PSZ) Buffer;
  318.      return(TRUE); }}
  319.  return(FALSE);
  320. }
  321.  
  322. // get OS/2-Version
  323.  
  324. BOOL OSysInfoVIO::getOSVer()
  325. {
  326.  ULONG major;
  327.  ULONG minor;
  328.  CHAR  Buffer[10];
  329.  
  330.  if ((!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MAJOR, &major, sizeof(major))) &&
  331.      (!DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &minor, sizeof(minor))) )
  332.   {
  333.    sprintf(Buffer, "%ld.%ld\0", major/10, minor);
  334.    SysInfoVar << (PSZ) Buffer;
  335.    return(TRUE);
  336.   }
  337.  
  338.  return(FALSE);
  339. }
  340.  
  341.  
  342. BOOL OSysInfoVIO::getOSVer(double& version)
  343. {
  344.  ULONG major;
  345.  ULONG minor;
  346.  
  347.  if ((!DosQuerySysInfo(QSV_VERSION_MAJOR, QSV_VERSION_MAJOR, &major, sizeof(major))) &&
  348.      (!DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &minor, sizeof(minor))) )
  349.   {
  350.    version = minor;
  351.    version /= 100;
  352.    version += major/10;
  353.    return(TRUE);
  354.   }
  355.  return(FALSE);
  356. }
  357.  
  358.  
  359. BOOL OSysInfoVIO::clearRDOnly(PCSZ FileName)
  360. {
  361.  FILESTATUS  FileInfoBuf;
  362.  APIRET        rc=3;
  363.  
  364.  if (!DosQueryPathInfo((PSZ) FileName, 1, &FileInfoBuf, sizeof(FILESTATUS)))
  365.    {
  366.     FileInfoBuf.attrFile = FILE_NORMAL;
  367. #ifdef __BCPLUSPLUS__
  368.     rc = DosSetPathInfo((PSZ)FileName, 1, &FileInfoBuf, sizeof(FILESTATUS), DSPI_WRTTHRU);
  369. #else
  370.     rc = DosSetPathInfo(FileName, 1, &FileInfoBuf, sizeof(FILESTATUS), DSPI_WRTTHRU);
  371. #endif
  372.    }
  373.  return((rc==0) || (rc==2));
  374. }
  375.  
  376.  
  377. // end of source
  378.