diff --git a/src/Network/dds_props.cxx b/src/Network/dds_props.cxx index 62ce7fa68..72513f825 100644 --- a/src/Network/dds_props.cxx +++ b/src/Network/dds_props.cxx @@ -25,6 +25,7 @@ # include #endif +#include #include #include #include @@ -80,29 +81,42 @@ bool FGDDSProps::process() { { if (prop.id == FG_DDS_PROP_REQUEST) { - auto it = by_path.find(prop.val._u.String); - if (it == by_path.end()) + if (prop.type == FG_DDS_STRING) { - SGPropertyNode_ptr props = globals->get_props(); - SGPropertyNode_ptr p = props->getNode(prop.val._u.String); - if (p) + const char *path = prop.val._u.String; + auto it = path_list.find(path); + if (it == path_list.end()) { - prop.id = by_id.size(); - by_id[prop.id] = p; - by_path[prop.val._u.String] = p; + SGPropertyNode_ptr props = globals->get_props(); + SGPropertyNode_ptr p = props->getNode(path); + if (p) + { + prop.id = prop_list.size(); + + try { + prop_list.push_back(p); + path_list[prop.val._u.String] = prop.id; + + } catch (sg_exception&) { + SG_LOG(SG_IO, SG_ALERT, "out of memory"); + } + } + setProp(prop, p); + } + else + { + prop.id = std::distance(path_list.begin(), it); + setProp(prop, prop_list[prop.id]); } - setProp(prop, p); } else { - prop.id = std::distance(by_path.begin(), it); - setProp(prop, it->second); + SG_LOG(SG_IO, SG_DEBUG, "Recieved a mangled DDS sample."); + setProp(prop, nullptr); } } - else - { - SGPropertyNode_ptr p = by_id[prop.id]; - setProp(prop, p); + else { + setProp(prop, prop_list[prop.id]); } // send the response. diff --git a/src/Network/dds_props.hxx b/src/Network/dds_props.hxx index 0c874d1d0..fa6bdad46 100644 --- a/src/Network/dds_props.hxx +++ b/src/Network/dds_props.hxx @@ -36,8 +36,8 @@ class FGDDSProps : public FGProtocol { - std::map by_id; - std::map by_path; + simgear::PropertyList prop_list; + std::map path_list; static void setProp(FG_DDS_PROP& prop, SGPropertyNode_ptr p);