summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoshan Pius <rpius@google.com>2015-12-07 14:59:42 -0800
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-12-08 21:02:16 +0000
commit0051480afb9f6e034b55b2d96575bf611d94992a (patch)
treea7ac4d99c3bf50c0e4b624aaebd304b777b40c07
parent84f2591b9e12028fbf3d928770b88edf32dfaa63 (diff)
downloadshill-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.cc113
-rw-r--r--test-rpc-proxy/proxy_util.h31
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;