#include "StdAfx.h" #include "FaxVirtualDevice.h" #include "Config.h" #include "FaxChannel.h" CFaxVirtualDevice::CFaxVirtualDevice(void) { } CFaxVirtualDevice::~CFaxVirtualDevice(void) { } /***************************************************************** **【函数名称】 __getFreeChannel **【函数功能】 查找空闲通道 **【参数】 **【返回值】 ****************************************************************/ CFaxChannel* CFaxVirtualDevice::__getFreeChannel( void ) { // 当前轮循到的索引 static POSITION PosStaticCh = m_FaxChanList.GetHeadPosition(); // 保证遍历一轮 for(int i=0; iisFree()) return pChannel; } // end if return NULL; } /***************************************************************** **【函数名称】 open **【函数功能】 打开传真设备 **【参数】 **【返回值】 ****************************************************************/ bool CFaxVirtualDevice::open( void ) { ISX_fxs_SetFaxMode(FAXM_G711); if(ISX_fxs_StartConnectToFaxServer(CConfig::faxServerAddr(), CConfig::faxServerPort()) == 0) { return true; } else { LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{FaxDev}: Fax设备连接失败")); return false; } } /***************************************************************** **【函数名称】 close **【函数功能】 关闭传真设备 **【参数】 **【返回值】 ****************************************************************/ void CFaxVirtualDevice::close( void ) { POSITION Pos = m_FaxChanList.GetHeadPosition(); while(Pos != NULL) { CFaxChannel* pChannel = m_FaxChanList.GetNext(Pos); ASSERT(pChannel != NULL); pChannel->close(); delete pChannel; pChannel = NULL; } ISX_fxs_StopConnectToFaxServer(); LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{FaxDev}: Fax设备关闭")); } /***************************************************************** **【函数名称】 createFaxChannel **【函数功能】 创建传真通道 **【参数】 **【返回值】 ****************************************************************/ void CFaxVirtualDevice::createFaxChannel( void ) { int IdleCount = 0; if(ISX_fxs_ChkFaxResource(&m_Capacity, &IdleCount) == -1) { LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{FaxDev}: Fax设备创建传真通道失败, 查询设备资源情况失败")); return; } CFaxChannel* pChannel = NULL; for(int i = 0; i < m_Capacity; ++i) { pChannel = new CFaxChannel(i); ASSERT(pChannel != NULL); if(pChannel->open()) { m_FaxChanList.AddTail(pChannel); } else { delete pChannel; pChannel = NULL; } } LOGGER(LOG_CLASS_DEV, LOG_LEVEL_ERROR, _T("{FaxDev}: Fax设备共创建%d条传真通道"), m_FaxChanList.GetCount()); } /***************************************************************** **【函数名称】 send **【函数功能】 发送传真 **【参数】 **【返回值】 ****************************************************************/ bool CFaxVirtualDevice::send( COneLeg* pLeg, LPCTSTR FaxFile ) { CFaxChannel* pChannel = __getFreeChannel(); if(pChannel == NULL) return false; else return pChannel->send(pLeg, FaxFile); } /***************************************************************** **【函数名称】 recv **【函数功能】 接收传真 **【参数】 **【返回值】 ****************************************************************/ bool CFaxVirtualDevice::recv( COneLeg* pLeg, LPCTSTR FaxFile ) { CFaxChannel* pChannel = __getFreeChannel(); if(pChannel == NULL) return false; else return pChannel->recv(pLeg, FaxFile); }