www.pudn.com > IOCPNet_Demo.zip > errlog.cpp


//////////////////////////////////////////////////////////////////////////////////////////////////// 
//	Module Name: 
//		ErrLog.cpp 
//	Author: 
//		Chun-Hyok, Chong. 
//////////////////////////////////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include  
#include  
#include  
#include "ErrLog.h" 
#include "SafeDynMem.h" 
 
#define DIFF_BACK_SLASH								"\\" 
#define DIFF_BACK_SLASH_CHAR						'\\' 
#define DIFF_DRIVE_LETTER_HEADER_MARK				":\\\\" 
#define DIFF_UNC_HEADER_MARK						"\\\\" 
#define DIFF_DOT									"." 
 
#define ACCESS_TYPE_DRIVE_LETTER					1 
#define ACCESS_TYPE_UNC								2 
 
// Return Code 
#define RET_SUCCESS									1 
#define RET_FAIL									-1 
 
void OErrLog::Init() 
{ 
	ZeroMemory(m_Path, sizeof (m_Path)); 
	ZeroMemory(m_FileName, sizeof (m_FileName)); 
	ZeroMemory(m_FileExtent, sizeof (m_FileExtent)); 
	ZeroMemory(m_WholePathFile, sizeof (m_WholePathFile)); 
	m_AccessType = ERR_INVALID_VALUE; 
} // Init() 
 
int OErrLog::SetErrLogFile(const char *InsertedPathFile) 
{ 
	char *pTail; 
	char *pPoint; 
	 
	if (0 == strlen(InsertedPathFile)) 
	{ 
		return RET_FAIL; 
	} 
 
	if (NULL != strstr(InsertedPathFile, DIFF_DRIVE_LETTER_HEADER_MARK)) 
	{ 
		m_AccessType = ACCESS_TYPE_DRIVE_LETTER; 
	} 
	else if (*InsertedPathFile == DIFF_BACK_SLASH_CHAR && *(InsertedPathFile + 1) == DIFF_BACK_SLASH_CHAR) 
	{ 
		m_AccessType = ACCESS_TYPE_UNC; 
	} 
	else 
	{ 
		return RET_FAIL; 
	} 
 
	// In the case of drive letter, the header formed like 'd:\\'(:\\) is valied. 
	// In the case of UNC, the header formed like '\\sleepyrea\test'(\\\) is valid. 
	if (ACCESS_TYPE_DRIVE_LETTER == m_AccessType) 
	{ 
		pTail = strstr(InsertedPathFile, DIFF_DRIVE_LETTER_HEADER_MARK) + strlen(DIFF_DRIVE_LETTER_HEADER_MARK); 
		if (InsertedPathFile + strlen(InsertedPathFile) == pTail) 
		{ 
			return RET_FAIL; 
		} 
	} 
	else // if (ACCESS_TYPE_UNC == m_AccessType) 
	{ 
		pTail = strstr(InsertedPathFile, DIFF_UNC_HEADER_MARK) + strlen(DIFF_UNC_HEADER_MARK); 
		pPoint = strstr(pTail, DIFF_BACK_SLASH); 
		if (NULL == pPoint) 
		{ 
			return RET_FAIL; 
		} 
		pTail = pPoint + 1; 
		pPoint = strstr(pTail, DIFF_BACK_SLASH); 
		if (NULL == pPoint) 
		{ 
			return RET_FAIL; 
		} 
		pTail = pPoint + 1; 
		if (InsertedPathFile + strlen(InsertedPathFile) == pTail) 
		{ 
			return RET_FAIL; 
		} 
	} 
	 
	while (TRUE) 
	{ 
		pPoint = strstr(pTail, DIFF_BACK_SLASH); 
		if (NULL == pPoint) 
		{ 
			ZeroMemory(m_Path, sizeof (m_Path)); 
			strncpy(m_Path, InsertedPathFile, pTail - InsertedPathFile); 
			 
			ZeroMemory(m_FileName, sizeof (m_FileName)); 
			ZeroMemory(m_FileExtent, sizeof (m_FileExtent)); 
			pPoint = strstr(pTail, DIFF_DOT); 
			if (NULL == pPoint) 
			{ 
				strncpy(m_FileName, pTail, InsertedPathFile + strlen(InsertedPathFile) - pTail); 
			} 
			else 
			{ 
				strncpy(m_FileName, pTail, pPoint - pTail); 
				strncpy(m_FileExtent, pPoint + 1, InsertedPathFile + strlen(InsertedPathFile) - pPoint - 1); 
			} 
 
			if (0 == strlen(m_FileName)) 
			{ 
				return RET_FAIL; 
			} 
			break; 
		} 
		pTail = pPoint + 1; 
	} 
 
	return RET_SUCCESS; 
} // SetErrLogFile() 
 
int OErrLog::ErrLog(const char *SrcCodeFileName, int SrcCodeLine, const char *Msg, ...) 
{ 
	HANDLE hFile; 
	DWORD ErrorCode; 
	char *pPoint; 
	char *pTail; 
	SYSTEMTIME TimeInfo; 
	char GrowingPath[ERR_PATH_FILE_LEN]; 
	BOOL bRes; 
	int	len; 
	va_list args; 
	char *ErrStr; 
	char *ResultErrStr; 
	DWORD dwRes; 
	DWORD WrittenNum; 
	OSafeDynMem MemForErrStr; 
	OSafeDynMem MemForResultErrStr; 
 
	if (0 == strlen(m_Path) || 0 == strlen(m_FileName)) 
	{ 
		return RET_SUCCESS; 
	} 
 
	// format error string 
	ErrStr = (char *)MemForErrStr.Allocate(ERR_MSG_LEN); 
	if (NULL == ErrStr) 
	{ 
		return RET_FAIL; 
	} 
 
	va_start(args, Msg);				// Initialize variable arguments. 
	len = vsprintf(ErrStr, Msg, args); 
	va_end(args);						// Reset variable arguments. 
   
	ResultErrStr = (char *)MemForResultErrStr.Allocate(ERR_MSG_LEN); 
	if (NULL == ResultErrStr) 
	{ 
		return RET_FAIL; 
	} 
	 
	ZeroMemory(&TimeInfo, sizeof (TimeInfo)); 
	GetLocalTime(&TimeInfo); 
	sprintf(ResultErrStr, "File: %s, Line: %d, Msg: %s," 
		" Date: %04d/%02d/%02d, Time: %02d:%02d:%02d\r\n", 
		SrcCodeFileName, SrcCodeLine, ErrStr, TimeInfo.wYear, TimeInfo.wMonth, TimeInfo.wDay, TimeInfo.wHour, TimeInfo.wMinute, TimeInfo.wSecond); 
	if (0 == MemForErrStr.Free()) 
	{ 
		return RET_FAIL; 
	} 
 
	if (0 == strlen(m_FileExtent)) 
	{ 
		sprintf(m_WholePathFile, "%s%s%04d%02d%02d", m_Path, m_FileName, TimeInfo.wYear, TimeInfo.wMonth, TimeInfo.wDay); 
	} 
	else 
	{ 
		sprintf(m_WholePathFile, "%s%s%04d%02d%02d.%s", m_Path, m_FileName, TimeInfo.wYear, TimeInfo.wMonth, TimeInfo.wDay, m_FileExtent); 
	} 
 
	hFile = CreateFile(m_WholePathFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
	if (INVALID_HANDLE_VALUE == hFile) 
	{ 
		// Drive Letter & UNC, No File -> ERROR_FILE_NOT_FOUND(2). 
		// Drive Letter, No Path -> ERROR_PATH_NOT_FOUND(3). 
		// UNC, No Path -> ERROR_BAD_NET_NAME(67). 
		ErrorCode = GetLastError(); 
		if (ERROR_FILE_NOT_FOUND == ErrorCode) 
		{ 
			hFile = CreateFile(m_WholePathFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 
			if (INVALID_HANDLE_VALUE == hFile) 
			{ 
				return RET_FAIL; 
			} 
			CloseHandle(hFile); // For creating. 
		} 
		else if (ERROR_PATH_NOT_FOUND == ErrorCode || ERROR_BAD_NET_NAME == ErrorCode) 
		{ 
			ZeroMemory(GrowingPath, sizeof (GrowingPath)); 
			pTail = m_Path; 
			if (ACCESS_TYPE_DRIVE_LETTER == m_AccessType) 
			{ 
				pTail = strstr(pTail, DIFF_DRIVE_LETTER_HEADER_MARK) + strlen(DIFF_DRIVE_LETTER_HEADER_MARK); 
				strncpy(GrowingPath, m_Path, pTail - m_Path); 
			} 
			else // if (ACCESS_TYPE_UNC == m_AccessType) 
			{ 
				pTail += strlen(DIFF_UNC_HEADER_MARK); 
				pTail = strstr(pTail, DIFF_BACK_SLASH) + 1; 
				pTail = strstr(pTail, DIFF_BACK_SLASH) + 1; 
								 
				strncpy(GrowingPath, m_Path, pTail - m_Path); 
			} 
 
			while (TRUE) 
			{ 
				if (!SetCurrentDirectory(GrowingPath)) 
				{ 
					ErrorCode = GetLastError(); 
					// If there is no exact directory(when Drive Letter & UNC), ERROR_FILE_NOT_FOUND is returned. 
					if (ERROR_FILE_NOT_FOUND == ErrorCode) 
					{ 
						if (!CreateDirectory(GrowingPath, NULL)) 
						{ 
							return RET_FAIL; 
						} 
					} 
					else 
					{ 
						return RET_FAIL; 
					} 
 
					if (!SetCurrentDirectory(GrowingPath)) 
					{ 
						return RET_FAIL; 
					} 
				} 
			 
				pPoint = strstr(pTail, DIFF_BACK_SLASH); 
				if (m_Path + strlen(m_Path) == pTail || NULL == pPoint) 
				{ 
					break; 
				} 
				strncat(GrowingPath, pTail - 1, pPoint - pTail + 1); // - 1 means back slash. 
				pTail = pPoint + 1; 
			} 
 
			hFile = CreateFile(m_WholePathFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); 
			if (INVALID_HANDLE_VALUE == hFile) 
			{ 
				return RET_FAIL; 
			} 
			CloseHandle(hFile); // For creating. 
		} 
		else 
		{ 
			return RET_FAIL; 
		} 
 
		// Open again. 
		hFile = CreateFile(m_WholePathFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
		if (INVALID_HANDLE_VALUE == hFile) 
		{ 
			return RET_FAIL; 
		} 
	} 
 
	// Error logging. 
 
	// if the file exists, write(append) the log into that file. 
	dwRes = SetFilePointer(hFile, NULL, NULL, FILE_END); 
	if (0xFFFFFFFF == dwRes) 
	{ 
		CloseHandle(hFile); 
		return RET_FAIL; 
	} 
 
	bRes = WriteFile(hFile, ResultErrStr, (DWORD)strlen(ResultErrStr), &WrittenNum, NULL); 
	if ((0 == bRes) || (strlen(ResultErrStr) > WrittenNum)) 
	{ 
		CloseHandle(hFile); 
		return RET_FAIL; 
	} 
 
	if (0 == MemForResultErrStr.Free()) 
	{ 
		return RET_FAIL; 
	} 
 
	if (!CloseHandle(hFile)) 
	{ 
		return RET_FAIL; 
	} 
	 
	return RET_SUCCESS; 
} // end ErrLog()