view LightClone/Source/Trace.cpp @ 60:b0f642ee22d3

Additional maps
author koryspansel <koryspansel@bendbroadband.com>
date Mon, 03 Oct 2011 08:58:08 -0700
parents 95677f648a2c
children 1fe27776627e
line wrap: on
line source

/*
 * Trace
 */

#include "Trace.h"

#if defined(TRACE_ENABLE)

#include "Core.h"
#include "ArrayList.h"
#include <stdarg.h>
#include <stdio.h>

/*
 * MaximumTraceBufferSize
 */
static const uint32 MaximumTraceBufferSize = 1024;

/*
 * kHandlers
 */
ArrayList<TraceHandler*> kHandlers;

/*
 * ConsoleTraceHandler
 */
class ConsoleTraceHandler : public TraceHandler
{
public:

	/*
	 * Trace
	 */
	virtual void Trace(const char* pBuffer, uint32 nSize)
	{
		printf(pBuffer);
	}
};

/*
 * DebugTraceHandler
 */
class DebugTraceHandler : public TraceHandler
{
public:

	/*
	 * Trace
	 */
	virtual void Trace(const char* pBuffer, uint32 nSize)
	{
		OutputDebugStringA(pBuffer);
	}
};

/*
 * FileTraceHandler
 */
class FileTraceHandler : public TraceHandler
{
	/*
	 * pFile
	 */
	FILE* pFile;

public:

	/*
	 * FileTraceHandler
	 */
	FileTraceHandler(const char* pName) : pFile(NULL)
	{
		pFile = fopen(pName, "wt");
		//ASSERT(pFile != NULL);
	}

	/*
	 * ~FileTraceHandler
	 */
	~FileTraceHandler()
	{
		if(pFile)
		{
			fclose(pFile);
		}
	}

	/*
	 * Trace
	 */
	virtual void Trace(const char* pBuffer, uint32 nSize)
	{
		if(pFile)
		{
			fwrite(pBuffer, sizeof(char), nSize, pFile);
			fflush(pFile);
		}
	}
};

/*
 * InitializeTrace
 */
ErrorCode InitializeTrace(uint32 nFlags)
{
	if(nFlags & TraceFlag_Console)
		kHandlers.Add(new ConsoleTraceHandler());

	if(nFlags & TraceFlag_Debug)
		kHandlers.Add(new DebugTraceHandler());

	if(nFlags & TraceFlag_File)
		kHandlers.Add(new FileTraceHandler("Trace.txt"));

	return Error_Success;
}

/*
 * TerminateTrace
 */
void TerminateTrace()
{
	for(uint32 i = 0; i < kHandlers.Size(); ++i)
	{
		delete kHandlers[i];
	}

	kHandlers.Clear();
}

/*
 * PerformTrace
 */
void PerformTrace(const char* pFormat, ...)
{
	va_list kArguments;
	va_start(kArguments, pFormat);

	char kBuffer[MaximumTraceBufferSize];
	int32 nCount = vsnprintf(kBuffer, sizeof(kBuffer), pFormat, kArguments);
	if(nCount > 0)
	{
		for(uint32 i = 0; i < kHandlers.Size(); ++i)
		{
			kHandlers[i]->Trace(kBuffer, nCount);
		}
	}

	va_end(kArguments);
}

#endif