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

📄 servicedataqueue.cppbk

📁 基于dialogic语音卡的IVR系统源代码
💻 CPPBK
📖 第 1 页 / 共 3 页
字号:
// ServiceDataQueue.cpp: implementation of the CServiceDataQueue class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "malloc.h"
#include "ServiceDataQueue.h"
#include "ResultSet.h"

#include "Setup.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CServiceDataQueue::CServiceDataQueue()
{

}

CServiceDataQueue::~CServiceDataQueue()
{
	for(int i = 0; i < m_iCount; i ++)
	{
		struct ParamList *p1 = (struct ParamList *)(ppmember[i]); 
		for(int j = 0; j < p1->nCount; j ++)
		{
			free((p1->pParam)[j].pParam);
		}
		free(p1->pParam);
		free(p1);
	}

	//如果上一次PARAMLIST不空,就释放
	if(m_ppreviousParamList != NULL)
	{
		FreeParamList(m_ppreviousParamList);
	}

	int iTemp = m_ptrListRequestInfo.GetCount();
	for(int k = 0; k < iTemp; k ++)
	{
		void *pTemp = m_ptrListRequestInfo.GetAt(m_ptrListRequestInfo.FindIndex(k));
		free(pTemp);
	}

	int iTemp2 = m_ptrListRequestInfo2.GetCount();
	for(int l = 0; l < iTemp2; l ++)
	{
		void *pTemp2 = m_ptrListRequestInfo2.GetAt(m_ptrListRequestInfo2.FindIndex(l));
		free(pTemp2);
	}
}

int CServiceDataQueue::Create(char *szQueueName)
{
	char szEventName[100] = "\0";
	sprintf(szEventName, "%s_%X", szQueueName, GetCurrentThreadId());
	if( m_Lock.Create(szEventName, 3000) == -1 )
	{
		return(-1);
	}

	strcat(szEventName, "add a request to");
	if((m_hEvent_Add = CreateEvent(NULL, FALSE, FALSE, szEventName)) == NULL)
	{
		return(-1);
	}

	m_ppreviousParamList = NULL;
	m_iNotifyType = 1;

	m_psaveInfo = NULL;
	m_iSaveInfoQueueCount = 0;

	return(0);
}

int CServiceDataQueue::Create(char *szQueueName, DWORD dwProcessThreadID, UINT WM_DATAQUEUE_ADD)
{
	char szEventName[100] = "\0";
	sprintf(szEventName, "%s_%X", szQueueName, GetCurrentThreadId());
	if( m_Lock.Create(szEventName, 3000) == -1 )
	{
		return(-1);
	}

	m_ppreviousParamList = NULL;
	m_dwProcessThreadID = dwProcessThreadID;
	m_WM_DATAQUEUE_ADD = WM_DATAQUEUE_ADD;
	m_iNotifyType = 2;

	return(0);
}

int CServiceDataQueue::AddParamList(struct ParamList *pParamList)
{
/************************************************************ 
添加一个服务请求
(in)pParamList:	一个服务请求的参数链表, 参数链表的所有成员由调用者申请内存
返回:	
		0	成功
		-1	服务队列处理出错
************************************************************/
int iReturnCode = 0;

	if( m_Lock.Lock() != 0 )
	{//上锁
		AfxMessageBox("Add() can't lock");
		return(-2);
	}

	if(AddTail(pParamList) != 0)
	{
		AfxMessageBox("In AddParamList(), AddTail() failed");
		iReturnCode = -1;
		goto EXIT;
	}

EXIT:
	if( m_Lock.Unlock() != 0 )
	{//解锁
		AfxMessageBox("Add() can't unlock");
		return(-1);
	}

	if(iReturnCode == 0)
	{
		if(m_iNotifyType == 1)
		{
			SetEvent(m_hEvent_Add);
		}
		else
		{
			PostThreadMessage(m_dwProcessThreadID, m_WM_DATAQUEUE_ADD, 0, 0);
		}
	}

	return iReturnCode;
}

int CServiceDataQueue::GetParamList(struct ParamList **ppParamList)
{
/************************************************************
获得一个服务请求
调用:	struct ServiceParamList *pParamList;
		GetRequest(&pParamList);
(out)pParamList:	一个服务请求的参数链表, 当调用者使用完这个结构后,应当释放它和它的成员占用的内存
返回:	1	服务请求队列为空
		0	成功
		-1	服务队列处理出错
************************************************************/
struct ParamList *pTemp;
int iReturnCode = 0;

	if( m_Lock.Lock() != 0 )
	{//上锁
		AfxMessageBox("getrequest() can't lock");
		return(-2);
	}

	//释放上一次的paramlist
	if(m_ppreviousParamList != NULL)
	{
		if(FreeParamList(m_ppreviousParamList) == -1)
		{
			AfxMessageBox("in getrequest(), freeserverparamlist() failed");
			return(-1);
		}
		m_ppreviousParamList = NULL;
	}

	if((pTemp = (struct ParamList *)RemoveHead()) == NULL)
	{
		iReturnCode = 1;
		*ppParamList = NULL;
		goto EXIT;
	}
	else
	{
		*ppParamList = pTemp;
		m_ppreviousParamList = pTemp;
		iReturnCode = 0;
		goto EXIT;
	}

EXIT:
	if( m_Lock.Unlock() != 0 )
	{//解锁
		AfxMessageBox("getrequest() can't unlock");
		return(-1);
	}

	return(iReturnCode);
}

BOOL CServiceDataQueue::IsEmpty()
{
BOOL bReturnCode = TRUE;

	if( m_Lock.Lock() != 0 )
	{//上锁
		AfxMessageBox("IsEmpty() can't lock");
		return(-2);
	}

	bReturnCode = CPointerList::IsEmpty();

EXIT:
	if( m_Lock.Unlock() != 0 )
	{//解锁
		AfxMessageBox("IsEmpty() can't unlock");
		return(-1);
	}
	
	return bReturnCode;
}

int CServiceDataQueue::FreeParamList(struct ParamList *pParamList)
{
int iCount;
int j = 0;

	int ii, jj, kk;
	iCount = pParamList->nCount;
	for(int i = 0; i < iCount; i ++)
	{
		switch((pParamList->pParam)[i].iType)
		{
			case  PARAMTYPE_VOICELIST:
				struct VoiceList *pvoiceList;
				if(pvoiceList != NULL)
				{
					pvoiceList = (struct VoiceList *)((pParamList->pParam)[i].pParam);
					for(j = 0; j < pvoiceList->nCount; j ++)
					{
						free((pvoiceList->pmember)[j].pVoice);
					}
					free(pvoiceList->pmember);
					free(pvoiceList);
				}
				break;

				case PARAMTYPE_RESULTSET:
					struct ResultSet *presultSet;
					presultSet = (struct ResultSet *)((pParamList->pParam)[i].pParam);
					CResultSet::Free(presultSet);
					break;

			default:
				if(
					((unsigned char *)((pParamList->pParam)[i].pParam))[0] == 0xdd)
					Sleep(1);
				kk = _msize((pParamList->pParam)[i].pParam);
				if(_msize((pParamList->pParam)[i].pParam) <= 0)
					Sleep(1);
				if(_CrtIsValidHeapPointer((pParamList->pParam)[i].pParam))
				{
				free((pParamList->pParam)[i].pParam);
				}
				break;
		}
	}
	if(iCount > 0)
	{
		if(pParamList->pParam != NULL)
		{
/*			ii = _msize(pParamList->pParam);
			if(_msize(pParamList->pParam) <= 0)
				Sleep(1);*/
			if(_CrtIsValidHeapPointer(pParamList->pParam))
			{
			free(pParamList->pParam);
			}
		}
	}

/*	jj = _msize(pParamList);
	if(_msize(pParamList) <= 0)
		Sleep(1);*/
	if(_CrtIsValidHeapPointer(pParamList))
	{
	free(pParamList);
	}

	return(0);
}

int CServiceDataQueue::CreateParamList(struct ParamList **ppParamList, int iServiceType, int iServiceNo, int iChannelNo, int iISN)
{
/*****************************************************
根据requestparamlist, 初始化一个新的回应参数列表, 以便调用者填写其中的数据成员
为它申请基本的内存空间,调用者在必要是也会进一步申请某个成员的内存空间
和队列本身的成员无关,不用锁
*****************************************************/
struct ParamList *pParamList;

	pParamList = (struct ParamList *)malloc(sizeof(struct ParamList));
	pParamList->nCount = 0;
	pParamList->iChannelNo = iChannelNo;
	pParamList->iServiceType = iServiceType;
	pParamList->iServiceNo = iServiceNo;
	pParamList->ISN = iISN;
	pParamList->bIsIVR = 1;
	pParamList->iTimeOut = 0;
	pParamList->pParam = NULL;

	*ppParamList = pParamList;

	return(0);
}

int CServiceDataQueue::AddParamListMember_Integer(struct ParamList *pParamList, int iValue, char *szParamName)
{
/*****************************************************
增加一个整形参数到参数列表的末尾
和队列本身的成员无关,不用锁
*****************************************************/
int iCount;
int iOffset;

	pParamList->nCount ++;
	iCount = pParamList->nCount;
	iOffset = iCount - 1;
	pParamList->pParam = (struct Param *)realloc(pParamList->pParam, iCount * sizeof(struct Param));
	(pParamList->pParam)[iOffset].iType = PARAMTYPE_INT;
	(pParamList->pParam)[iOffset].iSize = sizeof(int);
	if(szParamName == NULL)
	{
		memset((pParamList->pParam)[iOffset].aszParamName, 0, sizeof((pParamList->pParam)[iOffset].aszParamName));
	}
	else
	{
		if(strlen(szParamName) + 1 > sizeof((pParamList->pParam)[iOffset].aszParamName))
			return -1;
		strcpy((pParamList->pParam)[iOffset].aszParamName, szParamName);
	}
	char *p = (char *)malloc(sizeof(int));
	(pParamList->pParam)[iOffset].pParam = p;
	*(int *)((pParamList->pParam)[iOffset].pParam) = iValue;

	return(0);
}

int CServiceDataQueue::AddParamListMember_String(struct ParamList *pParamList, char *szValue, char *szParamName)
{
/*****************************************************
增加一个字符串型参数到参数列表的末尾
和队列本身的成员无关,不用锁
如果是空字符或长度为0,就申请一个字节,放0
*****************************************************/
int iCount;
int iOffset;

	pParamList->nCount ++;
	iCount = pParamList->nCount;
	iOffset = iCount - 1;
	pParamList->pParam = (struct Param *)realloc(pParamList->pParam, iCount * sizeof(struct Param));
	(pParamList->pParam)[iOffset].iType = PARAMTYPE_STRING;
	if(szParamName == NULL)
	{
		memset((pParamList->pParam)[iOffset].aszParamName, 0, sizeof((pParamList->pParam)[iOffset].aszParamName));
	}
	else
	{
		if(strlen(szParamName) + 1 > sizeof((pParamList->pParam)[iOffset].aszParamName))
			return -1;
		strcpy((pParamList->pParam)[iOffset].aszParamName, szParamName);
	}
	if(szValue != NULL)
	{
		(pParamList->pParam)[iOffset].iSize = strlen(szValue) + 1;
		(pParamList->pParam)[iOffset].pParam = malloc(strlen(szValue) + 1);
		strcpy((char *)((pParamList->pParam)[iOffset].pParam), szValue);
	}
	else
	{
		(pParamList->pParam)[iOffset].iSize = 1;
		(pParamList->pParam)[iOffset].pParam = malloc(1);
		((char *)(pParamList->pParam)[iOffset].pParam)[0] = 0;
	}

	return(0);
}

int CServiceDataQueue::AddParamListMember_String2(struct ParamList *pParamList, char *pValue, int iLen, char *szParamName)
{
/*****************************************************
增加一个字符串型参数到参数列表的末尾,但传入参数是一个指定了长度的指针,不一定以0结尾
和队列本身的成员无关,不用锁
如果是空字符或长度为0,就申请一个字节,放0
*****************************************************/
int iCount;
int iOffset;

	pParamList->nCount ++;
	iCount = pParamList->nCount;
	iOffset = iCount - 1;
	pParamList->pParam = (struct Param *)realloc(pParamList->pParam, iCount * sizeof(struct Param));
	(pParamList->pParam)[iOffset].iType = PARAMTYPE_STRING;
	if(szParamName == NULL)
	{
		memset((pParamList->pParam)[iOffset].aszParamName, 0, sizeof((pParamList->pParam)[iOffset].aszParamName));
	}
	else
	{
		if(strlen(szParamName) + 1 > sizeof((pParamList->pParam)[iOffset].aszParamName))
			return -1;
		strcpy((pParamList->pParam)[iOffset].aszParamName, szParamName);
	}
	if(pValue != NULL)
	{
		(pParamList->pParam)[iOffset].pParam = malloc(iLen + 1);
		memcpy((char *)((pParamList->pParam)[iOffset].pParam), pValue, iLen);
		((char *)(pParamList->pParam)[iOffset].pParam)[iLen] = 0;
		//传入的字符串指针可能是以多个0结尾或实际的LEN比传入的LEN小
		int iLenTemp;
		iLenTemp = strlen((char *)(pParamList->pParam)[iOffset].pParam) + 1;
		(pParamList->pParam)[iOffset].pParam = realloc((pParamList->pParam)[iOffset].pParam, iLenTemp);
		//然后再确定长度
		(pParamList->pParam)[iOffset].iSize = iLenTemp;
	}
	else
	{
		(pParamList->pParam)[iOffset].iSize = 1;
		(pParamList->pParam)[iOffset].pParam = malloc(1);
		((char *)(pParamList->pParam)[iOffset].pParam)[0] = 0;
	}

	return(0);
}

int CServiceDataQueue::AddParamListMember_Float(struct ParamList *pParamList, float fValue, char *szParamName)
{
/*****************************************************
增加一个浮点型参数到参数列表的末尾
和队列本身的成员无关,不用锁
*****************************************************/
int iCount;
int iOffset;

	pParamList->nCount ++;
	iCount = pParamList->nCount;
	iOffset = iCount - 1;
	pParamList->pParam = (struct Param *)realloc(pParamList->pParam, iCount * sizeof(struct Param));
	(pParamList->pParam)[iOffset].iType = PARAMTYPE_FLOAT;
	(pParamList->pParam)[iOffset].iSize = sizeof(float);
	if(szParamName == NULL)
	{
		memset((pParamList->pParam)[iOffset].aszParamName, 0, sizeof((pParamList->pParam)[iOffset].aszParamName));
	}
	else
	{
		if(strlen(szParamName) + 1 > sizeof((pParamList->pParam)[iOffset].aszParamName))
			return -1;
		strcpy((pParamList->pParam)[iOffset].aszParamName, szParamName);
	}
	(pParamList->pParam)[iOffset].pParam = malloc(sizeof(float));
	*(float *)((pParamList->pParam)[iOffset].pParam) = fValue;

	return(0);

⌨️ 快捷键说明

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