Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
5.7 KiB

/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
PrintEngine.cpp
Abstract:
This file contains the implementation of the CPCHPrintEngine class,
which implements the multi-topic printing.
Revision History:
Davide Massarenti (Dmassare) 05/08/2000
created
******************************************************************************/
#include "stdafx.h"
/////////////////////////////////////////////////////////////////////////////
#define CHECK_MODIFY() __MPC_EXIT_IF_METHOD_FAILS(hr, CanModifyProperties())
/////////////////////////////////////////////////////////////////////////////
CPCHPrintEngine::CPCHPrintEngine()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::CPCHPrintEngine" );
// Printing::Print m_engine;
//
// MPC::CComPtrThreadNeutral<IDispatch> m_sink_onProgress;
// MPC::CComPtrThreadNeutral<IDispatch> m_sink_onComplete;
}
void CPCHPrintEngine::FinalRelease()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::FinalRelease" );
(void)Abort();
Thread_Wait();
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
HRESULT CPCHPrintEngine::Run()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::Run" );
HRESULT hr;
::SetThreadPriority( ::GetCurrentThread(), THREAD_PRIORITY_LOWEST );
__MPC_TRY_BEGIN();
__MPC_EXIT_IF_METHOD_FAILS(hr, m_engine.Initialize( CPCHHelpCenterExternal::s_GLOBAL->Window() ));
__MPC_EXIT_IF_METHOD_FAILS(hr, m_engine.PrintAll( this ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__MPC_TRY_CATCHALL(hr);
//
// Close everything.
//
m_engine.Terminate();
//
// Keep this outside any critical section, otherwise a deadlock could occur.
//
Fire_onComplete( Thread_Self(), hr );
Thread_Abort(); // To tell the MPC:Thread object to close the worker thread...
__HCP_FUNC_EXIT(hr);
}
/////////////////////////////////////////////////////////////////////////////
////////////////
// //
// Properties //
// //
////////////////
STDMETHODIMP CPCHPrintEngine::put_onProgress( /*[in]*/ IDispatch* function )
{
__HCP_BEGIN_PROPERTY_PUT("CPCHPrintEngine::put_onProgress",hr);
CHECK_MODIFY();
m_sink_onProgress = function;
__HCP_END_PROPERTY(hr);
}
STDMETHODIMP CPCHPrintEngine::put_onComplete( /*[in]*/ IDispatch* function )
{
__HCP_BEGIN_PROPERTY_PUT("CPCHPrintEngine::put_onComplete",hr);
CHECK_MODIFY();
m_sink_onComplete = function;
__HCP_END_PROPERTY(hr);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CPCHPrintEngine::AddTopic( /*[in]*/ BSTR bstrURL )
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::AddTopic" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrURL);
__MPC_PARAMCHECK_END();
CHECK_MODIFY();
__MPC_EXIT_IF_METHOD_FAILS(hr, m_engine.AddUrl( bstrURL ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
STDMETHODIMP CPCHPrintEngine::Start()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::Start" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
CHECK_MODIFY();
//
// Release the lock on current object, otherwise a deadlock could occur.
//
lock = NULL;
__MPC_EXIT_IF_METHOD_FAILS(hr, Thread_Start( this, Run, this ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
STDMETHODIMP CPCHPrintEngine::Abort()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::Abort" );
Thread_Abort(); // To tell the MPC:Thread object to close the worker thread...
__HCP_FUNC_EXIT(S_OK);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//////////////////////////
// //
// Event Firing Methods //
// //
//////////////////////////
HRESULT CPCHPrintEngine::Fire_onProgress( IPCHPrintEngine* hcppe, BSTR bstrURL, long lDone, long lTotal )
{
CComVariant pvars[4];
pvars[3] = hcppe;
pvars[2] = bstrURL;
pvars[1] = lDone;
pvars[0] = lTotal;
return FireAsync_Generic( DISPID_PCH_PEE__ONPROGRESS, pvars, ARRAYSIZE( pvars ), m_sink_onProgress );
}
HRESULT CPCHPrintEngine::Fire_onComplete( IPCHPrintEngine* hcppe, HRESULT hrRes )
{
CComVariant pvars[2];
pvars[1] = hcppe;
pvars[0] = hrRes;
return FireAsync_Generic( DISPID_PCH_PEE__ONCOMPLETE, pvars, ARRAYSIZE( pvars ), m_sink_onComplete );
}
//////////////////////
// //
// Callback Methods //
// //
//////////////////////
HRESULT CPCHPrintEngine::Progress( /*[in]*/ LPCWSTR szURL, /*[in]*/ int iDone, /*[in]*/ int iTotal )
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::Progress" );
HRESULT hr;
if(Thread_IsAborted())
{
__MPC_SET_ERROR_AND_EXIT(hr, E_ABORT);
}
__MPC_EXIT_IF_METHOD_FAILS(hr, Fire_onProgress( this, CComBSTR( szURL ), iDone, iTotal ));
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////
// //
// Utility Methods //
// //
/////////////////////
HRESULT CPCHPrintEngine::CanModifyProperties()
{
__HCP_FUNC_ENTRY( "CPCHPrintEngine::CanModifyProperties" );
HRESULT hr = Thread_IsRunning() ? E_ACCESSDENIED : S_OK;
__HCP_FUNC_EXIT(hr);
}