windows-nt/Source/XPSP1/NT/printscan/fax/service/faxevent/faxevent.c
2020-09-26 16:20:57 +08:00

312 lines
5.7 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
eventlog.c
Abstract:
This file contains all functions that access the application event log.
Author:
Wesley Witt (wesw) 19-Mar-1996
Environment:
User Mode
--*/
#include <windows.h>
#include <tapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "winfax.h"
#include "faxutil.h"
#include "faxreg.h"
#include "faxsvcrg.h"
#include "faxdev.h"
#include "faxevent.h"
#include "messages.h"
#define MAX_STRINGS 64
#define FAX_SVC_EVENT TEXT("Fax Service")
HINSTANCE MyhInstance;
HANDLE hEventSrc;
DWORD FaxCategoryCount;
CRITICAL_SECTION CsEvent;
#ifdef OLD_WAY
FAX_LOG_CATEGORY FaxCategory[16];
#else // OLD_WAY
PFAX_LOG_CATEGORY FaxCategory;
#endif // OLD_WAY
DWORD
FaxEventDllInit(
HINSTANCE hInstance,
DWORD Reason,
LPVOID Context
)
{
if (Reason == DLL_PROCESS_ATTACH) {
MyhInstance = hInstance;
DisableThreadLibraryCalls( hInstance );
}
return TRUE;
}
BOOL
InitializeEventLog(
IN HANDLE HeapHandle,
IN PREG_FAX_SERVICE FaxReg,
PFAX_LOG_CATEGORY DefaultCategories,
int DefaultCategoryCount
)
/*++
Routine Description:
Initializes the event log for the FAX service to
record event entries.
Arguments:
HeapHandle -
FaxReg -
DefaultCategories - points to the array of FAX_LOG_CATEGORY structures
DefaultCategoryCount - the number of elements in DefaultCategories
Return Value:
TRUE for success, FALSE for failure
--*/
{
DWORD i;
HeapInitialize(HeapHandle,NULL,NULL,0);
InitializeCriticalSection( &CsEvent );
//
// create the event source, if it does not already exist
//
if ( CreateFaxEventSource( FaxReg,
DefaultCategories,
DefaultCategoryCount ) == (BOOL) FALSE )
{
return FALSE;
}
Assert( FaxReg->Logging );
//
// allocate memory for the logging category info
//
EnterCriticalSection( &CsEvent );
FaxCategory = (PFAX_LOG_CATEGORY) MemAlloc( sizeof(FAX_LOG_CATEGORY) * FaxReg->LoggingCount );
if (!FaxCategory) {
LeaveCriticalSection( &CsEvent );
return FALSE;
}
//
// capture the event categories from the registry
//
for (i=0; i<FaxReg->LoggingCount; i++) {
FaxCategory[i].Name = StringDup( FaxReg->Logging[i].CategoryName );
FaxCategory[i].Category = FaxReg->Logging[i].Number;
FaxCategory[i].Level = FaxReg->Logging[i].Level;
}
FaxCategoryCount = FaxReg->LoggingCount;
LeaveCriticalSection( &CsEvent );
//
// get a handle to the event log
//
hEventSrc = RegisterEventSource(
NULL,
FAX_SVC_EVENT
);
if (!hEventSrc) {
return FALSE;
}
return TRUE;
}
VOID
RefreshEventLog(
PREG_FAX_LOGGING FaxReg
)
/*++
Routine Description:
Refreshes the event log for the FAX service to
record event entries.
Arguments:
None.
Return Value:
None.
--*/
{
DWORD i;
EnterCriticalSection( &CsEvent );
//
// capture the event categories from the registry
//
for (i=0; i<FaxReg->LoggingCount; i++) {
if (FaxCategory[i].Name) {
MemFree( (LPVOID)FaxCategory[i].Name );
}
FaxCategory[i].Name = StringDup( FaxReg->Logging[i].CategoryName );
FaxCategory[i].Category = FaxReg->Logging[i].Number;
FaxCategory[i].Level = FaxReg->Logging[i].Level;
}
FaxCategoryCount = FaxReg->LoggingCount;
LeaveCriticalSection( &CsEvent );
}
BOOL
FaxLog(
DWORD Category,
DWORD Level,
DWORD StringCount,
DWORD FormatId,
...
)
/*++
Routine Description:
Writes a log file entry to the event log.
Arguments:
Level - Severity of the log record
StringCount - Number of strings included in the varargs
FormatId - Message file id
Return Value:
TRUE for success, FALSE for failure
--*/
{
LPTSTR Strings[MAX_STRINGS];
DWORD i;
va_list args;
WORD Type;
//
// look for the category
//
EnterCriticalSection( &CsEvent );
for (i=0; i<FaxCategoryCount; i++) {
if (FaxCategory[i].Category == Category) {
if (Level > FaxCategory[i].Level) {
LeaveCriticalSection( &CsEvent );
return FALSE;
}
}
}
LeaveCriticalSection( &CsEvent );
va_start( args, FormatId );
//
// capture the strings
//
for (i=0; i<StringCount; i++) {
Strings[i] = va_arg( args, LPTSTR );
if(Strings[i] == NULL) {
Strings[i] = TEXT("");
}
}
switch (FormatId >> 30) {
case STATUS_SEVERITY_WARNING:
Type = EVENTLOG_WARNING_TYPE;
break;
case STATUS_SEVERITY_ERROR:
Type = EVENTLOG_ERROR_TYPE;
break;
case STATUS_SEVERITY_INFORMATIONAL:
case STATUS_SEVERITY_SUCCESS:
Type = EVENTLOG_INFORMATION_TYPE;
}
//
// record the event
//
ReportEvent(
hEventSrc, // event log handle
Type, // type
(WORD) Category, // category
FormatId, // event id
NULL, // security id
(WORD) StringCount, // string count
0, // data buffer size
Strings, // strings
NULL // data buffer
);
return TRUE;
}