Leaked source code of windows server 2003
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

/*++
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;
}