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

📄 classtwo.cpp

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


}

void CClassTwo::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 CClassTwo::OnNSF(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_NSF).c_str() );
}

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

// Page Status Report
void CClassTwo::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
			{
				m_bLastPageGood = true;
				SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_MCF).c_str() );
			}
			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 CClassTwo::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 CClassTwo::OnEOP(void)
{
	SignalEventString( EVENT_INFO, (char*)LoadString(GEN_RECEIVED_EOP).c_str() );
	m_bGotEOP = true;
}

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

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


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

	//OutputDebugString( "OnFHNG\n" );

	ParseFaxParams( 1, &n );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

		case 103:
			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, STATE_WAIT_FOR_FK_RESP );
}

void CClassTwo::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, false );
	}
}

void CClassTwo::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, false );
			}
			else
			{
				m_FaxFile.WriteBuffer( m_szHDLCBuff, m_nHDLCBuffPtr, false );
			}
		}
		else
		{
			m_FaxFile.WriteBuffer( m_szHDLCBuff, m_nHDLCBuffPtr, false );
		}
	}
	else
	{
		//OutputDebugString( "HDLC buffer overflow!\n" );
	}
}

/*
int CClassTwo::ParseFaxParams( int nMaxParams )
{
	char szNumBuff[21];
	int* pParams = (int*)&m_Params;
	int j;
	int i;

	ZeroMemory( &m_Params, sizeof(m_Params) );

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

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

	// advance to first digit
	while( *p && (*p < '0') && (*p > '9') && (*p != ',') )
	{
		p++;
	}

	for( i = 0; i < nMaxParams; i++ )
	{
		// check for end of string
		if( *p == '\0' )
		{
			return i;
		}

		j = 0;

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

		szNumBuff[j] = '\0';

		pParams[i] = atoi( szNumBuff );

		if( *p )	// advance past comma
			p++;
	}

	return i;
}
*/

void CClassTwo::OnTimer( UINT nID )
{
	//OutputDebugString( "CClassTwo::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() );
					OnDisconnectMsg();
				}
				else
				{
					SendCommand( m_nLastCommand, (char*) m_LastCommandString.c_str() );
				}
			}
			break;
		}
	}
}



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

void CClassTwo::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][2]  ? true : false;

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

		wsprintf( szMsg,(char*)LoadString(GEN_FORMAT_UNSUPPORTED_IN_CLASS_2).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 CClassTwo::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();
			PhaseDisconnect();
		}
		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 + -