00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MRCP_HEADER_ACCESSOR_H
00020 #define MRCP_HEADER_ACCESSOR_H
00021
00022
00023
00024
00025
00026
00027 #include "apt_text_stream.h"
00028 #include "apt_header_field.h"
00029 #include "mrcp.h"
00030
00031 APT_BEGIN_EXTERN_C
00032
00033
00034 typedef struct mrcp_header_accessor_t mrcp_header_accessor_t;
00035
00036 typedef struct mrcp_header_vtable_t mrcp_header_vtable_t;
00037
00038
00039 struct mrcp_header_vtable_t {
00040
00041 void* (*allocate)(mrcp_header_accessor_t *accessor, apr_pool_t *pool);
00042
00043 void (*destroy)(mrcp_header_accessor_t *accessor);
00044
00045
00046 apt_bool_t (*parse_field)(mrcp_header_accessor_t *accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool);
00047
00048 apt_bool_t (*generate_field)(const mrcp_header_accessor_t *accessor, apr_size_t id, apt_str_t *value, apr_pool_t *pool);
00049
00050 apt_bool_t (*duplicate_field)(mrcp_header_accessor_t *accessor, const mrcp_header_accessor_t *src, apr_size_t id, const apt_str_t *value, apr_pool_t *pool);
00051
00052
00053 const apt_str_table_item_t *field_table;
00054
00055 apr_size_t field_count;
00056 };
00057
00058
00059 struct mrcp_header_accessor_t {
00060
00061 void *data;
00062
00063 const mrcp_header_vtable_t *vtable;
00064 };
00065
00066
00067
00068
00069 static APR_INLINE void mrcp_header_vtable_init(mrcp_header_vtable_t *vtable)
00070 {
00071 vtable->allocate = NULL;
00072 vtable->destroy = NULL;
00073 vtable->parse_field = NULL;
00074 vtable->generate_field = NULL;
00075 vtable->duplicate_field = NULL;
00076 vtable->field_table = NULL;
00077 vtable->field_count = 0;
00078 }
00079
00080
00081 static APR_INLINE apt_bool_t mrcp_header_vtable_validate(const mrcp_header_vtable_t *vtable)
00082 {
00083 return (vtable->allocate && vtable->destroy &&
00084 vtable->parse_field && vtable->generate_field &&
00085 vtable->duplicate_field && vtable->field_table &&
00086 vtable->field_count) ? TRUE : FALSE;
00087 }
00088
00089
00090
00091 static APR_INLINE void mrcp_header_accessor_init(mrcp_header_accessor_t *accessor)
00092 {
00093 accessor->data = NULL;
00094 accessor->vtable = NULL;
00095 }
00096
00097
00098 static APR_INLINE void* mrcp_header_allocate(mrcp_header_accessor_t *accessor, apr_pool_t *pool)
00099 {
00100 if(accessor->data) {
00101 return accessor->data;
00102 }
00103 if(!accessor->vtable || !accessor->vtable->allocate) {
00104 return NULL;
00105 }
00106 return accessor->vtable->allocate(accessor,pool);
00107 }
00108
00109
00110 static APR_INLINE void mrcp_header_destroy(mrcp_header_accessor_t *accessor)
00111 {
00112 if(!accessor->vtable || !accessor->vtable->destroy) {
00113 return;
00114 }
00115 accessor->vtable->destroy(accessor);
00116 }
00117
00118
00119
00120 MRCP_DECLARE(apt_bool_t) mrcp_header_field_value_parse(mrcp_header_accessor_t *accessor, apt_header_field_t *header_field, apr_pool_t *pool);
00121
00122
00123 MRCP_DECLARE(apt_header_field_t*) mrcp_header_field_value_generate(const mrcp_header_accessor_t *accessor, apr_size_t id, apt_bool_t empty_value, apr_pool_t *pool);
00124
00125
00126 MRCP_DECLARE(apt_bool_t) mrcp_header_field_value_duplicate(mrcp_header_accessor_t *accessor, const mrcp_header_accessor_t *src_accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool);
00127
00128
00129 APT_END_EXTERN_C
00130
00131 #endif