UniMRCP  1.7.0
mrcp_header_accessor.h
Go to the documentation of this file.
1 /*
2  * Copyright 2008-2015 Arsen Chaloyan
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MRCP_HEADER_ACCESSOR_H
18 #define MRCP_HEADER_ACCESSOR_H
19 
20 /**
21  * @file mrcp_header_accessor.h
22  * @brief Abstract MRCP Header Accessor
23  */
24 
25 #include "apt_text_stream.h"
26 #include "apt_header_field.h"
27 #include "mrcp.h"
28 
30 
31 /** MRCP header accessor declaration */
33 /** MRCP header vtable declaration */
35 
36 /** MRCP header accessor interface */
38  /** Allocate actual header data */
39  void* (*allocate)(mrcp_header_accessor_t *accessor, apr_pool_t *pool);
40  /** Destroy header data */
41  void (*destroy)(mrcp_header_accessor_t *accessor);
42 
43  /** Parse header field value */
44  apt_bool_t (*parse_field)(mrcp_header_accessor_t *accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool);
45  /** Generate header field value */
46  apt_bool_t (*generate_field)(const mrcp_header_accessor_t *accessor, apr_size_t id, apt_str_t *value, apr_pool_t *pool);
47  /** Duplicate header field value */
48  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);
49 
50  /** Table of fields */
52  /** Number of fields */
53  apr_size_t field_count;
54 };
55 
56 /** MRCP header accessor */
58  /** Actual header data allocated by accessor */
59  void *data;
60  /** Header accessor interface */
62 };
63 
64 
65 
66 /** Initialize header vtable */
67 static APR_INLINE void mrcp_header_vtable_init(mrcp_header_vtable_t *vtable)
68 {
69  vtable->allocate = NULL;
70  vtable->destroy = NULL;
71  vtable->parse_field = NULL;
72  vtable->generate_field = NULL;
73  vtable->duplicate_field = NULL;
74  vtable->field_table = NULL;
75  vtable->field_count = 0;
76 }
77 
78 /** Validate header vtable */
79 static APR_INLINE apt_bool_t mrcp_header_vtable_validate(const mrcp_header_vtable_t *vtable)
80 {
81  return (vtable->allocate && vtable->destroy &&
82  vtable->parse_field && vtable->generate_field &&
83  vtable->duplicate_field && vtable->field_table &&
84  vtable->field_count) ? TRUE : FALSE;
85 }
86 
87 
88 /** Initialize header accessor */
89 static APR_INLINE void mrcp_header_accessor_init(mrcp_header_accessor_t *accessor)
90 {
91  accessor->data = NULL;
92  accessor->vtable = NULL;
93 }
94 
95 /** Allocate header data */
96 static APR_INLINE void* mrcp_header_allocate(mrcp_header_accessor_t *accessor, apr_pool_t *pool)
97 {
98  if(accessor->data) {
99  return accessor->data;
100  }
101  if(!accessor->vtable || !accessor->vtable->allocate) {
102  return NULL;
103  }
104  return accessor->vtable->allocate(accessor,pool);
105 }
106 
107 /** Destroy header data */
108 static APR_INLINE void mrcp_header_destroy(mrcp_header_accessor_t *accessor)
109 {
110  if(!accessor->vtable || !accessor->vtable->destroy) {
111  return;
112  }
113  accessor->vtable->destroy(accessor);
114 }
115 
116 
117 /** Parse header field value */
119 
120 /** Generate header field value */
121 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);
122 
123 /** Duplicate header field value */
124 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);
125 
126 
128 
129 #endif /* MRCP_HEADER_ACCESSOR_H */
apr_size_t field_count
Definition: mrcp_header_accessor.h:53
#define MRCP_DECLARE(type)
Definition: mrcp.h:40
apt_bool_t(* generate_field)(const mrcp_header_accessor_t *accessor, apr_size_t id, apt_str_t *value, apr_pool_t *pool)
Definition: mrcp_header_accessor.h:46
void *(* allocate)(mrcp_header_accessor_t *accessor, apr_pool_t *pool)
Definition: mrcp_header_accessor.h:39
const apt_str_table_item_t * field_table
Definition: mrcp_header_accessor.h:51
#define APT_END_EXTERN_C
Definition: apt.h:38
int apt_bool_t
Definition: apt.h:57
apt_bool_t mrcp_header_field_value_parse(mrcp_header_accessor_t *accessor, apt_header_field_t *header_field, apr_pool_t *pool)
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)
Definition: mrcp_header_accessor.h:48
Definition: mrcp_header_accessor.h:37
MRCP Core Definitions.
Definition: apt_header_field.h:39
const mrcp_header_vtable_t * vtable
Definition: mrcp_header_accessor.h:61
#define APT_BEGIN_EXTERN_C
Definition: apt.h:36
apt_bool_t(* parse_field)(mrcp_header_accessor_t *accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool)
Definition: mrcp_header_accessor.h:44
void(* destroy)(mrcp_header_accessor_t *accessor)
Definition: mrcp_header_accessor.h:41
Definition: mrcp_header_accessor.h:57
Definition: apt_string.h:36
void * data
Definition: mrcp_header_accessor.h:59
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)
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)
Header Field Declaration (RFC5322)
Text Stream Parse/Generate Routine.
Definition: apt_string_table.h:34