// Build don't link: // Special g++ Options: -w // GROUPS passed old-abort typedef char * __gnuc_va_list; void va_end (__gnuc_va_list); enum __va_type_classes { __no_type_class = -1, __void_type_class, __integer_type_class, __char_type_class, __enumeral_type_class, __boolean_type_class, __pointer_type_class, __reference_type_class, __offset_type_class, __real_type_class, __complex_type_class, __function_type_class, __method_type_class, __record_type_class, __union_type_class, __array_type_class, __string_type_class, __set_type_class, __file_type_class, __lang_type_class }; typedef __gnuc_va_list va_list; typedef int jmp_buf[9 ]; typedef int sigjmp_buf[9 +1]; int setjmp (jmp_buf) ; int _setjmp (jmp_buf) ; int sigsetjmp (sigjmp_buf, int) ; void longjmp (jmp_buf, int) ; void _longjmp (jmp_buf, int) ; void siglongjmp (sigjmp_buf, int) ; const int BOR_C_DIR = 0; const int BOR_C_REV = 1; const int BOR_C = 0x1; const int BOR_BD_DIR = (0<<1); const int BOR_BD_REV = (1<<1); const int BOR_BD = 0x2; const int SERVICE_DATA = (1<<( 0 )) ; const int SERVICE_CLASS1 = (1<<( 1 )) ; const int SERVICE_CLASS2 = (1<<( 2 )) ; const int SERVICE_CLASS20 = (1<<( 3 )) ; const int SERVICE_VOICE = (1<<( 8 )) ; const int SERVICE_ALL = (1<<( 9 )) -1; const int VR_NORMAL = 0; const int VR_FINE = 1; const int VR_ALL = (1<<( VR_FINE+1 )) -1; const int BR_2400 = 0; const int BR_4800 = 1; const int BR_7200 = 2; const int BR_9600 = 3; const int BR_12000 = 4; const int BR_14400 = 5; const int BR_ALL = (1<<( BR_14400+1 )) -1; const int WD_1728 = 0; const int WD_2048 = 1; const int WD_2432 = 2; const int WD_1216 = 3; const int WD_864 = 4; const int WD_ALL = (1<<( WD_864+1 )) -1; const int LN_A4 = 0; const int LN_B4 = 1; const int LN_INF = 2; const int LN_ALL = (1<<( LN_INF+1 )) -1; const int DF_1DMR = 0; const int DF_2DMR = 1; const int DF_2DMRUNCOMP = 2; const int DF_2DMMR = 3; const int DF_ALL = (1<<( DF_2DMMR+1 )) -1; const int EC_DISABLE = 0; const int EC_ENABLE = 1; const int EC_ALL = 0x3; const int BF_DISABLE = 0; const int BF_ENABLE = 1; const int BF_ALL = 0x3; const int ST_0MS = 0; const int ST_5MS = 1; const int ST_10MS2 = 2; const int ST_10MS = 3; const int ST_20MS2 = 4; const int ST_20MS = 5; const int ST_40MS2 = 6; const int ST_40MS = 7; const int ST_ALL = (1<<( ST_40MS+1 )) -1; const int PPM_MPS = 0; const int PPM_EOM = 1; const int PPM_EOP = 2; const int PPM_PRI_MPS = 4; const int PPM_PRI_EOM = 5; const int PPM_PRI_EOP = 6; const int PPR_MCF = 1; const int PPR_RTN = 2; const int PPR_RTP = 3; const int PPR_PIN = 4; const int PPR_PIP = 5; const int DLE = 16; const int SUB = 26; const int ETX = 3; const int DC1 = 17; const int DC2 = 18; const int CAN = 24; typedef int sigset_t; typedef unsigned int speed_t; typedef unsigned long tcflag_t; typedef unsigned char cc_t; typedef int pid_t; typedef unsigned short mode_t; typedef short nlink_t; typedef long clock_t; typedef long time_t; typedef __SIZE_TYPE__ size_t; typedef int ptrdiff_t; typedef __wchar_t wchar_t; extern unsigned int _mb_cur_max; extern void abort( ); extern int abs (int) ; extern double atof (const char *) ; extern int atoi (const char *) ; extern long int atol (const char *) ; extern char * bsearch (const void *, const void *, long unsigned int , long unsigned int , int (*) (const void *, const void *)) ; extern void * calloc (long unsigned int , long unsigned int ) ; extern void exit (int) ; extern void free (void *) ; extern char * getenv (const char *) ; extern void * malloc (long unsigned int ) ; extern int qsort (void *, long unsigned int , long unsigned int , int (*) (const void *, const void *)) ; extern int rand( ); extern void * realloc (void *, long unsigned int ) ; extern int srand (unsigned int) ; extern int mbtowc (__wchar_t *, const char *, long unsigned int ) ; extern int wctomb (char *, __wchar_t ) ; extern size_t mbstowcs (__wchar_t *, const char *, long unsigned int ) ; extern size_t wcstombs (char *, const __wchar_t *, long unsigned int ) ; extern int atexit (void (*) (void)); extern long int labs (long int); extern int putenv (char *); extern double strtod (const char *, char **); extern long int strtol (const char *, char **, int); extern long unsigned int strtoul (const char *, char **, int); extern int system (const char *); extern char * strcat (char *, const char *) ; extern char * strchr (const char *, int) ; extern int strcmp (const char *, const char *) ; extern char * strcpy (char *, const char *) ; extern size_t strcspn (const char *, const char *) ; extern char * strdup (const char *) ; extern size_t strlen (const char *) ; extern char * strncat (char *, const char *, long unsigned int ) ; extern int strncmp (const char *, const char *, long unsigned int ) ; extern char * strncpy (char *, const char *, long unsigned int ) ; extern char * strpbrk (const char *, const char *) ; extern char * strrchr (const char *, int) ; extern size_t strspn (const char *, const char *) ; extern char * strstr (const char *, const char *) ; extern char * strtok (char *, const char *) ; extern void * memchr (const void *, int, long unsigned int ); extern int memcmp (const void *, const void *, long unsigned int ); extern void * memcpy (void *, const void *, long unsigned int ); extern void * memmove (void *, const void *, long unsigned int ); extern void * memset (void *, int, long unsigned int ); extern int strcoll (const char *, const char *); extern char * strerror (int); extern long unsigned int strxfrm (char *, const char *, long unsigned int ); extern "C" { extern void __eprintf (const char *, const char *, unsigned, const char *); } extern struct _iobuf { int _cnt; unsigned char *_ptr; unsigned char *_base; int _bufsiz; short _flag; char _file; } _iob[]; extern struct _iobuf *fopen (const char *, const char *) ; extern struct _iobuf *fdopen (int, const char *) ; extern struct _iobuf *freopen (const char *, const char *, struct _iobuf *) ; extern struct _iobuf *popen (const char *, const char *) ; extern struct _iobuf *tmpfile(); extern long ftell (struct _iobuf *) ; extern char *fgets (char *, int, struct _iobuf *) ; extern char *gets (char *) ; extern char *sprintf (char *, const char *, ...) ; extern char *ctermid (char *) ; extern char *cuserid (char *) ; extern char *tempnam (const char *, const char *) ; extern char *tmpnam (char *) ; extern int fclose (struct _iobuf *); extern int fflush (struct _iobuf *); extern int fgetc (struct _iobuf *); extern int fgetpos (struct _iobuf *, long *); extern int fprintf (struct _iobuf *, const char *, ...); extern int fputc (int, struct _iobuf *); extern int fputs (const char *, struct _iobuf *); extern long unsigned int fread (void *, long unsigned int , long unsigned int , struct _iobuf *); extern int fscanf (struct _iobuf *, const char *, ...); extern int fseek (struct _iobuf *, long int, int); extern int fsetpos (struct _iobuf *, const long *); extern long unsigned int fwrite (const void *, long unsigned int , long unsigned int , struct _iobuf *); extern int pclose (struct _iobuf *); extern void perror (const char *); extern int printf (const char *, ...); extern int puts (const char *); extern int remove (const char *); extern int rename (const char *, const char *); extern void rewind (struct _iobuf *); extern int scanf (const char *, ...); extern void setbuf (struct _iobuf *, char *); extern int setvbuf (struct _iobuf *, char *, int, long unsigned int ); extern int sscanf (const char *, const char *, ...); extern int vprintf (const char *, __gnuc_va_list); extern int vsprintf (char *, const char *, __gnuc_va_list); extern int vfprintf (struct _iobuf *, const char *, __gnuc_va_list); extern int ungetc (int, struct _iobuf *); extern int _flsbuf (unsigned int, struct _iobuf *); extern int _filbuf (struct _iobuf *); typedef long _G_clock_t; typedef short _G_dev_t; typedef long _G_fpos_t; typedef unsigned short _G_gid_t; typedef unsigned long _G_ino_t; typedef unsigned short _G_mode_t; typedef short _G_nlink_t; typedef long _G_off_t; typedef int _G_pid_t; typedef int _G_ptrdiff_t; typedef int _G_sigset_t; typedef long unsigned int _G_size_t; typedef long _G_time_t; typedef unsigned short _G_uid_t; typedef __wchar_t _G_wchar_t; typedef int _G_ssize_t; typedef int _G_wint_t; typedef char * _G_va_list; typedef signed char _G_int8_t; typedef unsigned char _G_uint8_t; typedef short _G_int16_t; typedef unsigned short _G_uint16_t; typedef long _G_int32_t; typedef unsigned long _G_uint32_t; const size_t NPOS = (size_t)(-1); typedef void fvoid_t(); typedef _G_wint_t wint_t; enum capacity { default_size, reserve }; extern "C" fvoid_t *set_new_handler(fvoid_t *); extern fvoid_t *__new_handler; extern "C" void __default_new_handler(); inline void *operator new(size_t, void *place) { return place; } inline void *operator new[](size_t, void *place) { return place; } typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; typedef unsigned short ushort; typedef unsigned int uint; typedef struct _physadr_t { int r[1]; } *physadr_t; typedef struct label_t { int val[2]; } label_t; typedef struct _quad_t { long val[2]; } quad_t; typedef long daddr_t; typedef char * caddr_t; typedef unsigned long ino_t; typedef short dev_t; typedef long off_t; typedef unsigned short uid_t; typedef unsigned short gid_t; typedef long key_t; typedef char * addr_t; typedef long fd_mask; typedef struct fd_set { fd_mask fds_bits[((( 256 )+(( (sizeof (fd_mask) * 8 ) )-1))/( (sizeof (fd_mask) * 8 ) )) ]; } fd_set; extern "C" { extern int mkstemp(char *); extern int strncasecmp(const char*, const char*, size_t); extern int strcasecmp(const char*, const char*); extern long random(void); extern int seteuid(uid_t); extern int setegid(gid_t); extern int ftruncate(int, off_t); extern int getdtablesize(void); struct fd_set; struct timeval; extern int select(int,struct fd_set*,struct fd_set*,struct fd_set*,struct timeval*); extern int ioctl(int, int, ...); extern int fchown(int, uid_t, gid_t); extern int gethostname(char*, int); extern char* optarg; extern int opterr; extern int optind; extern char* mktemp(char*); extern void syslog(int, const char*, ...); extern void vsyslog(int, const char*, va_list); extern void closelog(void); extern void openlog(const char*, int, int); extern int fchmod(int, mode_t); struct timezone; struct timeval; extern int gettimeofday(struct timeval*, struct timezone*); extern void endpwent(void); extern int getpeername(int,void*,int*); extern int getsockname(int,void*,int*); extern int socket(int, int, int); extern int connect(int, const void*, int); extern int flock(int, int); } typedef unsigned char fxBool; inline int fxmin(int a, int b) { return (a < b) ? a : b; } inline u_long fxmin(u_long a, u_long b) { return (a < b) ? a : b; } inline u_int fxmin(u_int a, u_int b) { return (a < b) ? a : b; } inline int fxmax(int a, int b) { return (a > b) ? a : b; } inline u_long fxmax(u_long a, u_long b) { return (a > b) ? a : b; } inline u_int fxmax(u_int a, u_int b) { return (a > b) ? a : b; } extern "C" void _fxassert(const char*, const char*, int); class fxObj { public: fxObj(); virtual ~fxObj(); void inc(); void dec(); u_long getReferenceCount(); virtual const char* className() const; int compare(const fxObj *) const; virtual void subClassMustDefine(const char* method) const; protected: u_long referenceCount; }; inline fxObj::fxObj() { referenceCount = 0; } inline void fxObj::inc() { ++referenceCount; } inline void fxObj::dec() { if ( referenceCount>0 ); else _fxassert( "Bogus object reference count" ,"../util/Obj.h",54); ; if (0 >= --referenceCount) delete this; } inline u_long fxObj::getReferenceCount() { return referenceCount; } class fxStr; class fxTempStr { public: fxTempStr(fxTempStr const &other); ~fxTempStr(); friend fxTempStr operator|(fxStr const&, fxStr const&); friend fxTempStr operator|(fxStr const&, char const*); friend fxTempStr operator|(char const*, fxStr const&); friend fxTempStr& operator|(const fxTempStr&, fxStr const& b); friend fxTempStr& operator|(const fxTempStr&, char const* b); operator char*() const; operator int() const; operator float() const; operator double() const; u_int length() const; protected: char indata[100]; char* data; u_int slength; friend class fxStr; fxTempStr(char const *, u_int, char const *, u_int); fxTempStr& concat(char const* b, u_int bl); }; inline fxTempStr::operator char*() const { return data; } inline fxTempStr::operator int() const { return atoi(data); } inline fxTempStr::operator float() const { return float(atof(data)); } inline fxTempStr::operator double() const { return double(atof(data)); } inline u_int fxTempStr::length() const { return slength - 1; } class fxStr { friend class fxTempStr; public: fxStr(u_int l=0); fxStr(char const *s); fxStr(char const *s, u_int len); fxStr(fxStr const&); fxStr(int, char const* format); fxStr(long, char const* format); fxStr(float, char const* format); fxStr(double, char const* format); fxStr(const fxTempStr&); ~fxStr(); u_long hash() const; operator char*() const { return data; } operator int() const { return atoi(data); } operator float() const { return float(atof(data)); } operator double() const { return double(atof(data)); } u_int length() const { return slength-1; } char& operator[](u_int i) const { if ( i=(fxStr const&, fxStr const&); friend fxBool operator>=(fxStr const&, char const*); friend fxBool operator>=(char const*, fxStr const&); friend fxBool operator<=(fxStr const&, fxStr const&); friend fxBool operator<=(fxStr const&, char const*); friend fxBool operator<=(char const*, fxStr const&); friend fxBool operator>(fxStr const&, fxStr const&); friend fxBool operator>(fxStr const&, char const*); friend fxBool operator>(char const*, fxStr const&); friend fxBool operator<(fxStr const&, fxStr const&); friend fxBool operator<(fxStr const&, char const*); friend fxBool operator<(char const*, fxStr const&); int compare(fxStr const *a) const { return ::compare(*this, *a); } friend int compare(fxStr const&, fxStr const&); friend int compare(fxStr const&, char const*); friend int compare(char const*, fxStr const&); friend fxTempStr& operator|(const fxTempStr&, fxStr const&); friend fxTempStr& operator|(const fxTempStr&, char const*); friend fxTempStr operator|(fxStr const&, fxStr const&); friend fxTempStr operator|(fxStr const&, char const*); friend fxTempStr operator|(char const*, fxStr const&); fxStr copy() const; fxStr extract(u_int start,u_int len) const; fxStr cut(u_int start,u_int len); fxStr head(u_int) const; fxStr tail(u_int) const; void lowercase(u_int posn=0, u_int len=0); void raisecase(u_int posn=0, u_int len=0); void remove(u_int posn,u_int len=1); void resize(u_int len, fxBool reallocate = ((fxBool)0) ); void setMaxLength(u_int maxlen); void append(char a); void append(char const *s, u_int len=0); void append(const fxTempStr& s) { append((char*)s, s.slength-1); } void append(fxStr const& s) { append((char*)s, s.slength-1); } void insert(char a, u_int posn=0); void insert(char const *, u_int posn=0, u_int len=0); void insert(const fxTempStr& s, u_int posn=0) { insert((char*)s, posn, s.slength-1); } void insert(fxStr const& s, u_int posn=0) { insert((char*)s, posn, s.slength-1); } u_int next(u_int posn, char delimiter) const; u_int next(u_int posn, char const *delimiters, u_int len=0) const; u_int next(u_int posn, fxStr const& delimiters) const { return next(posn, (char*)delimiters, delimiters.slength-1); } u_int nextR(u_int posn, char delimiter) const; u_int nextR(u_int posn, char const*, u_int len=0) const; u_int nextR(u_int posn, fxStr const& delimiters) const { return nextR(posn, (char*)delimiters, delimiters.slength-1); } u_int skip(u_int posn, char a) const; u_int skip(u_int posn, char const *, u_int len=0) const; u_int skip(u_int posn, fxStr const& delimiters) const { return skip(posn, (char*)delimiters, delimiters.slength-1); } u_int skipR(u_int posn, char a) const; u_int skipR(u_int posn, char const *, u_int len=0) const; u_int skipR(u_int posn, fxStr const& delimiters) const { return skipR(posn, (char*)delimiters, delimiters.slength-1); } fxStr token(u_int & posn, char delimiter) const; fxStr token(u_int & posn, char const * delimiters, u_int delimiters_len = 0) const; fxStr token(u_int & posn, fxStr const & delimiters) const { return token(posn, delimiters.data, delimiters.slength-1); } fxStr tokenR(u_int & posn, char delimiter) const; fxStr tokenR(u_int & posn, char const * delimiters, u_int delimiters_len = 0) const; fxStr tokenR(u_int & posn, fxStr const & delimiters) const { return tokenR(posn, delimiters.data, delimiters.slength-1); } protected: u_int slength; char * data; static char emptyString; void fxStr::resizeInternal(u_int); int findEndBuffer(const char *, u_int buflen) const; int findBuffer(const char *buf, u_int buflen) const; void bracketBuffer(const char *, u_int buflen, int &, int &) const; }; struct Class2Params { u_int vr; u_int br; u_int wd; u_int ln; u_int df; u_int ec; u_int bf; u_int st; static u_int vrDISTab[2]; static u_int dfDISTab[4]; static u_int wdDISTab[8]; static u_int lnDISTab[3]; static u_int stDISTab[8]; static u_int stDCSTab[8]; static u_int brDISTab[8]; static u_int brDCSTab[8]; static u_int DISvrTab[2]; static u_int DISdfTab[2]; static u_int DISwdTab[4]; static u_int DISlnTab[4]; static u_int DISstTab[8]; static u_int DISbrTab[16]; static u_int DCSbrTab[16]; static const char* bitRateNames[8]; static const char* dataFormatNames[4]; static const char* vresNames[2]; static const char* pageWidthNames[8]; static const char* pageLengthNames[4]; static const char* scanlineTimeNames[8]; Class2Params(); int operator==(const Class2Params&) const; int operator!=(const Class2Params&) const; fxStr cmd() const; void setFromDIS(u_int dis, u_int xinfo = 0); void setFromDCS(u_int dcs, u_int xinfo = 0); u_int getDCS() const; fxBool is2D() const; u_int pageWidth() const; u_int transferSize(u_int ms) const; u_int minScanlineSize() const; fxStr encode() const; void decode(const fxStr&); }; typedef struct { unsigned short tiff_magic; unsigned short tiff_version; unsigned long tiff_diroff; } TIFFHeader; typedef struct { unsigned short tdir_tag; unsigned short tdir_type; unsigned long tdir_count; unsigned long tdir_offset; } TIFFDirEntry; typedef enum { TIFF_NOTYPE = 0, TIFF_BYTE = 1, TIFF_ASCII = 2, TIFF_SHORT = 3, TIFF_LONG = 4, TIFF_RATIONAL = 5, TIFF_SBYTE = 6, TIFF_UNDEFINED = 7, TIFF_SSHORT = 8, TIFF_SLONG = 9, TIFF_SRATIONAL = 10, TIFF_FLOAT = 11, TIFF_DOUBLE = 12 } TIFFDataType; typedef struct tiff TIFF; extern int fclose (struct _iobuf *); extern int fflush (struct _iobuf *); extern int fgetc (struct _iobuf *); extern int fgetpos (struct _iobuf *, long *); extern int fprintf (struct _iobuf *, const char *, ...); extern int fputc (int, struct _iobuf *); extern int fputs (const char *, struct _iobuf *); extern long unsigned int fread (void *, long unsigned int , long unsigned int , struct _iobuf *); extern int fscanf (struct _iobuf *, const char *, ...); extern int fseek (struct _iobuf *, long int, int); extern int fsetpos (struct _iobuf *, const long *); extern long unsigned int fwrite (const void *, long unsigned int , long unsigned int , struct _iobuf *); extern int pclose (struct _iobuf *); extern void perror (const char *); extern int printf (const char *, ...); extern int puts (const char *); extern int remove (const char *); extern int rename (const char *, const char *); extern void rewind (struct _iobuf *); extern int scanf (const char *, ...); extern void setbuf (struct _iobuf *, char *); extern int setvbuf (struct _iobuf *, char *, int, long unsigned int ); extern int sscanf (const char *, const char *, ...); extern int vprintf (const char *, __gnuc_va_list); extern int vsprintf (char *, const char *, __gnuc_va_list); extern int vfprintf (struct _iobuf *, const char *, __gnuc_va_list); extern int ungetc (int, struct _iobuf *); extern int _flsbuf (unsigned int, struct _iobuf *); extern int _filbuf (struct _iobuf *); typedef void (*TIFFErrorHandler)(const char* module, const char* fmt, va_list); typedef int (*TIFFReadWriteProc)(void*, char*, unsigned long); typedef long (*TIFFSeekProc)(void*, long, int); typedef int (*TIFFCloseProc)(void*); typedef long (*TIFFSizeProc)(void*); typedef int (*TIFFMapFileProc)(void*, char**, long*); typedef void (*TIFFUnmapFileProc)(void*, char*, long); extern "C" { extern const char* TIFFGetVersion(); extern void TIFFClose(TIFF*); extern int TIFFFlush(TIFF*); extern int TIFFFlushData(TIFF*); extern int TIFFGetField(TIFF*, unsigned int, ...); extern int TIFFVGetField(TIFF*, unsigned int, va_list); extern int TIFFGetFieldDefaulted(TIFF*, unsigned int, ...); extern int TIFFVGetFieldDefaulted(TIFF*, unsigned int, va_list); extern int TIFFReadDirectory(TIFF*); extern unsigned long TIFFScanlineSize(TIFF*); extern unsigned long TIFFStripSize(TIFF*); extern unsigned long TIFFVStripSize(TIFF*, unsigned long); extern unsigned long TIFFTileRowSize(TIFF*); extern unsigned long TIFFTileSize(TIFF*); extern unsigned long TIFFVTileSize(TIFF*, unsigned long); extern int TIFFFileno(TIFF*); extern int TIFFGetMode(TIFF*); extern int TIFFIsTiled(TIFF*); extern long TIFFCurrentRow(TIFF*); extern int TIFFCurrentDirectory(TIFF*); extern int TIFFCurrentStrip(TIFF*); extern int TIFFCurrentTile(TIFF*); extern int TIFFReadBufferSetup(TIFF*, char*, unsigned long); extern int TIFFLastDirectory(TIFF*); extern int TIFFSetDirectory(TIFF*, int); extern int TIFFSetField(TIFF*, unsigned int, ...); extern int TIFFVSetField(TIFF*, unsigned int, va_list); extern int TIFFWriteDirectory(TIFF *); extern void TIFFPrintDirectory(TIFF*, struct _iobuf *, long = 0); extern int TIFFReadScanline(TIFF*, unsigned char*, unsigned, unsigned = 0); extern int TIFFWriteScanline(TIFF*, unsigned char*, unsigned, unsigned = 0); extern int TIFFReadRGBAImage(TIFF*, unsigned long, unsigned long, unsigned long*, int stop = 0); extern TIFF* TIFFOpen(const char*, const char*); extern TIFF* TIFFFdOpen(int, const char*, const char*); extern TIFF* TIFFClientOpen(const char* name, const char* mode, void* clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc); extern const char* TIFFFileName(TIFF*); extern void TIFFError(const char*, const char*, ...); extern void TIFFWarning(const char*, const char*, ...); extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler); extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler); extern unsigned int TIFFComputeTile(TIFF*, unsigned long, unsigned long, unsigned long, unsigned int); extern int TIFFCheckTile(TIFF*, unsigned long, unsigned long, unsigned long, unsigned); extern unsigned int TIFFNumberOfTiles(TIFF*); extern int TIFFReadTile(TIFF*, unsigned char*, unsigned long, unsigned long, unsigned long, unsigned int); extern int TIFFWriteTile(TIFF*, unsigned char*, unsigned long, unsigned long, unsigned long, unsigned int); extern unsigned int TIFFComputeStrip(TIFF*, unsigned long, unsigned int); extern unsigned int TIFFNumberOfStrips(TIFF*); extern int TIFFReadEncodedStrip(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFReadRawStrip(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFReadEncodedTile(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFReadRawTile(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFWriteEncodedStrip(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFWriteRawStrip(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFWriteEncodedTile(TIFF*, unsigned, unsigned char*, unsigned long); extern int TIFFWriteRawTile(TIFF*, unsigned, unsigned char*, unsigned long); extern void TIFFSetWriteOffset(TIFF*, unsigned long); extern void TIFFSwabShort(unsigned short *); extern void TIFFSwabLong(unsigned long *); extern void TIFFSwabArrayOfShort(unsigned short *, unsigned long); extern void TIFFSwabArrayOfLong(unsigned long *, unsigned long); extern void TIFFReverseBits(unsigned char *, unsigned long); extern const unsigned char* TIFFGetBitRevTable(int); } struct G3Base { short data; short bit; fxBool is2D; enum { G3_1D, G3_2D } tag; const u_char* bitmap; static const u_char zeroruns[256]; static const u_char oneruns[256]; static int findspan(const u_char**, int, int, const u_char*); static int finddiff(const u_char*, int, int); static void fillspan(u_char* cp, int x, int count); void setup(const u_char*, fxBool is2d); }; class fxStackBuffer; class G3Decoder : private G3Base { private: short bytePending; short prevByte; u_char* refline; fxStackBuffer* recvBuf; fxBool decode1DRow(u_char*, u_int); fxBool decode2DRow(u_char*, u_int); int nextBit(); void ungetBit(); int nextByte(); int decodeWhiteRun(); int decodeBlackRun(); int decodeUncompCode(); void skipToEOL(int len); protected: G3Decoder(); void raiseEOF(); void raiseRTC(); void setPendingByte(u_char); virtual int decodeNextByte() = 0; void setRefLine(u_char*); u_char* getRefLine(); virtual void invalidCode(const char* type, int x); virtual void prematureEOL(const char* type, int x); virtual void badPixelCount(const char* type, int x); virtual void badDecodingState(const char* type, int x); public: sigjmp_buf jmpEOF; sigjmp_buf jmpRTC; virtual ~G3Decoder(); void setupDecoder(u_int, fxBool is2D); void decode(void* raster, u_int w, u_int h); void skip(u_int h); void skipLeader(); fxBool decodeRow(void* scanline, u_int w); void skipRow(); fxBool isLastRow1D(); fxBool isNextRow1D(); fxBool isByteAligned(); void setRecvBuf(fxStackBuffer&); fxStackBuffer* getRecvBuf(); void flushRecvBuf(); }; inline void G3Decoder::setRecvBuf(fxStackBuffer& b){ recvBuf = &b; } inline fxStackBuffer* G3Decoder::getRecvBuf() { return recvBuf; } inline void G3Decoder::setRefLine(u_char* b) { refline = b; } inline u_char* G3Decoder::getRefLine() { return refline; } inline fxBool G3Decoder::isLastRow1D() { return tag == G3_1D; } enum FaxSendStatus { send_retry, send_failed, send_done, send_reformat, }; class FaxServer; class FaxMachineInfo; class ModemConfig; class fxStackBuffer; class FaxFont; class FaxRequest; typedef unsigned int CallStatus; typedef unsigned int CallType; typedef unsigned int AnswerType; typedef unsigned int SpeakerVolume; typedef unsigned int ATResponse; typedef unsigned int BaudRate; typedef unsigned int FlowControl; typedef unsigned int SetAction; typedef struct { const char* msg; u_short len; ATResponse expect; CallStatus status; CallType type; } AnswerMsg; class FaxModem : public G3Decoder { public: static FaxModem* deduceModem(FaxServer&, const ModemConfig& config); enum { OK = 0, BUSY = 1, NOCARRIER = 2, NOANSWER = 3, NODIALTONE = 4, ERROR = 5, FAILURE = 6, NOFCON = 7, DATACONN = 8, }; enum { CALLTYPE_ERROR = 0, CALLTYPE_DATA = 1, CALLTYPE_FAX = 2, CALLTYPE_VOICE = 3, CALLTYPE_UNKNOWN = 4, }; enum { OFF = 0, QUIET = 1, LOW = 2, MEDIUM = 3, HIGH = 4, }; enum { BR0 = 0, BR300 = 1, BR1200 = 2, BR2400 = 3, BR4800 = 4, BR9600 = 5, BR19200 = 6, BR38400 = 7, BR57600 = 8, BR76800 = 9, }; enum { FLOW_NONE = 0, FLOW_XONXOFF = 1, FLOW_RTSCTS = 2 }; enum { ACT_NOW = 0, ACT_DRAIN = 1, ACT_FLUSH = 2, }; enum { ANSTYPE_ANY = 0, ANSTYPE_DATA = 1, ANSTYPE_FAX = 2, ANSTYPE_VOICE = 3, }; enum { AT_NOTHING = 0, AT_OK = 1, AT_CONNECT = 2, AT_NOANSWER = 3, AT_NOCARRIER = 4, AT_NODIALTONE = 5, AT_BUSY = 6, AT_OFFHOOK = 7, AT_RING = 8, AT_ERROR = 9, AT_EMPTYLINE = 10, AT_TIMEOUT = 11, AT_OTHER = 12, }; private: FaxServer& server; fxStr resetCmds; long dataTimeout; BaudRate rate; FlowControl iFlow; FlowControl oFlow; u_int pageNumber; FaxFont* tagLineFont; u_int tagLineSlop; fxStr tagLine; u_int tagLineFields; void setupTagLine(const FaxRequest&); u_int cblc; fxBool lastRowBad; u_long recvEOLCount; u_long recvBadLineCount; u_long recvConsecutiveBadLineCount; u_int recvCC; fxStackBuffer* recvBuf; u_long savedWriteOff; void recvRow(TIFF* tif, fxStackBuffer& row, u_char* buf); void invalidCode(const char* type, int x); void prematureEOL(const char* type, int x); void badPixelCount(const char* type, int x); void badDecodingState(const char* type, int x); protected: const ModemConfig& conf; FlowControl flowControl; u_int modemServices; fxStr modemMfr; fxStr modemModel; fxStr modemRevision; Class2Params modemParams; char rbuf[1024]; ATResponse lastResponse; fxStr mfrQueryCmd; fxStr modelQueryCmd; fxStr revQueryCmd; static const char* serviceNames[9]; static const u_char digitMap[12*2+1]; static const char* callStatus[9]; FaxModem(FaxServer&, const ModemConfig&); virtual fxBool selectBaudRate(BaudRate max, FlowControl i, FlowControl o); virtual fxBool setupModem() = 0; virtual fxBool setupManufacturer(fxStr& mfr); virtual fxBool setupModel(fxStr& model); virtual fxBool setupRevision(fxStr& rev); fxBool doQuery(const fxStr& queryCmd, fxStr& result, long ms = 30*1000); virtual const AnswerMsg* findAnswer(const char* s); virtual CallType answerResponse(fxStr& emsg); virtual CallStatus dialResponse(fxStr& emsg) = 0; void setDataTimeout(long secs, u_int br); long getDataTimeout() const; void pause(u_int ms); void countPage(); void modemTrace(const char* fmt, ...); void modemSupports(const char* fmt, ...); void modemCapability(const char* fmt, ...); void protoTrace(const char* fmt, ...); void recvTrace(const char* fmt, ...); void copyQualityTrace(const char* fmt, ...); void serverTrace(const char* fmt, ...); void traceBits(u_int bits, const char* bitNames[]); void traceModemParams(); void tracePPR(const char* dir, u_int ppr); void tracePPM(const char* dir, u_int ppm); void trimModemLine(char buf[], int& cc); int getModemLine(char buf[], u_int bufSize, long ms = 0); void beginTimedTransfer(); void endTimedTransfer(); fxBool wasTimeout(); void setTimeout(fxBool); void flushModemInput(); fxBool putModem(void* data, int n, long ms = 0); fxBool putModemData(void* data, int n); fxBool putModemDLEData(const u_char* data, u_int, const u_char* brev, long ms); fxBool putModemLine(const char* cp); int getModemChar(long ms = 0); int getModemDataChar(); void startTimeout(long ms); void stopTimeout(const char* whichdir); static const char* ATresponses[13]; virtual ATResponse atResponse(char* buf, long ms = 30*1000); virtual fxBool waitFor(ATResponse wanted, long ms = 30*1000); fxBool atCmd(const fxStr& cmd, ATResponse = AT_OK, long ms = 30*1000); fxBool atQuery(const char* what, u_int& v, long ms = 30*1000); fxBool atQuery(const char* what, fxStr& v, long ms = 30*1000); u_int fromHex(const char*, int = -1); fxStr toHex(int, int ndigits); fxBool parseRange(const char*, u_int&); fxBool vparseRange(const char*, int nargs ...); fxBool vatFaxCmd(ATResponse resp, const char* cmd ... ); fxBool sendBreak(fxBool pause); fxBool setBaudRate(BaudRate rate); fxBool setBaudRate(BaudRate rate, FlowControl i, FlowControl o); fxBool setXONXOFF(FlowControl i, FlowControl o, SetAction); fxBool setDTR(fxBool on); fxBool setInputBuffering(fxBool on); fxBool modemStopOutput(); FlowControl getInputFlow(); FlowControl getOutputFlow(); fxBool getProtocolTracing(); fxBool getHDLCTracing(); FaxSendStatus sendSetupParams(TIFF*, Class2Params&, FaxMachineInfo&, fxStr&); fxBool recvCheckTSI(const fxStr&); void recvCSI(fxStr&); void recvDCS(Class2Params&); void recvNSF(u_int nsf); void recvSetupPage(TIFF* tif, long group3opts, int fillOrder); void recvResetPage(TIFF* tif); fxBool abortRequested(); fxBool decodePPM(const fxStr& pph, u_int& ppm, fxStr& emsg); fxBool recvPageDLEData(TIFF* tif, fxBool checkQuality, const Class2Params& params, fxStr& emsg); virtual void abortPageRecv() = 0; virtual int decodeNextByte(); fxBool checkQuality(); fxBool isQualityOK(const Class2Params&); u_long getRecvEOLCount() const; u_long getRecvBadLineCount() const; u_long getRecvConsecutiveBadLineCount() const; fxBool setupTagLineSlop(const Class2Params&); u_int getTagLineSlop() const; u_char* imageTagLine(u_char* buf, u_int fillorder, const Class2Params&); public: virtual ~FaxModem(); virtual fxBool dataService(); virtual fxBool voiceService(); virtual fxBool sync(long ms = 0); virtual fxBool reset(long ms = 5*1000); virtual void hangup(); virtual void setSpeakerVolume(SpeakerVolume); virtual void setLID(const fxStr& number) = 0; const fxStr& getModel() const; const fxStr& getManufacturer() const; const fxStr& getRevision() const; virtual fxBool supports2D() const; virtual fxBool supportsEOLPadding() const; virtual fxBool supportsVRes(float res) const; virtual fxBool supportsPageWidth(u_int w) const; virtual fxBool supportsPageLength(u_int l) const; virtual fxBool supportsPolling() const; virtual int selectSignallingRate(int br) const; u_int getBestSignallingRate() const; u_int getBestScanlineTime() const; virtual int selectScanlineTime(int st) const; u_int getBestVRes() const; u_int getBestDataFormat() const; u_int getBestPageWidth() const; u_int getBestPageLength() const; u_int modemDIS() const; virtual CallStatus dial(const char* number, const Class2Params& dis, fxStr& emsg); virtual void sendBegin(const FaxRequest&); virtual fxBool getPrologue(Class2Params&, u_int& nsf, fxStr& csi, fxBool& hasDoc) = 0; virtual void sendSetupPhaseB(); virtual FaxSendStatus sendPhaseB(TIFF*, Class2Params&, FaxMachineInfo&, fxStr& pph, fxStr& emsg) = 0; virtual void sendEnd(); virtual void sendAbort() = 0; virtual fxBool waitForRings(u_int rings); virtual CallType answerCall(AnswerType, fxStr& emsg); virtual fxBool recvBegin(fxStr& emsg) = 0; virtual fxBool recvPage(TIFF*, int& ppm, fxStr& em) = 0; virtual fxBool recvEnd(fxStr& emsg) = 0; virtual void recvAbort() = 0; virtual fxBool requestToPoll() = 0; virtual fxBool pollBegin(const fxStr& pollID, fxStr& emsg) = 0; }; inline long FaxModem::getDataTimeout() const { return dataTimeout; } inline const fxStr& FaxModem::getModel() const { return modemModel; } inline const fxStr& FaxModem::getManufacturer() const { return modemMfr; } inline const fxStr& FaxModem::getRevision() const { return modemRevision; } inline FlowControl FaxModem::getInputFlow() { return iFlow; } inline FlowControl FaxModem::getOutputFlow() { return oFlow; } inline u_int FaxModem::getTagLineSlop() const { return tagLineSlop; } struct ModemConfig { fxStr type; fxStr resetCmds; fxStr dialCmd; fxStr answerAnyCmd; fxStr answerDataCmd; fxStr answerFaxCmd; fxStr answerVoiceCmd; fxStr flowControlCmd; fxStr setupDTRCmd; fxStr setupDCDCmd; fxStr setupAACmd; fxStr noAutoAnswerCmd; fxStr setVolumeCmd[5]; fxStr echoOffCmd; fxStr verboseResultsCmd; fxStr resultCodesCmd; fxStr onHookCmd; fxStr softResetCmd; fxStr waitTimeCmd; fxStr pauseTimeCmd; fxStr mfrQueryCmd; fxStr modelQueryCmd; fxStr revQueryCmd; fxStr answerAnyBeginCmd; fxStr answerDataBeginCmd; fxStr answerFaxBeginCmd; fxStr answerVoiceBeginCmd; fxStr sendBeginCmd; u_int t1Timer; u_int t2Timer; u_int t4Timer; u_int dialResponseTimeout; u_int answerResponseTimeout; u_int pageStartTimeout; u_int pageDoneTimeout; fxStr class1Cmd; u_int class1TCFResponseDelay; u_int class1SendPPMDelay; u_int class1SendTCFDelay; u_int class1TrainingRecovery; u_int class1RecvAbortOK; u_int class1FrameOverhead; u_int class1RecvIdentTimer; u_int class1TCFMaxNonZero; u_int class1TCFMinRun; fxStr class2Cmd; fxStr class2DCCQueryCmd; fxStr class2CQQueryCmd; fxStr class2BORCmd; fxStr class2RELCmd; fxStr class2CQCmd; fxStr class2AbortCmd; fxStr class2TBCCmd; fxStr class2CRCmd; fxStr class2PHCTOCmd; fxStr class2BUGCmd; fxStr class2LIDCmd; fxStr class2DCCCmd; fxStr class2DISCmd; fxStr class2DDISCmd; fxStr class2CIGCmd; fxStr class2SPLCmd; fxStr class2PTSCmd; fxStr class2RecvDataTrigger; fxBool class2XmitWaitForXON; fxStr class2PIECmd; fxStr class2NRCmd; FlowControl flowControl; BaudRate maxRate; u_int recvFillOrder; u_int sendFillOrder; u_int frameFillOrder; u_int resetDelay; u_int baudRateDelay; u_int maxPacketSize; u_int interPacketDelay; u_int percentGoodLines; u_int maxConsecutiveBadLines; fxBool waitForConnect; fxStr tagLineFmt; fxStr tagLineFontFile; ModemConfig(); ~ModemConfig(); fxBool parseItem(const char* tag, const char* value); void setVolumeCmds(const fxStr& value); fxStr parseATCmd(const char*); }; ModemConfig::ModemConfig() : type("unknown") , dialCmd("DT%s") , noAutoAnswerCmd("S0=0") , echoOffCmd("E0") , verboseResultsCmd("V1") , resultCodesCmd("Q0") , onHookCmd("H0") , softResetCmd("Z") , waitTimeCmd("S7=30") , pauseTimeCmd("S8=2") , class1Cmd("+FCLASS=1") , class2CQQueryCmd("+FCQ=?") , tagLineFmt("From %%n|%c|Page %%p of %%t") { class2XmitWaitForXON = ((fxBool)1) ; setVolumeCmds("M0 L0M1 L1M1 L2M1 L3M1"); answerAnyCmd = "A"; flowControl = FaxModem::FLOW_NONE; maxRate = FaxModem::BR19200; sendFillOrder = 2 ; recvFillOrder = 2 ; frameFillOrder = 2 ; resetDelay = 2600; baudRateDelay = 0; t1Timer = ((35+5)*1000) ; t2Timer = ((6+1)*1000) ; t4Timer = 3100 ; dialResponseTimeout = 3*60*1000; answerResponseTimeout = 3*60*1000; pageStartTimeout = 3*60*1000; pageDoneTimeout = 3*60*1000; class1TCFResponseDelay = 75; class1SendPPMDelay = 75; class1SendTCFDelay = 75; class1TrainingRecovery = 1500; class1RecvAbortOK = 200; class1FrameOverhead = 4; class1RecvIdentTimer = t1Timer; class1TCFMinRun = (2*1500 )/3; class1TCFMaxNonZero = 10; maxPacketSize = 16*1024; interPacketDelay = 0; waitForConnect = ((fxBool)0) ; percentGoodLines = 95; maxConsecutiveBadLines = 5; } ModemConfig::~ModemConfig() { } static fxBool getBoolean(const char* cp) { return ((strcasecmp( cp , "on" )==0) || (strcasecmp( cp , "yes" )==0) ); } static BaudRate findRate(const char* cp) { static const struct { const char* name; BaudRate br; } rates[] = { { "300", FaxModem::BR300 }, { "1200", FaxModem::BR1200 }, { "2400", FaxModem::BR2400 }, { "4800", FaxModem::BR4800 }, { "9600", FaxModem::BR9600 }, { "19200", FaxModem::BR19200 }, { "38400", FaxModem::BR38400 }, { "57600", FaxModem::BR57600 }, { "76800", FaxModem::BR76800 }, }; for (int i = (sizeof ( rates ) / sizeof ( rates [0])) -1; i >= 0; i--) if ((strcasecmp( cp , rates[i].name )==0) ) return (rates[i].br); return (FaxModem::BR0); } static BaudRate getRate(const char* cp) { BaudRate br = findRate(cp); if (br == FaxModem::BR0) { syslog(3 , "Unknown baud rate \"%s\", using 19200", cp); br = FaxModem::BR19200; } return (br); } static u_int getFill(const char* cp) { if ((strcasecmp( cp , "LSB2MSB" )==0) ) return (2 ); else if ((strcasecmp( cp , "MSB2LSB" )==0) ) return (1 ); else { syslog(3 , "Unknown fill order \"%s\"", cp); return ((u_int) -1); } } static FlowControl getFlow(const char* cp) { if ((strcasecmp( cp , "xonxoff" )==0) ) return (FaxModem::FLOW_XONXOFF); else if ((strcasecmp( cp , "rtscts" )==0) ) return (FaxModem::FLOW_RTSCTS); else if ((strcasecmp( cp , "none" )==0) ) return (FaxModem::FLOW_NONE); else { syslog(3 , "Unknown flow control \"%s\", using xonxoff", cp); return (FaxModem::FLOW_XONXOFF); } } void ModemConfig::setVolumeCmds(const fxStr& tag) { u_int l = 0; for (int i = FaxModem::OFF; i <= FaxModem::HIGH; i++) { fxStr tmp = tag.token(l, " \t"); setVolumeCmd[i] = parseATCmd(tmp); } } fxStr ModemConfig::parseATCmd(const char* cp) { fxStr cmd(cp); u_int pos = 0; while ((pos = cmd.next(pos, '<')) != cmd.length()) { u_int epos = pos+1; fxStr esc = cmd.token(epos, '>'); esc.lowercase(); char ecode; if (esc == "xon") ecode = (0x80|0xf) ; else if (esc == "rts") ecode = (0x80|0xe) ; else if (esc == "none") ecode = (0x80|0xd) ; else if (esc == "") ecode = '<'; else { BaudRate br = findRate(esc); if (br == FaxModem::BR0) { syslog(3 , "Unknown AT escape code \"%s\"", (char*) esc); pos = epos; continue; } ecode = 0x80| ((int)( br )) ; } cmd.remove(pos, epos-pos); cmd.insert(ecode, pos); } return (cmd); } static const struct { const char* name; fxStr ModemConfig::* p; } atcmds[] = { { "ModemAnswerCmd", &ModemConfig::answerAnyCmd }, { "ModemAnswerAnyCmd", &ModemConfig::answerAnyCmd }, { "ModemAnswerFaxCmd", &ModemConfig::answerFaxCmd }, { "ModemAnswerDataCmd", &ModemConfig::answerDataCmd }, { "ModemAnswerVoiceCmd", &ModemConfig::answerVoiceCmd }, { "ModemAnswerFaxBeginCmd", &ModemConfig::answerFaxBeginCmd }, { "ModemAnswerDataBeginCmd", &ModemConfig::answerDataBeginCmd }, { "ModemAnswerVoiceBeginCmd", &ModemConfig::answerVoiceBeginCmd }, { "ModemResetCmds", &ModemConfig::resetCmds }, { "ModemResetCmd", &ModemConfig::resetCmds }, { "ModemDialCmd", &ModemConfig::dialCmd }, { "ModemFlowControlCmd", &ModemConfig::flowControlCmd }, { "ModemSetupAACmd", &ModemConfig::setupAACmd }, { "ModemSetupDTRCmd", &ModemConfig::setupDTRCmd }, { "ModemSetupDCDCmd", &ModemConfig::setupDCDCmd }, { "ModemNoAutoAnswerCmd", &ModemConfig::noAutoAnswerCmd }, { "ModemEchoOffCmd", &ModemConfig::echoOffCmd }, { "ModemVerboseResultsCmd", &ModemConfig::verboseResultsCmd }, { "ModemResultCodesCmd", &ModemConfig::resultCodesCmd }, { "ModemOnHookCmd", &ModemConfig::onHookCmd }, { "ModemSoftResetCmd", &ModemConfig::softResetCmd }, { "ModemWaitTimeCmd", &ModemConfig::waitTimeCmd }, { "ModemCommaPauseTimeCmd", &ModemConfig::pauseTimeCmd }, { "ModemMfrQueryCmd", &ModemConfig::mfrQueryCmd }, { "ModemModelQueryCmd", &ModemConfig::modelQueryCmd }, { "ModemRevQueryCmd", &ModemConfig::revQueryCmd }, { "ModemSendBeginCmd", &ModemConfig::sendBeginCmd }, { "Class1Cmd", &ModemConfig::class1Cmd }, { "Class2Cmd", &ModemConfig::class2Cmd }, { "Class2BORCmd", &ModemConfig::class2BORCmd }, { "Class2RELCmd", &ModemConfig::class2RELCmd }, { "Class2CQCmd", &ModemConfig::class2CQCmd }, { "Class2AbortCmd", &ModemConfig::class2AbortCmd }, { "Class2CQQueryCmd", &ModemConfig::class2CQQueryCmd }, { "Class2DCCQueryCmd", &ModemConfig::class2DCCQueryCmd }, { "Class2TBCCmd", &ModemConfig::class2TBCCmd }, { "Class2CRCmd", &ModemConfig::class2CRCmd }, { "Class2PHCTOCmd", &ModemConfig::class2PHCTOCmd }, { "Class2BUGCmd", &ModemConfig::class2BUGCmd }, { "Class2LIDCmd", &ModemConfig::class2LIDCmd }, { "Class2DCCCmd", &ModemConfig::class2DCCCmd }, { "Class2DISCmd", &ModemConfig::class2DISCmd }, { "Class2DDISCmd", &ModemConfig::class2DDISCmd }, { "Class2CIGCmd", &ModemConfig::class2CIGCmd }, { "Class2PTSCmd", &ModemConfig::class2PTSCmd }, { "Class2SPLCmd", &ModemConfig::class2SPLCmd }, { "Class2PIECmd", &ModemConfig::class2PIECmd }, { "Class2NRCmd", &ModemConfig::class2NRCmd }, { "TagLineFont", &ModemConfig::tagLineFontFile }, { "TagLineFormat", &ModemConfig::tagLineFmt }, }; static const struct { const char* name; u_int ModemConfig::* p; } fillorders[] = { { "ModemRecvFillOrder", &ModemConfig::recvFillOrder }, { "ModemSendFillOrder", &ModemConfig::sendFillOrder }, { "ModemFrameFillOrder", &ModemConfig::frameFillOrder }, }; static const struct { const char* name; u_int ModemConfig::* p; } numbers[] = { { "ModemResetDelay", &ModemConfig::resetDelay }, { "ModemBaudRateDelay", &ModemConfig::baudRateDelay }, { "ModemMaxPacketSize", &ModemConfig::maxPacketSize }, { "ModemInterPacketDelay", &ModemConfig::interPacketDelay }, { "FaxT1Timer", &ModemConfig::t1Timer }, { "FaxT2Timer", &ModemConfig::t2Timer }, { "FaxT4Timer", &ModemConfig::t4Timer }, { "ModemDialResponseTimeout", &ModemConfig::dialResponseTimeout }, { "ModemAnswerResponseTimeout", &ModemConfig::answerResponseTimeout }, { "ModemPageStartTimeout", &ModemConfig::pageStartTimeout }, { "ModemPageDoneTimeout", &ModemConfig::pageDoneTimeout }, { "Class1TCFResponseDelay", &ModemConfig::class1TCFResponseDelay }, { "Class1SendPPMDelay", &ModemConfig::class1SendPPMDelay }, { "Class1SendTCFDelay", &ModemConfig::class1SendTCFDelay }, { "Class1TrainingRecovery", &ModemConfig::class1TrainingRecovery }, { "Class1RecvAbortOK", &ModemConfig::class1RecvAbortOK }, { "Class1FrameOverhead", &ModemConfig::class1FrameOverhead }, { "Class1RecvIdentTimer", &ModemConfig::class1RecvIdentTimer }, { "Class1TCFMaxNonZero", &ModemConfig::class1TCFMaxNonZero }, { "Class1TCFMinRun", &ModemConfig::class1TCFMinRun }, { "PercentGoodLines", &ModemConfig::percentGoodLines }, { "MaxConsecutiveBadLines", &ModemConfig::maxConsecutiveBadLines }, }; fxBool ModemConfig::parseItem(const char* tag, const char* value) { int i; for (i = (sizeof ( atcmds ) / sizeof ( atcmds [0])) -1; i >= 0; i--) if ((strcasecmp( tag , atcmds[i].name )==0) ) { (*this).*atcmds[i].p = parseATCmd(value); return (((fxBool)1) ); } for (i = (sizeof ( fillorders ) / sizeof ( fillorders [0])) -1; i >= 0 ; i--) if ((strcasecmp( tag , fillorders[i].name )==0) ) { (*this).*fillorders[i].p = getFill(value); return (((fxBool)1) ); } for (i = (sizeof ( numbers ) / sizeof ( numbers [0])) -1; i >= 0 ; i--) if ((strcasecmp( tag , numbers[i].name )==0) ) { (*this).*numbers[i].p = atoi(value); return (((fxBool)1) ); } fxBool recognized = ((fxBool)1) ; if ((strcasecmp( tag , "ModemType" )==0) ) type = value; else if ((strcasecmp( tag , "ModemSetVolumeCmd" )==0) ) setVolumeCmds(value); else if ((strcasecmp( tag , "ModemFlowControl" )==0) ) flowControl = getFlow(value); else if ((strcasecmp( tag , "ModemMaxRate" )==0) || (strcasecmp( tag , "ModemRate" )==0) ) maxRate = getRate(value); else if ((strcasecmp( tag , "ModemWaitForConnect" )==0) ) waitForConnect = getBoolean(value); else if ((strcasecmp( tag , "Class2RecvDataTrigger" )==0) ) class2RecvDataTrigger = value; else if ((strcasecmp( tag , "Class2XmitWaitForXON" )==0) ) class2XmitWaitForXON = getBoolean(value); else recognized = ((fxBool)0) ; return (recognized); }