// 插件可以从plugins.cfg文件中,被传进一个整型参数。 // 当按下不同的热键或者菜单时,您需要一个插件做不同 // 的事情时,这非常有用。 int ReadString(uval_t nAddres, char *lpOutBuf) { int i = 0; int iRet = 0; switch (g_Index) { case 0: { char chTmp = 0; char *lpTmpBuf = (char *)malloc(0x1000 * sizeof(char)); memset(lpTmpBuf, 0, 0x1000 * sizeof(char) ); while( (chTmp = get_byte(nAddres + i)) && (i < 0x1000)) { lpTmpBuf[i++] = chTmp; } iRet = Utf8ToGB2312(lpTmpBuf, strlen(lpTmpBuf), lpOutBuf); free(lpTmpBuf); } break; case 1: { char chTmp = 0; while( (chTmp = get_byte(nAddres + i)) && (i < 0x1000)) { lpOutBuf[i++] = chTmp; } iRet = i; } break; case 2: { ushort usTmp = 0; ushort *lpTmpBuf = (ushort *)malloc(0x1000 * sizeof(ushort)); memset(lpTmpBuf, 0, 0x1000 * sizeof(ushort) ); while( (usTmp = get_word(nAddres + i * 2)) && (i < 0x1000)) { lpTmpBuf[i++] = usTmp; } iRet = UnicodeToGB2132((wchar_t *)lpTmpBuf, wcslen((wchar_t*)lpTmpBuf), lpOutBuf); free(lpTmpBuf); } break; default: break; } return iRet; }
//----------------------------------------------------------------------------------------------------------------------- // 处理一条识别服务器发来的消息 //----------------------------------------------------------------------------------------------------------------------- int CTCPConnection::OnHZVoiceSvrPDUArrived(char * s,int sLen) { CCommonParameter p; int nPid,CountOfFSM,i; int a[2000]; ERecordMode mode; p.BindString(s,sLen,1); char cc1=p.GetBYTE(); char cc2=p.GetBYTE(); int tversion=p.GetBYTE(); int tappType=p.GetBYTE(); int payloadLen=p.GetDWORD(); char * payloadBody=p.GetBinDataBlock(payloadLen); // Log("收到来自识别服务器的消息 LEN=%d SIG1=%d SIG2=%d type=%d\r\n",sLen,cc1,cc2,tappType); if (cc1=='G' && cc2=='L') { switch(tappType) { case EGPRAppType_rev: /* 保留 */ break; case EGPRAppType_heartbeat: /* 心跳 */ break; case EGPRAppType_ctrl: /* 控制报文 */ break; case EGPRAppType_transfer: /* 转接报文 */ break; case EGPRAppType_audio: /* 音频数据 */ break; case EGPRAppType_Text: /* 文本数据, 格式:PID(4B) 文本(nB)*/ p.BindString(payloadBody,payloadLen,1); nPid=p.GetDWORD(); // 取出 PID p.GetDWORD(); // sn CountOfFSM=glbGetAllFSMObjs(a,2000); // 取出该模块下所有的 FSM for (i=0;i<CountOfFSM;i++) // 在这些 FSM 中查找 { CHZIVRFSMItem * pFSM; pFSM=(CHZIVRFSMItem *)a[i]; Log("FSM pid=%d\r\n",pFSM->m_Pid); if (pFSM->m_Pid==nPid) // 找到 { int VoiceLen; char * VoiceData; char tempbuffer[2000]; VoiceData=p.GetRemainBinBlock(&VoiceLen); // 把 TXT 放入缓冲区 char temp[2000]; memcpy(temp,VoiceData, VoiceLen); temp[VoiceLen]='\0'; Utf8ToGB2312(temp, tempbuffer); tempbuffer[VoiceLen] = '\0'; pFSM->AppendText(tempbuffer,VoiceLen); Log("FSM[%d][%d]收到来自识别服务器的TXT发往[%d][%d]:%s \r\n",nPid,_getcurrentms(),VoiceLen,payloadLen,tempbuffer); break; } } break; case EGPRAppType_AudioTextEx: /* 文本数据, 格式:PID(4B) 文本(nB)*/ p.BindString(payloadBody,payloadLen,1); nPid=p.GetDWORD(); // 取出 PID p.GetDWORD(); // sn mode = (ERecordMode)p.GetDWORD(); CountOfFSM=glbGetAllFSMObjs(a,2000); // 取出该模块下所有的 FSM for (i=0;i<CountOfFSM;i++) // 在这些 FSM 中查找 { CHZIVRFSMItem * pFSM; pFSM=(CHZIVRFSMItem *)a[i]; Log("FSM pid=%d\r\n",pFSM->m_Pid); if (pFSM->m_Pid==nPid) // 找到 { int VoiceLen; char * VoiceData; char tempbuffer[2000]; VoiceData=p.GetRemainBinBlock(&VoiceLen); // 把 TXT 放入缓冲区 char temp[2000]; memcpy(temp,VoiceData, VoiceLen); temp[VoiceLen]='\0'; Utf8ToGB2312(temp, tempbuffer); tempbuffer[VoiceLen] = '\0'; pFSM->AppendText(tempbuffer,VoiceLen); pFSM->m_RecordMode = mode; pFSM->m_DtmfOff = 0; Log("FSM[%d][%d]收到来自识别服务器的扩展TXT发往[%d][%d][mode=%d]:%s \r\n", nPid,_getcurrentms(),VoiceLen,payloadLen,mode,tempbuffer); break; } } break; } } return 0; }