/* $Revision: 18 $ $Date: 18/08/06 17:57 $ Copyright © 2003-2006, FSL Technologies Limited. Contact "http://fost.3.felspar.com/". */ #include "stdafx.h" #include "FOST.com.hpp" #include "FOST.db.hpp" #include "FOST.yaml.hpp" #include using namespace FSLib; namespace { const FSLib::Revision c_revision( L"$Archive: /FOST.3/F3Util/aspPage.cpp $", __DATE__, L"$Revision: 18 $", L"$Date: 18/08/06 17:57 $" ); } /* FSLib::IISPageHandler */ FSLib::Iis::PageHandler::PageHandler() : m_inPage( false ) { } FSLib::Iis::PageHandler::~PageHandler() { if ( m_piRequest ) m_piRequest.Release(); if ( m_piResponse ) m_piResponse.Release(); if ( m_piServer ) m_piServer.Release(); } void FSLib::Iis::PageHandler::assertInPage() const { if ( !m_inPage ) { HRESULT hr; ATL::CComPtr< IObjectContext > piObjectContext; if ( FAILED( hr = GetObjectContext( &piObjectContext ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no IObjectContext)", widen( typeid( *this ).name() ) ); ATL::CComPtr< IGetContextProperties > pProps; if ( FAILED( hr = piObjectContext->QueryInterface(IID_IGetContextProperties, (void**) &pProps) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no IGetContextProperties)", widen( typeid( *this ).name() ) ); _variant_t request; if ( FAILED( hr = pProps->GetProperty( _bstr_t( L"Request" ), &request ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Request' property)", widen( typeid( *this ).name() ) ); if ( V_VT( &request ) == VT_DISPATCH && V_DISPATCH( &request ) != NULL ) { if ( FAILED( hr = V_DISPATCH( &request )->QueryInterface( __uuidof( IRequest ), (void**) &m_piRequest ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server ('Request' property not IRequest)", widen( typeid( *this ).name() ) ); } else throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Request' property not an IDispatch)", widen( typeid( *this ).name() ) ); _variant_t response; if ( FAILED( hr = pProps->GetProperty( _bstr_t( L"Response" ), &response ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Response' property)", widen( typeid( *this ).name() ) ); if ( V_VT( &response ) == VT_DISPATCH && V_DISPATCH( &response ) != NULL ) { if ( FAILED( hr = V_DISPATCH( &response )->QueryInterface( __uuidof( IResponse ), (void**) &m_piResponse ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server ('Response' property not IResponse)", widen( typeid( *this ).name() ) ); } else throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Response' property not an IDispatch)", widen( typeid( *this ).name() ) ); _variant_t server; if ( FAILED( hr = pProps->GetProperty( _bstr_t( L"Server" ), &server ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Server' property)", widen( typeid( *this ).name() ) ); if ( V_VT( &server ) == VT_DISPATCH && V_DISPATCH( &server ) != NULL ) { if ( FAILED( hr = V_DISPATCH( &server )->QueryInterface( __uuidof( IServer ), (void**) &m_piServer ) ) ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server ('Server' property not IServer)", widen( typeid( *this ).name() ) ); } else throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is used on an IIS web server (no 'Server' property not an IDispatch)", widen( typeid( *this ).name() ) ); m_inPage = true; } } void FSLib::Iis::PageHandler::assertNotInPage() const { if ( m_inPage ) throw FSLib::Exceptions::PageStartEnd( L"This member may only be used when the COM instance is not used on an IIS web server", widen( typeid( *this ).name() ) ); } ATL::CComPtr< IRequest > &FSLib::Iis::PageHandler::request() { assertInPage(); return m_piRequest; } ATL::CComPtr< IResponse > &FSLib::Iis::PageHandler::response() { assertInPage(); return m_piResponse; } ATL::CComPtr< IServer > &FSLib::Iis::PageHandler::server() { assertInPage(); return m_piServer; } STDMETHODIMP FSLib::Iis::PageHandler::OnStartPage (IUnknown* pUnk) { if ( m_inPage ) throw FSLib::Exceptions::PageStartEnd( L"OnStartPage has already been used on this object", widen( typeid( *this ).name() ) ); if( !pUnk ) return E_POINTER; ATL::CComPtr< IScriptingContext > spContext; HRESULT hr; // Get the IScriptingContext Interface hr = pUnk->QueryInterface( __uuidof(IScriptingContext), (void **)&spContext ); if( FAILED(hr) ) return hr; // Get Request Object Pointer hr = spContext->get_Request(&m_piRequest); if( FAILED(hr) ) return hr; // Get Response Object Pointer hr = spContext->get_Response(&m_piResponse); if( FAILED(hr) ) return hr; // Get Server Object Pointer hr = spContext->get_Server(&m_piServer); if( FAILED(hr) ) return hr; m_inPage = true; return S_OK; } STDMETHODIMP FSLib::Iis::PageHandler::OnEndPage () { assertInPage(); m_inPage = false; // Release all interfaces m_piRequest.Release(); m_piResponse.Release(); m_piServer.Release(); return S_OK; }