diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index f4ead50..bbc5205 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -155,26 +155,39 @@ void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom, AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); + LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] Search request received."); + transport->ensureData((sizeof(int32)+sizeof(int16))/sizeof(int8)+1); + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); const int32 searchSequenceId = payloadBuffer->getInt(); + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); const int8 qosCode = payloadBuffer->getByte(); - const int32 count = payloadBuffer->getShort() & 0xFFFF; + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); + const int32 count = payloadBuffer->getShort(); + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); const bool responseRequired = (QOS_REPLY_REQUIRED & qosCode) != 0; + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] Search request received: ID %d count %d.", searchSequenceId, count); + for (int32 i = 0; i < count; i++) { transport->ensureData(sizeof(int32)/sizeof(int8)); const int32 cid = payloadBuffer->getInt(); + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); const String name = SerializeHelper::deserializeString(payloadBuffer, transport.get()); + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] pos %d", payloadBuffer->getPosition()); // no name check here... + //LOG(logLevelInfo,"[ServerSearchHandler::handleResponse] Search request received for CID %d name '%s'.", cid, name.c_str()); + // TODO object pool!!! int providerCount = _providers.size(); + ServerChannelFindRequesterImpl* pr = new ServerChannelFindRequesterImpl(_context, providerCount); pr->set(name, searchSequenceId, cid, responseFrom, responseRequired); ChannelFindRequester::shared_pointer spr(pr); - for (int i = 0; i < providerCount; i++) + for (int i = 0; i < providerCount; i++) _providers[i]->channelFind(name, spr); } } @@ -237,6 +250,8 @@ void ServerChannelFindRequesterImpl::channelFindResult(const Status& status, Cha ServerSearchHandler::s_channelNameToProvider[_name] = channelFind->getChannelProvider(); } + +LOG(logLevelInfo,"[ServerChannelFindRequesterImpl::channelFindResult] Channel '%s' was found.", _name.c_str()); _wasFound = wasFound; TransportSender::shared_pointer thisSender = shared_from_this(); _context->getBroadcastTransport()->enqueueSendRequest(thisSender); @@ -255,6 +270,10 @@ void ServerChannelFindRequesterImpl::unlock() void ServerChannelFindRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* control) { + char ipAddrStr[48]; + ipAddrToDottedIP(&_sendTo->ia, ipAddrStr, sizeof(ipAddrStr)); +LOG(logLevelInfo,"[ServerChannelFindRequesterImpl::send] Sending search response back for %s to %s.", _name.c_str(), ipAddrStr); + int32 count = 1; control->startMessage((int8)4, (sizeof(int32)+sizeof(int8)+128+2*sizeof(int16)+count*sizeof(int32))/sizeof(int8)); @@ -1342,7 +1361,7 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* { Monitor::shared_pointer monitor = _channelMonitor; MonitorElement::shared_pointer element = monitor->poll(); - if (element != NULL) + if (element.get()) { control->startMessage((int8)CMD_MONITOR, sizeof(int32)/sizeof(int8) + 1); buffer->putInt(_ioid); @@ -1350,7 +1369,7 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* // changedBitSet and data, if not notify only (i.e. queueSize == -1) BitSet::shared_pointer changedBitSet = element->changedBitSet; - if (changedBitSet != NULL) + if (changedBitSet.get()) { changedBitSet->serialize(buffer, control); element->pvStructurePtr->serialize(buffer, control, changedBitSet.get()); diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index 940b450..a4a18c1 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -90,7 +90,7 @@ void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) } } -void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) +void convertArray(StringBuilder buffer,PVScalarArray * pv,int /*notFirst*/) { // array stringification std::stringstream sstream; @@ -391,7 +391,9 @@ void toNTString(std::ostream& o, PVFieldPtr const & pv) double timeOut = DEFAULT_TIMEOUT; string request(DEFAULT_REQUEST); -bool terseMode = false; + +enum PrintMode { ValueOnlyMode, StructureMode, TerseMode }; +PrintMode mode = ValueOnlyMode; void usage (void) @@ -483,8 +485,6 @@ class ChannelGetRequesterImpl : public ChannelGetRequester std::cerr << "[" << m_channelName << "] channel get: " << status.toString() << std::endl; } - String str; - // access smart pointers { Lock lock(m_pointerMutex); @@ -492,17 +492,51 @@ class ChannelGetRequesterImpl : public ChannelGetRequester // needed since we access the data ScopedLock dataLock(m_channelGet); - if (terseMode) + if (mode == ValueOnlyMode) + { + PVFieldPtr pvField = m_pvStructure->getSubField("value"); + if (pvField.get()) + { + PVScalarArrayPtr pvScalarArray = std::tr1::dynamic_pointer_cast(pvField); + if (pvScalarArray.get()) + { + size_t len = pvScalarArray->getLength(); + for (size_t i = 0; i < len; i++) + { + (pvScalarArray.get())->dumpValue(std::cout, i) << std::endl; + } + } + else + { + std::cout << *(pvField.get()) << std::endl; + } + } + else + { + // do a structure mode, as fallback + std::cerr << "no 'value' field" << std::endl; + String str; + m_pvStructure->toString(&str); + std::cout << str << std::endl; + } + } + else if (mode == TerseMode) + { + String str; convertToString(&str, m_pvStructure.get(), 0); - else + std::cout << str << std::endl; + } + else //if (mode == StructureMode) + { + String str; m_pvStructure->toString(&str); + std::cout << str << std::endl; + } } // this is OK since calle holds also owns it m_channelGet.reset(); } - std::cout << str << std::endl; - m_event.signal(); } @@ -659,7 +693,7 @@ public: } } - virtual void channelStateChange(Channel::shared_pointer const & channel, Channel::ConnectionState connectionState) + virtual void channelStateChange(Channel::shared_pointer const & /*channel*/, Channel::ConnectionState connectionState) { if (connectionState == Channel::CONNECTED) { @@ -723,10 +757,11 @@ int main (int argc, char *argv[]) timeOut = DEFAULT_TIMEOUT; } break; - case 'r': /* Set timeout value */ + case 'r': /* Set pvRequest value */ request = optarg; + mode = StructureMode; break; - case 'p': /* Servie parameters */ + case 'p': /* Service parameters */ { string param = optarg; size_t eqPos = param.find('='); @@ -748,7 +783,7 @@ int main (int argc, char *argv[]) serviceRequest = true; break; case 't': /* Terse mode */ - terseMode = true; + mode = TerseMode; break; case 'd': /* Debug log level */ debug = true; diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index bdebdc9..869a03b 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -771,6 +771,24 @@ class MockChannel : public Channel { { pvField->setCapacity(specCount); pvField->setLength(specCount); + + double v = 0; + int ix = 0; + const int COUNT = 1024; + + int n = 0; + while (n < specCount) + { + + double array[COUNT]; + int i = 0; + for (; i < COUNT && n < specCount; i++) + { + array[i] = v; v+=1; n++; + } + pvField->put(ix, i, array, 0); + ix += i; + } } else { @@ -797,7 +815,7 @@ class MockChannel : public Channel { pvField->toString(&str); printf("%s\n", str.c_str()); printf("=============------------------------------------!!!\n"); - */ + */ } else if (m_name.find("image") == 0) {