//*************************************************************************** // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // // USBHub.cpp // // Purpose: USB Hub property set provider // //*************************************************************************** #include "precomp.h" #include "LPVParams.h" #include #include #include "USBHub.h" // Property set declaration //========================= CWin32USBHub MyUSBHub( PROPSET_NAME_USBHUB, IDS_CimWin32Namespace ); /***************************************************************************** * * FUNCTION : CWin32USBHub::CWin32USBHub * * DESCRIPTION : Constructor * * INPUTS : const CHString& strName - Name of the class. * * OUTPUTS : none * * RETURNS : nothing * * COMMENTS : Registers property set with framework * *****************************************************************************/ CWin32USBHub::CWin32USBHub ( const CHString &a_strName, LPCWSTR a_pszNamespace ) : Provider( a_strName, a_pszNamespace ) { m_ptrProperties.SetSize(11); m_ptrProperties[0] = ( (LPVOID) IDS_ConfigManagerErrorCode ); m_ptrProperties[1] = ( (LPVOID) IDS_ConfigManagerUserConfig ); m_ptrProperties[2] = ( (LPVOID) IDS_Status); m_ptrProperties[3] = ( (LPVOID) IDS_PNPDeviceID); m_ptrProperties[4] = ( (LPVOID) IDS_DeviceID); m_ptrProperties[5] = ( (LPVOID) IDS_SystemCreationClassName); m_ptrProperties[6] = ( (LPVOID) IDS_SystemName); m_ptrProperties[7] = ( (LPVOID) IDS_Description); m_ptrProperties[8] = ( (LPVOID) IDS_Caption); m_ptrProperties[9] = ( (LPVOID) IDS_Name); m_ptrProperties[10] = ( (LPVOID) IDS_CreationClassName ); } /***************************************************************************** * * FUNCTION : CWin32USBHub::~CWin32USBHub * * DESCRIPTION : Destructor * * INPUTS : none * * OUTPUTS : none * * RETURNS : nothing * * COMMENTS : Deregisters property set from framework * ****************************************************************************/ CWin32USBHub::~CWin32USBHub() { } //////////////////////////////////////////////////////////////////////// // // Function: CWin32USBHub::GetObject // // Inputs: CInstance *a_pInst - Instance into which we // retrieve data. // // Outputs: None. // // Returns: HRESULT Success/Failure code. // // Comments: The Calling function will Commit the instance. // //////////////////////////////////////////////////////////////////////// HRESULT CWin32USBHub::GetObject ( CInstance *a_pInst, long a_lFlags, CFrameworkQuery& pQuery ) { HRESULT t_hResult = WBEM_E_NOT_FOUND ; CConfigManager t_cfgmgr ; // Let's see if config manager recognizes this device at all CHString t_sDeviceID ; a_pInst->GetCHString( IDS_DeviceID, t_sDeviceID ) ; CConfigMgrDevicePtr t_pDevice; if( t_cfgmgr.LocateDevice( t_sDeviceID, t_pDevice ) ) { // OK, it knows about it. Is it a USB Hub? if( IsOneOfMe(t_pDevice ) ) { CFrameworkQueryEx *t_pQuery2 = static_cast ( &pQuery ) ; DWORD t_dwProperties ; t_pQuery2->GetPropertyBitMask( m_ptrProperties, &t_dwProperties ) ; t_hResult = LoadPropertyValues( &CLPVParams( a_pInst, t_pDevice, t_dwProperties ) ) ; } } return t_hResult; } //////////////////////////////////////////////////////////////////////// // // Function: CWin32IDE::ExecQuery // // Inputs: MethodContext *a_pMethodContext - Context to enum // instance data in. // CFrameworkQuery& the query object // // Outputs: None. // // Returns: HRESULT Success/Failure code. // // Comments: None. // //////////////////////////////////////////////////////////////////////// HRESULT CWin32USBHub::ExecQuery ( MethodContext *a_pMethodContext, CFrameworkQuery &a_pQuery, long a_lFlags ) { CFrameworkQueryEx *t_pQuery2 = static_cast ( &a_pQuery ) ; DWORD t_dwProperties ; t_pQuery2->GetPropertyBitMask( m_ptrProperties, &t_dwProperties ) ; return Enumerate( a_pMethodContext, a_lFlags, t_dwProperties ) ; } //////////////////////////////////////////////////////////////////////// // // Function: CWin32USBHub::EnumerateInstances // // Inputs: MethodContext *a_pMethodContext - Context to enum // instance data in. // // Outputs: None. // // Returns: HRESULT Success/Failure code. // // Comments: None. // //////////////////////////////////////////////////////////////////////// HRESULT CWin32USBHub::EnumerateInstances ( MethodContext *a_pMethodContext, long a_lFlags /*= 0L*/ ) { return Enumerate( a_pMethodContext, a_lFlags ) ; } //////////////////////////////////////////////////////////////////////// // // Function: CWin32USBHub::Enumerate // // Inputs: MethodContext *a_pMethodContext - Context to enum // instance data in. // // Outputs: None. // // Returns: HRESULT Success/Failure code. // // Comments: None. // //////////////////////////////////////////////////////////////////////// HRESULT CWin32USBHub::Enumerate ( MethodContext *a_pMethodContext, long a_lFlags, DWORD a_dwReqProps ) { HRESULT t_hResult = WBEM_E_FAILED ; CConfigManager t_cfgManager ; CDeviceCollection t_deviceList ; CInstancePtr t_pInst; CConfigMgrDevicePtr t_pDevice; if( t_cfgManager.GetDeviceListFilterByClass( t_deviceList, L"USB" ) ) { REFPTR_POSITION t_pos; if( t_deviceList.BeginEnum( t_pos ) ) { t_hResult = WBEM_S_NO_ERROR; // Walk the list for (t_pDevice.Attach(t_deviceList.GetNext( t_pos )); SUCCEEDED( t_hResult ) && (t_pDevice != NULL); t_pDevice.Attach(t_deviceList.GetNext( t_pos ))) { // Now to find out if this is the usb Hub if( IsOneOfMe( t_pDevice ) ) { t_pInst.Attach(CreateNewInstance( a_pMethodContext ) ); if( SUCCEEDED( t_hResult = LoadPropertyValues( &CLPVParams( t_pInst, t_pDevice, a_dwReqProps ) ) ) ) { // Derived classes (like CW32USBCntrlDev) may // commit as result of call to // LoadPropertyValues, so check if we should // (only do so if we are of this class's type). if( ShouldBaseCommit( NULL ) ) { t_hResult = t_pInst->Commit( ) ; } } } } // Always call EndEnum(). t_deviceList.EndEnum(); } } return t_hResult; } /***************************************************************************** * * FUNCTION : CWin32USBHub::LoadPropertyValues * * DESCRIPTION : Assigns values to properties * * INPUTS : void *a_pv - Instance package to load values into. * * OUTPUTS : * * RETURNS : HRESULT error/success code. * * COMMENTS : * *****************************************************************************/ HRESULT CWin32USBHub::LoadPropertyValues ( void *a_pv ) { HRESULT t_hResult = WBEM_S_NO_ERROR; CHString t_chstrDeviceID, t_chstrDesc, t_chstrTemp; /************************************* * Unpack and confirm our parameters... *************************************/ CLPVParams *t_pData = ( CLPVParams * ) a_pv ; CInstance *t_pInst = ( CInstance * )( t_pData->m_pInstance ) ; // This instance released by caller CConfigMgrDevice *t_pDevice = ( CConfigMgrDevice * )( t_pData->m_pDevice ) ; DWORD t_dwReqProps = ( DWORD )( t_pData->m_dwReqProps ) ; if( t_pInst == NULL || t_pDevice == NULL ) { return WBEM_E_PROVIDER_FAILURE; } /*********************** * Set the key properties ***********************/ t_pDevice->GetDeviceID( t_chstrDeviceID ) ; if( t_chstrDeviceID.GetLength() == 0 ) { // We need the device id for the key property of this class. If we can // not obtain it, we can't set the key, which is an unacceptable error. return WBEM_E_PROVIDER_FAILURE; } else { t_pInst->SetCHString( IDS_DeviceID, t_chstrDeviceID ) ; } /********************************* * Set CIM_LogicalDevice properties *********************************/ if( t_dwReqProps & USBHUB_PROP_PNPDeviceID ) { t_pInst->SetCHString( IDS_PNPDeviceID, t_chstrDeviceID ) ; } if( t_dwReqProps & USBHUB_PROP_SystemCreationClassName ) { t_pInst->SetCHString( IDS_SystemCreationClassName, IDS_Win32ComputerSystem ) ; } if( t_dwReqProps & USBHUB_PROP_CreationClassName ) { SetCreationClassName(t_pInst); } if( t_dwReqProps & USBHUB_PROP_SystemName ) { t_pInst->SetCHString( IDS_SystemName, GetLocalComputerName() ) ; } if( t_dwReqProps & (USBHUB_PROP_Description | USBHUB_PROP_Caption | USBHUB_PROP_Name) ) { if( t_pDevice->GetDeviceDesc( t_chstrDesc ) ) { t_pInst->SetCHString( IDS_Description, t_chstrDesc ) ; } } if( t_dwReqProps & USBHUB_PROP_ConfigManagerErrorCode || t_dwReqProps & USBHUB_PROP_Status ) { DWORD t_dwStatus = 0L; DWORD t_dwProblem = 0L; if( t_pDevice->GetStatus( &t_dwStatus, &t_dwProblem ) ) { if( t_dwReqProps & USBHUB_PROP_ConfigManagerErrorCode ) { t_pInst->SetDWORD( IDS_ConfigManagerErrorCode, t_dwProblem ) ; } if( t_dwReqProps & USBHUB_PROP_Status ) { CHString t_chsTmp; ConfigStatusToCimStatus ( t_dwStatus , t_chsTmp ) ; t_pInst->SetCHString(IDS_Status, t_chsTmp); } } } if( t_dwReqProps & USBHUB_PROP_ConfigManagerUserConfig ) { t_pInst->SetDWORD( IDS_ConfigManagerUserConfig, t_pDevice->IsUsingForcedConfig() ) ; } // Use the friendly name for caption and name if( t_dwReqProps & USBHUB_PROP_Caption || t_dwReqProps & USBHUB_PROP_Name ) { if( t_pDevice->GetFriendlyName( t_chstrTemp ) ) { t_pInst->SetCHString( IDS_Caption, t_chstrTemp ) ; t_pInst->SetCHString( IDS_Name, t_chstrTemp ) ; } else { // If we can't get the name, settle for the description if( t_chstrDesc.GetLength() > 0 ) { t_pInst->SetCHString( IDS_Caption, t_chstrDesc ) ; t_pInst->SetCHString( IDS_Name, t_chstrDesc ) ; } } } return t_hResult; } /***************************************************************************** * * FUNCTION : CWin32USBHub::IsOneOfMe * * DESCRIPTION : Checks to make sure pDevice is a hub and not some * other type of USB device. * * INPUTS : void *a_pv - The device to check. * * OUTPUTS : * * RETURNS : HRESULT error/success code. * * COMMENTS : * *****************************************************************************/ bool CWin32USBHub::IsOneOfMe ( void *a_pv ) { bool t_fRet = false; if( NULL != a_pv ) { CConfigMgrDevice *t_pDevice = ( CConfigMgrDevice * ) a_pv ; // Is it a usb device? if( t_pDevice->IsClass( L"USB" ) ) { // Now to find out if this is a usb hub CConfigMgrDevicePtr t_pParentDevice; if( t_pDevice->GetParent( t_pParentDevice ) ) { if( t_pParentDevice->IsClass( L"USB" ) ) { t_fRet = true ; } } } } return t_fRet; }