📄 classtwopointzero.cpp
字号:
{
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 + -