mod_netconf: url-capability edit-config

optional json parameter 'source' can be set to 'config' (default value
if missing) or to 'url'

add json parameters:
'uri-source' (needed when source is 'url')

- refs #1362
diff --git a/src/README b/src/README
index 71b62db..936ca83 100644
--- a/src/README
+++ b/src/README
@@ -99,8 +99,10 @@
 key: config (string), value: editing configuration data according to NETCONF RFC
 
 Optional:
+key: source (string), value: config|url, default value: config
 key: default-operation (string), value: merge|replace|none
 key: error-option (string), value: stop-on-error|continue-on-error|rollback-on-error 
+key: uri-source (string), required when "source" is "url", value: uri
 
 6) NETCONF <copy-config>
 key: type (int), value: 9
diff --git a/src/mod_netconf.c b/src/mod_netconf.c
index 8e5b6bc..bd5d8f5 100644
--- a/src/mod_netconf.c
+++ b/src/mod_netconf.c
@@ -763,14 +763,13 @@
 	return res;
 }
 
-static json_object *netconf_editconfig(const char* session_key, NC_DATASTORE target, NC_EDIT_DEFOP_TYPE defop, NC_EDIT_ERROPT_TYPE erropt, NC_EDIT_TESTOPT_TYPE testopt, const char* config)
+static json_object *netconf_editconfig(const char* session_key, NC_DATASTORE source, NC_DATASTORE target, NC_EDIT_DEFOP_TYPE defop, NC_EDIT_ERROPT_TYPE erropt, NC_EDIT_TESTOPT_TYPE testopt, const char* config_or_url)
 {
 	nc_rpc* rpc;
 	json_object *res = NULL;
 
 	/* create requests */
-	/* TODO source NC_DATASTORE_CONFIG / NC_DATASTORE_URL  */
-	rpc = nc_rpc_editconfig(target, NC_DATASTORE_CONFIG, defop, erropt, testopt, config);
+	rpc = nc_rpc_editconfig(target, source, defop, erropt, testopt, config_or_url);
 	if (rpc == NULL) {
 		DEBUG("mod_netconf: creating rpc request failed");
 		return create_error("Internal: Creating rpc request failed");
@@ -984,6 +983,8 @@
 		return NC_DATASTORE_CANDIDATE;
 	} else if (strcmp(ds, "url") == 0) {
 		return NC_DATASTORE_URL;
+	} else if (strcmp(ds, "config") == 0) {
+		return NC_DATASTORE_CONFIG;
 	}
 	return -1;
 }
@@ -1229,17 +1230,26 @@
 	}
 	if ((source = json_object_get_string(json_object_object_get(request, "source"))) != NULL) {
 		ds_type_s = parse_datastore(source);
+	} else {
+		/* source is optional, default value is config */
+		ds_type_s = NC_DATASTORE_CONFIG;
 	}
 	if (ds_type_t == -1) {
 		return create_error("Invalid target repository type requested.");
 	}
-
-	config = json_object_get_string(json_object_object_get(request, "config"));
-	if (config == NULL) {
-		return create_error("Invalid config data parameter.");
+	if (ds_type_s == NC_DATASTORE_CONFIG) {
+		config = json_object_get_string(json_object_object_get(request, "config"));
+		if (config == NULL) {
+			return create_error("Invalid config data parameter.");
+		}
+	} else if (ds_type_s == NC_DATASTORE_URL){
+		config = json_object_get_string(json_object_object_get(request, "uri-source"));
+		if (config == NULL) {
+			config = "";
+		}
 	}
 
-	reply = netconf_editconfig(session_key, ds_type_t, defop_type, erropt_type, NC_EDIT_TESTOPT_TESTSET, config);
+	reply = netconf_editconfig(session_key, ds_type_s, ds_type_t, defop_type, erropt_type, NC_EDIT_TESTOPT_TESTSET, config);
 	if (reply == NULL) {
 		if (err_reply != NULL) {
 			/* use filled err_reply from libnetconf's callback */