extern "C" HRESULT DAPI Iis7GetPropertyVariant( __in IAppHostElement *pElement, __in LPCWSTR wzPropName, __in VARIANT* vtGet ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; BSTR bstrPropName = NULL; bstrPropName = ::SysAllocString(wzPropName); ExitOnNull(bstrPropName, hr, E_OUTOFMEMORY, "failed SysAllocString"); hr = pElement->GetPropertyByName(bstrPropName, &pProperty); ExitOnFailure1(hr, "Failed to get property object for %ls", wzPropName); hr = pProperty->get_Value(vtGet); ExitOnFailure1(hr, "Failed to get property value for %ls", wzPropName); LExit: ReleaseBSTR(bstrPropName); // caller responsible for cleaning up variant vtGet ReleaseObject(pProperty); return hr; }
HRESULT CModuleConfiguration::GetDWORD(IAppHostElement* section, LPCWSTR propertyName, DWORD* value) { HRESULT hr = S_OK; BSTR sysPropertyName = NULL; IAppHostProperty* prop = NULL; VARIANT var; CheckNull(value); *value = 0; VariantInit(&var); ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY); CheckError(section->GetPropertyByName(sysPropertyName, &prop)); CheckError(prop->get_Value(&var)); CheckError(VariantChangeType(&var, &var, 0, VT_UI4)); *value = var.ulVal; Error: VariantClear(&var); if ( sysPropertyName ) { SysFreeString(sysPropertyName); sysPropertyName = NULL; } if (prop) { prop->Release(); prop = NULL; } return hr; }
HRESULT MODSECURITY_STORED_CONTEXT::GetStringPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, WCHAR** ppszValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; DWORD dwLength; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( ppszValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } *ppszValue = NULL; // Get the property object for the string attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: dwLength = SysStringLen( vPropertyValue.bstrVal ); *ppszValue = new WCHAR[ dwLength + 1 ]; if ( (*ppszValue) == NULL ) { hr = E_OUTOFMEMORY; goto Failure; } wcsncpy( *ppszValue, vPropertyValue.bstrVal, dwLength ); (*ppszValue)[ dwLength ] = L'\0'; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; }
HRESULT MODSECURITY_STORED_CONTEXT::GetTimeSpanPropertyValue( IAppHostElement* pElement, WCHAR* pszPropertyName, IAppHostPropertyException** pException, ULONGLONG* pnValue ) { HRESULT hr = S_OK; IAppHostProperty *pProperty = NULL; VARIANT vPropertyValue; if ( ( pElement == NULL ) || ( pszPropertyName == NULL ) || ( pException == NULL ) || ( pnValue == NULL ) ) { hr = E_INVALIDARG; goto Failure; } // Get the property object for the INT attribute: hr = pElement->GetPropertyByName( pszPropertyName, &pProperty ); if ( FAILED( hr ) ) { goto Failure; } if ( pProperty == NULL ) { hr = E_UNEXPECTED; goto Failure; } // Get the attribute value: VariantInit( &vPropertyValue ); hr = pProperty->get_Value( &vPropertyValue ); if ( FAILED( hr ) ) { goto Failure; } // See it there is an exception that might be due to the actual value in the // config not meeting validation criteria *pException = NULL; hr = pProperty->get_Exception( pException ); if ( FAILED( hr ) ) { goto Failure; } // No need to continue if we got an exception... if ( ( *pException ) != NULL ) { goto Failure; } // Finally, get the value: *pnValue = vPropertyValue.ullVal; Failure: VariantClear( &vPropertyValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; }
REQUEST_NOTIFICATION_STATUS OnSendResponse( IN IHttpContext * pHttpContext, IN ISendResponseProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); pMgr = NULL; pParentElem = NULL; pElemColl = NULL; pElem = NULL; pElemProps = NULL; pElemProp = NULL; hr = S_OK; bstrConfigCommitPath = SysAllocString( L"MACHINE/WEBROOT/APPHOST" ); bstrSectionName = SysAllocString( L"system.webServer/stripHeaders" ); bstrPropertyName = SysAllocString( L"name" ); dwElementCount = 0; vtPropertyName.vt = VT_BSTR; vtPropertyName.bstrVal = bstrPropertyName; // Initialize hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } // Create hr = CoCreateInstance( __uuidof( AppHostAdminManager ), NULL, CLSCTX_INPROC_SERVER, __uuidof( IAppHostAdminManager ), (void**) &pMgr ); if( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the admin section hr = pMgr->GetAdminSection( bstrSectionName, bstrConfigCommitPath, &pParentElem ); if ( FAILED( hr ) || ( &pParentElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the site collection hr = pParentElem->get_Collection( &pElemColl ); if ( FAILED ( hr ) || ( &pElemColl == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the elements hr = pElemColl->get_Count( &dwElementCount ); for ( USHORT i = 0; i < dwElementCount; i++ ) { VARIANT vtItemIndex; vtItemIndex.vt = VT_I2; vtItemIndex.iVal = i; // Add a new section group hr = pElemColl->get_Item( vtItemIndex, &pElem ); if ( FAILED( hr ) || ( &pElem == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Get the child elements hr = pElem->get_Properties( &pElemProps ); if ( FAILED( hr ) || ( &pElemProps == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProps->get_Item( vtPropertyName, &pElemProp ); if ( FAILED( hr ) || ( pElemProp == NULL ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } hr = pElemProp->get_Value( &vtValue ); if ( FAILED( hr ) ) { pProvider->SetErrorStatus( hr ); cleanup(); return RQ_NOTIFICATION_FINISH_REQUEST; } // Retrieve a pointer to the response. IHttpResponse * pHttpResponse = pHttpContext->GetResponse(); // Test for an error. if ( pHttpResponse != NULL ) { // convert bstr to string in order to delete header _bstr_t header( vtValue.bstrVal ); // delete header hr = pHttpResponse->DeleteHeader( (char *)header ); // Test for an error. if ( FAILED( hr ) ) { // Set the error status. pProvider->SetErrorStatus( hr ); // cleanup cleanup(); // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } } // loop_cleanup if ( pElem != NULL ) { pElem->Release(); pElem = NULL; } } cleanup(); // Return processing to the pipeline. return RQ_NOTIFICATION_CONTINUE; }
HRESULT GetElementRawTimeSpanProperty( IN IAppHostElement * pElement, IN LPCWSTR pszPropertyName, OUT ULONGLONG * pulonglong ) { HRESULT hr = S_OK; BSTR bstrPropertyName = NULL; IAppHostProperty * pProperty = NULL; VARIANT varValue; VariantInit( &varValue ); bstrPropertyName = SysAllocString( pszPropertyName ); if ( bstrPropertyName == NULL ) { hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); goto Finished; } // Now ask for the property and if it succeeds it is returned directly back hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); if ( FAILED ( hr ) ) { goto Finished; } // Now let's get the property and then extract it from the Variant. hr = pProperty->get_Value( &varValue ); if ( FAILED ( hr ) ) { goto Finished; } hr = VariantChangeType( &varValue, &varValue, 0, VT_UI8 ); if ( FAILED ( hr ) ) { goto Finished; } // extract the value *pulonglong = varValue.ullVal; Finished: VariantClear( &varValue ); if ( bstrPropertyName != NULL ) { SysFreeString( bstrPropertyName ); bstrPropertyName = NULL; } if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; } // end of Config_GetRawTimeSpanProperty
HRESULT GetElementLONGLONGProperty( IN IAppHostElement * pSitesCollectionEntry, IN LPCWSTR pwszName, OUT LONGLONG * pllValue ) { HRESULT hr = S_OK; IAppHostProperty * pProperty = NULL; BSTR bstrName = NULL; VARIANT varValue; VariantInit( &varValue ); bstrName = SysAllocString( pwszName ); if ( bstrName == NULL ) { hr = E_OUTOFMEMORY; DBGERROR_HR(hr); goto error; } hr = pSitesCollectionEntry->GetPropertyByName( bstrName, &pProperty ); if ( FAILED ( hr ) ) { goto error; } hr = pProperty->get_Value( &varValue ); if ( FAILED ( hr ) ) { goto error; } hr = VariantChangeType( &varValue, &varValue, 0, VT_I8 ); if ( FAILED ( hr ) ) { goto error; } // extract the value *pllValue = varValue.ulVal; error: VariantClear( &varValue ); if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } if ( bstrName != NULL ) { SysFreeString( bstrName ); bstrName = NULL; } return hr; }
HRESULT GetElementBoolProperty( IN IAppHostElement * pElement, IN LPCWSTR pszPropertyName, OUT BOOL * pBool ) { HRESULT hr = S_OK; BSTR bstrPropertyName = NULL; IAppHostProperty * pProperty = NULL; VARIANT varValue; VariantInit( &varValue ); bstrPropertyName = SysAllocString( pszPropertyName ); if ( bstrPropertyName == NULL ) { hr = E_OUTOFMEMORY; DBGERROR_HR(hr); goto exit; } // Now ask for the property and if it succeeds it is returned directly back. hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); if ( FAILED ( hr ) ) { goto exit; } // Now let's get the property and then extract it from the Variant. hr = pProperty->get_Value( &varValue ); if ( FAILED ( hr ) ) { goto exit; } hr = VariantChangeType( &varValue, &varValue, 0, VT_BOOL ); if ( FAILED ( hr ) ) { goto exit; } // extract the value *pBool = ( V_BOOL( &varValue ) == VARIANT_TRUE ); exit: VariantClear( &varValue ); if ( bstrPropertyName != NULL ) { SysFreeString( bstrPropertyName ); bstrPropertyName = NULL; } if ( pProperty != NULL ) { pProperty->Release(); pProperty = NULL; } return hr; }