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

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

?? modem.cpp

?? fax engine 傳真引擎 relay fax 的開源項目 商業軟件使用 高質量 高可靠
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*****************************************************************************
* RelayFax Open Source Project
* Copyright 1996-2004 Alt-N Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted only as authorized by the RelayFax Open 
* Source License.  A copy of this license is available in file LICENSE 
* in the top-level directory of the distribution.
*
* RelayFax is a registered trademark of Alt-N Technologies, Ltd.
*
* Individual files and/or contributed packages may be copyright by
* other parties and subject to additional restrictions.
*****************************************************************************/

////////////////////////////////////////////////////////////////////////////////
//
// The purpose of CModem build the message loop of an independent thread
// into CCommPort and handle communication with other threads.
//
////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Modem.h"


char* CModem::s_CommonCmds[COMMAND_COUNT] =
{
	"",						// COMMAND_NONE, 
	"ATZ",					// COMMAND_INIT, 
	"AT&F&C1&D2S7=55S0=0",	// COMMAND_SETUP_STRING
	"ATE0",					// COMMAND_DISABLE_ECHO, 
	"ATL%d",				// COMMAND_SET_SPKR_VOL, 
	"ATM%d",				// COMMAND_SET_SPKR_MODE, 
	"AT+FCLASS=1",			// COMMAND_SET_FCLASS_1
	"AT+FCLASS=1.0",		// COMMAND_SET_FCLASS_1_0
	"AT+FCLASS=2",			// COMMAND_SET_FCLASS_2
	"AT+FCLASS=2.0",		// COMMAND_SET_FCLASS_2_0
	"AT+FCLASS=2.1",		// COMMAND_SET_FCLASS_2_1
	"AT+FTM=?",				// COMMAND_QUERY_SEND_SPEEDS,
	"AT+FRM=?",				// COMMAND_QUERY_RECEIVE_SPEEDS,
	"",						// COMMAND_SET_LOCAL_ID,
	"",						// COMMAND_SET_RECV
	"",						// COMMAND_SET_BIT_ORDER
	"AT+FLO=%d",			// COMMAND_SET_FLOW_CONTROL
	"",						// COMMAND_SET_HDLC_REPORTING
	"",						// COMMAND_SET_FAX_PARAMS
	"ATDT%s",				// COMMAND_DIAL
	"ATH0",					// COMMAND_HANGUP
	"ATA",					// COMMAND_ANSWER
	"AT+FCLASS=?",			// COMMAND_QUERY_FCLASS
	"ATI0",					// COMMAND_QUERY_PRODUCT_CODE
	"ATI3",					// COMMAND_QUERY_MANUFACTURER
	"AT+FDCC=?",			// COMMAND_QUERY_CLASS2_CAP
	"AT+FMFR?",				// COMMAND_QUERY_CLASS2_MANUFACT
	"AT+FMDL?",				// COMMAND_QUERY_CLASS2_MODEL
	"AT+FCC=?",				// COMMAND_QUERY_CLASS2_0_CAP
	"AT+FMI?",				// COMMAND_QUERY_CLASS2_0_MANUFACT
	"AT+FMM?",				// COMMAND_QUERY_CLASS2_0_MODEL
};


//MODEM_EVENT_HANDLER_FUNC CModem::s_ModemEventHandlerFunc = NULL;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CModem::CModem()
{
	m_bConnected = false;
	m_sInitString.assign( s_CommonCmds[COMMAND_SETUP_STRING] );
	m_nSpkrVol = 0;
	m_nSpkrMode = 0;
	m_nState = STATE_NONE;
	m_nLastCommand = COMMAND_NONE;
	m_nRingCount = 0;
	m_nAnswerOnRing = 2;
	m_bReceiving = false;
	m_nWaitTimeout = 1000;
	m_bEnableReceive = true;
	InitHDLC();
	m_bHDLCMode = false;
	m_bGotOK = false;
	m_bECMSupported = true;
	m_nSendEncoding = FAXAPI_ENC_CCITT_T6;
	ZeroMemory( m_ParamMatrix, sizeof(m_ParamMatrix) );
	m_nSendBaud = FAXAPI_BAUD_14400;
	m_nRecvBaud = FAXAPI_BAUD_14400;
	m_nMaxSendBaud = FAXAPI_BAUD_33600;
	m_nMaxRecvBaud = FAXAPI_BAUD_33600;
	m_bPulseDialing = false;
	m_FaxThreadID = 0;
	m_nMaxPageRetries = 0; // no limit
	m_nMaxPageRetriesPageNo = -1;
	m_bTerminated = false;
	m_bLastPageGood = false;
}

CModem::~CModem()
{
}

//////////////////////////////////////////////////////////////////////
// Initialize - start the modem thread
//////////////////////////////////////////////////////////////////////
void CModem::Initialize( HANDLE hStop, DWORD faxThreadID )
{
	m_FaxThreadID = faxThreadID;
	AddEvent( hStop );
	AddEvent( m_ReadOverlapped.hEvent );
	AddEvent( m_WriteOverlapped.hEvent );
	AddEvent( m_CommEventOverlapped.hEvent );

	StartThread();
}


//////////////////////////////////////////////////////////////////////
// SetPort
//////////////////////////////////////////////////////////////////////
void CModem::SetPort( char* szPort )
{
	m_sPort = szPort;
}

//////////////////////////////////////////////////////////////////////
// Disconnect - send a message to initiate the disconnect
//////////////////////////////////////////////////////////////////////
void CModem::Disconnect(void)
{
	PostMsg( WM_MODEM_DISCONNECT, 0, 0 );
}

//////////////////////////////////////////////////////////////////////
// Disconnect - send a message to initiate the disconnect
//////////////////////////////////////////////////////////////////////
void CModem::RecvFax( char* szFaxFile )
{
	InternalModemMsg* pMsg = new InternalModemMsg;

	strcpy( pMsg->szFile, szFaxFile );
//	m_FaxFile.SetFileName( szFaxFile );

	PostMsg( WM_MODEM_RECVFAX, (WPARAM)pMsg, 0 );
}

//////////////////////////////////////////////////////////////////////
// SetInitString
//////////////////////////////////////////////////////////////////////
void CModem::SetInitString( LPCSTR szString )
{
	m_sInitString.assign( szString );
}


//////////////////////////////////////////////////////////////////////
// SetInitString
//////////////////////////////////////////////////////////////////////
void CModem::ChangeCSID( LPCSTR szString )
{
	InternalModemMsg* pMsg = new InternalModemMsg;

	strcpy( pMsg->szNumber, szString );

	PostMsg( WM_MODEM_SETID, (WPARAM)pMsg, 0 );
}

//////////////////////////////////////////////////////////////////////
// SetInitString
//////////////////////////////////////////////////////////////////////
void CModem::SetCSID( LPCSTR szString )
{
	char szID[21];
	int nLen = 0;

	while( *szString && nLen < 20 )
	{
		if( *szString > 31 && *szString < 127 && *szString != 34 )
		{
			szID[nLen++] = toupper(*szString);
		}
		szString++;
	}
	szID[nLen] = 0;

	m_sLocalCSID.assign( szID );
}

//////////////////////////////////////////////////////////////////////
// Connect - send a message to initiate the disconnect
//////////////////////////////////////////////////////////////////////
void CModem::SetSpkrParams( int nSpkrVol, int nSpkrMode )
{
	m_nSpkrVol = nSpkrVol;
	m_nSpkrMode = nSpkrMode;
}


bool CModem::SendFax( char* szNumberToDial, char* szFaxFile )
{
	InternalModemMsg* pMsg = new InternalModemMsg;

	strcpy( pMsg->szNumber, szNumberToDial );
	strcpy( pMsg->szFile, szFaxFile );

//	m_sNumberToDial.assign( szNumberToDial );
//	m_FaxFile.SetFileName( szFaxFile );

	PostMsg( WM_MODEM_SENDFAX, (WPARAM)pMsg, 0 );

	return true;
}



//////////////////////////////////////////////////////////////////////
// OnStartup
//////////////////////////////////////////////////////////////////////
bool CModem::OnStartup( void )
{
	m_sThreadName.assign( "Modem Thread" );

	if( CThread::OnStartup() )
	{
		InitWindow();

		PostMsg( WM_MODEM_CONNECT, 0, 0 );

		return true;
	}

	return false;
}


//////////////////////////////////////////////////////////////////////
// OnShutdown - called before thread exits
//////////////////////////////////////////////////////////////////////
void CModem::OnShutdown( void )
{
	CThread::OnShutdown();

	ShutdownWindow();

	if( m_bConnected )
	{
		DisconnectPort();
		m_nState = STATE_NONE;
		m_bConnected = false;
	}
}


//////////////////////////////////////////////////////////////////////
// Handle message - return true if WM_QUIT received
//////////////////////////////////////////////////////////////////////
bool CModem::OnMsg( MSG* pMsg )
{
	if( CThread::OnMsg( pMsg ) )
		return true;

	m_dwActivityTimer = GetTickCount();

	switch( pMsg->message )
	{
	case WM_MODEM_CONNECT:
		OnConnectMsg();
		break;

	case WM_MODEM_DISCONNECT:
		OnDisconnectMsg();
		break;

	case WM_MODEM_SENDFAX:
		OnSendFaxMsg( pMsg );
		break;

	case WM_MODEM_RECVFAX:
		OnRecvFaxMsg( pMsg );
		break;

	case WM_MODEM_ABORTFAX:
		OnAbortFaxMsg();
		break;

	case WM_MODEM_CLEARRINGCNT:
		m_nRingCount = 0;
		m_nState = STATE_IDLE;
		break;

	case WM_MODEM_SETID:
		{
			InternalModemMsg* pModemMsg = (InternalModemMsg*) pMsg->wParam;

			if( pModemMsg)
			{
				SetCSID( pModemMsg->szNumber );
			}
			delete pModemMsg;
		}
		break;
	}

	return false;
}


//////////////////////////////////////////////////////////////////////
// Handle event - return true if cancel event set
//////////////////////////////////////////////////////////////////////
bool CModem::OnEvent( int nIndex )
{

	switch( nIndex )
	{
	case 0:
		// Cancel event
		OnDisconnectMsg();
		return true;

	case 1:
		// Read event
		ReadEventSignalled();
		return false;

	case 2:
		// Write event
		WriteEventSignalled();
		return false;

	case 3:
		// WaitComm event
		WaitCommEventSignalled();
		return false;

	case 4:
		// Disconnect Event
		return true;
	}

	return false;
}



//////////////////////////////////////////////////////////////////////
// OnConnectMsg
//////////////////////////////////////////////////////////////////////
void CModem::OnConnectMsg(void)
{
	if( !m_bConnected )
	{
		m_nRingCount = 0;
		m_bConnected = ConnectPort( m_sLastError );

		if( !m_bConnected )
		{
			SignalEvent( EVENT_ERROR );
			m_nState = STATE_NONE;
			SignalEvent( EVENT_DISCONNECT );
			ExitAndDelete();
		}
	}
}

//////////////////////////////////////////////////////////////////////
// OnDisconnectMsg
//////////////////////////////////////////////////////////////////////
void CModem::OnDisconnectMsg(void)
{
	if( m_bConnected )
	{
		if( OnDisconnect() )
		{
			DisconnectPort();
			m_nState = STATE_NONE;
			SignalEvent( EVENT_DISCONNECT );
			m_bConnected = false;
			ExitAndDelete();
		}
	}
}


//////////////////////////////////////////////////////////////////////
// OnSendFaxMsg
//////////////////////////////////////////////////////////////////////
void CModem::OnSendFaxMsg( MSG* pMsg )
{
	InternalModemMsg* pModemMsg = (InternalModemMsg*) pMsg->wParam;

	if( pModemMsg == NULL)
		return;

	m_sNumberToDial.assign( pModemMsg->szNumber );
	m_FaxFile.SetFileName( pModemMsg->szFile );	

	delete pModemMsg;

	m_nMaxPageRetriesPageNo = -1;
}

void CModem::OnRecvFaxMsg( MSG* pMsg )
{
	InternalModemMsg* pModemMsg = (InternalModemMsg*) pMsg->wParam;

	if( pModemMsg == NULL)
		return;

	m_FaxFile.SetFileName( pModemMsg->szFile );	

	delete pModemMsg;
}


void CModem::OnAbortFaxMsg(void)
{

}

//////////////////////////////////////////////////////////////////////
// SendCommand
//////////////////////////////////////////////////////////////////////
void CModem::SendCommand( int nCommand, char* szCmdString )
{
	char szWorkBuffer[256];
	char* szCmd = NULL;


	if( szCmdString )
	{
		szCmd = szCmdString;
	}
	else if( nCommand == COMMAND_SETUP_STRING )
	{
		szCmd = (char*)m_sInitString.c_str();
	}
	else 
	{
		switch( nCommand )
		{
		case COMMAND_SET_SPKR_VOL:
			wsprintf( szWorkBuffer, s_CommonCmds[nCommand], m_nSpkrVol );
			szCmd = szWorkBuffer;
			break;

		case COMMAND_SET_SPKR_MODE:
			wsprintf( szWorkBuffer, s_CommonCmds[nCommand], m_nSpkrMode );
			szCmd = szWorkBuffer;
			break;

		case COMMAND_DIAL:
			if( m_bPulseDialing )
			{
				wsprintf( szWorkBuffer, "ATDP%s", m_sNumberToDial.c_str() );
			}
			else
			{
				wsprintf( szWorkBuffer, "ATDT%s", m_sNumberToDial.c_str() );
			}
			szCmd = szWorkBuffer;
			break;

		case COMMAND_SET_FLOW_CONTROL:
			wsprintf( szWorkBuffer, s_CommonCmds[nCommand], m_bCTSFlowControl ? 2 : 1 );
			szCmd = szWorkBuffer;
			break;

		default:
			if( nCommand >= 0 && nCommand < COMMAND_COUNT )
			{
				szCmd = s_CommonCmds[nCommand];
			}
			break;
		}
	}
	
	if( szCmd )
	{
		m_nLastCommand = nCommand;
		m_LastCommandString.assign( szCmd );

		m_bGotOK = false;
		KillTimer( TIMER_COMMAND );
		if( (nCommand != COMMAND_DIAL) && (nCommand != COMMAND_ANSWER) )
		{
			SetTimer( TIMER_COMMAND, 2000 );
		}

//		m_nLastCommandTickCount = GetTickCount();

		DoWrite( szCmd, strlen(szCmd), true );

		//wsprintf( szWorkBuffer, "Sent Command: %s\n", m_LastCommandString.c_str() );
		//OutputDebugString( szWorkBuffer );
	}
}

//////////////////////////////////////////////////////////////////////
// SignalEvent
//////////////////////////////////////////////////////////////////////
void CModem::SignalEvent( int nEvent, char info )
{
	FaxApiModemMsg* pMsg = new FaxApiModemMsg;

	memset( pMsg, 0, sizeof(FaxApiModemMsg) );

	pMsg->m_cbSize = sizeof(FaxApiModemMsg);

	switch( nEvent )
	{
	case EVENT_ERROR:
		strncpy( pMsg->sz, m_sLastError.c_str(), FAXAPI_MODEMMSG_INFOLEN );
		pMsg->sz[FAXAPI_MODEMMSG_INFOLEN-1] = '\0';
		break;

	case EVENT_RECV_DIS:
	case EVENT_SENT_DIS:
		memcpy( &pMsg->p, &m_DISParams.p, sizeof(FaxApiParameters) );
		break;

	case EVENT_RECV_DCS:
	case EVENT_SENT_DCS:
		memcpy( &pMsg->p, &m_DCSParams.p, sizeof(FaxApiParameters) );
		break;

	case EVENT_GOT_REMOTEID:
		strcpy( pMsg->sz, m_sRemoteCSID.c_str() );
		trimws( pMsg->sz );
		break;

	case EVENT_START_PAGE:
		pMsg->t.nPages = GetPageCount();
		break;

	case EVENT_TERMINATE:
		strncpy( pMsg->sz, m_sLastError.c_str(), FAXAPI_MODEMMSG_INFOLEN );
		pMsg->sz[FAXAPI_MODEMMSG_INFOLEN-1] = '\0';
		pMsg->t.nPages = GetPageCount();
		pMsg->t.nSuccessful = (m_bSuccessful && GetPageCount() > 0 ) ? 1 : 0;
		break;

	case EVENT_CALLERID:
		strncpy( pMsg->sz, m_szLineBuff, FAXAPI_MODEMMSG_INFOLEN );
		pMsg->szID[FAXAPI_MODEMMSG_INFOLEN-1] = '\0';
		break;

	default:
		pMsg->sz[0] = info;
		break;
	}

	SendModemMessage( nEvent, pMsg );
}


void CModem::SignalEventString( int nEvent, LPCSTR szMsg )
{
	FaxApiModemMsg* pMsg = new FaxApiModemMsg;

	memset( pMsg, 0, sizeof(FaxApiModemMsg) );

	pMsg->m_cbSize = sizeof(FaxApiModemMsg);

	strncpy( pMsg->sz, szMsg, FAXAPI_MODEMMSG_INFOLEN );
	pMsg->sz[FAXAPI_MODEMMSG_INFOLEN-1] = '\0';

	SendModemMessage( nEvent, pMsg );
}

void CModem::SendModemMessage( int nEvent, FaxApiModemMsg* pMsg )
{
	strcpy( pMsg->szID, m_sPort.c_str() );
	PostThreadMessage( m_FaxThreadID, WM_MODEM_MESSAGE, (WPARAM)pMsg, nEvent );
}

//////////////////////////////////////////////////////////////////////
// ErrorUnexpectedResponse
//////////////////////////////////////////////////////////////////////
void CModem::ErrorUnexpectedResponse( void )
{
	char szMsg[512];
	wsprintf( szMsg, (char*)LoadString(GEN_RECEIVED_IN_RESPONSE_TO).c_str(), m_szLineBuff, m_LastCommandString.c_str() );
	m_sLastError.assign( szMsg );
	SignalEvent( EVENT_ERROR );
}

//////////////////////////////////////////////////////////////////////
// ErrorConnectResponse
//////////////////////////////////////////////////////////////////////
void CModem::ErrorConnectResponse( void )
{
	// For now, use the return string as the error description
	m_sLastError.assign( m_szLineBuff );
	SignalEvent( EVENT_ERROR );
}


void CModem::ProcSupportedSpeeds( LPSTR lpSpeeds, bool bSend )
{
	LPSTR lpTok;
	int val;

	char szDefSpeeds[64];

	if( stricmp( m_szLineBuff, "ERROR" ) == 0 )
	{
		strcpy( szDefSpeeds, "3,24,48,72,73,74,96,97,98,121,122,145,146" );
		lpSpeeds = szDefSpeeds;
	}


	bool* bSupported = (bSend) ? &m_bSendSupported[0] : &m_bRecvSupported[0];

	ZeroMemory( bSupported, sizeof(bool) * MAX_CLS1SPEEDS );

	lpTok = strtok( lpSpeeds, ",");

	while( lpTok ) {
		val = atoi( lpTok );
		
		switch( val ) {
			case 24:
				bSupported[0] = 1;
				break;

			case 48:
				bSupported[1] = 1;
				break;
		
			case 72:
				bSupported[2] = 1;
				break;

			case 73:
				bSupported[6] = 1;
				break;
						
			case 96:
				bSupported[3] = 1;
				break;

			case 97:
				bSupported[7] = 1;
				break;

			case 121:
				bSupported[8] = 1;
				bSupported[4] = 1;
				break;

			case 145:
				bSupported[9] = 1;
				bSupported[5] = 1;
				break;
		}

		lpTok = strtok( NULL, "," );
	}


	if( bSend )
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情一区二区三区不卡| 久久久久久综合| 777午夜精品视频在线播放| 精品粉嫩aⅴ一区二区三区四区| 中文字幕一区二区三区四区| 久久国产精品无码网站| 欧美怡红院视频| 亚洲日本丝袜连裤袜办公室| 国模无码大尺度一区二区三区| 欧美日韩国产高清一区二区三区| 中文久久乱码一区二区| 久久国产精品无码网站| 5月丁香婷婷综合| 亚洲精品亚洲人成人网| 不卡视频一二三| 久久久欧美精品sm网站| 六月婷婷色综合| 欧美老年两性高潮| 亚洲第一在线综合网站| 91福利社在线观看| 亚洲欧美偷拍三级| 99久久er热在这里只有精品15| 国产亚洲女人久久久久毛片| 久久精品国产成人一区二区三区 | 精品国产乱码久久久久久图片| 亚洲成a天堂v人片| 精品污污网站免费看| 亚洲免费观看高清完整版在线观看 | 日韩欧美亚洲一区二区| 亚洲高清久久久| 欧美特级限制片免费在线观看| 亚洲精品国产视频| 在线观看国产91| 亚洲va韩国va欧美va| 欧美日韩国产系列| 日韩电影一区二区三区四区| 欧美日韩高清影院| 免费高清不卡av| 精品处破学生在线二十三| 国产一区视频导航| 国产欧美一区二区三区沐欲 | 蜜臀久久99精品久久久久宅男 | 中文字幕中文字幕一区二区| 99国产精品国产精品毛片| 国产精品乱码久久久久久| 99久久精品国产一区| 亚洲国产精品嫩草影院| 91精品国产综合久久久久久久久久 | 国产一区二区h| 国产精品久久夜| 欧洲人成人精品| 蜜臀久久99精品久久久久宅男| 久久久噜噜噜久久人人看| 从欧美一区二区三区| 伊人性伊人情综合网| 欧美精品精品一区| 国产精品亚洲人在线观看| 日韩一区有码在线| 91精品国产综合久久久久久久久久 | 亚洲超碰精品一区二区| 欧美成人女星排行榜| 成人app软件下载大全免费| 亚洲一区二区三区国产| 精品欧美乱码久久久久久1区2区| 国产乱码精品一区二区三区五月婷 | 国产精品视频一二三| 91国模大尺度私拍在线视频| 看片网站欧美日韩| 亚洲欧洲日本在线| 欧美一区二区三区精品| eeuss鲁片一区二区三区在线看| 天天综合网 天天综合色| 久久精品人人做人人爽人人 | 91亚洲精华国产精华精华液| 日韩av一级片| 国产精品狼人久久影院观看方式| 在线播放日韩导航| 成人激情电影免费在线观看| 日韩av电影免费观看高清完整版| 国产精品久久网站| 8v天堂国产在线一区二区| 99精品热视频| 国产一区 二区| 日日摸夜夜添夜夜添国产精品| 国产精品卡一卡二卡三| 精品国产亚洲在线| 欧美日韩另类一区| 色综合色综合色综合 | 91精品在线一区二区| 97精品视频在线观看自产线路二| 国内精品自线一区二区三区视频| 亚洲最大的成人av| 亚洲欧洲日本在线| 国产欧美精品在线观看| 欧美精品一区二区三区四区| 337p亚洲精品色噜噜噜| 欧美综合视频在线观看| 91片在线免费观看| 成人理论电影网| 国产91色综合久久免费分享| 激情文学综合网| 久久精品国产在热久久| 日本伊人色综合网| 日日噜噜夜夜狠狠视频欧美人 | 亚洲天堂精品在线观看| 久久久99久久| 国产人伦精品一区二区| 精品日韩一区二区三区免费视频| 91麻豆精品国产91久久久资源速度 | 国产乱妇无码大片在线观看| 麻豆一区二区99久久久久| 奇米四色…亚洲| 蜜桃一区二区三区四区| 天天爽夜夜爽夜夜爽精品视频| 亚洲国产精品一区二区www | 国产精品乡下勾搭老头1| 国产一区二区三区精品视频| 国产精品一品二品| 成人黄色小视频| av欧美精品.com| 色视频成人在线观看免| 91老师国产黑色丝袜在线| 在线观看亚洲一区| 欧美精选一区二区| 精品裸体舞一区二区三区| 久久精品在线免费观看| 亚洲欧美在线aaa| 亚洲高清视频在线| 久久精品国产精品青草| 成人免费观看av| 色婷婷av一区二区三区大白胸| 欧美日韩国产另类一区| 欧美精品一区二区三区高清aⅴ| 久久精品亚洲麻豆av一区二区| 国产精品久久三区| 亚洲线精品一区二区三区八戒| 视频一区国产视频| 国产老肥熟一区二区三区| 99久久久免费精品国产一区二区| 色欧美片视频在线观看| 欧美一级搡bbbb搡bbbb| 久久综合成人精品亚洲另类欧美 | 日韩美女视频一区二区在线观看| 精品91自产拍在线观看一区| 中文字幕一区视频| 亚洲成精国产精品女| 国产一区视频导航| 色综合久久88色综合天天6| 欧美电影一区二区| 国产欧美日韩三级| 亚洲成人7777| 成人精品gif动图一区| 5566中文字幕一区二区电影| 国产精品免费人成网站| 日韩成人午夜精品| av一区二区不卡| 欧美不卡一区二区| 一区二区三区影院| 国产一区二区三区在线观看精品 | 久久久久久久久99精品| 亚洲一区二区三区四区在线| 国产一区二区精品久久99| 91国内精品野花午夜精品| 久久蜜桃av一区二区天堂| 午夜一区二区三区在线观看| 成人亚洲精品久久久久软件| 6080国产精品一区二区| 亚洲三级久久久| 国产成人一级电影| 欧美伦理电影网| 一区二区三区四区在线播放 | 欧美日产国产精品| 亚洲欧美在线另类| 国产电影一区二区三区| 制服丝袜一区二区三区| 一区二区高清在线| av不卡一区二区三区| 久久久久综合网| 精品一二线国产| 91麻豆精品久久久久蜜臀 | 国内精品伊人久久久久av影院| 欧美日韩亚洲综合一区| 亚洲精品欧美综合四区| 99久久精品免费看国产免费软件| 久久精品亚洲精品国产欧美 | 国产在线精品免费av| 欧美一区二区三区性视频| 一区二区三区在线免费观看| aa级大片欧美| 国产精品久久免费看| 国产精品69毛片高清亚洲| 久久影院午夜片一区| 久久成人综合网| 日韩精品一区二区三区在线 | 天天色 色综合| 欧美三级电影在线看| 亚洲va天堂va国产va久| 欧美精品一级二级| 日本网站在线观看一区二区三区| 欧美一区二区三区四区久久|