// 插件可以从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;
}
Exemple #2
0
//-----------------------------------------------------------------------------------------------------------------------
//	处理一条识别服务器发来的消息
//-----------------------------------------------------------------------------------------------------------------------
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;
}