QVariant GeoIPDatabase::readDataField(quint32 &offset) const { DataFieldDescriptor descr; if (!readDataFieldDescriptor(offset, descr)) return QVariant(); quint32 locOffset = offset; bool usePointer = false; if (descr.fieldType == DataType::Pointer) { usePointer = true; // convert offset from data section to global locOffset = descr.offset + (m_nodeCount * m_recordSize / 4) + sizeof(DATA_SECTION_SEPARATOR); if (!readDataFieldDescriptor(locOffset, descr)) return QVariant(); } QVariant fieldValue; switch (descr.fieldType) { case DataType::Pointer: qDebug() << "* Illegal Pointer using"; break; case DataType::String: fieldValue = QString::fromUtf8(reinterpret_cast<const char *>(m_data + locOffset), descr.fieldSize); locOffset += descr.fieldSize; break; case DataType::Double: if (descr.fieldSize == 8) fieldValue = readPlainValue<double>(locOffset, descr.fieldSize); else qDebug() << "* Invalid field size for type: Double"; break; case DataType::Bytes: fieldValue = QByteArray(reinterpret_cast<const char *>(m_data + locOffset), descr.fieldSize); locOffset += descr.fieldSize; break; case DataType::Integer16: fieldValue = readPlainValue<quint16>(locOffset, descr.fieldSize); break; case DataType::Integer32: fieldValue = readPlainValue<quint32>(locOffset, descr.fieldSize); break; case DataType::Map: fieldValue = readMapValue(locOffset, descr.fieldSize); break; case DataType::SignedInteger32: fieldValue = readPlainValue<qint32>(locOffset, descr.fieldSize); break; case DataType::Integer64: fieldValue = readPlainValue<quint64>(locOffset, descr.fieldSize); break; case DataType::Integer128: qDebug() << "* Unsupported data type: Integer128"; break; case DataType::Array: fieldValue = readArrayValue(locOffset, descr.fieldSize); break; case DataType::DataCacheContainer: qDebug() << "* Unsupported data type: DataCacheContainer"; break; case DataType::EndMarker: qDebug() << "* Unsupported data type: EndMarker"; break; case DataType::Boolean: fieldValue = QVariant::fromValue(static_cast<bool>(descr.fieldSize)); break; case DataType::Float: if (descr.fieldSize == 4) fieldValue = readPlainValue<float>(locOffset, descr.fieldSize); else qDebug() << "* Invalid field size for type: Float"; break; default: qDebug() << "* Unsupported data type: Unknown"; } if (!usePointer) offset = locOffset; return fieldValue; }
asynStatus NetShrVarDriver::readInt8Array(asynUser *pasynUser, epicsInt8 *value, size_t nElements, size_t *nIn) { return readArrayValue(pasynUser, "readInt8Array", value, nElements, nIn); }