int TaoClientTask::sendRequest(TaoMessage& rMsg, OsMutex* pMutex, const OsTime& rTimeout) { if (mpTaoServerTask) { rMsg.setMsgQueueHandle((TaoObjHandle) this); mpTaoServerTask->postMessage(rMsg); return 1; } else { osPrintf("\n++++++ TaoClientTask::sendRequest mpTaoServerTask = 0x%p +++++\n", mpTaoServerTask); osPrintf("\n++++++ %d %d +++++\n", rMsg.getMsgSubType(), rMsg.getCmd()); } osPrintf("\n++++++ TaoClientTask::sendRequest %p %s : %d+++++\n", mpConnectionSocket, mRemoteHost.data(), mRemotePort); if (!mpConnectionSocket) { mMutex.acquireWrite(); mpConnectionSocket = new OsConnectionSocket(mRemotePort, mRemoteHost); if (mpAgent) { delete mpAgent; } mpAgent = new TaoTransportAgent(mpConnectionSocket, this); mpAgent->start(); mMutex.releaseWrite(); } int recvd = 0; if (mpConnectionSocket && mpConnectionSocket->isOk()) { unsigned int sent; mMutex.acquireWrite(); UtlString buffer; ssize_t bufferLen; rMsg.getBytes(&buffer, &bufferLen); size_t iSendSize = bufferLen + (sizeof(uint32_t)*2) ; char* pBuf = new char[iSendSize] ; uint32_t cookie = 0x1234ABCD ; uint32_t length = bufferLen ; memcpy(&pBuf[0], &cookie, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)], &length, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)*2], buffer.data(), bufferLen) ; sent = mpConnectionSocket->write(pBuf, iSendSize) ; delete pBuf ; if (sent > sizeof(uint32_t)*2) sent -= sizeof(uint32_t)*2 ; mMutex.releaseWrite(); } return recvd; }
int TaoTransportTask::send(TaoMessage& rMsg) { unsigned int type = rMsg.getMsgSubType(); unsigned int cmd = rMsg.getCmd(); if ((TaoMessage::RESPONSE_PROVIDER == type) && (cmd == TaoMessage::SHUTDOWN)) { TaoTransportAgent* pAgent = (TaoTransportAgent *) rMsg.getSocket(); mpTaoListeningTask->shutdownAgent(pAgent); return 0; } // record this transaction in the transaction db rMsg.getMsgID(); mpTransactionCnt->add(); mpTransactionCnt->getRef(); TaoObjHandle remoteServer = rMsg.getMsgQueueHandle(); if (mClientHandle) { ((OsServerTask *) mClientHandle)->postMessage(rMsg); return 1; } else if (remoteServer) { ((OsServerTask *) remoteServer)->postMessage(rMsg); return 1; } // send the msg to the transport, receive the response int sent = 0; TaoTransportAgent* pAgent = (TaoTransportAgent *) rMsg.getSocket(); if (pAgent && !pAgent->isShuttingDown()) { sent = pAgent->send(rMsg); } return sent; }
UtlBoolean TaoClientTask::receiveMsg(TaoMessage& rMsg) { TaoObjHandle appHandle = 0; appHandle = rMsg.getSocket(); // where the app pointer is stored if (appHandle) { OsProtectedEvent* pEvent; TaoObjHandle handle; UtlString argList; int data; pEvent = (OsProtectedEvent *)appHandle; handle = rMsg.getTaoObjHandle(); data = rMsg.getArgCnt(); argList = rMsg.getArgList(); pEvent->setIntData(data); data = rMsg.getCmd(); pEvent->setIntData2(data); pEvent->setStringData(argList); // If the event has already been signalled, clean up if(OS_ALREADY_SIGNALED == pEvent->signal(handle)) { OsProtectEventMgr* eventMgr = OsProtectEventMgr::getEventMgr(); eventMgr->release(pEvent); } return TRUE; } else { osPrintf("<<<< TaoClientTask::receiveMsg: no appHandle!! >>>>\n"); return FALSE; } }