1 /*
2 * Copyright 2008-2014 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 * $Id: mrcp_session.h 2136 2014-07-04 06:33:36Z achaloyan@gmail.com $
17 */
18
19 #ifndef MRCP_SESSION_H
20 #define MRCP_SESSION_H
21
22 /**
23 * @file mrcp_session.h
24 * @brief Abstract MRCP Session
25 */
26
27 #include "mrcp_sig_types.h"
28 #include "mpf_types.h"
29 #include "apt_string.h"
30
31 APT_BEGIN_EXTERN_C
32
33 /** Macro to log session pointers */
34 #define MRCP_SESSION_PTR(session) (session)
35 /** Macro to log session string identifiers */
36 #define MRCP_SESSION_SID(session) \
37 (session)->id.buf ? (session)->id.buf : "new"
38
39 /** Macro to log session pointers and string identifiers */
40 #define MRCP_SESSION_PTRSID(session) \
41 MRCP_SESSION_PTR(session), MRCP_SESSION_SID(session)
42
43 /** MRCP session request vtable declaration */
44 typedef struct mrcp_session_request_vtable_t mrcp_session_request_vtable_t;
45 /** MRCP session response vtable declaration */
46 typedef struct mrcp_session_response_vtable_t mrcp_session_response_vtable_t;
47 /** MRCP session event vtable declaration */
48 typedef struct mrcp_session_event_vtable_t mrcp_session_event_vtable_t;
49
50
51 /** MRCP session */
52 struct mrcp_session_t {
53 /** Memory pool to allocate memory from */
54 apr_pool_t *pool;
55 /** External object associated with session */
56 void *obj;
57 /** External logger object associated with session */
58 void *log_obj;
59 /** Informative name of the session used for debugging */
60 const char *name;
61
62 /** Signaling (session managment) agent */
63 mrcp_sig_agent_t *signaling_agent;
64 /** MRCPv2 connection agent, if any */
65 void *connection_agent;
66 /** Media processing engine */
67 mpf_engine_t *media_engine;
68 /** RTP termination factory */
69 mpf_termination_factory_t *rtp_factory;
70
71 /** Session identifier */
72 apt_str_t id;
73 /** Last request identifier sent for client, received for server */
74 mrcp_request_id last_request_id;
75
76 /** Virtual request methods */
77 const mrcp_session_request_vtable_t *request_vtable;
78 /** Virtual response methods */
79 const mrcp_session_response_vtable_t *response_vtable;
80 /** Virtual event methods */
81 const mrcp_session_event_vtable_t *event_vtable;
82 };
83
84
85 /** MRCP session request vtable */
86 struct mrcp_session_request_vtable_t {
87 /** Offer session descriptor */
88 apt_bool_t (*offer)(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor);
89 /** Terminate session */
90 apt_bool_t (*terminate)(mrcp_session_t *session);
91 /** Control session (MRCPv1 only) */
92 apt_bool_t (*control)(mrcp_session_t *session, mrcp_message_t *message);
93 /** Discover resources */
94 apt_bool_t (*discover)(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor);
95 };
96
97 /** MRCP session response vtable */
98 struct mrcp_session_response_vtable_t {
99 /** Answer with remote session descriptor */
100 apt_bool_t (*on_answer)(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor);
101 /** Session terminated */
102 apt_bool_t (*on_terminate)(mrcp_session_t *session);
103 /** Control session (MRCPv1 only) */
104 apt_bool_t (*on_control)(mrcp_session_t *session, mrcp_message_t *message);
105 /** Response to resource discovery request */
106 apt_bool_t (*on_discover)(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor);
107 };
108
109 /** MRCP session event vtable */
110 struct mrcp_session_event_vtable_t {
111 /** Received session termination event without appropriate request */
112 apt_bool_t (*on_terminate)(mrcp_session_t *session);
113 };
114
115
116 /** Create new memory pool and allocate session object from the pool. */
117 MRCP_DECLARE(mrcp_session_t*) mrcp_session_create(apr_size_t padding);
118
119 /** Destroy session and assosiated memory pool. */
120 MRCP_DECLARE(void) mrcp_session_destroy(mrcp_session_t *session);
121
122
123 /** Offer */
mrcp_session_offer(mrcp_session_t * session,mrcp_session_descriptor_t * descriptor)124 static APR_INLINE apt_bool_t mrcp_session_offer(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor)
125 {
126 if(session->request_vtable->offer) {
127 return session->request_vtable->offer(session,descriptor);
128 }
129 return FALSE;
130 }
131
132 /** Terminate */
mrcp_session_terminate_request(mrcp_session_t * session)133 static APR_INLINE apt_bool_t mrcp_session_terminate_request(mrcp_session_t *session)
134 {
135 if(session->request_vtable->terminate) {
136 return session->request_vtable->terminate(session);
137 }
138 return FALSE;
139 }
140
141 /** Answer */
mrcp_session_answer(mrcp_session_t * session,mrcp_session_descriptor_t * descriptor)142 static APR_INLINE apt_bool_t mrcp_session_answer(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor)
143 {
144 if(session->response_vtable->on_answer) {
145 return session->response_vtable->on_answer(session,descriptor);
146 }
147 return FALSE;
148 }
149
150 /** On terminate response */
mrcp_session_terminate_response(mrcp_session_t * session)151 static APR_INLINE apt_bool_t mrcp_session_terminate_response(mrcp_session_t *session)
152 {
153 if(session->response_vtable->on_terminate) {
154 return session->response_vtable->on_terminate(session);
155 }
156 return FALSE;
157 }
158
159 /** On terminate event */
mrcp_session_terminate_event(mrcp_session_t * session)160 static APR_INLINE apt_bool_t mrcp_session_terminate_event(mrcp_session_t *session)
161 {
162 if(session->event_vtable->on_terminate) {
163 return session->event_vtable->on_terminate(session);
164 }
165 return FALSE;
166 }
167
168 /** Control request */
mrcp_session_control_request(mrcp_session_t * session,mrcp_message_t * message)169 static APR_INLINE apt_bool_t mrcp_session_control_request(mrcp_session_t *session, mrcp_message_t *message)
170 {
171 if(session->request_vtable->control) {
172 return session->request_vtable->control(session,message);
173 }
174 return FALSE;
175 }
176
177 /** On control response/event */
mrcp_session_control_response(mrcp_session_t * session,mrcp_message_t * message)178 static APR_INLINE apt_bool_t mrcp_session_control_response(mrcp_session_t *session, mrcp_message_t *message)
179 {
180 if(session->response_vtable->on_control) {
181 return session->response_vtable->on_control(session,message);
182 }
183 return FALSE;
184 }
185
186 /** Resource discovery request */
mrcp_session_discover_request(mrcp_session_t * session,mrcp_session_descriptor_t * descriptor)187 static APR_INLINE apt_bool_t mrcp_session_discover_request(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor)
188 {
189 if(session->request_vtable->discover) {
190 return session->request_vtable->discover(session,descriptor);
191 }
192 return FALSE;
193 }
194
195 /** On resource discovery response */
mrcp_session_discover_response(mrcp_session_t * session,mrcp_session_descriptor_t * descriptor)196 static APR_INLINE apt_bool_t mrcp_session_discover_response(mrcp_session_t *session, mrcp_session_descriptor_t *descriptor)
197 {
198 if(session->response_vtable->on_discover) {
199 return session->response_vtable->on_discover(session,descriptor);
200 }
201 return FALSE;
202 }
203
204 APT_END_EXTERN_C
205
206 #endif /* MRCP_SESSION_H */
207