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

📄 psgip.cpp

📁 手机开发环境BREW实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				}
				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 + -