libnetconf C++: add support for user RPCs

The API is rather straightforward, it takes a string. I experimented
with consuming a libyang data node instead, but this kept failing
because I was naively creating nodes from a different libyang context,
and that always resulted in an error.

Now, given that the edit-config method already takes a string, let's
make our lives easier and work on this via strings.

Change-Id: I35467dece535df41e223013e32500596d272560c
diff --git a/src/netconf-client.cpp b/src/netconf-client.cpp
index a761bb4..8f0e2ec 100644
--- a/src/netconf-client.cpp
+++ b/src/netconf-client.cpp
@@ -365,6 +365,21 @@
     impl::do_rpc_ok(this, std::move(rpc));
 }
 
+std::shared_ptr<libyang::Data_Node> Session::rpc(const std::string& xmlData)
+{
+    auto rpc = impl::guarded(nc_rpc_act_generic_xml(xmlData.c_str(), NC_PARAMTYPE_CONST));
+    if (!rpc) {
+        throw std::runtime_error("Cannot create generic RPC");
+    }
+    auto reply = impl::do_rpc_data_or_ok(this, std::move(rpc));
+    if (reply) {
+        auto dataNode = libyang::create_new_Data_Node((*reply)->data);
+        return dataNode->dup_withsiblings(1);
+    } else {
+        return nullptr;
+    }
+}
+
 ReportedError::ReportedError(const std::string& what)
     : std::runtime_error(what)
 {