- class transform_attribute fully tested and written

- generating of this type works!
This commit is contained in:
Jan Hutter
2005-11-14 13:51:49 +00:00
parent 353c317a15
commit f561c205e8
6 changed files with 328 additions and 5 deletions
+1
View File
@@ -54,6 +54,7 @@ mapping_t payload_type_t_mappings[] = {
{HEADER, "HEADER"},
{PROPOSAL_SUBSTRUCTURE, "PROPOSAL_SUBSTRUCTURE"},
{TRANSFORM_SUBSTRUCTURE, "TRANSFORM_SUBSTRUCTURE"},
{TRANSFORM_ATTRIBUTE, "TRANSFORM_ATTRIBUTE"},
{MAPPING_END, NULL}
};
+70 -1
View File
@@ -59,7 +59,7 @@ struct private_transform_attribute_s {
/**
* Attribute Length if attribute_format is 0, attribute Value otherwise
*/
u_int8_t attribute_length_or_value;
u_int16_t attribute_length_or_value;
/**
* Attribute value as chunk if attribute_format is 0 (FALSE)
@@ -144,6 +144,71 @@ static size_t get_length(private_transform_attribute_t *this)
}
return (this->attribute_length_or_value + 4);
}
/**
* Implements transform_attribute_t's set_value function.
* See #transform_attribute_s.set_value for description.
*/
static status_t set_value (private_transform_attribute_t *this, chunk_t value)
{
if (value.len > 2)
{
this->attribute_value.ptr = allocator_clone_bytes(value.ptr,value.len);
if (this->attribute_value.ptr == NULL)
{
return OUT_OF_RES;
}
this->attribute_value.len = value.len;
this->attribute_length_or_value = value.len;
/* attribute has not a fixed length */
this->attribute_format = FALSE;
}
else
{
memcpy(&(this->attribute_length_or_value),value.ptr,value.len);
}
return SUCCESS;
}
/**
* Implements transform_attribute_t's get_value function.
* See #transform_attribute_s.get_value for description.
*/
static chunk_t get_value (private_transform_attribute_t *this)
{
chunk_t value;
if (this->attribute_format == FALSE)
{
value.ptr = this->attribute_value.ptr;
value.len = this->attribute_value.len;
}
else
{
value.ptr = (void *) &(this->attribute_length_or_value);
value.len = 2;
}
return value;
}
/**
* Implements transform_attribute_t's set_attribute_type function.
* See #transform_attribute_s.set_attribute_type for description.
*/
static status_t set_attribute_type (private_transform_attribute_t *this, u_int16_t type)
{
this->attribute_type = type & 0x7FFF;
return SUCCESS;
}
/**
* Implements transform_attribute_t's get_attribute_type function.
* See #transform_attribute_s.get_attribute_type for description.
*/
static u_int16_t get_attribute_type (private_transform_attribute_t *this)
{
return this->attribute_type;
}
/*
* Described in header
@@ -161,6 +226,10 @@ transform_attribute_t *transform_attribute_create()
this->public.payload_interface.get_next_type = (payload_type_t (*) (payload_t *)) get_next_type;
this->public.payload_interface.get_type = (payload_type_t (*) (payload_t *)) get_type;
this->public.payload_interface.destroy = (status_t (*) (payload_t *))destroy;
this->public.set_value = (status_t (*) (transform_attribute_t *,chunk_t value)) set_value;
this->public.get_value = (chunk_t (*) (transform_attribute_t *)) get_value;
this->public.set_attribute_type = (status_t (*) (transform_attribute_t *,u_int16_t type)) set_attribute_type;
this->public.get_attribute_type = (u_int16_t (*) (transform_attribute_t *)) get_attribute_type;
this->public.destroy = (status_t (*) (transform_attribute_t *)) destroy;
/* set default values of the fields */
@@ -41,6 +41,46 @@ struct transform_attribute_s {
* implements payload_t interface
*/
payload_t payload_interface;
/**
* @brief Returns the currently set value of the attribute
*
* @warning Returned data are not copied
*
* @param this calling transform_attribute_t object
* @return chunk_t pointing to the value
*/
chunk_t (*get_value) (transform_attribute_t *this);
/**
* @brief Sets the value of the attribute.
*
* @warning Value is getting copied
*
* @param this calling transform_attribute_t object
* @param value chunk_t pointing to the value to set
* @return
* - SUCCESS or
* - OUT_OF_RES
*/
status_t (*set_value) (transform_attribute_t *this, chunk_t value);
/**
* @brief Sets the type of the attribute.
*
* @param this calling transform_attribute_t object
* @param type type to set (most significant bit is set to zero)
* @return SUCCESS
*/
status_t (*set_attribute_type) (transform_attribute_t *this, u_int16_t type);
/**
* @brief get the type of the attribute.
*
* @param this calling transform_attribute_t object
* @return type of the value
*/
u_int16_t (*get_attribute_type) (transform_attribute_t *this);
/**
* @brief Destroys an transform_attribute_t object.