📄 fax_event_vcdlg.cpp
字号:
}
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 + -