#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(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(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(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(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("未知状态"); } }