2
0
Fork 0

[plugin_core] Add env.set/add/remove/clear actions

This commit is contained in:
Thomas Porzelt 2010-09-18 13:14:28 +02:00
parent a3b7ce74af
commit f088e43f62
1 changed files with 133 additions and 0 deletions

View File

@ -898,6 +898,134 @@ static liAction* core_blank(liServer *srv, liWorker *wrk, liPlugin* p, liValue *
}
static void core_env_set_free(liServer *srv, gpointer param) {
GArray *arr = param;
UNUSED(srv);
li_value_free(g_array_index(arr, liValue*, 0));
li_pattern_free(g_array_index(arr, liPattern*, 1));
g_array_free(arr, TRUE);
}
static liHandlerResult core_handle_env_set(liVRequest *vr, gpointer param, gpointer *context) {
GArray *arr = param;
UNUSED(context);
g_string_truncate(vr->wrk->tmp_str, 0);
li_pattern_eval(vr, vr->wrk->tmp_str, g_array_index(arr, liPattern*, 1), NULL, NULL, NULL, NULL);
li_environment_set(&vr->env, GSTR_LEN(g_array_index(arr, liValue*, 0)->data.string), GSTR_LEN(vr->wrk->tmp_str));
return LI_HANDLER_GO_ON;
}
static liAction* core_env_set(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
liPattern *pattern;
UNUSED(wrk); UNUSED(p); UNUSED(userdata);
if (!val || val->type != LI_VALUE_LIST || val->data.list->len != 2
|| g_array_index(val->data.list, liValue*, 0)->type != LI_VALUE_STRING
|| g_array_index(val->data.list, liValue*, 1)->type != LI_VALUE_STRING) {
ERROR(srv, "%s", "'env.set' action requires a pair of strings as parameter");
return NULL;
}
if (NULL == (pattern = li_pattern_new(srv, g_array_index(val->data.list, liValue*, 1)->data.string->str)))
return NULL;
/* exchange second parameter (string) with the new pattern */
li_value_free(g_array_index(val->data.list, liValue*, 1));
g_array_index(val->data.list, liPattern*, 1) = pattern;
return li_action_new_function(core_handle_env_set, NULL, core_env_set_free, li_value_extract_list(val));
}
static liHandlerResult core_handle_env_add(liVRequest *vr, gpointer param, gpointer *context) {
GArray *arr = param;
UNUSED(context);
g_string_truncate(vr->wrk->tmp_str, 0);
li_pattern_eval(vr, vr->wrk->tmp_str, g_array_index(arr, liPattern*, 1), NULL, NULL, NULL, NULL);
li_environment_insert(&vr->env, GSTR_LEN(g_array_index(arr, liValue*, 0)->data.string), GSTR_LEN(vr->wrk->tmp_str));
return LI_HANDLER_GO_ON;
}
static liAction* core_env_add(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
liPattern *pattern;
UNUSED(wrk); UNUSED(p); UNUSED(userdata);
if (!val || val->type != LI_VALUE_LIST || val->data.list->len != 2
|| g_array_index(val->data.list, liValue*, 0)->type != LI_VALUE_STRING
|| g_array_index(val->data.list, liValue*, 1)->type != LI_VALUE_STRING) {
ERROR(srv, "%s", "'env.add' action requires a pair of strings as parameter");
return NULL;
}
if (NULL == (pattern = li_pattern_new(srv, g_array_index(val->data.list, liValue*, 1)->data.string->str)))
return NULL;
/* exchange second parameter (string) with the new pattern */
li_value_free(g_array_index(val->data.list, liValue*, 1));
g_array_index(val->data.list, liPattern*, 1) = pattern;
return li_action_new_function(core_handle_env_add, NULL, core_env_set_free, li_value_extract_list(val));
}
static void core_env_remove_free(liServer *srv, gpointer param) {
UNUSED(srv);
g_string_free(param, TRUE);
}
static liHandlerResult core_handle_env_remove(liVRequest *vr, gpointer param, gpointer *context) {
GString *key = param;
UNUSED(context);
li_environment_remove(&vr->env, GSTR_LEN(key));
return LI_HANDLER_GO_ON;
}
static liAction* core_env_remove(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
UNUSED(wrk); UNUSED(p); UNUSED(userdata);
if (!val || val->type != LI_VALUE_STRING) {
ERROR(srv, "%s", "'env.remove' action requires a string as parameter");
return NULL;
}
return li_action_new_function(core_handle_env_remove, NULL, core_env_remove_free, li_value_extract_string(val));
}
static liHandlerResult core_handle_env_clear(liVRequest *vr, gpointer param, gpointer *context) {
UNUSED(param); UNUSED(context);
li_environment_reset(&vr->env);
return LI_HANDLER_GO_ON;
}
static liAction* core_env_clear(liServer *srv, liWorker *wrk, liPlugin* p, liValue *val, gpointer userdata) {
UNUSED(wrk); UNUSED(p); UNUSED(userdata);
if (val) {
ERROR(srv, "%s", "'env.clear' action doesn't have parameters");
return NULL;
}
return li_action_new_function(core_handle_env_clear, NULL, NULL, NULL);
}
static gboolean core_listen(liServer *srv, liPlugin* p, liValue *val, gpointer userdata) {
GString *ipstr;
UNUSED(p); UNUSED(userdata);
@ -1693,6 +1821,11 @@ static const liPluginAction actions[] = {
{ "blank", core_blank, NULL },
{ "env.set", core_env_set, NULL },
{ "env.add", core_env_add, NULL },
{ "env.remove", core_env_remove, NULL },
{ "env.clear", core_env_clear, NULL },
{ "header.add", core_header_add, NULL },
{ "header.append", core_header_append, NULL },
{ "header.overwrite", core_header_overwrite, NULL },