Mercurial > hg > orthanc
diff Core/DicomNetworking/RemoteModalityParameters.cpp @ 2871:6eebc2eb3168
refactoring serialization of RemoteModalityParameters
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 09 Oct 2018 12:51:20 +0200 |
parents | 7133ad478eea |
children | 9d08edde614b |
line wrap: on
line diff
--- a/Core/DicomNetworking/RemoteModalityParameters.cpp Mon Oct 08 17:36:54 2018 +0200 +++ b/Core/DicomNetworking/RemoteModalityParameters.cpp Tue Oct 09 12:51:20 2018 +0200 @@ -41,6 +41,13 @@ #include <boost/lexical_cast.hpp> #include <stdexcept> + +static const char* KEY_AET = "AET"; +static const char* KEY_MANUFACTURER = "Manufacturer"; +static const char* KEY_PORT = "Port"; +static const char* KEY_HOST = "Host"; + + namespace Orthanc { RemoteModalityParameters::RemoteModalityParameters() : @@ -63,89 +70,144 @@ } - void RemoteModalityParameters::FromJson(const Json::Value& modality) + static uint16_t ReadPortNumber(const Json::Value& value) { - if (!modality.isArray() || - (modality.size() != 3 && modality.size() != 4)) + int tmp; + + switch (value.type()) + { + case Json::intValue: + case Json::uintValue: + tmp = value.asInt(); + break; + + case Json::stringValue: + try + { + tmp = boost::lexical_cast<int>(value.asString()); + } + catch (boost::bad_lexical_cast&) + { + throw OrthancException(ErrorCode_BadFileFormat); + } + break; + + default: + throw OrthancException(ErrorCode_BadFileFormat); + } + + if (tmp <= 0 || tmp >= 65535) + { + LOG(ERROR) << "A TCP port number must be in range [1..65534], but found: " << tmp; + throw OrthancException(ErrorCode_ParameterOutOfRange); + } + else + { + return static_cast<uint16_t>(tmp); + } + } + + + void RemoteModalityParameters::UnserializeArray(const Json::Value& serialized) + { + assert(serialized.type() == Json::arrayValue); + + if ((serialized.size() != 3 && + serialized.size() != 4) || + serialized[0].type() != Json::stringValue || + serialized[1].type() != Json::stringValue || + (serialized.size() == 4 && + serialized[3].type() != Json::stringValue)) { throw OrthancException(ErrorCode_BadFileFormat); } - SetApplicationEntityTitle(modality.get(0u, "").asString()); - SetHost(modality.get(1u, "").asString()); - - const Json::Value& portValue = modality.get(2u, ""); - try - { - int tmp = portValue.asInt(); + aet_ = serialized[0].asString(); + host_ = serialized[1].asString(); + port_ = ReadPortNumber(serialized[2]); - if (tmp <= 0 || tmp >= 65535) - { - throw OrthancException(ErrorCode_ParameterOutOfRange); - } - - SetPortNumber(static_cast<uint16_t>(tmp)); - } - catch (std::runtime_error& /* error inside JsonCpp */) + if (serialized.size() == 4) { - try - { - SetPortNumber(boost::lexical_cast<uint16_t>(portValue.asString())); - } - catch (boost::bad_lexical_cast&) - { - throw OrthancException(ErrorCode_BadFileFormat); - } - } - - if (modality.size() == 4) - { - const std::string& manufacturer = modality.get(3u, "").asString(); - - try - { - SetManufacturer(manufacturer); - } - catch (OrthancException&) - { - LOG(ERROR) << "Unknown modality manufacturer: \"" << manufacturer << "\""; - throw; - } + manufacturer_ = StringToModalityManufacturer(serialized[3].asString()); } else { - SetManufacturer(ModalityManufacturer_Generic); + manufacturer_ = ModalityManufacturer_Generic; } } - void RemoteModalityParameters::ToJson(Json::Value& value) const + void RemoteModalityParameters::UnserializeObject(const Json::Value& serialized) { - value = Json::arrayValue; - value.append(GetApplicationEntityTitle()); - value.append(GetHost()); - value.append(GetPortNumber()); - value.append(EnumerationToString(GetManufacturer())); + assert(serialized.type() == Json::objectValue); + + aet_ = SerializationToolbox::ReadString(serialized, KEY_AET); + host_ = SerializationToolbox::ReadString(serialized, KEY_HOST); + + if (serialized.isMember(KEY_PORT)) + { + port_ = ReadPortNumber(serialized[KEY_PORT]); + } + else + { + throw OrthancException(ErrorCode_BadFileFormat); + } + + if (serialized.isMember(KEY_MANUFACTURER)) + { + manufacturer_ = StringToModalityManufacturer + (SerializationToolbox::ReadString(serialized, KEY_MANUFACTURER)); + } + else + { + manufacturer_ = ModalityManufacturer_Generic; + } + } + + + bool RemoteModalityParameters::IsAdvancedFormatNeeded() const + { + return false; // TODO } - void RemoteModalityParameters::Serialize(Json::Value& target) const + void RemoteModalityParameters::Serialize(Json::Value& target, + bool forceAdvancedFormat) const { - target = Json::objectValue; - target["AET"] = aet_; - target["Host"] = host_; - target["Port"] = port_; - target["Manufacturer"] = EnumerationToString(manufacturer_); + if (forceAdvancedFormat || + IsAdvancedFormatNeeded()) + { + target = Json::objectValue; + target[KEY_AET] = aet_; + target[KEY_HOST] = host_; + target[KEY_PORT] = port_; + target[KEY_MANUFACTURER] = EnumerationToString(manufacturer_); + } + else + { + target = Json::arrayValue; + target.append(GetApplicationEntityTitle()); + target.append(GetHost()); + target.append(GetPortNumber()); + target.append(EnumerationToString(GetManufacturer())); + } } - RemoteModalityParameters::RemoteModalityParameters(const Json::Value& serialized) + void RemoteModalityParameters::Unserialize(const Json::Value& serialized) { - aet_ = SerializationToolbox::ReadString(serialized, "AET"); - host_ = SerializationToolbox::ReadString(serialized, "Host"); - port_ = static_cast<uint16_t> - (SerializationToolbox::ReadUnsignedInteger(serialized, "Port")); - manufacturer_ = StringToModalityManufacturer - (SerializationToolbox::ReadString(serialized, "Manufacturer")); + switch (serialized.type()) + { + case Json::objectValue: + UnserializeObject(serialized); + break; + + case Json::arrayValue: + UnserializeArray(serialized); + break; + + default: + throw OrthancException(ErrorCode_BadFileFormat); + } } }