comparison spandsp-0.0.6pre17/src/t30_api.c @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
comparison
equal deleted inserted replaced
3:c6c5a16ce2f2 4:26cd8f1ef0b1
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * t30_api.c - ITU T.30 FAX transfer processing
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 2.1,
14 * as published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: t30_api.c,v 1.13.4.2 2009/12/19 14:18:13 steveu Exp $
26 */
27
28 /*! \file */
29
30 #if defined(HAVE_CONFIG_H)
31 #include "config.h"
32 #endif
33
34 #include <stdlib.h>
35 #include <stdio.h>
36 #include <inttypes.h>
37 #include <string.h>
38 #include <fcntl.h>
39 #include <time.h>
40 #if defined(HAVE_TGMATH_H)
41 #include <tgmath.h>
42 #endif
43 #if defined(HAVE_MATH_H)
44 #include <math.h>
45 #endif
46 #include "floating_fudge.h"
47 #include <tiffio.h>
48
49 #include "spandsp/telephony.h"
50 #include "spandsp/logging.h"
51 #include "spandsp/bit_operations.h"
52 #include "spandsp/queue.h"
53 #include "spandsp/power_meter.h"
54 #include "spandsp/complex.h"
55 #include "spandsp/tone_generate.h"
56 #include "spandsp/async.h"
57 #include "spandsp/hdlc.h"
58 #include "spandsp/fsk.h"
59 #include "spandsp/v29rx.h"
60 #include "spandsp/v29tx.h"
61 #include "spandsp/v27ter_rx.h"
62 #include "spandsp/v27ter_tx.h"
63 #include "spandsp/t4_rx.h"
64 #include "spandsp/t4_tx.h"
65 #include "spandsp/t30_fcf.h"
66 #include "spandsp/t35.h"
67 #include "spandsp/t30.h"
68 #include "spandsp/t30_api.h"
69 #include "spandsp/t30_logging.h"
70
71 #include "spandsp/private/logging.h"
72 #include "spandsp/private/t4_rx.h"
73 #include "spandsp/private/t4_tx.h"
74 #include "spandsp/private/t30.h"
75
76 #include "t30_local.h"
77
78 SPAN_DECLARE(int) t30_set_tx_ident(t30_state_t *s, const char *id)
79 {
80 if (id == NULL)
81 {
82 s->tx_info.ident[0] = '\0';
83 return 0;
84 }
85 if (strlen(id) > T30_MAX_IDENT_LEN)
86 return -1;
87 strcpy(s->tx_info.ident, id);
88 t4_tx_set_local_ident(&s->t4, s->tx_info.ident);
89 return 0;
90 }
91 /*- End of function --------------------------------------------------------*/
92
93 SPAN_DECLARE(const char *) t30_get_tx_ident(t30_state_t *s)
94 {
95 if (s->tx_info.ident[0] == '\0')
96 return NULL;
97 return s->tx_info.ident;
98 }
99 /*- End of function --------------------------------------------------------*/
100
101 SPAN_DECLARE(const char *) t30_get_rx_ident(t30_state_t *s)
102 {
103 if (s->rx_info.ident[0] == '\0')
104 return NULL;
105 return s->rx_info.ident;
106 }
107 /*- End of function --------------------------------------------------------*/
108
109 SPAN_DECLARE(int) t30_set_tx_sub_address(t30_state_t *s, const char *sub_address)
110 {
111 if (sub_address == NULL)
112 {
113 s->tx_info.sub_address[0] = '\0';
114 return 0;
115 }
116 if (strlen(sub_address) > T30_MAX_IDENT_LEN)
117 return -1;
118 strcpy(s->tx_info.sub_address, sub_address);
119 return 0;
120 }
121 /*- End of function --------------------------------------------------------*/
122
123 SPAN_DECLARE(const char *) t30_get_tx_sub_address(t30_state_t *s)
124 {
125 if (s->tx_info.sub_address[0] == '\0')
126 return NULL;
127 return s->tx_info.sub_address;
128 }
129 /*- End of function --------------------------------------------------------*/
130
131 SPAN_DECLARE(const char *) t30_get_rx_sub_address(t30_state_t *s)
132 {
133 if (s->rx_info.sub_address[0] == '\0')
134 return NULL;
135 return s->rx_info.sub_address;
136 }
137 /*- End of function --------------------------------------------------------*/
138
139 SPAN_DECLARE(int) t30_set_tx_selective_polling_address(t30_state_t *s, const char *selective_polling_address)
140 {
141 if (selective_polling_address == NULL)
142 {
143 s->tx_info.selective_polling_address[0] = '\0';
144 return 0;
145 }
146 if (strlen(selective_polling_address) > T30_MAX_IDENT_LEN)
147 return -1;
148 strcpy(s->tx_info.selective_polling_address, selective_polling_address);
149 return 0;
150 }
151 /*- End of function --------------------------------------------------------*/
152
153 SPAN_DECLARE(const char *) t30_get_tx_selective_polling_address(t30_state_t *s)
154 {
155 if (s->tx_info.selective_polling_address[0] == '\0')
156 return NULL;
157 return s->tx_info.selective_polling_address;
158 }
159 /*- End of function --------------------------------------------------------*/
160
161 SPAN_DECLARE(const char *) t30_get_rx_selective_polling_address(t30_state_t *s)
162 {
163 if (s->rx_info.selective_polling_address[0] == '\0')
164 return NULL;
165 return s->rx_info.selective_polling_address;
166 }
167 /*- End of function --------------------------------------------------------*/
168
169 SPAN_DECLARE(int) t30_set_tx_polled_sub_address(t30_state_t *s, const char *polled_sub_address)
170 {
171 if (polled_sub_address == NULL)
172 {
173 s->tx_info.polled_sub_address[0] = '\0';
174 return 0;
175 }
176 if (strlen(polled_sub_address) > T30_MAX_IDENT_LEN)
177 return -1;
178 strcpy(s->tx_info.polled_sub_address, polled_sub_address);
179 return 0;
180 }
181 /*- End of function --------------------------------------------------------*/
182
183 SPAN_DECLARE(const char *) t30_get_tx_polled_sub_address(t30_state_t *s)
184 {
185 if (s->tx_info.polled_sub_address[0] == '\0')
186 return NULL;
187 return s->tx_info.polled_sub_address;
188 }
189 /*- End of function --------------------------------------------------------*/
190
191 SPAN_DECLARE(const char *) t30_get_rx_polled_sub_address(t30_state_t *s)
192 {
193 if (s->rx_info.polled_sub_address[0] == '\0')
194 return NULL;
195 return s->rx_info.polled_sub_address;
196 }
197 /*- End of function --------------------------------------------------------*/
198
199 SPAN_DECLARE(int) t30_set_tx_sender_ident(t30_state_t *s, const char *sender_ident)
200 {
201 if (sender_ident == NULL)
202 {
203 s->tx_info.sender_ident[0] = '\0';
204 return 0;
205 }
206 if (strlen(sender_ident) > T30_MAX_IDENT_LEN)
207 return -1;
208 strcpy(s->tx_info.sender_ident, sender_ident);
209 return 0;
210 }
211 /*- End of function --------------------------------------------------------*/
212
213 SPAN_DECLARE(const char *) t30_get_tx_sender_ident(t30_state_t *s)
214 {
215 if (s->tx_info.sender_ident[0] == '\0')
216 return NULL;
217 return s->tx_info.sender_ident;
218 }
219 /*- End of function --------------------------------------------------------*/
220
221 SPAN_DECLARE(const char *) t30_get_rx_sender_ident(t30_state_t *s)
222 {
223 if (s->rx_info.sender_ident[0] == '\0')
224 return NULL;
225 return s->rx_info.sender_ident;
226 }
227 /*- End of function --------------------------------------------------------*/
228
229 SPAN_DECLARE(int) t30_set_tx_password(t30_state_t *s, const char *password)
230 {
231 if (password == NULL)
232 {
233 s->tx_info.password[0] = '\0';
234 return 0;
235 }
236 if (strlen(password) > T30_MAX_IDENT_LEN)
237 return -1;
238 strcpy(s->tx_info.password, password);
239 return 0;
240 }
241 /*- End of function --------------------------------------------------------*/
242
243 SPAN_DECLARE(const char *) t30_get_tx_password(t30_state_t *s)
244 {
245 if (s->tx_info.password[0] == '\0')
246 return NULL;
247 return s->tx_info.password;
248 }
249 /*- End of function --------------------------------------------------------*/
250
251 SPAN_DECLARE(const char *) t30_get_rx_password(t30_state_t *s)
252 {
253 if (s->rx_info.password[0] == '\0')
254 return NULL;
255 return s->rx_info.password;
256 }
257 /*- End of function --------------------------------------------------------*/
258
259 SPAN_DECLARE(int) t30_set_tx_nsf(t30_state_t *s, const uint8_t *nsf, int len)
260 {
261 if (s->tx_info.nsf)
262 free(s->tx_info.nsf);
263 if (nsf && len > 0 && (s->tx_info.nsf = malloc(len + 3)))
264 {
265 memcpy(s->tx_info.nsf + 3, nsf, len);
266 s->tx_info.nsf_len = len;
267 }
268 else
269 {
270 s->tx_info.nsf = NULL;
271 s->tx_info.nsf_len = 0;
272 }
273 return 0;
274 }
275 /*- End of function --------------------------------------------------------*/
276
277 SPAN_DECLARE(size_t) t30_get_tx_nsf(t30_state_t *s, const uint8_t *nsf[])
278 {
279 if (nsf)
280 *nsf = s->tx_info.nsf;
281 return s->tx_info.nsf_len;
282 }
283 /*- End of function --------------------------------------------------------*/
284
285 SPAN_DECLARE(size_t) t30_get_rx_nsf(t30_state_t *s, const uint8_t *nsf[])
286 {
287 if (nsf)
288 *nsf = s->rx_info.nsf;
289 return s->rx_info.nsf_len;
290 }
291 /*- End of function --------------------------------------------------------*/
292
293 SPAN_DECLARE(int) t30_set_tx_nsc(t30_state_t *s, const uint8_t *nsc, int len)
294 {
295 if (s->tx_info.nsc)
296 free(s->tx_info.nsc);
297 if (nsc && len > 0 && (s->tx_info.nsc = malloc(len + 3)))
298 {
299 memcpy(s->tx_info.nsc + 3, nsc, len);
300 s->tx_info.nsc_len = len;
301 }
302 else
303 {
304 s->tx_info.nsc = NULL;
305 s->tx_info.nsc_len = 0;
306 }
307 return 0;
308 }
309 /*- End of function --------------------------------------------------------*/
310
311 SPAN_DECLARE(size_t) t30_get_tx_nsc(t30_state_t *s, const uint8_t *nsc[])
312 {
313 if (nsc)
314 *nsc = s->tx_info.nsc;
315 return s->tx_info.nsc_len;
316 }
317 /*- End of function --------------------------------------------------------*/
318
319 SPAN_DECLARE(size_t) t30_get_rx_nsc(t30_state_t *s, const uint8_t *nsc[])
320 {
321 if (nsc)
322 *nsc = s->rx_info.nsc;
323 return s->rx_info.nsc_len;
324 }
325 /*- End of function --------------------------------------------------------*/
326
327 SPAN_DECLARE(int) t30_set_tx_nss(t30_state_t *s, const uint8_t *nss, int len)
328 {
329 if (s->tx_info.nss)
330 free(s->tx_info.nss);
331 if (nss && len > 0 && (s->tx_info.nss = malloc(len + 3)))
332 {
333 memcpy(s->tx_info.nss + 3, nss, len);
334 s->tx_info.nss_len = len;
335 }
336 else
337 {
338 s->tx_info.nss = NULL;
339 s->tx_info.nss_len = 0;
340 }
341 return 0;
342 }
343 /*- End of function --------------------------------------------------------*/
344
345 SPAN_DECLARE(size_t) t30_get_tx_nss(t30_state_t *s, const uint8_t *nss[])
346 {
347 if (nss)
348 *nss = s->tx_info.nss;
349 return s->tx_info.nss_len;
350 }
351 /*- End of function --------------------------------------------------------*/
352
353 SPAN_DECLARE(size_t) t30_get_rx_nss(t30_state_t *s, const uint8_t *nss[])
354 {
355 if (nss)
356 *nss = s->rx_info.nss;
357 return s->rx_info.nss_len;
358 }
359 /*- End of function --------------------------------------------------------*/
360
361 SPAN_DECLARE(int) t30_set_tx_tsa(t30_state_t *s, int type, const char *address, int len)
362 {
363 if (s->tx_info.tsa)
364 free(s->tx_info.tsa);
365 if (address == NULL || len == 0)
366 {
367 s->tx_info.tsa = NULL;
368 s->tx_info.tsa_len = 0;
369 return 0;
370 }
371 s->tx_info.tsa_type = type;
372 if (len < 0)
373 len = strlen(address);
374 if ((s->tx_info.tsa = malloc(len)))
375 {
376 memcpy(s->tx_info.tsa, address, len);
377 s->tx_info.tsa_len = len;
378 }
379 return 0;
380 }
381 /*- End of function --------------------------------------------------------*/
382
383 SPAN_DECLARE(size_t) t30_get_tx_tsa(t30_state_t *s, int *type, const char *address[])
384 {
385 if (type)
386 *type = s->tx_info.tsa_type;
387 if (address)
388 *address = s->tx_info.tsa;
389 return s->tx_info.tsa_len;
390 }
391 /*- End of function --------------------------------------------------------*/
392
393 SPAN_DECLARE(size_t) t30_get_rx_tsa(t30_state_t *s, int *type, const char *address[])
394 {
395 if (type)
396 *type = s->rx_info.tsa_type;
397 if (address)
398 *address = s->rx_info.tsa;
399 return s->rx_info.tsa_len;
400 }
401 /*- End of function --------------------------------------------------------*/
402
403 SPAN_DECLARE(int) t30_set_tx_ira(t30_state_t *s, int type, const char *address, int len)
404 {
405 if (s->tx_info.ira)
406 free(s->tx_info.ira);
407 if (address == NULL)
408 {
409 s->tx_info.ira = NULL;
410 return 0;
411 }
412 s->tx_info.ira = strdup(address);
413 return 0;
414 }
415 /*- End of function --------------------------------------------------------*/
416
417 SPAN_DECLARE(size_t) t30_get_tx_ira(t30_state_t *s, int *type, const char *address[])
418 {
419 if (type)
420 *type = s->tx_info.ira_type;
421 if (address)
422 *address = s->tx_info.ira;
423 return s->tx_info.ira_len;
424 }
425 /*- End of function --------------------------------------------------------*/
426
427 SPAN_DECLARE(size_t) t30_get_rx_ira(t30_state_t *s, int *type, const char *address[])
428 {
429 if (type)
430 *type = s->rx_info.ira_type;
431 if (address)
432 *address = s->rx_info.ira;
433 return s->rx_info.ira_len;
434 }
435 /*- End of function --------------------------------------------------------*/
436
437 SPAN_DECLARE(int) t30_set_tx_cia(t30_state_t *s, int type, const char *address, int len)
438 {
439 if (s->tx_info.cia)
440 free(s->tx_info.cia);
441 if (address == NULL)
442 {
443 s->tx_info.cia = NULL;
444 return 0;
445 }
446 s->tx_info.cia = strdup(address);
447 return 0;
448 }
449 /*- End of function --------------------------------------------------------*/
450
451 SPAN_DECLARE(size_t) t30_get_tx_cia(t30_state_t *s, int *type, const char *address[])
452 {
453 if (type)
454 *type = s->tx_info.cia_type;
455 if (address)
456 *address = s->tx_info.cia;
457 return s->tx_info.cia_len;
458 }
459 /*- End of function --------------------------------------------------------*/
460
461 SPAN_DECLARE(size_t) t30_get_rx_cia(t30_state_t *s, int *type, const char *address[])
462 {
463 if (type)
464 *type = s->rx_info.cia_type;
465 if (address)
466 *address = s->rx_info.cia;
467 return s->rx_info.cia_len;
468 }
469 /*- End of function --------------------------------------------------------*/
470
471 SPAN_DECLARE(int) t30_set_tx_isp(t30_state_t *s, int type, const char *address, int len)
472 {
473 if (s->tx_info.isp)
474 free(s->tx_info.isp);
475 if (address == NULL)
476 {
477 s->tx_info.isp = NULL;
478 return 0;
479 }
480 s->tx_info.isp = strdup(address);
481 return 0;
482 }
483 /*- End of function --------------------------------------------------------*/
484
485 SPAN_DECLARE(size_t) t30_get_tx_isp(t30_state_t *s, int *type, const char *address[])
486 {
487 if (type)
488 *type = s->tx_info.isp_type;
489 if (address)
490 *address = s->tx_info.isp;
491 return s->tx_info.isp_len;
492 }
493 /*- End of function --------------------------------------------------------*/
494
495 SPAN_DECLARE(size_t) t30_get_rx_isp(t30_state_t *s, int *type, const char *address[])
496 {
497 if (type)
498 *type = s->rx_info.isp_type;
499 if (address)
500 *address = s->rx_info.isp;
501 return s->rx_info.isp_len;
502 }
503 /*- End of function --------------------------------------------------------*/
504
505 SPAN_DECLARE(int) t30_set_tx_csa(t30_state_t *s, int type, const char *address, int len)
506 {
507 if (s->tx_info.csa)
508 free(s->tx_info.csa);
509 if (address == NULL)
510 {
511 s->tx_info.csa = NULL;
512 return 0;
513 }
514 s->tx_info.csa = strdup(address);
515 return 0;
516 }
517 /*- End of function --------------------------------------------------------*/
518
519 SPAN_DECLARE(size_t) t30_get_tx_csa(t30_state_t *s, int *type, const char *address[])
520 {
521 if (type)
522 *type = s->tx_info.csa_type;
523 if (address)
524 *address = s->tx_info.csa;
525 return s->tx_info.csa_len;
526 }
527 /*- End of function --------------------------------------------------------*/
528
529 SPAN_DECLARE(size_t) t30_get_rx_csa(t30_state_t *s, int *type, const char *address[])
530 {
531 if (type)
532 *type = s->rx_info.csa_type;
533 if (address)
534 *address = s->rx_info.csa;
535 return s->rx_info.csa_len;
536 }
537 /*- End of function --------------------------------------------------------*/
538
539 SPAN_DECLARE(int) t30_set_tx_page_header_info(t30_state_t *s, const char *info)
540 {
541 if (info == NULL)
542 {
543 s->header_info[0] = '\0';
544 return 0;
545 }
546 if (strlen(info) > T30_MAX_PAGE_HEADER_INFO)
547 return -1;
548 strcpy(s->header_info, info);
549 t4_tx_set_header_info(&s->t4, s->header_info);
550 return 0;
551 }
552 /*- End of function --------------------------------------------------------*/
553
554 SPAN_DECLARE(size_t) t30_get_tx_page_header_info(t30_state_t *s, char *info)
555 {
556 if (info)
557 strcpy(info, s->header_info);
558 return strlen(s->header_info);
559 }
560 /*- End of function --------------------------------------------------------*/
561
562 SPAN_DECLARE(const char *) t30_get_rx_country(t30_state_t *s)
563 {
564 return s->country;
565 }
566 /*- End of function --------------------------------------------------------*/
567
568 SPAN_DECLARE(const char *) t30_get_rx_vendor(t30_state_t *s)
569 {
570 return s->vendor;
571 }
572 /*- End of function --------------------------------------------------------*/
573
574 SPAN_DECLARE(const char *) t30_get_rx_model(t30_state_t *s)
575 {
576 return s->model;
577 }
578 /*- End of function --------------------------------------------------------*/
579
580 SPAN_DECLARE(void) t30_set_rx_file(t30_state_t *s, const char *file, int stop_page)
581 {
582 strncpy(s->rx_file, file, sizeof(s->rx_file));
583 s->rx_file[sizeof(s->rx_file) - 1] = '\0';
584 s->rx_stop_page = stop_page;
585 }
586 /*- End of function --------------------------------------------------------*/
587
588 SPAN_DECLARE(void) t30_set_tx_file(t30_state_t *s, const char *file, int start_page, int stop_page)
589 {
590 strncpy(s->tx_file, file, sizeof(s->tx_file));
591 s->tx_file[sizeof(s->tx_file) - 1] = '\0';
592 s->tx_start_page = start_page;
593 s->tx_stop_page = stop_page;
594 }
595 /*- End of function --------------------------------------------------------*/
596
597 SPAN_DECLARE(void) t30_set_iaf_mode(t30_state_t *s, int iaf)
598 {
599 s->iaf = iaf;
600 }
601 /*- End of function --------------------------------------------------------*/
602
603 SPAN_DECLARE(int) t30_set_ecm_capability(t30_state_t *s, int enabled)
604 {
605 s->ecm_allowed = enabled;
606 t30_build_dis_or_dtc(s);
607 return 0;
608 }
609 /*- End of function --------------------------------------------------------*/
610
611 SPAN_DECLARE(int) t30_set_rx_encoding(t30_state_t *s, int encoding)
612 {
613 switch (encoding)
614 {
615 case T4_COMPRESSION_ITU_T4_1D:
616 case T4_COMPRESSION_ITU_T4_2D:
617 case T4_COMPRESSION_ITU_T6:
618 s->output_encoding = encoding;
619 return 0;
620 }
621 return -1;
622 }
623 /*- End of function --------------------------------------------------------*/
624
625 SPAN_DECLARE(int) t30_set_minimum_scan_line_time(t30_state_t *s, int min_time)
626 {
627 /* There are only certain possible times supported, so we need to select
628 the code which best matches the request. */
629 if (min_time == 0)
630 s->local_min_scan_time_code = 7;
631 else if (min_time <= 5)
632 s->local_min_scan_time_code = 1;
633 else if (min_time <= 10)
634 s->local_min_scan_time_code = 2;
635 else if (min_time <= 20)
636 s->local_min_scan_time_code = 0;
637 else if (min_time <= 40)
638 s->local_min_scan_time_code = 4;
639 else
640 return -1;
641 t30_build_dis_or_dtc(s);
642 return 0;
643 }
644 /*- End of function --------------------------------------------------------*/
645
646 SPAN_DECLARE(int) t30_set_supported_modems(t30_state_t *s, int supported_modems)
647 {
648 s->supported_modems = supported_modems;
649 t30_build_dis_or_dtc(s);
650 return 0;
651 }
652 /*- End of function --------------------------------------------------------*/
653
654 SPAN_DECLARE(int) t30_set_supported_compressions(t30_state_t *s, int supported_compressions)
655 {
656 s->supported_compressions = supported_compressions;
657 t30_build_dis_or_dtc(s);
658 return 0;
659 }
660 /*- End of function --------------------------------------------------------*/
661
662 SPAN_DECLARE(int) t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions)
663 {
664 s->supported_resolutions = supported_resolutions;
665 t30_build_dis_or_dtc(s);
666 return 0;
667 }
668 /*- End of function --------------------------------------------------------*/
669
670 SPAN_DECLARE(int) t30_set_supported_image_sizes(t30_state_t *s, int supported_image_sizes)
671 {
672 s->supported_image_sizes = supported_image_sizes;
673 t30_build_dis_or_dtc(s);
674 return 0;
675 }
676 /*- End of function --------------------------------------------------------*/
677
678 SPAN_DECLARE(int) t30_set_supported_t30_features(t30_state_t *s, int supported_t30_features)
679 {
680 s->supported_t30_features = supported_t30_features;
681 t30_build_dis_or_dtc(s);
682 return 0;
683 }
684 /*- End of function --------------------------------------------------------*/
685
686 SPAN_DECLARE(void) t30_set_status(t30_state_t *s, int status)
687 {
688 s->current_status = status;
689 }
690 /*- End of function --------------------------------------------------------*/
691
692 SPAN_DECLARE(int) t30_set_receiver_not_ready(t30_state_t *s, int count)
693 {
694 s->receiver_not_ready_count = count;
695 return 0;
696 }
697 /*- End of function --------------------------------------------------------*/
698
699 SPAN_DECLARE(void) t30_set_phase_b_handler(t30_state_t *s, t30_phase_b_handler_t *handler, void *user_data)
700 {
701 s->phase_b_handler = handler;
702 s->phase_b_user_data = user_data;
703 }
704 /*- End of function --------------------------------------------------------*/
705
706 SPAN_DECLARE(void) t30_set_phase_d_handler(t30_state_t *s, t30_phase_d_handler_t *handler, void *user_data)
707 {
708 s->phase_d_handler = handler;
709 s->phase_d_user_data = user_data;
710 }
711 /*- End of function --------------------------------------------------------*/
712
713 SPAN_DECLARE(void) t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t *handler, void *user_data)
714 {
715 s->phase_e_handler = handler;
716 s->phase_e_user_data = user_data;
717 }
718 /*- End of function --------------------------------------------------------*/
719
720 SPAN_DECLARE(void) t30_set_document_handler(t30_state_t *s, t30_document_handler_t *handler, void *user_data)
721 {
722 s->document_handler = handler;
723 s->document_user_data = user_data;
724 }
725 /*- End of function --------------------------------------------------------*/
726
727 SPAN_DECLARE(void) t30_set_real_time_frame_handler(t30_state_t *s, t30_real_time_frame_handler_t *handler, void *user_data)
728 {
729 s->real_time_frame_handler = handler;
730 s->real_time_frame_user_data = user_data;
731 }
732 /*- End of function --------------------------------------------------------*/
733
734 SPAN_DECLARE(logging_state_t *) t30_get_logging_state(t30_state_t *s)
735 {
736 return &s->logging;
737 }
738 /*- End of function --------------------------------------------------------*/
739 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.