|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
ilogging.cpp
Abstract:
Internal implementation for the logging subfolder.
Environment:
WIN32 User Mode
Author:
Darwin Ouyang (t-darouy) 30-Sept-1997
--*/
#include "StdAfx.h"
#include "inode.h" // base class
#include "iroot.h" // iroot
#include "ilogging.h" // logging folder
#include "ilogcat.h" // log category item
#include "faxsnapin.h" // snapin
#include "faxdataobj.h" // dataobject
#include "faxstrt.h" // string table
#pragma hdrstop
extern CStringTable * GlobalStringTable;
// Generated with uuidgen. Each node must have a GUID associated with it.
// This one is for the logging subfolder.
const GUID GUID_LoggingNode = /* 03d8fbd8-3e9e-11d1-9075-00a0c90ab504 */ { 0x03d8fbd8, 0x3e9e, 0x11d1, {0x90, 0x75, 0x00, 0xa0, 0xc9, 0x0a, 0xb5, 0x04} };
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Constructor and destructor
//
//
CInternalLogging::CInternalLogging( CInternalNode * pParent, CFaxComponentData * pCompData ) : CInternalNode( pParent, pCompData ) /*++
Routine Description:
Constructor
Arguments:
pParent - pointer to parent node, in this case unused pCompData - pointer to IComponentData implementation for snapin global data
Return Value:
None.
--*/ { faxHandle = m_pCompData->m_FaxHandle; assert( faxHandle != NULL ); }
CInternalLogging::~CInternalLogging() /*++
Routine Description:
Destructor
Arguments:
None.
Return Value:
None.
--*/ {
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Mandatory CInternalNode implementations.
//
//
const GUID * CInternalLogging::GetNodeGUID() /*++
Routine Description:
Returns the node's associated GUID.
Arguments:
None.
Return Value:
A const pointer to a binary GUID.
--*/ { // DebugPrint(( TEXT("Trace: CInternalLogging::GetNodeGUID") ));
return &GUID_LoggingNode; }
const LPTSTR CInternalLogging::GetNodeDisplayName() /*++
Routine Description:
Returns a const TSTR pointer to the node's display name.
Arguments:
None.
Return Value:
A const pointer to a TSTR.
--*/ { // DebugPrint(( TEXT("Trace: CInternalLogging::GetNodeDisplayName") ));
return ::GlobalStringTable->GetString( IDS_LOGGINGNODENAME ); }
const LPTSTR CInternalLogging::GetNodeDescription() /*++
Routine Description:
Returns a const TSTR pointer to the node's display description.
Arguments:
None.
Return Value:
A const pointer to a TSTR.
--*/ { // DebugPrint(( TEXT("Trace: CInternalLogging::GetNodeDisplayName") ));
return ::GlobalStringTable->GetString( IDS_LOGGING_FOLDER_DESC_ROOT ); }
const LONG_PTR CInternalLogging::GetCookie() /*++
Routine Description:
Returns the cookie for this node.
Arguments:
None.
Return Value:
A const long containing the cookie for the pointer, in this case, (long)this.
--*/ { // DebugPrint(( TEXT("Trace: CInternalLogging::GetCookie") ));
DebugPrint(( TEXT("Logging Node Cookie: 0x%p"), this )); return (LONG_PTR)this; // status node's cookie is the node id.
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Internal Event Handlers
//
//
HRESULT CInternalLogging::ResultOnShow( IN CFaxComponent* pComp, IN CFaxDataObject * lpDataObject, IN LPARAM arg, IN LPARAM param) /*++
Routine Description:
Event handler for the MMCN_SHOW message for the logging node.
Arguments:
pComp - a pointer to the instance of IComponentData which this root node is associated with. lpDataObject - a pointer to the data object containing context information for this node. pdo - a pointer to the data object associated with this node arg, param - the arguements of the message
Return Value:
HRESULT which indicates SUCCEEDED() or FAILED()
--*/ { DebugPrint(( TEXT("Trace: CInternalLogging::ResultOnShow") ));
HRESULT hr = S_OK; unsigned int count; int iResult; BOOL bResult = FALSE;
LPHEADERCTRL pIHeaderCtrl;
if( m_pCompData->QueryRpcError() ) { return E_UNEXPECTED; }
if( arg == TRUE ) { // need to display result pane
do { // get resultdata pointer
pIResultData = pComp->m_pResultData; assert( pIResultData ); if( pIResultData == NULL ) { hr = E_UNEXPECTED; break; }
// insert the icons into the image list
hr = pComp->InsertIconsIntoImageList(); assert( SUCCEEDED( hr ) ); if( FAILED( hr ) ) { break; }
// set headers
pIHeaderCtrl = pComp->m_pHeaderCtrl;
hr = pIHeaderCtrl->InsertColumn( 0, ::GlobalStringTable->GetString( IDS_LOG_CATEGORY ), LVCFMT_LEFT, MMCLV_AUTO ); if( FAILED( hr ) ) { break; }
hr = pIHeaderCtrl->InsertColumn( 1, ::GlobalStringTable->GetString( IDS_LOG_LEVEL ), LVCFMT_LEFT, MMCLV_AUTO ); if( FAILED( hr ) ) { break; }
// get fax info
try { bResult = FaxGetLoggingCategories( faxHandle, &pComp->pCategories, &pComp->numCategories ); } catch( ... ) { }
if( !bResult ) { if (GetLastError() == ERROR_ACCESS_DENIED) { ::GlobalStringTable->SystemErrorMsg(ERROR_ACCESS_DENIED); } else { m_pCompData->NotifyRpcError( TRUE ); hr = m_pCompData->m_pConsole->MessageBox(::GlobalStringTable->GetString( IDS_FAX_RETR_CAT_FAIL ), ::GlobalStringTable->GetString( IDS_ERR_TITLE ), MB_OK, &iResult); } hr = E_UNEXPECTED; break; }
pComp->pLogPArray = new pCInternalLogCat[pComp->numCategories]; assert(pComp->pLogPArray != NULL); if (!pComp->pLogPArray) { hr = E_OUTOFMEMORY; break; }
ZeroMemory( (void*)pComp->pLogPArray, sizeof( pCInternalLogCat ) * pComp->numCategories);
for( count = 0; count < pComp->numCategories; count++ ) { hr = InsertItem( &pComp->pLogPArray[count], &(pComp->pCategories[count]) ); if( !SUCCEEDED( hr ) ) { break; } } } while( 0 ); } else { // we're leaving the result pane
// so we need to delete my result pane
FaxFreeBuffer( (PVOID)pComp->pCategories ); pComp->pCategories = NULL; for( count = 0; count < pComp->numCategories; count++ ) { if( pComp->pLogPArray ) { if (pComp->pLogPArray[count] != NULL ) { delete pComp->pLogPArray[count]; pComp->pLogPArray[count] = NULL; } } } }
return hr; }
HRESULT CInternalLogging::ResultOnDelete( IN CFaxComponent* pComp, IN CFaxDataObject * lpDataObject, IN LPARAM arg, LPARAM param) /*++
Routine Description:
Event handler for the MMCN_DELETE message for the logging node.
Arguments:
pComp - a pointer to the instance of IComponentData which this root node is associated with. lpDataObject - a pointer to the data object containing context information for this node. pdo - a pointer to the data object associated with this node arg, param - the arguements of the message
Return Value:
HRESULT which indicates SUCCEEDED() or FAILED()
--*/ { unsigned int count;
for( count = 0; count < pComp->numCategories; count++ ) { if( pComp->pLogPArray[count] != NULL ) { delete pComp->pLogPArray[count]; pComp->pLogPArray[count] = NULL; } } delete pComp->pLogPArray; pComp->pLogPArray = NULL;
return S_OK; }
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Internal Functions
//
//
HRESULT CInternalLogging::CommitChanges( CFaxComponent * pComp ) /*++
Routine Description:
This function writes changes made in the subnodes out to the target fax service.
Arguments:
pComp - a pointer to the instance of IComponent associated with the event.
Return Value:
HRESULT which indicates SUCCEEDED() or FAILED()
--*/ { BOOL result = FALSE;
if( m_pCompData->QueryRpcError() ) { return E_UNEXPECTED; }
try { result = FaxSetLoggingCategories( faxHandle, pComp->pCategories, pComp->numCategories ); } catch( ... ) { m_pCompData->NotifyRpcError( TRUE ); }
if( result == FALSE || m_pCompData->QueryRpcError() == TRUE ) { if (GetLastError() != ERROR_ACCESS_DENIED) { m_pCompData->NotifyRpcError( TRUE ); assert(FALSE); }
::GlobalStringTable->SystemErrorMsg( GetLastError() );
// clean up the result pane
assert( pComp != NULL ); pComp->m_pResultData->DeleteAllRsltItems();
if(pComp->pLogPArray != NULL ) { for( DWORD count = 0; count < pComp->numCategories; count++ ) { if( pComp->pLogPArray[count] != NULL ) { delete pComp->pLogPArray[count]; pComp->pLogPArray[count] = NULL; } } delete pComp->pLogPArray; pComp->pLogPArray = NULL; }
assert( FALSE ); return E_UNEXPECTED; }
return S_OK; }
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
// Utility Functions
//
//
HRESULT CInternalLogging::InsertItem( IN CInternalLogCat ** pLogCat, IN PFAX_LOG_CATEGORY Category ) /*++
Routine Description:
Wrapper that inserts an item into the result view pane given some information.
Arguments:
pLogCat - the instance of CInternalLogCat to insert Category - the information associated with that log category.
Return Value:
HRESULT which indicates SUCCEEDED() or FAILED()
--*/ { RESULTDATAITEM rdi; HRESULT hr = S_OK;
if (!pLogCat) { return(E_POINTER); }
*pLogCat = new CInternalLogCat( this, m_pCompData ); assert(*pLogCat != NULL); if (!*pLogCat) { return(E_OUTOFMEMORY); }
(*pLogCat)->SetLogCategory( Category );
ZeroMemory( &rdi, sizeof( RESULTDATAITEM ) ); rdi.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; rdi.nCol = 0; rdi.bScopeItem = FALSE; rdi.lParam = (*pLogCat)->GetCookie(); rdi.nImage = (*pLogCat)->GetNodeDisplayImage(); rdi.str = MMC_CALLBACK;
hr = pIResultData->InsertItem( &rdi ); assert( SUCCEEDED( hr ) );
(*pLogCat)->SetItemID( rdi.itemID ); return hr; }
|