| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- #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; i<m_FaxChanList.GetCount(); ++i)
- {
- CFaxChannel* pChannel = m_FaxChanList.GetNext(PosStaticCh);
- ASSERT(pChannel != NULL);
- // 保证POS是有效的
- if(PosStaticCh == NULL)
- PosStaticCh = m_FaxChanList.GetHeadPosition();
- // 当前外线是否空闲
- if(pChannel->isFree())
- 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);
- }
|