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

📄 fax_event_vcdlg.cpp

📁 三汇CTI板卡的FAX测试DEMO采用事件轮讯的方式
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					}
					break;
				//F2 tone detected
				case DIAL_VOICEF2:					
					if(SsmTalkWith(nCh, m_TrkCh[nCh].nToFaxCh) == -1)	
						WriteLog("Fail to call SsmTalkWith");
					m_FaxCh[m_TrkCh[nCh].nToFaxCh].nAnswered = 1;
					m_FaxCh[m_TrkCh[nCh].nToFaxCh].nDirection = C_SEND_FAX;		//send
					m_TrkCh[i].nStep = TRK_FAXING;
					SendMessage(WM_USER+E_MSG_SEND_FAX, m_TrkCh[nCh].nToFaxCh, nCh);
					break;
				case DIAL_INVALID_PHONUM:
					if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)
						strcpy(m_TrkCh[nCh].szChErrMsg, "空号");
					else 
						strcpy(m_TrkCh[nCh].szChErrMsg, "empty phone number");
					WriteLog(m_TrkCh[nCh].szChErrMsg);
					Hangup(nCh);
					break;	
				default :
					break;
				}//end of switch
			}//end of if
		}
		break;

	// event generated by us when faxing task is available
	case E_MSG_HAVETASK:
		{
			if((SsmPickup(nCh)) == -1)	//pick up
			{
				MessageBox("SsmPickup Fail", "Fail", MB_OK);
				WriteLog("Fail to call SsmPickup");
			}
			sprintf(szRecFile, "channel%d.pcm", nCh);
			if(m_TrkCh[nCh].bRecord)
			{
				if(SsmRecToFile(nCh, szRecFile, -1, 0, -1, -1, 0) == -1)	//record
					WriteLog("Fail to call SsmRecToFile");

				// turn on record mixer
				if(SsmSetRecMixer(nCh, 1, 0) == -1)	
					WriteLog("Fail to call SsmSetRecMixer");
			}

			if(SsmAutoDial(nCh, m_TrkCh[nCh].szCallNo) == -1)	//auto-dialing failed
			{
				SsmGetLastErrMsg(m_TrkCh[nCh].szChErrMsg);
				WriteLog(m_TrkCh[nCh].szChErrMsg);
				Hangup(nCh);
			}
			else
			{
				m_TrkCh[nCh].nCallFlag = 1;
				m_TrkCh[nCh].nStep	 = TRK_DIALING;
			}
		}
		break;
	}//end of switch of event
}
	

void CFax_Event_VCDlg::FaxProc(UINT event, WPARAM wParam, LPARAM lParam)
{
	int i;	//Channel ID
	int m, n;
	CString strTemp, str;

	i = wParam;
	switch(event)
	{
	// event indicating the start of faxing
	case E_MSG_SEND_FAX:	
		{
			if(m_FaxCh[i].nStep == FAX_IDLE)
			{
				if(m_TrkCh[m_FaxCh[i].nTrunkCh].nCallFlag == 0)	//inbound call
				{
					m_FaxCh[i].nHowFile = m_SecondDlg.m_nHowFile;
					if(m_FaxCh[i].nHowFile == 0)	//single file
					{
						strcpy(m_FaxCh[i].szSendFile, m_SecondDlg.m_strSendFile.GetBuffer(m_SecondDlg.m_strSendFile.GetLength()));
						m_SecondDlg.m_strSendFile.ReleaseBuffer();
						m_FaxCh[i].nStartPage = m_SecondDlg.nStartPage;
						m_FaxCh[i].nEndPage   = m_SecondDlg.nEndPage;
					}
					else if(m_FaxCh[i].nHowFile == 1) //multi-file
					{
						strcpy(m_FaxCh[i].szSendPath, m_SecondDlg.m_strSendPath.GetBuffer(m_SecondDlg.m_strSendPath.GetLength()));
						m_SecondDlg.m_strSendPath.ReleaseBuffer();
						m_FaxCh[i].nSCTNumber = m_SecondDlg.nSCTNumber;
						for(int jj = 0; jj < m_FaxCh[i].nSCTNumber; jj++)
						{
							*((m_FaxCh[i].pffSCT)+jj) = m_SecondDlg.ffSCT[jj];
						}
					}
					else if(m_FaxCh[i].nHowFile == 2)	//multi-file(page number is optional)
					{	
						m_FaxCh[i].nSCTNumber = m_SecondDlg.nSCTNumber;
						for(int jj = 0; jj < m_FaxCh[i].nSCTNumber; jj++)
						{
							*((m_FaxCh[i].pffSCT)+jj) = m_SecondDlg.ffSCT[jj];
						}
					}
				}	//end of nCallFlag

				m_TrkCh[m_FaxCh[i].nTrunkCh].nCallFlag = -1;

				if(m_FaxCh[i].nHowFile == 0)	//single file
				{
					// page number is not set
					if(m_FaxCh[i].nStartPage == 1 && m_FaxCh[i].nEndPage == -1)	
					{
						if(SsmFaxStartSend(i, m_FaxCh[i].szSendFile) == -1)	//send
						{
							SsmGetLastErrMsg(m_FaxCh[i].szChErrMsg);
							WriteLog(m_FaxCh[i].szChErrMsg);
							m_FaxCh[i].nStep = FAX_IDLE;
							strcpy(m_FaxCh[i].szRcvPathFile, "");
							strcpy(m_FaxCh[i].szSendFile, "");
							strcpy(m_FaxCh[i].szSendPath, "");
							SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
						}
						else					
						{
							m_FaxCh[i].nStep = FAX_CHECK_END;
						}
					}

					// page number is set
					else		
					{
						if(SsmFaxStartSend(i, m_FaxCh[i].szSendFile) == -1)	//send
						{
							SsmGetLastErrMsg(m_FaxCh[i].szChErrMsg);
							m_FaxCh[i].nStep = FAX_IDLE;
							strcpy(m_FaxCh[i].szRcvPathFile, "");
							strcpy(m_FaxCh[i].szSendFile, "");
							strcpy(m_FaxCh[i].szSendPath, "");
							SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
						}
						else					
							m_FaxCh[i].nStep = FAX_CHECK_END;
					}
				}
				else if(m_FaxCh[i].nHowFile == 1)	//multi-file
				{	
					for(int jj = 0; jj < m_FaxCh[i].nSCTNumber; jj++)
					{
						if(m_FaxCh[i].szSendFile[0] != 0)
							strcat(m_FaxCh[i].szSendFile, ";");
						strcat(m_FaxCh[i].szSendFile, ((m_FaxCh[i].pffSCT)+jj)->szFileName);
					}
					if(SsmFaxSendMultiFile(i, m_FaxCh[i].szSendPath, m_FaxCh[i].szSendFile) == -1)	
					{
						SsmGetLastErrMsg(m_FaxCh[i].szChErrMsg);
						m_FaxCh[i].nStep = FAX_IDLE;
						strcpy(m_FaxCh[i].szRcvPathFile, "");
						strcpy(m_FaxCh[i].szSendFile, "");
						strcpy(m_FaxCh[i].szSendPath, "");
						SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
					}
					else					
						m_FaxCh[i].nStep = FAX_CHECK_END;
				}
				else if(m_FaxCh[i].nHowFile == 2)	//multi-file(page number is optional)
				{
					for(int jj = 0; jj < m_FaxCh[i].nSCTNumber; jj++)
					{
						if(m_FaxCh[i].szSendFile[0] != 0)
							strcat(m_FaxCh[i].szSendFile, ";");
						strcat(m_FaxCh[i].szSendFile, ((m_FaxCh[i].pffSCT)+jj)->szFileName);
					}
					PFAX_FILE_SCT pSCT;
					pSCT = m_FaxCh[i].pffSCT;
					if(SsmFaxSendMultiFileEx(i, pSCT, m_FaxCh[i].nSCTNumber) == -1)	//send
					{
						SsmGetLastErrMsg(m_FaxCh[i].szChErrMsg);
						WriteLog(m_FaxCh[i].szChErrMsg);
						m_FaxCh[i].nStep = FAX_IDLE;
						strcpy(m_FaxCh[i].szRcvPathFile, "");
						strcpy(m_FaxCh[i].szSendFile, "");
						strcpy(m_FaxCh[i].szSendPath, "");
						SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
					}
					else					
						m_FaxCh[i].nStep = FAX_CHECK_END;
				}
			}
		}
		break;
		
	case E_MSG_RCV_FAX:
		{
			if(m_FaxCh[i].nStep == FAX_IDLE)
			{
				strcpy(m_FaxCh[i].szRcvPathFile, m_FirstDlg.m_strRcvPath.GetBuffer(m_FirstDlg.m_strRcvPath.GetLength()));
				m_FirstDlg.m_strRcvPath.ReleaseBuffer();
				strcat(m_FaxCh[i].szRcvPathFile, "\\");
				// fax file name + channel ID
				strTemp.Format("%s", m_FirstDlg.m_strRcvFile);
				strTemp.TrimRight();
				str = strTemp.Right(5);
				m	= str.GetLength();
				n	= str.Find('.');
				str.Format("%d", i);
				n	= strTemp.GetLength() - m + n;
				for(int jj = 0; jj < str.GetLength(); jj++)
				{
					strTemp.Insert(n + jj, str[jj]);
				}
				strcat(m_FaxCh[i].szRcvPathFile, strTemp.GetBuffer(strTemp.GetLength()));
				strTemp.ReleaseBuffer();

				if(SsmFaxStartReceive(i, m_FaxCh[i].szRcvPathFile) == -1) //receive
				{
					SsmGetLastErrMsg(m_FaxCh[i].szChErrMsg);
					WriteLog(m_FaxCh[i].szChErrMsg);
					m_FaxCh[i].nStep = FAX_IDLE;
					strcpy(m_FaxCh[i].szRcvPathFile, "");
					strcpy(m_FaxCh[i].szSendFile, "");
					strcpy(m_FaxCh[i].szSendPath, "");
					SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
				}
				else
				{
					m_FaxCh[i].nStep = FAX_CHECK_END;
				}	
			}
		}
		break;
		
	case E_PROC_FaxEnd:
		{
			if(m_FaxCh[i].nStep == FAX_CHECK_END)
			{
				m_FaxCh[i].nCheckEnd = lParam;
				switch(m_FaxCh[i].nCheckEnd)
				{
				case 1 :
					if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)
						WriteLog("传真成功");
					else
						WriteLog("Succeed in faxing");
					m_FaxCh[i].nStep = FAX_IDLE;
					strcpy(m_FaxCh[i].szRcvPathFile, "");
 					strcpy(m_FaxCh[i].szSendFile, "");
					strcpy(m_FaxCh[i].szSendPath, "");
					SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
					break;
				case 2 :
					if(SsmFaxGetPages(i) > 0 || SsmFaxGetSendBytes(i) > 0)
					{
						if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)
							WriteLog("传真失败 : 传真在页面阶段失败");
						else
							WriteLog("Failed to fax : failure in page phase");
					}
					else
					{
						if(m_FaxCh[i].nAnswered == 1)
						{
							if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)
								WriteLog("传真失败 : 传真在握手阶段失败");
							else
								WriteLog("Failed to fax : failure in handshake phase");
						}
						else if(m_FaxCh[i].nAnswered == 0)
						{
							if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)
								WriteLog("传真失败 : 对方未按\"开始\"键,发送超时");
							else
								WriteLog("Failed to fax : the receiver doesn't press key 'start' or time out when waiting for key 'start'");
						}
					}
					m_FaxCh[i].nStep = FAX_IDLE;
					strcpy(m_FaxCh[i].szRcvPathFile, "");
					strcpy(m_FaxCh[i].szSendFile, "");
					strcpy(m_FaxCh[i].szSendPath, "");
					SendMessage(WM_USER+E_MSG_FAX_IDLE, m_FaxCh[i].nTrunkCh, i);
					break;
				}//end of switch
			}
		}
		break;

	case E_CHG_FaxPages:
		{
			_itoa(lParam, m_FaxCh[i].szPage, 10);
		}
		break;

	// event indicating the hangup of the remote fax machine 
	case E_MSG_OFFLINE:
		{
			if(m_FaxCh[i].nStep == FAX_CHECK_END)
			{
				if(SsmFaxStop(i) == -1)
					WriteLog("Fail to call SsmFaxStop");
				m_FaxCh[i].nStep = FAX_IDLE;
				strcpy(m_FaxCh[i].szRcvPathFile, "");
				strcpy(m_FaxCh[i].szSendFile, "");
				strcpy(m_FaxCh[i].szSendPath, "");
			}
		}
		break;
	}//end of switch of event
}


void CFax_Event_VCDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	// scan task queue
	ScanTaskQueue();
		
	CDialog::OnTimer(nIDEvent);
}


void CFax_Event_VCDlg::Hangup(int nChannel)
{
	int nCh = nChannel;
	if(SsmHangup(nCh) == -1)	//remote hangup
		WriteLog("Fail to call SsmHangup");
	if(SsmStopRecToFile(nCh) == -1)	//stop recording
		WriteLog("Fail to call SsmStopRecToFile");
	m_TrkCh[nCh].nStep = TRK_IDLE;
	strcpy(m_TrkCh[nCh].szCallerId, "");
	if(m_TrkCh[nCh].bLinked)
	{
		m_FaxCh[m_TrkCh[nCh].nToFaxCh].bUseful = FALSE; //the channel is useful
		m_TrkCh[nCh].bLinked = FALSE;
	}
	m_TrkCh[nCh].bUseful		= FALSE; //useful
	m_TrkCh[nCh].nFirstDtmf		= 0;
	m_TrkCh[nCh].nIndex			= 0;
	m_TrkCh[nCh].szDtmf[0]		= 0;
	m_TrkCh[nCh].szDtmfChose[0]	= 0;
}


void CFax_Event_VCDlg::ScanTaskQueue()
{
	int nTrunkCh;
	int nFaxCh;
	FAX_TASK *p = pFront;
				
	while(p->pNext)		
	{
		// faxing task available
		nTrunkCh = p->pNext->nTrkCh;
		if(nTrunkCh == -1 && (nTrunkCh = FindAnIdleTrunkCh()) != -1
			|| nTrunkCh != -1 && m_TrkCh[nTrunkCh].bUseful == FALSE && m_TrkCh[nTrunkCh].nStep == TRK_IDLE)
		{
			nFaxCh = p->pNext->nFaxCh;
			// scan next task if idle fax channel is unavailable
			if((nFaxCh == -1) && ((nFaxCh = FindAnIdleFaxCh()) == -1)
				|| (nFaxCh != -1) && ((m_FaxCh[nFaxCh].nStep != FAX_IDLE) || (m_FaxCh[nFaxCh].bUseful == TRUE)))
			{
				p = p->pNext;
				continue;
			}
			// begin the task if idle fax channel is available
			else	
			{
				m_TrkCh[nTrunkCh].nLineState = SsmGetChState(nTrunkCh);
				if(m_TrkCh[nTrunkCh].nLineState == -1)
					WriteLog("Fail to call SsmGetChState");							
				else if(m_TrkCh[nTrunkCh].nLineState != S_CALL_STANDBY)
				{
					p = p->pNext;
					continue;
				}
				m_TrkCh[nTrunkCh].bLinked = TRUE;
				m_TrkCh[nTrunkCh].bUseful = TRUE;
				m_FaxCh[nFaxCh].bUseful = TRUE;
				m_TrkCh[nTrunkCh].nToFaxCh = nFaxCh;
				m_FaxCh[nFaxCh].nTrunkCh = nTrunkCh;
				m_FaxCh[nFaxCh].nHowFile = p->pNext->nHowFile;
				strcpy(m_TrkCh[nTrunkCh].szCallNo, p->pNext->szCallNo);
				if(m_FaxCh[nFaxCh].nHowFile == 0)	//single file
				{
					m_FaxCh[nFaxCh].nStartPage		= p->pNext->nStartPage;
					m_FaxCh[nFaxCh].nEndPage		= p->pNext->nEndPage;
					strcpy(m_FaxCh[nFaxCh].szSendFile, p->pNext->szSendFile);
				}
				if(m_FaxCh[nFaxCh].nHowFile == 1)	//multi-file
				{
					strcpy(m_FaxCh[nFaxCh].szSendPath, p->pNext->szSendPath);
					m_FaxCh[nFaxCh].nSCTNumber	= p->pNext->nSCTNumber;
					for(int jj = 0; jj < m_FaxCh[nFaxCh].nSCTNumber; jj++)
					{
						*((m_FaxCh[nFaxCh].pffSCT)+jj) = p->pNext->ffSCT[jj];
					}
				}
				if(m_FaxCh[nFaxCh].nHowFile == 2)	//multi-file(page number is optional)
				{
					m_FaxCh[nFaxCh].nSCTNumber	= p->pNext->nSCTNumber;
					for(int jj = 0; jj < m_FaxCh[nFaxCh].nSCTNumber; jj++)
					{
						*((m_FaxCh[nFaxCh].pffSCT)+jj) = p->pNext->ffSCT[jj];
					}
				}

				SendMessage(WM_USER+E_MSG_HAVETASK, nTrunkCh, nFaxCh);

				FAX_TASK *q = p->pNext;
				p->pNext = q->pNext;
				if(pRear == q)
					pRear = p;
				free(q);
				break;
			}
		}
		else
			p = p->pNext;
	}				
}


void CFax_Event_VCDlg::InitLab()
{
	if(g_dwLanguageConversion == g_dwCHINESE_SIMPLIFIED)

⌨️ 快捷键说明

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