diff options
author | Roshan Pius <rpius@google.com> | 2015-12-07 14:59:42 -0800 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-12-08 21:02:16 +0000 |
commit | 0051480afb9f6e034b55b2d96575bf611d94992a (patch) | |
tree | a7ac4d99c3bf50c0e4b624aaebd304b777b40c07 | |
parent | 84f2591b9e12028fbf3d928770b88edf32dfaa63 (diff) | |
download | shill-0051480afb9f6e034b55b2d96575bf611d94992a.tar.gz |
shill-test-proxy: Utils to parse XML RPC struct
There are a few composite data structures/objects exchanged between the
Python XML RPC client and the native XML RPC server.
Add a bunch of utility functions to extract the values from members of
these structures from the incoming XmlRpcValue.
Bug: 26069117
Change-Id: I6e07a2cbde692600f2332583a725563ad6e657ad
TEST: mmm system/connectivity/shill
-rw-r--r-- | test-rpc-proxy/proxy_util.cc | 113 | ||||
-rw-r--r-- | test-rpc-proxy/proxy_util.h | 31 |
2 files changed, 144 insertions, 0 deletions
diff --git a/test-rpc-proxy/proxy_util.cc b/test-rpc-proxy/proxy_util.cc index 2269825d..f2d12387 100644 --- a/test-rpc-proxy/proxy_util.cc +++ b/test-rpc-proxy/proxy_util.cc @@ -107,6 +107,74 @@ void GetBrilloAnyVectorFromXmlRpcArray( << (*xml_rpc_value_in)[0].getType(); } } + +template<typename ValueType> XmlRpc::XmlRpcValue::Type GetXmlRpcType(); +template<> XmlRpc::XmlRpcValue::Type GetXmlRpcType<bool>() { + return XmlRpc::XmlRpcValue::TypeBoolean; +} +template<> XmlRpc::XmlRpcValue::Type GetXmlRpcType<int>() { + return XmlRpc::XmlRpcValue::TypeInt; +} +template<> XmlRpc::XmlRpcValue::Type GetXmlRpcType<double>() { + return XmlRpc::XmlRpcValue::TypeDouble; +} +template<> XmlRpc::XmlRpcValue::Type GetXmlRpcType<std::string>() { + return XmlRpc::XmlRpcValue::TypeString; +} + +template<typename ValueType> bool IsMemberValuePresent( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name) { + if (xml_rpc_value_in->hasMember(member_name) && + ((*xml_rpc_value_in)[member_name].getType() == + GetXmlRpcType<ValueType>())) { + return true; + } + return false; +} + +template<typename ValueType> bool GetValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + ValueType default_value, + ValueType* value_out) { + if (!IsMemberValuePresent<ValueType>(xml_rpc_value_in, member_name)) { + *value_out = default_value; + return false; + } + *value_out = ValueType((*xml_rpc_value_in)[member_name]); + return true; +} + +template<typename ElementType> bool IsMemberVectorPresent( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name) { + if (xml_rpc_value_in->hasMember(member_name) && + ((*xml_rpc_value_in)[member_name].getType() == + XmlRpc::XmlRpcValue::TypeArray) && + ((*xml_rpc_value_in)[member_name][0].getType() == + GetXmlRpcType<ElementType>())) { + return true; + } + return false; +} + +template<typename ElementType> bool GetVectorFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + std::vector<ElementType> default_value, + std::vector<ElementType>* value_out) { + if (!IsMemberVectorPresent<ElementType>(xml_rpc_value_in, member_name)) { + *value_out = default_value; + return false; + } + XmlRpc::XmlRpcValue& xml_rpc_member_array = (*xml_rpc_value_in)[member_name]; + int array_size = xml_rpc_member_array.size(); + for (int array_pos = 0; array_pos < array_size; ++array_pos) { + value_out->push_back(ElementType(xml_rpc_member_array[array_pos])); + } + return true; +} } // namespace void GetXmlRpcValueFromBrilloAnyValue( @@ -214,3 +282,48 @@ void GetBrilloAnyValueFromXmlRpcValue( LOG(FATAL) << __func__ << ". Unhandled type: " << xml_rpc_value_in->getType(); } } + +bool GetBoolValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + bool default_value, + bool* value_out) { + return GetValueFromXmlRpcValueStructMember( + xml_rpc_value_in, member_name, default_value, value_out); +} + +bool GetIntValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + int default_value, + int* value_out) { + return GetValueFromXmlRpcValueStructMember( + xml_rpc_value_in, member_name, default_value, value_out); +} + +bool GetDoubleValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + double default_value, + double* value_out){ + return GetValueFromXmlRpcValueStructMember( + xml_rpc_value_in, member_name, default_value, value_out); +} + +bool GetStringValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + const std::string& default_value, + std::string* value_out) { + return GetValueFromXmlRpcValueStructMember( + xml_rpc_value_in, member_name, default_value, value_out); +} + +bool GetStringVectorFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + const std::vector<std::string>& default_value, + std::vector<std::string>* value_out) { + return GetVectorFromXmlRpcValueStructMember( + xml_rpc_value_in, member_name, default_value, value_out); +} diff --git a/test-rpc-proxy/proxy_util.h b/test-rpc-proxy/proxy_util.h index 9c24854c..733514d2 100644 --- a/test-rpc-proxy/proxy_util.h +++ b/test-rpc-proxy/proxy_util.h @@ -17,6 +17,9 @@ #ifndef PROXY_UTIL_H #define PROXY_UTIL_H +#include <string> +#include <vector> + #include <XmlRpcValue.h> #include <brillo/any.h> @@ -32,6 +35,34 @@ void GetXmlRpcValueFromBrilloAnyValue( void GetBrilloAnyValueFromXmlRpcValue( XmlRpc::XmlRpcValue* xml_rpc_value_in, brillo::Any* any_value_out); +// Functions to access members of structs sent over XmlRpc and need to be converted +// to corresponding objects. Returns |true| if the value is found in the incoming data +// or |false| if the value was taken from the default supplied. +bool GetBoolValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + bool default_value, + bool* value_out); +bool GetIntValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + int default_value, + int* value_out); +bool GetDoubleValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + double default_value, + double* value_out); +bool GetStringValueFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + const std::string& default_value, + std::string* value_out); +bool GetStringVectorFromXmlRpcValueStructMember( + XmlRpc::XmlRpcValue* xml_rpc_value_in, + const std::string& member_name, + const std::vector<std::string>& default_value, + std::vector<std::string>* value_out); inline long GetMillisecondsFromSeconds(int time_seconds) { return time_seconds * 1000; |