|
|
/******************************************************************
VolumeQuotaSettings.CPP -- WMI provider class implementation
Description: Implementation of the methods of an association class
Between QuotaSettings and LogicalDisk
Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved ******************************************************************/ #include "precomp.h"
#include "VolumeQuotaSetting.h"
CVolumeQuotaSetting MyCVolumeQuotaSetting (
IDS_VolumeQuotaSetting , NameSpace ) ;
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::CVolumeQuotaSetting * * DESCRIPTION : Constructor * * COMMENTS : Calls the Provider constructor. * *****************************************************************************/
CVolumeQuotaSetting :: CVolumeQuotaSetting (
LPCWSTR lpwszName, LPCWSTR lpwszNameSpace
) : Provider ( lpwszName , lpwszNameSpace ) { }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::~CVolumeQuotaSetting * * DESCRIPTION : Destructor * * COMMENTS : * *****************************************************************************/
CVolumeQuotaSetting :: ~CVolumeQuotaSetting () { }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::EnumerateInstances * * DESCRIPTION : Returns all the instances of this class. * *****************************************************************************/ HRESULT CVolumeQuotaSetting :: EnumerateInstances (
MethodContext *pMethodContext, long lFlags ) { HRESULT hRes = WBEM_S_NO_ERROR;
hRes = EnumerateAllVolumeQuotas ( pMethodContext );
return hRes; }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::GetObject * * DESCRIPTION : Find a single instance based on the key properties for the * class. * *****************************************************************************/ HRESULT CVolumeQuotaSetting :: GetObject (
CInstance *pInstance, long lFlags , CFrameworkQuery &Query ) { HRESULT hRes = WBEM_S_NO_ERROR; // Not doing anything here, since the two properties which are in the object
CHString t_Key1; CHString t_Key2;
if ( pInstance->GetCHString ( IDS_Setting, t_Key1 ) == FALSE ) hRes = WBEM_E_FAILED;
if ( SUCCEEDED ( hRes ) ) { if ( pInstance->GetCHString ( IDS_LogicalDisk, t_Key2 ) == FALSE ) { hRes = WBEM_E_FAILED; } }
if ( SUCCEEDED ( hRes ) ) { // If the Drive is not as Logical Disks then GetVolume Method will return False;
WCHAR w_Drive1; WCHAR w_Drive2;
hRes = m_CommonRoutine.GetVolume ( t_Key1, w_Drive1 ); if (SUCCEEDED ( hRes ) ) { hRes = m_CommonRoutine.GetVolume ( t_Key2, w_Drive2 ); if (SUCCEEDED ( hRes ) ) { if ( w_Drive1 == w_Drive2 ) { // verify this logical drives actually exists
CHString t_DriveStrings1; CHString t_DriveStrings2; LPWSTR lpDriveStrings = t_DriveStrings1.GetBuffer ( MAX_PATH + 1 );
DWORD dwDLength = GetLogicalDriveStrings ( MAX_PATH, lpDriveStrings );
if ( dwDLength > MAX_PATH ) { lpDriveStrings = t_DriveStrings2.GetBuffer ( dwDLength + 1 ); dwDLength = GetLogicalDriveStrings ( dwDLength, lpDriveStrings ); }
hRes = m_CommonRoutine.SearchLogicalDisk ( w_Drive1, lpDriveStrings ); } else { hRes = WBEM_E_INVALID_PARAMETER; } } } } return hRes; }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::ExecQuery * * DESCRIPTION : You are passed a method context to use in the creation of * instances that satisfy the query, and a CFrameworkQuery * which describes the query. Create and populate all * instances which satisfy the query. You may return more * instances or more properties than are requested and WinMgmt * will post filter out any that do not apply. * *****************************************************************************/
HRESULT CVolumeQuotaSetting :: ExecQuery (
MethodContext *pMethodContext, CFrameworkQuery &Query, long lFlags ) { // Queries involving only one Keyvalue VolumeObjectPath is implemented. Query involving the UserObjectPath is not
// implemented. Since for this we will have to have to enumerate all the volumes until a user is found.
HRESULT hRes = WBEM_S_NO_ERROR; CHStringArray t_Values;
// Now a check for the LogicalDIsk attribute which if present in where clause the query optimization is supported
hRes = Query.GetValuesForProp( IDS_Setting, t_Values );
if ( SUCCEEDED ( hRes ) ) { if ( t_Values.GetSize() == 0 ) { hRes = Query.GetValuesForProp( IDS_LogicalDisk, t_Values );
if ( SUCCEEDED ( hRes ) ) { if ( t_Values.GetSize() == 0 ) { //Let Winmgmt handle this, since anyway all the volumes will be enumerated.
hRes = WBEM_E_PROVIDER_NOT_CAPABLE; } } } }
if ( SUCCEEDED ( hRes ) ) { int iSize = t_Values.GetSize ();
// In this loop picking up one by one the VolumePath, getting the properties of those volumepath
for ( int i = 0; i < iSize; i++ ) { WCHAR w_Drive;
hRes = m_CommonRoutine.GetVolume ( t_Values.GetAt(i), w_Drive );
if ( SUCCEEDED ( hRes ) ) { CHString t_VolumePath; CHString t_DeviceId; // In this loop I need to parse the object path
t_VolumePath.Format ( L"%c%s", w_Drive, L":\\" );
// Forming a Logical Disk Key Value
t_DeviceId.Format( L"%c%c", w_Drive, _L(':') );
hRes = PutNewInstance ( t_DeviceId.GetBuffer ( t_DeviceId.GetLength() + 1) , t_VolumePath.GetBuffer( t_VolumePath.GetLength() + 1), pMethodContext );
if ( FAILED (hRes) ) { break; } } // otherwise continue with thenext drive
} } return hRes; }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::EnumerateAllVolumeQuotas * * DESCRIPTION : Enumerates all the volumes that supports disk Quotas * *****************************************************************************/
HRESULT CVolumeQuotaSetting::EnumerateAllVolumeQuotas ( MethodContext *pMethodContext ) { HRESULT hRes = WBEM_S_NO_ERROR; // verify this logical drives actually exists
CHString t_DriveStrings1; CHString t_DriveStrings2; LPWSTR lpDriveStrings = t_DriveStrings1.GetBuffer ( MAX_PATH + 1 );
DWORD dwDLength = GetLogicalDriveStrings ( MAX_PATH, lpDriveStrings );
if ( dwDLength > MAX_PATH ) { lpDriveStrings = t_DriveStrings2.GetBuffer ( dwDLength + 1 ); dwDLength = GetLogicalDriveStrings ( dwDLength, lpDriveStrings ); }
// Here for every drive, getting a volumePath for Win32_DiskVolume Class and DeviceId for Logical Disk Class
LPWSTR lpTempDriveStrings; CHString t_VolumePath; CHString t_DeviceId;
lpTempDriveStrings = lpDriveStrings;
int iLen = lstrlen ( lpTempDriveStrings );
while ( iLen > 0 ) { t_VolumePath = lpTempDriveStrings; t_DeviceId = lpTempDriveStrings;
lpTempDriveStrings = &lpTempDriveStrings [ iLen + 1];
t_DeviceId.SetAt ( t_DeviceId.GetLength() - 1,L'\0' ); iLen = lstrlen ( lpTempDriveStrings );
hRes = PutNewInstance ( t_DeviceId.GetBuffer ( t_DeviceId.GetLength() + 1), t_VolumePath.GetBuffer ( t_VolumePath.GetLength() + 1), pMethodContext);
if ( FAILED ( hRes ) ) break; }
return hRes; }
/*****************************************************************************
* * FUNCTION : CVolumeQuotaSetting::PutNewInstance * * DESCRIPTION : Sets the properties into a new instance * *****************************************************************************/
HRESULT CVolumeQuotaSetting::PutNewInstance ( LPWSTR a_DeviceId, LPWSTR a_VolumePath, MethodContext *pMethodContext ) { HRESULT hRes = WBEM_S_NO_ERROR; LPWSTR lpTempVolumePath; LPWSTR lpTempDeviceID;
m_CommonRoutine.MakeObjectPath ( lpTempVolumePath, IDS_DiskVolumeClass, IDS_VolumePath, a_VolumePath ); m_CommonRoutine.MakeObjectPath ( lpTempDeviceID, IDS_LogicalDiskClass, IDS_DeviceID, a_DeviceId );
if ( ( lpTempVolumePath != NULL ) && ( lpTempDeviceID != NULL ) ) { try { CInstancePtr pInstance = CreateNewInstance ( pMethodContext ) ;
if ( pInstance->SetCHString ( IDS_LogicalDisk, lpTempDeviceID ) ) { if ( pInstance->SetCHString ( IDS_Setting, lpTempVolumePath ) ) { hRes = pInstance->Commit (); } else { hRes = WBEM_E_FAILED; } } else { hRes = WBEM_E_FAILED; } } catch ( ... ) { delete [] lpTempVolumePath; lpTempVolumePath = NULL; delete [] lpTempDeviceID; lpTempDeviceID = NULL; throw; } if ( lpTempVolumePath != NULL ) { delete [] lpTempVolumePath; }
if ( lpTempDeviceID != NULL ) { delete [] lpTempDeviceID; } } return hRes; }
|