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