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.
442 lines
14 KiB
442 lines
14 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1997 - 1999
|
|
|
|
Module Name:
|
|
|
|
LocalFileLoggingNode.cpp
|
|
|
|
Abstract:
|
|
|
|
Implementation file for the CClient class.
|
|
|
|
|
|
Author:
|
|
|
|
Michael A. Maguire 12/15/97
|
|
|
|
Revision History:
|
|
mmaguire 12/15/97 - created
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// BEGIN INCLUDES
|
|
//
|
|
// standard includes:
|
|
//
|
|
#include "Precompiled.h"
|
|
|
|
//
|
|
// where we can find declaration for main class in this file:
|
|
//
|
|
#include "logcomp.h"
|
|
#include "LocalFileLoggingNode.h"
|
|
#include "LogCompD.h"
|
|
|
|
#include "SnapinNode.cpp" // Template class implementation
|
|
//
|
|
//
|
|
// where we can find declarations needed in this file:
|
|
//
|
|
#include "LoggingMethodsNode.h"
|
|
#include "LocalFileLoggingPage1.h"
|
|
#include "LocalFileLoggingPage2.h"
|
|
#include "LogMacNd.h"
|
|
|
|
// Need to include this at least once to get in build:
|
|
#include "sdohelperfuncs.cpp"
|
|
|
|
//
|
|
// END INCLUDES
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::CLocalFileLoggingNode
|
|
|
|
Constructor
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CLocalFileLoggingNode::CLocalFileLoggingNode( CSnapInItem * pParentNode )
|
|
: LoggingMethod(IAS_PROVIDER_MICROSOFT_ACCOUNTING, pParentNode)
|
|
{
|
|
// for help files
|
|
m_helpIndex = (((CLoggingMethodsNode *)m_pParentNode)->m_ExtendRas)? RAS_HELP_INDEX:0;
|
|
|
|
|
|
// Set the display name for this object
|
|
TCHAR lpszName[IAS_MAX_STRING];
|
|
int nLoadStringResult = LoadString( _Module.GetResourceInstance(), IDS_LOCAL_FILE_LOGGING_NODE__NAME, lpszName, IAS_MAX_STRING );
|
|
_ASSERT( nLoadStringResult > 0 );
|
|
|
|
m_bstrDisplayName = lpszName;
|
|
|
|
m_resultDataItem.nImage = IDBI_NODE_LOCAL_FILE_LOGGING;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::~CLocalFileLoggingNode
|
|
|
|
Destructor
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CLocalFileLoggingNode::~CLocalFileLoggingNode() throw ()
|
|
{
|
|
ATLTRACE(_T("# --- CLocalFileLoggingNode::~CLocalFileLoggingNode\n"));
|
|
}
|
|
|
|
|
|
HRESULT CLocalFileLoggingNode::LoadCachedInfoFromSdo() throw ()
|
|
{
|
|
CComVariant spVariant;
|
|
HRESULT hr = configSdo->GetProperty(
|
|
PROPERTY_ACCOUNTING_LOG_FILE_DIRECTORY,
|
|
&spVariant
|
|
);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
m_bstrDescription = V_BSTR(&spVariant);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::CreatePropertyPages
|
|
|
|
See CSnapinNode::CreatePropertyPages (which this method overrides) for detailed info.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CLocalFileLoggingNode::CreatePropertyPages (
|
|
LPPROPERTYSHEETCALLBACK pPropertySheetCallback
|
|
, LONG_PTR hNotificationHandle
|
|
, IUnknown* pUnknown
|
|
, DATA_OBJECT_TYPES type
|
|
)
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::CreatePropertyPages\n"));
|
|
|
|
// Check for preconditions:
|
|
_ASSERTE( pPropertySheetCallback != NULL );
|
|
|
|
HRESULT hr;
|
|
|
|
CLoggingMachineNode * pServerNode = GetServerRoot();
|
|
_ASSERTE( pServerNode != NULL );
|
|
hr = pServerNode->CheckConnectionToServer();
|
|
if( FAILED( hr ) )
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
TCHAR lpszTab1Name[IAS_MAX_STRING];
|
|
TCHAR lpszTab2Name[IAS_MAX_STRING];
|
|
int nLoadStringResult;
|
|
|
|
// Load property page tab name from resource.
|
|
nLoadStringResult = LoadString( _Module.GetResourceInstance(), IDS_LOCAL_FILE_LOGGING_PAGE1__TAB_NAME, lpszTab1Name, IAS_MAX_STRING );
|
|
_ASSERT( nLoadStringResult > 0 );
|
|
|
|
// This page will take care of deleting itself when it
|
|
// receives the PSPCB_RELEASE message.
|
|
// We specify TRUE for the bOwnsNotificationHandle parameter so that this page's destructor will be
|
|
// responsible for freeing the notification handle. Only one page per sheet should do this.
|
|
CLocalFileLoggingPage1 * pLocalFileLoggingPage1 = new CLocalFileLoggingPage1( hNotificationHandle, this, lpszTab1Name, TRUE );
|
|
|
|
if( NULL == pLocalFileLoggingPage1 )
|
|
{
|
|
ATLTRACE(_T("# ***FAILED***: CLocalFileLoggingNode::CreatePropertyPages -- Couldn't create property pages\n"));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
// Load property page tab name from resource.
|
|
nLoadStringResult = LoadString( _Module.GetResourceInstance(), IDS_LOCAL_FILE_LOGGING_PAGE2__TAB_NAME, lpszTab2Name, IAS_MAX_STRING );
|
|
_ASSERT( nLoadStringResult > 0 );
|
|
|
|
// This page will take care of deleting itself when it
|
|
// receives the PSPCB_RELEASE message.
|
|
CLocalFileLoggingPage2 * pLocalFileLoggingPage2 = new CLocalFileLoggingPage2( hNotificationHandle, this, lpszTab2Name );
|
|
|
|
if( NULL == pLocalFileLoggingPage2 )
|
|
{
|
|
ATLTRACE(_T("# ***FAILED***: CLocalFileLoggingNode::CreatePropertyPages -- Couldn't create property pages\n"));
|
|
|
|
// Clean up the first page we created.
|
|
delete pLocalFileLoggingPage1;
|
|
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
// Marshall the ISdo pointer so that the property page, which
|
|
// runs in another thread, can unmarshall it and use it properly.
|
|
hr = CoMarshalInterThreadInterfaceInStream(
|
|
IID_ISdo //Reference to the identifier of the interface
|
|
, configSdo //Pointer to the interface to be marshaled
|
|
, &( pLocalFileLoggingPage1->m_pStreamSdoAccountingMarshal ) //Address of output variable that receives the IStream interface pointer for the marshaled interface
|
|
);
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
delete pLocalFileLoggingPage1;
|
|
delete pLocalFileLoggingPage2;
|
|
|
|
ShowErrorDialog( NULL, IDS_ERROR__NO_SDO, NULL, hr, IDS_ERROR__LOGGING_TITLE, GetComponentData()->m_spConsole );
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Marshall the ISdo pointer so that the property page, which
|
|
// runs in another thread, can unmarshall it and use it properly.
|
|
hr = CoMarshalInterThreadInterfaceInStream(
|
|
IID_ISdo //Reference to the identifier of the interface
|
|
, configSdo //Pointer to the interface to be marshaled
|
|
, &( pLocalFileLoggingPage2->m_pStreamSdoAccountingMarshal ) //Address of output variable that receives the IStream interface pointer for the marshaled interface
|
|
);
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
delete pLocalFileLoggingPage1;
|
|
delete pLocalFileLoggingPage2;
|
|
|
|
ShowErrorDialog( NULL, IDS_ERROR__NO_SDO, NULL, hr, IDS_ERROR__LOGGING_TITLE, GetComponentData()->m_spConsole );
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Marshall the ISdo pointer so that the property page, which
|
|
// runs in another thread, can unmarshall it and use it properly.
|
|
hr = CoMarshalInterThreadInterfaceInStream(
|
|
IID_ISdoServiceControl //Reference to the identifier of the interface
|
|
, controlSdo //Pointer to the interface to be marshaled
|
|
, &( pLocalFileLoggingPage1->m_pStreamSdoServiceControlMarshal ) //Address of output variable that receives the IStream interface pointer for the marshaled interface
|
|
);
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
delete pLocalFileLoggingPage1;
|
|
delete pLocalFileLoggingPage2;
|
|
|
|
ShowErrorDialog( NULL, IDS_ERROR__NO_SDO, NULL, hr, IDS_ERROR__LOGGING_TITLE, GetComponentData()->m_spConsole );
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Marshall the ISdo pointer so that the property page, which
|
|
// runs in another thread, can unmarshall it and use it properly.
|
|
hr = CoMarshalInterThreadInterfaceInStream(
|
|
IID_ISdoServiceControl //Reference to the identifier of the interface
|
|
, controlSdo //Pointer to the interface to be marshaled
|
|
, &( pLocalFileLoggingPage2->m_pStreamSdoServiceControlMarshal ) //Address of output variable that receives the IStream interface pointer for the marshaled interface
|
|
);
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
delete pLocalFileLoggingPage1;
|
|
delete pLocalFileLoggingPage2;
|
|
|
|
ShowErrorDialog( NULL, IDS_ERROR__NO_SDO, NULL, hr, IDS_ERROR__LOGGING_TITLE, GetComponentData()->m_spConsole );
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
// Add the pages to the MMC property sheet.
|
|
hr = pPropertySheetCallback->AddPage( pLocalFileLoggingPage1->Create() );
|
|
_ASSERT( SUCCEEDED( hr ) );
|
|
|
|
hr = pPropertySheetCallback->AddPage( pLocalFileLoggingPage2->Create() );
|
|
_ASSERT( SUCCEEDED( hr ) );
|
|
|
|
// Add a synchronization object which makes sure we only commit data
|
|
// when all pages are OK with their data.
|
|
CSynchronizer * pSynchronizer = new CSynchronizer();
|
|
_ASSERTE( pSynchronizer != NULL );
|
|
|
|
// Hand the sycnchronizer off to the pages.
|
|
pLocalFileLoggingPage1->m_pSynchronizer = pSynchronizer;
|
|
pSynchronizer->AddRef();
|
|
|
|
pLocalFileLoggingPage2->m_pSynchronizer = pSynchronizer;
|
|
pSynchronizer->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::QueryPagesFor
|
|
|
|
See CSnapinNode::QueryPagesFor (which this method overrides) for detailed info.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CLocalFileLoggingNode::QueryPagesFor ( DATA_OBJECT_TYPES type )
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::QueryPagesFor\n"));
|
|
|
|
// S_OK means we have pages to display
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::GetResultPaneColInfo
|
|
|
|
See CSnapinNode::GetResultPaneColInfo (which this method overrides) for detailed info.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
OLECHAR* CLocalFileLoggingNode::GetResultPaneColInfo(int nCol)
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::GetResultPaneColInfo\n"));
|
|
|
|
// Check for preconditions:
|
|
// None.
|
|
|
|
switch( nCol )
|
|
{
|
|
case 0:
|
|
return m_bstrDisplayName;
|
|
break;
|
|
case 1:
|
|
return m_bstrDescription;
|
|
break;
|
|
default:
|
|
// ISSUE: error -- should we assert here?
|
|
return NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::SetVerbs
|
|
|
|
See CSnapinNode::SetVerbs (which this method overrides) for detailed info.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CLocalFileLoggingNode::SetVerbs( IConsoleVerb * pConsoleVerb )
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::SetVerbs\n"));
|
|
|
|
// Check for preconditions:
|
|
_ASSERTE( pConsoleVerb != NULL );
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
// We want the user to be able to choose Properties on this node
|
|
hr = pConsoleVerb->SetVerbState( MMC_VERB_PROPERTIES, ENABLED, TRUE );
|
|
|
|
// We want Properties to be the default
|
|
hr = pConsoleVerb->SetDefaultVerb( MMC_VERB_PROPERTIES );
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::GetComponentData
|
|
|
|
This method returns our unique CComponentData object representing the scope
|
|
pane of this snapin.
|
|
|
|
It relies upon the fact that each node has a pointer to its parent,
|
|
except for the root node, which instead has a member variable pointing
|
|
to CComponentData.
|
|
|
|
This would be a useful function to use if, for example, you need a reference
|
|
to some IConsole but you weren't passed one. You can use GetComponentData
|
|
and then use the IConsole pointer which is a member variable of our
|
|
CComponentData object.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CLoggingComponentData * CLocalFileLoggingNode::GetComponentData( void )
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::GetComponentData\n"));
|
|
|
|
// Check for preconditions:
|
|
_ASSERTE( m_pParentNode != NULL );
|
|
|
|
return ((CLoggingMethodsNode *) m_pParentNode)->GetComponentData();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::GetServerRoot
|
|
|
|
This method returns the Server node under which this node can be found.
|
|
|
|
It relies upon the fact that each node has a pointer to its parent,
|
|
all the way up to the server node.
|
|
|
|
This would be a useful function to use if, for example, you need a reference
|
|
to some data specific to a server.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
CLoggingMachineNode * CLocalFileLoggingNode::GetServerRoot( void )
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::GetServerRoot\n"));
|
|
|
|
// Check for preconditions:
|
|
_ASSERTE( m_pParentNode != NULL );
|
|
|
|
return ((CLoggingMethodsNode *) m_pParentNode)->GetServerRoot();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CLocalFileLoggingNode::OnPropertyChange
|
|
|
|
This is our own custom response to the MMCN_PROPERTY_CHANGE notification.
|
|
|
|
MMC never actually sends this notification to our snapin with a specific lpDataObject,
|
|
so it would never normally get routed to a particular node but we have arranged it
|
|
so that our property pages can pass the appropriate CSnapInItem pointer as the param
|
|
argument. In our CComponent::Notify override, we map the notification message to
|
|
the appropriate node using the param argument.
|
|
|
|
--*/
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
HRESULT CLocalFileLoggingNode::OnPropertyChange(
|
|
LPARAM arg
|
|
, LPARAM param
|
|
, IComponentData * pComponentData
|
|
, IComponent * pComponent
|
|
, DATA_OBJECT_TYPES type
|
|
)
|
|
{
|
|
ATLTRACE(_T("# CLocalFileLoggingNode::OnPropertyChange\n"));
|
|
|
|
// Check for preconditions:
|
|
// None.
|
|
|
|
return LoadCachedInfoFromSdo();
|
|
}
|