📄 psgip.cpp
字号:
}
else
{
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.dwMessageLength = htonl(strlen((char *)m_BMessageContent));
strcpy((char *)m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bMessageContent,
(char *)m_BMessageContent);
}
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szCorpID, m_szCorpID);
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szServiceType, m_szServiceType);
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bFeeType = m_bFeeType;
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szFeeValue, m_szFeeValue);
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szGivenValue, m_szGivenValue);
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bAgentFlag = m_bAgentFlag;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bMoreLateToMTFlag = m_bMoreLateToMTFlag;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bPriority = m_bPriority;
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szExpireTime, m_szExpireTime);
strcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szScheduleTime, m_szScheduleTime);
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bReportFlag = m_bReportFlag;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bTPpid = m_bTPpid;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bTPudhi = m_bTPudhi;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bMessageCoding = m_bMessageCoding;
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bMessageType = m_bMessageType;
//再设置Reserved字段
memset(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bReserve, 0, 8);
memcpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bReserve, m_szReserve, strlen(m_szReserve));
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.sMessageHead.dwCommandID = htonl(SGIP_SUBMIT);
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.sMessageHead.sMsgID.dwSPID = htonl(m_dwSPID);
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.sMessageHead.sMsgID.dwSequenceNO = htonl(++m_dwSequenceNO);
m_sSMBuffer[m_lBufferIndex4MultiSM].bFlag = FLAG_BUFFER_PENDING;
}else
{
return false;
}
}
m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bUserCount++;
char szMobileIDWithPreFix[21 * 2 + 1]; //加上前缀(如果需要)后的手机号码
AddPreFix(pcPos, m_szMobileIDFix, szMobileIDWithPreFix);
if(strlen(szMobileIDWithPreFix) > 21)
{
return false;
}
strncpy(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.szUserNumber + (DWORD)(MAX_LEN_MOBILE_ID + 1) * (m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bUserCount - 1),
szMobileIDWithPreFix, MAX_LEN_MOBILE_ID);
if(m_sSMBuffer[m_lBufferIndex4MultiSM].sSgipMsg.uMessageBody.sMessageSubmit.bUserCount >= m_lSendMaxNumberPerPackage)
{
m_sSMBuffer[m_lBufferIndex4MultiSM].bFlag = FLAG_BUFFER_READY;
//放入缓冲区的内容位置入到m_cQueueReady
if(!m_cQueueReady.In(m_lBufferIndex4MultiSM))
{
ATLTRACE("AddMobileId中调用m_cQueueReady.In(m_lBufferIndex4MultiSM)返回False\n");
}
m_lBufferIndex4MultiSM = -1;
}
pcPos = strtok(NULL, szSeps);
}
return true;
}
STDMETHODIMP CPSgip::get_Para(eParaType eInParaType, long *pVal)
{
switch(eInParaType)
{
case SendMaxNumberPerPackage:
*pVal = m_lSendMaxNumberPerPackage;
break;
case Timeout4Connect:
*pVal = m_lTimeout4Connect;
break;
case Timeout4Recv:
*pVal = m_lTimeout4Recv;
break;
case PauseTime4Recv:
*pVal = m_lPauseTime4Recv;
break;
case Timeout4Accept:
*pVal = m_lTimeout4Accept;
break;
case PauseTime4Accept:
*pVal = m_lPauseTime4Accept;
break;
case PauseTime4Terminate:
*pVal = m_lPauseTime4Terminate;
break;
case SendIntervalTime:
*pVal = m_lSendIntervalTime;
break;
case Timeout4Response:
*pVal = m_lTimeout4Response;
break;
}
return S_OK;
}
STDMETHODIMP CPSgip::put_Para(eParaType eInParaType, long newVal)
{
switch(eInParaType)
{
case SendMaxNumberPerPackage:
if(newVal > 0 && newVal <= MAX_DEST_USR)m_lSendMaxNumberPerPackage = newVal;
break;
case Timeout4Connect:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lTimeout4Connect = newVal;
break;
case Timeout4Recv:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lTimeout4Recv = newVal;
break;
case PauseTime4Recv:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lPauseTime4Recv = newVal;
break;
case Timeout4Accept:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lTimeout4Accept = newVal;
break;
case PauseTime4Accept:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lPauseTime4Accept = newVal;
break;
case PauseTime4Terminate:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lPauseTime4Terminate = newVal;
break;
case SendIntervalTime:
if(newVal >= 0 && newVal <= MAX_TIMEOUT)m_lSendIntervalTime = newVal;
break;
case Timeout4Response:
if(abs(newVal) <= MAX_TIMEOUT)m_lTimeout4Response = newVal;
break;
}
return S_OK;
}
long CPSgip::SaveBuffer()
{
char szFileName[MAX_PATH];
if(m_szSaveFile[0] && GetWaitSendCount())
{
if(GetSystemDirectory(szFileName, MAX_PATH))
{
#ifdef _DEBUG
sprintf(szFileName, "D:\\%s", m_szSaveFile);
#else
sprintf(szFileName, "%s\\%s", szFileName, m_szSaveFile);
#endif
FILE *file4Buffer = fopen(szFileName, "wb");
if(file4Buffer)
{
fwrite(&m_lBufferIndex4MultiSM, sizeof(long), 1, file4Buffer);
fwrite(m_sSMBuffer, sizeof(_SM_BUF), MAX_BUFFER_SIZE, file4Buffer);
fclose(file4Buffer);
return 1;
}
else
return -2;
}
else
return -1;
}
return 0;
}
long CPSgip::LoadBuffer()
{
char szFileName[MAX_PATH];
if(m_szSaveFile[0] && GetSystemDirectory(szFileName, MAX_PATH))
{
#ifdef _DEBUG
sprintf(szFileName, "D:\\%s", m_szSaveFile);
#else
sprintf(szFileName, "%s\\%s", szFileName, m_szSaveFile);
#endif
FILE *file4Buffer = fopen(szFileName, "rb");
if(file4Buffer)
{
fread(&m_lBufferIndex4MultiSM, sizeof(long), 1, file4Buffer);
fread(m_sSMBuffer, sizeof(_SM_BUF), MAX_BUFFER_SIZE, file4Buffer);
fclose(file4Buffer);
DeleteFile(szFileName);
return 1;
}
else
return 0;
}
return -1;
}
STDMETHODIMP CPSgip::get_LocalIP(VARIANT *pPara, BSTR *pVal)
{
char szIP[MAX_PATH];
USES_CONVERSION;
if(pPara->vt != VT_ERROR)
{//有参数,返回所有的地址和数目
*(pPara->plVal) = GetHostIP(szIP);
*pVal = A2BSTR(szIP);
}
else
{//没有参数,直接返回设置的地址
*pVal = A2BSTR(m_szLocalIP);
}
return S_OK;
}
STDMETHODIMP CPSgip::put_LocalIP(VARIANT *pPara, BSTR newVal)
{
char szIP[MAX_PATH];
long lRet, lPara;
USES_CONVERSION;
if(pPara->vt != VT_ERROR)
{//有参数,设置地址的序号,从0开始,如果不存在,则使用newVal
CComVariant cComVariant4Para;
cComVariant4Para.Copy(pPara);
cComVariant4Para.ChangeType(VT_I4);// | VT_BYREF * (cComVariant4Para.vt == VT_BYREF)
lPara = cComVariant4Para.lVal;
lRet = GetHostIP(szIP);
if(lRet < 0)
{
if(lPara >= 0 && lPara < -lRet)
{
char szSeps[] = " ";
lRet = lPara;
char *pcPos = strtok(szIP, szSeps);
while(pcPos)
{
if(!lRet)
{
strcpy(m_szLocalIP, pcPos);
break;
}
else
{
lRet--;
pcPos = strtok(NULL, szSeps);
}
}
}
else
{//参数有错
SetReturnValue(pPara, -1);
strncpy(m_szLocalIP, W2A(newVal), 16);
}
}
else
{//得到地址时出错
SetReturnValue(pPara, -2);
strncpy(m_szLocalIP, W2A(newVal), 16);
}
cComVariant4Para.Clear();
}
else//没有参数,直接设置地址
strncpy(m_szLocalIP, W2A(newVal), 16);
return S_OK;
}
STDMETHODIMP CPSgip::get_Version(BYTE *pVal)
{
*pVal = m_bVersion;
return S_OK;
}
STDMETHODIMP CPSgip::put_Version(BYTE newVal)
{
m_bVersion = newVal;
return S_OK;
}
STDMETHODIMP CPSgip::get_PortListen(short *pVal)
{
*pVal = m_iPortListen;
return S_OK;
}
STDMETHODIMP CPSgip::put_PortListen(short newVal)
{
m_iPortListen = newVal;
return S_OK;
}
STDMETHODIMP CPSgip::get_Reserve(BSTR *pVal)
{
// TODO: Add your implementation code here
*pVal = A2BSTR(m_szReserve);
return S_OK;
}
STDMETHODIMP CPSgip::put_Reserve(BSTR newVal)
{
// TODO: Add your implementation code here
USES_CONVERSION;
char *pszVal = W2A(newVal);
if(strlen(pszVal) > 8)
{
Error("给Reserve属性所赋的字符串超过8个字节长!", GUID_NULL, E_FAIL);
return E_FAIL;
}
strcpy(this->m_szReserve, pszVal);
return S_OK;
}
STDMETHODIMP CPSgip::get_MobileIDFix(BSTR *pVal)
{
// TODO: Add your implementation code here
*pVal = A2BSTR(this->m_szMobileIDFix);
return S_OK;
}
STDMETHODIMP CPSgip::put_MobileIDFix(BSTR newVal)
{
// TODO: Add your implementation code here
USES_CONVERSION;
char *pszNewVal = W2A(newVal);
if(strlen(pszNewVal) >= sizeof(m_szMobileIDFix))
{//过长
Error("设置MobileIDFix属性的字符串过长!", GUID_NULL, E_FAIL);
return E_FAIL;
}
strcpy(this->m_szMobileIDFix, pszNewVal);
return S_OK;
}
const char* CPSgip::GetErrorDescription(long dwErrCode)
{
//使用static型字符串,这样,它们在每第调用时不会压栈、不会被重复申请内存
const static char szERROR_NOT[] = "成功";
const static char szERROR_WS_STARTUP_FAIL[] = "Dll模块启动失败";
const static char szERROR_WS_INVALID_SOCKET[] = "无效Socket";
const static char szERROR_WS_SET_FAIL[] = "Socket错误";
const static char szERROR_WS_SEND_TIMEOUT[] = "发送超时";
const static char szERROR_WS_SEND_FAIL[] = "发送失败";
const static char szERROR_WS_RECV_TIMEOUT[] = "接收超时";
const static char szERROR_WS_RECV_FAIL[] = "接收失败";
const static char szERROR_WS_BIND_FAIL[] = "连接失败";
const static char szERROR_WS_LISTEN_FAIL[] = "监听失败";
const static char szERROR_WS_UNABLE_RESOLVE[] = "无效主机地址";
const static char szERROR_ALREADY_INIT[] = "Dll模块已经初始化";
const static char szERROR_INIT_FAIL[] = "Dll模块初始化失败";
const static char szERROR_INVALID_IP_ADDRESS[] = "无效IP地址";
const static char szERROR_ALREADY_BIND[] = "已经连接上网关";
const static char szERROR_BIND_FAIL[] = "连接网关失败";
const static char szERROR_SUBMIT_FAIL[] = "Submit失败";
const static char szERROR_BUFFER_FULL[] = "缓冲区满";
const static char szERROR_IS_BINDING[] = "已经在连接网关";
switch(dwErrCode)
{
case ERROR_NOT:
return szERROR_NOT;
break;
case ERROR_WS_STARTUP_FAIL:
return szERROR_WS_STARTUP_FAIL;
break;
case ERROR_WS_INVALID_SOCKET:
return szERROR_WS_INVALID_SOCKET;
break;
case ERROR_WS_SET_FAIL:
return szERROR_WS_SET_FAIL;
break;
case ERROR_WS_SEND_TIMEOUT:
return szERROR_WS_SEND_TIMEOUT;
break;
case ERROR_WS_SEND_FAIL:
return szERROR_WS_SEND_FAIL;
break;
case ERROR_WS_RECV_TIMEOUT:
return szERROR_WS_RECV_TIMEOUT;
break;
case ERROR_WS_RECV_FAIL:
return szERROR_WS_RECV_FAIL;
break;
case ERROR_WS_BIND_FAIL:
return szERROR_WS_BIND_FAIL;
break;
case ERROR_WS_LISTEN_FAIL:
return szERROR_WS_LISTEN_FAIL;
break;
case ERROR_WS_UNABLE_RESOLVE:
return szERROR_WS_UNABLE_RESOLVE;
break;
case ERROR_ALREADY_INIT:
return szERROR_ALREADY_INIT;
break;
case ERROR_INIT_FAIL:
return szERROR_INIT_FAIL;
break;
case ERROR_INVALID_IP_ADDRESS:
return szERROR_INVALID_IP_ADDRESS;
break;
case ERROR_ALREADY_BIND:
return szERROR_ALREADY_BIND;
break;
case ERROR_BIND_FAIL:
return szERROR_BIND_FAIL;
break;
case ERROR_SUBMIT_FAIL:
return szERROR_SUBMIT_FAIL;
break;
case ERROR_BUFFER_FULL:
return szERROR_BUFFER_FULL;
break;
case ERROR_IS_BINDING:
return szERROR_IS_BINDING;
break;
default:
return NULL;
break;
}
}
STDMETHODIMP CPSgip::get_ErrorDescrption(long lErrorCode, BSTR *pVal)
{
USES_CONVERSION;
const char *pErrorDes = this->GetErrorDescription(lErrorCode);
if(pErrorDes)
{//成功
*pVal = A2BSTR(pErrorDes);
}else
{//得不到错误字符串
Error("ErrorDescrption属性的lErrorCode参数,不在本组件的错误码集合内", GUID_NULL, E_FAIL);
return E_FAIL;
}
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -