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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? commport.cpp

?? fax engine 傳真引擎 relay fax 的開源項(xiàng)目 商業(yè)軟件使用 高質(zhì)量 高可靠
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
/*****************************************************************************
* 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 CCommPort is to encapsulate all the Win32 communication API
//
////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CommPort.h"


CLS1SPEEDS cls1Speeds[MAX_CLS1SPEEDS] = 
{ 
	0x00,	24,		24,		2400,	0,	// 2400, v.27 ter
	0x04,	48,		48,		4800,	1,	// 4800, v.27
	0x0c,	72,		72,		7200,	2,	// 7200, v.29
	0x08,	96,		96,		9600,	3,	// 9600, v.29
	0x06,	121,	121,	12000,	4,	// 12000, V.33
	0x02,	145,	145,	14400,	5,	// 14400, V.33
	0x0d,	73,		74,		7200,	2,	// 7200, v.17
	0x09,	97,		98,		9600,	3,	// 9600, v.17
	0x05,	121,	122,	12000,	4,	// 12000, v.17
	0x01,	145,	146,	14400,	5,	// 14400, v.17									 										
};

WORD Cls1ScanTimes_normal[8] = {20,40,10,5,10,20,40,0};
WORD Cls1ScanTimes_fine[8] =   {20,40,10,5,5,10,20,0};

WORD Cls2ScanTimes_normal[8] = { 0, 5, 10, 10, 20, 20, 40, 40 };
WORD Cls2ScanTimes_fine[8] = { 0, 5, 5, 10, 10, 20, 20, 40 };

WORD  Cls2FaxParamBitRates[6] = { 2400, 4800, 7200, 9600, 12000, 14400 };

char CCommPort::s_HexDigits[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCommPort::CCommPort()
{
	m_hPort = NULL;
	m_bDSRFlowControl = true;
	m_bCTSFlowControl = true;
	m_bSoftFlowControl = true;

	m_BaudRate = CBR_19200;
	m_ByteSize = 8;
	m_Parity = NOPARITY;
	m_StopBits = ONESTOPBIT;

	ZeroMemory( &m_ReadOverlapped, sizeof(m_ReadOverlapped) );
	ZeroMemory( &m_WriteOverlapped, sizeof(m_WriteOverlapped) );
	ZeroMemory( &m_CommEventOverlapped, sizeof(m_CommEventOverlapped) );

	m_ReadOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_WriteOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_CommEventOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	InitLineParser();

	m_bWriteInProgress = false;

	memset( &m_dcb, 0, sizeof(m_dcb) );
	m_dcb.DCBlength = sizeof(m_dcb); 

	m_bDebugLog = false;
	m_pLogFile = NULL;

}

CCommPort::~CCommPort()
{

	CloseHandle( m_ReadOverlapped.hEvent );
	CloseHandle( m_WriteOverlapped.hEvent );
	CloseHandle( m_CommEventOverlapped.hEvent );

}


//////////////////////////////////////////////////////////////////////
// ConnectPort
//////////////////////////////////////////////////////////////////////
bool CCommPort::ConnectPort( string& sErr )
{
	char szComDevice[16];
	
	wsprintf( szComDevice, "\\\\.\\%s",  m_sPort.c_str() );
	m_hPort = CreateFile( szComDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
						  OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
	
	// see if this works before committing
	if( m_hPort == NULL || m_hPort == INVALID_HANDLE_VALUE )
	{
		if( GetLastError() == ERROR_ACCESS_DENIED )
		{
			// wait a second and try again
			Sleep( 1000 );
			m_hPort = CreateFile( szComDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
								  OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL );
		}
	}

	if( m_hPort != NULL && m_hPort != INVALID_HANDLE_VALUE )
	{
		PurgeComm( m_hPort, PURGE_RXCLEAR | PURGE_TXCLEAR );

		if( !GetCommState( m_hPort, &m_dcb ) )
		{
			sErr.assign( "Error in GetCommState" );
			CloseHandle( m_hPort );
			return false;
		}

		if( !SetupComm( m_hPort, 20000, 20000 ) )
		{
			sErr.assign( "Error in SetupComm" );
			CloseHandle( m_hPort );
			return false;
		}

		m_dcb.BaudRate = m_BaudRate;
		m_dcb.ByteSize=  m_ByteSize;
		m_dcb.fBinary = TRUE;
		m_dcb.Parity = m_Parity;
		m_dcb.StopBits = m_StopBits;

		m_dcb.fOutxCtsFlow = (m_bCTSFlowControl) ? TRUE : FALSE;
		m_dcb.fOutxDsrFlow = (m_bDSRFlowControl) ? TRUE : FALSE;

		m_dcb.fOutX = (m_bSoftFlowControl) ? 1 : 0;
		m_dcb.fInX = 0; // we shouldn't need flow control for receiving data
		                // since we are using 20k buffers

		m_dcb.XonChar = XON;
		m_dcb.XoffChar = XOFF;

// One of these two was causing a problem with Multitech ISI5634/8 multi-port modem card
//		m_dcb.fTXContinueOnXoff = TRUE;

		m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
		m_dcb.fDtrControl = DTR_CONTROL_ENABLE;
		m_dcb.fAbortOnError = FALSE; // Make sure this is reset otherwise any 
		                             //line errors will cause io to terminate

		m_dcb.fErrorChar = FALSE;
		m_dcb.fParity = FALSE;
//		m_dcb.fDsrSensitivity = TRUE;

		m_dcb.fNull = FALSE;

		if ( !SetCommState( m_hPort, &m_dcb) ) 
		{
			sErr.assign( "Error in SetCommState" );
			CloseHandle( m_hPort );
			return false;
		}

		COMMTIMEOUTS cto;
		//cto.ReadIntervalTimeout = 10;	
		//cto.ReadIntervalTimeout = (m_BaudRate / 10)
		cto.ReadIntervalTimeout = 2;
		cto.ReadTotalTimeoutMultiplier = 0;
		cto.ReadTotalTimeoutConstant = 0;
		cto.WriteTotalTimeoutMultiplier = 5;
		cto.WriteTotalTimeoutConstant = 5000;

		if( !SetCommTimeouts( m_hPort, &cto ) )
		{
			sErr.assign( "Error in SetCommTimeouts" );
			CloseHandle( m_hPort );
			return false;
		}

		COMSTAT cs = {0};
		DWORD dwErrs = 0;

		if( !ClearCommError( m_hPort, &dwErrs, &cs ) )
		{
			sErr.assign( "Error in ClearCommError" );
			CloseHandle( m_hPort );
			return false;
		}

		//DWORD dwMask = EV_CTS | EV_ERR | EV_DSR | EV_RLSD | EV_BREAK | EV_RING;
		DWORD dwMask = EV_ERR;

		if (!SetCommMask(m_hPort, dwMask))
		{
			sErr.assign( "Error in SetCommMask!" );
			CloseHandle( m_hPort );
			return false;
		}

		OpenDebugLog();
		
		DoWaitCommEventLoop();

		DoReadLoop();

		OnConnect(); //-- moved to OnWaitTimeout to let the read buffer flush

		return true;
	}
	else
	{
		// could not open port
		char szError[256];
		szError[0] = '\0';
		GetLastErrorText( szError, 255 );
		sErr.assign( szError );
	}

	return false;
}


//////////////////////////////////////////////////////////////////////
// DisconnectPort
//////////////////////////////////////////////////////////////////////
void CCommPort::DisconnectPort( void )
{

	PurgeComm( m_hPort, PURGE_RXABORT | PURGE_RXCLEAR | 
		                PURGE_TXABORT | PURGE_TXCLEAR );

	CloseHandle( m_hPort );

	m_hPort = NULL;

	CloseDebugLog();
}

//////////////////////////////////////////////////////////////////////
// DoRead
//////////////////////////////////////////////////////////////////////
bool CCommPort::DoRead( void )
{
	BOOL bRet;

	m_BytesRead = 0;

	bRet = ReadFile( m_hPort, m_szReadBuff, READBUF_SIZE, &m_BytesRead, &m_ReadOverlapped );

	if( bRet )
	{
		return true;
	}
	else
	{
		DWORD  dwLastError = GetLastError();

		// LastError was ERROR_IO_PENDING, as expected.
		if (dwLastError != ERROR_IO_PENDING)
		{
			OutputDebugString("Unexpected error.\n");
		}

		// Its possible for this error to occur if the 
		// service provider has closed the port.  Time to end.
		if (dwLastError == ERROR_INVALID_HANDLE)
		{
			OutputDebugString( "Likely that the Service Provider has closed the port.\n");
		}

		return false;
	}
}


void CCommPort::FillWriteQueue( char* szChars, unsigned long nBytes, bool bCrLf )
{
	bool bAddedCrLf = false;

	while( nBytes > 0 )
	{
		int nbuflen = MAX_WRITE;

		if( nbuflen > nBytes ) 
		{
			nbuflen = nBytes;
		}

		CWriteBuffer *buf = new CWriteBuffer;

		memcpy( buf->Buffer, szChars, nbuflen );
		buf->Bytes = nbuflen;

		if( bCrLf && (nbuflen < MAX_WRITE) )
		{
			// must be last one
			buf->Buffer[buf->Bytes++] = '\r';
			bAddedCrLf = true;
		}

		m_WriteQueue.push_back( buf );

		szChars += nbuflen;
		nBytes -= nbuflen;
	}

	if( bCrLf && !bAddedCrLf)
	{
		CWriteBuffer *buf = new CWriteBuffer;
		buf->Buffer[0] = '\r';
		buf->Bytes = 1;
		m_WriteQueue.push_back( buf );
	}
}


bool CCommPort::WritePacket( char* szChars, unsigned long nBytes )
{
	m_WriteOverlapped.Offset = 0;
	m_WriteOverlapped.OffsetHigh = 0;

		
	if( WriteFile( m_hPort, szChars, nBytes, 
		&m_BytesWritten, &m_WriteOverlapped ) )
	{
		//char szMsg[80];
		//wsprintf( szMsg, "Wrote %d bytes 2\n", m_BytesWritten );
		//OutputDebugString( szMsg );
		
		ResetEvent( m_WriteOverlapped.hEvent );

		OnWrite();

		if( m_bDebugLog )
		{
			WriteDebugLog( false );
		}
	}
	else
	{
		//char szMsg[80];
		//wsprintf( szMsg, "Queued up %d bytes\n", nBytes );
		//OutputDebugString( szMsg );

		m_bWriteInProgress = true;
		
		DWORD  dwLastError = GetLastError();
		
		// LastError was ERROR_IO_PENDING, as expected.
		if (dwLastError != ERROR_IO_PENDING)
		{
			OutputDebugString("Unexpected error.\n");
		}
		
		// Its possible for this error to occur if the 
		// service provider has closed the port.  Time to end.
		if (dwLastError == ERROR_INVALID_HANDLE)
		{
			OutputDebugString( "Likely that the Service Provider has closed the port.\n");
		}
		
		return false;
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
// DoWrite
//////////////////////////////////////////////////////////////////////
bool CCommPort::DoWrite( char* szChars, unsigned long nBytes, bool bCrLf )
{
	if( m_bWriteInProgress )
	{
		FillWriteQueue( szChars, nBytes, bCrLf );
	}
	else
	{
		if( nBytes > MAX_WRITE )
		{
			FillWriteQueue( szChars, nBytes, bCrLf );
			DoWriteLoop();
		}
		else
		{
			memcpy( m_szWriteBuff, szChars, nBytes );

			if( bCrLf )
			{
				m_szWriteBuff[nBytes++] = '\r';
				//m_szWriteBuff[nBytes++] = '\n';
			}

			if( WritePacket( m_szWriteBuff, nBytes ) )
			{
				//char szMsg[80];
				//wsprintf( szMsg, "Sent %d bytes 3\n", nBytes  );
				//OutputDebugString( szMsg );
			}
		}
	}

	return true;
}


//////////////////////////////////////////////////////////////////////
// DoRead
//////////////////////////////////////////////////////////////////////
bool CCommPort::DoWaitCommEvent( void )
{
	BOOL bRet;

	m_BytesRead = 0;

	bRet = WaitCommEvent( m_hPort, &m_CommEvent, &m_CommEventOverlapped );

	if( bRet )
	{
		return true;
	}
	else
	{
		DWORD  dwLastError = GetLastError();

		// LastError was ERROR_IO_PENDING, as expected.
		if (dwLastError != ERROR_IO_PENDING)
		{
			OutputDebugString("Unexpected error.\n");
		}

		// Its possible for this error to occur if the 
		// service provider has closed the port.  Time to end.
		if (dwLastError == ERROR_INVALID_HANDLE)
		{
			OutputDebugString( "Likely that the Service Provider has closed the port.\n");
		}

		return false;
	}
}


//////////////////////////////////////////////////////////////////////
// DoReadLoop
//////////////////////////////////////////////////////////////////////
void CCommPort::DoReadLoop( void )
{
	int i;

	for( i = 0; i < 100; i++ )
	{
		if( m_hPort == NULL )
			break;

		if( DoRead() ) 
		{
			m_szReadBuff[m_BytesRead] = '\0';
			
			if( m_bDebugLog )
			{
				WriteDebugLog( true );
			}

			OnRead();
		}
		else
		{
			break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美白人最猛性xxxxx69交| 亚洲国产美国国产综合一区二区| 日韩欧美一级特黄在线播放| 欧美日韩一级二级| 欧美日韩一区二区三区四区五区| 色狠狠综合天天综合综合| 91丨porny丨在线| 91麻豆自制传媒国产之光| 91一区二区在线| 一本色道久久加勒比精品| 91网页版在线| 91国偷自产一区二区三区观看| 91久久精品网| 欧美区在线观看| 日韩欧美国产高清| 亚洲精品一区二区三区99 | 国产精品美女一区二区| 国产精品人成在线观看免费| 综合网在线视频| 亚洲综合一区二区| 欧美曰成人黄网| 欧美日本一道本在线视频| 欧美一级欧美一级在线播放| 欧美成人女星排名| 欧美激情综合在线| 亚洲精品成人a在线观看| 午夜影院在线观看欧美| 久久激情五月激情| 成人晚上爱看视频| 日本韩国精品在线| 精品日韩在线观看| 国产精品三级av| 亚洲第一会所有码转帖| 久久成人精品无人区| 成人免费高清视频| 欧美性猛片xxxx免费看久爱| 日韩欧美一区二区视频| 国产欧美一二三区| 亚洲影院理伦片| 激情久久五月天| 成人黄色777网| 欧美日韩精品一区二区在线播放| 欧美电影精品一区二区| 中文字幕日韩一区二区| 日韩精品一二区| 成人性色生活片免费看爆迷你毛片| 日本久久精品电影| 久久综合九色综合97婷婷女人| 成人精品电影在线观看| 欧美日韩你懂得| 国产欧美视频一区二区三区| 亚洲一区在线观看免费观看电影高清| 久久激情综合网| 欧美综合欧美视频| 久久久久久久久久久久久女国产乱| 亚洲婷婷国产精品电影人久久| 男女性色大片免费观看一区二区 | 国产亚洲精品久| 亚洲午夜电影网| 国产精品亚洲午夜一区二区三区 | 久久久久久久久久久久久久久99| 亚洲女人的天堂| 国产精品亚洲视频| 欧美一区二区播放| 亚洲狼人国产精品| 国产suv精品一区二区883| 欧美日本免费一区二区三区| 国产精品久久久久久久久图文区| 欧美一级高清片| 亚洲欧美乱综合| 国产精品一区二区久久不卡| 欧美精品一二三区| 一区二区不卡在线播放 | 国产精品国产三级国产普通话蜜臀| 日韩av电影天堂| 欧美亚洲国产一区二区三区va | 免费人成黄页网站在线一区二区 | 欧美sm美女调教| 婷婷久久综合九色国产成人| a亚洲天堂av| 国产欧美日韩卡一| 精品制服美女丁香| 91精品国产一区二区| 亚洲午夜免费视频| 91猫先生在线| 国产精品黄色在线观看| 国产亚洲欧美色| 久久99精品国产.久久久久久| 欧美日韩成人一区二区| 夜夜爽夜夜爽精品视频| 99在线热播精品免费| 国产欧美视频一区二区| 国产在线视视频有精品| 精品久久久久香蕉网| 蜜乳av一区二区| 91精品国产全国免费观看| 亚洲mv在线观看| 欧美性受xxxx| 亚洲123区在线观看| 欧美日韩一区二区三区不卡| 亚洲综合久久av| 欧美三区免费完整视频在线观看| 亚洲美女淫视频| 日本道免费精品一区二区三区| 亚洲视频1区2区| 色婷婷狠狠综合| 一卡二卡三卡日韩欧美| 欧洲日韩一区二区三区| 亚洲国产精品一区二区www| 欧美伊人精品成人久久综合97| 亚洲在线中文字幕| 精品视频在线看| 日韩电影在线观看一区| 日韩一区二区免费在线电影| 美女视频黄频大全不卡视频在线播放| 日韩一区二区三区高清免费看看| 久久99精品久久久久久国产越南| 日韩欧美国产系列| 国产一区二区视频在线播放| 国产日产亚洲精品系列| 成人动漫在线一区| 91猫先生在线| 一区二区理论电影在线观看| 欧美性色欧美a在线播放| 日韩黄色片在线观看| 精品国产自在久精品国产| 国产福利一区二区| 亚洲日本在线观看| 欧美丰满高潮xxxx喷水动漫| 久久精品国产一区二区三| 国产午夜精品美女毛片视频| 99久久久久久99| 日本伊人色综合网| 国产日韩欧美电影| 色偷偷一区二区三区| 日韩不卡一二三区| 国产日韩欧美电影| 在线观看国产精品网站| 麻豆精品蜜桃视频网站| 中文字幕乱码久久午夜不卡| 91污在线观看| 久久91精品国产91久久小草 | 亚洲成a人在线观看| 精品久久人人做人人爰| 91在线观看视频| 麻豆精品蜜桃视频网站| 中文字幕视频一区| 91精品国产综合久久香蕉的特点 | 欧美日本一区二区| 国产精品主播直播| 亚洲福利视频一区| 国产精品一区二区免费不卡| 一区二区三区四区精品在线视频| 日韩欧美在线综合网| 93久久精品日日躁夜夜躁欧美| 日韩高清不卡一区二区三区| 国产精品三级av在线播放| 欧美精品久久一区二区三区| 成人综合日日夜夜| 日本成人在线一区| 亚洲女同女同女同女同女同69| 日韩女优毛片在线| 91官网在线免费观看| 国产一区欧美二区| 五月婷婷综合网| 最新热久久免费视频| 精品日本一线二线三线不卡| 欧美色图一区二区三区| 粉嫩aⅴ一区二区三区四区| 日本不卡视频在线| 亚洲卡通动漫在线| 欧美激情自拍偷拍| 欧美电影免费观看高清完整版在| 日本韩国一区二区三区| 国产91丝袜在线18| 久久99精品国产麻豆婷婷| 亚洲成人一区在线| 亚洲色大成网站www久久九九| 久久蜜桃av一区二区天堂| 欧美一级日韩免费不卡| 欧美午夜精品久久久久久超碰| 亚洲国产成人在线| 欧美电影免费观看高清完整版在线| 欧美日韩中文精品| 91搞黄在线观看| 91网站最新网址| a美女胸又www黄视频久久| 国产一区二区伦理片| 麻豆专区一区二区三区四区五区| 亚洲韩国一区二区三区| 亚洲免费观看在线视频| 国产精品国产三级国产有无不卡| 久久影院视频免费| 日韩免费视频一区二区| 88在线观看91蜜桃国自产| 欧美亚洲综合色| 欧美性猛片aaaaaaa做受| 色先锋久久av资源部| 色噜噜狠狠色综合欧洲selulu| 99久久er热在这里只有精品66|