channelCreate w/ address prototype support; inetAddressUtil parsing error handling
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -404,7 +404,7 @@ namespace epics {
|
||||
public:
|
||||
|
||||
epics::pvData::String getType() const {
|
||||
return epics::pvData::String("TCP");
|
||||
return epics::pvData::String("tcp");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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<ClientContextImpl> context = m_context.lock();
|
||||
if (!context.get())
|
||||
@@ -2999,8 +2999,12 @@ namespace epics {
|
||||
return nullChannel;
|
||||
}
|
||||
|
||||
// TODO support addressList
|
||||
auto_ptr<InetAddrVector> 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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user