/****************************************************************************** Copyright (c) 1999 Microsoft Corporation Module Name: ISAPIinstance.cpp Abstract: This file contains the implementation of the CISAPIinstance class, the support class for accessing and modifying the configuration of the ISAPI extension used by the Upload Library. Revision History: Davide Massarenti (Dmassare) 04/28/99 created ******************************************************************************/ #include "stdafx.h" static WCHAR text_QUEUE_LOCATIONS [] = L"QUEUE_LOCATIONS" ; static WCHAR text_QUEUE_SIZE_MAX [] = L"QUEUE_SIZE_MAX" ; static WCHAR text_QUEUE_SIZE_THRESHOLD[] = L"QUEUE_SIZE_THRESHOLD"; static WCHAR text_MAXIMUM_JOB_AGE [] = L"MAXIMUM_JOB_AGE" ; static WCHAR text_MAXIMUM_PACKET_SIZE [] = L"MAXIMUM_PACKET_SIZE" ; static WCHAR text_LOG_LOCATION [] = L"LOG_LOCATION" ; CISAPIinstance::CISAPIinstance( /*[in]*/ MPC::wstring szURL ) : m_flLogHandle(false) // Don't keep the log file opened. { __ULT_FUNC_ENTRY( "CISAPIinstance::CISAPIinstance" ); m_szURL = szURL; // MPC::wstring m_szURL; // // ProvMap m_mapProviders; // PathList m_lstQueueLocations; // m_dwQueueSizeMax = 0; // DWORD m_dwQueueSizeMax; m_dwQueueSizeThreshold = 0; // DWORD m_dwQueueSizeThreshold; m_dwMaximumJobAge = 7; // DWORD m_dwMaximumJobAge; m_dwMaximumPacketSize = 64*1024; // DWORD m_dwMaximumPacketSize; // // MPC::wstring m_szLogLocation; // MPC::FileLog m_flLogHandle; } bool CISAPIinstance::operator==( /*[in]*/ const MPC::wstring& rhs ) { __ULT_FUNC_ENTRY("CISAPIinstance::operator=="); MPC::NocaseCompare cmp; bool fRes; fRes = cmp( m_szURL, rhs ); __ULT_FUNC_EXIT(fRes); } ///////////////////////////////////////////////////////////////////////////// HRESULT CISAPIinstance::Load( /*[in]*/ MPC::RegKey& rkBase ) { __ULT_FUNC_ENTRY( "CISAPIinstance::Load" ); HRESULT hr; MPC::RegKey rkRoot; MPC::WStringList lstKeys; MPC::WStringIter itKey; CComVariant vValue; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, rkBase.SubKey( m_szURL.c_str(), rkRoot )); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.EnumerateSubKeys( lstKeys )); m_mapProviders .clear(); m_lstQueueLocations.clear(); for(itKey=lstKeys.begin(); itKey != lstKeys.end(); itKey++) { CISAPIprovider isapiProvider( *itKey ); __MPC_EXIT_IF_METHOD_FAILS(hr, isapiProvider.Load( rkRoot )); m_mapProviders[*itKey] = isapiProvider; } __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_QUEUE_SIZE_MAX )); if(fFound && vValue.vt == VT_I4) m_dwQueueSizeMax = vValue.lVal; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_QUEUE_SIZE_THRESHOLD )); if(fFound && vValue.vt == VT_I4) m_dwQueueSizeThreshold = vValue.lVal; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_MAXIMUM_JOB_AGE )); if(fFound && vValue.vt == VT_I4) m_dwMaximumJobAge = vValue.lVal; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_MAXIMUM_PACKET_SIZE )); if(fFound && vValue.vt == VT_I4) m_dwMaximumPacketSize = vValue.lVal; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_LOG_LOCATION )); if(fFound && vValue.vt == VT_BSTR) { m_szLogLocation = SAFEBSTR( vValue.bstrVal ); if(m_szLogLocation.length()) { __MPC_EXIT_IF_METHOD_FAILS(hr, m_flLogHandle.SetLocation( m_szLogLocation.c_str() )); } } __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.get_Value( vValue, fFound, text_QUEUE_LOCATIONS )); if(fFound && vValue.vt == VT_BSTR) { // // Split the registry value, a semicolon-separated list of paths, into individual paths. // MPC::wstring szQueueLocations = SAFEBSTR( vValue.bstrVal ); MPC::wstring::size_type iPos = 0; MPC::wstring::size_type iEnd; while(1) { iEnd = szQueueLocations.find( L";", iPos ); if(iEnd == MPC::string::npos) // Last component. { m_lstQueueLocations.push_back( MPC::wstring( &szQueueLocations[iPos] ) ); break; } else { m_lstQueueLocations.push_back( MPC::wstring( &szQueueLocations[iPos], &szQueueLocations[iEnd] ) ); iPos = iEnd+1; } } } hr = S_OK; __ULT_FUNC_CLEANUP; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::Save( /*[in]*/ MPC::RegKey& rkBase ) { __ULT_FUNC_ENTRY( "CISAPIinstance::Save" ); HRESULT hr; MPC::RegKey rkRoot; ProvIter itInstance; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, rkBase.SubKey( m_szURL.c_str(), rkRoot )); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.Create( )); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.DeleteSubKeys()); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.DeleteValues ()); for(itInstance=m_mapProviders.begin(); itInstance != m_mapProviders.end(); itInstance++) { __MPC_EXIT_IF_METHOD_FAILS(hr, (*itInstance).second.Save( rkRoot )); } vValue = (long)m_dwQueueSizeMax; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_QUEUE_SIZE_MAX )); vValue = (long)m_dwQueueSizeThreshold; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_QUEUE_SIZE_THRESHOLD )); vValue = (long)m_dwMaximumJobAge; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_MAXIMUM_JOB_AGE )); vValue = (long)m_dwMaximumPacketSize; __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_MAXIMUM_PACKET_SIZE )); vValue = m_szLogLocation.c_str(); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_LOG_LOCATION )); { MPC::wstring szQueueLocations; PathIter it = m_lstQueueLocations.begin(); while(it != m_lstQueueLocations.end()) { szQueueLocations.append( *it++ ); if(it != m_lstQueueLocations.end()) szQueueLocations.append( L";" ); } if(szQueueLocations.length() != 0) { vValue = szQueueLocations.c_str(); __MPC_EXIT_IF_METHOD_FAILS(hr, rkRoot.put_Value( vValue, text_QUEUE_LOCATIONS )); } } hr = S_OK; __ULT_FUNC_CLEANUP; __ULT_FUNC_EXIT(hr); } ///////////////////////////////////////////////////////////////////////////// HRESULT CISAPIinstance::GetProviders( /*[out]*/ ProvIter& itBegin , /*[out]*/ ProvIter& itEnd ) { __ULT_FUNC_ENTRY( "CISAPIinstance::GetProviders" ); HRESULT hr; itBegin = m_mapProviders.begin(); itEnd = m_mapProviders.end (); hr = S_OK; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::GetProvider( /*[out]*/ ProvIter& itOld , /*[out]*/ bool& fFound , /*[in] */ const MPC::wstring& szName ) { __ULT_FUNC_ENTRY( "CISAPIinstance::GetProvider" ); HRESULT hr; itOld = m_mapProviders.find( szName ); if(itOld == m_mapProviders.end()) { fFound = false; } else { fFound = true; } hr = S_OK; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::NewProvider( /*[out]*/ ProvIter& itNew , /*[in] */ const MPC::wstring& szName ) { __ULT_FUNC_ENTRY( "CISAPIinstance::NewProvider" ); HRESULT hr; std::pair res; bool fFound; // // First of all, check if the given URL already exists. // __MPC_EXIT_IF_METHOD_FAILS(hr, GetProvider( itNew, fFound, szName )); if(fFound == false) { // // If not, create it. // res = m_mapProviders.insert( ProvMap::value_type( szName, CISAPIprovider( szName ) ) ); itNew = res.first; } hr = S_OK; __ULT_FUNC_CLEANUP; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::DelProvider( /*[in]*/ ProvIter& itOld ) { __ULT_FUNC_ENTRY( "CISAPIinstance::DelProvider" ); HRESULT hr; m_mapProviders.erase( itOld ); hr = S_OK; __ULT_FUNC_EXIT(hr); } ///////////////////////////////////////////////////////////////////////////// HRESULT CISAPIinstance::GetLocations( /*[out]*/ PathIter& itBegin , /*[out]*/ PathIter& itEnd ) { __ULT_FUNC_ENTRY( "CISAPIinstance::GetLocations" ); HRESULT hr; itBegin = m_lstQueueLocations.begin(); itEnd = m_lstQueueLocations.end (); hr = S_OK; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::NewLocation( /*[out]*/ PathIter& itNew , /*[in] */ const MPC::wstring& szPath ) { __ULT_FUNC_ENTRY( "CISAPIinstance::NewLocation" ); HRESULT hr; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, GetLocation( itNew, fFound, szPath )); if(fFound == false) { itNew = m_lstQueueLocations.insert( m_lstQueueLocations.end(), szPath ); } hr = S_OK; __ULT_FUNC_CLEANUP; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::GetLocation( /*[out]*/ PathIter& itOld , /*[out]*/ bool& fFound , /*[in] */ const MPC::wstring& szPath ) { __ULT_FUNC_ENTRY( "CISAPIinstance::GetLocation" ); HRESULT hr; itOld = std::find( m_lstQueueLocations.begin(), m_lstQueueLocations.end(), szPath ); if(itOld == m_lstQueueLocations.end()) { fFound = false; } else { fFound = true; } hr = S_OK; __ULT_FUNC_EXIT(hr); } HRESULT CISAPIinstance::DelLocation( /*[in]*/ PathIter& itOld ) { __ULT_FUNC_ENTRY( "CISAPIinstance::DelLocation" ); HRESULT hr; m_lstQueueLocations.erase( itOld ); hr = S_OK; __ULT_FUNC_EXIT(hr); } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// HRESULT CISAPIinstance::get_URL( /*[out]*/ MPC::wstring& szURL ) { szURL = m_szURL; return S_OK; } HRESULT CISAPIinstance::get_QueueSizeMax( /*[out]*/ DWORD& dwQueueSizeMax ) { dwQueueSizeMax = m_dwQueueSizeMax; return S_OK; } HRESULT CISAPIinstance::get_QueueSizeThreshold( /*[out]*/ DWORD& dwQueueSizeThreshold ) { dwQueueSizeThreshold = m_dwQueueSizeThreshold; return S_OK; } HRESULT CISAPIinstance::get_MaximumJobAge( /*[out]*/ DWORD& dwMaximumJobAge ) { dwMaximumJobAge = m_dwMaximumJobAge; return S_OK; } HRESULT CISAPIinstance::get_MaximumPacketSize( /*[out]*/ DWORD& dwMaximumPacketSize ) { dwMaximumPacketSize = m_dwMaximumPacketSize; return S_OK; } HRESULT CISAPIinstance::get_LogLocation( /*[out]*/ MPC::wstring& szLogLocation ) { szLogLocation = m_szLogLocation; return S_OK; } HRESULT CISAPIinstance::get_LogHandle( /*[out]*/ MPC::FileLog*& flLogHandle ) { HRESULT hr; if(m_szLogLocation.length()) { flLogHandle = &m_flLogHandle; // // Check if it's been more than one day since the last time we rotated the log file. // hr = m_flLogHandle.Rotate( 1 ); } else { flLogHandle = NULL; hr = E_INVALIDARG; } return hr; } ///////////////////////////////////////////////////////////////////////////// HRESULT CISAPIinstance::put_QueueSizeMax( /*[in]*/ DWORD dwQueueSizeMax ) { m_dwQueueSizeMax = dwQueueSizeMax; return S_OK; } HRESULT CISAPIinstance::put_QueueSizeThreshold( /*[in]*/ DWORD dwQueueSizeThreshold ) { m_dwQueueSizeThreshold = dwQueueSizeThreshold; return S_OK; } HRESULT CISAPIinstance::put_MaximumJobAge( /*[in]*/ DWORD dwMaximumJobAge ) { m_dwMaximumJobAge = dwMaximumJobAge; return S_OK; } HRESULT CISAPIinstance::put_MaximumPacketSize( /*[in]*/ DWORD dwMaximumPacketSize ) { m_dwMaximumPacketSize = dwMaximumPacketSize; return S_OK; } HRESULT CISAPIinstance::put_LogLocation( /*[in]*/ const MPC::wstring& szLogLocation ) { HRESULT hr; m_szLogLocation = szLogLocation; if(m_szLogLocation.length()) { hr = m_flLogHandle.SetLocation( m_szLogLocation.c_str() ); } else { hr = S_OK; } return hr; }