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

📄 sessionobject.cpp

📁 linux 下的sgip 协议中的session object 实现源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	_StrUpper(TArg *argv)
	参数1:源字符串
	参数2:返回字符串
	功能: 将字符串转换成大写
	返回结果:返回放在参数2中
************************************************************************************/
RTCS_CTuint TSessionObject::StrUpper(TArg *argv)
{
	argv[0].sptr = strupr(argv[0].sptr);
	return RTCS_Error_OK;
}

/************************************************************************************
	_StrLower(TArg *argv)
	参数1:源字符串
	参数2:返回字符串
	功能: 将字符串转换成小写
	返回结果:返回放在参数2中
************************************************************************************/
RTCS_CTuint TSessionObject::StrLower(TArg *argv)
{
	argv[0].sptr = strlwr(argv[0].sptr);
	return RTCS_Error_OK;
}

/************************************************************************************
	_StrDigital(TArg *argv)
	参数1:源字符串
	功能: 判断字符串是否全为数字
	evtReturn [0]	表示全为数字
	evtReturn [-1]	表示不全为数字
************************************************************************************/
RTCS_CTuint TSessionObject::StrDigital(TArg *argv)
{
	RTCS_CTpdu pdu;
	pdu.sender = m_pOwner->GetGOR();
	pdu.receiver = m_pOwner->GetGOR();
	pdu.messageID = EvtRTCS_DRIVER_Return;
	pdu.receiverObj = m_SessionID;
	pdu.status = 0;
	char temp[256];
	strcpy(temp,argv[0].sptr);
	int i = 0;
	while(temp[i])
	{
		if (temp[i] >= '0' && temp[i] <='9')
		{
			i++;
			if (i < 256)
				continue;
			else
				break;
		}
		else
		{
			pdu.status = -1;
			break;
		}
	}
	m_pOwner->PostMessage(pdu);
	return RTCS_Error_OK;
}

RTCS_CTuint TSessionObject::SMACmdBind(TArg *argv)
{
	m_pOwner->logfile->Trace(1, "TSessionObject::SMACmdBind\n");

	RTCS_CTpdu	sendpdu;
	
	sendpdu.messageID = CmdRTCS_ISMA_Bind;
	sendpdu.sender = m_pOwner->GetGOR();
	sendpdu.receiver = m_pOwner->m_SMAIGOR;
	sendpdu.senderObj = m_SessionID;
	sendpdu.PutUInt(RTCS_ISMA_TaskRefID,m_SessionID);

	m_pOwner->PostMessage(sendpdu);
	
	return RTCS_Error_OK;
}

RTCS_CTuint TSessionObject::SMAGetDeliverData(TArg *argv)
{
	SMAInitData();

	RTCS_CTbyteArray temp;
	RTCS_CTuint len = 0;

	if (m_pdu.GetByteArray(RTCS_ISMA_UserNumber,&temp,&len) == RTCS_Error_OK)
	{
		len = CMPP_SIZE_Src_terminal_id > len ? len : CMPP_SIZE_Src_terminal_id;
		memcpy(SMA_Srcterminalid,temp,len);
		SMA_Srcterminalid[len] = NULL;
	}

	if (m_pdu.GetByteArray(RTCS_ISMA_MessageContent,&temp,&len) == RTCS_Error_OK)
	{
		len = CMPP_SIZE_Msg_Content > len ? len : CMPP_SIZE_Msg_Content;
//		if(len < 18)
//		{
//			SMA_MsgLength = 0;
//			SMA_MsgContent[0] = 0;	
//			return RTCS_Error_OK;
//		}
//		else
//		{
			SMA_MsgLength = len;		
			memcpy(SMA_MsgContent,temp,len);
			SMA_MsgContent[len] = NULL;
//		}
	}
	
	// 针对联通短消息缴费所作的修改
	RTCS_CTbyte messagecoding = 0;
	if (m_pdu.GetByte(RTCS_ISMA_MessageCoding, &messagecoding) == RTCS_Error_OK)
	{
		// 短消息的编码格式暂时只支持:
		// 0:纯ASCII字符串
		// 8:UCS2编码
		if (messagecoding == 8)
		{
			//if ((SMA_MsgLength % 2) || SMA_MsgLength < 40)
			if ((SMA_MsgLength % 2))
			{ // 出错:UCS2编码的字符串的长度为2的倍数
				SMA_MsgLength = 0;
				SMA_MsgContent[0] = 0;
			}
			else
			{
				SMA_MsgLength /= 2;
				for (int i = 0; i < SMA_MsgLength; ++ i)
				{
					if(SMA_MsgContent[2*i] != 0)
					{
						SMA_MsgLength = 0;
						SMA_MsgContent[0] = 0;
						return RTCS_Error_OK;
					}
					SMA_MsgContent[i] = SMA_MsgContent[2*i+1];
				}
				SMA_MsgContent[SMA_MsgLength] = 0;
			}
		}
		else if (messagecoding != 15 && messagecoding != 0)
		{
			SMA_MsgLength = 0;
			SMA_MsgContent[0] = 0;
		}
	}

	return RTCS_Error_OK;
}

RTCS_CTuint TSessionObject::SMACmdSubmit(TArg *argv)
{
	m_pOwner->logfile->Trace(0, "TSessionObject::SMACmdSubmit\n");

	RTCS_CTpdu	sendpdu;
	RTCS_CTbyteArray temp;
	RTCS_CTuint	len;
	
	sendpdu.messageID = CmdRTCS_ISMA_Submit;
	sendpdu.sender = m_pOwner->GetGOR();
	sendpdu.senderObj = m_SessionID;
	sendpdu.receiver = m_pOwner->m_SMAIGOR;
	sendpdu.qualifier = m_Socket;

	sendpdu.PutUInt(RTCS_ISMA_TaskRefID,m_SessionID);
	temp = (RTCS_CTbyteArray)" ";
	temp = &SMA_Srcterminalid[0];
	sendpdu.PutByteArray(RTCS_ISMA_Src_terminal_id,temp,CMPP_SIZE_Src_terminal_id);
	sendpdu.PutByte(RTCS_ISMA_DestUsr_tl,SMA_DestUsrtl);
	temp = &SMA_Destterminalid[0];
	len = 21 * SMA_DestUsrtl;
	sendpdu.PutByteArray(RTCS_ISMA_Dest_terminal_id,temp,len);
	temp = &SMA_MsgContent[0];
	len = SMA_MsgLength;
	sendpdu.PutByteArray(RTCS_ISMA_Msg_Content,temp,len);

	m_pOwner->PostMessage(sendpdu);

	return RTCS_Error_OK;
}

RTCS_CTuint TSessionObject::SMAGetMsgContentLength(TArg *argv)
{
	*(argv[0].iptr) = strlen((LPCTSTR)SMA_MsgContent);
	return RTCS_Error_OK;
}

RTCS_CTuint TSessionObject::SMACmdUnbind(TArg *argv)
{
	m_pOwner->logfile->Trace(1, "TSessionObject::SMACmdUnbind\n");

	RTCS_CTpdu	sendpdu;
	
	sendpdu.messageID = CmdRTCS_ISMA_Unbind;
	sendpdu.sender = m_pOwner->GetGOR();
	sendpdu.senderObj = m_SessionID;
	sendpdu.receiver = m_pOwner->m_SMAIGOR;
	sendpdu.qualifier = m_Socket;
	sendpdu.PutUInt(RTCS_ISMA_TaskRefID,m_SessionID);

	m_pOwner->PostMessage(sendpdu);

	return RTCS_Error_OK;
}

//--------------------TSessionObjectTable的实现----------------------------

TSessionObjectTable::TSessionObjectTable()
{
    m_CurrPos = NULL;
    m_ToTailFlag = 0;
	m_CurrSessionID = INVALID_SESSION_ID;
}
	
TSessionObjectTable::~TSessionObjectTable()
{
	ClearAll();
}

void TSessionObjectTable::ClearAll()
{
	POSITION pos = NULL;
	RTCS_CTuint ret_sessionid;
	TSessionObject * ret_obj;

	//Lock();

	pos = GetStartPosition();
	while(pos)
	{
		ret_obj = NULL;
		GetNextAssoc(pos, ret_sessionid, ret_obj);
		if(ret_obj)
		{
			delete ret_obj;
			ret_obj = NULL;
		}
	}
	RemoveAll();

	//Unlock();
}

int TSessionObjectTable::AddSessionObject(TSessionObject* Obj)
{
    if(!Obj)
		return -1; //输入参数不正确

    //Lock();

	TSessionObject* ret_obj = NULL;
	if(Lookup(Obj->m_SessionID , ret_obj))
	{
		//Unlock();
		return -2; //已经有相同ID的对象存在
 	}

	SetAt(Obj->m_SessionID, Obj);

	//Unlock();
	return 0; //成功
}

TSessionObject* TSessionObjectTable::GetSessionObject(RTCS_CTuint SessionID)
{
	TSessionObject * get_obj = NULL;

	//Lock();

	if(Lookup(SessionID, get_obj))
	{
		//Unlock();
		return get_obj;
	}

	//Unlock();
	return NULL;

}

void  TSessionObjectTable::DeleteSessionObject(RTCS_CTuint SessionID)
{
	//Lock();

	TSessionObject * ret_obj = NULL;
	if(Lookup(SessionID, ret_obj))
	{
		if(ret_obj)
		{
			delete ret_obj;
			ret_obj = NULL;
		}
		RemoveKey(SessionID);
	}

	//Unlock();
	return ;

}

void TSessionObjectTable::Lock()
{
	m_Lock.Lock();
}

void TSessionObjectTable::Unlock()
{
	m_Lock.Unlock();
}

void TSessionObjectTable::Reset()
{
	m_CurrPos = NULL;
	m_ToTailFlag = 0;
}
   
TSessionObject* TSessionObjectTable::Next()
{
	RTCS_CTuint ret_sessionid;
	TSessionObject * ret_obj = NULL;
	if(!m_CurrPos)
	{
		if(!m_ToTailFlag)
			m_CurrPos = GetStartPosition();
		else
			return NULL;
	}

	if(m_CurrPos)
	{
		GetNextAssoc(m_CurrPos, ret_sessionid, ret_obj);
		if(!m_CurrPos)
			m_ToTailFlag = 1;
	}
	else
		m_ToTailFlag = 1;
	return ret_obj;
}

RTCS_CTuint TSessionObjectTable::GenerateSessionID()
{
    m_CurrSessionID++;
	if(m_CurrSessionID == 0)
		m_CurrSessionID = 1;

	return m_CurrSessionID;
}

void TSessionObjectTable::Snapshot(FILE* fp)
{
    if(!fp)
		return;

    TSessionObject* ret_obj;
	RTCS_CTuint ret_sessionid;
	POSITION pos = NULL;
	
	//Lock();

    RTCS_CTuint TotalCount = GetCount();
	fprintf(fp, "Total Session Count = %d.\n", TotalCount);

	pos = GetStartPosition();
    while(pos)
	{
		ret_obj = NULL;
		GetNextAssoc(pos, ret_sessionid, ret_obj);
		if(ret_obj)
		{
			ret_obj->Snapshot(fp);
		}
	}

	//Unlock();
}

⌨️ 快捷键说明

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