windows-nt/Source/XPSP1/NT/com/ole32/common/outfuncs.c

341 lines
8.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996.
//
// File: outfuncs.cxx
//
// Contents: functions for log/trace output
//
// Functions: AddOutputFunction
// DelOutputFunction
// CallOutputFunctions
//
// History: 09-Jan-96 murthys Created
//
//----------------------------------------------------------------------------
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdarg.h>
#include <tchar.h>
#if DBG==1
#include "outfuncs.h"
// *** Global Data ***
static StringOutFunc debugscrfn = (StringOutFunc)OutputDebugStringA;
StringOutFunc gpfunc[BUFFER_MAX_FUNCTIONS] = {
(StringOutFunc)OutputDebugStringA,
NULL
};
HANDLE ghLogFile = INVALID_HANDLE_VALUE;
CRITICAL_SECTION g_LogFileCS;
BOOL g_LogFileLockValid = FALSE;
//+---------------------------------------------------------------------------
//
// Function: AddOutputFunction
//
// Synopsis:
//
// Arguments: [pfunc] --
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void AddOutputFunction(StringOutFunc pfunc)
{
int i, at = -1;
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
{
if ((at == -1) && (gpfunc[i] == NULL))
{
at = i; // Insert it here
}
else
{
if (gpfunc[i] == pfunc) // check for dups
{
return;
}
}
}
if (at != -1)
{
gpfunc[at] = pfunc;
}
}
//+---------------------------------------------------------------------------
//
// Function: DelOutputFunction
//
// Synopsis:
//
// Arguments: [pfunc]
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void DelOutputFunction(StringOutFunc pfunc)
{
int i;
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
{
if (gpfunc[i] == pfunc)
{
gpfunc[i] = NULL;
}
}
}
//+---------------------------------------------------------------------------
//
// Function: CallOutputFunctions
//
// Synopsis:
//
// Arguments: (none)
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CallOutputFunctions(const char *buffer)
{
int i;
for (i = 0; i < BUFFER_MAX_FUNCTIONS; i++)
{
if (gpfunc[i] != NULL)
{
gpfunc[i](buffer);
}
}
}
//+---------------------------------------------------------------------------
//
// Function: WriteToDebugScreen
//
// Synopsis:
//
// Arguments: [flag] - TRUE/FALSE to turn ON/OFF
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void WriteToDebugScreen(BOOL flag)
{
if (flag)
{
AddOutputFunction(debugscrfn);
}
else
{
DelOutputFunction(debugscrfn);
}
}
//+---------------------------------------------------------------------------
//
// Function: WriteToLogFile
//
// Synopsis:
//
// Arguments: [logfile] - path of file to write to
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void WriteToLogFile(LPCTSTR lpfn)
{
if (!g_LogFileLockValid)
return;
EnterCriticalSection(&g_LogFileCS);
if (ghLogFile != INVALID_HANDLE_VALUE)
{
CloseHandle(ghLogFile);
DelOutputFunction(OutputLogFileA);
ghLogFile = INVALID_HANDLE_VALUE;
}
if ((lpfn) && (lpfn[0] != _TEXT('\0')))
{
SECURITY_ATTRIBUTES sattr;
sattr.nLength = sizeof(sattr);
sattr.lpSecurityDescriptor = NULL;
sattr.bInheritHandle = FALSE;
#ifdef _CHICAGO_
ghLogFile = CreateFileA(lpfn, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&sattr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#else
ghLogFile = CreateFile(lpfn, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&sattr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#endif // _CHICAGO_
if (ghLogFile == INVALID_HANDLE_VALUE)
{
OutputDebugStringA("OLE (WriteToLogFile):Unable to open log file!\n");
}
else
{
AddOutputFunction(OutputLogFileA);
}
}
LeaveCriticalSection(&g_LogFileCS);
}
//+---------------------------------------------------------------------------
//
// Function: OutputLogFileA
//
// Synopsis:
//
// Arguments: [buf] - NULL terminated ANSI string to write
//
// Returns:
//
// History: 09-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void OutputLogFileA(const char *buf)
{
DWORD dwtowrite = strlen(buf);
DWORD dwwritten;
LONG loffhigh = 0, lofflow;
if (!g_LogFileLockValid)
return;
EnterCriticalSection(&g_LogFileCS);
// Goto EOF, Lock, Write and Unlock
lofflow = (LONG) SetFilePointer(ghLogFile, 0, &loffhigh, FILE_END);
LockFile(ghLogFile, lofflow, loffhigh, dwtowrite, 0);
WriteFile(ghLogFile, buf, dwtowrite, &dwwritten, NULL);
UnlockFile(ghLogFile, lofflow, loffhigh, dwtowrite, 0);
LeaveCriticalSection(&g_LogFileCS);
}
//+---------------------------------------------------------------------------
//
// Function: OpenDebugSinks()
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// History: 26-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void OpenDebugSinks()
{
// Get LogFile name
char tmpstr[MAX_PATH];
DWORD cbtmpstr = sizeof(tmpstr);
LPTSTR lptstr;
NTSTATUS status = RtlInitializeCriticalSection(&g_LogFileCS);
g_LogFileLockValid = NT_SUCCESS(status);
if (!g_LogFileLockValid)
return;
GetProfileStringA("CairOLE InfoLevels", // section
"LogFile", // key
"", // default value
tmpstr, // return buffer
cbtmpstr);
if (tmpstr[0] != '\0')
{
#ifdef _CHICAGO_
lptstr = tmpstr;
WriteToLogFile(lptstr);
#else
// convert ansi to unicode
WCHAR wtmpstr[MAX_PATH];
lptstr = wtmpstr;
if (MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, tmpstr, -1, wtmpstr, MAX_PATH))
{
WriteToLogFile(lptstr);
}
else
{
OutputDebugStringA("OLE32: MultiByteToWideChar failed for logfile!\n");
}
#endif
}
// See if Debug Screen should be turned off
GetProfileStringA("CairOLE InfoLevels", // section
"DebugScreen", // key
"Yes", // default value
tmpstr, // return buffer
cbtmpstr);
if ((tmpstr[0] == 'n') || (tmpstr[0] == 'N'))
{
WriteToDebugScreen(FALSE); // turn off output to debugger screen
}
}
//+---------------------------------------------------------------------------
//
// Function: CloseDebugSinks()
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// History: 26-Jan-96 murthys Created
//
// Notes:
//
//----------------------------------------------------------------------------
void CloseDebugSinks()
{
// close log file (if any)
WriteToLogFile(NULL);
if (g_LogFileLockValid)
{
DeleteCriticalSection(&g_LogFileCS);
}
}
#endif // DBG == 1