FaxConInit
2015-08-21 19:01
302 查看
int FaxControlProcess::FaxConSend() { terminal_state_t t = NULL; struct timeval now, state, start, last; struct udptl_io io; uint8_t buf[2048]; int len, last_state = 0; fd_set rdList; struct timeval selTv; int ret = 0; flog("FaxControlProcess::FaxConSend enter"); if((t = FaxConInit()) == NULL) { printf("FaxConInit is fail!\n"); SetFaxLastErr(FAX_ERR_FAXINIT); ReleaseSock(); return -1; } io.send = terminal_send; udptl_register(t->t38_fe.t38->hudptl, &io, (void*)fd); gettimeofday(&now, NULL); state = now; start = now; while(1){ if(stop) { printf("is initiative stop!\n"); SetFaxLastErr(FAX_ERR_INITI_DISCON); flog("is initiative stop!"); break; } FD_ZERO(&rdList); FD_SET(fd, &rdList); selTv.tv_sec = 0; selTv.tv_usec = 10000; ret = select(fd+1, &rdList, NULL, NULL, &selTv); if(ret < 0) { printf("select is fail!\n"); SetFaxLastErr(FAX_ERR_SELECT_TIMEOUT); flog("select is fail!"); break; } flog("step1"); if(ret > 0 && FD_ISSET(fd, &rdList)) { len = recv(fd, (char *)buf, sizeof(buf), 0); if(len > 0){ printf("is recv file:%d\n",len); flog("is recv file:%d",len); fdata(buf,len); udptl_recv_proc(t->t38_fe.t38->hudptl,buf, len); flog("step1.1"); } }//else //printf("select is timeout!\n"); flog("step2"); last = now; gettimeofday(&now, NULL); if(tvdiff_sec(now, start) > WATCHDOG_TOTAL_TIMEOUT || tvdiff_sec(now, state) > WATCHDOG_STATE_TIMEOUT){ printf("time out \n"); SetFaxLastErr(FAX_ERR_SEND_TIMEOUT); flog("time out"); break; } flog("step3"); terminal_send_timeout(t, tvdiff_us(now, last) * 8 / 1000); if(last_state != t30_get_status(t->t30)){ flog("last_state last %x",last_state); last_state = t30_get_status(t->t30); flog("last_state now %x",last_state); state = now; } if(last_state == 12)//T30_PHASE_CALL_FINISHED { SetFaxLastErr(GetFaxt30LastErr(t)); flog("last_state == 12"); break; } flog("step4"); } printf("Send faxTransSuc:%d,lastErr:%d\n", faxTransSuc, GetFaxLastErr()); flog("Send faxTransSuc:%d,lastErr:%d", faxTransSuc, GetFaxLastErr()); if(GetFaxLastErr() == T30_ERR_OK) faxTransSuc = true; udptl_unregister(t->t38_fe.t38->hudptl); terminal_free(t); ReleaseSock(); flog("FaxControlProcess::FaxConSend out"); return 0; }
terminal_state_t FaxControlProcess::FaxConInit() { terminal_state_t t; struct terminal_arg arg; memset(&arg, 0, sizeof(arg)); if(faxConArg.t38FillBitRemoval) arg.fill_bit_removal = 1; arg.jbig = 1; arg.mmr = 1; if(faxConArg.isCaller) arg.caller = 1; arg.max_ifp = faxConArg.t38FaxMaxDatagram; if(strcmp(faxConArg.T38FaxUdpEC,"t38UDPFEC") == 0) { arg.ecm = 1;//UDPTL_ERROR_CORRECTION_FEC; }else if(strcmp(faxConArg.T38FaxUdpEC,"t38UDPRedundancy") == 0) { arg.ecm = 2;//UDPTL_ERROR_CORRECTION_REDUNDANCY; }else { printf("is not find udpEC!\n"); return NULL; } if(arg.ecm == 1) { arg.rd_cnt = faxConArg.numIFPs; }else { arg.rd_cnt = faxConArg.data_redundancy; } t = terminal_init(&arg); if(NULL == t){ printf("Failed to init terminal_init\n"); return NULL; } t30_set_ecm_capability(t->t30, 1); t30_set_supported_compressions(t->t30, T30_SUPPORT_T4_1D_COMPRESSION | T30_SUPPORT_T4_2D_COMPRESSION | T30_SUPPORT_T6_COMPRESSION); if(isSend) { t30_set_tx_file(t->t30, (const unsigned char *)(tiffFile.c_str()), -1, -1); }else { t30_set_rx_file(t->t30, (const unsigned char *)(tiffFile.c_str()), -1); } return t; }t30_set_tx_fileterminal_initio.send = terminal_send;udptl_register(t->t38_fe.t38->hudptl, &io, (void*)fd);int MsgRecvInterface::RsqCallFax(char* data, int len, int seqID,int comID){ret = t_packet.faxprol->SetNetIpPort(t_packet.port,t_req->faxMedia.ip,t_req->faxMedia.port);ret = t_packet.faxprol->StartFax(arg,fileName,NULL);}int FaxControlProcess::StartFax(struct FaxConArg &setFaxPar,const char *sendFile,const char *recvFile){CreateTiffName(cFile, temp)memcpy(&faxConArg, &setFaxPar, sizeof(faxConArg));noTiffFile = cFile;tiffFile = temp;Start() ;}void * FaxControlProcess::Thread(){while (stop == false){if(isSend){FileConvert(noTiffFile, tiffFile);FaxConSend();}else{FaxConRecv();FileConvert(tiffFile,noTiffFile);}break;}return NULL;}int FaxControlProcess::FaxConSend(){struct udptl_io io;fd_set rdList;FaxConInit());io.send = terminal_send;udptl_register(t->t38_fe.t38->hudptl, &io, (void*)fd);while(1){ret = select(fd+1, &rdList, NULL, NULL, &selTv);if(ret > 0 && FD_ISSET(fd, &rdList)){len = recv(fd, (char *)buf, sizeof(buf), 0);udptl_recv_proc(t->t38_fe.t38->hudptl,buf, len);}}terminal_send_timeout(t, tvdiff_us(now, last) * 8 / 1000);}udptl_unregister(t->t38_fe.t38->hudptl);}
相关文章推荐
- hdu 5412 CRB and Queries(树套树模板,区间第K大)
- 大型网站架构技术一览
- Codeforces Gym 100338C C - Important Roads tarjan
- C# .net 抓取网页内容
- instanceof关键字详解
- hihoCoder 1079 离散化(线段树离散化)
- 多线程的简单应用
- Android中实现垂直滑动中水平滑动毫无障碍
- syslinux 制作多系统启动U盘
- shell 解释变量
- Thrift编译错误('::malloc' has not been declared)
- day8: 属性、点语法、KVC
- Memcache缓存 vs 直接File文件缓存
- 用EF实现多条件查询
- super关键字详解
- android 组件ProgressBar实例
- SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)
- Codeforces Gym 100338B Geometry Problem 计算几何
- C++——string类和标准模板库
- ckeditor若文件上传的不是图片类型则显示不成功