Fax gateway functionality (i.e. translating between a T.30 terminal and a T.38
[asterisk/asterisk.git] / include / asterisk / res_fax.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2008-2009, Digium, Inc.
5  *
6  * Dwayne M. Hubbard <dhubbard@digium.com>
7  * Kevin P. Fleming <kpfleming@digium.com>
8  *
9  * See http://www.asterisk.org for more information about
10  * the Asterisk project. Please do not directly contact
11  * any of the maintainers of this project for assistance;
12  * the project provides a web site, mailing lists and IRC
13  * channels for your use.
14  *
15  * This program is free software, distributed under the terms of
16  * the GNU General Public License Version 2. See the LICENSE file
17  * at the top of the source tree.
18  */
19
20 #ifndef _ASTERISK_RES_FAX_H
21 #define _ASTERISK_RES_FAX_H
22
23 #include <asterisk.h>
24 #include <asterisk/lock.h>
25 #include <asterisk/linkedlists.h>
26 #include <asterisk/module.h>
27 #include <asterisk/utils.h>
28 #include <asterisk/options.h>
29 #include <asterisk/frame.h>
30 #include <asterisk/cli.h>
31 #include <asterisk/stringfields.h>
32
33 /*! \brief capabilities for res_fax to locate a fax technology module */
34 enum ast_fax_capabilities {
35         /*! SendFax is supported */
36         AST_FAX_TECH_SEND      = (1 << 0),
37         /*! ReceiveFax is supported */
38         AST_FAX_TECH_RECEIVE   = (1 << 1),
39         /*! Audio FAX session supported */
40         AST_FAX_TECH_AUDIO     = (1 << 2),
41         /*! T.38 FAX session supported */
42         AST_FAX_TECH_T38       = (1 << 3),
43         /*! sending mulitple documents supported */
44         AST_FAX_TECH_MULTI_DOC = (1 << 4),
45         /*! T.38 - T.30 Gateway */
46         AST_FAX_TECH_GATEWAY = (1 << 5),
47 };
48
49 /*! \brief fax modem capabilities */
50 enum ast_fax_modems {
51         /*! V.17 */
52         AST_FAX_MODEM_V17 = (1 << 0),
53         /*! V.27 */
54         AST_FAX_MODEM_V27 = (1 << 1),
55         /*! V.29 */
56         AST_FAX_MODEM_V29 = (1 << 2),
57         /*! V.34 */
58         AST_FAX_MODEM_V34 = (1 << 3),
59 };
60
61 /*! \brief current state of a fax session */
62 enum ast_fax_state {
63         /*! uninitialized state */
64         AST_FAX_STATE_UNINITIALIZED = 0,
65         /*! initialized state */
66         AST_FAX_STATE_INITIALIZED,
67         /*! fax resources open state */
68         AST_FAX_STATE_OPEN,
69         /*! fax session in progress */
70         AST_FAX_STATE_ACTIVE,
71         /*! fax session complete */
72         AST_FAX_STATE_COMPLETE,
73         /*! reserved state */
74         AST_FAX_STATE_RESERVED,
75         /*! inactive state */
76         AST_FAX_STATE_INACTIVE,
77 };
78
79 /*! \brief fax session options */
80 enum ast_fax_optflag {
81         /*! false/disable configuration override */
82         AST_FAX_OPTFLAG_FALSE = 0,
83         /*! true/enable configuration override */
84         AST_FAX_OPTFLAG_TRUE,
85         /*! use the configured default */
86         AST_FAX_OPTFLAG_DEFAULT,
87 };
88
89 struct ast_fax_t38_parameters {
90         unsigned int version;                                   /*!< Supported T.38 version */
91         unsigned int max_ifp;                                   /*!< Maximum IFP size supported */
92         enum ast_control_t38_rate rate;                         /*!< Maximum fax rate supported */
93         enum ast_control_t38_rate_management rate_management;   /*!< Rate management setting */
94         unsigned int fill_bit_removal:1;                        /*!< Set if fill bit removal can be used */
95         unsigned int transcoding_mmr:1;                         /*!< Set if MMR transcoding can be used */
96         unsigned int transcoding_jbig:1;                        /*!< Set if JBIG transcoding can be used */
97 };
98
99 struct ast_fax_document {
100         AST_LIST_ENTRY(ast_fax_document) next;
101         char filename[0];
102 };
103
104 AST_LIST_HEAD_NOLOCK(ast_fax_documents, ast_fax_document);
105
106 /*! \brief The data communicated between the high level applications and the generic fax function */
107 struct ast_fax_session_details {
108         /*! fax session capability requirements.  The caps field is used to select
109          * the proper fax technology module before the session starts */
110         enum ast_fax_capabilities caps;
111         /*! modem requirement for the session */
112         enum ast_fax_modems modems;
113         /*! session id */
114         unsigned int id;
115         /*! document(s) to be sent/received */
116         struct ast_fax_documents documents;
117         AST_DECLARE_STRING_FIELDS(
118                 /*! resolution negotiated during the fax session.  This is stored in the
119                  * FAXRESOLUTION channel variable when the fax session completes */
120                 AST_STRING_FIELD(resolution);
121                 /*! transfer rate negotiated during the fax session.  This is stored in the
122                  * FAXBITRATE channel variable when the fax session completes */
123                 AST_STRING_FIELD(transfer_rate);
124                 /*! local station identification.  This is set from the LOCALSTATIONID
125                  * channel variable before the fax session starts */
126                 AST_STRING_FIELD(localstationid);
127                 /*! remote station identification.  This is stored in the REMOTESTATIONID
128                  * channel variable after the fax session completes */
129                 AST_STRING_FIELD(remotestationid);
130                 /*! headerinfo variable is set from the LOCALHEADERINFO channel variable
131                  * before the fax session starts */
132                 AST_STRING_FIELD(headerinfo);
133                 /*! the result of the fax session */
134                 AST_STRING_FIELD(result);
135                 /*! a more descriptive result string of the fax session */
136                 AST_STRING_FIELD(resultstr);
137                 /*! the error reason of the fax session */
138                 AST_STRING_FIELD(error);
139         );
140         /*! the number of pages sent/received during a fax session */
141         unsigned int pages_transferred;
142         /*! session details flags for options */
143         union {
144                 /*! dontuse dummy variable - do not ever use */ 
145                 uint32_t dontuse;
146                 struct {
147                         /*! flag to send debug manager events */
148                         uint32_t debug:2;
149                         /*! flag indicating the use of Error Correction Mode (ECM) */
150                         uint32_t ecm:1;
151                         /*! flag indicating the sending of status manager events */
152                         uint32_t statusevents:2;
153                         /*! allow audio mode FAX on T.38-capable channels */
154                         uint32_t allow_audio:2;
155                         /*! indicating the session switched to T38 */
156                         uint32_t switch_to_t38:1;
157                         /*! flag indicating whether CED should be sent (for receive mode) */
158                         uint32_t send_ced:1;
159                         /*! flag indicating whether CNG should be sent (for send mode) */
160                         uint32_t send_cng:1;
161                         /*! send a T.38 reinvite */
162                         uint32_t request_t38:1;
163                 };
164         } option;
165         /*! override the minimum transmission rate with a channel variable */
166         unsigned int minrate;
167         /*! override the maximum transmission rate with a channel varialbe */
168         unsigned int maxrate;
169         /*! our T.38 session parameters, if any */
170         struct ast_fax_t38_parameters our_t38_parameters;
171         /*! the other endpoint's T.38 session parameters, if any */
172         struct ast_fax_t38_parameters their_t38_parameters;
173         /*! the id of the t.38 gateway framehook for this channel */
174         int gateway_id;
175 };
176
177 struct ast_fax_tech;
178 struct ast_fax_debug_info;
179 struct ast_fax_tech_token;
180
181 /*! \brief The data required to handle a fax session */
182 struct ast_fax_session {
183         /*! session id */
184         unsigned int id;
185         /*! session file descriptor */
186         int fd;
187         /*! fax session details structure */
188         struct ast_fax_session_details *details;
189         /*! fax frames received */
190         unsigned long frames_received;
191         /*! fax frames sent */
192         unsigned long frames_sent;
193         /*! the fax technology callbacks */
194         const struct ast_fax_tech *tech;
195         /*! private implementation pointer */
196         void *tech_pvt;
197         /*! fax state */
198         enum ast_fax_state state;
199         /*! name of the Asterisk channel using the fax session */
200         char *channame;
201         /*! unique ID of the Asterisk channel using the fax session */
202         char *chan_uniqueid;
203         /*! Asterisk channel using the fax session */
204         struct ast_channel *chan;
205         /*! fax debugging structure */
206         struct ast_fax_debug_info *debug_info;
207         /*! used to take variable-sized frames in and output frames of an expected size to the fax stack */
208         struct ast_smoother *smoother;
209 };
210
211 /* if this overlaps with any AST_FRFLAG_* values, problems will occur */
212 #define AST_FAX_FRFLAG_GATEWAY (1 << 13)
213
214 /*! \brief used to register a FAX technology module with res_fax */
215 struct ast_fax_tech {
216         /*! the type of fax session supported with this ast_fax_tech structure */
217         const char * const type;
218         /*! a short description of the fax technology */
219         const char * const description;
220         /*! version string of the technology module */
221         const char * const version;
222         /*! the ast_fax_capabilities supported by the fax technology */
223         const enum ast_fax_capabilities caps;
224         /*! module information for the fax technology */
225         struct ast_module *module;
226         /*! reserves a session for future use; returns a token */
227         struct ast_fax_tech_token *(* const reserve_session)(struct ast_fax_session *);
228         /*! releases an unused session token */
229         void (* const release_token)(struct ast_fax_tech_token *);
230         /*! creates a new fax session, optionally using a previously-reserved token */
231         void *(* const new_session)(struct ast_fax_session *, struct ast_fax_tech_token *);
232         /*! destroys an existing fax session */
233         void (* const destroy_session)(struct ast_fax_session *);
234         /*! sends an Asterisk frame to res_fax */
235         struct ast_frame *(* const read)(struct ast_fax_session *);
236         /*! writes an Asterisk frame to the fax session */
237         int (* const write)(struct ast_fax_session *, const struct ast_frame *);
238         /*! starts the fax session */
239         int (* const start_session)(struct ast_fax_session *);
240         /*! cancels a fax session */
241         int (* const cancel_session)(struct ast_fax_session *);
242         /*! initiates the generation of silence to the fax session */
243         int (* const generate_silence)(struct ast_fax_session *);
244         /*! switches an existing dual-mode session from audio to T.38 */
245         int (* const switch_to_t38)(struct ast_fax_session *);
246         /*! displays capabilities of the fax technology */
247         char * (* const cli_show_capabilities)(int);
248         /*! displays details about the fax session */
249         char * (* const cli_show_session)(struct ast_fax_session *, int);
250         /*! displays statistics from the fax technology module */
251         char * (* const cli_show_stats)(int);
252         /*! displays settings from the fax technology module */
253         char * (* const cli_show_settings)(int);
254 };
255
256 /*! \brief register a fax technology */
257 int ast_fax_tech_register(struct ast_fax_tech *tech);
258
259 /*! \brief unregister a fax technology */
260 void ast_fax_tech_unregister(struct ast_fax_tech *tech);
261
262 /*! \brief get the minimum supported fax rate */
263 unsigned int ast_fax_minrate(void);
264
265 /*! \brief get the maxiumum supported fax rate */
266 unsigned int ast_fax_maxrate(void);
267
268 /*! \brief convert an ast_fax_state to a string */
269 const char *ast_fax_state_to_str(enum ast_fax_state state);
270
271 /*!
272  * \brief Log message at FAX or recommended level
273  *
274  * The first four parameters can be represented with Asterisk's
275  * LOG_* levels. In other words, this function may be called
276  * like
277  *
278  * ast_fax_log(LOG_DEBUG, msg);
279  */
280 void ast_fax_log(int level, const char *file, const int line, const char *function, const char *msg);
281
282 #endif