// // Copyright 2001 - Microsoft Corporation // // Created By: // Geoff Pease (GPease) 27-MAR-2001 // // Maintained By: // Geoff Pease (GPease) 27-MAR-2001 // #include "pch.h" #include "DocProp.h" #include "DefProp.h" #include "PropertyCacheItem.h" #include "PropertyCache.h" #include "LicensePage.h" #pragma hdrstop DEFINE_THISCLASS( "CLicensePage" ) // ************************************************************************ // // Constructor / Destructor // // ************************************************************************ // // CreateInstance - used by CFactory // HRESULT CLicensePage::CreateInstance( IUnknown ** ppunkOut , CPropertyCache * pPropertyCacheIn ) { TraceFunc( "" ); HRESULT hr; Assert( ppunkOut != NULL ); CLicensePage * pthis = new CLicensePage; if ( pthis != NULL ) { hr = THR( pthis->Init( pPropertyCacheIn ) ); if ( SUCCEEDED( hr ) ) { *ppunkOut = (IShellExtInit *) pthis; (*ppunkOut)->AddRef( ); } pthis->Release( ); } else { hr = E_OUTOFMEMORY; } HRETURN( hr ); } // // Constructor // CLicensePage::CLicensePage( void ) : _cRef( 1 ) { TraceFunc( "" ); InterlockedIncrement( &g_cObjects ); Assert( 1 == _cRef ); // we initialize this above // // We assume that we are ZERO_INITed - be paranoid. // Assert( NULL == _hdlg ); Assert( NULL == _pPropertyCache ); TraceFuncExit(); } // // Description: // Initializes class. Put calls that can fail in here. // HRESULT CLicensePage::Init( CPropertyCache * pPropertyCacheIn ) { TraceFunc( "" ); HRESULT hr = S_OK; // IUnknown stuff Assert( 1 == _cRef ); // IShellPropSheetExt stuff _pPropertyCache = pPropertyCacheIn; if ( NULL == _pPropertyCache ) { hr = THR( E_INVALIDARG ); } HRETURN( hr ); } // // Destructor // CLicensePage::~CLicensePage( ) { TraceFunc( "" ); InterlockedDecrement( &g_cObjects ); TraceFuncExit(); } // ************************************************************************ // // IUnknown // // ************************************************************************ // // // STDMETHODIMP CLicensePage::QueryInterface( REFIID riid, LPVOID *ppv ) { TraceQIFunc( riid, ppv ); HRESULT hr = E_NOINTERFACE; if ( IsEqualIID( riid, __uuidof(IUnknown) ) ) { *ppv = static_cast< IShellPropSheetExt * >( this ); hr = S_OK; } else if ( IsEqualIID( riid, __uuidof(IShellPropSheetExt) ) ) { *ppv = TraceInterface( __THISCLASS__, IShellPropSheetExt, this, 0 ); hr = S_OK; } if ( SUCCEEDED( hr ) ) { ((IUnknown*) *ppv)->AddRef( ); } QIRETURN( hr, riid ); } // // // STDMETHODIMP_(ULONG) CLicensePage::AddRef( void ) { TraceFunc( "[IUnknown]" ); _cRef ++; // apartment RETURN( _cRef ); } // // // STDMETHODIMP_(ULONG) CLicensePage::Release( void ) { TraceFunc( "[IUnknown]" ); _cRef --; // apartment if ( 0 != _cRef ) RETURN( _cRef ); delete this; RETURN( 0 ); } // ************************************************************************ // // IShellPropSheetExt // // ************************************************************************ // // // STDMETHODIMP CLicensePage::AddPages( LPFNADDPROPSHEETPAGE lpfnAddPageIn , LPARAM lParam ) { TraceFunc( "" ); HRESULT hr = E_FAIL; // assume failure HPROPSHEETPAGE hPage; PROPSHEETPAGE psp = { 0 }; psp.dwSize = sizeof(psp); psp.dwFlags = PSP_USECALLBACK; psp.hInstance = g_hInstance; psp.pszTemplate = MAKEINTRESOURCE(IDD_LICENSEPAGE); psp.pfnDlgProc = (DLGPROC) DlgProc; psp.pfnCallback = PageCallback; psp.lParam = (LPARAM) this; hPage = CreatePropertySheetPage( &psp ); if ( NULL != hPage ) { BOOL b = TBOOL( lpfnAddPageIn( hPage, lParam ) ); if ( b ) { hr = S_OK; } else { DestroyPropertySheetPage( hPage ); } } HRETURN( hr ); } // // // STDMETHODIMP CLicensePage::ReplacePage( UINT uPageIDIn , LPFNADDPROPSHEETPAGE lpfnReplacePageIn , LPARAM lParam ) { TraceFunc( "" ); HRESULT hr = THR( E_NOTIMPL ); HRETURN( hr ); } // *************************************************************************** // // Dialog Proc and Property Sheet Callback // // *************************************************************************** // // // INT_PTR CALLBACK CLicensePage::DlgProc( HWND hDlgIn , UINT uMsgIn , WPARAM wParam , LPARAM lParam ) { // Don't do TraceFunc because every mouse movement will cause this function to spew. WndMsg( hDlgIn, uMsgIn, wParam, lParam ); LRESULT lr = FALSE; CLicensePage * pPage = (CLicensePage *) GetWindowLongPtr( hDlgIn, DWLP_USER ); if ( uMsgIn == WM_INITDIALOG ) { PROPSHEETPAGE * ppage = (PROPSHEETPAGE *) lParam; SetWindowLongPtr( hDlgIn, DWLP_USER, (LPARAM) ppage->lParam ); pPage = (CLicensePage *) ppage->lParam; pPage->_hdlg = hDlgIn; } if ( pPage != NULL ) { Assert( hDlgIn == pPage->_hdlg ); switch( uMsgIn ) { case WM_INITDIALOG: lr = pPage->OnInitDialog( ); break; } } return lr; } // // // UINT CALLBACK CLicensePage::PageCallback( HWND hwndIn , UINT uMsgIn , LPPROPSHEETPAGE ppspIn ) { TraceFunc( "" ); UINT uRet = 0; CLicensePage * pPage = (CLicensePage *) ppspIn->lParam; if ( NULL != pPage ) { switch ( uMsgIn ) { case PSPCB_CREATE: uRet = TRUE; // allow the page to be created break; case PSPCB_ADDREF: pPage->AddRef( ); break; case PSPCB_RELEASE: pPage->Release( ); break; } } RETURN( uRet ); } // *************************************************************************** // // Private methods // // *************************************************************************** // // WM_INITDIALOG handler // LRESULT CLicensePage::OnInitDialog( void ) { TraceFunc( "" ); HRESULT hr; CPropertyCacheItem * pItem; LRESULT lr = FALSE; Assert( NULL != _hdlg ); // this should have been initialized in the DlgProc. hr = STHR( _pPropertyCache->FindItemEntry( &FMTID_DRM, PIDDRSI_DESCRIPTION, &pItem ) ); if ( S_OK == hr ) { LPCWSTR pszText; hr = THR( pItem->GetPropertyStringValue( &pszText ) ); if ( S_OK == hr ) { TBOOL( SetDlgItemText( _hdlg, IDC_E_LICENSE, pszText ) ); } } RETURN( lr ); }