/**
 * \file udi_meta_mgmt.h
 */
#ifndef _UDI_META_MGMT_H_
#define _UDI_META_MGMT_H_

typedef struct udi_mgmt_ops_s	udi_mgmt_ops_t;
typedef struct udi_mgmt_cb_s	udi_mgmt_cb_t;
typedef struct udi_usage_cb_s	udi_usage_cb_t;
typedef struct udi_filter_element_s	udi_filter_element_t;
typedef struct udi_enumerate_cb_s	udi_enumerate_cb_t;

/**
 * \name Specify Usage
 * \{
 */
typedef void udi_usage_ind_op_t(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
/* Values for resource_level */
#define UDI_RESOURCES_CRITICAL     1
#define UDI_RESOURCES_LOW          2
#define UDI_RESOURCES_NORMAL       3
#define UDI_RESOURCES_PLENTIFUL    4
/* Proxy */
extern void	udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level);
/**
 * \}
 */

typedef void udi_usage_res_op_t(udi_usage_cb_t *cb);

/**
 * \name Enumerate this driver
 * \{
 */
typedef void udi_enumerate_req_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
/* Values for enumeration_level */
#define UDI_ENUMERATE_START           1
#define UDI_ENUMERATE_START_RESCAN    2
#define UDI_ENUMERATE_NEXT            3
#define UDI_ENUMERATE_NEW             4
#define UDI_ENUMERATE_DIRECTED        5
#define UDI_ENUMERATE_RELEASE         6
/* Proxy */
extern void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level);
/**
 * \}
 */

/**
 * \name Enumeration Acknowlagement
 * \{
 */
typedef void udi_enumerate_ack_op_t(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx);
/* Values for enumeration_result */
#define UDI_ENUMERATE_OK             0
#define UDI_ENUMERATE_LEAF           1
#define UDI_ENUMERATE_DONE           2
#define UDI_ENUMERATE_RESCAN         3
#define UDI_ENUMERATE_REMOVED        4
#define UDI_ENUMERATE_REMOVED_SELF   5
#define UDI_ENUMERATE_RELEASED       6
#define UDI_ENUMERATE_FAILED         255
/**
 * \}
 */

/**
 * \name 
 * \{
 */
typedef void udi_devmgmt_req_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID);

typedef void udi_devmgmt_ack_op_t(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
/**
 * \}
 */
typedef void udi_final_cleanup_req_op_t(udi_mgmt_cb_t *cb);
typedef void udi_final_cleanup_ack_op_t(udi_mgmt_cb_t *cb);





struct udi_mgmt_ops_s
{
	udi_usage_ind_op_t	*usage_ind_op;
	udi_enumerate_req_op_t	*enumerate_req_op;
	udi_devmgmt_req_op_t	*devmgmt_req_op;
	udi_final_cleanup_req_op_t	*final_cleanup_req_op;
};

struct udi_mgmt_cb_s
{
	udi_cb_t	gcb;
};

struct udi_usage_cb_s
{
	udi_cb_t	gcb;
	udi_trevent_t	trace_mask;
	udi_index_t	meta_idx;
};


struct udi_filter_element_s
{
     char	attr_name[UDI_MAX_ATTR_NAMELEN];
     udi_ubit8_t	attr_min[UDI_MAX_ATTR_SIZE];
     udi_ubit8_t	attr_min_len;
     udi_ubit8_t	attr_max[UDI_MAX_ATTR_SIZE];
     udi_ubit8_t	attr_max_len;
     udi_instance_attr_type_t	attr_type;
     udi_ubit32_t	attr_stride;
};
struct udi_enumerate_cb_s
{
     udi_cb_t	gcb;
     udi_ubit32_t	child_ID;
     void	*child_data;
     udi_instance_attr_list_t	*attr_list;
     udi_ubit8_t	attr_valid_length;
     const udi_filter_element_t	*filter_list;
     udi_ubit8_t	filter_list_length;
     udi_ubit8_t	parent_ID;
};
/* Special parent_ID filter values */
#define UDI_ANY_PARENT_ID	0

/**
 * \brief 
 */
extern void	udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID );
/**
 * \brief Values for ::udi_devmgmt_req \a mgmt_op
 */
enum eDMGMT
{
	UDI_DMGMT_PREPARE_TO_SUSPEND = 1,
	UDI_DMGMT_SUSPEND,
	UDI_DMGMT_SHUTDOWN,
	UDI_DMGMT_PARENT_SUSPENDED,
	UDI_DMGMT_RESUME,
	UDI_DMGMT_UNBIND
};

extern void	udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status);
//!\brief Values for flags
#define UDI_DMGMT_NONTRANSPARENT	(1U<<0)
//!\brief Meta-Specific Status Codes
#define UDI_DMGMT_STAT_ROUTING_CHANGE	(UDI_STAT_META_SPECIFIC|1)

extern void udi_final_cleanup_req(udi_mgmt_cb_t *cb);
extern void udi_final_cleanup_ack(udi_mgmt_cb_t *cb);


#endif
