亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? writelog.cpp

?? 日志是程序的重要組成部分
?? CPP
字號:
// WriteLog.cpp: implementation of the CWriteLog class.
//
//////////////////////////////////////////////////////////////////////

#include "WriteLog.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

INT16 CWriteLog::m_iPrintLevel= LEVEL_CONTENT;

CWriteLog::CWriteLog()
{
	SetLogPath( (INT8*)DFT_LOGPATH );
	
	m_iMaxLogTag= 0;

	m_iLogLevel  = DFT_LOGLEVEL;
	m_iLogBakNum = DFT_BAKLOGNUM;
	m_bLogFlag   = TRUE;
	m_lLogExpiredDay= DFT_EXPIRED_DAY;

	m_pSystemTime= NULL;
	m_pLocalTime= NULL;

	m_asLogFile= NULL;

	m_lMaxFileSize= MAX_FILE_LEN;

	m_bExitFlag  = FALSE;

	m_oQueue = new CMyQueue();

}


CWriteLog::~CWriteLog()
{
	Shut();
}


INT16 CWriteLog::Start( const UINT32 lMaxMemorySizeK, const UINT32 lMaxFileSize )
{
	INT32	iRev;

	if ( !m_asLogFile )
	{
		printf( "FAILED: m_asLogFile is NULL\n" );
		return -1;
	}

	if ( lMaxFileSize <= 0 )
		return -2;

	m_lMaxFileSize= lMaxFileSize;

	if ( lMaxMemorySizeK <= 0 )
		return -3;

	iRev = m_oQueue->InitQueue( MAX_MEM_SIZE,VAL_DISPLAYBUF_LEN );
	if( iRev != 0 )
		return -4;

	m_alFileTime= (struct tm*)calloc( MAX_FILE_NUM, sizeof(struct tm) );
	if ( !m_alFileTime )
	{
		printf( "FAILED: calloc m_alFileTime !\n" );
		return -5;
	}
	memset( m_alFileTime, 0, MAX_FILE_NUM*sizeof(struct tm) );

	pthread_t tid= 0;
	if ( pthread_create( &tid, NULL, thWritingThread, this ) != 0 )
	    return -6;

//	PrintLogFile();

	return 0;
}


INT16 CWriteLog::Shut()
{
	m_bExitFlag= TRUE;

	uSleep( 50 );

	if ( m_asLogFile )
	{
		free( m_asLogFile );
		m_asLogFile= NULL;
	}

	if ( m_alFileTime )
	{
		free( m_alFileTime );
		m_alFileTime= NULL;
	}
	
	if( m_oQueue != NULL )
	{
		m_oQueue->RemoveAll();
		delete(m_oQueue);
		m_oQueue = NULL;
	}
	return 0;
}


MYTYPE_THREAD_FUNC CWriteLog::thWritingThread(void* pParam)
{
	class CWriteLog*    pObj= (class CWriteLog*)pParam;       //對象指針
	INT32               lRetVal;                              //操作返回值
	INT8                sTime[100];                           //記錄時間字符串
	SLogMessage         jLogMessage;                          //待記錄信息結構
	FILE*               afp[MAX_FILE_NUM];                    //文件句柄數組中的索引
	UINT8               cFile;                                //文件在文件句柄數組中的索引
	INT16               iOpenFileCount= 0;                    //打開文件計數
	UINT32              lWaitCount= 0;
	UINT32              lWriteCount= 0;
	struct stat         fstatbuf;
	INT16               i;

	pthread_detach( pthread_self() );

	printf( "CWriteLog: writing thread [%d:%d] start up\n", (INT32)getpid(), (INT32)pthread_self() );

	memset( afp, 0, sizeof(afp) );

	while ( !pObj->m_bExitFlag )
	{
		//取待寫信息
		lRetVal= pObj->m_oQueue->GetDelNode( &jLogMessage, sizeof(jLogMessage) );

		cFile= !lRetVal ? jLogMessage.cFileFlag : -1;

		if ( lRetVal != 0 )
		{
			lWaitCount++;

			if ( lWaitCount <= 20 )
				uSleep( 20 );

			else if ( lWaitCount <= 100 )
			{
				if ( lWaitCount == 50 )
				{
					for ( i=0; i<pObj->m_iMaxLogTag && iOpenFileCount>0; i++ )
					{
						if ( afp[ i ] )
						{
							//關閉過期
							fflush( afp[ i ] );
							fclose( afp[ i ] );
							afp[ i ]= NULL;

							iOpenFileCount--;
						}
					}
				}

				uSleep( 100 );
			}
			else
				uSleep( 500 );

			continue;
		}
		else
			lWaitCount= 0;

		//打開未打開
		if ( afp[ cFile ] == NULL )
		{
			afp[ cFile ] = pObj->OpenLogFile( cFile );
			if ( afp[ cFile ] == NULL )
			{
				printf( "======== FAILED: CWriteLog: open file[%s] ! ========\n", pObj->m_asLogFile[ cFile]  );
				break;
			}
			iOpenFileCount++;
		}

		pObj->GetTimeString( sTime );
		jLogMessage.sLogContent[ VAL_DISPLAYBUF_LEN-1 ]= '\0';

		//寫入文件
		//========================================================================
		fprintf( afp[ cFile ], "%s%s\r\n", sTime, jLogMessage.sLogContent );
		//========================================================================

		lWriteCount++;

		if ( lWriteCount % 30 == 0 )
		{
			fflush( afp[ cFile ] );
			memset( &fstatbuf, 0, sizeof(struct stat) );
			stat( pObj->m_asLogFile[ cFile ], &fstatbuf );
			if ( (UINT32)fstatbuf.st_size >= pObj->m_lMaxFileSize )
			{
				//關閉超過大小限定的文件
				fclose( afp[ cFile ] );
				afp[ cFile ]= NULL;
				iOpenFileCount--;
			}
		}
		else if ( lWriteCount % 100 == 0 )
		{
			for ( i=0; i<pObj->m_iMaxLogTag && iOpenFileCount>0; i++ )
			{
				if ( afp[ i ] )
				{
					fflush( afp[ i ] );
					memset( &fstatbuf, 0, sizeof(struct stat) );
					stat( pObj->m_asLogFile[ i ], &fstatbuf );
					if ( (UINT32)fstatbuf.st_size >= pObj->m_lMaxFileSize )
					{
						//關閉超過大小限定的文件
						fclose( afp[ i ] );
						afp[ i ]= NULL;
						iOpenFileCount--;
					}
				}
			}
		}

		if ( lWriteCount % 5 == 0 )
		{
			fflush( afp[ cFile ] );
			uSleep( 10 );
		}

	}//while (!m_bExitFlag)

	//關閉未關閉
	for ( i=0; i<=pObj->m_iMaxLogTag && iOpenFileCount>0; i++ )
	{
		if ( afp[ i ] )
		{
			fflush( afp[ i ] );
			fclose( afp[ i ] );
			iOpenFileCount--;
		}
	}

	printf( "CWriteLog: writing thread [%d:%d] exit\n", (INT32)getpid(), (INT32)pthread_self() );

	return 0;
}


FILE* CWriteLog::OpenLogFile( UINT8 cFileFlag )
{
	FILE*        fp;
	struct stat  fstatbuf;
	INT8         sCmd[300];
	time_t       lRmTime;
	struct tm    tmRm;
	struct tm    tmCur;
	INT32        iRetVal;

	if ( m_pLocalTime )
		tmCur= *m_pLocalTime;
	else
	{
		time_t      time1;
		
		time( &time1 );
		memcpy( &tmCur, localtime(&time1), sizeof(struct tm) );
	}

	memset( &fstatbuf, 0, sizeof(struct stat) );

	iRetVal= stat( m_asLogFile[ cFileFlag ], &fstatbuf );
	if ( iRetVal != 0 && errno != ENOENT )
		printf( "ERROR: OpenLogFile [%d][%s] stat [ECode:%d]\n", cFileFlag, m_asLogFile[ cFileFlag ], errno );

	if ( m_alFileTime[cFileFlag].tm_mday != tmCur.tm_mday )
	{
		if ( m_pSystemTime )
			lRmTime= *m_pSystemTime - m_lLogExpiredDay * 24*60*60;
		else
		{
			time_t      time1;
			time( &time1 );
			lRmTime= time1 - m_lLogExpiredDay * 24*60*60;
		}

		memcpy( &tmRm, localtime(&lRmTime), sizeof(struct tm) );

#ifndef WIN32
		sprintf( sCmd, "rm -f %s.%.2d%.2d.*", m_asLogFile[ cFileFlag ], tmRm.tm_mon+1, tmRm.tm_mday );
		system( sCmd );
#else
		sprintf( sCmd, "del //F//Q %s.%.2d%.2d.*", m_asLogFile[ cFileFlag ], tmRm.tm_mon+1, tmRm.tm_mday );
		system( sCmd );
#endif

		m_alFileTime[cFileFlag]= tmCur;
	}
	
	if ( iRetVal == 0 && (UINT32)fstatbuf.st_size >= m_lMaxFileSize )
	{
		INT16 s= GetSerial( cFileFlag );

		if ( s < 0 )
			return NULL;

#ifndef WIN32
		sprintf( sCmd, "mv -f %s %s.%.2d%.2d.%.2d", m_asLogFile[ cFileFlag ], m_asLogFile[ cFileFlag ],
			tmCur.tm_mon+1, tmCur.tm_mday, s );
#else
		sprintf( sCmd, "move %s %s.%.2d%.2d.%.2d", m_asLogFile[ cFileFlag ], m_asLogFile[ cFileFlag ],
			tmCur.tm_mon+1, tmCur.tm_mday, s );
#endif

		system( sCmd );

		fp= fopen( m_asLogFile[ cFileFlag ], "wb+" );
	}
	else
		fp= mdfopen( m_asLogFile[ cFileFlag ], "ab+" );

	return fp;
}


//得到當前可用備份文件的序號(序號從1到m_iLogBakNum)
INT16 CWriteLog::GetSerial( UINT8 cFileFlag )
{
	INT8         sFile[MAX_LOGFILENAME_LEN];
	struct stat  fstatbuf;
	INT16        iSerial;
	
//如果有未使用的序號,使用最小的未使用序號

	for ( iSerial= 1; iSerial<= m_iLogBakNum; iSerial++ )
	{
		sprintf(sFile, BAK_LOG_FORMAT, m_asLogFile[ cFileFlag ], m_pLocalTime->tm_mon+1, m_pLocalTime->tm_mday, iSerial);

#ifdef WIN32
		struct stat my_stat;
		if ( stat( sFile, &my_stat ) != 0 )
			return iSerial;
#else
		if ( access( sFile, F_OK ) != 0 )
			return iSerial;
#endif
	}

//沒有未使用序號,使用最早修改的文件的序號(則以此序列號命名的原文件將被覆蓋)
	iSerial = 1;
	UINT32 mtime= 0xFFFFFFFF;
	for ( int i= 1; i<= m_iLogBakNum; i++ )
	{
		sprintf( sFile, BAK_LOG_FORMAT, m_asLogFile[ cFileFlag ], m_pLocalTime->tm_mon+1, m_pLocalTime->tm_mday, i );

		memset( &fstatbuf, 0, sizeof(struct stat) );
		if ( stat( sFile, &fstatbuf ) == 0 )
		{
			if ( (UINT32)fstatbuf.st_mtime < mtime )
			{
				iSerial = i;
				mtime = fstatbuf.st_mtime;
			}
		}
	}

	return iSerial;
}


INT16 CWriteLog::GetTimeString(INT8* sTime)
{
	if ( m_pLocalTime )
 		sprintf(sTime, "%.2d:%.2d:%.2d %.2d/%.2d : ", m_pLocalTime->tm_hour, m_pLocalTime->tm_min, m_pLocalTime->tm_sec, m_pLocalTime->tm_mon+1, m_pLocalTime->tm_mday);
	else
	{
		time_t      time1;
		struct tm   tm1;
		
		time( &time1 );
		memcpy( &tm1, localtime(&time1), sizeof(struct tm) );

 		sprintf(sTime, "%.2d:%.2d:%.2d %.2d/%.2d : ", tm1.tm_hour, tm1.tm_min, tm1.tm_sec, tm1.tm_mon+1, tm1.tm_mday);
	}

	return 0;
}


INT16 CWriteLog::SetLogFile( const INT8* sLogFile, const UINT8 cFileTag )
{
	if ( strlen(sLogFile) > (MAX_LOGFILENAME_LEN-strlen(m_sFilePath)-1) )
		return -1;

	if ( cFileTag >= MAX_FILE_NUM )
		return -2;

	if ( !m_asLogFile )
	{
		m_asLogFile= (INT8(*)[MAX_LOGFILENAME_LEN])malloc( sizeof(INT8)*MAX_FILE_NUM*MAX_LOGFILENAME_LEN );
		if ( m_asLogFile )
		{
			memset( m_asLogFile, 0, sizeof(INT8)*MAX_FILE_NUM*MAX_LOGFILENAME_LEN );
			strcpy( (INT8*)m_asLogFile[ 0 ], DFT_LOGPATH );
			strcpy( (INT8*)m_asLogFile[ 0 ] + strlen( DFT_LOGPATH ), DFT_LOGFILE );
		}
		else
			printf( "FAILED: malloc m_asLogFile memory !" );
	}

	strcpy( m_asLogFile[cFileTag], m_sFilePath );
	strcpy( m_asLogFile[cFileTag] + strlen( m_sFilePath ), sLogFile );

	if ( cFileTag > m_iMaxLogTag )
		m_iMaxLogTag= cFileTag;

	return 0;
}


INT16 CWriteLog::SetLogOpen( const INT16 iFlag )
{
	m_bLogFlag= (BOOL)iFlag;

	return 0;
}


//設置日志文件路徑
INT16 CWriteLog::SetLogPath( const INT8* sLogPath )
{
	if ( strlen(sLogPath) > MAX_LOGPATH_LEN )
		return -1;

	strcpy( m_sFilePath, sLogPath );

	INT16 iOldPathLen= strlen( m_sFilePath );

	if ( m_sFilePath[ iOldPathLen - 1 ] != PATH_TAG )
	{
		m_sFilePath[ iOldPathLen ]= PATH_TAG;
		m_sFilePath[ iOldPathLen + 1 ]= '\0';
	}

	return 0;
}


INT16 CWriteLog::SetLogLevel(const INT16 iLogLevel)
{
	if ( iLogLevel < 0
		|| iLogLevel > LEVEL_DEBUG )
		return -1;
	
	m_iLogLevel = iLogLevel;

	return 0;
}


INT16 CWriteLog::SetLogBakNum(const INT16 iNum)
{
	if ( iNum<0 || iNum>MAX_BAKLOGNUM )
		return -1;

	m_iLogBakNum = iNum;

	return 0;
}


//設置日志保存時間
INT16 CWriteLog::SetLogExpiredDay( const INT16 iExpiredDay )
{
	if ( iExpiredDay <= 0 )
		return -1;

	if ( iExpiredDay > 365 )
		return -2;

	m_lLogExpiredDay= iExpiredDay;

	return 0;
}


INT16 CWriteLog::SetTimeReference( const time_t* pSystemTime, const struct tm* pLocalTime )
{
	m_pSystemTime= pSystemTime;
	m_pLocalTime= pLocalTime;

	return 0;
}


//cLogTag 為日志文件標記
INT16 CWriteLog::AddLogMessage(const UINT8 cLogTag, const INT16 iLogLevel, const INT8* sFormat, ...)
{
	INT16               iRetVal;
	va_list             args;

	va_start ( args, sFormat );
	
	iRetVal= AddLogMessage( sFormat, args, cLogTag, (UINT8)iLogLevel );

	va_end( args );

	return iRetVal;
}


//為直接調用與包裝調用提供接口
//cLogTag 為日志文件標記
INT16 CWriteLog::AddLogMessage( const INT8* sFormat, const va_list args, const UINT8 cLogTag, const INT16 iLogLevel )
{
	SLogMessage         jLogMessage;
	INT32               lRetVal;
	
	if (!m_bLogFlag)
		return 1;

	//當前設置記錄級別小于信息級別不記錄
	if ( iLogLevel > m_iLogLevel )
		return 2;
	
	jLogMessage.cFileFlag = cLogTag;

//	jLogMessage.cLogType  = cLogTag;

//高位為信息類型,低位為文件標記
//	jLogMessage.cFileFlag <<= 4;
//	jLogMessage.cFileFlag >>= 4;
//	jLogMessage.cLogType  >>= 4;
//	jLogMessage.cLogType  <<= 4;

	jLogMessage.cLogLevel= (UINT8)iLogLevel;

	vsnprintf( jLogMessage.sLogContent, VAL_DISPLAYBUF_LEN, sFormat, args );

	lRetVal= m_oQueue->InsertNode( &jLogMessage, sizeof(jLogMessage) );
	if ( lRetVal != 0 && lRetVal != -1 )
	{
		printf( "FAILED: CWriteLog::AddLogMessage [ECode:%d][Used:%u, Max:%u]\n", lRetVal, this->GetUsedNodeNum(), this->GetTotalNodeNum() );
		return  -100+lRetVal;
	}

	return 0;
}


INT16 CWriteLog::PrintLogFile()
{
	for ( INT16 i= 0; i<=m_iMaxLogTag; i++ )
		printf( "Tag: %d, File: %s\n", i, m_asLogFile[ i ] );

	return 0;
}


FILE* mdfopen(const INT8* pFileName, const INT8* sMode)
{
	FILE*                  fp;
	INT8*                  p;
	INT8                   sPathName[MAX_MYLIB_FILENAME_LEN];
	
	if (strlen(pFileName) >= MAX_MYLIB_FILENAME_LEN)
		return NULL;
	
	fp= fopen(pFileName, sMode);
	if (fp != NULL)
		return fp;
	
	if (strchr(sMode, 'r'))       //讀屬性, 不會因不存在相應目錄而打開失敗
		return NULL;
	
	strcpy(sPathName, pFileName);
	
	p= sPathName + strlen(sPathName) - 1;
	
	while (1)
	{
		if (p == pFileName ||
			*p == '\\' || 
			*p == '/')
			break;
		p--;
	}
	*p= '\0';
	
#ifdef  WIN32
	mkdir(sPathName);   //創建相應目錄
#else
	mkdir(sPathName, S_IRWXU|S_IRWXG|S_IRWXO);   //創建相應目錄
#endif
	
	return (fopen(pFileName, sMode));
}

/*
INT32 main()
{
	INT32 iRev;
	CWriteLog g_oLog;
	printf("@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",iRev);
	
	iRev = g_oLog.SetLogFile( "TESTLOG", 1 );
	if(iRev != 0)
	{
		printf("@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",iRev);
	}

	time_t lTime= time(NULL);
	struct tm sCurrentTime;
	localtime_r( &lTime, &sCurrentTime );

	g_oLog.SetTimeReference( &lTime, &sCurrentTime );

	//g_oLog.SetTimeReference( &g_oSysParam.m_lSystemTime, &g_oSysParam.m_tmLocalTime );

	iRev = g_oLog.Start(10000,5000000);
	if( iRev != 0 )
	{
		printf("@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",iRev);
	}
	
	for(INT32 i = 0 ; i < 1000; i++)
	{
		g_oLog.AddLogMessage(1,1,"111111111sssssssssssssss %d",i);
	}

	sleep(10);
	
}
*/
//////////////////////////////////////////////////////////////////////


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人天堂资源www在线| 日韩欧美成人午夜| 日韩亚洲欧美在线观看| 亚洲欧洲精品天堂一级 | 日韩欧美国产一区在线观看| 久久亚洲二区三区| 日韩高清不卡一区| 欧美在线色视频| 国产农村妇女毛片精品久久麻豆 | 精品福利在线导航| 一区二区三区成人在线视频| 豆国产96在线|亚洲| 5月丁香婷婷综合| 亚洲一区二区3| 97超碰欧美中文字幕| 欧美激情在线免费观看| 狠狠色综合日日| 日韩一级黄色片| 奇米888四色在线精品| 欧美体内she精视频| 亚洲图片欧美视频| 天天综合天天做天天综合| 精品中文字幕一区二区| 欧美私人免费视频| 亚洲视频一区二区在线| 99久久精品免费看| 成人免费在线视频观看| 国产 欧美在线| 欧美激情一区二区| www.在线欧美| 亚洲欧美综合网| 一本色道久久综合精品竹菊| 综合在线观看色| 色综合天天在线| 亚洲一区二区三区中文字幕| 日本精品一区二区三区四区的功能| 亚洲国产精品高清| eeuss国产一区二区三区| 亚洲欧洲精品天堂一级| 欧洲av一区二区嗯嗯嗯啊| 亚洲国产欧美另类丝袜| 欧美视频在线一区二区三区 | 337p粉嫩大胆色噜噜噜噜亚洲| 视频一区视频二区中文字幕| 欧美一级高清片| 麻豆精品精品国产自在97香蕉| 2020国产精品| 不卡av免费在线观看| 亚洲综合久久av| 91精品国产一区二区人妖| 国产精品自拍在线| 国产精品久久久久久久久动漫| 一本大道久久精品懂色aⅴ| 亚洲.国产.中文慕字在线| 欧美v日韩v国产v| 国产suv精品一区二区6| 亚洲一线二线三线视频| 欧美一级免费观看| 福利一区二区在线| 婷婷成人综合网| 中文字幕av资源一区| 91黄视频在线观看| 国产一区二区三区在线观看免费| 一色桃子久久精品亚洲| 欧美日韩国产小视频| 国产综合久久久久久久久久久久 | 亚洲成人综合视频| 欧美va亚洲va国产综合| 91亚洲精华国产精华精华液| 亚洲国产日韩在线一区模特| 日韩午夜精品视频| 99久久伊人网影院| 美日韩一区二区| 亚洲另类春色国产| 国产亚洲制服色| 正在播放一区二区| 色老汉av一区二区三区| 国产在线精品一区二区不卡了 | 成人app网站| 麻豆91在线播放免费| 亚洲欧美韩国综合色| 欧美tk—视频vk| 欧美老年两性高潮| 97se亚洲国产综合自在线不卡| 九九**精品视频免费播放| 亚洲国产欧美一区二区三区丁香婷| 久久精品人人做| 欧美一级艳片视频免费观看| 色综合天天综合| 国产91丝袜在线播放0| 日本美女视频一区二区| 一区二区三区视频在线看| 日本一区二区三区视频视频| 日韩免费观看高清完整版在线观看| 色综合色狠狠综合色| 成人国产在线观看| 国产成人小视频| 韩国女主播一区| 精品夜夜嗨av一区二区三区| 日韩精品午夜视频| 一区二区三区高清不卡| 亚洲精品成a人| 亚洲人成在线播放网站岛国| 国产精品女主播在线观看| 久久久久久久久久久久久久久99| 日韩无一区二区| 欧美一级高清大全免费观看| 91精品国产色综合久久久蜜香臀| 91福利在线播放| 在线免费观看一区| 欧美日韩综合在线免费观看| 91久久精品一区二区三区| 91小视频在线| 色88888久久久久久影院按摩| 97久久超碰国产精品| 色综合久久综合| 在线观看一区二区精品视频| 日本黄色一区二区| 欧美色成人综合| 911精品国产一区二区在线| 日韩欧美久久一区| 久久婷婷一区二区三区| 国产视频不卡一区| 国产精品护士白丝一区av| 亚洲视频网在线直播| 亚洲一线二线三线久久久| 日韩中文字幕亚洲一区二区va在线| 亚洲第一在线综合网站| 美女任你摸久久| 国产成人在线视频播放| 暴力调教一区二区三区| 一本到高清视频免费精品| 欧美日韩高清一区二区不卡| 日韩欧美一二三四区| 国产肉丝袜一区二区| 一区二区久久久久| 日本视频一区二区| 国产成人综合自拍| 日本高清不卡视频| 精品久久免费看| 亚洲乱码国产乱码精品精98午夜 | 国产一区二区三区不卡在线观看 | 国产一区二区三区免费播放| 成人高清免费观看| 欧美精品vⅰdeose4hd| 国产视频在线观看一区二区三区| 亚洲特级片在线| 美女网站一区二区| 成人黄色小视频在线观看| 欧美无乱码久久久免费午夜一区| 精品久久99ma| 亚洲国产综合91精品麻豆| 国产精品1区2区| 欧美日韩另类国产亚洲欧美一级| 久久综合色播五月| 午夜影院久久久| 99re8在线精品视频免费播放| 欧美一区二区播放| 中文字幕欧美一区| 精品亚洲porn| 欧美精品丝袜中出| 一区二区三区久久| 粉嫩高潮美女一区二区三区| 欧美放荡的少妇| 亚洲欧美韩国综合色| 国产福利91精品| 日韩免费看的电影| 视频在线观看国产精品| 91在线观看视频| 久久久国产精品不卡| 视频一区二区国产| 91福利在线导航| 亚洲视频一二三| 成人毛片视频在线观看| 久久综合色8888| 蓝色福利精品导航| 91精品国产91久久综合桃花 | 精品一区二区av| 7777精品伊人久久久大香线蕉完整版 | 欧美视频三区在线播放| 国产精品网站在线| 国产一区二区调教| 精品国产免费久久| 久久国内精品视频| 精品少妇一区二区三区| 日韩高清不卡在线| 在线不卡中文字幕播放| 亚洲成av人片一区二区梦乃 | 丁香激情综合国产| 久久久久久久综合日本| 久久99久久99精品免视看婷婷| 欧美狂野另类xxxxoooo| 图片区日韩欧美亚洲| 欧美精品aⅴ在线视频| 亚洲一本大道在线| 在线电影欧美成精品| 日韩精品午夜视频| 日韩欧美国产成人一区二区| 日本女人一区二区三区| 日韩欧美国产综合在线一区二区三区|