diff --git a/src/nt/ntmultiChannel.cpp b/src/nt/ntmultiChannel.cpp index fa21d93..2f4cb30 100644 --- a/src/nt/ntmultiChannel.cpp +++ b/src/nt/ntmultiChannel.cpp @@ -318,12 +318,34 @@ bool NTMultiChannel::isCompatible(PVStructurePtr const &pvStructure) return isCompatible(pvStructure->getStructure()); } + +bool NTMultiChannel::isValid() +{ + size_t valueLength = getValue()->getLength(); + if (getChannelName()->getLength() != valueLength) return false; + + PVScalarArrayPtr arrayFields[] = { + getSeverity(), getStatus(), getMessage(), + getSecondsPastEpoch(), getNanoseconds(), getUserTag() + }; + size_t N = sizeof(arrayFields)/sizeof(arrayFields[0]); + + PVScalarArrayPtr arrayField; + for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa) + { + arrayField = *pa; + if (arrayField.get() && arrayField->getLength() != valueLength) + return false; + } + return true; +} + + NTMultiChannelBuilderPtr NTMultiChannel::createBuilder() { return NTMultiChannelBuilderPtr(new detail::NTMultiChannelBuilder()); } - NTMultiChannel::NTMultiChannel(PVStructurePtr const & pvStructure) : pvNTMultiChannel(pvStructure), pvTimeStamp(pvStructure->getSubField("timeStamp")), diff --git a/src/nt/ntscalarMultiChannel.cpp b/src/nt/ntscalarMultiChannel.cpp index 4ea42cb..72efecb 100644 --- a/src/nt/ntscalarMultiChannel.cpp +++ b/src/nt/ntscalarMultiChannel.cpp @@ -315,6 +315,27 @@ bool NTScalarMultiChannel::isCompatible(PVStructurePtr const &pvStructure) return isCompatible(pvStructure->getStructure()); } +bool NTScalarMultiChannel::isValid() +{ + size_t valueLength = getValue()->getLength(); + if (getChannelName()->getLength() != valueLength) return false; + + PVScalarArrayPtr arrayFields[] = { + getSeverity(), getStatus(), getMessage(), + getSecondsPastEpoch(), getNanoseconds(), getUserTag() + }; + size_t N = sizeof(arrayFields)/sizeof(arrayFields[0]); + + PVScalarArrayPtr arrayField; + for (PVScalarArrayPtr * pa = arrayFields; pa != arrayFields+N; ++pa) + { + arrayField = *pa; + if (arrayField.get() && arrayField->getLength() != valueLength) + return false; + } + return true; +} + NTScalarMultiChannelBuilderPtr NTScalarMultiChannel::createBuilder() { return NTScalarMultiChannelBuilderPtr(new detail::NTScalarMultiChannelBuilder()); diff --git a/src/nt/nttable.cpp b/src/nt/nttable.cpp index 1964aca..d584a42 100644 --- a/src/nt/nttable.cpp +++ b/src/nt/nttable.cpp @@ -190,6 +190,32 @@ bool NTTable::isCompatible(PVStructurePtr const & pvStructure) return isCompatible(pvStructure->getStructure()); } +bool NTTable::isValid() +{ + PVFieldPtrArray const & columns = pvValue->getPVFields(); + + if (getLabels()->getLength() != columns.size()) return false; + boolean first = true; + int length = 0; + for (PVFieldPtrArray::const_iterator it = columns.begin(); + it != columns.end();++it) + { + PVScalarArrayPtr column = std::tr1::dynamic_pointer_cast(*it); + if (!column.get()) return false; + int colLength = column->getLength(); + if (first) + { + length = colLength; + first = false; + } + else if (length != colLength) + return false; + } + + return true; +} + + NTTableBuilderPtr NTTable::createBuilder() { return NTTableBuilderPtr(new detail::NTTableBuilder()); diff --git a/src/nt/nturi.cpp b/src/nt/nturi.cpp index 378d72d..1d0d824 100644 --- a/src/nt/nturi.cpp +++ b/src/nt/nturi.cpp @@ -194,6 +194,11 @@ bool NTURI::isCompatible(PVStructurePtr const & pvStructure) return isCompatible(pvStructure->getStructure()); } +bool NTURI::isValid() +{ + return true; +} + NTURIBuilderPtr NTURI::createBuilder() { return NTURIBuilderPtr(new detail::NTURIBuilder());