Skip to content
Snippets Groups Projects
dmcwmp.c 81.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    	if (*(dmctx->in_param) == '\0')
    		dmctx->in_param = buf;
    
    	if (*(dmctx->in_param + strlen(dmctx->in_param) - 1) != dm_delim)
    		return FAULT_UPNP_701;
    
    	dmctx->inparam_isparam = 0;
    	dmctx->findparam = 0;
    	dmctx->stop = 0;
    	dmctx->checkobj = plugin_upnp_obj_depth_match;
    	dmctx->checkleaf = plugin_upnp_skip_leafs;
    	dmctx->method_obj = mobj_upnp_get_instance_numbers;
    	dmctx->method_param = mparam_upnp_get_instance_numbers;
    	err = dm_browse(dmctx, &node, root, NULL, NULL);
    	if (dmctx->findparam)
    		return 0;
    	else
    		return (upnp_map_cwmp_fault(err));
    }
    
    static int mparam_upnp_get_instance_numbers(DMPARAM_ARGS)
    {
    	return 0;
    }
    
    static int mobj_upnp_get_instance_numbers(DMOBJECT_ARGS)
    {
    	char *refparam;
    	refparam = node->current_object;
    	if (!node->is_instanceobj || !node->matched)
    		return FAULT_UPNP_703;
    	if (*(dmctx->all_instances)) {
    		strcat(dmctx->all_instances, ",");
    	}
    	strcat(dmctx->all_instances, instance);
    	return 0;
    }
    
    /************************************
     * upnp load tracked parameter values
     ***********************************/
    int dm_entry_upnp_tracked_parameters(struct dmctx *dmctx)
    {
    	int err;
    	DMOBJ *root = dmctx->dm_entryobj;
    	DMNODE node = { .current_object = "" };
    
    	dmctx->method_obj = enabled_tracked_param_check_obj;
    	dmctx->method_param = enabled_tracked_param_check_param;
    	dmctx->checkobj = NULL ;
    	dmctx->checkleaf = NULL;
    	err = dm_browse(dmctx, &node, root, NULL, NULL);
    	return err;
    }
    
    static int enabled_tracked_param_check_obj(DMOBJECT_ARGS)
    {
    	char *refparam;
    	char *all_instances;
    	char *version = "0";
    	struct uci_section *s;
    	int isevnt, isversion;
    
    	refparam = node->current_object;
    	if (!node->obj->browseinstobj || node->is_instanceobj)
    		return FAULT_UPNP_703;
    
    	isevnt = upnp_get_parameter_onchange(dmctx, refparam, "eventchange");
    	isversion = get_parameter_version(dmctx, refparam, &version, &s);
    	if (isevnt || isversion)
    		all_instances = dm_entry_get_all_instance_numbers(dmctx, refparam);
    
    	if (isevnt) {
    		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onevent, refparam, "1", all_instances, 1);
    	}
    	if (isversion) {
    		add_list_upnp_param_track(dmctx, &list_upnp_enabled_version, refparam, (s ? section_name(s) : NULL), all_instances, 1);
    	}
    	return 0;
    }
    
    static int enabled_tracked_param_check_param(DMPARAM_ARGS)
    {
    	char *refparam;
    	char *value = "";
    	char *version = "0";
    	struct uci_section *s;
    	int isalrm, isevnt, isversion;
    
    	dmastrcat(&refparam, node->current_object, lastname);
    	isalrm = upnp_get_parameter_onchange(dmctx, refparam, "alarmchange");
    	isevnt = upnp_get_parameter_onchange(dmctx, refparam, "eventchange");
    	isversion = get_parameter_version(dmctx, refparam, &version, &s);
    
    	if (isalrm || isevnt || isversion)
    		(get_cmd)(refparam, dmctx, data, instance, &value);
    	if (isalrm) {
    		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onalarm, refparam, "1", value, 0);
    	}
    	if (isevnt) {
    		add_list_upnp_param_track(dmctx, &list_upnp_enabled_onevent, refparam, "1", value, 0);
    	}
    	if (isversion) {
    		add_list_upnp_param_track(dmctx, &list_upnp_enabled_version, refparam, (s ? section_name(s) : NULL), value, 0);
    	}
    
    	dmfree(refparam);
    	return 0;
    }
    #endif
    
    /********************/
    
    int dm_add_end_session(struct dmctx *ctx, void(*function)(struct execute_end_session *), int action, void *data)
    {
    	struct execute_end_session *execute_end_session;
    
    	execute_end_session = calloc (1,sizeof(struct execute_end_session));
    	if (execute_end_session == NULL)
    	{
    		return -1;
    	}
    	execute_end_session->action = action;
    	execute_end_session->data = data;
    	execute_end_session->function = function;
    	execute_end_session->amd_version = ctx->amd_version;
    	execute_end_session->instance_mode = ctx->instance_mode;
    	execute_end_session->dm_type = ctx->dm_type;
    	list_add_tail (&(execute_end_session->list), &(list_execute_end_session));
    
    	return 0;
    }
    
    int cwmp_free_dm_end_session(struct execute_end_session *execute_end_session)
    {
    	if(execute_end_session != NULL)
    	{
    		FREE(execute_end_session);
    	}
    	return 0;
    }
    
    int apply_end_session()
    {
    	struct execute_end_session *p, *q;
    	list_for_each_entry_safe(p, q, &(list_execute_end_session), list) {
    		p->function(p);
    		list_del(&(p->list));
    		cwmp_free_dm_end_session(p);
    	}
    	return 0;
    }
    
    void cwmp_set_end_session (unsigned int flag)
    {
    	end_session_flag |= flag;
    }
    
    char *dm_print_path(char *fpath, ...)
    {
    	static char pathbuf[512] = "";
    	va_list vl;
    
    	va_start(vl, fpath);
    	vsprintf(pathbuf, fpath, vl);
    	va_end(vl);
    	return pathbuf;
    }