📄 servicedataqueue.cppbk
字号:
// 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 + -