⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ivfxboardunit.cpp

📁 基于板卡的fax源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        return SEND_FAX_ERROR_OFFHOOK;    
    }

#ifndef CTI_VC_VERSION
    ITools::WriteLog(CTI,"摘机挂机成功","通道号"+IntToStr(channelnumber));
    ITools::WriteLog(CTI,"开始拨号...",
                    "通道号"+IntToStr(channelnumber)+
                    " 传真号码"+AnsiString(dialstring)+
                    " 文件名"+AnsiString(filename));
#endif

    // 分析拨打号码
    // fullname ==>  58752522-13 prefix: 58752522 suffix: 13
    // fullname ==>  58752522    prefix: 58752522 suffix: "";
    GetPhoneInfo(dialstring);

    // 拨号未成功
    if (RouteVoice(channelnumber) == FALSE) {
        ITools::WriteLog(CTI,"拨号路由时语音失败","通道号"+IntToStr(channelnumber));
    }
	if ((term = dx_dial(m_hVox[channelnumber],prefix.c_str(),&capp,DX_CALLP|EV_SYNC)) == -1) {
                           
#ifndef CTI_VC_VERSION
        ITools::WriteLog(CTI,"拨号函数调用失败","通道号"+IntToStr(channelnumber)+
                         " 传真号码"+AnsiString(dialstring)+
                         " 文件名"+AnsiString(filename));
#endif
    	dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
        dx_fileclose(tifd1);
        return SEND_FAX_ERROR_DIALFUN;
	}

    ITools::WriteLog(CTI,"拨号函数返回:",IntToStr(term));

	switch (term) {

        case CR_CNCT:       // 连接成功
        case CR_FAXTONE:    // Fax提示音
#ifndef CTI_VC_VERSION
            ITools::WriteLog(CTI,"拨号成功连接","通道号"+IntToStr(channelnumber)+
                            " 传真号码"+prefix+
                            " 文件名"+AnsiString(filename));
#endif

            // 有分机
            if (suffix != "") {
                ::Sleep(500);
                ITools::WriteLog(CTI,"开始拨分机...","通道号"+IntToStr(channelnumber)+
                                 " 分机号码"+suffix);
                if ((sufterm = dx_dial(m_hVox[channelnumber],suffix.c_str(),&capp,DX_CALLP|EV_SYNC)) == -1) {
                    ITools::WriteLog(CTI,"分机拨号函数失败","通道号"+IntToStr(channelnumber)+
                                     " 分机号码"+suffix);
                    dx_fileclose(tifd1);
                    dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
                    return sufterm;
                }
                else {
                    switch (sufterm) {
                        case CR_CNCT:
                        case CR_FAXTONE:    // Fax提示音
                        case CR_NORB:                        
                            ITools::WriteLog(CTI,"分机连接成功","通道号"+IntToStr(channelnumber)+
                                             " 分机号码"+suffix);

                            if (extension != "") {
                                ::Sleep(500);
                                dx_dial(m_hVox[channelnumber],extension.c_str(),&capp,DX_CALLP|EV_SYNC);
                                ::Sleep(2000);
                                dx_dial(m_hVox[channelnumber],extension.c_str(),&capp,DX_CALLP|EV_SYNC);                                
                            }

                            break;

                        default:
                            ITools::WriteLog(CTI,"分机连接失败","通道号"+IntToStr(channelnumber)+
                                             " 传真号码"+suffix);
                            dx_fileclose(tifd1);
                            dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
                            return sufterm;
                    } // End of switch (sufterm);

                }
            } // End of (有分机)

            else {
                if (extension != "") {  // 说明是传真对接,不需要播放提示音
                    ::Sleep(500);
                    dx_dial(m_hVox[channelnumber],extension.c_str(),&capp,DX_CALLP|EV_SYNC);
                    ::Sleep(2000);
                    dx_dial(m_hVox[channelnumber],extension.c_str(),&capp,DX_CALLP|EV_SYNC);                    
                }

                else {
                    // 不管是不是传真机,先提示,因为有可能是人接
                    AnsiString HintWav  = ITools::GetExePath()+"\\"+DEFAULT_RESDIR+"\\"+SEND_FAX_HINT_MSG;
                    PlayVoxFile(channelnumber,HintWav.c_str());
                    ITools::WriteLog(CTI,"播放提示音结束","");
                    ::Sleep(SEND_FAX_HINT_SILENCE);
                }
            }

#ifndef CTI_VC_VERSION
            ITools::WriteLog(CTI,"开始发送传真...","通道号"+IntToStr(channelnumber)+
                             " 传真号码"+AnsiString(dialstring)+
                             " 文件名"+AnsiString(filename));
#endif

            // 开始发送传真
            if (RouteFax(channelnumber) == FALSE) {
                ITools::WriteLog(CTI,"路由传真通道失败","通道号"+IntToStr(channelnumber));
            }
            
            if (fx_sendfax(m_hFax[channelnumber],&iott,EV_SYNC)== -1) {

#ifndef CTI_VC_VERSION
                ITools::WriteLog(CTI,"发送传真失败","通道号"+IntToStr(channelnumber)+
                                 " 传真号码"+AnsiString(dialstring)+
                                 " 文件名"+AnsiString(filename));
#endif
                // 发送传真失败
                if (dx_fileclose(tifd1) == -1) {
                    RouteVoice(channelnumber);
                    return SEND_FAX_ERROR_FILECLOSE;
                }
                if (dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC) == -1) {
                    RouteVoice(channelnumber);
                    return SEND_FAX_ERROR_ONHOOK;
                }
                RouteVoice(channelnumber);
                return SEND_FAX_ERROR_SENDFAX;
            }
            RouteVoice(channelnumber);
            break;

        default:
#ifndef CTI_VC_VERSION
            ITools::WriteLog(CTI,"拨号失败","通道号"+IntToStr(channelnumber)+
                             " 传真号码"+AnsiString(dialstring)+
                             " 文件名:"+AnsiString(filename)+"失败代码:"+IntToStr(term));
#endif
            dx_fileclose(tifd1);
        	dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
            return term;
        } // End of switch (term);

        if (dx_fileclose(tifd1) == -1) {
            return SEND_FAX_ERROR_FILECLOSE;
        }
        dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC);
	return 0;
}
//---------------------------------------------------------------------------
/****************************************************************************
*       函数名称:      RecFax
*
*       描述:          接受传真文件,返回接受结果
*
*       参数:           In:
*                           channelnumber:  接受占用的传真通道号    0.1.2..
*                           filename:       要接受的传真文件(tiff/txt)
*                       return:
*                           发送结果:       0:成功
*
*       历史:           Created by xr on 03/09/25
*****************************************************************************/
int IVFXBoard::RecFax(int channelnumber, char* filename)
{
	static DX_CAP capp;

	dx_clrcap(&capp);
	capp.ca_nbrdna = 4;

	if (fx_initstat(m_hFax[channelnumber],DF_RX) == -1) {
        ILogWriter::WriteLog(CTI,"InitFax失败","");
		return -1;
	}
    ILogWriter::WriteLog(CTI,"InitFax成功","");
    
    if (RouteFax(channelnumber) == FALSE) {
        ITools::WriteLog(CTI,"路由传真通道失败","通道号"+IntToStr(channelnumber)+"文件名:"+AnsiString(filename));
    }
    
    ILogWriter::WriteLog(CTI,"RouteFax成功","");
	if (fx_rcvfax(m_hFax[channelnumber],filename,DF_NOPOLL|DF_TIFF|DF_RXRESLO|EV_SYNC) == -1) {
        ILogWriter::WriteLog(CTI,"RecFax失败","");
        RouteVoice(channelnumber);
		return -1;
	}

    ILogWriter::WriteLog(CTI,"RecFax成功","");    
    RouteVoice(channelnumber);
	return 0;
}
//---------------------------------------------------------------------------
void IVFXBoard::PlayWavFile(int channelnumber,char * filename)
{
    // universal DV_TPT used for playing files
    DV_TPT tptplay[] = {{IO_CONT, DX_MAXDTMF, 1, TF_MAXDTMF},
	    				{IO_EOT, DX_LCOFF, 1, TF_LCOFF}};

    int ret = dx_playwav(m_hVox[channelnumber],filename,&tptplay[0],EV_SYNC);
    ret++;
}
//---------------------------------------------------------------------------
void IVFXBoard::PlayVoxFile(int channelnumber,char * filename)
{
    // universal DV_TPT used for playing files
    DV_TPT tptplay[] = {{IO_CONT, DX_MAXDTMF, 1, TF_MAXDTMF},
	    				{IO_EOT, DX_LCOFF, 1, TF_LCOFF}};

    int ret = dx_playvox(m_hVox[channelnumber],filename,&tptplay[0],NULL,EV_SYNC);
    ret++;
}
//---------------------------------------------------------------------------
void IVFXBoard::SetFaxTitle(char *title, int len)
{
    if (!bSetTitle) {
        bSetTitle = true;
        memset(faxtitle,0,FAXTITLE_MAX_LEN);
        memcpy(faxtitle,title,len);
    }
}
//---------------------------------------------------------------------------
// 没用到
void IVFXBoard::DongJIn()
{
    char sName[100];
    memset(sName,0,100);
    int faxcunt;

    char g_sTmp[100];
    memset(g_sTmp,0,100);

    int iDevH = 0;
    int iSubDevNum = 0;
    char ** CHNamesP;
    int nRet = sr_getboardcnt("FAX", &faxcunt);//faxcunt为取得的逻辑板卡数(4路为一逻辑板卡)

    if(nRet != -1)
    {

        for(int n=1; n <= faxcunt; n++)
       {
               sprintf(sName, "dxxxB%d", n);
               if ((iDevH = fx_open(sName, 0)) == -1)
               {
                      sprintf(g_sTmp,"传真:%s 打开错误!",sName);
               }



               // get channel device names
               iSubDevNum = ATDV_SUBDEVS(iDevH);//iSubDevNum 为逻辑板卡通道数=4
              CHNamesP = ATDX_CHNAMES(iDevH);



              for (int cnt=0; cnt < iSubDevNum; cnt++)
              {
                     memset(g_sTmp,0,100);
                     strcpy(g_sTmp, *(CHNamesP + cnt));//取得通道名称
                     /*
                     g_iTotalFax++; //传真通道数
                     */
              }
               fx_close(iDevH);
       }
    }
}
//---------------------------------------------------------------------------
BOOL IVFXBoard::RouteVoice(int channelnumber)
{
#ifdef DONGJIN_VER
	if(nr_scunroute(m_hVox[channelnumber],
                    SC_LSI,
                    m_hFax[channelnumber],
                    SC_FAX,
                    SC_FULLDUP ) == -1)
	{
        int i = 10;
        i++;
		//return FALSE;
	}
	if(nr_scroute(m_hVox[channelnumber],
                  SC_LSI,
                  m_hVox[channelnumber],
                  SC_VOX,
                  SC_FULLDUP ) == -1)
	{
        int i = 10;
        i++;
		return FALSE;
	}
    return TRUE;
#else
    return TRUE;
#endif
}
//---------------------------------------------------------------------------
BOOL IVFXBoard::RouteFax(int channelnumber)
{
#ifdef DONGJIN_VER
	if(nr_scunroute(m_hVox[channelnumber],
                    SC_LSI,
                    m_hVox[channelnumber],
                    SC_VOX,
                    SC_FULLDUP ) == -1)
	{
        //return FALSE;
        int i = 10;
        i++;
	}
	if(nr_scroute(m_hVox[channelnumber],
                  SC_LSI,
                  m_hFax[channelnumber],
                  SC_FAX,
                  SC_FULLDUP ) == -1)
	{
        int i = 10;
        i++;
        return FALSE;
	}
    return TRUE;
#else
    return TRUE;
#endif
}
//---------------------------------------------------------------------------
void IVFXBoard::GetPhoneInfo(AnsiString phone)
{
    AnsiString fullname = AnsiString(phone);

    prefix      = "";
    suffix      = "";
    extension   = "";
    

    if (fullname.Pos("-") !=0 ){
        int pos = fullname.Pos("-");
        prefix  = fullname.SubString(1,pos-1);
        suffix  = fullname.SubString(pos+1,fullname.Length()-pos);
        if (suffix.Pos("*") != 0) {
            int expos = suffix.Pos("*");
            extension = suffix.SubString(expos+1,suffix.Length()-expos);
            suffix = suffix.SubString(1,expos-1);

        }
    }
    else {
        prefix = fullname;
        suffix = "";
        if (prefix.Pos("*") != 0) {
            int pos = prefix.Pos("*");
            extension = prefix.SubString(pos+1,prefix.Length()-pos);
            prefix = prefix.SubString(1,pos-1);

        } // End of if
    }
}
//---------------------------------------------------------------------------
int IVFXBoard::FodFax(int channelnumber, char * dialnumber)
{
	int tifd1   = 0;
    
    // 先挂机再摘机
	if (dx_sethook(m_hVox[channelnumber],DX_ONHOOK,EV_SYNC) == -1) {
        dx_fileclose(tifd1);
        return SEND_FAX_ERROR_ONHOOK;
    }
	if (dx_sethook(m_hVox[channelnumber],DX_OFFHOOK,EV_SYNC) == -1) {
        dx_fileclose(tifd1);
        return SEND_FAX_ERROR_OFFHOOK;    
    }


}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -