diff options
author | Kevin Tang <zhikait@codeaurora.org> | 2019-08-28 18:18:21 -0700 |
---|---|---|
committer | Kevin Tang <zhikait@codeaurora.org> | 2019-09-09 18:03:22 -0700 |
commit | c891e738f547e1ae9c4fa246e574a47c7c83e496 (patch) | |
tree | cc66e214db2912edb826fca313f27d016d0e8faa /utils/LocIpc.cpp | |
parent | d3e6df06e217f94033b4e746e639d0b1f2d5fcc5 (diff) | |
download | gps-c891e738f547e1ae9c4fa246e574a47c7c83e496.tar.gz |
LocIpc sender recv and recver send
Added two APIs, which allow ILocIpcListener to provide
a sender for sending data back to LocIpcSender; and to
allow a LocIpcSender to get a recver from the last send
target so that it can receive data from it.
Change-Id: I94e2204a2588d375805d0674d1e877bbe414c99f
CRs-Fixed: 2524039
Diffstat (limited to 'utils/LocIpc.cpp')
-rw-r--r-- | utils/LocIpc.cpp | 70 |
1 files changed, 24 insertions, 46 deletions
diff --git a/utils/LocIpc.cpp b/utils/LocIpc.cpp index f4dd0b4..e9dbe9d 100644 --- a/utils/LocIpc.cpp +++ b/utils/LocIpc.cpp @@ -66,18 +66,18 @@ ssize_t Sock::send(const void *buf, uint32_t len, int flags, const struct sockad SOCK_OP_AND_LOG(buf, len, isValid(), rtv, sendto(buf, len, flags, destAddr, addrlen)); return rtv; } -ssize_t Sock::recv(const shared_ptr<ILocIpcListener>& dataCb, int flags, struct sockaddr *srcAddr, - socklen_t *addrlen, int sid) const { +ssize_t Sock::recv(const LocIpcRecver& recver, const shared_ptr<ILocIpcListener>& dataCb, int flags, + struct sockaddr *srcAddr, socklen_t *addrlen, int sid) const { ssize_t rtv = -1; if (-1 == sid) { sid = mSid; } // else it sid would be connection based socket id for recv SOCK_OP_AND_LOG(dataCb.get(), mMaxTxSize, isValid(), rtv, - recvfrom(dataCb, sid, flags, srcAddr, addrlen)); + recvfrom(recver, dataCb, sid, flags, srcAddr, addrlen)); return rtv; } ssize_t Sock::sendto(const void *buf, size_t len, int flags, const struct sockaddr *destAddr, - socklen_t addrlen) const { + socklen_t addrlen) const { ssize_t rtv = -1; if (len <= mMaxTxSize) { rtv = ::sendto(mSid, buf, len, flags, destAddr, addrlen); @@ -94,19 +94,18 @@ ssize_t Sock::sendto(const void *buf, size_t len, int flags, const struct sockad } return rtv; } -ssize_t Sock::recvfrom(const shared_ptr<ILocIpcListener>& dataCb, int sid, int flags, - struct sockaddr *srcAddr, socklen_t *addrlen) const { - ssize_t nBytes = -1; +ssize_t Sock::recvfrom(const LocIpcRecver& recver, const shared_ptr<ILocIpcListener>& dataCb, + int sid, int flags, struct sockaddr *srcAddr, socklen_t *addrlen) const { std::string msg(mMaxTxSize, 0); - - if ((nBytes = ::recvfrom(sid, (void*)msg.data(), msg.size(), flags, srcAddr, addrlen)) > 0) { + ssize_t nBytes = ::recvfrom(sid, (void*)msg.data(), msg.size(), flags, srcAddr, addrlen); + if (nBytes > 0) { if (strncmp(msg.data(), MSG_ABORT, sizeof(MSG_ABORT)) == 0) { LOC_LOGi("recvd abort msg.data %s", msg.data()); nBytes = 0; } else if (strncmp(msg.data(), LOC_IPC_HEAD, sizeof(LOC_IPC_HEAD) - 1)) { // short message msg.resize(nBytes); - dataCb->onReceive(msg.data(), nBytes); + dataCb->onReceive(msg.data(), nBytes, &recver); } else { // long message size_t msgLen = 0; @@ -119,7 +118,7 @@ ssize_t Sock::recvfrom(const shared_ptr<ILocIpcListener>& dataCb, int sid, int f } if (nBytes > 0) { nBytes = msgLen; - dataCb->onReceive(msg.data(), nBytes); + dataCb->onReceive(msg.data(), nBytes, &recver); } } } @@ -152,7 +151,7 @@ class LocIpcLocalRecver : public LocIpcLocalSender, public LocIpcRecver { protected: inline virtual ssize_t recv() const override { socklen_t size = sizeof(mAddr); - return mSock->recv(mDataCb, 0, (struct sockaddr*)&mAddr, &size); + return mSock->recv(*this, mDataCb, 0, (struct sockaddr*)&mAddr, &size); } public: inline LocIpcLocalRecver(const shared_ptr<ILocIpcListener>& listener, const char* name) : @@ -189,6 +188,10 @@ protected: return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr)); } public: + inline LocIpcInetSender(const LocIpcInetSender& sender) : + mSockType(sender.mSockType), mSock(sender.mSock), + mName(sender.mName), mAddr(sender.mAddr) { + } inline LocIpcInetSender(const char* name, int32_t port, int sockType) : LocIpcSender(), mSockType(sockType), mSock(make_shared<Sock>((nullptr == name) ? -1 : (::socket(AF_INET, mSockType, 0)))), @@ -202,6 +205,10 @@ public: } } } + + unique_ptr<LocIpcRecver> getRecver(const shared_ptr<ILocIpcListener>& listener) override { + return make_unique<SockRecver>(listener, *this, mSock); + } }; class LocIpcInetTcpSender : public LocIpcInetSender { @@ -245,7 +252,9 @@ public: mSock->sendAbort(0, (struct sockaddr*)&loopBackAddr, sizeof(loopBackAddr)); } } - + inline virtual unique_ptr<LocIpcSender> getLastSender() const override { + return make_unique<LocIpcInetSender>(static_cast<const LocIpcInetSender&>(*this)); + } }; class LocIpcInetTcpRecver : public LocIpcInetRecver { @@ -260,7 +269,7 @@ protected: mConnFd = -1; } } - return mSock->recv(mDataCb, 0, (struct sockaddr*)&mAddr, &size, mConnFd); + return mSock->recv(*this, mDataCb, 0, (struct sockaddr*)&mAddr, &size, mConnFd); } public: inline LocIpcInetTcpRecver(const shared_ptr<ILocIpcListener>& listener, const char* name, @@ -273,7 +282,7 @@ class LocIpcInetUdpRecver : public LocIpcInetRecver { protected: inline virtual ssize_t recv() const override { socklen_t size = sizeof(mAddr); - return mSock->recv(mDataCb, 0, (struct sockaddr*)&mAddr, &size); + return mSock->recv(*this, mDataCb, 0, (struct sockaddr*)&mAddr, &size); } public: inline LocIpcInetUdpRecver(const shared_ptr<ILocIpcListener>& listener, const char* name, @@ -283,37 +292,6 @@ public: inline virtual ~LocIpcInetUdpRecver() {} }; - - -#ifdef NOT_DEFINED -class LocIpcQcsiSender : public LocIpcSender { -protected: - inline virtual bool isOperable() const override { - return mService != nullptr && mService->isServiceRegistered(); - } - inline virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t msgId) const override { - return mService->sendIndToClient(msgId, data, length); - } - inline LocIpcQcsiSender(shared_ptr<QcsiService>& service) : mService(service) {} -public: - inline virtual ~LocIpcQcsi() {} -}; - -class LocIpcQcsiRecver : public LocIpcQcsiSender, public LocIpcRecver { -protected: - inline virtual ssize_t recv() const override { return mService->recv(); } -public: - inline LocIpcQcsiRecver(unique_ptr<QcsiService>& service) : - LocIpcQcsiSender(service), LocIpcRecver(mService->getDataCallback(), *this) { - } - // only the dele - inline ~LocIpcQcsiRecver() {} - inline virtual const char* getName() const override { return mService->getName().data(); }; - inline virtual void abort() const override { if (isSendable()) mService->abort(); } - shared_ptr<LocIpcQcsiSender> getSender() { return make_pare<LocIpcQcsiSender>(mService); } -}; -#endif - class LocIpcRunnable : public LocRunnable { bool mAbortCalled; LocIpc& mLocIpc; |