////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2001 Microsoft Corporation // // Module Name: // MetabaseObject.cpp // // Description: // Copied from %fp%\server\source\msiis\metabase.cpp // Opens the Metabse for accessing information about // IIS. For example, to make sure it is installed correctly // and make sure ASP is turned on. // // Header File: // MetabaseObject.h // // History: // travisn 2-AUG-2001 Copied and comments added // ////////////////////////////////////////////////////////////////////////////// #include "MetabaseObject.h" ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::~CMetabaseObject // // Description: // Destructor for the Metabase object // ///////////////////////////////////////////////////////////////////////// CMetabaseObject::~CMetabaseObject() { if (m_pIAdmCom) { if (m_isOpen) m_pIAdmCom->CloseKey(m_handle); m_pIAdmCom->Release(); m_pIAdmCom = 0; } } ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::init // // Description: // Initalize the metabase for access // ///////////////////////////////////////////////////////////////////////// HRESULT CMetabaseObject::init() { if (m_pIAdmCom) return S_OK; return CoCreateInstance( CLSID_MSAdminBase, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IMSAdminBase, (void **) &m_pIAdmCom ); } ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::openObject // // Description: // Open this metabase object with the path given // ///////////////////////////////////////////////////////////////////////// HRESULT CMetabaseObject::openObject(const WCHAR *path) { HRESULT hr = S_OK; if (FAILED(hr = init())) return hr; if (m_isOpen) { if (FAILED(hr = closeObject())) return hr; } hr = m_pIAdmCom->OpenKey( METADATA_MASTER_ROOT_HANDLE, path, METADATA_PERMISSION_READ, 60000, &m_handle); if (FAILED(hr)) return hr; m_isOpen = TRUE; return hr; } ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::closeObject // // Description: // Close this metabase object // ///////////////////////////////////////////////////////////////////////// HRESULT CMetabaseObject::closeObject() { if (!m_isOpen) return S_FALSE; HRESULT hr = m_pIAdmCom->CloseKey(m_handle); if (FAILED(hr)) return hr; m_isOpen = FALSE; return hr; } ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::getData // // Description: // This method does not appear necessary for SaInstall // //HRESULT CMetabaseObject::getData( // DWORD property, // Wstring& value, // DWORD userType, // LPCWSTR path, // BOOL inherited, // DWORD dataType) //{ // METADATA_RECORD metaDataRecord; // metaDataRecord.dwMDIdentifier = property; // metaDataRecord.dwMDDataType = dataType; // metaDataRecord.dwMDUserType = userType; // metaDataRecord.dwMDAttributes = inherited ? // METADATA_INHERIT | METADATA_PARTIAL_PATH : 0; // metaDataRecord.dwMDDataLen = value.numBytes(); // metaDataRecord.pbMDData = (unsigned char *)value.data(); // DWORD metaDataLength = 0; // HRESULT hr = m_pIAdmCom->GetData(m_handle, // path, &metaDataRecord, &metaDataLength); // // // See if we need a bigger buffer // if (!FAILED(hr)) // return hr; // if (ERROR_INSUFFICIENT_BUFFER != hr && // ERROR_INSUFFICIENT_BUFFER != (hr & 0xFFFF)) // return hr; // value.makeBigger(metaDataLength); // metaDataRecord.dwMDDataLen = value.numBytes(); // metaDataRecord.pbMDData = (unsigned char *)value.data(); // return m_pIAdmCom->GetData(m_handle, // path, &metaDataRecord, &metaDataLength); //} ///////////////////////////////////////////////////////////////////////// // CMetabaseObject::enumerateObjects // // Description: // This method does not appear necessary for SaInstall // //HRESULT CMetabaseObject::enumerateObjects( // LPCWSTR pszMDPath, // LPWSTR pszMDName, // at least METADATA_MAX_NAME_LEN long // DWORD dwMDEnumKeyIndex) //{ // return m_pIAdmCom->EnumKeys(m_handle, // pszMDPath, // pszMDName, // dwMDEnumKeyIndex); //}