| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- #include "StdAfx.h"
- #include "DevFax.h"
- #include "LineAudio.h"
- CDevFax::CDevFax(int LineId) : m_ID(LineId), m_Direction(FAX_DIRECTION_NULL), m_pAssoLine(NULL)
- {
- }
- CDevFax::~CDevFax(void)
- {
- }
- /*****************************************************************
- **【函数名称】 __startTalkingWith
- **【函数功能】 建立双向关联
- **【参数】
- **【返回值】
- ****************************************************************/
- void CDevFax::__startTalkingWith( void )
- {
- int nLineID = m_pAssoLine->id();
- if (SsmFaxCheckEnd(m_ID) == 0)
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 语音通道[%d]请求传真失败, 当前传真设备[%d]已有传真发送任务"), nLineID, m_ID);
- SsmFaxStop(m_ID);
- }
- if(SsmTalkWith(m_ID, nLineID) == 0) // 传真通道与收放音通道进行双向连接
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 建立语音通道[%d]与传真设备[%d]的双向连接成功"), nLineID, m_ID);
- else
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 建立语音通道[%d]与传真设备[%d]的双向连接失败"), nLineID, m_ID);
- }
- /*****************************************************************
- **【函数名称】 __stopTalkingWith
- **【函数功能】 拆除双向连接通道
- **【参数】
- **【返回值】
- ****************************************************************/
- void CDevFax::__stopTalkingWith( void )
- {
- //如果线路唯空直接退出
- if(m_pAssoLine == NULL)
- return;
- CString strInfo;
- int nLineID = m_pAssoLine->id();
- if(SsmStopTalkWith(m_ID, nLineID) == -1) //拆除双向连通
- {
- char Buf[DEV_OP_BUF_LEN] = { 0 };
- SsmGetLastErrMsg(Buf);
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 拆除语音通道[%d]与传真设备[%d]双向连接失败, %s"), nLineID, m_ID, Buf);
- }
- else
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 拆除语音通道[%d]与传真设备[%d]双向连接成功"), nLineID, m_ID);
- }
- }
- /*****************************************************************
- **【函数名称】 setAssoLine
- **【函数功能】 设置传真关联的线路(本线路用来发送或者接收传真)
- 并进行双向连接
- **【参数】
- ****************************************************************/
- void CDevFax::setAssoLine( CLineAudio* pDevLine )
- {
- if(pDevLine == NULL)
- {
- //停止双向关联
- __stopTalkingWith();
- m_pAssoLine = NULL;
- m_FaxFile = _T("");
- m_Direction = FAX_DIRECTION_NULL;
- }
- else
- { //建立双向关联
- m_pAssoLine = pDevLine;
- __startTalkingWith();
- }
- // 推送状态变化消息
- CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
- }
- /*****************************************************************
- **【函数名称】 sendFax
- **【函数功能】 发送传真
- **【参数】 FaxFileName:传真文件
- **【返回值】 TRUE执行成功,FALS失败
- ****************************************************************/
- bool CDevFax::sendFax( LPCTSTR FaxFileName )
- {
- ASSERT(FaxFileName != NULL);
- // 检测传真文件格式合法性
- int nLen = strlen(FaxFileName);
- if(nLen <= 0)
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 传真文件名为空"), m_ID);
- return false;
- }
- CString strFile = FaxFileName;
- CString strTemp = strFile.Right(3);
- if(strTemp != FAX_FILE_NAME_FILTER)
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 传真文件[%s]格式错误"), m_ID, FaxFileName);
- return false;
- }
- int nLineID = m_pAssoLine->id();
- char szFaxId[DEV_OP_BUF_LEN] = { 0 };
- _snprintf_s(szFaxId, DEV_OP_BUF_LEN, _TRUNCATE, _T("%d"), nLineID);
- //设置本端的识别代码
- SsmFaxSetID(m_ID, szFaxId);
- //获得传真线路状态
- if (SsmGetChState(m_ID) == -1)
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 获取设备状态出错"), m_ID);
- return false;
- }
- //开始发送传真
- if (SsmFaxStartSend(m_ID, FaxFileName) == -1)
- {
- char Buf[DEV_OP_BUF_LEN] = { 0 };
- SsmGetLastErrMsg(Buf);
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, %s"), m_ID, Buf);
- return false;
- }
- m_FaxFile = FaxFileName;
- m_Direction = FAX_DIRECTION_SEND;
- // 推送状态变化消息
- CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]开始发送传真"), m_ID);
- return true;
- }
- /*****************************************************************
- **【函数名称】 recvFax
- **【函数功能】 接收传真
- **【参数】 FaxFileName:传真文件
- **【返回值】 TRUE--成功,FALSE-失败
- ****************************************************************/
- bool CDevFax::recvFax( LPCTSTR FaxFileName )
- {
- //创建文件路径
- CString tmpPath = FaxFileName;
- int inDex = tmpPath.ReverseFind(FILE_PATH_SPLIT_SIGN_WINDOWS);
- if (inDex == -1)
- inDex = tmpPath.ReverseFind(FILE_PATH_SPLIT_SIGN_LINUX);
- tmpPath = tmpPath.Left(inDex + 1);
- SHCreateDirectoryEx(NULL, tmpPath, NULL);
-
- if (SsmGetChState(m_ID) == -1) //获得传真线路状态
- {
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]接收传真失败, 获取设备状态出错"), m_ID);
- return false;
- }
- int nLineID = m_pAssoLine->id();
- char szFaxId[DEV_OP_BUF_LEN] = { 0 };
- _snprintf_s(szFaxId, DEV_OP_BUF_LEN, _TRUNCATE, _T("%d"), nLineID);
- SsmFaxSetID(m_ID, szFaxId);
- //开始接收传真
- if (SsmFaxStartReceive(m_ID, FaxFileName) == -1)
- {
- char Buf[DEV_OP_BUF_LEN] = { 0 };
- SsmGetLastErrMsg(Buf);
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]接收传真失败, %s"), m_ID, Buf);
- __stopTalkingWith();
- return false;
- }
- m_FaxFile = FaxFileName;
- m_Direction = FAX_DIRECTION_RECV;
- // 推送状态变化消息
- CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]开始接收传真"), m_ID);
- return true;
- }
- /*****************************************************************
- **【函数名称】 stopFax
- **【函数功能】 停止传真
- **【参数】
- **【返回值】
- ****************************************************************/
- void CDevFax::stopFax( void )
- {
- //不用任何判断直接停止
- //int RetChack =SsmFaxCheckEnd(m_LineID);
- m_FaxFile = _T("");
- m_Direction = FAX_DIRECTION_NULL;
- if (SsmFaxStop(m_ID) == -1)
- {
- char Buf[DEV_OP_BUF_LEN] = { 0 };
- SsmGetLastErrMsg(Buf);
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]停止传真失败, %s"), m_ID, Buf);
- }
- else
- ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]停止传真成功"), m_ID);
- // 推送状态变化消息
- CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
- }
- /*****************************************************************
- **【函数名称】 state
- **【函数功能】 获取传真设备状态
- **【参数】
- **【返回值】
- ****************************************************************/
- LPCTSTR CDevFax::state( void ) const
- {
- switch(m_Direction)
- {
- case FAX_DIRECTION_NULL: return _T("空闲");
- case FAX_DIRECTION_SEND: return _T("发送");
- case FAX_DIRECTION_RECV: return _T("接收");
- default: return _T("未知状态");
- }
- }
|