/*++ Copyright (C) Microsoft Corporation, 1997 - 1997 All rights reserved. Module Name: driverif.hxx Abstract: Driver Info Class Author: Steve Kiraly (SteveKi) 23-Jan-1997 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop #include "psetup.hxx" #include "drvsetup.hxx" #include "driverif.hxx" #include "compinfo.hxx" /******************************************************************** Server Driver Information. ********************************************************************/ TDriverInfo:: TDriverInfo( IN EType eType, IN UINT uLevel, IN PVOID pInfo ) : _uLevel( uLevel ), _eType( eType ), _dwVersion ( 0 ), _pszDependentFiles( NULL ) { DBGMSG( DBG_NONE, ( "TDriverInfo::ctor\n" ) ); TStatusB bStatus; // // Copy the driver info level 2 information. // if( _uLevel >= 2 ) { // // Convert pointer to a usable pointer. // PDRIVER_INFO_2 pInfo2 = reinterpret_cast( pInfo ); _dwVersion = pInfo2->cVersion; bStatus DBGCHK = _strName.bUpdate( pInfo2->pName ); bStatus DBGCHK = _strEnv.bUpdate( pInfo2->pEnvironment ); bStatus DBGCHK = _strDriverPath.bUpdate( pInfo2->pDriverPath ); bStatus DBGCHK = _strDataFile.bUpdate( pInfo2->pDataFile ); bStatus DBGCHK = _strConfigFile.bUpdate( pInfo2->pConfigFile ); // // Build the environment and verison string. // bStatus DBGCHK = bEnvironmentToString( _strEnv, _strEnvironment ); bStatus DBGCHK = bVersionToString( _dwVersion, _strVersion ); } if( _uLevel == 3 ) { // // Convert pointer to a usable pointer. // PDRIVER_INFO_3 pInfo3 = reinterpret_cast( pInfo ); // // Copy the info level 3 specific code. // bStatus DBGCHK = _strHelpFile.bUpdate( pInfo3->pHelpFile ); bStatus DBGCHK = _strMonitorName.bUpdate( pInfo3->pMonitorName ); bStatus DBGCHK = _strDefaultDataType.bUpdate( pInfo3->pDefaultDataType ); // // Copy the dependent files. // bStatus DBGCHK = bCopyMultizString( &_pszDependentFiles, pInfo3->pDependentFiles ); } } TDriverInfo:: TDriverInfo( const TDriverInfo &rhs ) : _uLevel( 0 ), _eType( kError ), _dwVersion ( 0 ), _pszDependentFiles( NULL ) { (VOID)bClone( rhs ); } const TDriverInfo & TDriverInfo:: operator=( const TDriverInfo &rhs ) { (VOID)bClone( rhs ); return *this; } TDriverInfo:: ~TDriverInfo( VOID ) { DBGMSG( DBG_NONE, ( "TDriverInfo::dtor\n" ) ); // // If we are linked then remove ourself. // if( DriverInfo_bLinked() ) { DriverInfo_vDelinkSelf(); } delete [] _pszDependentFiles; } BOOL TDriverInfo:: bValid( VOID ) const { BOOL bStatus; // // Check if the object is valid. // if( ( _uLevel == 2 || _uLevel == 3 )&& VALID_OBJ( _strVersion ) && VALID_OBJ( _strName ) && VALID_OBJ( _strEnvironment ) && VALID_OBJ( _strDriverPath ) && VALID_OBJ( _strDataFile ) && VALID_OBJ( _strConfigFile ) && VALID_OBJ( _strHelpFile ) && VALID_OBJ( _strMonitorName ) && VALID_OBJ( _strDefaultDataType )&& VALID_OBJ( _strInfName ) && VALID_OBJ( _strEnv ) ) { bStatus = TRUE; } else { bStatus = FALSE; } return bStatus; } VOID TDriverInfo:: vPrint( VOID ) const { #if DBG DBGMSG( DBG_NONE, ( "DriverInfo %x\n", this ) ); if( !bValid() ) { DBGMSG( DBG_NONE, ( "DriverInfo object is invalid %x\n", this ) ); } else { DBGMSG( DBG_TRACE, ( "uLevel %d\n", _uLevel ) ); DBGMSG( DBG_TRACE, ( "eType %d\n", _eType ) ); DBGMSG( DBG_TRACE, ( "dwVerison %d\n", _dwVersion ) ); DBGMSG( DBG_TRACE, ( "_strEnv " TSTR "\n", (LPCTSTR)_strEnv ) ); DBGMSG( DBG_TRACE, ( "strVersion " TSTR "\n", (LPCTSTR)_strVersion ) ); DBGMSG( DBG_TRACE, ( "strName " TSTR "\n", (LPCTSTR)_strName ) ); DBGMSG( DBG_TRACE, ( "strEnvironment " TSTR "\n", (LPCTSTR)_strEnvironment ) ); DBGMSG( DBG_TRACE, ( "strDriverPath " TSTR "\n", (LPCTSTR)_strDriverPath ) ); DBGMSG( DBG_TRACE, ( "strDataFile " TSTR "\n", (LPCTSTR)_strDataFile ) ); DBGMSG( DBG_TRACE, ( "strConfigFile " TSTR "\n", (LPCTSTR)_strConfigFile ) ); DBGMSG( DBG_TRACE, ( "strHelpFile " TSTR "\n", (LPCTSTR)_strHelpFile ) ); DBGMSG( DBG_TRACE, ( "strMonitorName " TSTR "\n", (LPCTSTR)_strMonitorName ) ); DBGMSG( DBG_TRACE, ( "strDefaultDataType " TSTR "\n", (LPCTSTR)_strDefaultDataType ) ); DBGMSG( DBG_TRACE, ( "strInfName " TSTR "\n", (LPCTSTR)_strInfName ) ); for( LPCTSTR psz = _pszDependentFiles; psz && *psz; psz += _tcslen( psz ) + 1 ) { DBGMSG( DBG_TRACE, ( "_pszDependentFiles " TSTR "\n", psz ) ); } } #endif } VOID TDriverInfo:: vSetInfoState( EType eType ) { _eType = eType; } TDriverInfo::EType TDriverInfo:: vGetInfoState( VOID ) const { return _eType; } LPCTSTR TDriverInfo:: strDependentFiles( VOID ) { return _pszDependentFiles ? _pszDependentFiles : gszNULL; } INT TDriverInfo:: operator==( const TDriverInfo &rhs ) const { DBGMSG( DBG_NONE, ( "TDriverInfo::operator ==\n" ) ); return _strName == rhs._strName && _strEnv == rhs._strEnv && _dwVersion == rhs._dwVersion; } INT TDriverInfo:: operator>( const TDriverInfo &rhs ) const { DBGMSG( DBG_TRACE, ( "TDriverInfo::operator >\n" ) ); BOOL bRetval = 0; if( _eType > rhs._eType ) { bRetval = 1; } else if( _eType == rhs._eType ) { if( _dwVersion > rhs._dwVersion ) { bRetval = 1; } else if( _dwVersion == rhs._dwVersion ) { // // The environment string check is case sensitive. // INT iResult = _tcscmp( _strEnv, rhs._strEnv ); if( iResult > 0 ) { bRetval = 1; } else if( iResult == 0 ) { iResult = _tcsicmp( _strName, rhs._strName ); if( iResult > 0 ) { bRetval = 1; } } } } return bRetval; } /******************************************************************** Drivers Info - private member functions. ********************************************************************/ BOOL TDriverInfo:: bClone( const TDriverInfo &rhs ) { DBGMSG( DBG_NONE, ( "TDriverInfo::bClone\n" ) ); TStatusB bStatus; if( this == &rhs ) { DBGMSG( DBG_WARN, ( "Clone of self\n" ) ); bStatus DBGNOCHK = TRUE; } else { // // Initialize the simple types. // _uLevel = rhs._uLevel; _eType = rhs._eType; _dwVersion = rhs._dwVersion; // // If we are linked then remove ourself. // if( DriverInfo_bLinked() ) { DriverInfo_vDelinkSelf(); } // // Release any existing dependent file pointer. // if( _pszDependentFiles ) { delete _pszDependentFiles; _pszDependentFiles = NULL; } // // Make a copy of the dependent file multiz string. A null dependent file // pointer only indicates there is not any dependent file information. // bStatus DBGCHK = bCopyMultizString( &_pszDependentFiles, rhs._pszDependentFiles ); // // Copy the other information strings. // bStatus DBGCHK = _strName.bUpdate( rhs._strName ); bStatus DBGCHK = _strVersion.bUpdate( rhs._strVersion ); bStatus DBGCHK = _strEnvironment.bUpdate( rhs._strEnvironment ); bStatus DBGCHK = _strDriverPath.bUpdate( rhs._strDriverPath ); bStatus DBGCHK = _strDataFile.bUpdate( rhs._strDataFile ); bStatus DBGCHK = _strConfigFile.bUpdate( rhs._strConfigFile ); bStatus DBGCHK = _strHelpFile.bUpdate( rhs._strHelpFile ); bStatus DBGCHK = _strMonitorName.bUpdate( rhs._strMonitorName ); bStatus DBGCHK = _strDefaultDataType.bUpdate( rhs._strDefaultDataType ); bStatus DBGCHK = _strEnv.bUpdate( rhs._strEnv ); } return bValid(); } BOOL TDriverInfo:: bVersionToString( IN DWORD dwVersion, IN OUT TString &strVersion ) const { BOOL bStatus = FALSE; UINT uVersionResourceId; switch( dwVersion ) { case kDriverVersion0: if( !_tcscmp( _strEnv, ENVIRONMENT_WINDOWS ) ) uVersionResourceId = IDS_VERSION_WINDOWS_ME; else uVersionResourceId = IDS_VERSION_NT_31; break; case kDriverVersion1: if( !_tcscmp( _strEnv, ENVIRONMENT_POWERPC ) ) uVersionResourceId = IDS_VERSION_351; else uVersionResourceId = IDS_VERSION_35X; break; case kDriverVersion2: if( !_tcscmp( _strEnv, ENVIRONMENT_POWERPC ) || !_tcscmp( _strEnv, ENVIRONMENT_MIPS ) || !_tcscmp( _strEnv, ENVIRONMENT_ALPHA ) ) uVersionResourceId = IDS_VERSION_40; else uVersionResourceId = IDS_VERSION_40_50; break; case kDriverVersion3: if( !_tcscmp( _strEnv, ENVIRONMENT_IA64 ) ) uVersionResourceId = IDS_VERSION_51; else uVersionResourceId = IDS_VERSION_50_51; break; default: uVersionResourceId = IDS_ARCH_UNKNOWN; break; } bStatus = strVersion.bLoadString( ghInst, uVersionResourceId ); return bStatus; } BOOL TDriverInfo:: bEnvironmentToString( IN LPCTSTR pszEnv, IN OUT TString &strVersion ) const { TStatusB bStatus; if( !_tcscmp( ENVIRONMENT_INTEL, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_INTEL ); else if( !_tcscmp( ENVIRONMENT_MIPS, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_MIPS ); else if( !_tcscmp( ENVIRONMENT_ALPHA, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_ALPHA ); else if( !_tcscmp( ENVIRONMENT_POWERPC, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_POWERPC ); else if( !_tcscmp( ENVIRONMENT_WINDOWS, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_INTEL ); else if( !_tcscmp( ENVIRONMENT_IA64, pszEnv ) ) bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_IA64 ); else bStatus DBGCHK = strVersion.bLoadString( ghInst, IDS_ARCH_UNKNOWN ); return bStatus; } /******************************************************************** DriverTransfer class. ********************************************************************/ TDriverTransfer:: TDriverTransfer( VOID ) : _cDriverInfo( 0 ) { DBGMSG( DBG_NONE, ( "TDriverTransfer::ctor\n" ) ); DriverInfoList_vReset(); } TDriverTransfer:: ~TDriverTransfer( VOID ) { DBGMSG( DBG_NONE, ( "TDriverTransfer::dtor\n" ) ); // // Release everything from the driver info list. // TIter Iter; TDriverInfo *pDriverInfo; DriverInfoList_vIterInit( Iter ); for( Iter.vNext(); Iter.bValid(); ) { pDriverInfo = DriverInfoList_pConvert( Iter ); Iter.vNext(); delete pDriverInfo; } }