void CMultiXWSServerServerSession::OnNewMsg(CMultiXAppMsg &Msg) { DebugPrint(1,"New Message Received\n"); if(!Msg.IsWebServiceCall()) { DebugPrint(1,"Error Reply TpmErrMsgNotSupported\n"); Msg.Reply(TpmErrMsgNotSupported); return; } try { if(m_pStream == NULL) m_pStream = new CMultiXWSStream(Msg.WSDllFile(),*this); bool bSuccess = m_pStream->CallServiceNoWait(Msg); if(!bSuccess) { Owner()->Logger()->ReportError(DebugPrint(0,"Error on CallServiceNoWait\n")); Msg.Reply(WSErrgSoapDllNotFound); } }catch(...) { DebugPrint(1,"Error Reply WSErrgSoapDllNotFound\n"); Msg.Reply(WSErrgSoapDllNotFound); } }
CMultiXLayer::EventHandlerReturn CMultiXWSStream::OnNewRequestMessage(CMultiXEvent *Event) { CMultiXWSStreamEvent *Ev = (CMultiXWSStreamEvent *)Event; // if we have a valid message saved, we reply it with error - this will happen only if we have not replied to it before // we will also delete the message, since we do not need it any more. CMultiXAppMsg *pMsg = m_RequestMsgID.GetObject(); if(pMsg != NULL) { pMsg->Reply(TpmErrMsgCanceled); delete pMsg; } m_RequestMsgID = Ev->m_MsgID; pMsg = m_RequestMsgID.GetObject(); if(pMsg == NULL) return CMultiXLayer::DeleteEvent; bool bExit = false; while(!bExit) // we do a "while" here just so we can fall thru the end of function and delete the message object { bExit = true; if(!pMsg->IsWebServiceCall()) { pMsg->Reply(TpmErrMsgNotSupported); break; } std::string FuncName; std::string DLLName; EXPORTABLE_STL::map<int32_t,std::string>::iterator It = m_MsgCodeToFunctionMap.find(pMsg->MsgCode()); if(It != m_MsgCodeToFunctionMap.end()) { DLLName = It->second.substr(0,It->second.find("|||")); FuncName = It->second.substr(It->second.find("|||")+3); } else { DLLName = pMsg->WSDllFile(); FuncName = pMsg->WSDllFunction(); } try { InitgSoap(DLLName); } catch(...) { pMsg->Reply(WSErrgSoapDllNotFound); break; } TgSoapServiceFunction Func = (TgSoapServiceFunction)GetProcAddress(m_pFunctions->m_pDLLHandle,FuncName.c_str()); if(Func == NULL) { pMsg->Reply(WSErrServiceFunctionNotFound); break; } else if(It == m_MsgCodeToFunctionMap.end()) { m_MsgCodeToFunctionMap[pMsg->MsgCode()] = DLLName + "|||" + pMsg->WSDllFunction(); } ResetData(); if(m_pInBuf) m_pInBuf->ReturnBuffer(); m_pInBuf = pMsg->Owner()->Owner()->AllocateBuffer(pMsg->AppData(),pMsg->AppDataSize()); int Error = Func(gSoap()); if(OutBuf().Length() > 0) { pMsg->Reply(pMsg->MsgCode(),OutBuf()); } else { pMsg->Reply(Error); } } if(pMsg) delete pMsg; m_RequestMsgID.Init(); return CMultiXLayer::DeleteEvent; }