From 63f23e278ad6f6ffcc6d7cfa0f871a50b734c559 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Fri, 6 Jun 2014 00:17:06 +0200 Subject: [PATCH] channelCreate w/ address prototype support; inetAddressUtil parsing error handling --- pvAccessApp/remote/blockingUDP.h | 7 +++--- pvAccessApp/remote/codec.h | 2 +- .../remoteClient/clientContextImpl.cpp | 22 +++++++++++-------- pvAccessApp/utils/inetAddressUtil.cpp | 8 +++---- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/pvAccessApp/remote/blockingUDP.h b/pvAccessApp/remote/blockingUDP.h index c467a20..cad6b22 100644 --- a/pvAccessApp/remote/blockingUDP.h +++ b/pvAccessApp/remote/blockingUDP.h @@ -70,7 +70,7 @@ namespace epics { } virtual epics::pvData::String getType() const { - return epics::pvData::String("UDP"); + return epics::pvData::String("udp"); } virtual std::size_t getReceiveBufferSize() const { @@ -135,8 +135,9 @@ namespace epics { virtual void close(); - virtual void ensureData(std::size_t /*size*/) { - // noop + virtual void ensureData(std::size_t size) { + if (_receiveBuffer->getRemaining() < size) + throw std::underflow_error("no more data in UDP packet"); } virtual void alignData(std::size_t alignment) { diff --git a/pvAccessApp/remote/codec.h b/pvAccessApp/remote/codec.h index a64406a..91eca9e 100644 --- a/pvAccessApp/remote/codec.h +++ b/pvAccessApp/remote/codec.h @@ -404,7 +404,7 @@ namespace epics { public: epics::pvData::String getType() const { - return epics::pvData::String("TCP"); + return epics::pvData::String("tcp"); } diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index fef1fbe..99468ae 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -2988,7 +2988,7 @@ namespace epics { epics::pvData::String const & channelName, ChannelRequester::shared_pointer const & channelRequester, short priority, - epics::pvData::String const & /*address*/) + epics::pvData::String const & addressesStr) { std::tr1::shared_ptr context = m_context.lock(); if (!context.get()) @@ -2999,8 +2999,12 @@ namespace epics { return nullChannel; } - // TODO support addressList auto_ptr addresses; + if (!addressesStr.empty()) + addresses.reset(getSocketAddressList(addressesStr, PVA_SERVER_PORT)); + if (addresses->empty()) + addresses.reset(); + Channel::shared_pointer channel = context->createChannelInternal(channelName, channelRequester, priority, addresses); if (channel.get()) channelRequester->channelCreated(Status::Ok, channel); @@ -3522,13 +3526,13 @@ namespace epics { { m_context->getChannelSearchManager()->registerSearchInstance(shared_from_this()); } - /* TODO - else - // TODO not only first - // TODO minor version - // TODO what to do if there is no channel, do not search in a loop!!! do this in other thread...! - searchResponse(CAConstants.PVA_MINOR_PROTOCOL_REVISION, addresses[0]); - */ + else if (!m_addresses->empty()) + { + // TODO not only first !!! + // TODO minor version !!! + // TODO what to do if there is no channel, do not search in a loop!!! do this in other thread...! + searchResponse(PVA_PROTOCOL_REVISION, &((*m_addresses)[0])); + } } virtual void searchResponse(int8 minorRevision, osiSockAddr* serverAddress) { diff --git a/pvAccessApp/utils/inetAddressUtil.cpp b/pvAccessApp/utils/inetAddressUtil.cpp index bb03abe..31996a3 100644 --- a/pvAccessApp/utils/inetAddressUtil.cpp +++ b/pvAccessApp/utils/inetAddressUtil.cpp @@ -121,15 +121,15 @@ InetAddrVector* getSocketAddressList(String list, int defaultPort, while((subEnd = list.find(' ', subStart))!=String::npos) { String address = list.substr(subStart, (subEnd-subStart)); osiSockAddr addr; - aToIPAddr(address.c_str(), defaultPort, &addr.ia); - iav->push_back(addr); + if (aToIPAddr(address.c_str(), defaultPort, &addr.ia) == 0) + iav->push_back(addr); subStart = list.find_first_not_of(" \t\r\n\v", subEnd); } if(subStart!=String::npos&&list.length()>0) { osiSockAddr addr; - aToIPAddr(list.substr(subStart).c_str(), defaultPort, &addr.ia); - iav->push_back(addr); + if (aToIPAddr(list.substr(subStart).c_str(), defaultPort, &addr.ia) == 0) + iav->push_back(addr); } if(appendList!=NULL) {