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_server_session.h 2251 2014-11-21 02:36:44Z achaloyan@gmail.com $
17  */
18 
19 #ifndef MRCP_SERVER_SESSION_H
20 #define MRCP_SERVER_SESSION_H
21 
22 /**
23  * @file mrcp_server_session.h
24  * @brief MRCP Server Session
25  */
26 
27 #include <apr_hash.h>
28 #include "mrcp_session.h"
29 #include "mpf_engine.h"
30 #include "apt_task.h"
31 #include "apt_obj_list.h"
32 
33 
34 APT_BEGIN_EXTERN_C
35 
36 /** Opaque MRCP channel declaration */
37 typedef struct mrcp_channel_t mrcp_channel_t;
38 /** MRCP server session declaration */
39 typedef struct mrcp_server_session_t mrcp_server_session_t;
40 /** MRCP signaling message declaration */
41 typedef struct mrcp_signaling_message_t mrcp_signaling_message_t;
42 
43 /** Enumeration of signaling task messages */
44 typedef enum {
45 	SIGNALING_MESSAGE_OFFER,
46 	SIGNALING_MESSAGE_CONTROL,
47 	SIGNALING_MESSAGE_TERMINATE,
48 } mrcp_signaling_message_type_e;
49 
50 /** MRCP signaling message */
51 struct mrcp_signaling_message_t {
52 	/** Signaling message type */
53 	mrcp_signaling_message_type_e type;
54 
55 	/** Session */
56 	mrcp_server_session_t        *session;
57 	/** Descriptor */
58 	mrcp_session_descriptor_t    *descriptor;
59 
60 	/** Channel */
61 	mrcp_channel_t               *channel;
62 	/** MRCP message */
63 	mrcp_message_t               *message;
64 };
65 
66 /** Server session states */
67 typedef enum {
68 	SESSION_STATE_NONE,              /**< initial state */
69 	SESSION_STATE_GENERATING_ANSWER, /**< received offer, generating answer now */
70 	SESSION_STATE_INITIALIZING,      /**< answer is ready, finally initializing channels now */
71 	SESSION_STATE_DEACTIVATING,      /**< received session termination request, deinitializing channels now */
72 	SESSION_STATE_TERMINATING        /**< finally terminating session */
73 } mrcp_server_session_state_e;
74 
75 
76 /** MRCP server session */
77 struct mrcp_server_session_t {
78 	/** Session base */
79 	mrcp_session_t              base;
80 	/** MRCP server */
81 	mrcp_server_t              *server;
82 	/** MRCP profile */
83 	mrcp_server_profile_t      *profile;
84 
85 	/** Media context */
86 	mpf_context_t              *context;
87 
88 	/** Media termination array */
89 	apr_array_header_t         *terminations;
90 	/** MRCP control channel array */
91 	apr_array_header_t         *channels;
92 
93 	/** In-progress signaling request */
94 	mrcp_signaling_message_t   *active_request;
95 	/** Signaling request queue */
96 	apt_obj_list_t             *request_queue;
97 
98 	/** In-progress offer */
99 	mrcp_session_descriptor_t  *offer;
100 	/** In-progres answer */
101 	mrcp_session_descriptor_t  *answer;
102 
103 	/** MPF task message, which construction is in progress */
104 	mpf_task_msg_t             *mpf_task_msg;
105 
106 	/** Session state */
107 	mrcp_server_session_state_e state;
108 	/** Number of in-progress sub requests */
109 	apr_size_t                  subrequest_count;
110 };
111 
112 /** MRCP server profile */
113 struct mrcp_server_profile_t {
114 	/** Identifier of the profile */
115 	const char                *id;
116 	/** MRCP version */
117 	mrcp_version_e             mrcp_version;
118 	/** Table of engines (mrcp_engine_t*) */
119 	apr_hash_t                *engine_table;
120 	/** MRCP resource factory */
121 	mrcp_resource_factory_t   *resource_factory;
122 	/** Media processing engine */
123 	mpf_engine_t              *media_engine;
124 	/** RTP termination factory */
125 	mpf_termination_factory_t *rtp_termination_factory;
126 	/** RTP settings */
127 	mpf_rtp_settings_t        *rtp_settings;
128 	/** Signaling agent */
129 	mrcp_sig_agent_t          *signaling_agent;
130 	/** Connection agent */
131 	mrcp_connection_agent_t   *connection_agent;
132 };
133 
134 /** Create server session */
135 mrcp_server_session_t* mrcp_server_session_create(void);
136 
137 /** Process signaling message */
138 apt_bool_t mrcp_server_signaling_message_process(mrcp_signaling_message_t *signaling_message);
139 /** Process MPF message */
140 apt_bool_t mrcp_server_mpf_message_process(mpf_message_container_t *mpf_message_container);
141 
142 /** Process channel modify event */
143 apt_bool_t mrcp_server_on_channel_modify(mrcp_channel_t *channel, mrcp_control_descriptor_t *answer, apt_bool_t status);
144 /** Process channel remove event */
145 apt_bool_t mrcp_server_on_channel_remove(mrcp_channel_t *channel, apt_bool_t status);
146 /** Process channel message receive */
147 apt_bool_t mrcp_server_on_channel_message(mrcp_channel_t *channel, mrcp_message_t *message);
148 /** Process connection disconnect event */
149 apt_bool_t mrcp_server_on_disconnect(mrcp_channel_t *channel);
150 
151 /** Process channel open event */
152 apt_bool_t mrcp_server_on_engine_channel_open(mrcp_channel_t *channel, apt_bool_t status);
153 /** Process channel close event */
154 apt_bool_t mrcp_server_on_engine_channel_close(mrcp_channel_t *channel);
155 /** Process message receive event */
156 apt_bool_t mrcp_server_on_engine_channel_message(mrcp_channel_t *channel, mrcp_message_t *message);
157 
158 /** Get session by channel */
159 mrcp_session_t* mrcp_server_channel_session_get(mrcp_channel_t *channel);
160 
161 APT_END_EXTERN_C
162 
163 #endif /* MRCP_SERVER_SESSION_H */
164