FaxConInit
来源:互联网 发布:开淘宝网店怎么发货 编辑:程序博客网 时间:2024/05/16 08:39
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;}elseif(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_file
terminal_init
io.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);
}