389 lines
7.4 KiB
C++
389 lines
7.4 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995-1996 Microsoft Corporation
|
||
|
||
Module Name :
|
||
clapiex.cpp
|
||
|
||
Abstract:
|
||
CLAPI external API.
|
||
|
||
Author:
|
||
|
||
Terence Kwan ( terryk ) 18-Sep-1996
|
||
|
||
Project:
|
||
|
||
IIS Logging 3.0
|
||
|
||
--*/
|
||
|
||
#include "precomp.hxx"
|
||
#include "comlog.hxx"
|
||
|
||
LONG g_ComLogInitializeCount = -1;
|
||
|
||
PLIST_ENTRY g_listComLogContexts;
|
||
|
||
DECLARE_DEBUG_PRINTS_OBJECT();
|
||
|
||
|
||
HANDLE
|
||
ComLogInitializeLog(
|
||
LPCSTR pszInstanceName,
|
||
LPCSTR pszMetabasePath,
|
||
LPVOID pvIMDCOM
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Initialize the Log
|
||
|
||
Arguments:
|
||
pszInstanceName - name of instance
|
||
lpszMetabasePath - path to metabase
|
||
pvIMDCOM - ptr to IMDCOM
|
||
|
||
Return Value:
|
||
handle for the context object
|
||
|
||
--*/
|
||
{
|
||
//
|
||
// create an handle and return it
|
||
|
||
//
|
||
// The constructor for COMLOG_CONTEXT will add the new context to the list of contexts.
|
||
//
|
||
|
||
COMLOG_CONTEXT *pContext = new COMLOG_CONTEXT(
|
||
pszInstanceName,
|
||
pszMetabasePath,
|
||
pvIMDCOM );
|
||
|
||
HANDLE hHandle = (HANDLE) pContext;
|
||
|
||
if (hHandle != NULL) {
|
||
|
||
//
|
||
// set up the node and put it in a queue or execute it
|
||
//
|
||
|
||
pContext->InitializeLog(
|
||
pszInstanceName,
|
||
pszMetabasePath,
|
||
pvIMDCOM );
|
||
|
||
}
|
||
|
||
return( hHandle );
|
||
} // ComLogInitializeLog
|
||
|
||
|
||
|
||
DWORD
|
||
ComLogTerminateLog( HANDLE hHandle )
|
||
/*++
|
||
|
||
Routine Description:
|
||
terminate the Log
|
||
|
||
Arguments:
|
||
handle - handle for the context object
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
DWORD err = NO_ERROR;
|
||
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext == NULL ) {
|
||
err = ERROR_INVALID_HANDLE;
|
||
|
||
} else {
|
||
|
||
pContext->TerminateLog();
|
||
delete pContext;
|
||
}
|
||
|
||
return err;
|
||
} // ComLogTerminateLog
|
||
|
||
|
||
|
||
DWORD
|
||
ComLogDllStartup(
|
||
VOID
|
||
)
|
||
{
|
||
CREATE_DEBUG_PRINT_OBJECT("iscomlog.dll");
|
||
LOAD_DEBUG_FLAGS_FROM_REG_STR("System\\CurrentControlSet\\Services\\InetInfo\\Parameters", 0);
|
||
|
||
if ( InterlockedIncrement( &g_ComLogInitializeCount ) != 0 ) {
|
||
|
||
DBGPRINTF((DBG_CONTEXT,
|
||
"ComLogDllStartup [Count is %d]\n",
|
||
g_ComLogInitializeCount));
|
||
|
||
return(NO_ERROR);
|
||
}
|
||
|
||
//
|
||
// Get platform type
|
||
//
|
||
|
||
INITIALIZE_PLATFORM_TYPE();
|
||
DBG_ASSERT( IISIsValidPlatform());
|
||
|
||
INITIALIZE_CRITICAL_SECTION(&COMLOG_CONTEXT::sm_listLock);
|
||
InitializeListHead(&COMLOG_CONTEXT::sm_ContextListHead);
|
||
|
||
return NO_ERROR;
|
||
} // ComLogStartup
|
||
|
||
|
||
DWORD
|
||
ComLogDllCleanUp(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Clean up the Log. It will wait until the queue is empty and then it will
|
||
terminate the queue.
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
PLIST_ENTRY listEntry;
|
||
COMLOG_CONTEXT* context;
|
||
|
||
if ( InterlockedDecrement( &g_ComLogInitializeCount ) >= 0 ) {
|
||
|
||
DBGPRINTF((DBG_CONTEXT,
|
||
"ComLogDllCleanUp [Count is %d]\n",
|
||
g_ComLogInitializeCount));
|
||
|
||
return(NO_ERROR);
|
||
}
|
||
|
||
//
|
||
// If we have something on the list, then the caller did not
|
||
// cleanup properly. Do the partial cleanup.
|
||
//
|
||
|
||
EnterCriticalSection( &COMLOG_CONTEXT::sm_listLock );
|
||
|
||
for ( listEntry = COMLOG_CONTEXT::sm_ContextListHead.Flink;
|
||
listEntry != &COMLOG_CONTEXT::sm_ContextListHead;
|
||
listEntry = listEntry->Flink ) {
|
||
|
||
context = (COMLOG_CONTEXT*)CONTAINING_RECORD(
|
||
listEntry,
|
||
COMLOG_CONTEXT,
|
||
m_ContextListEntry
|
||
);
|
||
|
||
DBGPRINTF((DBG_CONTEXT,
|
||
"Log context %x not terminated by server %s\n",
|
||
context, context->m_strInstanceName.QueryStr()));
|
||
|
||
context->TerminateLog( );
|
||
}
|
||
|
||
LeaveCriticalSection( &COMLOG_CONTEXT::sm_listLock );
|
||
|
||
DeleteCriticalSection(&COMLOG_CONTEXT::sm_listLock);
|
||
DELETE_DEBUG_PRINT_OBJECT( );
|
||
return(NO_ERROR);
|
||
}
|
||
|
||
DWORD
|
||
ComLogNotifyChange(
|
||
HANDLE hHandle
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Called to notify of any change in instance metabase config
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
DWORD err = NO_ERROR;
|
||
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext == NULL )
|
||
{
|
||
err = ERROR_INVALID_HANDLE;
|
||
}
|
||
else
|
||
{
|
||
pContext->NotifyChange();
|
||
}
|
||
|
||
return err;
|
||
}
|
||
|
||
|
||
DWORD
|
||
ComLogLogInformation(
|
||
IN HANDLE hHandle,
|
||
IN INETLOG_INFORMATION *pInetLogInfo
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Log information to the logging module
|
||
|
||
Arguments:
|
||
hHandle - handle for the context
|
||
pInetLogInfo - logging object
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext != NULL ) {
|
||
pContext->LogInformation( pInetLogInfo );
|
||
return(NO_ERROR);
|
||
}
|
||
return ERROR_INVALID_HANDLE;
|
||
} // ComLogLogInformation
|
||
|
||
|
||
DWORD
|
||
ComLogGetConfig(
|
||
HANDLE hHandle,
|
||
INETLOG_CONFIGURATIONA *ppConfig
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
get logging configuration information
|
||
|
||
Arguments:
|
||
hHandle - handle for the context
|
||
ppConfig - configuration information
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
DWORD err = NO_ERROR;
|
||
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext == NULL ) {
|
||
return(ERROR_INVALID_HANDLE);
|
||
} else {
|
||
pContext->GetConfig(ppConfig);
|
||
}
|
||
|
||
return err;
|
||
}
|
||
|
||
DWORD
|
||
ComLogQueryExtraLogFields(
|
||
HANDLE hHandle,
|
||
PCHAR pBuf,
|
||
PDWORD pcbBuf
|
||
)
|
||
{
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext == NULL ) {
|
||
return(ERROR_INVALID_HANDLE);
|
||
} else {
|
||
|
||
pContext->QueryExtraLogFields(pcbBuf, pBuf);
|
||
}
|
||
|
||
return(NO_ERROR);
|
||
} // ComLogQueryExtraLogFields
|
||
|
||
|
||
DWORD
|
||
ComLogSetConfig(
|
||
IN HANDLE hHandle,
|
||
IN INETLOG_CONFIGURATIONA *pConfig
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
set logging information
|
||
|
||
Arguments:
|
||
hHandle - handle for the context
|
||
pConfig - configuration information
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
DWORD err = NO_ERROR;
|
||
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext == NULL )
|
||
{
|
||
return(ERROR_INVALID_HANDLE);
|
||
}
|
||
else
|
||
{
|
||
pContext->SetConfig( pConfig );
|
||
}
|
||
|
||
return err;
|
||
} // ComLogSetConfig
|
||
|
||
|
||
DWORD
|
||
ComLogCustomInformation(
|
||
IN HANDLE hHandle,
|
||
IN DWORD cCount,
|
||
IN PCUSTOM_LOG_DATA pCustomLogData,
|
||
IN LPSTR szHeaderSuffix
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Log information to the logging module
|
||
|
||
Arguments:
|
||
hHandle - handle for the context
|
||
pInetLogInfo - logging object
|
||
|
||
Return Value:
|
||
error code
|
||
|
||
--*/
|
||
{
|
||
COMLOG_CONTEXT *pContext = (COMLOG_CONTEXT*)hHandle;
|
||
|
||
if ( pContext != NULL )
|
||
{
|
||
pContext->LogCustomInformation( cCount, pCustomLogData, szHeaderSuffix);
|
||
return(NO_ERROR);
|
||
}
|
||
return ERROR_INVALID_HANDLE;
|
||
} // ComLogCustomInformation
|
||
|