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

📄 classtwopointzero.cpp

📁 fax engine 传真引擎 relay fax 的开源项目 商业软件使用 高质量 高可靠
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			m_sLastError.assign( (char*)LoadString(GEN_ERROR_READING_TIFF_FILE).c_str() );
//			SignalEvent( EVENT_ERROR );
			Terminate();
			SetState( STATE_PHASE_E, STATE_WAIT_FOR_OK );
		}
	}
}

void CClassTwoPointZero::OnCSI(void)
{
	char szID[21];
	int i = 0;
	bool bNoQuotes = false;

	m_sRemoteCSID = "";

	//OutputDebugString( "OnCSI\n" );

	char* p = m_szLineBuff + 5;	// skip +FTSI

	if ( *p == ':' )			// skip the colon
	{
		p++;
	}

	while (*p && *p != '\"' )	// skip white space before first quote
	{
		p++;
	}

	if( *p == 0 )
	{
		bNoQuotes = true;

		// Uh-oh! no quotes found, back up and try w/o quotes
		p = m_szLineBuff + 5;

		if ( *p == ':' )			// skip the colon
		{
			p++;
		}

		while (*p && *p == ' ' )	// skip white space
		{
			p++;
		}

		return;
	}
	else
	{
		p++;						// skip first quote
	}

	while( *p && (*p != '\"') && (i < 20) )
	{
		szID[i] = *p;
		p++;
		i++;
	}

	szID[i] = 0;

	m_sRemoteCSID.assign( szID );

	SignalEvent( EVENT_GOT_REMOTEID );
}

void CClassTwoPointZero::OnNSF(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_NSF).c_str() );
}

void CClassTwoPointZero::OnNSS(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_NSS).c_str() );
}

// Page Status Report
void CClassTwoPointZero::OnFPTS(void)
{
	int n[2];

	//OutputDebugString( "OnFPTS\n" );

	int nParams = ParseFaxParams( 2, n );

	if( nParams > 0 )
	{
		switch( n[0] )
		{
		case 1:
			if( m_bReceiving )
				SignalEventString( EVENT_INFO, (char*)LoadString(GEN_SENT_MCF).c_str() );
			else
			{
				SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_MCF).c_str() );
				m_bLastPageGood = true;
			}
			break;
		case 2:
			SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_RTN).c_str() );
			m_bLastPageGood = false;
			break;
		case 3:
			SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_RTP).c_str() );
			m_bLastPageGood = true;
			break;
		case 4:
			SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_PIN).c_str() );
			m_bLastPageGood = true;
			break;
		case 5:
			SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_PIP).c_str() );
			m_bLastPageGood = true;
			break;
		}
	}

	//if( nParams > 1 )
	//{
	//	m_FaxFile.SetImageLength( n[1] );
	//}
}


void CClassTwoPointZero::OnFET(void)
{
	int n;

	//OutputDebugString( "OnFET\n" );
	
	ParseFaxParams( 1, &n );

	switch( n )
	{
	case 0:
		OnMPS();
		break;

	case 1:
		OnEOM();
		break;

	case 2:
		OnEOP();
		break;
	}
}


void CClassTwoPointZero::OnEOP(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_EOP).c_str() );
	m_bGotEOP = true;
}

void CClassTwoPointZero::OnEOM(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_EOM).c_str() );
	m_bGotEOM = true;
}

void CClassTwoPointZero::OnMPS(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_MPS).c_str() );
	m_bGotMPS = true;
}


void CClassTwoPointZero::OnFHNG( void )
{
	int n;

	//TODO: These are hexadecimal codes!

	//OutputDebugString( "OnFHNG\n" );

	n = ParseFHSCode();

	//char szCode[32];
	//wsprintf( szCode, "==> %X\n", n );
	//OutputDebugString( szCode );

	switch( n )
	{
		case 0x00:
			m_bSuccessful = true;
			if( !m_bReceiving )
			{
				m_FaxFile.IncrementPageCount();
			}
			break;

		case 0x01:
			m_sLastError.assign( (char*)LoadString(GEN_CALL_ANSWERED_WO_FAX_HANDSHAKE).c_str() );
			break;

		case 0x02:
			m_sLastError.assign( (char*)LoadString(GEN_CALL_ABORTED_BY_USER).c_str() );
			break;

		case 0x03:
			m_sLastError.assign( (char*)LoadString(GEN_NO_LOOP_CURRENT).c_str() );
			break;

		case 0x04:
			m_sLastError.assign( (char*)LoadString(GEN_RINGBACK_DETECTED_BUT_NO_ANSWER).c_str() );
			break;

		case 0x05:
			m_sLastError.assign( (char*)LoadString(GEN_RINGBACK_DETECTED_CALL_ANSWERED_BUT_NO_CED_TONE).c_str() );
			break;

		case 0x10:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_A_ERROR).c_str() );
			break;

		case 0x11:
			m_sLastError.assign( (char*)LoadString(GEN_NO_ANSWER_OR_NO_DIS).c_str() );
			break;

		case 0x20:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_B_TRANSMIT_ERROR).c_str() );
			break;

		case 0x21:
			m_sLastError.assign( (char*)LoadString(GEN_REMOTE_CANNOT_RECEIVE_OR_SEND).c_str() );
			break;

		case 0x22:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_TRANSMIT_COMMAND_FRAME_ERROR).c_str() );
			break;

		case 0x23:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_TRANSMIT_INVALID_COMMAND_RECEIVED).c_str() );
			break;

		case 0x24:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_TRANSMIT_RESPONSE_FRAME_ERROR).c_str() );
			break;

		case 0x25:
			m_sLastError.assign( (char*)LoadString(GEN_DCS_SENT_THREE_TIMES_WITHOUT_RESPONSE).c_str() );
			break;

		case 0x26:
			m_sLastError.assign( (char*)LoadString(GEN_DISDTC_RECEIVED_3_TIMES_DCS_NOT_RECOGNISED).c_str() );
			break;

		case 0x27:
			m_sLastError.assign( (char*)LoadString(GEN_FAILURE_TO_TRAIN_AT_2400_BPS).c_str() );
			break;

		case 0x28:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_TRANSMIT_INVALID_RESPONSE_RECEIVED).c_str() );
			break;

		case 0x40:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_C_TRANSMIT_ERROR).c_str() );
			break;

		case 0x41:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_IMAGE_FORMAT).c_str() );
			break;

		case 0x42:
			m_sLastError.assign( (char*)LoadString(GEN_IMAGE_CONVERSION_ERROR).c_str() );
			break;

		case 0x43:
			m_sLastError.assign( (char*)LoadString(GEN_DTE_TO_DCE_DATA_UNDERFLOW).c_str() );
			break;

		case 0x44:
			m_sLastError.assign( (char*)LoadString(GEN_UNRECOGNIZED_DLE_COMMAND).c_str() );
			break;
	
		case 0x45:
			m_sLastError.assign( (char*)LoadString(GEN_WRONG_LINE_LENGTH).c_str() );
			break;
		
		case 0x46:
			m_sLastError.assign( (char*)LoadString(GEN_WRONG_PAGE_LENGTH).c_str() );
			break;

		case 0x47:
			m_sLastError.assign( (char*)LoadString(GEN_WRONG_COMPRESSION_CODE).c_str() );
			break;

		case 0x50:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_D_TRANSMIT_ERROR).c_str() );
			break;

		case 0x51:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_D_TRANSMIT_RESPONSE_FRAME_ERROR).c_str() );
			break;

		case 0x52:
			m_sLastError.assign( (char*)LoadString(GEN_NO_RESPONSE_TO_MPS_REPEATED_3_TIMES).c_str() );
			break;

		case 0x53:
			m_sLastError.assign( (char*)LoadString(GEN_INVALID_RESPONSE_TO_MPS).c_str() );
			break;

		case 0x54:
			m_sLastError.assign( (char*)LoadString(GEN_NO_RESPONSE_TO_EOP_REPEATED_3_TIMES).c_str() );
			break;

		case 0x55:
			m_sLastError.assign( (char*)LoadString(GEN_INVALID_RESPONSE_TO_EOP).c_str() );
			break;

		case 0x56:
			m_sLastError.assign( (char*)LoadString(GEN_NO_RESPONSE_TO_EOM_REPEATED_3_TIMES).c_str() );
			break;

		case 0x57:
			m_sLastError.assign( (char*)LoadString(GEN_INVALID_RESPONSE_TO_EOM).c_str() );
			break;

		case 0x58:
			m_sLastError.assign( (char*)LoadString(GEN_UNABLE_TO_CONTINUE_AFTER_PIN_OR_PIP).c_str() );
			break;

		case 0x70:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_B_RECEIVE_ERROR).c_str() );
			break;

		case 0x71:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_RECEIVE_RESPONSE_FRAME_ERROR).c_str() );
			break;

		case 0x72:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_B_RECEIVE_COMMAND_FRAME_ERROR).c_str() );
			break;

		case 0x73:
			m_sLastError.assign( (char*)LoadString(GEN_T30_T2_TIMEOUT).c_str() );
			break;

		case 0x74:
			m_sLastError.assign( (char*)LoadString(GEN_FAILURE_TO_RESUME_PHASE_B_AFTER_EOM).c_str() );
			break;

		case 0x90:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_C_RECEIVE_ERROR).c_str() );
			break;

		case 0x91:
			m_sLastError.assign( (char*)LoadString(GEN_MISSING_EOL_AFTER_5_SEC).c_str() );
			break;

		case 0x92:
			m_sLastError.assign( (char*)LoadString(GEN_CRC_OR_FRAME_ERROR_IN_ECM_MODE).c_str() );
			break;

		case 0x93:
			m_sLastError.assign( (char*)LoadString(GEN_MODEM_RECEIVE_BUFFER_OVERFLOWED).c_str() );
			break;

		case 0xA0:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_PHASE_D_RECEIVE_ERROR).c_str() );
			break;

		case 0xA1:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_D_RECEIVE_RESPONSE_FRAME_ERROR).c_str() );
			break;

		case 0xA2:
			m_sLastError.assign( (char*)LoadString(GEN_PHASE_D_RECEIVE_COMMAND_FRAME_ERROR).c_str() );
			break;

		case 0xA3:
			m_sLastError.assign( (char*)LoadString(GEN_UNABLE_TO_CONTINUE_AFTER_PIN_OR_PIP).c_str() );
			break;

		default:
			m_sLastError.assign( (char*)LoadString(GEN_UNSPECIFIED_ERROR).c_str() );
			break;
	}


	SetState( STATE_PHASE_E, m_bReceiving ? STATE_WAIT_FOR_OK : STATE_WAIT_FOR_FK_RESP );
}

void CClassTwoPointZero::OnHDLCFrame(void)
{
	//OutputDebugString( "OnHDLCFrame\n" );

	if( m_nHDLCBuffPtr == 0 )
	{
		//OutputDebugString( "Empty HDLC Frame\n" );
		return;
	}

	if( m_nState == STATE_PHASE_C && m_bReceiving )
	{
		m_FaxFile.WriteBuffer( m_szHDLCBuff, m_nHDLCBuffPtr );
	}
}

void CClassTwoPointZero::OnPartialHDLCFrame(void)
{
	//OutputDebugString( "OnPartialHDLCFrame\n" );

	if( m_nState == STATE_PHASE_C && m_bReceiving )
	{
		if( m_bFirstFrame )
		{
			m_bFirstFrame = false;

			if( m_szHDLCBuff[0] == XON )
			{
				//OutputDebugString( "Skipping XON\n" );
				m_FaxFile.WriteBuffer( m_szHDLCBuff+1, m_nHDLCBuffPtr-1 );
			}
			else
			{
				m_FaxFile.WriteBuffer( m_szHDLCBuff, m_nHDLCBuffPtr );
			}
		}
		else
		{
			m_FaxFile.WriteBuffer( m_szHDLCBuff, m_nHDLCBuffPtr );
		}
	}
	else
	{
		//OutputDebugString( "HDLC buffer overflow!\n" );
	}
}


int CClassTwoPointZero::ParseFHSCode(void)
{
	char szNumBuff[21];
	int j;
	int nCode = 0xA0;

	char* p = m_szLineBuff + 5; // Skip +XXXX

	if ( *p == ':' )			// skip the colon
	{
		p++;
	}

	// advance to first digit
	while( *p && (IsHexDigit(*p) == false) && (*p != ',') )
	{
		p++;
	}

	// check for end of string
	if( *p == '\0' )
	{
		return 0xA0;
	}

	j = 0;

	// advance to next comma
	while( *p && IsHexDigit(*p) && (j < 20) )
	{
		szNumBuff[j++] = *p++;
	}

	szNumBuff[j] = '\0';

	sscanf( szNumBuff, "%X", &nCode );

	return nCode;
}


void CClassTwoPointZero::OnTimer( UINT nID )
{
	//OutputDebugString( "CClassTwoPointZero::OnTimer\n" );

	if( nID == TIMER_COMMAND )
	{
		switch( m_nLastCommand )
		{
		case COMMAND_QUERY_SEND_SPEEDS:
			SendCommand( COMMAND_QUERY_RECEIVE_SPEEDS );
			break;

		case COMMAND_QUERY_RECEIVE_SPEEDS:
			SetLocalID();
			break;
	
		case COMMAND_HANGUP:
			SetState( STATE_INIT );
			SendCommand( COMMAND_INIT );
			m_nLoopCtr = 0; 
			break;

		default:
			if( m_bGotOK )
			{
				m_nLoopCtr = 0;
				KillTimer( TIMER_COMMAND );
				SendCommand( COMMAND_SETUP_STRING );
			}
			else
			{
				if( ++m_nLoopCtr >= 3 )
				{
					KillTimer( TIMER_COMMAND );
					m_sLastError.assign( (char*)LoadString(GEN_NO_RESPONSE_FROM_MODEM).c_str() );
//					SignalEvent( EVENT_ERROR );
					OnDisconnectMsg();
				}
				else
				{
					SendCommand( m_nLastCommand, (char*) m_LastCommandString.c_str() );
				}
			}
			break;
		}
	}
}


void CClassTwoPointZero::OnAbortFaxMsg(void)
{
	Abort( true );
}


void CClassTwoPointZero::VerifyOptions(void)
{
	bool bModemFine = m_ParamMatrix[0][1] ? true : false;
	bool bModemUnlimited = m_ParamMatrix[3][2] ? true : false;
	int nModemCompression = m_ParamMatrix[4][3] ? 3 : (m_ParamMatrix[4][1] ? 1 : 0 );
	bool bModemECM = m_ParamMatrix[5][1]  ? true : false;

	if( nModemCompression < m_nSendEncoding )
	{
		char szMsg[FAXAPI_MODEMMSG_INFOLEN];

		wsprintf( szMsg,(char*)LoadString(GEN_FORMAT_UNSUPPORTED_IN_CLASS_20).c_str(), 
			 (m_nSendEncoding==3) ? "2D Group 4" : (m_nSendEncoding == 1 ? "2D Group 3" : "1D Group 3" ),
			 (nModemCompression==3) ? "2D Group 4" : (nModemCompression == 1 ? "2D Group 3" : "1D Group 3" ) );

		SetSendEncoding( nModemCompression );

		SignalEventString( EVENT_INFO, szMsg );
	}

	if( !bModemECM && m_bECMSupported )
	{
		SetSendECM( false );
		SignalEventString( EVENT_INFO, (char*)LoadString(GEN_ECM_UNSUPPORTED_IN_CLASS_2).c_str() );
	}

	SetSendFine( bModemFine );

	SetSendUnlimited( bModemUnlimited );
}


void CClassTwoPointZero::CheckTimeouts( DWORD dwInActive )
{
	switch( m_nState )
	{
	case STATE_PHASE_A:
		if( dwInActive > 90000 )
		{
			m_sLastError.assign( (char*)LoadString(GEN_TIMEOUT_CONNECTING_TO_REMOTE_FAX).c_str() );
			//SignalEvent( EVENT_ERROR );
			Abort( false );
			m_dwActivityTimer = GetTickCount();
		}
		break;

	case STATE_PHASE_E:
		if( dwInActive > 5000 )
		{
			Terminate();
			DoHangup();
			m_dwActivityTimer = GetTickCount();
		}
		break;

	case STATE_DISCONNECT:
		if( dwInActive > 1000 )
		{
			PhaseDisconnect();
		}
		break;

	default:
		if( m_nState > STATE_IDLE && m_nState != STATE_RINGING )
		{
			int nInActive = GetTickCount() - m_dwActivityTimer;
			
			if( nInActive > 60000 )
			{
				m_sLastError.assign( (char*)LoadString(GEN_TIMEOUT_IN_SENDRECEIVE).c_str() );
				//SignalEvent( EVENT_ERROR );
				
				Abort( false );
				m_dwActivityTimer = GetTickCount();
			}
		}
		break;
	}
}

⌨️ 快捷键说明

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