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; }
bool CMultiXProcess::OnAppMsg(CMultiXMsg &Msg) { if(!ReceiverEnabled() || !SenderEnabled()) return false; CMultiXAppMsg *OrgMsg = NULL; CMultiXSession *Session = NULL; CMultiXAppMsg *AppMsg = CreateNewAppMsg(&Msg); //if(m_MsgCount++ == 1) // m_LastPrintTime = Owner()->GetMilliClock(); m_LastMsgRecvMilliClock = Owner()->GetMilliClock(); AddToMsgQueue(m_pInQueue,AppMsg); if(!AppMsg->ResponseRequired()) { if(AppMsg->NotifyAny()) AppMsg->Reply(MultiXNoError); } if(AppMsg->IsResponse()) { OrgMsg = AppMsg->ReceiverMsgID().GetObject(); if(OrgMsg != NULL) { Session = Owner()->FindSession(OrgMsg->SessionID()); OrgMsg->m_bKeep = false; OrgMsg->ID().RemoveObject(); if(AppMsg->AppDataSize() || OrgMsg->ResponseRequired()) { if(Session) { if(AppMsg->IsCtrlMsgFromTpm()) Session->OnDataReplyFromTpmReceived(*AppMsg,*OrgMsg); else Session->OnDataReplyReceivedNV(*AppMsg,*OrgMsg); } else { if(AppMsg->IsCtrlMsgFromTpm()) OnDataReplyFromTpmReceived(*AppMsg,*OrgMsg); else OnDataReplyReceived(*AppMsg,*OrgMsg); } } else if(AppMsg->Error()) { if(OrgMsg->NotifyError()) { if(Session) { if(AppMsg->IsCtrlMsgFromTpm()) Session->OnSendMsgToTpmFailed(*OrgMsg); else Session->OnSendMsgFailedNV(*OrgMsg); } else { if(AppMsg->IsCtrlMsgFromTpm()) OnSendMsgToTpmFailed(*OrgMsg); else OnSendMsgFailed(*OrgMsg); } } } else { if(OrgMsg->NotifySuccess()) { if(Session) { if(AppMsg->IsCtrlMsgFromTpm()) Session->OnSendMsgToTpmCompleted(*OrgMsg); else Session->OnSendMsgCompletedNV(*OrgMsg); } else { if(AppMsg->IsCtrlMsgFromTpm()) OnSendMsgToTpmCompleted(*OrgMsg); else OnSendMsgCompleted(*OrgMsg); } } } } else // it is a response but the original does not exist { AppMsg->Reply(TpmErrUnableToForwardMsg); } } else { Session = Owner()->FindSession(AppMsg->SessionID(),true); if(Session) { if(AppMsg->IsCtrlMsgFromTpm()) Session->OnNewMsgFromTpm(*AppMsg); else Session->OnNewMsgNV(*AppMsg); } else { if(AppMsg->IsCtrlMsgFromTpm()) OnNewMsgFromTpm(*AppMsg); else OnNewMsg(*AppMsg); } if(AppMsg->ResponseRequired() && !(AppMsg->ReplySent() || AppMsg->m_bKeep)) Throw(); } if(!(AppMsg->ReplySent() || AppMsg->m_bKeep)) { if(AppMsg->ResponseRequired()) Throw(); else if(AppMsg->NotifyAny()) AppMsg->Reply(MultiXNoError); } if(OrgMsg && !OrgMsg->m_bKeep) delete OrgMsg; if(!AppMsg->m_bKeep) delete AppMsg; return true; }