예제 #1
0
void CMultiXProcess::CancelMsg(CMultiXAppMsgID &ID,bool	bTimedout)
{
    CMultiXAppMsg	*Msg	=	ID.GetObject();
    if(Msg)
    {
        if(Msg->MultiXMsg()->m_SendSem.Initialized())
            Msg->MultiXMsg()->m_SendSem.Lock();
        ID.RemoveObject();
        Msg->m_bKeep	=	false;

        CMultiXSession	*Session	=	Owner()->FindSession(Msg->SessionID());
        if(bTimedout)
        {
            if(Session)
            {
                if(Msg->IsCtrlMsgToTpm())
                    OnSendMsgToTpmTimedout(*Msg);
                else
                    Session->OnSendMsgTimedoutNV(*Msg);
            }	else
            {
                if(Msg->IsCtrlMsgToTpm())
                    OnSendMsgToTpmTimedout(*Msg);
                else
                    OnSendMsgTimedout(*Msg);
            }
        }	else
        {
            if(Session)
            {
                if(Msg->IsCtrlMsgToTpm())
                    OnSendMsgToTpmFailed(*Msg);
                else
                    Session->OnSendMsgFailedNV(*Msg);
            }	else
            {
                if(Msg->IsCtrlMsgToTpm())
                    OnSendMsgToTpmFailed(*Msg);
                else
                    OnSendMsgFailed(*Msg);
            }
        }
        if(!Msg->m_bKeep)
            delete	Msg;
    }

}
예제 #2
0
bool CMultiXProcess::Send(CMultiXAppMsg &Msg)
{
    if(Msg.IsResponse())
    {
        Msg.MultiXMsg()->SetAsResponse(true);
    }	else
    {
        Msg.MultiXMsg()->SetAsResponse(false);
    }

    if(Msg.m_Timeout	>	0)
    {
        CMultiXProcessTimer	*Timer	=	new	CMultiXProcessTimer(CMultiXProcessTimer::SendMsgTimerCode,Msg.m_Timeout,m_pAlertableObject->ID());
        Timer->MsgID()	=	Msg.ID();
        Owner()->SetMultiXTimer(Timer);
        if(Msg.m_Timeout	<	5000)
        {
            Msg.MultiXMsg()->m_SendSem.Initialize();
        }
    }
    SendMsg(*Msg.MultiXMsg());
    return	true;
}