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.
531 lines
12 KiB
531 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
FaxEventLogging.cpp
|
|
|
|
Abstract:
|
|
|
|
Implementation of Event Logging Class.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG) Jun, 2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "stdafx.h"
|
|
#include "FaxComEx.h"
|
|
#include "FaxEventLogging.h"
|
|
|
|
//
|
|
//================= PUT LEVEL =======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::PutLevel(
|
|
FAX_ENUM_LOG_CATEGORIES faxCategory,
|
|
FAX_LOG_LEVEL_ENUM faxLevel
|
|
)
|
|
/*++
|
|
|
|
Routine name : CFaxEventLogging::PutLevel
|
|
|
|
Routine description:
|
|
|
|
Set the Level of given Category.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Jun, 2000
|
|
|
|
Arguments:
|
|
|
|
faxCategory [in] - the Category for which level is desired.
|
|
faxLevel [in] - the result : level of the given category
|
|
|
|
Return Value:
|
|
|
|
Standard HRESULT code
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBG_ENTER(_T("CFaxEventLogging::PutLevel"), hr, _T("Category : %d"), faxCategory);
|
|
|
|
//
|
|
// check the range
|
|
//
|
|
if (faxLevel > fllMAX || faxLevel < fllNONE)
|
|
{
|
|
//
|
|
// Out of range
|
|
//
|
|
hr = E_INVALIDARG;
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
IDS_ERROR_OUTOFRANGE,
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
CALL_FAIL(GENERAL_ERR, _T("Level is out of range"), hr);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Sync with the Server for the first time
|
|
//
|
|
if (!m_bInited)
|
|
{
|
|
hr = Refresh();
|
|
if (FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
switch(faxCategory)
|
|
{
|
|
case FAXLOG_CATEGORY_INIT:
|
|
m_InitLevel = faxLevel;
|
|
break;
|
|
case FAXLOG_CATEGORY_OUTBOUND:
|
|
m_OutboundLevel = faxLevel;
|
|
break;
|
|
case FAXLOG_CATEGORY_INBOUND:
|
|
m_InboundLevel = faxLevel;
|
|
break;
|
|
default:
|
|
m_GeneralLevel = faxLevel;
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//================= GET LEVEL =======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::GetLevel(
|
|
FAX_ENUM_LOG_CATEGORIES faxCategory,
|
|
FAX_LOG_LEVEL_ENUM *pLevel
|
|
)
|
|
/*++
|
|
|
|
Routine name : CFaxEventLogging::GetLevel
|
|
|
|
Routine description:
|
|
|
|
Return current Level of given Category.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Jun, 2000
|
|
|
|
Arguments:
|
|
|
|
faxCategory [in] - the Category for which level is desired.
|
|
pLevel [out] - the result : level of the given category
|
|
|
|
Return Value:
|
|
|
|
Standard HRESULT code
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBG_ENTER(_T("CFaxEventLogging::GetLevel"), hr, _T("Category : %d"), faxCategory);
|
|
|
|
//
|
|
// Check that we have a good pointer
|
|
//
|
|
if (::IsBadWritePtr(pLevel, sizeof(FAX_LOG_LEVEL_ENUM)))
|
|
{
|
|
//
|
|
// Got Bad Return Pointer
|
|
//
|
|
hr = E_POINTER;
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
IDS_ERROR_INVALID_ARGUMENT,
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
CALL_FAIL(GENERAL_ERR, _T("::IsBadWritePtr(pLevel, sizeof(FAX_LOG_LEVEL_ENUM))"), hr);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Sync with the Server for the first time
|
|
//
|
|
if (!m_bInited)
|
|
{
|
|
hr = Refresh();
|
|
if (FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
switch(faxCategory)
|
|
{
|
|
case FAXLOG_CATEGORY_INIT:
|
|
*pLevel = m_InitLevel;
|
|
break;
|
|
case FAXLOG_CATEGORY_OUTBOUND:
|
|
*pLevel = m_OutboundLevel;
|
|
break;
|
|
case FAXLOG_CATEGORY_INBOUND:
|
|
*pLevel = m_InboundLevel;
|
|
break;
|
|
default:
|
|
*pLevel = m_GeneralLevel;
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== PUT INIT EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::put_InitEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM InitEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::put_InitEventsLogging"), hr, _T("Level=%d"), InitEventLevel);
|
|
hr = PutLevel(FAXLOG_CATEGORY_INIT, InitEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== PUT INBOUND EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::put_InboundEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM InboundEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::put_InboundEventsLogging"), hr, _T("Level=%d"), InboundEventLevel);
|
|
hr = PutLevel(FAXLOG_CATEGORY_INBOUND, InboundEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== PUT OUTBOUND EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::put_OutboundEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM OutboundEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::put_OutboundEventsLogging"), hr, _T("Level=%d"), OutboundEventLevel);
|
|
hr = PutLevel(FAXLOG_CATEGORY_OUTBOUND, OutboundEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== PUT GENERAL EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::put_GeneralEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM GeneralEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::put_GeneralEventsLogging"), hr, _T("Level=%d"), GeneralEventLevel);
|
|
hr = PutLevel(FAXLOG_CATEGORY_UNKNOWN, GeneralEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== GET_INIT EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::get_InitEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM *pInitEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::get_InitEventsLogging"), hr);
|
|
hr = GetLevel(FAXLOG_CATEGORY_INIT, pInitEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== GET INBOUND EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::get_InboundEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM *pInboundEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::get_InboundEventsLogging"), hr);
|
|
hr = GetLevel(FAXLOG_CATEGORY_INBOUND, pInboundEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== GET OUTBOUND EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::get_OutboundEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM *pOutboundEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::get_OutboundEventsLogging"), hr);
|
|
hr = GetLevel(FAXLOG_CATEGORY_OUTBOUND, pOutboundEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//====================== GET GENERAL EVENTS LEVEL ======================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::get_GeneralEventsLevel(
|
|
/*[out, retval]*/ FAX_LOG_LEVEL_ENUM *pGeneralEventLevel
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
DBG_ENTER(_T("CFaxEventLogging::get_GeneralEventsLogging"), hr);
|
|
hr = GetLevel(FAXLOG_CATEGORY_UNKNOWN, pGeneralEventLevel);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//================== SAVE ===============================================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::Save()
|
|
/*++
|
|
|
|
Routine name : CFaxEventLogging::Save
|
|
|
|
Routine description:
|
|
|
|
Save the Object's contents : bring its current logging categories settings to the Server.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Jun, 2000
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
Standard HRESULT code
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBG_ENTER(_T("CFaxEventLogging::Save"), hr);
|
|
|
|
if (!m_bInited)
|
|
{
|
|
//
|
|
// No changes
|
|
//
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Get Fax Server Handle
|
|
//
|
|
HANDLE hFaxHandle = NULL;
|
|
hr = GetFaxHandle(&hFaxHandle);
|
|
if (FAILED(hr))
|
|
{
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
GetErrorMsgId(hr),
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
return hr;
|
|
}
|
|
|
|
DWORD dwNum = 4;
|
|
FAX_LOG_CATEGORY faxCategories[4];
|
|
|
|
faxCategories[0].Category = FAXLOG_CATEGORY_INIT;
|
|
faxCategories[0].Name = m_bstrInitName;
|
|
faxCategories[0].Level = FAX_ENUM_LOG_LEVELS(m_InitLevel);
|
|
faxCategories[1].Category = FAXLOG_CATEGORY_INBOUND;
|
|
faxCategories[1].Name = m_bstrInboundName;
|
|
faxCategories[1].Level = FAX_ENUM_LOG_LEVELS(m_InboundLevel);
|
|
faxCategories[2].Category = FAXLOG_CATEGORY_OUTBOUND;
|
|
faxCategories[2].Name = m_bstrOutboundName;
|
|
faxCategories[2].Level = FAX_ENUM_LOG_LEVELS(m_OutboundLevel);
|
|
faxCategories[3].Category = FAXLOG_CATEGORY_UNKNOWN;
|
|
faxCategories[3].Name = m_bstrGeneralName;
|
|
faxCategories[3].Level = FAX_ENUM_LOG_LEVELS(m_GeneralLevel);
|
|
|
|
//
|
|
// Store out setting at the Server
|
|
//
|
|
if (!FaxSetLoggingCategories(hFaxHandle, faxCategories, dwNum))
|
|
{
|
|
//
|
|
// Failed to put the Logging Categories to the Server
|
|
//
|
|
hr = Fax_HRESULT_FROM_WIN32(GetLastError());
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
GetErrorMsgId(hr),
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
CALL_FAIL(GENERAL_ERR, _T("FaxSetLoggingCategories(hFaxHandle, faxCategories, dwNum)"), hr);
|
|
return hr;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//================== REFRESH ===========================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::Refresh()
|
|
/*++
|
|
|
|
Routine name : CFaxEventLogging::Refresh
|
|
|
|
Routine description:
|
|
|
|
Refresh the Object's contents : bring new logging categories settings from the Server.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Jun, 2000
|
|
|
|
Arguments:
|
|
|
|
|
|
Return Value:
|
|
|
|
Standard HRESULT code
|
|
|
|
--*/
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
DBG_ENTER(_T("CFaxEventLogging::Refresh"), hr);
|
|
|
|
//
|
|
// Get Fax Server Handle
|
|
//
|
|
HANDLE hFaxHandle = NULL;
|
|
hr = GetFaxHandle(&hFaxHandle);
|
|
if (FAILED(hr))
|
|
{
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
GetErrorMsgId(hr),
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// Ask the Server for the Logging Settings
|
|
//
|
|
DWORD dwNum;
|
|
CFaxPtr<FAX_LOG_CATEGORY> pLogCategory;
|
|
if (!FaxGetLoggingCategories(hFaxHandle, &pLogCategory, &dwNum))
|
|
{
|
|
//
|
|
// Failed to get the Logging Categories from the Server
|
|
//
|
|
hr = Fax_HRESULT_FROM_WIN32(GetLastError());
|
|
AtlReportError(CLSID_FaxEventLogging,
|
|
GetErrorMsgId(hr),
|
|
IID_IFaxEventLogging,
|
|
hr);
|
|
CALL_FAIL(GENERAL_ERR, _T("FaxGetLoggingCategories(hFaxHandle, &pLogCategory, &dwNum)"), hr);
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// must be 4 categories
|
|
//
|
|
ATLASSERT(dwNum == 4);
|
|
|
|
for (DWORD i=0; i<dwNum; i++)
|
|
{
|
|
switch(pLogCategory[i].Category)
|
|
{
|
|
case FAXLOG_CATEGORY_INIT:
|
|
m_bstrInitName = pLogCategory[i].Name;
|
|
m_InitLevel = FAX_LOG_LEVEL_ENUM(pLogCategory[i].Level);
|
|
break;
|
|
case FAXLOG_CATEGORY_OUTBOUND:
|
|
m_bstrOutboundName = pLogCategory[i].Name;
|
|
m_OutboundLevel = FAX_LOG_LEVEL_ENUM(pLogCategory[i].Level);
|
|
break;
|
|
case FAXLOG_CATEGORY_INBOUND:
|
|
m_bstrInboundName = pLogCategory[i].Name;
|
|
m_InboundLevel = FAX_LOG_LEVEL_ENUM(pLogCategory[i].Level);
|
|
break;
|
|
case FAXLOG_CATEGORY_UNKNOWN:
|
|
m_bstrGeneralName = pLogCategory[i].Name;
|
|
m_GeneralLevel = FAX_LOG_LEVEL_ENUM(pLogCategory[i].Level);
|
|
break;
|
|
default:
|
|
//
|
|
// ASSERT(FALSE)
|
|
//
|
|
ATLASSERT(pLogCategory[i].Category == FAXLOG_CATEGORY_INIT);
|
|
break;
|
|
}
|
|
}
|
|
|
|
m_bInited = true;
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
//================== SUPPORT ERROR INFO =====================================
|
|
//
|
|
STDMETHODIMP
|
|
CFaxEventLogging::InterfaceSupportsErrorInfo(
|
|
REFIID riid
|
|
)
|
|
/*++
|
|
|
|
Routine name : CFaxEventLogging::InterfaceSupportsErrorInfo
|
|
|
|
Routine description:
|
|
|
|
ATL's implementation of Support Error Info.
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Jun, 2000
|
|
|
|
Arguments:
|
|
|
|
riid [in] - Reference to the IID
|
|
|
|
Return Value:
|
|
|
|
Standard HRESULT code
|
|
|
|
--*/
|
|
{
|
|
static const IID* arr[] =
|
|
{
|
|
&IID_IFaxEventLogging
|
|
};
|
|
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
|
|
{
|
|
if (InlineIsEqualGUID(*arr[i],riid))
|
|
return S_OK;
|
|
}
|
|
return S_FALSE;
|
|
}
|