⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 upnpdebug.c

📁 原来由英特尔制定的UPnP SDK的
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2000-2003 Intel Corporation // All rights reserved. //// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: //// * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission.// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./////////////////////////////////////////////////////////////////////////////#include "config.h"#include "upnpdebug.h"#include <stdlib.h>#include <stdio.h>#include "ithread.h"#include "upnp.h"#include <stdarg.h>#include <string.h>//Mutex to synchronize all the log file opeartions in the debug modestatic ithread_mutex_t GlobalDebugMutex;// Global log levelstatic Upnp_LogLevel g_log_level = UPNP_DEFAULT_LOG_LEVEL;//File handle for the error log filestatic FILE *ErrFileHnd = NULL;//File handle for the information log filestatic FILE *InfoFileHnd = NULL;//Name of the error filestatic const char *errFileName = "IUpnpErrFile.txt";//Name of the info filestatic const char *infoFileName = "IUpnpInfoFile.txt";/*************************************************************************** * Function : UpnpSetLogFileNames					 *								 * Parameters:							 *	IN const char* ErrFileName: name of the error file *	IN const char *InfoFileName: name of the information file *	IN int size: Size of the buffer *	IN int starLength: This parameter provides the width of the banner *									 * Description:							 *	This functions takes the buffer and writes the buffer in the file as  *	per the requested banner					 * Returns: void ***************************************************************************/voidUpnpSetLogFileNames ( IN const char *ErrFileName,		      IN const char *InfoFileName ){    if( ErrFileName ) {        errFileName = ErrFileName;    }    if( InfoFileName ) {        infoFileName = InfoFileName;    }}/*************************************************************************** * Function : UpnpInitLog * * Parameters:	void * * Description: *	This functions initializes the log files * * Returns: int *	-1 : If fails *	UPNP_E_SUCCESS : if success ***************************************************************************/intUpnpInitLog(){    ithread_mutex_init( &GlobalDebugMutex, NULL );    if( DEBUG_TARGET == 1 ) {        if( ( ErrFileHnd = fopen( errFileName, "a" ) ) == NULL )            return -1;        if( ( InfoFileHnd = fopen( infoFileName, "a" ) ) == NULL )            return -1;    }    return UPNP_E_SUCCESS;}/*************************************************************************** * Function : UpnpSetLogLevel *				 * Parameters:	Upnp_LogLevel log_level * * Description:							 *	This functions set the log level (see {\tt Upnp_LogLevel} * Returns: void ***************************************************************************/void UpnpSetLogLevel (Upnp_LogLevel log_level){	g_log_level = log_level;}/*************************************************************************** * Function : UpnpCloseLog					 *								 * Parameters:	void					 *								 * Description:						 *	This functions closes the log files * Returns: void ***************************************************************************/voidUpnpCloseLog(){    if( DEBUG_TARGET == 1 ) {        fflush( ErrFileHnd );        fflush( InfoFileHnd );        fclose( ErrFileHnd );        fclose( InfoFileHnd );    }    ithread_mutex_destroy( &GlobalDebugMutex );}/*************************************************************************** * Function : DebugAtThisLevel					 *									 * Parameters:			 *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  *		whether debug statement will go to standard output,  *		or any of the log files. *	IN Dbg_Module Module: debug will go in the name of this module *					 * Description:					 *	This functions returns true if debug output should be done in this *	module. * * Returns: int ***************************************************************************/#ifdef DEBUGint DebugAtThisLevel(	IN Upnp_LogLevel DLevel,	IN Dbg_Module Module){	int ret = DLevel <= g_log_level;	ret &=		DEBUG_ALL ||		(Module == SSDP  && DEBUG_SSDP ) ||		(Module == SOAP  && DEBUG_SOAP ) ||		(Module == GENA  && DEBUG_GENA ) ||		(Module == TPOOL && DEBUG_TPOOL) ||		(Module == MSERV && DEBUG_MSERV) ||		(Module == DOM   && DEBUG_DOM  ) ||		(Module == HTTP  && DEBUG_HTTP );		return ret;}#endif/*************************************************************************** * Function : UpnpPrintf					 *									 * Parameters:			 *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  *		whether debug statement will go to standard output,  *		or any of the log files. *	IN Dbg_Module Module: debug will go in the name of this module *	IN char *DbgFileName: Name of the file from where debug statement is *							coming *	IN int DbgLineNo : Line number of the file from where debug statement  *				is coming *	IN char * FmtStr, ...: Variable number of arguments that will go  *				in the debug statement *					 * Description:					 *	This functions prints the debug statement either on the startdard  *	output or log file along with the information from where this debug  *	statement is coming * Returns: void ***************************************************************************/#ifdef DEBUGvoid UpnpPrintf(	IN Upnp_LogLevel DLevel,	IN Dbg_Module Module,	IN const char *DbgFileName,	IN int DbgLineNo,	IN const char *FmtStr,	... ){	va_list ArgList;		if (!DebugAtThisLevel(DLevel, Module)) {		return;	}		ithread_mutex_lock(&GlobalDebugMutex);	va_start(ArgList, FmtStr);	if (!DEBUG_TARGET) {		if( DbgFileName ) {			UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);		}		vfprintf(stdout, FmtStr, ArgList);		fflush(stdout);	} else if (DLevel == 0) {		if (DbgFileName) {			UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo);		}		vfprintf(ErrFileHnd, FmtStr, ArgList);		fflush(ErrFileHnd);	} else {		if (DbgFileName) {			UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo);		}		vfprintf(InfoFileHnd, FmtStr, ArgList);		fflush(InfoFileHnd);	}	va_end(ArgList);	ithread_mutex_unlock(&GlobalDebugMutex);}#endif/*************************************************************************** * Function : UpnpGetDebugFile					 *				 * Parameters:			 *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  *		whether debug statement will go to standard output,  *		or any of the log files. *	IN Dbg_Module Module: debug will go in the name of this module *								 * Description: *	This function checks if the module is turned on for debug  *	and returns the file descriptor corresponding to the debug level * Returns: FILE * *	NULL : if the module is turn off for debug  *	else returns the right file descriptor ***************************************************************************/#ifdef DEBUGFILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ){	FILE *ret;	if (!DebugAtThisLevel(DLevel, Module)) {		ret = NULL;	}		if (!DEBUG_TARGET) {		ret = stdout;	} else if (DLevel == 0) {		ret = ErrFileHnd;	} else {		ret = InfoFileHnd;	}	return ret;}#endif/*************************************************************************** * Function : UpnpDisplayFileAndLine				 *	 * Parameters:	 *	IN FILE *fd: File descriptor where line number and file name will be  *			written  *	IN char *DbgFileName: Name of the file   *	IN int DbgLineNo : Line number of the file *		 * Description: *	This function writes the file name and file number from where *		debug statement is coming to the log file * Returns: void ***************************************************************************/#ifdef DEBUGvoid UpnpDisplayFileAndLine(	IN FILE * fd,	IN const char *DbgFileName,	IN int DbgLineNo){#define NLINES 2#define MAX_LINE_SIZE 512#define NUMBER_OF_STARS 80	const char *lines[NLINES];	char buf[NLINES][MAX_LINE_SIZE];	int i;	/* Initialize the pointer array */	for (i = 0; i < NLINES; i++) {		lines[i] = buf[i];	}	/* Put the debug lines in the buffer */	sprintf(buf[0], "DEBUG - THREAD ID: 0x%lX",		(unsigned long int)ithread_self());	if (DbgFileName) {		sprintf(buf[1],			"FILE: %s, LINE: %d",			DbgFileName,			DbgLineNo);	}	/* Show the lines centered */	UpnpDisplayBanner(fd, lines, NLINES, NUMBER_OF_STARS);	fflush(fd);}#endif/*************************************************************************** * Function : UpnpDisplayBanner	 * * Parameters:			 *	IN FILE *fd: file descriptor where the banner will be written *	IN char **lines: The buffer that will be written *	IN int size: Size of the buffer *	IN int starLength: This parameter provides the width of the banner *	 * Description:			 *	This functions takes the buffer and writes the buffer in the file as  *	per the requested banner * Returns: void ***************************************************************************/#ifdef DEBUGvoid UpnpDisplayBanner(	IN FILE * fd,	IN const char **lines,	IN size_t size,	IN int starLength){	int leftMarginLength = starLength / 2 + 1;	int rightMarginLength = starLength / 2 + 1;	int i = 0;	int LineSize = 0;	int starLengthMinus2 = starLength - 2;	char *leftMargin = ( char * )malloc( leftMarginLength );	char *rightMargin = ( char * )malloc( rightMarginLength );	char *stars = ( char * )malloc( starLength + 1 );	char *currentLine = ( char * )malloc( starLength + 1 );	const char *line = NULL;	memset( stars, '*', starLength );	stars[starLength] = 0;	memset( leftMargin, 0, leftMarginLength );	memset( rightMargin, 0, rightMarginLength );	fprintf( fd, "\n%s\n", stars );	for( i = 0; i < size; i++ ) {		LineSize = strlen( lines[i] );		line = lines[i];		while( LineSize > starLengthMinus2 ) {			memcpy( currentLine, line, starLengthMinus2 );			currentLine[starLengthMinus2] = 0;			fprintf( fd, "*%s*\n", currentLine );			LineSize -= starLengthMinus2;			line += starLengthMinus2;		}		leftMarginLength = (starLengthMinus2 - LineSize)/2;		if( LineSize % 2 == 0 ) {			rightMarginLength = leftMarginLength;		} else {			rightMarginLength = leftMarginLength + 1;		}		memset( leftMargin, ' ', leftMarginLength );		memset( rightMargin, ' ', rightMarginLength );		leftMargin[leftMarginLength] = 0;		rightMargin[rightMarginLength] = 0;		fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );	}	fprintf( fd, "%s\n\n", stars );	free( currentLine );	free( stars );	free( rightMargin );	free( leftMargin );}#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -