bool CMultiXAppMsg::Reply(MultiXError Error,int32_t MsgCode, const CMultiXBufferArray &Bufs, int Flags,int Priority, uint32_t Timeout, void *Context,TMultiXProcID RoutedFrom) { if(ReplySent()) return false; if(!this->NotifyAny()) return false; if(!m_pProcess->SenderEnabled()) return false; if(m_pProcess->RestartCount() != m_OwnerInstance) return false; if(RoutedFrom == 0) RoutedFrom = m_pProcess->Owner()->ProcessID(); CMultiXAppMsg *Msg = m_pProcess->CreateNewAppMsg(); m_pProcess->AddToMsgQueue(m_pProcess->m_pOutQueue, Msg); Msg->AllocateL7XMsg(MsgCode); Msg->AddReceiverMsgID(this->SenderMsgID()); if(this->IsCtrlMsgFromTpm()) Flags |= FlagControlToTpm; else if(this->IsCtrlMsgToTpm()) Flags |= FlagControlFromTpm; if(Bufs.Count() == 0) Flags &= ~CMultiXAppMsg::FlagResponseRequired; Msg->AddInfo(Bufs,Flags | FlagMsgIsResponse,this->m_SessionID,Priority,Timeout,Context,Error,RoutedFrom,NULL,NULL,NULL,NULL); if(Msg->NotifyAny()) m_pProcess->Send(*Msg); else { m_pProcess->Send(*Msg); delete Msg; } SetReplySent(true); return true; }
bool CMultiXProcess::Send(int32_t MsgCode, const CMultiXBufferArray &Bufs,int Flags, const TMultiXSessionID &SessionID,int Priority, uint32_t Timeout, void *Context,TMultiXProcID RoutedFrom,const char *WSURL,const char *WSSoapAction,const char *WSDllFile,const char *WSDllFunction) { if(!SenderEnabled()) return false; CMultiXAppMsg *Msg = CreateNewAppMsg(); AddToMsgQueue(m_pOutQueue,Msg); Msg->AllocateL7XMsg(MsgCode); if(RoutedFrom == 0) RoutedFrom = Owner()->ProcessID(); Msg->AddInfo(Bufs,Flags & (~CMultiXAppMsg::FlagMsgIsResponse),SessionID,Priority,Timeout,Context,MultiXNoError,RoutedFrom,WSURL,WSSoapAction,WSDllFile,WSDllFunction); if(Msg->NotifyAny()) return Send(*Msg); else { Send(*Msg); delete Msg; } 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; }