中间件标准版5.1git,去除基础模块

DevFax.cpp 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include "StdAfx.h"
  2. #include "DevFax.h"
  3. #include "LineAudio.h"
  4. CDevFax::CDevFax(int LineId) : m_ID(LineId), m_Direction(FAX_DIRECTION_NULL), m_pAssoLine(NULL)
  5. {
  6. }
  7. CDevFax::~CDevFax(void)
  8. {
  9. }
  10. /*****************************************************************
  11. **【函数名称】 __startTalkingWith
  12. **【函数功能】 建立双向关联
  13. **【参数】
  14. **【返回值】
  15. ****************************************************************/
  16. void CDevFax::__startTalkingWith( void )
  17. {
  18. int nLineID = m_pAssoLine->id();
  19. if (SsmFaxCheckEnd(m_ID) == 0)
  20. {
  21. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 语音通道[%d]请求传真失败, 当前传真设备[%d]已有传真发送任务"), nLineID, m_ID);
  22. SsmFaxStop(m_ID);
  23. }
  24. if(SsmTalkWith(m_ID, nLineID) == 0) // 传真通道与收放音通道进行双向连接
  25. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 建立语音通道[%d]与传真设备[%d]的双向连接成功"), nLineID, m_ID);
  26. else
  27. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 建立语音通道[%d]与传真设备[%d]的双向连接失败"), nLineID, m_ID);
  28. }
  29. /*****************************************************************
  30. **【函数名称】 __stopTalkingWith
  31. **【函数功能】 拆除双向连接通道
  32. **【参数】
  33. **【返回值】
  34. ****************************************************************/
  35. void CDevFax::__stopTalkingWith( void )
  36. {
  37. //如果线路唯空直接退出
  38. if(m_pAssoLine == NULL)
  39. return;
  40. CString strInfo;
  41. int nLineID = m_pAssoLine->id();
  42. if(SsmStopTalkWith(m_ID, nLineID) == -1) //拆除双向连通
  43. {
  44. char Buf[DEV_OP_BUF_LEN] = { 0 };
  45. SsmGetLastErrMsg(Buf);
  46. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 拆除语音通道[%d]与传真设备[%d]双向连接失败, %s"), nLineID, m_ID, Buf);
  47. }
  48. else
  49. {
  50. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 拆除语音通道[%d]与传真设备[%d]双向连接成功"), nLineID, m_ID);
  51. }
  52. }
  53. /*****************************************************************
  54. **【函数名称】 setAssoLine
  55. **【函数功能】 设置传真关联的线路(本线路用来发送或者接收传真)
  56. 并进行双向连接
  57. **【参数】
  58. ****************************************************************/
  59. void CDevFax::setAssoLine( CLineAudio* pDevLine )
  60. {
  61. if(pDevLine == NULL)
  62. {
  63. //停止双向关联
  64. __stopTalkingWith();
  65. m_pAssoLine = NULL;
  66. m_FaxFile = _T("");
  67. m_Direction = FAX_DIRECTION_NULL;
  68. }
  69. else
  70. { //建立双向关联
  71. m_pAssoLine = pDevLine;
  72. __startTalkingWith();
  73. }
  74. // 推送状态变化消息
  75. CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
  76. }
  77. /*****************************************************************
  78. **【函数名称】 sendFax
  79. **【函数功能】 发送传真
  80. **【参数】 FaxFileName:传真文件
  81. **【返回值】 TRUE执行成功,FALS失败
  82. ****************************************************************/
  83. bool CDevFax::sendFax( LPCTSTR FaxFileName )
  84. {
  85. ASSERT(FaxFileName != NULL);
  86. // 检测传真文件格式合法性
  87. int nLen = strlen(FaxFileName);
  88. if(nLen <= 0)
  89. {
  90. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 传真文件名为空"), m_ID);
  91. return false;
  92. }
  93. CString strFile = FaxFileName;
  94. CString strTemp = strFile.Right(3);
  95. if(strTemp != FAX_FILE_NAME_FILTER)
  96. {
  97. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 传真文件[%s]格式错误"), m_ID, FaxFileName);
  98. return false;
  99. }
  100. int nLineID = m_pAssoLine->id();
  101. char szFaxId[DEV_OP_BUF_LEN] = { 0 };
  102. _snprintf_s(szFaxId, DEV_OP_BUF_LEN, _TRUNCATE, _T("%d"), nLineID);
  103. //设置本端的识别代码
  104. SsmFaxSetID(m_ID, szFaxId);
  105. //获得传真线路状态
  106. if (SsmGetChState(m_ID) == -1)
  107. {
  108. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, 获取设备状态出错"), m_ID);
  109. return false;
  110. }
  111. //开始发送传真
  112. if (SsmFaxStartSend(m_ID, FaxFileName) == -1)
  113. {
  114. char Buf[DEV_OP_BUF_LEN] = { 0 };
  115. SsmGetLastErrMsg(Buf);
  116. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]发送传真失败, %s"), m_ID, Buf);
  117. return false;
  118. }
  119. m_FaxFile = FaxFileName;
  120. m_Direction = FAX_DIRECTION_SEND;
  121. // 推送状态变化消息
  122. CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
  123. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]开始发送传真"), m_ID);
  124. return true;
  125. }
  126. /*****************************************************************
  127. **【函数名称】 recvFax
  128. **【函数功能】 接收传真
  129. **【参数】 FaxFileName:传真文件
  130. **【返回值】 TRUE--成功,FALSE-失败
  131. ****************************************************************/
  132. bool CDevFax::recvFax( LPCTSTR FaxFileName )
  133. {
  134. //创建文件路径
  135. CString tmpPath = FaxFileName;
  136. int inDex = tmpPath.ReverseFind(FILE_PATH_SPLIT_SIGN_WINDOWS);
  137. if (inDex == -1)
  138. inDex = tmpPath.ReverseFind(FILE_PATH_SPLIT_SIGN_LINUX);
  139. tmpPath = tmpPath.Left(inDex + 1);
  140. SHCreateDirectoryEx(NULL, tmpPath, NULL);
  141. if (SsmGetChState(m_ID) == -1) //获得传真线路状态
  142. {
  143. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]接收传真失败, 获取设备状态出错"), m_ID);
  144. return false;
  145. }
  146. int nLineID = m_pAssoLine->id();
  147. char szFaxId[DEV_OP_BUF_LEN] = { 0 };
  148. _snprintf_s(szFaxId, DEV_OP_BUF_LEN, _TRUNCATE, _T("%d"), nLineID);
  149. SsmFaxSetID(m_ID, szFaxId);
  150. //开始接收传真
  151. if (SsmFaxStartReceive(m_ID, FaxFileName) == -1)
  152. {
  153. char Buf[DEV_OP_BUF_LEN] = { 0 };
  154. SsmGetLastErrMsg(Buf);
  155. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]接收传真失败, %s"), m_ID, Buf);
  156. __stopTalkingWith();
  157. return false;
  158. }
  159. m_FaxFile = FaxFileName;
  160. m_Direction = FAX_DIRECTION_RECV;
  161. // 推送状态变化消息
  162. CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
  163. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]开始接收传真"), m_ID);
  164. return true;
  165. }
  166. /*****************************************************************
  167. **【函数名称】 stopFax
  168. **【函数功能】 停止传真
  169. **【参数】
  170. **【返回值】
  171. ****************************************************************/
  172. void CDevFax::stopFax( void )
  173. {
  174. //不用任何判断直接停止
  175. //int RetChack =SsmFaxCheckEnd(m_LineID);
  176. m_FaxFile = _T("");
  177. m_Direction = FAX_DIRECTION_NULL;
  178. if (SsmFaxStop(m_ID) == -1)
  179. {
  180. char Buf[DEV_OP_BUF_LEN] = { 0 };
  181. SsmGetLastErrMsg(Buf);
  182. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{Fax}: 设备[%d]停止传真失败, %s"), m_ID, Buf);
  183. }
  184. else
  185. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{Fax}: 设备[%d]停止传真成功"), m_ID);
  186. // 推送状态变化消息
  187. CMsgCenter::GetInstance().pushMsg(VS_MSG_DEV_FAX_STATE_UPDAET, reinterpret_cast<const PARAM>(m_ID));
  188. }
  189. /*****************************************************************
  190. **【函数名称】 state
  191. **【函数功能】 获取传真设备状态
  192. **【参数】
  193. **【返回值】
  194. ****************************************************************/
  195. LPCTSTR CDevFax::state( void ) const
  196. {
  197. switch(m_Direction)
  198. {
  199. case FAX_DIRECTION_NULL: return _T("空闲");
  200. case FAX_DIRECTION_SEND: return _T("发送");
  201. case FAX_DIRECTION_RECV: return _T("接收");
  202. default: return _T("未知状态");
  203. }
  204. }