Serj Kalichev пре 1 година
родитељ
комит
292e3bc913
6 измењених фајлова са 125 додато и 6 уклоњено
  1. 1 1
      src/pline.c
  2. 13 0
      src/pline.h
  3. 16 2
      src/plugin.c
  4. 67 0
      src/syms.c
  5. 5 0
      src/syms.h
  6. 23 3
      xml/sysrepo.xml

+ 1 - 1
src/pline.c

@@ -130,7 +130,7 @@ static pexpr_t *pline_add_expr(pline_t *pline, const char *xpath)
 }
 
 
-static pexpr_t *pline_current_expr(pline_t *pline)
+pexpr_t *pline_current_expr(pline_t *pline)
 {
 	assert(pline);
 

+ 13 - 0
src/pline.h

@@ -38,6 +38,9 @@ typedef enum {
 		PAT_LEAF_EMPTY |
 		PAT_LEAFLIST_VALUE,
 
+	PT_NOT_SET =
+		0,
+
 	PT_DEL =
 		PAT_CONTAINER |
 		PAT_LIST_KEY |
@@ -46,10 +49,19 @@ typedef enum {
 		PAT_LEAFLIST |
 		PAT_LEAFLIST_VALUE,
 
+	PT_NOT_DEL =
+		PAT_LEAF_VALUE,
+
 	PT_EDIT =
 		PAT_CONTAINER |
 		PAT_LIST_KEY,
 
+	PT_NOT_EDIT =
+		PAT_LEAF |
+		PAT_LEAF_VALUE |
+		PAT_LEAFLIST |
+		PAT_LEAFLIST_VALUE,
+
 } pt_e;
 
 
@@ -90,6 +102,7 @@ C_DECL_BEGIN
 
 pline_t *pline_new(sr_session_ctx_t *sess);
 pline_t *pline_parse(sr_session_ctx_t *sess, faux_argv_t *argv, uint32_t flags);
+pexpr_t *pline_current_expr(pline_t *pline);
 
 void pline_free(pline_t *pline);
 

+ 16 - 2
src/plugin.c

@@ -33,8 +33,22 @@ int kplugin_sysrepo_init(kcontext_t *context)
 	assert(plugin);
 
 	// Symbols
-	kplugin_add_syms(plugin, ksym_new("srp_compl", srp_compl));
-	kplugin_add_syms(plugin, ksym_new("srp_help", srp_help));
+
+	// Types
+	kplugin_add_syms(plugin, ksym_new_ext("PLINE_SET", srp_PLINE_SET,
+		KSYM_USERDEFINED_PERMANENT, KSYM_UNSYNC));
+	kplugin_add_syms(plugin, ksym_new_ext("PLINE_DEL", srp_PLINE_DEL,
+		KSYM_USERDEFINED_PERMANENT, KSYM_UNSYNC));
+	kplugin_add_syms(plugin, ksym_new_ext("PLINE_EDIT", srp_PLINE_EDIT,
+		KSYM_USERDEFINED_PERMANENT, KSYM_UNSYNC));
+
+	// Completion/Help
+	kplugin_add_syms(plugin, ksym_new_ext("srp_compl", srp_compl,
+		KSYM_USERDEFINED_PERMANENT, KSYM_UNSYNC));
+	kplugin_add_syms(plugin, ksym_new_ext("srp_help", srp_help,
+		KSYM_USERDEFINED_PERMANENT, KSYM_UNSYNC));
+
+	// Operations
 	kplugin_add_syms(plugin, ksym_new("srp_set", srp_set));
 
 	return 0;

+ 67 - 0
src/syms.c

@@ -91,6 +91,73 @@ int srp_help(kcontext_t *context)
 }
 
 
+static int srp_check_type(kcontext_t *context,
+	pt_e not_accepted_nodes,
+	size_t max_expr_num)
+{
+	faux_argv_t *args = NULL;
+	pline_t *pline = NULL;
+	sr_conn_ctx_t *conn = NULL;
+	sr_session_ctx_t *sess = NULL;
+	const char *entry_name = NULL;
+	const char *value = NULL;
+	pexpr_t *expr = NULL;
+	size_t expr_num = 0;
+
+	assert(context);
+
+	if (sr_connect(SR_CONN_DEFAULT, &conn))
+		return -1;
+	if (sr_session_start(conn, SR_DS_RUNNING, &sess)) {
+		sr_disconnect(conn);
+		return -1;
+	}
+
+	entry_name = kentry_name(kcontext_candidate_entry(context));
+	value = kcontext_candidate_value(context);
+	args = param2argv(kcontext_parent_pargv(context), entry_name);
+	if (value)
+		faux_argv_add(args, value);
+	pline = pline_parse(sess, args, 0);
+	faux_argv_free(args);
+
+	if (pline->invalid)
+		return -1;
+	expr_num = faux_list_len(pline->exprs);
+	if (expr_num < 1)
+		return -1;
+	if ((max_expr_num > 0) &&  // '0' means unlimited
+		(expr_num > max_expr_num))
+		return -1;
+	expr = pline_current_expr(pline);
+	if (expr->pat & not_accepted_nodes)
+		return -1;
+
+	pline_free(pline);
+	sr_disconnect(conn);
+
+	return 0;
+}
+
+
+int srp_PLINE_SET(kcontext_t *context)
+{
+	return srp_check_type(context, PT_NOT_SET, 0);
+}
+
+
+int srp_PLINE_DEL(kcontext_t *context)
+{
+	return srp_check_type(context, PT_NOT_DEL, 1);
+}
+
+
+int srp_PLINE_EDIT(kcontext_t *context)
+{
+	return srp_check_type(context, PT_NOT_EDIT, 1);
+}
+
+
 int srp_set(kcontext_t *context)
 {
 	int ret = 0;

+ 5 - 0
src/syms.h

@@ -11,8 +11,13 @@
 
 C_DECL_BEGIN
 
+int srp_PLINE_SET(kcontext_t *context);
+int srp_PLINE_DEL(kcontext_t *context);
+int srp_PLINE_EDIT(kcontext_t *context);
+
 int srp_compl(kcontext_t *context);
 int srp_help(kcontext_t *context);
+
 int srp_set(kcontext_t *context);
 
 C_DECL_END

+ 23 - 3
xml/sysrepo.xml

@@ -7,14 +7,34 @@
 <PLUGIN name="sysrepo"/>
 
 
-<ENTRY name="PLINE" purpose="ptype">
+<ENTRY name="PLINE_SET" purpose="ptype">
 	<ENTRY name="completion" purpose="completion">
 		<ACTION sym="srp_compl@sysrepo"/>
 	</ENTRY>
 	<ENTRY name="help" purpose="help">
 		<ACTION sym="srp_help@sysrepo"/>
 	</ENTRY>
-	<ACTION sym="STRING"/>
+	<ACTION sym="PLINE_SET@sysrepo"/>
+</ENTRY>
+
+<ENTRY name="PLINE_DEL" purpose="ptype">
+	<ENTRY name="completion" purpose="completion">
+		<ACTION sym="srp_compl@sysrepo"/>
+	</ENTRY>
+	<ENTRY name="help" purpose="help">
+		<ACTION sym="srp_help@sysrepo"/>
+	</ENTRY>
+	<ACTION sym="PLINE_DEL@sysrepo"/>
+</ENTRY>
+
+<ENTRY name="PLINE_EDIT" purpose="ptype">
+	<ENTRY name="completion" purpose="completion">
+		<ACTION sym="srp_compl@sysrepo"/>
+	</ENTRY>
+	<ENTRY name="help" purpose="help">
+		<ACTION sym="srp_help@sysrepo"/>
+	</ENTRY>
+	<ACTION sym="PLINE_EDIT@sysrepo"/>
 </ENTRY>
 
 
@@ -31,7 +51,7 @@
 <ENTRY name="set" help="Clear settings" mode="sequence">
 	<ENTRY name="COMMAND" purpose="ptype" ref="/COMMAND"/>
 	<ENTRY name="path" max="100">
-		<ENTRY name="PLINE" purpose="ptype" ref="/PLINE"/>
+		<ENTRY name="PLINE_SET" purpose="ptype" ref="/PLINE_SET"/>
 	</ENTRY>
 	<ACTION sym="srp_set@sysrepo"/>
 </ENTRY>