From c614aff1bcce8a3851afd9816c6a563ad2e1aa7e Mon Sep 17 00:00:00 2001 From: martini Date: Fri, 9 Jan 2015 15:14:31 -0500 Subject: [PATCH] version 1.6 --- C20LIB/DOS/CAPI20L.LIB | Bin 0 -> 13353 bytes C20LIB/DOS/CAPI20LD.LIB | Bin 0 -> 21037 bytes C20LIB/DOS/CAPI20S.LIB | Bin 0 -> 12841 bytes C20LIB/DOS/CAPI20SD.LIB | Bin 0 -> 19499 bytes C20LIB/LINUX.MAK | 19 + C20LIB/LINUX/LIBC20.A | Bin 0 -> 73112 bytes C20LIB/MKDOS.BAT | 39 ++ C20LIB/MKNW.BAT | 33 ++ C20LIB/MKOS2.CMD | 28 ++ C20LIB/MKVXD.BAT | 29 ++ C20LIB/MKWIN16.BAT | 39 ++ C20LIB/MKWIN32.BAT | 28 ++ C20LIB/NETWARE/CAP2032.LIB | Bin 0 -> 20480 bytes C20LIB/NETWARE/CAP2032D.LIB | Bin 0 -> 39424 bytes C20LIB/OS2/CAPI20.LIB | Bin 0 -> 12075 bytes C20LIB/OS2/CAPI20D.LIB | Bin 0 -> 18613 bytes C20LIB/OS2/CAPI20I.LIB | Bin 0 -> 2048 bytes C20LIB/SOURCE/C2IMP_NW.H | 40 ++ C20LIB/SOURCE/C2MGR_NW.H | 47 ++ C20LIB/SOURCE/CAPI20.H | 973 ++++++++++++++++++++++++++++++++++++ C20LIB/SOURCE/CDOS.C | 227 +++++++++ C20LIB/SOURCE/CDOS.H | 33 ++ C20LIB/SOURCE/CLINUX.C | 317 ++++++++++++ C20LIB/SOURCE/CLINUX.H | 48 ++ C20LIB/SOURCE/COS2.C | 150 ++++++ C20LIB/SOURCE/COS2.H | 39 ++ C20LIB/SOURCE/CVXD.C | 271 ++++++++++ C20LIB/SOURCE/CVXD.H | 48 ++ C20LIB/SOURCE/CWIN16.C | 147 ++++++ C20LIB/SOURCE/CWIN16.H | 39 ++ C20LIB/SOURCE/CWIN32.C | 149 ++++++ C20LIB/SOURCE/CWIN32.H | 39 ++ C20LIB/SOURCE/C_NW.C | 171 +++++++ C20LIB/SOURCE/C_NW.H | 36 ++ C20LIB/SOURCE/FUNC.C | 357 +++++++++++++ C20LIB/SOURCE/GCMSGDOS.C | 29 ++ C20LIB/SOURCE/GCMSGLIN.C | 23 + C20LIB/SOURCE/GCMSGOS2.C | 27 + C20LIB/SOURCE/GCMSGVXD.C | 27 + C20LIB/SOURCE/GCMSGWIN.C | 33 ++ C20LIB/SOURCE/GCMSG_NW.C | 29 ++ C20LIB/SOURCE/MSG.C | 717 ++++++++++++++++++++++++++ C20LIB/VXD/CAPI20.CLB | Bin 0 -> 21916 bytes C20LIB/VXD/CAPI20D.CLB | Bin 0 -> 33978 bytes C20LIB/WIN16/CAPI20L.LIB | Bin 0 -> 15505 bytes C20LIB/WIN16/CAPI20LD.LIB | Bin 0 -> 22677 bytes C20LIB/WIN16/CAPI20S.LIB | Bin 0 -> 14993 bytes C20LIB/WIN16/CAPI20SD.LIB | Bin 0 -> 21139 bytes C20LIB/WIN16/CAPI20W.LIB | Bin 0 -> 2048 bytes C20LIB/WIN32/CAP2032.LIB | Bin 0 -> 22892 bytes C20LIB/WIN32/CAP2032D.LIB | Bin 0 -> 33414 bytes C20LIB/WIN32/CAPI2032.LIB | Bin 0 -> 8612 bytes DEBUG.DLL/DEBUG.DOC | Bin 0 -> 12288 bytes DEBUG.DLL/NC.MNU | 53 ++ README.TXT | 324 ++++++++++++ SOURCE/C20MSG.C | 184 +++++++ SOURCE/C20MSG.H | 33 ++ SOURCE/CAPI.C | 300 +++++++++++ SOURCE/CAPI.H | 18 + SOURCE/CONNECT.C | 209 ++++++++ SOURCE/CONNECT.H | 88 ++++ SOURCE/CONTR.C | 58 +++ SOURCE/CONTR.H | 29 ++ SOURCE/DATA.C | 85 ++++ SOURCE/DATA.H | 58 +++ SOURCE/DEMO.PRT | 42 ++ SOURCE/DOS/DEMO.PRT | 5 + SOURCE/FAX.C | 33 ++ SOURCE/FAX.H | 54 ++ SOURCE/FAXMAIN.C | 748 +++++++++++++++++++++++++++ SOURCE/ID.C | 420 ++++++++++++++++ SOURCE/ID.H | 193 +++++++ SOURCE/INIT.C | 95 ++++ SOURCE/INIT.H | 26 + SOURCE/LINUTI.C | 50 ++ SOURCE/LINUTI.H | 4 + SOURCE/LINUX.MAK | 24 + SOURCE/LINUX/DEMO | Bin 0 -> 132621 bytes SOURCE/LINUX/FAXMAIN | Bin 0 -> 131433 bytes SOURCE/MAIN.C | 849 +++++++++++++++++++++++++++++++ SOURCE/MAIN.H | 52 ++ SOURCE/MAKEDEMO.BAT | 13 + SOURCE/MAKEDEMO.LNK | 12 + SOURCE/MAKEFAX.BAT | 13 + SOURCE/MAKEFAX.LNK | 13 + SOURCE/MKDEM32.BAT | 15 + SOURCE/MKDEM32.LNK | 11 + SOURCE/MKDEMO2.CMD | 11 + SOURCE/MKFAX2.CMD | 11 + SOURCE/NETWARE/DEMO.NLM | Bin 0 -> 118357 bytes SOURCE/NETWARE/FAXDEMO.NLM | Bin 0 -> 115858 bytes SOURCE/NW_DMO.RSP | 41 ++ SOURCE/NW_FAX.RSP | 41 ++ SOURCE/NW_MKDMO.BAT | 34 ++ SOURCE/NW_MKFAX.BAT | 36 ++ SOURCE/OS.H | 33 ++ SOURCE/TESTFAX.SFF | Bin 0 -> 87337 bytes WHATS.NEW | 27 + 98 files changed, 8576 insertions(+) create mode 100644 C20LIB/DOS/CAPI20L.LIB create mode 100644 C20LIB/DOS/CAPI20LD.LIB create mode 100644 C20LIB/DOS/CAPI20S.LIB create mode 100644 C20LIB/DOS/CAPI20SD.LIB create mode 100644 C20LIB/LINUX.MAK create mode 100644 C20LIB/LINUX/LIBC20.A create mode 100644 C20LIB/MKDOS.BAT create mode 100644 C20LIB/MKNW.BAT create mode 100644 C20LIB/MKOS2.CMD create mode 100644 C20LIB/MKVXD.BAT create mode 100644 C20LIB/MKWIN16.BAT create mode 100644 C20LIB/MKWIN32.BAT create mode 100644 C20LIB/NETWARE/CAP2032.LIB create mode 100644 C20LIB/NETWARE/CAP2032D.LIB create mode 100644 C20LIB/OS2/CAPI20.LIB create mode 100644 C20LIB/OS2/CAPI20D.LIB create mode 100644 C20LIB/OS2/CAPI20I.LIB create mode 100644 C20LIB/SOURCE/C2IMP_NW.H create mode 100644 C20LIB/SOURCE/C2MGR_NW.H create mode 100644 C20LIB/SOURCE/CAPI20.H create mode 100644 C20LIB/SOURCE/CDOS.C create mode 100644 C20LIB/SOURCE/CDOS.H create mode 100644 C20LIB/SOURCE/CLINUX.C create mode 100644 C20LIB/SOURCE/CLINUX.H create mode 100644 C20LIB/SOURCE/COS2.C create mode 100644 C20LIB/SOURCE/COS2.H create mode 100644 C20LIB/SOURCE/CVXD.C create mode 100644 C20LIB/SOURCE/CVXD.H create mode 100644 C20LIB/SOURCE/CWIN16.C create mode 100644 C20LIB/SOURCE/CWIN16.H create mode 100644 C20LIB/SOURCE/CWIN32.C create mode 100644 C20LIB/SOURCE/CWIN32.H create mode 100644 C20LIB/SOURCE/C_NW.C create mode 100644 C20LIB/SOURCE/C_NW.H create mode 100644 C20LIB/SOURCE/FUNC.C create mode 100644 C20LIB/SOURCE/GCMSGDOS.C create mode 100644 C20LIB/SOURCE/GCMSGLIN.C create mode 100644 C20LIB/SOURCE/GCMSGOS2.C create mode 100644 C20LIB/SOURCE/GCMSGVXD.C create mode 100644 C20LIB/SOURCE/GCMSGWIN.C create mode 100644 C20LIB/SOURCE/GCMSG_NW.C create mode 100644 C20LIB/SOURCE/MSG.C create mode 100644 C20LIB/VXD/CAPI20.CLB create mode 100644 C20LIB/VXD/CAPI20D.CLB create mode 100644 C20LIB/WIN16/CAPI20L.LIB create mode 100644 C20LIB/WIN16/CAPI20LD.LIB create mode 100644 C20LIB/WIN16/CAPI20S.LIB create mode 100644 C20LIB/WIN16/CAPI20SD.LIB create mode 100644 C20LIB/WIN16/CAPI20W.LIB create mode 100644 C20LIB/WIN32/CAP2032.LIB create mode 100644 C20LIB/WIN32/CAP2032D.LIB create mode 100644 C20LIB/WIN32/CAPI2032.LIB create mode 100644 DEBUG.DLL/DEBUG.DOC create mode 100644 DEBUG.DLL/NC.MNU create mode 100644 README.TXT create mode 100644 SOURCE/C20MSG.C create mode 100644 SOURCE/C20MSG.H create mode 100644 SOURCE/CAPI.C create mode 100644 SOURCE/CAPI.H create mode 100644 SOURCE/CONNECT.C create mode 100644 SOURCE/CONNECT.H create mode 100644 SOURCE/CONTR.C create mode 100644 SOURCE/CONTR.H create mode 100644 SOURCE/DATA.C create mode 100644 SOURCE/DATA.H create mode 100644 SOURCE/DEMO.PRT create mode 100644 SOURCE/DOS/DEMO.PRT create mode 100644 SOURCE/FAX.C create mode 100644 SOURCE/FAX.H create mode 100644 SOURCE/FAXMAIN.C create mode 100644 SOURCE/ID.C create mode 100644 SOURCE/ID.H create mode 100644 SOURCE/INIT.C create mode 100644 SOURCE/INIT.H create mode 100644 SOURCE/LINUTI.C create mode 100644 SOURCE/LINUTI.H create mode 100644 SOURCE/LINUX.MAK create mode 100644 SOURCE/LINUX/DEMO create mode 100644 SOURCE/LINUX/FAXMAIN create mode 100644 SOURCE/MAIN.C create mode 100644 SOURCE/MAIN.H create mode 100644 SOURCE/MAKEDEMO.BAT create mode 100644 SOURCE/MAKEDEMO.LNK create mode 100644 SOURCE/MAKEFAX.BAT create mode 100644 SOURCE/MAKEFAX.LNK create mode 100644 SOURCE/MKDEM32.BAT create mode 100644 SOURCE/MKDEM32.LNK create mode 100644 SOURCE/MKDEMO2.CMD create mode 100644 SOURCE/MKFAX2.CMD create mode 100644 SOURCE/NETWARE/DEMO.NLM create mode 100644 SOURCE/NETWARE/FAXDEMO.NLM create mode 100644 SOURCE/NW_DMO.RSP create mode 100644 SOURCE/NW_FAX.RSP create mode 100644 SOURCE/NW_MKDMO.BAT create mode 100644 SOURCE/NW_MKFAX.BAT create mode 100644 SOURCE/OS.H create mode 100644 SOURCE/TESTFAX.SFF create mode 100644 WHATS.NEW diff --git a/C20LIB/DOS/CAPI20L.LIB b/C20LIB/DOS/CAPI20L.LIB new file mode 100644 index 0000000000000000000000000000000000000000..0e2c09726cca756451eb9addeeb05722e1d13c9f GIT binary patch literal 13353 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 K$o=zQM*jo#k}+!l literal 0 HcmV?d00001 diff --git a/C20LIB/DOS/CAPI20LD.LIB b/C20LIB/DOS/CAPI20LD.LIB new file mode 100644 index 0000000000000000000000000000000000000000..d4429bc7a9fb5240d678454f2ee9c77167e9d60f GIT binary patch literal 21037 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 TLbcH94LiaQ;Bb<|KPCEaKxXfE literal 0 HcmV?d00001 diff --git a/C20LIB/LINUX.MAK b/C20LIB/LINUX.MAK new file mode 100644 index 0000000..e8fcb7f --- /dev/null +++ b/C20LIB/LINUX.MAK @@ -0,0 +1,19 @@ + +vpath %.c source + +CFLAGS := $(CFLAGS) -DTARGET_32BIT -DCPROT -DCPROT_LINUX -g -Wall + +CFILES=clinux.c func.c msg.c gcmsglin.c + +OFILES=$(patsubst %.c,linux/%.o,$(CFILES)) + +LIB=linux/libc20.a + +all: $(LIB) + +$(LIB): $(OFILES) + $(RM) $@ + $(AR) cq $@ $^ + +linux/%.o: %.c + $(CC) $(CFLAGS) -c $^ -o $@ diff --git a/C20LIB/LINUX/LIBC20.A b/C20LIB/LINUX/LIBC20.A new file mode 100644 index 0000000000000000000000000000000000000000..585d79f9769e619a502118c52087990bcef9ec9c GIT binary patch literal 73112 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 mF%kWf_Y!e#@w}&1D^e7^t+hf|UO literal 0 HcmV?d00001 diff --git a/C20LIB/MKDOS.BAT b/C20LIB/MKDOS.BAT new file mode 100644 index 0000000..3766747 --- /dev/null +++ b/C20LIB/MKDOS.BAT @@ -0,0 +1,39 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 Development Kit +@rem library with the Microsoft Visual C compiler for a DOS +@rem environment. +@rem +@rem This makefile expects as first parameter a letter that specifies +@rem the memory model to compile with, for example L (large model), +@rem S (small model). +@rem If as second parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ +@if "%1" == "" goto NoMemoryModel +@if "%2" == "dbg" goto dbg +@ +@ set cl=/c /Zl /A%1 /W4 /Isource /nologo /DTARGET_16BIT + cl source\func.c source\msg.c source\gcmsgdos.c source\cdos.c + del dos\capi20%1.lib +@ lib /NOLOGO dos\capi20%1.lib; + lib /NOLOGO dos\capi20%1.lib +msg+cdos+func+gcmsgdos; + del *.obj + del dos\*.bak +@ goto ende +@ +:dbg +@ +@ set cl=/c /Zl /A%1 /W4 /Isource /nologo /DTARGET_16BIT /DCPROT + cl source\func.c source\msg.c source\gcmsgdos.c source\cdos.c + del dos\capi20%1d.lib +@ lib /NOLOGO dos\capi20%1d.lib; + lib /NOLOGO dos\capi20%1d.lib +msg+cdos+func+gcmsgdos; + del *.obj + del dos\*.bak +@ goto ende +@ +:NoMemoryModel +@echo No memory model specified !! +@ +:ende diff --git a/C20LIB/MKNW.BAT b/C20LIB/MKNW.BAT new file mode 100644 index 0000000..f637b34 --- /dev/null +++ b/C20LIB/MKNW.BAT @@ -0,0 +1,33 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 AVM Development Kit +@rem library with the WATCOM CPP 10.5 C compiler for a 32 bit +@rem NetWare environment. +@rem We assume that the Environment variable WATCOM contains the Install +@rem directory of your Watcom C Compiler (e.g. C:\wc105) +@rem +@rem If as parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ set COMP=%WATCOM%\BINW\wcc386 +@ +@if "%1" == "dbg" goto dbg +@ set wcc386=/d1 /s /3s /oi /zq /wx /DB1 /DAVM /DTARGET_32BIT /DNDEBUG /DCPROT /Isource +@ set LIBNAME=cap2032.lib +@ goto compile +:dbg +@ set wcc386=/d2 /s /3s /oid /zq /wx /DB1 /DAVM /DTARGET_32BIT /DDEBUG /DCPROT /Isource +@ set LIBNAME=cap2032d.lib +@ goto compile + +:compile + %COMP% /bt=netware /fonetware\func.obj source\func.c + %COMP% /bt=netware /fonetware\msg.obj source\msg.c + %COMP% /bt=netware /fonetware\gcmsg_nw.obj source\gcmsg_nw.c + %COMP% /bt=netware /fonetware\c_nw.obj source\c_nw.c + + del netware\%LIBNAME% + %WATCOM%\BINW\wlib netware\%LIBNAME% +netware\msg +netware\c_nw +netware\func +netware\gcmsg_nw + del netware\*.obj +@ goto ende +@ +:ende diff --git a/C20LIB/MKOS2.CMD b/C20LIB/MKOS2.CMD new file mode 100644 index 0000000..d85d007 --- /dev/null +++ b/C20LIB/MKOS2.CMD @@ -0,0 +1,28 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 Development Kit +@rem library with the IBM VisualAge C++ compiler for a 32 bit +@rem OS/2 environment. +@rem +@rem If as parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ +@if "%1" == "dbg" goto dbg +@ +@ set icc=/C+ /Isource /DTARGET_32BIT + icc source\func.c source\msg.c source\gcmsgos2.c source\cos2.c + if exist os2\capi20.lib del os2\capi20.lib + ilib /nobrowse os2\capi20.lib msg.obj cos2.obj func.obj gcmsgos2.obj os2\capi20i.lib; + del *.obj +@ goto end +@ +:dbg +@ +@ set icc=/C+ /Isource /DTARGET_32BIT /DCPROT + icc source\func.c source\msg.c source\gcmsgos2.c source\cos2.c + if exist os2\capi20d.lib del os2\capi20d.lib + ilib /nobrowse os2\capi20d.lib msg.obj cos2.obj func.obj gcmsgos2.obj os2\capi20i.lib; + del *.obj +@ goto end +@ +:end diff --git a/C20LIB/MKVXD.BAT b/C20LIB/MKVXD.BAT new file mode 100644 index 0000000..e55b60e --- /dev/null +++ b/C20LIB/MKVXD.BAT @@ -0,0 +1,29 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 Development Kit +@rem library with the Microsoft Visual C compiler for a 32 bit +@rem VxD driver environment. You have to run this with a installed +@rem Win95 DDK (%DDKROOT%). +@rem +@rem If as parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ +@if "%1" == "dbg" goto dbg +@ +@ set cl=/Zdp /Gs /DIS_32 /Zl /c /W3 /Isource /I%DDKROOT%\INC32 /nologo /DTARGET_32BIT + cl source\func.c source\msg.c source\gcmsgvxd.c source\cvxd.c + del vxd\capi20.clb + lib /OUT:vxd\capi20.clb msg.obj cvxd.obj func.obj gcmsgvxd.obj + del *.obj +@ goto ende +@ +:dbg +@ +@ set cl=/Zdp /Gs /DIS_32 /Zl /c /W3 /Isource /I%DDKROOT%\INC32 /nologo /DTARGET_32BIT /DCPROT + cl source\func.c source\msg.c source\gcmsgvxd.c source\cvxd.c + del vxd\capi20d.clb + lib /OUT:vxd\capi20d.clb msg.obj cvxd.obj func.obj gcmsgvxd.obj + del *.obj +@ goto ende +@ +:ende diff --git a/C20LIB/MKWIN16.BAT b/C20LIB/MKWIN16.BAT new file mode 100644 index 0000000..68c3d8a --- /dev/null +++ b/C20LIB/MKWIN16.BAT @@ -0,0 +1,39 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 Development Kit +@rem library with the Microsoft Visual C compiler for a 16 bit +@rem Windows environment. +@rem +@rem This makefile expects as first parameter a letter that specifies +@rem the memory model to compile with, for example L (large model), +@rem S (small model). +@rem If as second parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ +@if "%1" == "" goto NoMemoryModel +@if "%2" == "dbg" goto dbg +@ +@ set cl=/c /GA /A%1 /W4 /Isource /nologo /DTARGET_16BIT + cl source\func.c source\msg.c source\gcmsgwin.c source\cwin16.c + del win16\capi20%1.lib +@ lib /NOLOGO win16\capi20%1.lib; + lib /NOLOGO win16\capi20%1.lib +msg+cwin16+func+gcmsgwin+win16\capi20w.lib; + del *.obj + del win16\*.bak +@ goto ende +@ +:dbg +@ +@ set cl=/c /GA /A%1 /W4 /Isource /nologo /DTARGET_16BIT /DCPROT + cl source\func.c source\msg.c source\gcmsgwin.c source\cwin16.c + del win16\capi20%1d.lib +@ lib /NOLOGO win16\capi20%1d.lib; + lib /NOLOGO win16\capi20%1d.lib +msg+cwin16+func+gcmsgwin+win16\capi20w.lib; + del *.obj + del win16\*.bak +@ goto ende +@ +:NoMemoryModel +@echo No memory model specified !! +@ +:ende diff --git a/C20LIB/MKWIN32.BAT b/C20LIB/MKWIN32.BAT new file mode 100644 index 0000000..9072e0d --- /dev/null +++ b/C20LIB/MKWIN32.BAT @@ -0,0 +1,28 @@ +@rem +@rem This is a demo makefile for making the CAPI 2.0 Development Kit +@rem library with the Microsoft Visual C compiler for a 32 bit +@rem Windows environment. +@rem +@rem If as parameter dbg is given, the symbol CPROT is defined +@rem and the library will be build including the protocol functions +@ +@ +@if "%1" == "dbg" goto dbg +@ +@ set cl=/c /Zl /W3 /Isource /nologo /DTARGET_32BIT + cl source\func.c source\msg.c source\gcmsgwin.c source\cwin32.c + del win32\cap2032.lib + lib /OUT:win32\cap2032.lib msg.obj cwin32.obj func.obj gcmsgwin.obj win32\capi2032.lib + del *.obj +@ goto ende +@ +:dbg +@ +@ set cl=/c /Zl /W3 /Isource /nologo /DTARGET_32BIT /DCPROT + cl source\func.c source\msg.c source\gcmsgwin.c source\cwin32.c + del win32\cap2032d.lib + lib /OUT:win32\cap2032d.lib msg.obj cwin32.obj func.obj gcmsgwin.obj win32\capi2032.lib + del *.obj +@ goto ende +@ +:ende diff --git a/C20LIB/NETWARE/CAP2032.LIB b/C20LIB/NETWARE/CAP2032.LIB new file mode 100644 index 0000000000000000000000000000000000000000..a811ea4a73613e60d01508215dc0507bf2784392 GIT binary patch literal 20480 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 WGV2@@-UTyvnWO$B2nzlm@%u0Ry%_xf literal 0 HcmV?d00001 diff --git a/C20LIB/NETWARE/CAP2032D.LIB b/C20LIB/NETWARE/CAP2032D.LIB new file mode 100644 index 0000000000000000000000000000000000000000..c4459ee4ae2583e49e82e825895bba613ded0f2b GIT binary patch literal 39424 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 literal 0 HcmV?d00001 diff --git a/C20LIB/OS2/CAPI20D.LIB b/C20LIB/OS2/CAPI20D.LIB new file mode 100644 index 0000000000000000000000000000000000000000..67fa8fa680a2b07fc066e5b80ce75bc47cb0e405 GIT binary patch literal 18613 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 Pv%tmRJ@C3yT@EHX4-iFpZJ~V)Z zMHym#iWAF|JP|CK$Jyjn18)s*g`0@G4l!@x(C`u-aV9y6fuU43Nvk4pq5<+Ynxqef zOm!G%22kB4Lf{ed4q8SpVwtii;%_L<4ZztZ!oEYukI=F8m~bgssB*Y81kXVXbw4(b zyo#2c>^e$EhHe%2F5HnHbi~pH*O}MyNH_5Zaa(uYX+wFO}(f0B3}@ Y-I1uozxPkGKw +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#define IMPORT _cdecl +/*---------------------------------------------------------------------------*\ + external symbols for CAPI20 functions +\*---------------------------------------------------------------------------*/ +extern DWORD IMPORT CAPI_Register (WORD, WORD, WORD, WORD, WORD*, WORD, DWORD, DWORD); +extern DWORD IMPORT CAPI_Release (WORD ); +extern DWORD IMPORT CAPI_PutMessage (WORD, BYTE* ); +extern DWORD IMPORT CAPI_GetMessage (WORD, BYTE** ); +extern DWORD IMPORT CAPI_GetManufacturer (DWORD, BYTE* ); +extern DWORD IMPORT CAPI_GetVersion (DWORD, WORD*, WORD*, WORD*, WORD*, WORD*, WORD*); +extern DWORD IMPORT CAPI_GetSerialNumber (DWORD, BYTE* ); +extern DWORD IMPORT CAPI_GetProfile (void*, DWORD ); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif diff --git a/C20LIB/SOURCE/C2MGR_NW.H b/C20LIB/SOURCE/C2MGR_NW.H new file mode 100644 index 0000000..c3de409 --- /dev/null +++ b/C20LIB/SOURCE/C2MGR_NW.H @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------------*\ + + C2MGR_NW.H Version 1.0 1998 AVM + + CAPI 2.0 Development Kit internal definitions for NetWare + +\*---------------------------------------------------------------------------*/ +#ifndef _C2MGR_NW_H_ /* avoid multiple inclusion */ +#define _C2MGR_NW_H_ + +/* -------------------------------------------------- + signal type constants for application registration + -------------------------------------------------- */ +#define SIGNAL_TYPE_LOCAL_SEMAPHORE 0x0001 +#define SIGNAL_TYPE_CALLBACK 0x0002 + +/* --------------------------------------------------- + additional CAPI Manager specific CAPI info values + --------------------------------------------------- */ +#define CRE_INVALID_SIGNAL_TYPE 0x10F0 +#define CRE_INVALID_FUNCTION_ARRAY 0x10F1 +#define CRE_INVALID_CONTROLLER_INFO 0x10F2 + +#define CME_INVALID_CONTROLLER 0x11F0 +#define CME_INVALID_CONTROLLER_INFO 0x11F1 +#define CME_NO_MATCHING_CONTROLLER 0x11F2 +#define CME_LOCK_FAILED 0x11F3 +#define CME_INVALID_LOCK_HANDLE 0x11F4 + +#define CSE_CTLR_NOT_RESPONDING 0x3F01 + +/* ----------------------------------------- + CAPI Manager specific messages extensions + ----------------------------------------- */ +#define MANUFACTURER_ID_NWCAPI 0x4D43574E /* NWCM */ + +#define NW_CAPI_EXTENSION 0x00F0 +#define BIND_APPL 0x0010 +#define UNBIND_APPL 0x0011 +#define CTLR_UNLOAD 0x0012 +#define CTLR_FAILURE 0x0013 + +#define INFO_MASK_CTLR_UNLOAD 0x0080 +#define INFO_MASK_CTLR_FAILURE 0x0100 +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif /* _C2MGR_NW_H_ */ diff --git a/C20LIB/SOURCE/CAPI20.H b/C20LIB/SOURCE/CAPI20.H new file mode 100644 index 0000000..39ad907 --- /dev/null +++ b/C20LIB/SOURCE/CAPI20.H @@ -0,0 +1,973 @@ +/*--------------------------------------------------------------------------*\ + + CAPI20.H Version 1.2 1997 AVM + + Header file of CAPI20.LIB + type definitions, CAPI functions, parameter definitions + see CAPI 2.0 spec. february 1994 + +\*--------------------------------------------------------------------------*/ +#ifndef _capi20_h_ +#define _capi20_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if defined (TARGET_32BIT) +# define __far +#endif + + +/*----- basic-type definitions -----*/ + +typedef unsigned char __far *CAPI_MESSAGE; +typedef unsigned char _cbyte; +typedef unsigned short _cword; +typedef unsigned long _cdword; +typedef CAPI_MESSAGE _cstruct; +typedef enum { + CAPI_COMPOSE, + CAPI_DEFAULT +} _cmstruct; + +/*----- errornumbers -----*/ + +typedef enum { + CapiToManyAppls =0x1001, + CapiLogBlkSizeToSmall =0x1002, + CapiBuffExeceeds64k =0x1003, + CapiMsgBufSizeToSmall =0x1004, + CapiAnzLogConnNotSupported =0x1005, + CapiRegReserved =0x1006, + CapiRegBusy =0x1007, + CapiRegOSResourceErr =0x1008, + CapiRegNotInstalled =0x1009, + CapiRegCtrlerNotSupportExtEquip =0x100a, + CapiRegCtrlerOnlySupportExtEquip =0x100b +} CAPI_REGISTER_ERROR; + +typedef enum { + CapiNoError =0x0000, + CapiIllAppNr =0x1101, + CapiIllCmdOrSubcmdOrMsgToSmall =0x1102, + CapiSendQueueFull =0x1103, + CapiReceiveQueueEmpty =0x1104, + CapiReceiveOverflow =0x1105, + CapiUnknownNotPar =0x1106, + CapiMsgBusy =0x1107, + CapiMsgOSResourceErr =0x1108, + CapiMsgNotInstalled =0x1109, + CapiMsgCtrlerNotSupportExtEquip =0x110a, + CapiMsgCtrlerOnlySupportExtEquip =0x110b +} MESSAGE_EXCHANGE_ERROR; + +/*----- CAPI commands -----*/ + +#define CAPI_ALERT 0x01 +#define CAPI_CONNECT 0x02 +#define CAPI_CONNECT_ACTIVE 0x03 +#define CAPI_CONNECT_B3_ACTIVE 0x83 +#define CAPI_CONNECT_B3 0x82 +#define CAPI_CONNECT_B3_T90_ACTIVE 0x88 +#define CAPI_DATA_B3 0x86 +#define CAPI_DISCONNECT_B3 0x84 +#define CAPI_DISCONNECT 0x04 +#define CAPI_FACILITY 0x80 +#define CAPI_INFO 0x08 +#define CAPI_LISTEN 0x05 +#define CAPI_MANUFACTURER 0xff +#define CAPI_RESET_B3 0x87 +#define CAPI_SELECT_B_PROTOCOL 0x41 + +/*----- CAPI subcommands -----*/ + +#define CAPI_REQ 0x80 +#define CAPI_CONF 0x81 +#define CAPI_IND 0x82 +#define CAPI_RESP 0x83 + +/*--------------------------------------------------------------------------*\ + The _cmsg structure contains all possible CAPI 2.0 parameter. + All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE + assembles the parameter and builds CAPI2.0 conform messages. + CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the + parameter in the _cmsg structure +\*--------------------------------------------------------------------------*/ + +typedef struct { + /* Header */ + _cword ApplId; + _cbyte Command; + _cbyte Subcommand; + _cword Messagenumber; + + /* Parameter */ + union { + _cdword adrController; + _cdword adrPLCI; + _cdword adrNCCI; + } adr; + + _cmstruct AdditionalInfo; + _cstruct B1configuration; + _cword B1protocol; + _cstruct B2configuration; + _cword B2protocol; + _cstruct B3configuration; + _cword B3protocol; + _cstruct BC; + _cstruct BChannelinformation; + _cmstruct BProtocol; + _cstruct CalledPartyNumber; + _cstruct CalledPartySubaddress; + _cstruct CallingPartyNumber; + _cstruct CallingPartySubaddress; + _cdword CIPmask; + _cdword CIPmask2; + _cword CIPValue; + _cdword Class; + _cstruct ConnectedNumber; + _cstruct ConnectedSubaddress; + _cdword Data; + _cword DataHandle; + _cword DataLength; + _cstruct FacilityConfirmationParameter; + _cstruct Facilitydataarray; + _cstruct FacilityIndicationParameter; + _cstruct FacilityRequestParameter; + _cstruct FacilityResponseParameters; + _cword FacilitySelector; + _cword Flags; + _cdword Function; + _cstruct HLC; + _cword Info; + _cstruct InfoElement; + _cdword InfoMask; + _cword InfoNumber; + _cstruct Keypadfacility; + _cstruct LLC; + _cstruct ManuData; + _cdword ManuID; + _cstruct NCPI; + _cword Reason; + _cword Reason_B3; + _cword Reject; + _cstruct Useruserdata; + + /* intern */ + unsigned l,p; + unsigned char *par; + CAPI_MESSAGE m; +} _cmsg; + +/*--------------------------------------------------------------------------*\ + CAPI_CMSG_2_MESSAGE assembles the parameter from _cmsg to a CAPI 2.0 + conform message +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_CMSG_2_MESSAGE (_cmsg __far *cmsg, CAPI_MESSAGE msg); + +/*--------------------------------------------------------------------------*\ + CAPI_MESSAGE_2_CMSG disassembles a CAPI message an writes the parameter + into _cmsg for easy access +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_MESSAGE_2_CMSG (_cmsg __far *cmsg, CAPI_MESSAGE msg); + +/*--------------------------------------------------------------------------*\ + CAPI_PUT_CMSG works like CAPI_PUT_MESSAGE but it converts the _cmsg + first with CAPI_CMSG_2_MESSAGE. Possible errors from CAPI_PUT_MESSAGE + will be returned. +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg); + +/*--------------------------------------------------------------------------*\ + CAPI_GET_CMSG works like CAPI_GET_MESSAGE and converts the CAPI message + to a _cmsg with CAPI_MESSAGE_2_CMSG. Possible errors from CAPI_GET_MESSAGE + will be returned. +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid); + +/*--------------------------------------------------------------------------*\ + CAPI_CMSG_HEADER fills the _cmsg structure with default values, so only + parameter with non default values must be changed before sending the + message. +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_CMSG_HEADER (_cmsg __far *cmsg, _cword _ApplId, _cbyte _Command, _cbyte _Subcommand, _cword _Messagenumber, _cdword _Controller); + +/*--------------------------------------------------------------------------*\ + CAPI_CMSG_ANSWER is used to answer indications. It changes the header + of an indication to a response, and leaves all other parameters the same +\*--------------------------------------------------------------------------*/ +unsigned __far CAPI_CMSG_ANSWER (_cmsg __far *cmsg); + +/*----- if the symbol CPROT is defined, protocol functions are included -----*/ + +#if defined (CPROT) +typedef enum { + CAPI_PROTOCOL_HEADER, /*----- occurs only once when CAPI_PROTOCOL_INIT is executed -----*/ + CAPI_PROTOCOL_MSG, /*----- the protocol-output is a CAPI Message -----*/ + CAPI_PROTOCOL_TXT, /*----- the output is text caused by CAPI_PROTOCOL_TEXT -----*/ +} CAPI_PROTOCOL_TYP; + +#define CAPI_PROTOCOL_INIT_BUF_SIZE (9*1024) + +/*--------------------------------------------------------------------------*\ + CAPI_PROTOCOL_INIT wants as first parameter a buffer with the size + CAPI_PROTOCOL_INIT_BUF_SIZE. The second parameter is the address of + a callback function with 3 parameter which is called whenever there is + protocoltext to give out. The callback functions parameters are a pointer + to the (ASCII) message, the type of the message and a pointer to the CAPI + Message if the type is CAPI_PROTOCOL_MSG. +\*--------------------------------------------------------------------------*/ +void __far CAPI_PROTOCOL_INIT (char *_buf, void (*_signal)(char *, CAPI_PROTOCOL_TYP, CAPI_MESSAGE)); + +/*--------------------------------------------------------------------------*\ + CAPI_PROTOCOL_MESSAGE prints the specified CAPI message on the protocol +\*--------------------------------------------------------------------------*/ +void __far CAPI_PROTOCOL_MESSAGE (CAPI_MESSAGE msg); + +/*--------------------------------------------------------------------------*\ + CAPI_PROTOCOL_TEXT prints the specified text on the protocol. + It has the same syntax as printf +\*--------------------------------------------------------------------------*/ +void __far CAPI_PROTOCOL_TEXT (char *fmt, ...); +#endif + +/*----- defines to access specific parameter -----*/ + +#define ALERT_REQ_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define ALERT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional info elements */ +#define ALERT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define ALERT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define ALERT_REQ_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define ALERT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define ALERT_CONF_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define ALERT_CONF_INFO(x) ((x)->Info) + /* 0: alert initiated */ + /* 0x0003: alert already sent by another application */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal PLCI */ + /* 0x2007: illegal message parameter coding */ +#define CONNECT_REQ_CONTROLLER(x) ((x)->adr.adrController) +#define CONNECT_REQ_CIPVALUE(x) ((x)->CIPValue) + /* Compatibility Information Profile */ +#define CONNECT_REQ_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber) + /* Called party number */ +#define CONNECT_REQ_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber) + /* Calling party number */ +#define CONNECT_REQ_CALLEDPARTYSUBADDRESS(x) ((x)->CalledPartySubaddress) + /* Called party subaddress */ +#define CONNECT_REQ_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress) + /* Calling party subaddress */ +#define CONNECT_REQ_BPROTOCOL(x) ((x)->BProtocol) + /* B protocol to be used */ +#define CONNECT_REQ_B1PROTOCOL(x) ((x)->B1protocol) + /* Physical layer and framing */ +#define CONNECT_REQ_B2PROTOCOL(x) ((x)->B2protocol) + /* Data link layer */ +#define CONNECT_REQ_B3PROTOCOL(x) ((x)->B3protocol) + /* Network layer */ +#define CONNECT_REQ_B1CONFIGURATION(x) ((x)->B1configuration) + /* Physical layer and framing parameter */ +#define CONNECT_REQ_B2CONFIGURATION(x) ((x)->B2configuration) + /* Data link layer parameter */ +#define CONNECT_REQ_B3CONFIGURATION(x) ((x)->B3configuration) + /* Network layer parameter */ +#define CONNECT_REQ_BC(x) ((x)->BC) + /* Bearer Capability */ +#define CONNECT_REQ_LLC(x) ((x)->LLC) + /* Low Layer Compatibility */ +#define CONNECT_REQ_HLC(x) ((x)->HLC) + /* High Layer Compatibility */ +#define CONNECT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional information elements */ +#define CONNECT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define CONNECT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_REQ_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define CONNECT_CONF_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_CONF_INFO(x) ((x)->Info) + /* 0: connect initiated */ + /* 0x2002: illegal controller */ + /* 0x2003: out of PLCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x3001: B1 protocol not supported */ + /* 0x3002: B2 protocol not supported */ + /* 0x3003: B3 protocol not supported */ + /* 0x3004: B1 protocol parameter not supported */ + /* 0x3005: B2 protocol parameter not supported */ + /* 0x3006: B3 protocol parameter not supported */ + /* 0x3007: B protocol combination not supported */ + /* 0x300A: CIP Value unknown */ +#define CONNECT_IND_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_IND_CIPVALUE(x) ((x)->CIPValue) + /* Compatibility Information Profile */ +#define CONNECT_IND_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber) + /* Called party number */ +#define CONNECT_IND_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber) + /* Calling party number */ +#define CONNECT_IND_CALLEDPARTYSUBADDRESS(x) ((x)->CalledPartySubaddress) + /* Called party subaddress */ +#define CONNECT_IND_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress) + /* Calling party subaddress */ +#define CONNECT_IND_BC(x) ((x)->BC) + /* Bearer compatibility */ +#define CONNECT_IND_LLC(x) ((x)->LLC) + /* Low Layer Compatibility */ +#define CONNECT_IND_HLC(x) ((x)->HLC) + /* High Layer Compatibility */ +#define CONNECT_IND_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional information elements */ +#define CONNECT_IND_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define CONNECT_IND_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_IND_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_IND_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define CONNECT_RESP_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_RESP_REJECT(x) ((x)->Reject) + /* 0: accept call */ + /* 1: ignore call */ + /* 2: reject call, normal call clearing */ + /* 3: reject call, user busy */ + /* 4: reject call, requestet circuit/channel not available */ + /* 5: reject call, facility rejected */ + /* 6: reject call, channel unacceptable */ + /* 7: reject call, incompatible destination */ + /* 8: reject call, destination out of order */ +#define CONNECT_RESP_BPROTOCOL(x) ((x)->BProtocol) + /* B protocol to be used */ +#define CONNECT_RESP_B1PROTOCOL(x) ((x)->B1protocol) + /* Physical layer and framing */ +#define CONNECT_RESP_B2PROTOCOL(x) ((x)->B2protocol) + /* Data link layer */ +#define CONNECT_RESP_B3PROTOCOL(x) ((x)->B3protocol) + /* Network layer */ +#define CONNECT_RESP_B1CONFIGURATION(x) ((x)->B1configuration) + /* Physical layer and framing parameter */ +#define CONNECT_RESP_B2CONFIGURATION(x) ((x)->B2configuration) + /* Data link layer parameter */ +#define CONNECT_RESP_B3CONFIGURATION(x) ((x)->B3configuration) + /* Network layer parameter */ +#define CONNECT_RESP_CONNECTEDNUMBER(x) ((x)->ConnectedNumber) + /* Connected number */ +#define CONNECT_RESP_CONNECTEDSUBADDRESS(x) ((x)->ConnectedSubaddress) + /* Connected subaddress */ +#define CONNECT_RESP_LLC(x) ((x)->LLC) + /* Low Layer Compatibility */ +#define CONNECT_RESP_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional information elements */ +#define CONNECT_RESP_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define CONNECT_RESP_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_RESP_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define CONNECT_RESP_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define CONNECT_ACTIVE_IND_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_ACTIVE_IND_CONNECTEDNUMBER(x) ((x)->ConnectedNumber) + /* Connected number */ +#define CONNECT_ACTIVE_IND_CONNECTEDSUBADDRESS(x) ((x)->ConnectedSubaddress) + /* Connected subaddress */ +#define CONNECT_ACTIVE_IND_LLC(x) ((x)->LLC) + /* Low Layer Compatibility */ +#define CONNECT_ACTIVE_RESP_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_B3_ACTIVE_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_ACTIVE_IND_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define CONNECT_B3_ACTIVE_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_REQ_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define CONNECT_B3_REQ_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define CONNECT_B3_CONF_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_CONF_INFO(x) ((x)->Info) + /* 0: connect initiated */ + /* 0x0001: NCPI not supported by current protocol, NCPI ignored */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal PLCI */ + /* 0x2004: out of NCCI */ + /* 0x3008: NCPI not supported */ +#define CONNECT_B3_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_IND_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define CONNECT_B3_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_RESP_REJECT(x) ((x)->Reject) + /* 0: accept call */ + /* 2: reject call, normal call clearing */ +#define CONNECT_B3_RESP_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define CONNECT_B3_T90_ACTIVE_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define CONNECT_B3_T90_ACTIVE_IND_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define CONNECT_B3_T90_ACTIVE_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DATA_B3_REQ_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DATA_B3_REQ_DATA(x) ((x)->Data) + /* Pointer to the data to be sent */ +#define DATA_B3_REQ_DATALENGTH(x) ((x)->DataLength) + /* Size of data area to be sent */ +#define DATA_B3_REQ_DATAHANDLE(x) ((x)->DataHandle) + /* Referenced in DATA_B3_CONF */ +#define DATA_B3_REQ_FLAGS(x) ((x)->Flags) + /* [0]: qualifier bit */ + /* [1]: more data bit */ + /* [2]: delivery confirmation bit */ + /* [3]: expedited data */ + /* [4] to [15]: reserved */ +#define DATA_B3_CONF_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DATA_B3_CONF_DATAHANDLE(x) ((x)->DataHandle) + /* Identifies the data area of corresponding DATA_B3_REQ */ +#define DATA_B3_CONF_INFO(x) ((x)->Info) + /* 0: data transmission initiated */ + /* 0x0002: flags not supported by current protocol, flags ignored */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal NCCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x300A: flags not supported (reserved bits) */ + /* 0x300C: data length not supported by current protocol */ +#define DATA_B3_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DATA_B3_IND_DATA(x) ((x)->Data) + /* Pointer to data received */ +#define DATA_B3_IND_DATALENGTH(x) ((x)->DataLength) + /* Size of data area received */ +#define DATA_B3_IND_DATAHANDLE(x) ((x)->DataHandle) + /* handle to data area, referenced in DATA_B3_RESP */ +#define DATA_B3_IND_FLAGS(x) ((x)->Flags) + /* 0: qualifier bit */ + /* 1: more-data bit */ + /* 2: delivery confirmation bit */ + /* 3: expedited data */ + /* 4 to 14: reserved */ + /* [15]: framing error bit, data may be invalid (only with corresponding B2 protocol) */ +#define DATA_B3_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DATA_B3_RESP_DATAHANDLE(x) ((x)->DataHandle) + /* Data area reference in corresponding DATA_B3_IND */ +#define DISCONNECT_B3_REQ_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DISCONNECT_B3_REQ_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define DISCONNECT_B3_CONF_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DISCONNECT_B3_CONF_INFO(x) ((x)->Info) + /* 0: disconnect initiated */ + /* 0x0001: NCPI not supported by current protocol, NCPI ignored */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal NCCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x3008: NCPI not supported */ +#define DISCONNECT_B3_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DISCONNECT_B3_IND_REASON_B3(x) ((x)->Reason_B3) + /* 0: clearing according to protocol */ + /* 0x3301: protocol error layer 1 */ + /* 0x3302: protocol error layer 2 */ + /* 0x3303: protocol error layer 3 */ + /* protocol dependent values are described in chapter 6 */ +#define DISCONNECT_B3_IND_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define DISCONNECT_B3_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define DISCONNECT_REQ_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define DISCONNECT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional information elements */ +#define DISCONNECT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define DISCONNECT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define DISCONNECT_REQ_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define DISCONNECT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define DISCONNECT_CONF_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define DISCONNECT_CONF_INFO(x) ((x)->Info) + /* 0: disconnect initiated */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal PLCI */ + /* 0x2007: illegal message parameter coding */ +#define DISCONNECT_IND_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define DISCONNECT_IND_REASON(x) ((x)->Reason) + /* 0: no cause available */ + /* 0x3301: protocol error layer 1 */ + /* 0x3302: protocol error layer 2 */ + /* 0x3303: protocol error layer 3 */ + /* 0x3304: another application got that call */ + /* 0x34xx: disconnect cause from the network according to Q.931/ETS 300 102-1. In the field 'xx' the cause value received within a cause information element (octet 4) from the network is indicated. */ +#define DISCONNECT_RESP_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define FACILITY_REQ_CONTROLLER(x) ((x)->adr.adrController) +#define FACILITY_REQ_PLCI(x) ((x)->adr.adrPLCI) +#define FACILITY_REQ_NCCI(x) ((x)->adr.adrNCCI) + /* Depending on the facility selector */ +#define FACILITY_REQ_FACILITYSELECTOR(x) ((x)->FacilitySelector) + /* 0: Handset Support */ + /* 1: DTMF */ + /* 2 to n: reserved */ +#define FACILITY_REQ_FACILITYREQUESTPARAMETER(x) ((x)->FacilityRequestParameter) + /* Facility depending parameters */ +#define FACILITY_CONF_CONTROLLER(x) ((x)->adr.adrController) +#define FACILITY_CONF_PLCI(x) ((x)->adr.adrPLCI) +#define FACILITY_CONF_NCCI(x) ((x)->adr.adrNCCI) + /* Depending on the facility selector */ +#define FACILITY_CONF_INFO(x) ((x)->Info) + /* 0: request accepted */ + /* 0x2001: message not supported in current state */ + /* 0x2002: incorrect Controller/PLCI/NCCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x300B: facility not supported */ +#define FACILITY_CONF_FACILITYSELECTOR(x) ((x)->FacilitySelector) + /* 0: Handset Support */ + /* 1: DTMF */ + /* 2 to n: reserved */ +#define FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(x) ((x)->FacilityConfirmationParameter) + /* Facility-depending parameters */ +#define FACILITY_IND_CONTROLLER(x) ((x)->adr.adrController) +#define FACILITY_IND_PLCI(x) ((x)->adr.adrPLCI) +#define FACILITY_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Depending on the facility selector */ +#define FACILITY_IND_FACILITYSELECTOR(x) ((x)->FacilitySelector) + /* 0: Handset Support */ + /* 1: DTMF */ + /* 2 to n: reserved */ +#define FACILITY_IND_FACILITYINDICATIONPARAMETER(x) ((x)->FacilityIndicationParameter) + /* Facility-depending parameters */ +#define FACILITY_RESP_CONTROLLER(x) ((x)->adr.adrController) +#define FACILITY_RESP_PLCI(x) ((x)->adr.adrPLCI) +#define FACILITY_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Depending on the facility selector */ +#define FACILITY_RESP_FACILITYSELECTOR(x) ((x)->FacilitySelector) + /* 0: Handset Support */ + /* 1: DTMF */ + /* 2 to n: reserved */ +#define FACILITY_RESP_FACILITYRESPONSEPARAMETERS(x) ((x)->FacilityResponseParameters) + /* Facility-depending parameters */ +#define INFO_REQ_CONTROLLER(x) ((x)->adr.adrController) +#define INFO_REQ_PLCI(x) ((x)->adr.adrPLCI) + /* See note */ +#define INFO_REQ_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber) + /* Called party number */ +#define INFO_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo) + /* Additional information elements */ +#define INFO_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation) +#define INFO_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility) + /* coded according to ETS 300 102-1 / Q.931 */ +#define INFO_REQ_USERUSERDATA(x) ((x)->Useruserdata) + /* coded according to ETS 300 102-1 / Q.931 */ +#define INFO_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray) + /* which is used to transfer additional parameters coded */ + /* according to ETS 300 102-1 / Q.931 starting from octet 1. */ + /* This field is used to transport one or more complete facility */ + /* data information elements. */ +#define INFO_CONF_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define INFO_CONF_INFO(x) ((x)->Info) + /* 0: transmission of information initiated */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal Controller/PLCI */ + /* 0x2003: out of PLCI */ + /* 0x2007: illegal message parameter coding */ +#define INFO_IND_CONTROLLER(x) ((x)->adr.adrController) +#define INFO_IND_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define INFO_IND_INFONUMBER(x) ((x)->InfoNumber) + /* Information element identifier */ +#define INFO_IND_INFOELEMENT(x) ((x)->InfoElement) + /* Information element dependent structure */ +#define INFO_RESP_CONTROLLER(x) ((x)->adr.adrController) +#define INFO_RESP_PLCI(x) ((x)->adr.adrPLCI) + /* As in INFO_IND */ +#define LISTEN_REQ_CONTROLLER(x) ((x)->adr.adrController) +#define LISTEN_REQ_INFOMASK(x) ((x)->InfoMask) + /* Bit field, coding as follows: */ + /* 0: cause */ + /* 1: date/Time */ + /* 2: display */ + /* 3: user-user information */ + /* 4: call progression */ + /* 5: facility */ + /* 6: charging */ + /* 7 to 31: reserved */ +#define LISTEN_REQ_CIPMASK(x) ((x)->CIPmask) + /* Bit field, coding as follows: */ + /* 0: any match */ + /* 1: speech */ + /* 2: unrestricted digital information */ + /* 3: restricted digital information */ + /* 4: 3.1 kHz audio */ + /* 5: 7.0 kHz audio */ + /* 6: video */ + /* 7: packet mode */ + /* 8: 56 kBit/s rate adaptation */ + /* 9: unrestricted digital information with tones/announcements */ + /* 10..15: reserved */ + /* 16: telephony */ + /* 17: fax group 2/3 */ + /* 18: fax group 4 class 1 */ + /* 19: Teletex service (basic and mixed), fax group 4 class 2 */ + /* 20: Teletex service (basic and processable) */ + /* 21: Teletex service (basic) */ + /* 22: Videotex */ + /* 23: Telex */ + /* reserved for additional services */ + /* 25: OSI applications according X.200 */ + /* 26: 7 kHz Telephony */ + /* 27: Video Telephony F.721, first connection */ + /* 28: Video Telephony F.721, second connection */ + /* 29 to 31: reserved */ +#define LISTEN_REQ_CIPMASK2(x) ((x)->CIPmask2) + /* reserved for additional services */ +#define LISTEN_REQ_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber) + /* Calling party number */ +#define LISTEN_REQ_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress) + /* Calling party subaddress */ +#define LISTEN_CONF_CONTROLLER(x) ((x)->adr.adrController) +#define LISTEN_CONF_INFO(x) ((x)->Info) + /* 0: listen is active */ + /* 0x2002: illegal controller */ + /* 0x2005: out of LISTEN-Resources */ + /* 0x2007: illegal message parameter coding */ +#define MANUFACTURER_REQ_CONTROLLER(x) ((x)->adr.adrController) +#define MANUFACTURER_REQ_MANUID(x) ((x)->ManuID) + /* Manufacturer specific ID (should be unique) */ + /* Manufacturer specific */ +#define MANUFACTURER_REQ_CLASS(x) ((x)->Class) +#define MANUFACTURER_REQ_FUNCTION(x) ((x)->Function) +#define MANUFACTURER_REQ_MANUDATA(x) ((x)->ManuData) + /* Manufacturer specific data */ +#define MANUFACTURER_CONF_CONTROLLER(x) ((x)->adr.adrController) +#define MANUFACTURER_CONF_MANUID(x) ((x)->ManuID) + /* Manufacturer specific ID (should be unique) */ + /* Manufacturer specific */ +#define MANUFACTURER_CONF_CLASS(x) ((x)->Class) +#define MANUFACTURER_CONF_FUNCTION(x) ((x)->Function) +#define MANUFACTURER_CONF_MANUDATA(x) ((x)->ManuData) + /* Manufacturer specific data */ +#define MANUFACTURER_IND_CONTROLLER(x) ((x)->adr.adrController) +#define MANUFACTURER_IND_MANUID(x) ((x)->ManuID) + /* Manufacturer specific ID (should be unique) */ + /* Manufacturer specific */ +#define MANUFACTURER_IND_CLASS(x) ((x)->Class) +#define MANUFACTURER_IND_FUNCTION(x) ((x)->Function) +#define MANUFACTURER_IND_MANUDATA(x) ((x)->ManuData) + /* Manufacturer specific data */ +#define MANUFACTURER_RESP_CONTROLLER(x) ((x)->adr.adrController) +#define MANUFACTURER_RESP_MANUID(x) ((x)->ManuID) + /* Manufacturer specific ID (should be unique) */ + /* Manufacturer specific */ +#define MANUFACTURER_RESP_CLASS(x) ((x)->Class) +#define MANUFACTURER_RESP_FUNCTION(x) ((x)->Function) +#define MANUFACTURER_RESP_MANUDATA(x) ((x)->ManuData) + /* Manufacturer specific data */ +#define RESET_B3_REQ_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define RESET_B3_REQ_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define RESET_B3_CONF_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define RESET_B3_CONF_INFO(x) ((x)->Info) + /* 0: reset initiated */ + /* 0x0001: NCPI not supported by current protocol, NCPI ignored */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal NCCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x3008: NCPI not supported */ + /* 0x300D: reset procedure not supported by current protocol */ +#define RESET_B3_IND_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define RESET_B3_IND_NCPI(x) ((x)->NCPI) + /* Network Control Protocol Information */ +#define RESET_B3_RESP_NCCI(x) ((x)->adr.adrNCCI) + /* Network Control Connection Identifier */ +#define SELECT_B_PROTOCOL_REQ_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define SELECT_B_PROTOCOL_REQ_BPROTOCOL(x) ((x)->BProtocol) + /* Protocol definition */ +#define SELECT_B_PROTOCOL_REQ_B1PROTOCOL(x) ((x)->B1protocol) + /* Physical layer and framing */ +#define SELECT_B_PROTOCOL_REQ_B2PROTOCOL(x) ((x)->B2protocol) + /* Data link layer */ +#define SELECT_B_PROTOCOL_REQ_B3PROTOCOL(x) ((x)->B3protocol) + /* Network layer */ +#define SELECT_B_PROTOCOL_REQ_B1CONFIGURATION(x) ((x)->B1configuration) + /* Physical layer and framing parameter */ +#define SELECT_B_PROTOCOL_REQ_B2CONFIGURATION(x) ((x)->B2configuration) + /* Data link layer parameter */ +#define SELECT_B_PROTOCOL_REQ_B3CONFIGURATION(x) ((x)->B3configuration) + /* Network layer parameter */ +#define SELECT_B_PROTOCOL_CONF_PLCI(x) ((x)->adr.adrPLCI) + /* Physical Link Connection Identifier */ +#define SELECT_B_PROTOCOL_CONF_INFO(x) ((x)->Info) + /* 0: protocol switch successful */ + /* 0x2001: message not supported in current state */ + /* 0x2002: illegal PLCI */ + /* 0x2007: illegal message parameter coding */ + /* 0x3001: B1 protocol not supported */ + /* 0x3002: B2 protocol not supported */ + /* 0x3003: B3 protocol not supported */ + /* 0x3004: B1 protocol parameter not supported */ + /* 0x3005: B2 protocol parameter not supported */ + /* 0x3006: B3 protocol parameter not supported */ + /* 0x3007: B protocol combination not supported */ + +/*----- tests for specific commands -----*/ + +#define IS_CONNECT_IND(m) ((m)->Command==0x02 && (m)->Subcommand==0x82) +#define IS_CONNECT_ACTIVE_IND(m) ((m)->Command==0x03 && (m)->Subcommand==0x82) +#define IS_CONNECT_B3_ACTIVE_IND(m) ((m)->Command==0x83 && (m)->Subcommand==0x82) +#define IS_CONNECT_B3_IND(m) ((m)->Command==0x82 && (m)->Subcommand==0x82) +#define IS_CONNECT_B3_T90_ACTIVE_IND(m) ((m)->Command==0x88 && (m)->Subcommand==0x82) +#define IS_DATA_B3_IND(m) ((m)->Command==0x86 && (m)->Subcommand==0x82) +#define IS_DISCONNECT_B3_IND(m) ((m)->Command==0x84 && (m)->Subcommand==0x82) +#define IS_DISCONNECT_IND(m) ((m)->Command==0x04 && (m)->Subcommand==0x82) +#define IS_FACILITY_IND(m) ((m)->Command==0x80 && (m)->Subcommand==0x82) +#define IS_INFO_IND(m) ((m)->Command==0x08 && (m)->Subcommand==0x82) +#define IS_MANUFACTURER_IND(m) ((m)->Command==0xff && (m)->Subcommand==0x82) +#define IS_RESET_B3_IND(m) ((m)->Command==0x87 && (m)->Subcommand==0x82) +#define IS_ALERT_CONF(m) ((m)->Command==0x01 && (m)->Subcommand==0x81) +#define IS_CONNECT_CONF(m) ((m)->Command==0x02 && (m)->Subcommand==0x81) +#define IS_CONNECT_B3_CONF(m) ((m)->Command==0x82 && (m)->Subcommand==0x81) +#define IS_DATA_B3_CONF(m) ((m)->Command==0x86 && (m)->Subcommand==0x81) +#define IS_DISCONNECT_B3_CONF(m) ((m)->Command==0x84 && (m)->Subcommand==0x81) +#define IS_DISCONNECT_CONF(m) ((m)->Command==0x04 && (m)->Subcommand==0x81) +#define IS_FACILITY_CONF(m) ((m)->Command==0x80 && (m)->Subcommand==0x81) +#define IS_INFO_CONF(m) ((m)->Command==0x08 && (m)->Subcommand==0x81) +#define IS_LISTEN_CONF(m) ((m)->Command==0x05 && (m)->Subcommand==0x81) +#define IS_MANUFACTURER_CONF(m) ((m)->Command==0xff && (m)->Subcommand==0x81) +#define IS_RESET_B3_CONF(m) ((m)->Command==0x87 && (m)->Subcommand==0x81) +#define IS_SELECT_B_PROTOCOL_CONF(m) ((m)->Command==0x41 && (m)->Subcommand==0x81) + +/*----- header functions that fill the _cmsg structure with default -----*/ +/*----- values. Only nonstandard parameter need to be changed -----*/ + +#define ALERT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x01,0x80,Messagenumber,adr) +#define CONNECT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x02,0x80,Messagenumber,adr) +#define CONNECT_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x82,0x80,Messagenumber,adr) +#define DATA_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x86,0x80,Messagenumber,adr) +#define DISCONNECT_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x84,0x80,Messagenumber,adr) +#define DISCONNECT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x04,0x80,Messagenumber,adr) +#define FACILITY_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x80,0x80,Messagenumber,adr) +#define INFO_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x08,0x80,Messagenumber,adr) +#define LISTEN_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x05,0x80,Messagenumber,adr) +#define MANUFACTURER_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0xff,0x80,Messagenumber,adr) +#define RESET_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x87,0x80,Messagenumber,adr) +#define SELECT_B_PROTOCOL_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x41,0x80,Messagenumber,adr) +#define CONNECT_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x02,0x83,Messagenumber,adr) +#define CONNECT_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x03,0x83,Messagenumber,adr) +#define CONNECT_B3_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x83,0x83,Messagenumber,adr) +#define CONNECT_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x82,0x83,Messagenumber,adr) +#define CONNECT_B3_T90_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x88,0x83,Messagenumber,adr) +#define DATA_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x86,0x83,Messagenumber,adr) +#define DISCONNECT_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x84,0x83,Messagenumber,adr) +#define DISCONNECT_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x04,0x83,Messagenumber,adr) +#define FACILITY_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x80,0x83,Messagenumber,adr) +#define INFO_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x08,0x83,Messagenumber,adr) +#define MANUFACTURER_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0xff,0x83,Messagenumber,adr) +#define RESET_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \ + CAPI_CMSG_HEADER(cmsg,ApplId,0x87,0x83,Messagenumber,adr) + +/*--------------------------------------------------------------------------*\ + CAPI-functions that correspond to the CAPI messages specified in the + CAPI 2.0 specification. All possible parameter have to be specified. + The CAPI message is sent immediately when calling these functions, + return values are the same as in CAPI_PUT_MESSAGE +\*--------------------------------------------------------------------------*/ + +unsigned ALERT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct BChannelinformation + ,_cstruct Keypadfacility + ,_cstruct Useruserdata + ,_cstruct Facilitydataarray); +unsigned CONNECT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword CIPValue + ,_cstruct CalledPartyNumber + ,_cstruct CallingPartyNumber + ,_cstruct CalledPartySubaddress + ,_cstruct CallingPartySubaddress + ,_cword B1protocol + ,_cword B2protocol + ,_cword B3protocol + ,_cstruct B1configuration + ,_cstruct B2configuration + ,_cstruct B3configuration + ,_cstruct BC + ,_cstruct LLC + ,_cstruct HLC + ,_cstruct BChannelinformation + ,_cstruct Keypadfacility + ,_cstruct Useruserdata + ,_cstruct Facilitydataarray); +unsigned CONNECT_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct NCPI); +unsigned DATA_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cdword Data + ,_cword DataLength + ,_cword DataHandle + ,_cword Flags); +unsigned DISCONNECT_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct NCPI); +unsigned DISCONNECT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct BChannelinformation + ,_cstruct Keypadfacility + ,_cstruct Useruserdata + ,_cstruct Facilitydataarray); +unsigned FACILITY_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword FacilitySelector + ,_cstruct FacilityRequestParameter); +unsigned INFO_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct CalledPartyNumber + ,_cstruct BChannelinformation + ,_cstruct Keypadfacility + ,_cstruct Useruserdata + ,_cstruct Facilitydataarray); +unsigned LISTEN_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cdword InfoMask + ,_cdword CIPmask + ,_cdword CIPmask2 + ,_cstruct CallingPartyNumber + ,_cstruct CallingPartySubaddress); +unsigned MANUFACTURER_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cdword ManuID + ,_cdword Class + ,_cdword Function + ,_cstruct ManuData); +unsigned RESET_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cstruct NCPI); +unsigned SELECT_B_PROTOCOL_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword B1protocol + ,_cword B2protocol + ,_cword B3protocol + ,_cstruct B1configuration + ,_cstruct B2configuration + ,_cstruct B3configuration); +unsigned CONNECT_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword Reject + ,_cword B1protocol + ,_cword B2protocol + ,_cword B3protocol + ,_cstruct B1configuration + ,_cstruct B2configuration + ,_cstruct B3configuration + ,_cstruct ConnectedNumber + ,_cstruct ConnectedSubaddress + ,_cstruct LLC + ,_cstruct BChannelinformation + ,_cstruct Keypadfacility + ,_cstruct Useruserdata + ,_cstruct Facilitydataarray); +unsigned CONNECT_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned CONNECT_B3_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned CONNECT_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword Reject + ,_cstruct NCPI); +unsigned CONNECT_B3_T90_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned DATA_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword DataHandle); +unsigned DISCONNECT_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned DISCONNECT_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned FACILITY_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cword FacilitySelector + ,_cstruct FacilityResponseParameters); +unsigned INFO_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); +unsigned MANUFACTURER_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr + ,_cdword ManuID + ,_cdword Class + ,_cdword Function + ,_cstruct ManuData); +unsigned RESET_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber + ,_cdword adr); + + +#ifdef __cplusplus +} +#endif + +#endif /*----- _capi20_h_ -----*/ diff --git a/C20LIB/SOURCE/CDOS.C b/C20LIB/SOURCE/CDOS.C new file mode 100644 index 0000000..1e3c26e --- /dev/null +++ b/C20LIB/SOURCE/CDOS.C @@ -0,0 +1,227 @@ +/*---------------------------------------------------------------------------*\ + + CDOS.C Version 1.2 1997 AVM + + This file contains the source of the operating system specific + CAPI functions, here for DOS. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include +#include + +#include "capi20.h" + +#define CAPI_REGISTER_NR 0x01 +#define CAPI_RELEASE_NR 0x02 +#define CAPI_PUT_MESSAGE_NR 0x03 +#define CAPI_GET_MESSAGE_NR 0x04 +#define CAPI_SET_SIGNAL_NR 0x05 +#define CAPI_DEINSTALL_NR 0x06 +#define CAPI_GET_MANUFACTURER_NR 0xF0 +#define CAPI_GET_VERSION_NR 0xF1 +#define CAPI_GET_SERIAL_NUMBER_NR 0xF2 +#define CAPI_GET_PROFILE_NR 0xF3 +#define CAPI_MANUFACTURER_NR 0xFF + +static int TrapNumber = 0xF1; + +/*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + char __far *p = (char __far *) (long) _dos_getvect (TrapNumber); + return 0 == _fmemcmp (p+11, "CAPI20", 6); +} + +/*---------------------------------------------------------------------------*/ +void CAPI20_SET_TRAP (unsigned char Number) { + TrapNumber = Number; +} + +/*---------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (CAPI_MESSAGE Buffer, unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_REGISTER_NR; + + Regs.x.cx = MsgBufSize; + Regs.x.dx = MaxB3Connection; + Regs.x.si = MaxB3Blks; + Regs.x.di = MaxSizeB3; + + Regs.x.bx = _FP_OFF (Buffer); + Segs.es = _FP_SEG (Buffer); + + _int86x (TrapNumber, &Regs, &Regs, &Segs); + + *ErrorCode = (CAPI_REGISTER_ERROR) Regs.x.bx; + +#if defined (CPROT) + if (Regs.x.ax == 0x0000) + CAPI_PROTOCOL_TEXT ("CAPI_REGISTER error \n", Regs.x.bx); +#endif + + return (_cword) Regs.x.ax; +} + +/*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_RELEASE_NR; + + Regs.x.dx = Appl_Id; + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + +#if defined (CPROT) + if (Regs.x.ax != 0x0000) + CAPI_PROTOCOL_TEXT ("CAPI_RELEASE error 0x%04x\n", Regs.x.ax); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax; +} + +/*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_PUT_MESSAGE_NR; + + Regs.x.dx = Appl_Id; + Regs.x.bx = _FP_OFF (Msg); + Segs.es = _FP_SEG (Msg); + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + +#if defined (CPROT) + if (Regs.x.ax == 0x0000) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Regs.x.ax); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax; +} + +/*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE __far * ReturnMessage) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_GET_MESSAGE_NR; + + Regs.x.dx = Appl_Id; + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + + (*((unsigned __far *)&(*ReturnMessage))) = Regs.x.bx; + (*((unsigned __far *)&(*ReturnMessage) + 1)) = Segs.es; + +#if defined (CPROT) + if (Regs.x.ax == 0x0000) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Regs.x.ax != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Regs.x.ax); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax; +} +/*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, void (__far * CallBack) (void), void __far *CallBackPar) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_SET_SIGNAL_NR; + + Regs.x.dx = ApplId; + Regs.x.di = _FP_OFF (CallBackPar); + Regs.x.si = _FP_SEG (CallBackPar); + + Regs.x.bx = _FP_OFF (CallBack); + Segs.es = _FP_SEG (CallBack); + + _int86x (TrapNumber, &Regs, &Regs, &Segs); + +#if defined (CPROT) + if (Regs.x.ax != 0x0000) + CAPI_PROTOCOL_TEXT ("CAPI_SET_SIGNAL error \n", Regs.x.ax); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax; +} + +/*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_GET_MANUFACTURER_NR; + + Regs.x.bx = _FP_OFF (LpBuffer); + Segs.es = _FP_SEG (LpBuffer); + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + return LpBuffer; +} + +/*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_GET_VERSION_NR; + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + + version[0] = Regs.h.ah; + version[1] = Regs.h.al; + version[2] = Regs.h.dh; + version[3] = Regs.h.dl; + return version; +} + +/*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_GET_SERIAL_NUMBER_NR; + + Regs.x.bx = _FP_OFF (LpBuffer); + Segs.es = _FP_SEG (LpBuffer); + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + return LpBuffer; +} + +/*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + struct _SREGS Segs; + union _REGS Regs; + + Regs.h.ah = 20; + Regs.h.al = CAPI_GET_PROFILE_NR; + + Regs.x.cx = Controller; + Regs.x.bx = _FP_OFF (LpBuffer); + Segs.es = _FP_SEG (LpBuffer); + + _int86x(TrapNumber, &Regs, &Regs, &Segs); + +#if defined (CPROT) + if (Regs.x.ax != 0x0000) + CAPI_PROTOCOL_TEXT ("CAPI_GET_PROFILE error \n", Regs.x.ax); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Regs.x.ax; +} diff --git a/C20LIB/SOURCE/CDOS.H b/C20LIB/SOURCE/CDOS.H new file mode 100644 index 0000000..2627a57 --- /dev/null +++ b/C20LIB/SOURCE/CDOS.H @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------*\ + + CDOS.H Version 1.1 1995 AVM + + Operation system specific CAPI 2.0 functions for DOS + +\*--------------------------------------------------------------------------*/ +#ifndef _cdos_h_ +#define _cdos_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "capi20.h" + +unsigned CAPI20_ISINSTALLED (void); +void CAPI20_SET_TRAP (unsigned char Number); +_cword CAPI20_REGISTER (CAPI_MESSAGE Buffer, unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE __far * ReturnMessage); +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, void (__far * CallBack) (void), void __far *CallBackPar); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); + +#ifdef __cplusplus +} +#endif + +#endif /*----- _cdos_h_ -----*/ diff --git a/C20LIB/SOURCE/CLINUX.C b/C20LIB/SOURCE/CLINUX.C new file mode 100644 index 0000000..8b331a0 --- /dev/null +++ b/C20LIB/SOURCE/CLINUX.C @@ -0,0 +1,317 @@ +/*---------------------------------------------------------------------------*\ + + CLINUX.C Version 1.0 1997 AVM + + This file contains the source of the operating system specific + CAPI functions, here for LINUX user-mode applications. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "capi20.h" + + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static int capi_fd = -1; +static capi_ioctl_struct ioctl_data; +static unsigned char rcvbuf[128+2048]; /*----- message + data -----*/ +static unsigned char sndbuf[128+2048]; /*----- message + data -----*/ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) +{ + if (capi_fd >= 0) + return 1; + + /*----- open managment link -----*/ + if ((capi_fd = open("/dev/capi20", O_RDWR, 0666)) < 0) + return 0; + + return ioctl(capi_fd, CAPI_INSTALLED, 0) == 0; +} + +/*---------------------------------------------------------------------------*\ + managment of application ids +\*---------------------------------------------------------------------------*/ +static struct capi_applidmap { + int used; + int fd; +} capi_applidmap[CAPI_MAXAPPL] = {0}; + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static inline _cword allocapplid(int fd) +{ + _cword i; + for (i=0; i < CAPI_MAXAPPL; i++) { + if (capi_applidmap[i].used == 0) { + capi_applidmap[i].used = 1; + capi_applidmap[i].fd = fd; + return i+1; + } + } + return 0; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static inline void freeapplid(_cword applid) +{ + capi_applidmap[applid-1].used = 0; + capi_applidmap[applid-1].fd = -1; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static inline int validapplid(_cword applid) +{ + return applid > 0 && applid <= CAPI_MAXAPPL + && capi_applidmap[applid-1].used; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static inline int applid2fd(_cword applid) +{ + return capi_applidmap[applid-1].fd; +} + +/*---------------------------------------------------------------------------*\ + CAPI2.0 functions +\*---------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MaxB3Connection, + unsigned MaxB3Blks, + unsigned MaxSizeB3, + CAPI_REGISTER_ERROR *ErrorCode) +{ + _cword applid; + char buf[PATH_MAX]; + int i, fd = -1; + + if (!CAPI20_ISINSTALLED()) { + *ErrorCode = CapiRegNotInstalled; + return 0; + } + + *ErrorCode = CapiRegOSResourceErr; + + for (i=0; fd < 0; i++) { + /*----- open pseudo-clone device -----*/ + sprintf(buf, "/dev/capi20.%02d", i); + if ((fd = open(buf, O_RDWR|O_NONBLOCK, 0666)) < 0) { + switch (errno) { + case EEXIST: + break; + default: + return 0; + } + } + } + + if ((applid = allocapplid(fd)) == 0) + return 0; + + ioctl_data.rparams.level3cnt = MaxB3Connection; + ioctl_data.rparams.datablkcnt = MaxB3Blks; + ioctl_data.rparams.datablklen = MaxSizeB3; + + if (ioctl(fd, CAPI_REGISTER, &ioctl_data) < 0) { + if (errno == EIO) { + if (ioctl(fd, CAPI_GET_ERRCODE, &ioctl_data) < 0) + return 0; + *ErrorCode = ioctl_data.errcode; + } + return 0; + } + return applid; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) +{ + if (!CAPI20_ISINSTALLED()) + return CapiRegNotInstalled; + if (!validapplid(Appl_Id)) + return CapiIllAppNr; + (void)close(applid2fd(Appl_Id)); + freeapplid(Appl_Id); + return CapiNoError; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) +{ + MESSAGE_EXCHANGE_ERROR ret; + int len = (Msg[0] | (Msg[1] << 8)); + int cmd = Msg[4]; + int subcmd = Msg[5]; + int rc; + int fd; + + if (!CAPI20_ISINSTALLED()) + return CapiRegNotInstalled; + + if (!validapplid(Appl_Id)) + return CapiIllAppNr; + + fd = applid2fd(Appl_Id); + + memcpy(sndbuf, Msg, len); + + if (cmd == CAPI_DATA_B3 && subcmd == CAPI_REQ) { + int datalen = (Msg[16] | (Msg[17] << 8)); + void *dataptr = (void *)(Msg[12]|(Msg[13]<<8)|(Msg[14]<<16)|(Msg[15]<<24)); + memcpy(sndbuf+len, dataptr, datalen); + len += datalen; + } + + ret = CapiNoError; + errno = 0; + + if ((rc = write(fd, sndbuf, len)) != len) { + switch (errno) { + case EFAULT: + case EINVAL: + ret = CapiIllCmdOrSubcmdOrMsgToSmall; + break; + case EBADF: + ret = CapiIllAppNr; + break; + case EIO: + if (ioctl(fd, CAPI_GET_ERRCODE, &ioctl_data) < 0) + ret = CapiMsgOSResourceErr; + else ret = (MESSAGE_EXCHANGE_ERROR)ioctl_data.errcode; + break; + default: + ret = CapiMsgOSResourceErr; + break; + } + } + +#if defined (CPROT_LINUX) + if (ret == CapiNoError) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", ret); +#endif + + return ret; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage) +{ + MESSAGE_EXCHANGE_ERROR ret; + int rc, fd; + + if (!CAPI20_ISINSTALLED()) + return CapiRegNotInstalled; + + if (!validapplid(Appl_Id)) + return CapiIllAppNr; + + fd = applid2fd(Appl_Id); + + *ReturnMessage = rcvbuf; + if ((rc = read(fd, rcvbuf, sizeof(rcvbuf))) > 0) { +#if defined (CPROT_LINUX) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); +#endif + return CapiNoError; + } + + if (rc == 0) + return CapiReceiveQueueEmpty; + + switch (errno) { + case EMSGSIZE: + ret = CapiIllCmdOrSubcmdOrMsgToSmall; + break; + case EAGAIN: + return CapiReceiveQueueEmpty; + default: + ret = CapiMsgOSResourceErr; + break; + } + +#if defined (CPROT_LINUX) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", ret); +#endif + + return ret; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) +{ + if (!CAPI20_ISINSTALLED()) + return 0; + ioctl_data.contr = 0; + if (ioctl(capi_fd, CAPI_GET_MANUFACTURER, &ioctl_data) < 0) + return 0; + strncpy(LpBuffer, ioctl_data.manufacturer, CAPI_MANUFACTURER_LEN); + return LpBuffer; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) +{ + if (!CAPI20_ISINSTALLED()) + return 0; + ioctl_data.contr = 0; + if (ioctl(capi_fd, CAPI_GET_VERSION, &ioctl_data) < 0) + return 0; + memcpy(version, &ioctl_data.version, sizeof(capi_version)); + return version; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) +{ + if (!CAPI20_ISINSTALLED()) + return 0; + ioctl_data.contr = 0; + if (ioctl(capi_fd, CAPI_GET_SERIAL, &ioctl_data) < 0) + return 0; + memcpy(LpBuffer, &ioctl_data.serial, CAPI_SERIAL_LEN); + return LpBuffer; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) +{ + if (!CAPI20_ISINSTALLED()) + return CapiMsgNotInstalled; + + ioctl_data.contr = Controller; + if (ioctl(capi_fd, CAPI_GET_PROFILE, &ioctl_data) < 0) { + if (errno != EIO) + return CapiMsgOSResourceErr; + if (ioctl(capi_fd, CAPI_GET_ERRCODE, &ioctl_data) < 0) + return CapiMsgOSResourceErr; + return (MESSAGE_EXCHANGE_ERROR)ioctl_data.errcode; + } + if (Controller) + memcpy(LpBuffer, &ioctl_data.profile, CAPI_SERIAL_LEN); + else + memcpy(LpBuffer, &ioctl_data.profile.ncontroller, + sizeof(ioctl_data.profile.ncontroller)); + return CapiNoError; +} +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ diff --git a/C20LIB/SOURCE/CLINUX.H b/C20LIB/SOURCE/CLINUX.H new file mode 100644 index 0000000..1c3e405 --- /dev/null +++ b/C20LIB/SOURCE/CLINUX.H @@ -0,0 +1,48 @@ +/*---------------------------------------------------------------------------*\ + + Clinux.H Version 1.0 1997 AVM + + Operation system specific CAPI 2.0 functions for the Linux interface + +\*---------------------------------------------------------------------------*/ +#ifndef _linux_h_ +#define _linux_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include +#include "capi20.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); + +_cword CAPI20_REGISTER (unsigned MaxB3Connection, + unsigned MaxB3Blks, + unsigned MaxSizeB3, + CAPI_REGISTER_ERROR *ErrorCode); + +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id); + +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id); + +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage); + +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); + +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); + +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); + +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif diff --git a/C20LIB/SOURCE/COS2.C b/C20LIB/SOURCE/COS2.C new file mode 100644 index 0000000..28e856e --- /dev/null +++ b/C20LIB/SOURCE/COS2.C @@ -0,0 +1,150 @@ +/*---------------------------------------------------------------------------*\ + + COS2.C Version 1.0 1997 AVM + + This file contains the source of the operating system specific + CAPI functions, here for OS/2 applications. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include "cos2.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +typedef unsigned short WORD; +typedef unsigned long DWORD; +/*---------------------------------------------------------------------------*\ + defined in capi20 runtime DLL +\*---------------------------------------------------------------------------*/ +extern DWORD APIENTRY CAPI_REGISTER (DWORD MessageBufferSize, DWORD maxLogicalConnection, DWORD maxBDataBlocks, DWORD maxBDataLen, DWORD *pApplID); +extern DWORD APIENTRY CAPI_RELEASE (DWORD ApplID); +extern DWORD APIENTRY CAPI_PUT_MESSAGE (DWORD ApplID, PVOID pCAPIMessage); +extern DWORD APIENTRY CAPI_GET_MESSAGE (DWORD ApplID, PVOID *ppCAPIMessage); +extern DWORD APIENTRY CAPI_SET_SIGNAL (DWORD ApplID, DWORD hEventSem); +extern void APIENTRY CAPI_GET_MANUFACTURER (PVOID SzBuffer); +extern DWORD APIENTRY CAPI_GET_VERSION (DWORD *pCAPIMajor, DWORD *pCAPIMinor, DWORD *pManufacturerMajor, DWORD *pManufacturerMinor); +extern DWORD APIENTRY CAPI_GET_SERIAL_NUMBER (PVOID SzBuffer); +extern DWORD APIENTRY CAPI_GET_PROFILE (PBYTE SzBuffer, WORD CtrlNr); +extern DWORD APIENTRY CAPI_INSTALLED (void); +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + return (unsigned)CAPI_INSTALLED () == 0; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + DWORD ApplID; + + *ErrorCode = (CAPI_REGISTER_ERROR) CAPI_REGISTER(MsgBufSize, MaxB3Connection, MaxB3Blks, MaxSizeB3, &ApplID); + + return (_cword)ApplID; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) { + + return (MESSAGE_EXCHANGE_ERROR) CAPI_RELEASE (Appl_Id); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) { + DWORD Error; + + Error = CAPI_PUT_MESSAGE(Appl_Id, (void *)Msg); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE __far *ReturnMessage) { + DWORD Error; + + Error = CAPI_GET_MESSAGE(Appl_Id, (PVOID *)ReturnMessage); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Error != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, HEV hEventSem) { + DWORD Error; + + Error = CAPI_SET_SIGNAL (ApplId, (DWORD) hEventSem); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_SET_SIGNAL error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) { + CAPI_GET_MANUFACTURER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) { + DWORD CMajor; + DWORD CMinor; + DWORD MMajor; + DWORD MMinor; + + CAPI_GET_VERSION(&CMajor, &CMinor, &MMajor, &MMinor); + + version[0] = (BYTE)CMajor; + version[1] = (BYTE)CMinor; + version[2] = (BYTE)MMajor; + version[3] = (BYTE)MMinor; + + return version; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) { + + CAPI_GET_SERIAL_NUMBER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + DWORD Error; + + Error = CAPI_GET_PROFILE (LpBuffer, Controller); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_GET_PROFILE error \n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ diff --git a/C20LIB/SOURCE/COS2.H b/C20LIB/SOURCE/COS2.H new file mode 100644 index 0000000..b57240a --- /dev/null +++ b/C20LIB/SOURCE/COS2.H @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------*\ + + COS2.H Version 1.0 1997 AVM + + Operation system specific CAPI 2.0 functions for OS/2 + +\*--------------------------------------------------------------------------*/ +#ifndef _cos2_h_ +#define _cos2_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include + +#include "capi20.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE __far * ReturnMessage); +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, HEV hEventSem); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif /*----- _cos2_h_ -----*/ diff --git a/C20LIB/SOURCE/CVXD.C b/C20LIB/SOURCE/CVXD.C new file mode 100644 index 0000000..8638f7f --- /dev/null +++ b/C20LIB/SOURCE/CVXD.C @@ -0,0 +1,271 @@ +/*---------------------------------------------------------------------------*\ + + CWIN.C Version 1.2 1997 AVM + + This file contains the source of the operating system specific + CAPI 2.0 functions, here for the Win95 VxD interface. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include + +#include "cvxd.h" + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static unsigned IsWin40 (void) { + + unsigned Major; + + VMMCall (Get_VMM_Version); + __asm { + movzx eax, ah + mov [Major], eax + } + return (Major >= 4); +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static unsigned CAPIVxDGetVersion (void) { + + unsigned uRet = 0; + + VxDCall(CAPI20_Get_Version); + __asm { + jc short VarSet + mov [uRet], 1 + VarSet: + } + return uRet; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static const void *GetDDB (unsigned DeviceId) { + + const void *DDB; + + __asm { + mov eax, [DeviceId] + xor edi, edi + } + VMMCall(Get_DDB); + __asm { + mov [DDB], ecx + } + + return DDB; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + + unsigned Installed; + + Installed = CAPIVxDGetVersion (); + + if (!Installed && IsWin40 ()) { + /*----- try GetDDB for dynamic loadable VxDs -----*/ + Installed = (GetDDB (CAPI20_DEVICE_ID) != 0); + } + return Installed; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + + unsigned ApplID; + + __asm { + sub ebx, ebx ; just use EBX compiler will save EBX + mov eax, (014h SHL 8) OR 01h + mov ecx, [MsgBufSize] + mov edx, [MaxB3Connection] + mov esi, [MaxB3Blks] + mov edi, [MaxSizeB3] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [ApplID], eax + mov eax, [ErrorCode] + mov [eax], bx + } + return (_cword)ApplID; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) { + + MESSAGE_EXCHANGE_ERROR Error; + + __asm { + mov eax, (014h SHL 8) OR 02h + mov edx, [Appl_Id] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [Error], eax + } + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) { + + MESSAGE_EXCHANGE_ERROR Error; + + __asm { + mov eax, (014h SHL 8) OR 03h + mov ebx, [Msg] + mov edx, [Appl_Id] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [Error], eax + } + +#if defined (CPROT) + if (Error == CapiNoError) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Error); +#endif + + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage) { + + MESSAGE_EXCHANGE_ERROR Error; + + __asm { + sub ebx, ebx ; just use EBX compiler will save EBX + mov eax, (014h SHL 8) OR 04h + mov edx, [Appl_Id] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [Error], eax + mov eax, [ReturnMessage] + mov [eax], ebx + } + +#if defined (CPROT) + if (Error == CapiNoError) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Error != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Error); +#endif + + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL(unsigned ApplId, void (*Callback) (void), unsigned Param) { + + MESSAGE_EXCHANGE_ERROR Error; + + __asm { + mov eax, (014h SHL 8) OR 05h + mov ebx, [Callback] + mov edx, [ApplId] + mov edi, [Param] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [Error], eax + } + +#if defined (CPROT) + if (Error != CapiNoError) + CAPI_PROTOCOL_TEXT("CAPI_SET_SIGNAL error \n", Error); +#endif + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (unsigned Controller, CAPI_MESSAGE LpBuffer) { + + __asm { + mov eax, (014h SHL 8) OR 0F0h + mov ecx, [Controller] + mov ebx, [LpBuffer] + } + VxDCall(CAPI20_MessageOperations); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (unsigned Controller, CAPI_MESSAGE version) { + + __asm { + mov eax, (014h SHL 8) OR 0F1h + mov ecx, [Controller] + } + VxDCall(CAPI20_MessageOperations); + __asm { + mov eax, [version] + mov [eax+0], ah + mov [eax+1], al + mov [eax+2], dh + mov [eax+3], dl + } + + return version; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (unsigned Controller, CAPI_MESSAGE LpBuffer) { + + __asm { + mov eax, (014h SHL 8) OR 0F2h + mov ecx, [Controller] + mov ebx, [LpBuffer] + } + VxDCall(CAPI20_MessageOperations) + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + MESSAGE_EXCHANGE_ERROR Error; + + __asm { + mov eax, (014h SHL 8) OR 0F3h + mov ecx, [Controller] + mov ebx, [LpBuffer] + } + VxDCall(CAPI20_MessageOperations); + __asm { + movzx eax, ax + mov [Error], eax + } + +#if defined (CPROT) + if (Error != CapiNoError) + CAPI_PROTOCOL_TEXT("CAPI_GET_PROFILE error \n", Error); +#endif + + return Error; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ diff --git a/C20LIB/SOURCE/CVXD.H b/C20LIB/SOURCE/CVXD.H new file mode 100644 index 0000000..70ba485 --- /dev/null +++ b/C20LIB/SOURCE/CVXD.H @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------*\ + + CVxD.H Version 1.2 1997 AVM + + Operation system specific CAPI 2.0 functions for the Win95 VxD interface + +\*--------------------------------------------------------------------------*/ +#ifndef _cvxd_h_ +#define _cvxd_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include /*----- Win95 DDK see %DDKROOT%\INC32 -----*/ +#include /*----- Win95 DDK see %DDKROOT%\INC32 -----*/ +#include "capi20.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#define CAPI20_DEVICE_ID 0x3215 +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +Begin_Service_Table (CAPI20, VxD) +Declare_Service (CAPI20_Get_Version, LOCAL) +Declare_Service (CAPI20_MessageOperations, LOCAL) +End_Service_Table (CAPI20, VxD) +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE *ReturnMessage); +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL (unsigned ApplId, void (*CallBack)(void), unsigned Param); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (unsigned Controller, CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_VERSION (unsigned Controller, CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (unsigned Controller, CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif /*----- _cvxd_h_ -----*/ diff --git a/C20LIB/SOURCE/CWIN16.C b/C20LIB/SOURCE/CWIN16.C new file mode 100644 index 0000000..a9e9feb --- /dev/null +++ b/C20LIB/SOURCE/CWIN16.C @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + + CWIN.C Version 1.1 1995 AVM + + This file contains the source of the operating system specific + CAPI functions, here for Windows 16 bit. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include +#include + +#include "capi20.h" + +/*---------------------------------------------------------------------------*\ + defined in capi20 Runtime DLL +\*---------------------------------------------------------------------------*/ +extern WORD FAR PASCAL CAPI_INSTALLED (void); +extern WORD FAR PASCAL CAPI_REGISTER (WORD MessageBufferSize, WORD maxLogicalConnection, WORD maxBDataBlocks, WORD maxBDataLen, LPWORD pApplID); +extern WORD FAR PASCAL CAPI_RELEASE (WORD ApplID); +extern WORD FAR PASCAL CAPI_PUT_MESSAGE (WORD ApplID, LPVOID pCAPIMessage); +extern WORD FAR PASCAL CAPI_GET_MESSAGE (WORD ApplID, LPVOID FAR *ppCAPIMessage); +extern WORD FAR PASCAL CAPI_SET_SIGNAL (WORD ApplID, VOID (FAR PASCAL *CAPI_Callback)(WORD ApplID, DWORD Param), DWORD Param); +extern WORD FAR PASCAL CAPI_GET_MANUFACTURER (LPBYTE SzBuffer); +extern WORD FAR PASCAL CAPI_GET_VERSION (LPWORD pCAPIMajor, LPWORD pCAPIMinor, LPWORD pManufacturerMajor, LPWORD pManufacturerMinor); +extern WORD FAR PASCAL CAPI_GET_SERIAL_NUMBER (LPBYTE SzBuffer); +extern WORD FAR PASCAL CAPI_GET_PROFILE (LPBYTE SzBuffer, WORD CtrlNr); +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + return (unsigned)CAPI_INSTALLED () == 0; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + WORD ApplID; + + *ErrorCode = (CAPI_REGISTER_ERROR) CAPI_REGISTER((WORD)MsgBufSize, (WORD)MaxB3Connection, (WORD)MaxB3Blks, (WORD)MaxSizeB3, &ApplID); + return (_cword)ApplID; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) { + + return (MESSAGE_EXCHANGE_ERROR) CAPI_RELEASE ((WORD)Appl_Id); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) { + WORD Error; + + Error = CAPI_PUT_MESSAGE((WORD)Appl_Id, (void __far *)Msg); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE __far *ReturnMessage) { + WORD Error; + + Error = CAPI_GET_MESSAGE((WORD)Appl_Id, (LPVOID FAR *)ReturnMessage); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Error != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL(unsigned ApplId, void (FAR PASCAL *CallBack)(WORD,DWORD), DWORD Param) { + WORD Error; + + Error = CAPI_SET_SIGNAL((WORD)ApplId, CallBack, Param); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_SET_SIGNAL error \n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) { + CAPI_GET_MANUFACTURER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) { + WORD CMajor; + WORD CMinor; + WORD MMajor; + WORD MMinor; + + CAPI_GET_VERSION((WORD __far *)&CMajor, (WORD __far *)&CMinor, + (WORD __far *)&MMajor, (WORD __far *)&MMinor); + + version[0] = (BYTE)CMajor; + version[1] = (BYTE)CMinor; + version[2] = (BYTE)MMajor; + version[3] = (BYTE)MMinor; + + return version; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) { + + CAPI_GET_SERIAL_NUMBER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + WORD Error; + + Error = CAPI_GET_PROFILE(LpBuffer, (WORD)Controller); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_GET_PROFILE error \n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} diff --git a/C20LIB/SOURCE/CWIN16.H b/C20LIB/SOURCE/CWIN16.H new file mode 100644 index 0000000..d68b829 --- /dev/null +++ b/C20LIB/SOURCE/CWIN16.H @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------*\ + + CWIN.H Version 1.2 1997 AVM + + Operation system specific CAPI 2.0 functions for Windows 16 Bit + +\*--------------------------------------------------------------------------*/ +#ifndef _cwin16_h_ +#define _cwin16_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include + +#include "capi20.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE __far * ReturnMessage); +MESSAGE_EXCHANGE_ERROR CAPI20_SET_SIGNAL(unsigned ApplId, void (__far __pascal *CallBack)(WORD,DWORD), DWORD Param); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif /*----- _cwin16_h_ -----*/ diff --git a/C20LIB/SOURCE/CWIN32.C b/C20LIB/SOURCE/CWIN32.C new file mode 100644 index 0000000..c65be09 --- /dev/null +++ b/C20LIB/SOURCE/CWIN32.C @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ + + CWIN.C Version 1.1 1995 AVM + + This file contains the source of the operating system specific + CAPI functions, here for Windows 32 bit. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include +#include + +#include "capi20.h" +/*---------------------------------------------------------------------------*\ + defined in capi2032 runtime DLL +\*---------------------------------------------------------------------------*/ +extern DWORD APIENTRY CAPI_REGISTER (DWORD MessageBufferSize, DWORD maxLogicalConnection, DWORD maxBDataBlocks, DWORD maxBDataLen, DWORD *pApplID); +extern DWORD APIENTRY CAPI_RELEASE (DWORD ApplID); +extern DWORD APIENTRY CAPI_PUT_MESSAGE (DWORD ApplID, PVOID pCAPIMessage); +extern DWORD APIENTRY CAPI_GET_MESSAGE (DWORD ApplID, PVOID *ppCAPIMessage); +extern DWORD APIENTRY CAPI_WAIT_FOR_SIGNAL (DWORD ApplID); +extern DWORD APIENTRY CAPI_GET_MANUFACTURER (PVOID SzBuffer); +extern DWORD APIENTRY CAPI_GET_VERSION (DWORD *pCAPIMajor, DWORD *pCAPIMinor, DWORD *pManufacturerMajor, DWORD *pManufacturerMinor); +extern DWORD APIENTRY CAPI_GET_SERIAL_NUMBER (PVOID SzBuffer); +extern DWORD APIENTRY CAPI_GET_PROFILE (PVOID SzBuffer, DWORD CtrlNr); +extern DWORD APIENTRY CAPI_INSTALLED (void); +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + return (unsigned)CAPI_INSTALLED () == 0; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + DWORD ApplID; + + *ErrorCode = (CAPI_REGISTER_ERROR) CAPI_REGISTER(MsgBufSize, MaxB3Connection, MaxB3Blks, MaxSizeB3, &ApplID); + + return (_cword)ApplID; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id) { + + return (MESSAGE_EXCHANGE_ERROR) CAPI_RELEASE (Appl_Id); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id) { + DWORD Error; + + Error = CAPI_PUT_MESSAGE(Appl_Id, (void *)Msg); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE __far *ReturnMessage) { + DWORD Error; + + Error = CAPI_GET_MESSAGE(Appl_Id, (LPVOID *)ReturnMessage); + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Error != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_WAIT_FOR_SIGNAL (unsigned ApplId) { + DWORD Error; + + Error = CAPI_WAIT_FOR_SIGNAL (ApplId); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_SET_SIGNAL error \n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) { + CAPI_GET_MANUFACTURER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) { + DWORD CMajor; + DWORD CMinor; + DWORD MMajor; + DWORD MMinor; + + CAPI_GET_VERSION(&CMajor, &CMinor, &MMajor, &MMinor); + + version[0] = (BYTE)CMajor; + version[1] = (BYTE)CMinor; + version[2] = (BYTE)MMajor; + version[3] = (BYTE)MMinor; + + return version; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) { + + CAPI_GET_SERIAL_NUMBER(LpBuffer); + + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + DWORD Error; + + Error = CAPI_GET_PROFILE (LpBuffer, Controller); + +#if defined (CPROT) + if (Error != 0x0000) + CAPI_PROTOCOL_TEXT("CAPI_GET_PROFILE error \n", Error); +#endif + + return (MESSAGE_EXCHANGE_ERROR) Error; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ diff --git a/C20LIB/SOURCE/CWIN32.H b/C20LIB/SOURCE/CWIN32.H new file mode 100644 index 0000000..70311da --- /dev/null +++ b/C20LIB/SOURCE/CWIN32.H @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------*\ + + CWIN.H Version 1.2 1997 AVM + + Operation system specific CAPI 2.0 functions for Windows 32 Bit + +\*--------------------------------------------------------------------------*/ +#ifndef _cwin32_h_ +#define _cwin32_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include + +#include "capi20.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE __far * ReturnMessage); +MESSAGE_EXCHANGE_ERROR CAPI20_WAIT_FOR_SIGNAL (unsigned ApplId); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif /*----- _cwin32_h_ -----*/ diff --git a/C20LIB/SOURCE/C_NW.C b/C20LIB/SOURCE/C_NW.C new file mode 100644 index 0000000..9a2088f --- /dev/null +++ b/C20LIB/SOURCE/C_NW.C @@ -0,0 +1,171 @@ +/*---------------------------------------------------------------------------*\ + + C_NW.C Version 1.0 1998 AVM + + CAPI 2.0 Development Kit NetWare + + This file contains the source of the operating system specific + CAPI functions, here for Novell NetWare. See CAPI 2.0 spec. + +\*---------------------------------------------------------------------------*/ +#include +#include +#include + +#include "c_nw.h" +#include "c2imp_nw.h" +#include "c2mgr_nw.h" +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +static LONG GetMessageSemaphore = -1; +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void) { + return 1; // loader refuses to load if it can not find the symbols +} + +/*-----------------------------##########################*/ +static void APPL_ReceiveNotify (unsigned long signalContext) { + SignalLocalSemaphore (GetMessageSemaphore); // enables CAPI_GetMessage +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode) { + WORD ApplId; + + assert (GetMessageSemaphore == -1); + GetMessageSemaphore = OpenLocalSemaphore (0); + + *ErrorCode = (CAPI_REGISTER_ERROR)CAPI_Register( + (WORD)MsgBufSize, + (WORD)MaxB3Connection, + (WORD)MaxB3Blks, + (WORD)MaxSizeB3, + &ApplId, + SIGNAL_TYPE_CALLBACK, + (DWORD) APPL_ReceiveNotify, + 0 + ); + + if (*ErrorCode != CapiNoError) { + CloseLocalSemaphore (GetMessageSemaphore); + GetMessageSemaphore = -1; + ApplId = 0; + } + + return (_cword)ApplId; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned ApplId) { + MESSAGE_EXCHANGE_ERROR Error; + + assert (GetMessageSemaphore != -1); + + Error = (MESSAGE_EXCHANGE_ERROR)CAPI_Release ((WORD)ApplId); + + if (Error == CapiNoError) { + CloseLocalSemaphore (GetMessageSemaphore); + GetMessageSemaphore = -1; + } + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned ApplId) { + MESSAGE_EXCHANGE_ERROR Error; + + Error = (MESSAGE_EXCHANGE_ERROR)CAPI_PutMessage ((WORD)ApplId, (BYTE*)Msg); + +#if defined (CPROT) + if (Error == CapiNoError) + CAPI_PROTOCOL_MESSAGE (Msg); + else + CAPI_PROTOCOL_TEXT ("CAPI_PUT_MESSAGE error 0x%04x\n", Error); +#endif + + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned ApplId, CAPI_MESSAGE *ReturnMessage) { + MESSAGE_EXCHANGE_ERROR Error; + + assert (GetMessageSemaphore != -1); + + if (ExamineLocalSemaphore (GetMessageSemaphore) <= 0) { + Error = CapiReceiveQueueEmpty; + } else { + WaitOnLocalSemaphore (GetMessageSemaphore); + + Error = (MESSAGE_EXCHANGE_ERROR)CAPI_GetMessage((WORD)ApplId, (BYTE**)ReturnMessage); + } + +#if defined (CPROT) + if (Error == 0x0000) + CAPI_PROTOCOL_MESSAGE (*ReturnMessage); + else if (Error != CapiReceiveQueueEmpty) + CAPI_PROTOCOL_TEXT ("CAPI_GET_MESSAGE error 0x%04x\n", Error); +#endif + + return Error; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer) { + + CAPI_GetManufacturer (0, LpBuffer); + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version) { + WORD CMajor; + WORD CMinor; + WORD MMajor; + WORD MMinor; + WORD MgrMajor; + WORD MgrMinor; + + CAPI_GetVersion(0, (WORD *)&CMajor, (WORD *)&CMinor, + (WORD *)&MMajor, (WORD *)&MMinor, + (WORD *)&MgrMajor, (WORD *)&MgrMinor); + + version[0] = (BYTE)CMajor; + version[1] = (BYTE)CMinor; + version[2] = (BYTE)MMajor; + version[3] = (BYTE)MMinor; + return version; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer) { + + CAPI_GetSerialNumber (0, LpBuffer); + return LpBuffer; +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer) { + MESSAGE_EXCHANGE_ERROR Error; + + Error = (MESSAGE_EXCHANGE_ERROR)CAPI_GetProfile (LpBuffer, (DWORD)Controller); + +#if defined (CPROT) + if (Error != CapiNoError) + CAPI_PROTOCOL_TEXT("CAPI_GET_PROFILE error \n", Error); +#endif + + return Error; +} + +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ diff --git a/C20LIB/SOURCE/C_NW.H b/C20LIB/SOURCE/C_NW.H new file mode 100644 index 0000000..1203ed0 --- /dev/null +++ b/C20LIB/SOURCE/C_NW.H @@ -0,0 +1,36 @@ +/*---------------------------------------------------------------------------*\ + + C_NW.H Version 1.0 1998 AVM + + CAPI 2.0 Development Kit internal functions for NetWare + +\*---------------------------------------------------------------------------*/ +#ifndef _c_nw_h +#define _c_nw_h +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#include "capi20.h" // NetWare independant +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +extern "C" { +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +unsigned CAPI20_ISINSTALLED (void); +_cword CAPI20_REGISTER (unsigned MsgBufSize, unsigned MaxB3Connection, unsigned MaxB3Blks, unsigned MaxSizeB3, CAPI_REGISTER_ERROR *ErrorCode); +MESSAGE_EXCHANGE_ERROR CAPI20_RELEASE (unsigned Appl_Id); +MESSAGE_EXCHANGE_ERROR CAPI20_PUT_MESSAGE (CAPI_MESSAGE Msg, unsigned Appl_Id); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_MESSAGE (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage); +CAPI_MESSAGE CAPI20_GET_VERSION (CAPI_MESSAGE version); +CAPI_MESSAGE CAPI20_GET_MANUFACTURER (CAPI_MESSAGE LpBuffer); +CAPI_MESSAGE CAPI20_GET_SERIAL_NUMBER (CAPI_MESSAGE LpBuffer); +MESSAGE_EXCHANGE_ERROR CAPI20_GET_PROFILE (unsigned Controller, CAPI_MESSAGE LpBuffer); +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#ifdef __cplusplus +} +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif diff --git a/C20LIB/SOURCE/FUNC.C b/C20LIB/SOURCE/FUNC.C new file mode 100644 index 0000000..216e94c --- /dev/null +++ b/C20LIB/SOURCE/FUNC.C @@ -0,0 +1,357 @@ +/*--------------------------------------------------------------------------*\ + + FUNC.C Version 1.2 1997 AVM + + This file contains the source of the CAPI functions that correspond + to the CAPI messages described in the CAPI 2.0 spec. + +\*--------------------------------------------------------------------------*/ +#include "capi20.h" + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned ALERT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct BChannelinformation, + _cstruct Keypadfacility, + _cstruct Useruserdata, + _cstruct Facilitydataarray) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x01,0x80,Messagenumber,adr); + cmsg->BChannelinformation = BChannelinformation; + cmsg->Keypadfacility = Keypadfacility; + cmsg->Useruserdata = Useruserdata; + cmsg->Facilitydataarray = Facilitydataarray; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword CIPValue, + _cstruct CalledPartyNumber, + _cstruct CallingPartyNumber, + _cstruct CalledPartySubaddress, + _cstruct CallingPartySubaddress, + _cword B1protocol, + _cword B2protocol, + _cword B3protocol, + _cstruct B1configuration, + _cstruct B2configuration, + _cstruct B3configuration, + _cstruct BC, + _cstruct LLC, + _cstruct HLC, + _cstruct BChannelinformation, + _cstruct Keypadfacility, + _cstruct Useruserdata, + _cstruct Facilitydataarray) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x02,0x80,Messagenumber,adr); + cmsg->CIPValue = CIPValue; + cmsg->CalledPartyNumber = CalledPartyNumber; + cmsg->CallingPartyNumber = CallingPartyNumber; + cmsg->CalledPartySubaddress = CalledPartySubaddress; + cmsg->CallingPartySubaddress = CallingPartySubaddress; + cmsg->B1protocol = B1protocol; + cmsg->B2protocol = B2protocol; + cmsg->B3protocol = B3protocol; + cmsg->B1configuration = B1configuration; + cmsg->B2configuration = B2configuration; + cmsg->B3configuration = B3configuration; + cmsg->BC = BC; + cmsg->LLC = LLC; + cmsg->HLC = HLC; + cmsg->BChannelinformation = BChannelinformation; + cmsg->Keypadfacility = Keypadfacility; + cmsg->Useruserdata = Useruserdata; + cmsg->Facilitydataarray = Facilitydataarray; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct NCPI) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x82,0x80,Messagenumber,adr); + cmsg->NCPI = NCPI; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DATA_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cdword Data, + _cword DataLength, + _cword DataHandle, + _cword Flags) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x86,0x80,Messagenumber,adr); + cmsg->Data = Data; + cmsg->DataLength = DataLength; + cmsg->DataHandle = DataHandle; + cmsg->Flags = Flags; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DISCONNECT_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct NCPI) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x84,0x80,Messagenumber,adr); + cmsg->NCPI = NCPI; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DISCONNECT_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct BChannelinformation, + _cstruct Keypadfacility, + _cstruct Useruserdata, + _cstruct Facilitydataarray) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x04,0x80,Messagenumber,adr); + cmsg->BChannelinformation = BChannelinformation; + cmsg->Keypadfacility = Keypadfacility; + cmsg->Useruserdata = Useruserdata; + cmsg->Facilitydataarray = Facilitydataarray; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned FACILITY_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword FacilitySelector, + _cstruct FacilityRequestParameter) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x80,0x80,Messagenumber,adr); + cmsg->FacilitySelector = FacilitySelector; + cmsg->FacilityRequestParameter = FacilityRequestParameter; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned INFO_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct CalledPartyNumber, + _cstruct BChannelinformation, + _cstruct Keypadfacility, + _cstruct Useruserdata, + _cstruct Facilitydataarray) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x08,0x80,Messagenumber,adr); + cmsg->CalledPartyNumber = CalledPartyNumber; + cmsg->BChannelinformation = BChannelinformation; + cmsg->Keypadfacility = Keypadfacility; + cmsg->Useruserdata = Useruserdata; + cmsg->Facilitydataarray = Facilitydataarray; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned LISTEN_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cdword InfoMask, + _cdword CIPmask, + _cdword CIPmask2, + _cstruct CallingPartyNumber, + _cstruct CallingPartySubaddress) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x05,0x80,Messagenumber,adr); + cmsg->InfoMask = InfoMask; + cmsg->CIPmask = CIPmask; + cmsg->CIPmask2 = CIPmask2; + cmsg->CallingPartyNumber = CallingPartyNumber; + cmsg->CallingPartySubaddress = CallingPartySubaddress; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned MANUFACTURER_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cdword ManuID, + _cdword Class, + _cdword Function, + _cstruct ManuData) { + CAPI_CMSG_HEADER (cmsg,ApplId,0xff,0x80,Messagenumber,adr); + cmsg->ManuID = ManuID; + cmsg->Class = Class; + cmsg->Function = Function; + cmsg->ManuData = ManuData; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned RESET_B3_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cstruct NCPI) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x87,0x80,Messagenumber,adr); + cmsg->NCPI = NCPI; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned SELECT_B_PROTOCOL_REQ (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword B1protocol, + _cword B2protocol, + _cword B3protocol, + _cstruct B1configuration, + _cstruct B2configuration, + _cstruct B3configuration) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x41,0x80,Messagenumber,adr); + cmsg->B1protocol = B1protocol; + cmsg->B2protocol = B2protocol; + cmsg->B3protocol = B3protocol; + cmsg->B1configuration = B1configuration; + cmsg->B2configuration = B2configuration; + cmsg->B3configuration = B3configuration; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword Reject, + _cword B1protocol, + _cword B2protocol, + _cword B3protocol, + _cstruct B1configuration, + _cstruct B2configuration, + _cstruct B3configuration, + _cstruct ConnectedNumber, + _cstruct ConnectedSubaddress, + _cstruct LLC, + _cstruct BChannelinformation, + _cstruct Keypadfacility, + _cstruct Useruserdata, + _cstruct Facilitydataarray) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x02,0x83,Messagenumber,adr); + cmsg->Reject = Reject; + cmsg->B1protocol = B1protocol; + cmsg->B2protocol = B2protocol; + cmsg->B3protocol = B3protocol; + cmsg->B1configuration = B1configuration; + cmsg->B2configuration = B2configuration; + cmsg->B3configuration = B3configuration; + cmsg->ConnectedNumber = ConnectedNumber; + cmsg->ConnectedSubaddress = ConnectedSubaddress; + cmsg->LLC = LLC; + cmsg->BChannelinformation = BChannelinformation; + cmsg->Keypadfacility = Keypadfacility; + cmsg->Useruserdata = Useruserdata; + cmsg->Facilitydataarray = Facilitydataarray; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x03,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_B3_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x83,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword Reject, + _cstruct NCPI) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x82,0x83,Messagenumber,adr); + cmsg->Reject = Reject; + cmsg->NCPI = NCPI; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned CONNECT_B3_T90_ACTIVE_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x88,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DATA_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword DataHandle) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x86,0x83,Messagenumber,adr); + cmsg->DataHandle = DataHandle; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DISCONNECT_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x84,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned DISCONNECT_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x04,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned FACILITY_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cword FacilitySelector, + _cstruct FacilityResponseParameters) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x80,0x83,Messagenumber,adr); + cmsg->FacilitySelector = FacilitySelector; + cmsg->FacilityResponseParameters = FacilityResponseParameters; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned INFO_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x08,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned MANUFACTURER_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr, + _cdword ManuID, + _cdword Class, + _cdword Function, + _cstruct ManuData) { + CAPI_CMSG_HEADER (cmsg,ApplId,0xff,0x83,Messagenumber,adr); + cmsg->ManuID = ManuID; + cmsg->Class = Class; + cmsg->Function = Function; + cmsg->ManuData = ManuData; + return CAPI_PUT_CMSG (cmsg); +} + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +unsigned RESET_B3_RESP (_cmsg __far *cmsg, _cword ApplId, _cword Messagenumber, + _cdword adr) { + CAPI_CMSG_HEADER (cmsg,ApplId,0x87,0x83,Messagenumber,adr); + return CAPI_PUT_CMSG (cmsg); +} diff --git a/C20LIB/SOURCE/GCMSGDOS.C b/C20LIB/SOURCE/GCMSGDOS.C new file mode 100644 index 0000000..4c87362 --- /dev/null +++ b/C20LIB/SOURCE/GCMSGDOS.C @@ -0,0 +1,29 @@ +/*---------------------------------------------------------------------------*\ + + GCMSGDOS.C Version 1.1 1995 AVM + + Operation system specific functions of the CAPI 2.0 Development Kit + for DOS + +\*---------------------------------------------------------------------------*/ +#include "capi20.h" +#include "cdos.h" + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) { + static unsigned char msg[2048]; + + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) { + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == 0x0000) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/GCMSGLIN.C b/C20LIB/SOURCE/GCMSGLIN.C new file mode 100644 index 0000000..e3dee78 --- /dev/null +++ b/C20LIB/SOURCE/GCMSGLIN.C @@ -0,0 +1,23 @@ +#include "capi20.h" +#include "clinux.h" + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) +{ + static unsigned char msg[2048]; + + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) +{ + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == 0x0000) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/GCMSGOS2.C b/C20LIB/SOURCE/GCMSGOS2.C new file mode 100644 index 0000000..4a18ccc --- /dev/null +++ b/C20LIB/SOURCE/GCMSGOS2.C @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------*\ + + GCMSGOS2.C Version 1.1 1996 AVM + + Operation system specific functions of the CAPI 2.0 Development Kit + for OS/2 + +\*---------------------------------------------------------------------------*/ +#include "capi20.h" +#include "cos2.h" + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) { + static unsigned char msg[2048]; + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) { + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == 0x0000) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/GCMSGVXD.C b/C20LIB/SOURCE/GCMSGVXD.C new file mode 100644 index 0000000..c179192 --- /dev/null +++ b/C20LIB/SOURCE/GCMSGVXD.C @@ -0,0 +1,27 @@ +/*---------------------------------------------------------------------------*\ + + GCMSGWIN.C Version 1.1 1995 AVM + + Operation system specific functions of the CAPI 2.0 Development Kit + for the Win95 VxD interface + +\*---------------------------------------------------------------------------*/ +#include "capi20.h" +#include "cvxd.h" + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) { + static unsigned char msg[2048]; + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) { + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == CapiNoError) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/GCMSGWIN.C b/C20LIB/SOURCE/GCMSGWIN.C new file mode 100644 index 0000000..9b97136 --- /dev/null +++ b/C20LIB/SOURCE/GCMSGWIN.C @@ -0,0 +1,33 @@ +/*---------------------------------------------------------------------------*\ + + GCMSGWIN.C Version 1.1 1995 AVM + + Operation system specific functions of the CAPI 2.0 Development Kit + for Windows 16/32 bit + +\*---------------------------------------------------------------------------*/ +#include "capi20.h" + +#if defined (TARGET_32BIT) +#include "cwin32.h" +#endif +#if defined (TARGET_16BIT) +#include "cwin16.h" +#endif + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) { + static unsigned char msg[2048]; + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) { + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == 0x0000) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/GCMSG_NW.C b/C20LIB/SOURCE/GCMSG_NW.C new file mode 100644 index 0000000..6ea9930 --- /dev/null +++ b/C20LIB/SOURCE/GCMSG_NW.C @@ -0,0 +1,29 @@ +/*---------------------------------------------------------------------------*\ + + GCMSG_NW.H Version 1.0 1998 AVM + + CAPI 2.0 Development Kit NetWare + + This file contains NetWare specific functions. +\*---------------------------------------------------------------------------*/ +#include "capi20.h" +#include "c_nw.h" + +/*-------------------------------------------------------*/ +unsigned __far CAPI_PUT_CMSG (_cmsg __far *cmsg) { + static unsigned char msg[2048]; + + CAPI_CMSG_2_MESSAGE (cmsg, (CAPI_MESSAGE)msg); + return CAPI20_PUT_MESSAGE ((CAPI_MESSAGE)msg, cmsg->ApplId); +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_GET_CMSG (_cmsg __far *cmsg, unsigned applid) { + MESSAGE_EXCHANGE_ERROR rtn; + CAPI_MESSAGE msg; + + rtn = CAPI20_GET_MESSAGE (applid, &msg); + if (rtn == 0x0000) + CAPI_MESSAGE_2_CMSG (cmsg, msg); + return rtn; +} diff --git a/C20LIB/SOURCE/MSG.C b/C20LIB/SOURCE/MSG.C new file mode 100644 index 0000000..e0187ec --- /dev/null +++ b/C20LIB/SOURCE/MSG.C @@ -0,0 +1,717 @@ +/*---------------------------------------------------------------------------*\ + + MSG.C Version 1.2 1997 AVM + + CAPI 2.0 Development Kit internal functions + +\*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include + +#include "capi20.h" + +typedef struct { + int typ; + unsigned off; +} _cdef; + +#define _CBYTE 1 +#define _CWORD 2 +#define _CDWORD 3 +#define _CSTRUCT 4 +#define _CMSTRUCT 5 +#define _CEND 6 + +static _cdef cdef[] = { + /*00*/{_CEND}, + /*01*/{_CEND}, + /*02*/{_CEND}, + /*03*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->adr.adrController}, + /*04*/{_CMSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->AdditionalInfo}, + /*05*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->B1configuration}, + /*06*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->B1protocol}, + /*07*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->B2configuration}, + /*08*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->B2protocol}, + /*09*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->B3configuration}, + /*0a*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->B3protocol}, + /*0b*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->BC}, + /*0c*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->BChannelinformation}, + /*0d*/{_CMSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->BProtocol}, + /*0e*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->CalledPartyNumber}, + /*0f*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->CalledPartySubaddress}, + /*10*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->CallingPartyNumber}, + /*11*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->CallingPartySubaddress}, + /*12*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->CIPmask}, + /*13*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->CIPmask2}, + /*14*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->CIPValue}, + /*15*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Class}, + /*16*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->ConnectedNumber}, + /*17*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->ConnectedSubaddress}, + /*18*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Data}, + /*19*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->DataHandle}, + /*1a*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->DataLength}, + /*1b*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->FacilityConfirmationParameter}, + /*1c*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->Facilitydataarray}, + /*1d*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->FacilityIndicationParameter}, + /*1e*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->FacilityRequestParameter}, + /*1f*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->FacilityResponseParameters}, + /*20*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->FacilitySelector}, + /*21*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Flags}, + /*22*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Function}, + /*23*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->HLC}, + /*24*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Info}, + /*25*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->InfoElement}, + /*26*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->InfoMask}, + /*27*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->InfoNumber}, + /*28*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->Keypadfacility}, + /*29*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->LLC}, + /*2a*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->ManuData}, + /*2b*/{_CDWORD, (unsigned)(unsigned long)&((_cmsg *)0)->ManuID}, + /*2c*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->NCPI}, + /*2d*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Reason}, + /*2e*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Reason_B3}, + /*2f*/{_CWORD, (unsigned)(unsigned long)&((_cmsg *)0)->Reject}, + /*30*/{_CSTRUCT, (unsigned)(unsigned long)&((_cmsg *)0)->Useruserdata}, +}; + +static unsigned char *cpars[] = { + /*00*/ 0, + /*01 ALERT_REQ*/ (unsigned char*)"\x03\x04\x0c\x28\x30\x1c\x01\x01", + /*02 CONNECT_REQ*/ (unsigned char*)"\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x29\x23\x04\x0c\x28\x30\x1c\x01\x01", + /*03*/ 0, + /*04 DISCONNECT_REQ*/ (unsigned char*)"\x03\x04\x0c\x28\x30\x1c\x01\x01", + /*05 LISTEN_REQ*/ (unsigned char*)"\x03\x26\x12\x13\x10\x11\x01", + /*06*/ 0, + /*07*/ 0, + /*08 INFO_REQ*/ (unsigned char*)"\x03\x0e\x04\x0c\x28\x30\x1c\x01\x01", + /*09 FACILITY_REQ*/ (unsigned char*)"\x03\x20\x1e\x01", + /*0a SELECT_B_PROTOCOL_REQ*/ (unsigned char*)"\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01", + /*0b CONNECT_B3_REQ*/ (unsigned char*)"\x03\x2c\x01", + /*0c*/ 0, + /*0d DISCONNECT_B3_REQ*/ (unsigned char*)"\x03\x2c\x01", + /*0e*/ 0, + /*0f DATA_B3_REQ*/ (unsigned char*)"\x03\x18\x1a\x19\x21\x01", + /*10 RESET_B3_REQ*/ (unsigned char*)"\x03\x2c\x01", + /*11*/ 0, + /*12*/ 0, + /*13 ALERT_CONF*/ (unsigned char*)"\x03\x24\x01", + /*14 CONNECT_CONF*/ (unsigned char*)"\x03\x24\x01", + /*15*/ 0, + /*16 DISCONNECT_CONF*/ (unsigned char*)"\x03\x24\x01", + /*17 LISTEN_CONF*/ (unsigned char*)"\x03\x24\x01", + /*18 MANUFACTURER_REQ*/ (unsigned char*)"\x03\x2b\x15\x22\x2a\x01", + /*19*/ 0, + /*1a INFO_CONF*/ (unsigned char*)"\x03\x24\x01", + /*1b FACILITY_CONF*/ (unsigned char*)"\x03\x24\x20\x1b\x01", + /*1c SELECT_B_PROTOCOL_CONF*/ (unsigned char*)"\x03\x24\x01", + /*1d CONNECT_B3_CONF*/ (unsigned char*)"\x03\x24\x01", + /*1e*/ 0, + /*1f DISCONNECT_B3_CONF*/ (unsigned char*)"\x03\x24\x01", + /*20*/ 0, + /*21 DATA_B3_CONF*/ (unsigned char*)"\x03\x19\x24\x01", + /*22 RESET_B3_CONF*/ (unsigned char*)"\x03\x24\x01", + /*23*/ 0, + /*24*/ 0, + /*25*/ 0, + /*26 CONNECT_IND*/ (unsigned char*)"\x03\x14\x0e\x10\x0f\x11\x0b\x29\x23\x04\x0c\x28\x30\x1c\x01\x01", + /*27 CONNECT_ACTIVE_IND*/ (unsigned char*)"\x03\x16\x17\x29\x01", + /*28 DISCONNECT_IND*/ (unsigned char*)"\x03\x2d\x01", + /*29*/ 0, + /*2a MANUFACTURER_CONF*/ (unsigned char*)"\x03\x2b\x15\x22\x2a\x01", + /*2b*/ 0, + /*2c INFO_IND*/ (unsigned char*)"\x03\x27\x25\x01", + /*2d FACILITY_IND*/ (unsigned char*)"\x03\x20\x1d\x01", + /*2e*/ 0, + /*2f CONNECT_B3_IND*/ (unsigned char*)"\x03\x2c\x01", + /*30 CONNECT_B3_ACTIVE_IND*/ (unsigned char*)"\x03\x2c\x01", + /*31 DISCONNECT_B3_IND*/ (unsigned char*)"\x03\x2e\x2c\x01", + /*32*/ 0, + /*33 DATA_B3_IND*/ (unsigned char*)"\x03\x18\x1a\x19\x21\x01", + /*34 RESET_B3_IND*/ (unsigned char*)"\x03\x2c\x01", + /*35 CONNECT_B3_T90_ACTIVE_IND*/ (unsigned char*)"\x03\x2c\x01", + /*36*/ 0, + /*37*/ 0, + /*38 CONNECT_RESP*/ (unsigned char*)"\x03\x2f\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x29\x04\x0c\x28\x30\x1c\x01\x01", + /*39 CONNECT_ACTIVE_RESP*/ (unsigned char*)"\x03\x01", + /*3a DISCONNECT_RESP*/ (unsigned char*)"\x03\x01", + /*3b*/ 0, + /*3c MANUFACTURER_IND*/ (unsigned char*)"\x03\x2b\x15\x22\x2a\x01", + /*3d*/ 0, + /*3e INFO_RESP*/ (unsigned char*)"\x03\x01", + /*3f FACILITY_RESP*/ (unsigned char*)"\x03\x20\x1f\x01", + /*40*/ 0, + /*41 CONNECT_B3_RESP*/ (unsigned char*)"\x03\x2f\x2c\x01", + /*42 CONNECT_B3_ACTIVE_RESP*/ (unsigned char*)"\x03\x01", + /*43 DISCONNECT_B3_RESP*/ (unsigned char*)"\x03\x01", + /*44*/ 0, + /*45 DATA_B3_RESP*/ (unsigned char*)"\x03\x19\x01", + /*46 RESET_B3_RESP*/ (unsigned char*)"\x03\x01", + /*47 CONNECT_B3_T90_ACTIVE_RESP*/ (unsigned char*)"\x03\x01", + /*48*/ 0, + /*49*/ 0, + /*4a*/ 0, + /*4b*/ 0, + /*4c*/ 0, + /*4d*/ 0, + /*4e MANUFACTURER_RESP*/ (unsigned char*)"\x03\x2b\x15\x22\x2a\x01", +}; + +/*-------------------------------------------------------*/ +#if defined (TARGET_16BIT) + +#undef memset +#define memset _fmemset + +#define byteTLcpy(x,y) *(_cbyte __far *)(x)=*(_cbyte __far *)(y); +#define wordTLcpy(x,y) *(_cword __far *)(x)=*(_cword __far *)(y); +#define dwordTLcpy(x,y) *(_cdword __far *)(x)=*(_cdword __far *)(y); +#define structTLcpy(x,y,l) _fmemcpy (x,y,l) +#define structTLcpyovl(x,y,l) _fmemmove (x,y,l) + +#define byteTRcpy(x,y) *(_cbyte __far *)(y)=*(_cbyte __far *)(x); +#define wordTRcpy(x,y) *(_cword __far *)(y)=*(_cword __far *)(x); +#define dwordTRcpy(x,y) *(_cdword __far *)(y)=*(_cdword __far *)(x); +#define structTRcpy(x,y,l) _fmemcpy (y,x,l) +#define structTRcpyovl(x,y,l) _fmemmove (y,x,l) + +#endif + + +/*-------------------------------------------------------*/ +#if defined (TARGET_32BIT) + +#define byteTLcpy(x,y) *(_cbyte *)(x)=*(_cbyte *)(y); +#define wordTLcpy(x,y) *(_cword *)(x)=*(_cword *)(y); +#define dwordTLcpy(x,y) memcpy(x,y,4); +#define structTLcpy(x,y,l) memcpy (x,y,l) +#define structTLcpyovl(x,y,l) memmove (x,y,l) + +#define byteTRcpy(x,y) *(_cbyte *)(y)=*(_cbyte *)(x); +#define wordTRcpy(x,y) *(_cword *)(y)=*(_cword *)(x); +#define dwordTRcpy(x,y) memcpy(y,x,4); +#define structTRcpy(x,y,l) memcpy (y,x,l) +#define structTRcpyovl(x,y,l) memmove (y,x,l) + +#endif + +/*-------------------------------------------------------*/ +static unsigned __far command_2_index (unsigned c, unsigned sc) { + if (c & 0x80) c = 0x9+(c&0x0f); + else if (c<=0x0f) ; + else if (c==0x41) c = 0x9+0x1; + else if (c==0xff) c = 0x00; + return (sc&3)*(0x9+0x9)+c; +} + +/*-------------------------------------------------------*/ +#define TYP (cdef[cmsg->par[cmsg->p]].typ) +#define OFF (((char __far *)cmsg)+cdef[cmsg->par[cmsg->p]].off) + +static void jumpcstruct (_cmsg __far *cmsg) { + unsigned layer; + for (cmsg->p++,layer=1; layer;) { + assert (cmsg->p); + cmsg->p++; + switch (TYP) { + case _CMSTRUCT: + layer++; + break; + case _CEND: + layer--; + break; + } + } +} +/*-------------------------------------------------------*/ +static void __far PARS_2_MESSAGE (_cmsg __far *cmsg) { + + for (;TYP != _CEND; cmsg->p++) { + switch (TYP) { + case _CBYTE: + byteTLcpy (cmsg->m+cmsg->l, OFF); + cmsg->l++; + break; + case _CWORD: + wordTLcpy (cmsg->m+cmsg->l, OFF); + cmsg->l+=2; + break; + case _CDWORD: + dwordTLcpy (cmsg->m+cmsg->l, OFF); + cmsg->l+=4; + break; + case _CSTRUCT: + if (*(CAPI_MESSAGE __far *) OFF == 0) { + *(cmsg->m+cmsg->l)='\0'; + cmsg->l++; + } + else if(**(_cstruct __far*)OFF != 0xff) { + structTLcpy (cmsg->m+cmsg->l, *(_cstruct __far*)OFF, 1+**(_cstruct __far*)OFF); + cmsg->l+=1+**(_cstruct __far*)OFF; + } + else { + _cstruct s = *(_cstruct __far*)OFF; + structTLcpy (cmsg->m+cmsg->l, s, 3+*(_cword __far*)(s+1)); + cmsg->l+= 3+*(_cword __far*)(s+1); + } + break; + case _CMSTRUCT: + /*----- Metastruktur 0 -----*/ + if (*(_cmstruct __far*)OFF == CAPI_DEFAULT) { + *(cmsg->m+cmsg->l)='\0'; + cmsg->l++; + jumpcstruct (cmsg); + } + /*----- Metastruktur wird composed -----*/ + else { + unsigned _l = cmsg->l; + unsigned _ls; + cmsg->l++; + cmsg->p++; + PARS_2_MESSAGE (cmsg); + _ls = cmsg->l-_l-1; + if (_ls < 255) + (cmsg->m+_l)[0] = (_cbyte)_ls; + else { + structTLcpyovl (cmsg->m+_l+3, cmsg->m+_l+1, _ls); + (cmsg->m+_l)[0] = 0xff; + wordTLcpy (cmsg->m+_l+1, &_ls); + cmsg->l+=2; + } + } + break; + } + } +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_CMSG_2_MESSAGE (_cmsg __far *cmsg, CAPI_MESSAGE msg) { + cmsg->m = msg; + cmsg->l = 8; + cmsg->p = 0; + cmsg->par = cpars [command_2_index (cmsg->Command,cmsg->Subcommand)]; + + PARS_2_MESSAGE (cmsg); + + wordTLcpy (msg+0, &cmsg->l); + byteTLcpy (cmsg->m+4, &cmsg->Command); + byteTLcpy (cmsg->m+5, &cmsg->Subcommand); + wordTLcpy (cmsg->m+2, &cmsg->ApplId); + wordTLcpy (cmsg->m+6, &cmsg->Messagenumber); + + return 0; +} + +/*-------------------------------------------------------*/ +static void __far MESSAGE_2_PARS (_cmsg __far *cmsg) { + for (;TYP != _CEND; cmsg->p++) { + + switch (TYP) { + case _CBYTE: + byteTRcpy (cmsg->m+cmsg->l, OFF); + cmsg->l++; + break; + case _CWORD: + wordTRcpy (cmsg->m+cmsg->l, OFF); + cmsg->l+=2; + break; + case _CDWORD: + dwordTRcpy (cmsg->m+cmsg->l, OFF); + cmsg->l+=4; + break; + case _CSTRUCT: + *(CAPI_MESSAGE __far *)OFF = cmsg->m+cmsg->l; + + if (cmsg->m[cmsg->l] != 0xff) + cmsg->l+= 1+ cmsg->m[cmsg->l]; + else + cmsg->l+= 3+ *(_cword __far *)(cmsg->m+cmsg->l+1); + break; + case _CMSTRUCT: + /*----- Metastruktur 0 -----*/ + if (cmsg->m[cmsg->l] == '\0') { + *(_cmstruct __far*)OFF = CAPI_DEFAULT; + cmsg->l++; + jumpcstruct (cmsg); + } + else { + unsigned _l = cmsg->l; + *(_cmstruct __far*)OFF = CAPI_COMPOSE; + cmsg->l = (cmsg->m+_l)[0] == 255 ? cmsg->l+3 : cmsg->l+1; + cmsg->p++; + MESSAGE_2_PARS (cmsg); + } + break; + } + } +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_MESSAGE_2_CMSG (_cmsg __far *cmsg, CAPI_MESSAGE msg) { + memset (cmsg, 0, sizeof(_cmsg)); + cmsg->m = msg; + cmsg->l = 8; + cmsg->p = 0; + byteTRcpy (cmsg->m+4, &cmsg->Command); + byteTRcpy (cmsg->m+5, &cmsg->Subcommand); + cmsg->par = cpars [command_2_index (cmsg->Command,cmsg->Subcommand)]; + + MESSAGE_2_PARS (cmsg); + + wordTRcpy (msg+0, &cmsg->l); + wordTRcpy (cmsg->m+2, &cmsg->ApplId); + wordTRcpy (cmsg->m+6, &cmsg->Messagenumber); + + return 0; +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_CMSG_ANSWER (_cmsg __far *cmsg) { + cmsg->Subcommand |= 0x01; + return 0; +} + +/*-------------------------------------------------------*/ +unsigned __far CAPI_CMSG_HEADER (_cmsg __far *cmsg, _cword _ApplId, + _cbyte _Command, _cbyte _Subcommand, + _cword _Messagenumber, _cdword _Controller) { + memset (cmsg, 0, sizeof(_cmsg)); + cmsg->ApplId = _ApplId ; + cmsg->Command = _Command ; + cmsg->Subcommand = _Subcommand ; + cmsg->Messagenumber = _Messagenumber; + cmsg->adr.adrController = _Controller ; + return 0; +} + +/*-------------------------------------------------------*/ +/*-------------------------------------------------------*/ +#if defined (CPROT) +static char *pnames[] = { + /*00*/0, + /*01*/0, + /*02*/0, + /*03*/"Controller/PLCI/NCCI", + /*04*/"AdditionalInfo", + /*05*/"B1configuration", + /*06*/"B1protocol", + /*07*/"B2configuration", + /*08*/"B2protocol", + /*09*/"B3configuration", + /*0a*/"B3protocol", + /*0b*/"BC", + /*0c*/"BChannelinformation", + /*0d*/"BProtocol", + /*0e*/"CalledPartyNumber", + /*0f*/"CalledPartySubaddress", + /*10*/"CallingPartyNumber", + /*11*/"CallingPartySubaddress", + /*12*/"CIPmask", + /*13*/"CIPmask2", + /*14*/"CIPValue", + /*15*/"Class", + /*16*/"ConnectedNumber", + /*17*/"ConnectedSubaddress", + /*18*/"Data", + /*19*/"DataHandle", + /*1a*/"DataLength", + /*1b*/"FacilityConfirmationParameter", + /*1c*/"Facilitydataarray", + /*1d*/"FacilityIndicationParameter", + /*1e*/"FacilityRequestParameter", + /*1f*/"FacilityResponseParameters", + /*20*/"FacilitySelector", + /*21*/"Flags", + /*22*/"Function", + /*23*/"HLC", + /*24*/"Info", + /*25*/"InfoElement", + /*26*/"InfoMask", + /*27*/"InfoNumber", + /*28*/"Keypadfacility", + /*29*/"LLC", + /*2a*/"ManuData", + /*2b*/"ManuID", + /*2c*/"NCPI", + /*2d*/"Reason", + /*2e*/"Reason_B3", + /*2f*/"Reject", + /*30*/"Useruserdata", +}; + +static char *mnames[] = { + 0, + "ALERT_REQ", + "CONNECT_REQ", + 0, + "DISCONNECT_REQ", + "LISTEN_REQ", + 0, + 0, + "INFO_REQ", + "FACILITY_REQ", + "SELECT_B_PROTOCOL_REQ", + "CONNECT_B3_REQ", + 0, + "DISCONNECT_B3_REQ", + 0, + "DATA_B3_REQ", + "RESET_B3_REQ", + 0, + 0, + "ALERT_CONF", + "CONNECT_CONF", + 0, + "DISCONNECT_CONF", + "LISTEN_CONF", + "MANUFACTURER_REQ", + 0, + "INFO_CONF", + "FACILITY_CONF", + "SELECT_B_PROTOCOL_CONF", + "CONNECT_B3_CONF", + 0, + "DISCONNECT_B3_CONF", + 0, + "DATA_B3_CONF", + "RESET_B3_CONF", + 0, + 0, + 0, + "CONNECT_IND", + "CONNECT_ACTIVE_IND", + "DISCONNECT_IND", + 0, + "MANUFACTURER_CONF", + 0, + "INFO_IND", + "FACILITY_IND", + 0, + "CONNECT_B3_IND", + "CONNECT_B3_ACTIVE_IND", + "DISCONNECT_B3_IND", + 0, + "DATA_B3_IND", + "RESET_B3_IND", + "CONNECT_B3_T90_ACTIVE_IND", + 0, + 0, + "CONNECT_RESP", + "CONNECT_ACTIVE_RESP", + "DISCONNECT_RESP", + 0, + "MANUFACTURER_IND", + 0, + "INFO_RESP", + "FACILITY_RESP", + 0, + "CONNECT_B3_RESP", + "CONNECT_B3_ACTIVE_RESP", + "DISCONNECT_B3_RESP", + 0, + "DATA_B3_RESP", + "RESET_B3_RESP", + "CONNECT_B3_T90_ACTIVE_RESP", + 0, + 0, + 0, + 0, + 0, + 0, + "MANUFACTURER_RESP" +}; + +static void (*signal)(char *, CAPI_PROTOCOL_TYP, CAPI_MESSAGE); +static char *buf=0, *p=0; +/*-------------------------------------------------------*/ +void bufprint (char *fmt, ...) { + va_list f; + va_start (f,fmt); + vsprintf (p,fmt,f); + va_end (f); + p+=strlen(p); +} + +static void printstructlen (_cbyte __far *m, unsigned len) { + unsigned hex = 0; + for (;len;len--,m++) + if (isalnum (*m) | *m == ' ') { + if (hex) + bufprint (">"); + bufprint ("%c", *m); + hex = 0; + } + else { + if (!hex) + bufprint ("<%02x", *m); + else + bufprint (" %02x", *m); + hex = 1; + } + if (hex) + bufprint (">"); +} + +static void printstruct (_cbyte __far *m) { + unsigned len; + if (m[0] != 0xff) { + len = m[0]; + m+=1; + } + else { + len = ((_cword __far *)(m+1))[0]; + m+=3; + } + printstructlen (m, len); +} + +/*-------------------------------------------------------*/ +#define NAME (pnames[cmsg->par[cmsg->p]]) + +static void __far PROTOCOL_MESSAGE_2_PARS (_cmsg __far *cmsg, int level) { + for (;TYP != _CEND; cmsg->p++) { + int slen = 29+3-level; + int i; + + bufprint (" "); + for (i=0; im+cmsg->l)); + cmsg->l++; + break; + case _CWORD: + bufprint ("%-*s = 0x%04x\n", slen, NAME, *(_cword __far *)(cmsg->m+cmsg->l)); + cmsg->l+=2; + break; + case _CDWORD: + if (strcmp(NAME,"Data")==0) { + bufprint ("%-*s = ", slen, NAME); + printstructlen ((_cbyte __far *)*(_cdword __far *)(cmsg->m+cmsg->l), + *(_cword __far *)(cmsg->m+cmsg->l+sizeof(_cdword))); + bufprint ("\n"); + } + else + bufprint ("%-*s = 0x%08lx\n", slen, NAME, *(_cdword __far *)(cmsg->m+cmsg->l)); + cmsg->l+=4; + break; + case _CSTRUCT: + bufprint ("%-*s = ", slen, NAME); + if (cmsg->m[cmsg->l]=='\0') + bufprint ("default"); + else + printstruct (cmsg->m+cmsg->l); + bufprint ("\n"); + if (cmsg->m[cmsg->l] != 0xff) + cmsg->l+= 1+ cmsg->m[cmsg->l]; + else + cmsg->l+= 3+ *(_cword __far *)(cmsg->m+cmsg->l+1); + + break; + + case _CMSTRUCT: + /*----- Metastruktur 0 -----*/ + if (cmsg->m[cmsg->l] == '\0') { + bufprint ("%-*s = default\n", slen, NAME); + cmsg->l++; + jumpcstruct (cmsg); + } + else { + char *name = NAME; + unsigned _l = cmsg->l; + bufprint ("%-*s\n", slen, name); + cmsg->l = (cmsg->m+_l)[0] == 255 ? cmsg->l+3 : cmsg->l+1; + cmsg->p++; + PROTOCOL_MESSAGE_2_PARS (cmsg, level+1); + } + break; + } + } +} +/*-------------------------------------------------------*/ +#ifndef NOCLOCK +#include +#endif +void __far CAPI_PROTOCOL_INIT (char *_buf, void (*_signal)(char *, CAPI_PROTOCOL_TYP, CAPI_MESSAGE)) { + +#ifndef NOCLOCK + time_t ltime; + char *date; +#endif + + buf = _buf; + signal = _signal; + p = buf; p[0]=0; + if (buf==NULL||signal==NULL) return; + + bufprint ("+---------------------------------------------------------------------\n"); + bufprint ("| COMMON-ISDN-API Development Kit AVM-Berlin Version 2.0\n"); + bufprint ("|\n"); +#ifndef NOCLOCK + time (<ime); + date = ctime (<ime); + date[24]='\0'; + bufprint ("|%*s\n", 69/2 + strlen(date)/2, date); +#endif + bufprint ("+---------------------------------------------------------------------\n"); + (*signal)(buf, CAPI_PROTOCOL_HEADER, NULL); + p = buf; + p[0]=0; +} + +/*-------------------------------------------------------*/ +void __far CAPI_PROTOCOL_TEXT (char *fmt, ...) { + va_list f; + if (buf==NULL||signal==NULL) return; + p = buf; p[0]=0; + va_start (f,fmt); + vsprintf (p,fmt,f); + va_end (f); + (*signal)(p, CAPI_PROTOCOL_TXT, NULL); +} + +/*-------------------------------------------------------*/ +void __far CAPI_PROTOCOL_MESSAGE (CAPI_MESSAGE msg) { + +#ifndef NOCLOCK + clock_t lclock; +#endif + _cmsg cmsg; + p = buf; + p[0]=0; + if (buf==NULL || signal==NULL) return; + + cmsg.m = msg; + cmsg.l = 8; + cmsg.p = 0; + byteTRcpy (cmsg.m+4, &cmsg.Command); + byteTRcpy (cmsg.m+5, &cmsg.Subcommand); + cmsg.par = cpars [command_2_index (cmsg.Command,cmsg.Subcommand)]; + +#ifndef NOCLOCK + lclock = clock(); + bufprint ("\n%-26s ID=%03d #0x%04x LEN=%04d %02ld:%02ld:%02ld:%02ld\n", + mnames[command_2_index (cmsg.Command,cmsg.Subcommand)], + ((unsigned short __far *)msg)[1], + ((unsigned short __far *)msg)[3], + ((unsigned short __far *)msg)[0], + (lclock / CLOCKS_PER_SEC / 60l / 60l), + (lclock / CLOCKS_PER_SEC / 60) % 60l, + (lclock / CLOCKS_PER_SEC) % 60l, + ((lclock) % CLOCKS_PER_SEC) / 10); +#else + bufprint ("\n%-26s ID=%03d #0x%04x LEN=%04d\n", + mnames[command_2_index (cmsg.Command,cmsg.Subcommand)], + ((unsigned short __far *)msg)[1], + ((unsigned short __far *)msg)[3], + ((unsigned short __far *)msg)[0]); +#endif + + PROTOCOL_MESSAGE_2_PARS (&cmsg, 1); + (*signal)(buf, CAPI_PROTOCOL_MSG, msg); +} + +#endif diff --git a/C20LIB/VXD/CAPI20.CLB b/C20LIB/VXD/CAPI20.CLB new file mode 100644 index 0000000000000000000000000000000000000000..9ca18c452dadaecc81ed2e9f3f3f3c42e5b9ff90 GIT binary patch literal 21916 zcmeHP3v^Z0nf~uHHxH5k;iV{7h=`&wkN`nZ6UYUkAv}`cqiTSV5Rg}SskL;70VP~* zty66sTL=46TUT{iTkXRZD^qkj+OAG*eRM|KYHM286f3s0rDneG-)En5_q_?k&UDtA zwR*D7xBv6+fB*l#-}~&dZ%&)Da!Y&Hg$3s(-K(aia@zEn(`#nA>|~|)Tr+dFN3AFj zktretM-Y?`?ViykV(+|CLo=j~zs=oN*O*$?(zYzMRNCg%Eoqou*|s3n(zd9ssdawc zyq4Bwsby|Ns=2vtLCWDRS+;n7L!--UPAzMwYiw(3T{JgK!}8R!=7z;hzJ`Y8hNkA0 zy2i#-z0X_H3Kz00ElVwEXl}_+wk*|{s%s9+HpB1ch6PP^jYdz~yhY6m+NQgT470AO z`BJONa2BTO>U|DNfQdalo+nV1!K91cLB zISE^4R}P%mNokVR*R|BO!I(w`4|Juzp*h1FBap?)63dn`CeR)l8XH_vqcTaVFDOJ(c5ffJTbBv^^Ibl+lKbmvUuL&Mpg6PduV0QL!;=T zrFkMp&{xaRSG#6tmzA(Y2Kb8#|3Z3)Av5&9zxT4g_cE`a20icpRWDo9zG3T{9oMa{ z*tBXL=R`XX)@03t(<&=x&YYP{&aMLJwW6Rg6qcq3wpT9?iHt*!<5jV(vmo`VU{RnK&$ z6H7J5a{CzDcJ=$7c?!vT-b^6nt*K*6(y1apVQ=ba&(5P#vIny-G%_+%>(M|3h7ZZd z9T$pn(l3+KeBNY@A+G_{NR90Tj!=r@4^s-pk}<%DOb13)lSr*{nw4`EFeV#-aoG;c zlZwu@>pMX4dbeL>O=#<;?OWPAuJo&_-6>@hszgF8XO^vd89xMLTT;TILPXBO&3a&- z%thbL1sTb#moV6okR)t;W_X78pfXC&^P`O(mWH|LVFy8m83sy?SH*fGLoZcEDmn~@ zUIwX#Q`osK!;_I=zNn4Xr>hMsxW*Dfe|UY+;Z&>|$d>WU3R(~2V7MN#yaNwUwh1)6 z4XBH*wv5GuS%YORfG$GMtG#I2MHg{>=8M+W&aRz(yoJsX7BP0Q=dH9lw{L8>{hM9) zM16c#^|a}fOD5UJL)yplOGLip5{Hp z5Lp*uXUynxW7Daz=|zd&y7F{tJc;g`AeK%gmENy(xe8pJkt!N=(}9eHvyF5bE1kV{ z^`4o!vppMi)#;QmP?=6mQA;%tKN}RpM}Vv}!aFOSSt>jq^vi*g4yFs3I?)!|Z5oJaq(g5Y>tcgg>)xgHU<}T&{h`+O2XqXt zKMXlzU6`-Xc?Zl}_w5~7676Bu29xy8NfiYPOjLQmOp7&aF4d{?? zxfhl@fDz$H9+mrmF?kpmm#+cy>a?E+yjiuL%=+|5b*js z=#cyr7?xiFBXSssjW@K>n7+;-_n<>E6&RLkU_>qeMx_B5lU86{t_J4GCSXD?RLvg% z9g@3%Vfh>|B3}YVz&zOqOvtsseAxvokX~S++yN|-dw|2_3&3Le zDzHSp4J?%(0Ef#;we>RSko*Z4mO@l_M7oqe8gxi%v;j0If0OcCl)ppyyOn<%Fe>)~ zW3oeK9t0hd=YU~(1sIW?%Kx?Ui_i_R4FZhF6kt?#Yit$hkhE%Sr^cq0|9<7)ru=)A z&y}OdgUWwS`7bK}=fJ4E4UEZMD)TPrkeq^^j6MsD$bRL|1|5?3DSwUfHv^+`JuoJF zfN{AKn5Vr}zqW}LCsT|K6si;Pw!);gbD>&xkVb~qsjUn5Ay}WNLe{#ghg(v-$`!5k+>(!>GK0Lg zsdOfAL@+Y6PHoKlA7I^#y4Jd@hxNc~s-m@?oAQN(z zU1wxG>nP?d>!mvX+a8Bc30W8YF*3AHZR}~kfb~r(Y4h&tNqBnRZ)66w-sD&>%(2c@ zwUME9YU3FGXIM9@8f)FvGs4qzont+BwE4VaeN2w^a&U|cty3HGKA~8=wUf2(>ft*8 zuYXXqtuD9ZUvsQa$gy4vj*+2tYHPqf3)XiV&ECfmSI_C5o|_!&xjpV2U4_|tKQqTV z-&l+cty3HG-U{m+gM(J*>Z$Pb+-hV7t@mpj>(g?quL8%&&^ooT&2ND9+l^)~@2;Mi zo}Q1L!20JM>$7vLZw1H5&^onoj@tw4cRAKwJ*+QYcPrX@M^ zd6}1)wQSyDDl6}IJJzqtvA!Q1BSY)d##Z+hteeaBI9Cr_OK@51xjl|6eTtgA8?@;j zLPYja5&wf<=C?low32svNRJZa9P)9F1O?{~?D3k6b3vLu<3tY*g9QhAj(>_Lb9W}k=M$ZV-3~U4&!&UvyCgYf*Z8X?kbbv&j(kKXw4VVH>}*m!CWa%EaSgrff~P2?msmQ1U9;II%EX ziVmc>s2AU<2h<)@?L}}Uy|eUq22k>kAEq#}dzI%3K72T3O_{fhj8O%Fy~(|`p}m{K zdzbJlOOE*OPN32>sK?*V60=2|ktenSE+ETfJg`uy3g9@UIN+J{Fi~tJal3>qF(FHU z1-fu5)HL{X1x{4fs|=TMd9nqVFPvx#)PkAD!t!ZwqH;elu3IE|@)ebN0$AvsDEc1g zm^`O4KL94=$G`%45jaeK1}v5&P~^9`WAYX-F24un$sd6UVOPkPeqaHHeQuL+0a+|u z5SB^vsON ztDqzDIxs440AunSV4l1M%$Gj`3-omi@j6!J1EW#|jLQgMLPi1eWel)DP68InDZnC0 z0!w5HuvC_6POCsiqy`w3^MNtp2ai0d2j)v7(6lAIdV!8g8!#rTfY<;9Cgd7mfoud8 z%KL#M<$7S*;M;RLn0v2D8E4awEo{$mB#|~bEIak2o_1CsmDzA zTuku7`vWe!P{>`PQCEpsf`;y$%sASXBSDXo>M#}Cu?Z)&RIfj`LCnju^h5>1Yu~d zwgnyA>g(r%W9tkoWVvR6#Hmq>*90Ps9^v zX>Pcf(ZE`F^(^ufoT;JBJ6Dx%-Y4QQu)fku6$G?pWN4k*&cgjPtaB6&>fP1Tp>h89 zoR{|mxUTg^$NE+;RS-0SG%~c#IzI>ZQCK%)l+C-VhZ`llW+~dd=i|w>e!XM;!z!H# zEAU`sXr0=o;jTbOWT^ysclEFh@-jWoT4x`1t$)F>{zXlb3ES{sWN4k*nE%bNK2ODL z-d#NpX`H`3=aoEXQP=uQj`f3Hsvx)-q>-WZ6rR}TAB6RbRmfU*^*pU{{`TCUZT?-y z`VYNSL9idBk)d_Af^%{I7}m{*ZLPa{I0y6cw&y(Sxh2m}hgup0?OP0k>rs$KhSsT# zc^`|lGq+-bdUy5wTI2lfxk2;3)UkfVOBDoMRTvps=Vl+<{9IT!m(9DY=ctX=(6+kV zHqW^w$a|5NfKB>y5cX#|Ilq%xeqB9=!sQ)Xwyxc@(HA@6&tx)>mRjBVlb@{L+hqTo z#vT?O?3Y2=zw4pS!G8s0e=~%$t(iwoPxua1Gp(i?uUfc*bLHoZ#@fg$vWnF!x2?3r zhp+}MbTz_HBILy$TZ{AJ+3#B0(IG#GY4EL5%=9BUn%yjX*8)qg><|MU)*4)OaGk+5 z2v=Mps7#%I`OI07&zvjye3JKks`s4q!g7Sv!<91SI8QO8uMDfbum&ORa;#%mi<|oE zar1dTZpw2!VAzD4{AIW)x7-WaXBf|x%hh)k+R~_lHtSRiGo;OeyH%wNttn(^yCpEOYyoBDGr#C6lJqb8okIOQczrV=N993m`F{mb%e^cdY6j+_I%R@WJ)n>0zjhh_Lt0cZG} z=@0!o*E$VlL6)$3ge-5Xmvqu>gh$TxbXl2k&|_&&-uul3hp~3r<S0ivVdC;AD2@hk`6ei?JL7T?)LBYB z4T|f(xcmqdM~}F?0E(;7xW2DVR_ZnIPFITWZRJWG1~o~kBcLWKbrjTTN^y%QsTAMk zCMd->IgVWToeLsX25Q8v2gP@qxNHVhtkiX&hAFiRRFP7< zL2=y?ms>y;D0Les&c|{27$~lVQ8S?UMi7_%pyEn>78J+lxEuh*5h*VA=LAK19`<4I zu$6Ua*JnXckv`lHf)_Wrp4qoBveYBOOWz=yKTnG8Q30N>eb7kSUm)RBW}-8#3e$^< zI(zYhh{V3yFt>$zX>M;FCHB=uGB`NEjWoJ-q%t^lj`PD{)kb|O@Zwopci2w)eJZi5 zWH$>J@;$GX^c=|VO(ptfgVD1yQBra<^WVp2hsU~-JuK8isRYZhj}_LvGr^scl07Ut zL;#_wsOQy4WGHTD@9pPGx!7VcD8Ab!_tkRjVU;g1o19Y2TnF zn$%|Dq^EZ{pPvZr)w=5%qJz45e2l*jTo~$klHF5(<~MjP1hRoKZtI;ekEoDP$(~B< z7roT>$69tO1e$EENBbVjlc4i>njVJT-M>A%4Etz4NHnR}Y8VeW|0q z!F219z0u))m#g-prtIlRBz2_LdFnY3vD(=L)4M2@UUUQ=_hY}^(b(BrKb%99ZS~A+ zA1AE-MTdKK9*&mW%()|-I^18bLmnP-uD-*6?(YwV2>vY7&#Cv>LcetE{zoLGt;bmg zXz84Sx?UjgS>X**JqL^Wbl~EHuL{Hg)9)5+1srR(AFrX2Tm(yiZQ0ZiYu!wnl)FLU(3G7k^9hb2Q8G8mO8g-wQij5VTWo~ zwGP!fGrYWS{P1+qe?$!v%^3;3A&tk4bJh4m_3`v%jodue?2X)>OWwGw>Q&J|qaO!z z+x#GDNA4%=K;h`pUU@v9%w*z^NoEk&A+Y;TW;|vqRgX;f#3)G%Dl!-R&~1F|JADwT z&U8y6)bkxSDo?U3%h3#zdwy85XRcK=XaOKkhoT8+pVm_aUo+j_DvgSci;K zQni7|%;d4m64=89AWWH(js%U9`qc$>HK>+oU&ipn-+BAP)6wG%PlbPR`ZzS}vToNi z9QgJwjAV6{frkMMoE!(x+xDeOL7<24OO+`R34Z*8^@91iowHWE2>Ib{eoW47fw;U6 zIA3||QQ|X{_femE%%`|9XJUCa-%y>P7Hir&ectOnH4Y0GBR9{dR)I1pdVJp3edSCoDK{Y6~1k^&MJ`Rdo z8CbM~x>TuqL2+Wkrz=p#gQ;K5r}*wMMQQRI6(4^m&hgTBE#|L2U#Tmsdb-Q0f<;)+_ZZP}eB+8&K<% z`YounN=?VQ+vKPQ&(y&!M7|`2^<^#MZ6R^PCoZdi3Gd_TZqNm~;ZmsQWQyboaEkSp zCM8-nqQ5r@$?M>Uk%7Ipu=)4FrptDWAbB-eFc~&eC^Da z3209Rawf1)DuBae1F%@G1(wJMfy3oK;0SpFI8wd~93}n0(XtlpX^h+r94GsMC&?k; z$?`UEyd=cGjz_@Nw z=IM#Re0c<%LirA`NS+4{lRjXH90rzZJHw_u=#Wf9>y5~zz?kqC6LGl_+}gSL>dd5p%3%^q$abFK)k z^5z9IW}(}SMU2Xba%Q1iT+U3?fy=?LP~>tj1hExo=)s;*)a9Td9z%Q2kij0(5tjoO z4?CQhcyoWl<-q6HTn>DG)#boven<>#&4kYfT@HLc;Bw&e<1Pn2KkRbg^Mfu2KHu+f zX29qDE(bn;!sWo{+guKO<~x7j^9=aB+vUJ#zR+jLz~}WY2R^TMIq-Rf%Yn~VI-F|w ze3{FE&r4hmd~S3(@VVaQz~@?*1E1%(9Qa)0a^Q2d%Yo08E(bnOaX3}*x!mQz=cLPF zdv-bSxya?fXK^|3`6x#2pq#7V^P4UQKL5bwz~_TLhdm7)K=wk3(L+ut0hi%qe!M|K z^izJm;U^pS;)W!zuq5%}?mSS>;O6HYt^$J3hNP*-9MIs0b6$0d_QM@F6jjDQq(EIk zs%c&-O{9Q=S9`P`2~pb?+)H77zQ)_nhOQny@miv2tz%HmvVK171=hc>(wRVeMuyg@ zZ4!$023T)ZvGT^5(@|YIe^O6ez?p`IpmTD-K||1aJK&%p=-eJ~*bqMD`J;MfQco>r zIV01yp<}~_O*=Zk#FYe>oc7Jv8-{XhX}I}%-IKUNLt7eWvt?>9_Z<6D zNE;cJ2DN#@^Y;eA4H%wXNK`wPVXRB*evBSf5?%&l>? zt}+4++YeVF0jC-qu2y``EONL~HXK{>uFut;&pRL+lzb92Qw6Q%FP~jvi|r8O^fJkutE}K7%xp6iA zGv?Zjt2?ffwk37Tnlu09=DO`0Hn(rxwq<+!Ht+m;_CM1Mo|)DY(*N8!=s)TFZ!4s_ Az5oCK literal 0 HcmV?d00001 diff --git a/C20LIB/VXD/CAPI20D.CLB b/C20LIB/VXD/CAPI20D.CLB new file mode 100644 index 0000000000000000000000000000000000000000..51e63a73e59ee4c150a1a63870bfaa2acda87872 GIT binary patch literal 33978 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 literal 0 HcmV?d00001 diff --git a/C20LIB/WIN16/CAPI20LD.LIB b/C20LIB/WIN16/CAPI20LD.LIB new file mode 100644 index 0000000000000000000000000000000000000000..dc055f6d934a8b90d9eba43bec8502591fa4d63e GIT binary patch literal 22677 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 z zf`sM*+6X$=MN^XcuOMwaSmX+@$SSZ%3*z5L99PZSyI_|DuuBeh3;BrOjrjKwe-ZJ& zs?PH270U#A2-dHA@A+l!p=NWa1`-Q8f9_h;}dxjWEH+!n}ho%sUN3ojWm=}vsxMlEz(Fb==F+@HWFowuCbx1_yn>r*S@=YBg zME+S$TPM`)Xo_vmy~cEL#0(TUVg`y_@);-^oNv=gCTB%ZG&xJ4C}uY|pmMF|!*nkb z08_Iq2cT2{49ym$rcB)y(MpDHi_-h1cC+h!Q@fqZk^_Cj_ehh$F5I&~1?xP8xQ_Vy zV3$|GF8{`r6ube*b69+$7_(y;VMa#aTs|RqhOMKsZ)IdP38igKtJtudhNnltwCfAO zbY!&)4yic%k;hZ0XWvRZ!*1Z$e;$*RjS0I9 z6SfxdO_;DdUy(@iR!98GaTMbY)s}Dh9pX?O@h67s`G*pUM4W6_EqCD9Z1eLKez>cC z?7(T<21Uh*FuzvYynI)EPlk7<<)ZFYD6u-?y8f^N=g%0Y+*Lj&TClnFuKKwX*7@Nc z;^=Iy3q>OXsVqP0B7ER$j>P6d{EnN(h2g;6mNnbMtqk_TSC+SU=sY_t#*g?H9&{Ta zPG$L|1RVEmbTGY?8xqj84a_}`pGd%|(?*}l@{0Ai^tOfojcRM~e3@4C+9+E?+^@_dCLx=dDgv|_sW=n!uhb)sQl@#L zk7CUeroA{yT=4H1aakB+N)GRrqvWFLDgfnfT8mxq80y?{((qESI~tq$9@t&OO;P{( z;-ri_Z|yw%&ybmY+B^uNVhEzOu(fViopk4g+&L`P&|;Zh_@MdNuEq_`6R9RU*V9-k z#64RS>xnBIet%P4U0t-cd}T#dQDJ4(>im1VU=tjWhQVE&g7fFa7Uyk7e!M+F>4+)t zjV`z|3`kNe+-%P&u(Dd%nMN@eCcdu8qIwM2tc|Ot=>B1^tIDgqCT!nq?3yI1M?=lp zSn^S|iMYK_;BVPSJFWUrP_sUGC$@gN%~ox4+kIW<3lt(oY%{}b#jrRU6xeC6ZyGuG z4y$iwnDrBESnM1>k`4X)UDE{?BbeCDwhSJzW&`xF@UgA1uSely%P`xJ?fBsTiJ9{u zY|B6E!vBl_GeiN+dJuXs)U@?)GZg=ARR6XNvmJa29&TsnxDjrv$-&Dw^jkI<6GxV#rd?HZ}FD_h_)JjZOQHjKxgS46k>c~g`3 z@fJ3&BmAE+{_`zHa6e@%z-twrZo25!wucSGZ1ObcDP^1(28Tr%>T{k^Vpi%yiYXGp z_YgS`DZ_{Qs**m8FgdT{U%Z)=HSSAu9>;%QGa&{;Dd7bx(m6jTIr}UdH%%6oL_WslZby=}b~#$S6|CLiXAybW8LI_+ zWEaTTJz)M~cRB-5)c@;#2dFk1|A&$q?^#G|x$x)9|04XC$#0lL&FH2_BJ0{trJNT) z-B>ArkLnDVjWeFZ`j6U_J*td&ISlzb@-47U3fR=Xg4M{;u-$5-mDpQtt8Rp2xc?g8 z=0=@WG4Hm+qgd6pV_*)-xF*A literal 0 HcmV?d00001 diff --git a/C20LIB/WIN16/CAPI20S.LIB b/C20LIB/WIN16/CAPI20S.LIB new file mode 100644 index 0000000000000000000000000000000000000000..55bf6dce0fdf527a51d963224fcb82358866dec4 GIT binary patch literal 14993 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 a5bHtYCXF(1cOwf?8~pP%@r~7-;PXGvhJNb+ literal 0 HcmV?d00001 diff --git a/C20LIB/WIN16/CAPI20W.LIB b/C20LIB/WIN16/CAPI20W.LIB new file mode 100644 index 0000000000000000000000000000000000000000..b215b5ab2866fc6b71cafd2ade079906e82ccb7d GIT binary patch literal 2048 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 literal 0 HcmV?d00001 diff --git a/C20LIB/WIN32/CAP2032D.LIB b/C20LIB/WIN32/CAP2032D.LIB new file mode 100644 index 0000000000000000000000000000000000000000..9e9fd6a570ebc1d26a9902e2a2b72adf0e015297 GIT binary patch literal 33414 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 JF<5fq{{mU%9a#VX literal 0 HcmV?d00001 diff --git a/C20LIB/WIN32/CAPI2032.LIB b/C20LIB/WIN32/CAPI2032.LIB new file mode 100644 index 0000000000000000000000000000000000000000..8220274d329bc797ccffc9628023d83acedc3b99 GIT binary patch literal 8612 zcmeHM&2QX96#v=VB+Vv-txDCZD(RMn>#`r&bhi|+Nt|HS*{p0YaC4#tDV2hRP=s=* zgpoLMfiprJICJQMQ&r`!=$Ui>fS#(tdtQ%s#`}>b+Df+6Sv}AC%^Q2>{pR=P!?*73 zegEL#)8a>EHMN@6R=v5_sH*C+xNlY0;*#AWfcJsoOJMOSu=EHh-32ba0xmxRt{ekb zTfns!!1c$#jYD9$0^EEK%svC=56)M&xDu?JT|3ya{9xPc^ft|Pzvo)6u?nfc@;r0P zGFp+WpYj;ix4*EXG?)7$<$^@J}i*RyvzMr|#Agx&Fc({Zc~qZ(_Jx7UTX+oN`+ zUhi64w&&9u5-ZnoEYq`+Mt^16ez3XY2A;juF&)l}s z-L<zZI2A|?luly1wMa=93N!dYvSYo0@(JhZL}7|u6#2CO#JR`??6Wz@i1lj< zUvd+4h!z^a32P37CTa^mw;(jDY(t8HO>>}O{Vl%4iEC2KjPE$p;nOu3o-tozP8}cp z<^H|Sh^*D`NF!2Fn`v0RVP1yK_Rij%Qgu=Bdj=D6qH&z zX5w16`wxk(ItVUFP5@Rob37`Eh@J-hLf*6krn z7BQr)c#`yJ&6bXz%CX1<_|882HFCi~T91S*SwxQxT9TxrP5))|)RU_T(4AxMllKGJ zW!?kAjU|iNl@sJRdVZ3^PC3_#&I+fCUp`izv~~|!vWVa0m1p_{c)IB2BXZK-E@a6f zdXpokdP+ZC?DDbhq2fb0adUytW62_dW8>zCFOt*6E+27|zAJ<*S;TH^+>Egsd=;C7-2aau B9hU$A literal 0 HcmV?d00001 diff --git a/DEBUG.DLL/DEBUG.DOC b/DEBUG.DLL/DEBUG.DOC new file mode 100644 index 0000000000000000000000000000000000000000..84f1afa0a4a488f222ae7b0bd685df2b5661d5a7 GIT binary patch literal 12288 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 UB*y$j>1M7`{{0b7yMxnz01GSp3;+NC literal 0 HcmV?d00001 diff --git a/DEBUG.DLL/NC.MNU b/DEBUG.DLL/NC.MNU new file mode 100644 index 0000000..610b79e --- /dev/null +++ b/DEBUG.DLL/NC.MNU @@ -0,0 +1,53 @@ +---CAPI.DLL--- +Data B3 Messages aus + patch -fcapi.dll -sTraceData -h00 +Data B3 Messages kurz (default) + patch -fcapi.dll -sTraceData -h01 +Data B3 Messages lang + patch -fcapi.dll -sTraceData -h02 + +Kein GET_ & PUT_MESSAGE (default) + patch -fcapi.dll -sTraceAll -h00 +Auch GET_ & PUT_MESSAGE Protokollieren + patch -fcapi.dll -sTraceAll -h01 + +Protokoll nur einmal ”ffnen/schlieáen (default) + patch -fcapi.dll -sCloseProt -h00 +Protokoll bei jeder Message ”ffnen/schlieáen + patch -fcapi.dll -sCloseProt -h01 +- +---CAPI20.DLL--- +Data B3 Messages aus + patch -fcapi20.dll -sTraceData -h00 +Data B3 Messages kurz (default) + patch -fcapi20.dll -sTraceData -h01 +Data B3 Messages lang + patch -fcapi20.dll -sTraceData -h02 + +Kein GET_ & PUT_MESSAGE (default) + patch -fcapi20.dll -sTraceAll -h00 +Auch GET_ & PUT_MESSAGE Protokollieren + patch -fcapi20.dll -sTraceAll -h01 + +Protokoll nur einmal ”ffnen/schlieáen (default) + patch -fcapi20.dll -sCloseProt -h00 +Protokoll bei jeder Message ”ffnen/schlieáen + patch -fcapi20.dll -sCloseProt -h01 +- +---CAPI2032.DLL--- +Data B3 Messages aus + patch -fcapi2032.dll -sTraceData -h00 +Data B3 Messages kurz (default) + patch -fcapi2032.dll -sTraceData -h01 +Data B3 Messages lang + patch -fcapi2032.dll -sTraceData -h02 + +Kein GET_ & PUT_MESSAGE (default) + patch -fcapi2032.dll -sTraceAll -h00 +Auch GET_ & PUT_MESSAGE Protokollieren + patch -fcapi2032.dll -sTraceAll -h01 + +Protokoll nur einmal ”ffnen/schlieáen (default) + patch -fcapi2032.dll -sCloseProt -h00 +Protokoll bei jeder Message ”ffnen/schlieáen + patch -fcapi2032.dll -sCloseProt -h01 diff --git a/README.TXT b/README.TXT new file mode 100644 index 0000000..aa9eaad --- /dev/null +++ b/README.TXT @@ -0,0 +1,324 @@ + + + +The COMMON ISDN API 2.0 Application Development Kit V1.6 +--------------------------------------------------------- + +This COMMON ISDN API Application Development Kit is designed for programmers +and other people who are interested in the operation of the COMMON ISDN API. + +The COMMON ISDN API 2.0 Application Development Kit supports you in +developing ISDN-based applications. It offers a good introduction into +programming for COMMON ISDN API 2.0 and demonstrates how applications and +devices communicate through a uniform, standardized software interface. The +sample code is largely operating system independent, and should be easy to +port to other platforms. This time the SDK includes complete code for the +usage of the libraries for the operation systems Dos, Windows 16 bit, +Windows 32 bit and the Windows VxD interface. + + +The COMMON ISDN API (CAPI) enables applications to operate ISDN controller +boards in a simple, consistent manner. It is designed as a standard interface +allowing unrestricted use of all functions of ISDN boards. + +Applications using CAPI will not be affected by details specific to hardware +environments or network operators, such as different manufacturers' adapters +or national D-channel protocols. Furthermore, future technical developments +in ISDN hardware will be transparent to applications using the +COMMON ISDN API. The interface therefore provides a solid basis for all +ISDN-related techniques. + +Thus, ISDN-specific applications can be built or other protocols linked to +ISDN over a defined, structured interface, which has been supported in Europe +as an ETSI standard since 1994. + +The initial intention behind COMMON ISDN API was to create a uniform, open +software interface for using ISDN with the PC. This open interface is the +hardware-independent platform for ISDN applications. A second objective +was to design the interface at a high level of abstraction in order to allow +its unrestricted use at any BRI or PRI. + + +Functional Characteristics + +The COMMON ISDN API connects any number of applications to any number of +controllers. It supports layer 1 to 3 of the OSI protocol stack. The API +rests above layer 3 as the point of access for applications and higher-layer +protocols. + +Applications and COMMON ISDN API communicate with each other by exchanging +command and data messages in message queues. When an application issues a +command to an ISDN device (driver and/or controller), for example, the +command is posted to the COMMON ISDN API's corresponding message queue. In +the opposite direction, events from an ISDN device (driver and/or controller) +are posted to the message queue of the appropriate application. + +The COMMON ISDN API Application Developing Kit gives you support in +developing ISDN based applications. When you access CAPI direct from the +application, you have to assemble correct CAPI 2.0 messages yourself and +make your own trace functions. Or you can use the Development Kit Library, +which contains functions that build the CAPI 2.0 messages for you +(CAPI20_CMSG_2_MESSAGE) out of a C-structure (_cmsg) and protocol functions +with detailed output. + + + +----------------------------------------+ + | application | + +----------------------------------------+ + | | + | V + | +-----------------------+ + | | CAPI 2.0 Development |--------> Protocol function + | | Kit library | easier handling + | +-----------------------+ ... + | | + V V + +--------------------------------------+ + | CAPI 2.0 | + | operation system specific functions | + +--------------------------------------+ + + + +Contents + +The COMMON ISDN API 2.0 Application Development Kit provides all CAPI 2.0 +functions for MS-DOS as defined in the CAPI 2.0 specification of February, +1994. Access to all parameters in CAPI messages is facilitated through +C source, library and header files. + + +The COMMON ISDN API 2.0 Application Development Kit consists of the +following components: + +1. This description. +2. The COMMON ISDN API 2.0 specification and the addenda +3. A complete development environment, including the required libraries and + header files to support all COMMON ISDN API functions. +4. Sample source codes (C and header files) including explanations of the + COMMON ISDN API functions and their use, as well as a complete sample + application. +5. The compiled sample application. + +The kit includes the following files: + + \ + + README.TXT This text. + + WHATS.NEW New features of the CAPI 2.0 Development Kit V1.4 + +\CAPISPEC\ + + CAPI20.DOC Word document containing the CAPI 2.0 specification + + ADDENDUM.DOC Word document containing the addendum to the CAPI 2.0 + specification including specifications for Windows 95 + and Windows NT + +\DEBUG.DLL\ + + CAPI11.DLL 16-bit CAPI 1.1 protocol DLL + + CAPI20.DLL 16-bit CAPI 2.0 protocol DLL + + CAPI2032.DLL 32-bit CAPI 2.0 protocol DLL + + README.TXT Installation instructions for protocol DLLs + + +\SOURCE\ + + CAPI.C CAPI 2.0 state machine, which handles all incoming messages. + CAPI.H Header file. + + MAIN.C The sample program (DEMO.EXE) built using the development + kit. Allows you to connect and send data packets and + complete files to another B-channel: writes a log file to + disk. See the source file for further information on how to + use the sample program. + FAXMAIN.C The sample program for sending and receiving FAX. + + MAIN.H The callback-functions that are used by CAPI.C are defined + here. This file is used by both MAIN.C and FAXMAIN.C. + + C20MSG.C CAPI 2.0 error messages and message names + C20MSG.H Header file. + + CONNECT.C Functions to connect and disconnect. + CONNECT.H Header file. + + CONTR.C Functions concerning information about controllers. + CONTR.H Header file. + + DATA.C Functions to transfer data over B-channels. + DATA.H Header file. + + FAX.C Functions and constants used for sending and receiving FAX + FAX.H Header file. + + ID.C Functions handling connections. + ID.H Header file. + + INIT.C Functions to initialize CAPI. + INIT.H Header file. + + OS.H Header file for operating system dependent files. + + TESTFAX.SFF Sample FAX. + + LINUTI.C Funktions that are not available with Linux. + LINUTI.H Header file. + + LINUX.MAK Make routine for the sample Linux program. + + MAKEDEMO.BAT Make routine for the sample DOS program. + MAKEDEMO.LNK Linker input file for sample DOS program + + MAKEFAX.BAT Make routine for the sample DOS program. + MAKEFAX.LNK Linker input file for sample DOS program + + MKDEM32.BAT Make routine for the sample DOS program. + MKDEM32.LNK Linker input file for sample DOS program + + MKDEMO2.BAT Make routine for the sample DOS program. + MKFAX2.BAT Make routine for the sample DOS program. + + NW_MKDMO.BAT Make routine for the sample NetWare program. + NW_DMO.RSP Response file for sample NetWare program. + NW_MKFAX.BAT Make routine for the sample NetWare program. + NW_FAX.RSP Response file for sample NetWare program. + + +\SOURCE\DOS + + DEMO.EXE DOS executable of the demo program + FAX.EXE DOS executable of the Fax-demo program + +\SOURCE\LINUX + + DEMO Linux executable of the demo program + FAXMAIN Linux executable of the Fax-demo program + +\SOURCE\OS2 + + DEMO2.EXE OS/2 executable of the demo program + FAX2.EXE OS/2 executable of the Fax-demo program + +\SOURCE\WIN32 + + DEMO32.EXE Windows 32 bit executable of the demo program + +\SOURCE\NETWARE + + DEMO.NLM NetWare NLM executable of the demo program + FAXDEMO.NLM NetWare NLM executable of the demo fax program + + +\C20LIB + + MKDOS.BAT Make routine for DOS libraries (see description in the file). + MKWIN16.BAT Make routine for Windows 16 bit libraries (see description in + the file). + MKWIN32.BAT Make routine for Windows 32 bit libraries (see description in + the file). + MKVXD.BAT Make routine for Windows 32 bit VxD libraries (see description + in the file). + MKOS2.CMD Make routine for OS/2 libraries + LINUX.MAK Make routine for Linux libraries + + MKNW.BAT Make routine for NetWare libraries + + +\C20LIB\SOURCE + + CAPI20.H Header file for all CAPI20xx librarys. + + CDOS.C C file for building the CAPI20xx libraries for DOS. + CDOS.H Header file for the DOS-specific CAPI 2.0 functions. + + CWIN16.C C-file for building the CAPI20xx libraries for Windows 16 bit. + CWIN16.H Header file for the Windows(16)-specific CAPI 2.0 functions. + + CWIN32.C C-file for building the CAPI20xx libraries for Windows 32 bit. + CWIN32.H Header file for the Windows(32)-specific CAPI 2.0 functions. + + CVXD.C C-file for building the CAPI20xx libraries for Windows VxDs. + CVXD.H Header file for the VXD-specific CAPI 2.0 functions. + + COS2.C C file for building the CAPI20xx libraries for OS/2. + COS2.H Header file for the OS/2-specific CAPI 2.0 functions. + + CLINUX.C C file for building the CAPI20xx libraries for Linux. + CLINUX.H Header file for the Linux-specific CAPI 2.0 functions. + + C_NW.C C file for building the CAPI20xx libraries for NetWare. + C_NW.H Header files for the NetWare-specific CAPI 2.0 functions + C2IMP_NW.H + C2MGR_NW.H + + FUNC.C CAPI 2.0 functions. + GCMSGDOS.C Functions specific to DOS. + GCMSGWIN.C Functions specific to Windows 16 and 32 bit. + GCMSGVXD.C Functions specific to Windows VxDs. + GCMSGOS2.C Functions specific to OS/2. + GCMSGLIN.C Functions specific to Linux. + GCMSG_NW.C Functions specific to NetWare + MSG.C Internal CAPI 2.0 Application Development Kit functions. + + +\C20LIB\DOS + This directory contains the DOS-specific builds. + + CAPI20S.LIB CAPI 2.0 development kit library for the small memory model. + CAPI20L.LIB CAPI 2.0 development kit library for the large memory model. + CAPI20SD.LIB CAPI 2.0 development kit library for the small memory model, + including protocol functions. + CAPI20LD.LIB CAPI 2.0 development kit library for the large memory model, + including protocol functions. + +\C20LIB\WIN16 + This directory contains the Windows 16 bit-specific builds. + + CAPI20S.LIB CAPI 2.0 development kit library for the small memory model. + CAPI20L.LIB CAPI 2.0 development kit library for the large memory model. + CAPI20SD.LIB CAPI 2.0 development kit library for the small memory model, + including protocol functions. + CAPI20LD.LIB CAPI 2.0 development kit library for the large memory model, + including protocol functions. + CAPI20W.LIB Windows link library for dynamically linking a manufacturer- + specific CAPI20.DLL. + +\C20LIB\WIN32 + This directory contains the Windows 32 bit-specific builds. + + CAP2032.LIB CAPI 2.0 development kit library. + CAP2032D.LIB CAPI 2.0 development kit library including protocol functions. + CAPI2032.LIB Windows link library for dynamically linking a manufacturer- + specific CAPI2032.DLL. + +\C20LIB\VXD + This directory contains the Windows 32 bit VxD-specific builds. + + CAPI20.CLB CAPI 2.0 development kit library. + CAPI20D.CLB CAPI 2.0 development kit library including protocol functions. + +\C20LIB\OS2 + This directory contains the OS/2-specific builds. + + CAPI20.LIB CAPI 2.0 development kit library. + CAPI20D.LIB CAPI 2.0 development kit library including protocol functions. + CAPI20I.LIB OS/2 link library for dynamically linking a manufacturer- + specific CAPI2032.DLL. + +\C20LIB\LINUX + This directory contains the Linux-specific builds. + + LIBC20.a CAPI 2.0 development kit library. + + +\C20LIB\NETWARE + This directory contains the NetWare-specific builds. + + CAP2032.LIB CAPI 2.0 development kit library. + CAP2032D.LIB CAPI 2.0 development kit library including protocol functions. diff --git a/SOURCE/C20MSG.C b/SOURCE/C20MSG.C new file mode 100644 index 0000000..c32a20c --- /dev/null +++ b/SOURCE/C20MSG.C @@ -0,0 +1,184 @@ +/*--------------------------------------------------------------------------*\ + + C20MSG.C Version 1.1 1995 AVM + + CAPI 2.0 Messages + +\*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*\ + * Decode_Info: Returns a string with an error description + * Note: infos with values of 0x00xx are only warnings and the corresponding + * messages have been processed. + * The description for all info values but 0x34xx is taken from the CAPI 2.0 + * specification february 1994. + * The description for the 0x34xx values is taken from ETS 300 102-1/Q.931 +\*--------------------------------------------------------------------------*/ +char *Decode_Info (unsigned int Info) { + switch (Info) { + +/*-- informative values (corresponding message was processed) -----*/ + case 0x0001: return "NCPI not supported by current protocol, NCPI ignored"; + case 0x0002: return "Flags not supported by current protocol, flags ignored"; + case 0x0003: return "Alert already sent by another application"; + +/*-- error information concerning CAPI_REGISTER -----*/ + case 0x1001: return "Too many applications"; + case 0x1002: return "Logical block size to small, must be at least 128 Bytes"; + case 0x1003: return "Buffer exceeds 64 kByte"; + case 0x1004: return "Message buffer size too small, must be at least 1024 Bytes"; + case 0x1005: return "Max. number of logical connections not supported"; + case 0x1006: return "Reserved"; + case 0x1007: return "The message could not be accepted because of an internal busy condition"; + case 0x1008: return "OS resource error (no memory ?)"; + case 0x1009: return "CAPI not installed"; + case 0x100A: return "Controller does not support external equipment"; + case 0x100B: return "Controller does only support external equipment"; + +/*-- error information concerning message exchange functions -----*/ + case 0x1101: return "Illegal application number"; + case 0x1102: return "Illegal command or subcommand or message length less than 12 bytes"; + case 0x1103: return "The message could not be accepted because of a queue full condition !! The error code does not imply that CAPI cannot receive messages directed to another controller, PLCI or NCCI"; + case 0x1104: return "Queue is empty"; + case 0x1105: return "Queue overflow, a message was lost !! This indicates a configuration error. The only recovery from this error is to perform a CAPI_RELEASE"; + case 0x1106: return "Unknown notification parameter"; + case 0x1107: return "The Message could not be accepted because of an internal busy condition"; + case 0x1108: return "OS Resource error (no memory ?)"; + case 0x1109: return "CAPI not installed"; + case 0x110A: return "Controller does not support external equipment"; + case 0x110B: return "Controller does only support external equipment"; + +/*-- error information concerning resource / coding problems -----*/ + case 0x2001: return "Message not supported in current state"; + case 0x2002: return "Illegal Controller / PLCI / NCCI"; + case 0x2003: return "Out of PLCI"; + case 0x2004: return "Out of NCCI"; + case 0x2005: return "Out of LISTEN"; + case 0x2006: return "Out of FAX resources (protocol T.30)"; + case 0x2007: return "Illegal message parameter coding"; + +/*-- error information concerning requested services -----*/ + case 0x3001: return "B1 protocol not supported"; + case 0x3002: return "B2 protocol not supported"; + case 0x3003: return "B3 protocol not supported"; + case 0x3004: return "B1 protocol parameter not supported"; + case 0x3005: return "B2 protocol parameter not supported"; + case 0x3006: return "B3 protocol parameter not supported"; + case 0x3007: return "B protocol combination not supported"; + case 0x3008: return "NCPI not supported"; + case 0x3009: return "CIP Value unknown"; + case 0x300A: return "Flags not supported (reserved bits)"; + case 0x300B: return "Facility not supported"; + case 0x300C: return "Data length not supported by current protocol"; + case 0x300D: return "Reset procedure not supported by current protocol"; + +/*-- informations about the clearing of a physical connection -----*/ + case 0x3301: return "Protocol error layer 1 (broken line or B-channel removed by signalling protocol)"; + case 0x3302: return "Protocol error layer 2"; + case 0x3303: return "Protocol error layer 3"; + case 0x3304: return "Another application got that call"; +/*-- T.30 specific reasons -----*/ + case 0x3311: return "Connecting not successful (remote station is no FAX G3 machine)"; + case 0x3312: return "Connecting not successful (training error)"; + case 0x3313: return "Disconnected before transfer (remote station does not support transfer mode, e.g. resolution)"; + case 0x3314: return "Disconnected during transfer (remote abort)"; + case 0x3315: return "Disconnected during transfer (remote procedure error, e.g. unsuccessful repetition of T.30 commands)"; + case 0x3316: return "Disconnected during transfer (local tx data underrun)"; + case 0x3317: return "Disconnected during transfer (local rx data overflow)"; + case 0x3318: return "Disconnected during transfer (local abort)"; + case 0x3319: return "Illegal parameter coding (e.g. SFF coding error)"; + +/*-- disconnect causes from the network according to ETS 300 102-1/Q.931 -----*/ + case 0x3481: return "Unallocated (unassigned) number"; + case 0x3482: return "No route to specified transit network"; + case 0x3483: return "No route to destination"; + case 0x3486: return "Channel unacceptable"; + case 0x3487: return "Call awarded and being delivered in an established channel"; + case 0x3490: return "Normal call clearing"; + case 0x3491: return "User busy"; + case 0x3492: return "No user responding"; + case 0x3493: return "No answer from user (user alerted)"; + case 0x3495: return "Call rejected"; + case 0x3496: return "Number changed"; + case 0x349A: return "Non-selected user clearing"; + case 0x349B: return "Destination out of order"; + case 0x349C: return "Invalid number format"; + case 0x349D: return "Facility rejected"; + case 0x349E: return "Response to STATUS ENQUIRY"; + case 0x349F: return "Normal, unspecified"; + case 0x34A2: return "No circuit / channel available"; + case 0x34A6: return "Network out of order"; + case 0x34A9: return "Temporary failure"; + case 0x34AA: return "Switching equipment congestion"; + case 0x34AB: return "Access information discarded"; + case 0x34AC: return "Requested circuit / channel not available"; + case 0x34AF: return "Resources unavailable, unspecified"; + case 0x34B1: return "Quality of service unavailable"; + case 0x34B2: return "Requested facility not subscribed"; + case 0x34B9: return "Bearer capability not authorized"; + case 0x34BA: return "Bearer capability not presently available"; + case 0x34BF: return "Service or option not available, unspecified"; + case 0x34C1: return "Bearer capability not implemented"; + case 0x34C2: return "Channel type not implemented"; + case 0x34C5: return "Requested facility not implemented"; + case 0x34C6: return "Only restricted digital information bearer capability is available"; + case 0x34CF: return "Service or option not implemented, unspecified"; + case 0x34D1: return "Invalid call reference value"; + case 0x34D2: return "Identified channel does not exist"; + case 0x34D3: return "A suspended call exists, but this call identity does not"; + case 0x34D4: return "Call identity in use"; + case 0x34D5: return "No call suspended"; + case 0x34D6: return "Call having the requested call identity has been cleared"; + case 0x34D8: return "Incompatible destination"; + case 0x34DB: return "Invalid transit network selection"; + case 0x34DF: return "Invalid message, unspecified"; + case 0x34E0: return "Mandatory information element is missing"; + case 0x34E1: return "Message type non-existent or not implemented"; + case 0x34E2: return "Message not compatible with call state or message type non-existent or not implemented"; + case 0x34E3: return "Information element non-existent or not implemented"; + case 0x34E4: return "Invalid information element contents"; + case 0x34E5: return "Message not compatible with call state"; + case 0x34E6: return "Recovery on timer expiry"; + case 0x34EF: return "Protocol error, unspecified"; + case 0x34FF: return "Interworking, unspecified"; + + default: return "No additional information"; + } +} + +/*---------------------------------------------------------------------------*\ + * Decode_Command: Returns a textstring with the CAPI-commandname +\*---------------------------------------------------------------------------*/ +char *Decode_Command (unsigned char Command) { + switch (Command) { + case 0x01: return "ALERT"; + case 0x02: return "CONNECT"; + case 0x03: return "CONNECT_ACTIVE"; + case 0x04: return "DISCONNECT"; + case 0x05: return "LISTEN"; + case 0x08: return "INFO"; + case 0x41: return "SELECT_B_PROTOCOL"; + case 0x80: return "FACILITY"; + case 0x82: return "CONNECT_B3"; + case 0x83: return "CONNECT_B3_ACTIVE"; + case 0x84: return "DISCONNECT_B3"; + case 0x86: return "DATA_B3"; + case 0x87: return "RESET_B3"; + case 0x88: return "CONNECT_B3_T90_ACTIVE"; + case 0xff: return "MANUFACTURER"; + } + return "Error: Command undefined in function Decode_Command"; +} + +/*--------------------------------------------------------------------------*\ + * Decode_Sub: Returns a textstring with the CAPI-subcommandname +\*--------------------------------------------------------------------------*/ +char *Decode_Sub (unsigned char Sub) { + switch (Sub) { + case 0x80: return "REQ"; /*----- Request -----*/ + case 0x81: return "CONF"; /*----- Confirmation -----*/ + case 0x82: return "IND"; /*----- Indication -----*/ + case 0x83: return "RESP"; /*----- Response -----*/ + } + return "Error: Subcommand undefined in function Decode_Sub"; +} diff --git a/SOURCE/C20MSG.H b/SOURCE/C20MSG.H new file mode 100644 index 0000000..8ea525f --- /dev/null +++ b/SOURCE/C20MSG.H @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------*\ + + C20MSG.H Version 1.1 1995 AVM + + CAPI 2.0 Messages + +\*--------------------------------------------------------------------------*/ +#ifndef _c20msg_h_ +#define _c20msg_h_ + + +/*--------------------------------------------------------------------------*\ + * Decode_Info: Returns a string with an error description + * Note: infos with values of 0x00xx are only warnings and the corresponding + * messages have been processed. + * The description for all info values but 0x34xx is taken from the CAPI 2.0 + * specification february 1994. + * The description for the 0x34xx values is taken from ETS 300 102-1/Q.931 +\*--------------------------------------------------------------------------*/ +char *Decode_Info (unsigned int Info); + +/*---------------------------------------------------------------------------*\ + * Decode_Command: Returns a textstring with the CAPI-commandname +\*---------------------------------------------------------------------------*/ +char *Decode_Command (unsigned char Command); + +/*--------------------------------------------------------------------------*\ + * Decode_Sub: Returns a textstring with the CAPI-subcommandname +\*--------------------------------------------------------------------------*/ +char *Decode_Sub (unsigned char Sub); + + +#endif /*----- _c20msg_h_ -----*/ diff --git a/SOURCE/CAPI.C b/SOURCE/CAPI.C new file mode 100644 index 0000000..dfb485c --- /dev/null +++ b/SOURCE/CAPI.C @@ -0,0 +1,300 @@ +/*--------------------------------------------------------------------------*\ + + CAPI.C Version 1.1 1995 AVM + + Implementation of CAPI state machine + +\*--------------------------------------------------------------------------*/ +#include + +#include "capi20.h" +#include "connect.h" +#include "data.h" +#include "init.h" +#include "capi.h" +#include "id.h" + +#define BC NULL +#define LLC NULL +#define HLC NULL +#define B1Protokoll 1 +#define B2Protokoll 1 +#define B3Protokoll 0 +#define B1Configuration NULL +#define B2Configuration NULL +#define B3Configuration NULL +#define Flags 0 +#define NCPI (_cstruct)NULL + +static _cmsg CMESSAGE; +static _cmsg __far *CMSG = &CMESSAGE; /*----- used in all requests and responses -----*/ + + +/*--------------------------------------------------------------------------*\ + * SetState: Set the state internal and informs the user +\*--------------------------------------------------------------------------*/ +static void ChangeState (ConnectionID Con, + ConnectionState State) { + + SetState (Con, State); + /*----- signal the status change to the user -----*/ + StateChange (Con, State); +} + +/*--------------------------------------------------------------------------*\ + * Handle_Indication: CAPI logic for all indications +\*--------------------------------------------------------------------------*/ +void Handle_Indication(void) { + ConnectionID Connection; + + switch (CMSG->Command) { + + case CAPI_CONNECT: + Connection = GetConnectionByPLCI (CONNECT_IND_PLCI(CMSG)); + if (Connection == INVALID_CONNECTION_ID) { + + /*----- incoming call -----*/ + Connection = AllocConnection(); + if (Connection == INVALID_CONNECTION_ID) { + + /*----- error no internal resources -----*/ + /*----- reject call -----*/ + CONNECT_RESP(CMSG, Appl_Id, CMSG->Messagenumber, CONNECT_IND_PLCI(CMSG), REJECT, + 0, 0, 0, NULL, NULL, NULL, + NULL, NULL, NULL, + NULL, NULL, NULL, NULL); + return; + } + SetConnectionPLCI(Connection, CONNECT_IND_PLCI(CMSG)); + } + + SetCallingPartyNumberStruct (Connection, CONNECT_IND_CALLINGPARTYNUMBER(CMSG)); + + /*----- The ALERT_REQuest tells the caller that someone is listening -----*/ + /*----- for incoming calls on the line. A new timeout of 2 minutes is set -----*/ + /*----- Without the ALERT_REQuest a disconnect would be sent after -----*/ + /*----- 4 seconds with the cause "no user responding" on the caller side -----*/ + /*----- (Assumed that no CONNECT_RESPonse is sent in this time) -----*/ + /*----- If the application -----*/ + ALERT_REQ (CMSG, Appl_Id, 0, CONNECT_IND_PLCI(CMSG), + NULL, NULL, NULL, NULL); + + /*----- inform the user application -----*/ + SetState(Connection, D_ConnectPending); + IncomingCall(Connection, GetCallingPartyNumber (Connection)); + + ChangeState(Connection, D_ConnectPending); + /*----- signal incoming call to the user -----*/ + return; + + case CAPI_CONNECT_ACTIVE: + Connection = GetConnectionByPLCI (CONNECT_ACTIVE_IND_PLCI(CMSG)); + CONNECT_ACTIVE_RESP(CMSG, Appl_Id, CMSG->Messagenumber, CONNECT_ACTIVE_IND_PLCI(CMSG)); + ChangeState(Connection, D_Connected); + if (GetConnectionInitiator (Connection)) { + CONNECT_B3_REQ(CMSG, Appl_Id, 0, CONNECT_ACTIVE_IND_PLCI(CMSG), NCPI); + } + return; + + case CAPI_CONNECT_B3: + Connection = GetConnectionByPLCI (CONNECT_B3_IND_NCCI(CMSG) & 0x0000FFFF); + SetConnectionNCCI (Connection, CONNECT_B3_IND_NCCI(CMSG)); + CONNECT_B3_RESP(CMSG, Appl_Id, CMSG->Messagenumber, CONNECT_B3_IND_NCCI(CMSG), 0, NCPI); + ChangeState(Connection, B_ConnectPending); + return; + + case CAPI_CONNECT_B3_ACTIVE: + Connection = GetConnectionByNCCI (CONNECT_B3_ACTIVE_IND_NCCI(CMSG)); + SetConnectionInitiator (Connection, FALSE); + CONNECT_B3_ACTIVE_RESP(CMSG, Appl_Id, CMSG->Messagenumber, CONNECT_B3_ACTIVE_IND_NCCI(CMSG)); + ChangeState(Connection, Connected); + return; + + case CAPI_DISCONNECT_B3: + Connection = GetConnectionByNCCI(DISCONNECT_B3_IND_NCCI(CMSG)); + SetConnectionNCCI (Connection, INVAL_NCCI); + DISCONNECT_B3_RESP(CMSG, Appl_Id, CMSG->Messagenumber, DISCONNECT_B3_IND_NCCI(CMSG)); + ChangeState(Connection, D_Connected); + if (GetConnectionInitiator(Connection)) { + DISCONNECT_REQ(CMSG, Appl_Id, 0, GetConnectionPLCI(Connection), NULL, NULL, NULL, NULL); + } + return; + + case CAPI_DISCONNECT: + DISCONNECT_RESP(CMSG, Appl_Id, CMSG->Messagenumber, DISCONNECT_IND_PLCI(CMSG)); + Connection = GetConnectionByPLCI(DISCONNECT_IND_PLCI(CMSG)); + if (Connection != INVALID_CONNECTION_ID) { + ChangeState(Connection, Disconnected); + FreeConnection(Connection); + } + return; + + case CAPI_DATA_B3: + Connection = GetConnectionByNCCI(DATA_B3_IND_NCCI(CMSG)); + if (CMSG->DataLength > 0) { + int DiscardData = TRUE; + + DataAvailable(Connection, + (void __far *)DATA_B3_IND_DATA(CMSG), + DATA_B3_IND_DATALENGTH(CMSG), + DATA_B3_IND_DATAHANDLE(CMSG), + &DiscardData); + + if (DiscardData) + /*----- let CAPI free the data area immediately -----*/ + DATA_B3_RESP(CMSG, Appl_Id, CMSG->Messagenumber, DATA_B3_IND_NCCI(CMSG), DATA_B3_IND_DATAHANDLE(CMSG)); + } + return; + + case CAPI_INFO: + INFO_RESP(CMSG, Appl_Id, CMSG->Messagenumber, INFO_IND_PLCI(CMSG)); + return; + + default: + puts("Error: Indication not handled in function Handle_Indication"); + return; + } +} + +/*--------------------------------------------------------------------------*\ + * Handle_Confirmation: CAPI logic for all confirmations +\*--------------------------------------------------------------------------*/ +static void Handle_Confirmation(void) { + ConnectionID Connection; + + if (CMSG->Info > 0x00FF) { /*----- Info's with value 0x00xx are only -----*/ + /*----- warnings, the corresponding requests -----*/ + /*----- have been processed -----*/ + printf("Error: Info value 0x%x indicates error, function Handle_Confirmation\n", CMSG->Info); + + /*----- This branch is executed if an error has occurred -----*/ + + switch (CMSG->Command) { + case CAPI_CONNECT: + Connection = CMSG->Messagenumber; + ChangeState (Connection, D_ConnectPending); + ChangeState (Connection, Disconnected); + FreeConnection(Connection); + break; + + case CAPI_DATA_B3: + /*----- return the error value -----*/ + Connection = GetConnectionByNCCI(DATA_B3_CONF_NCCI(CMSG)); + DataConf(Connection, DATA_B3_CONF_DATAHANDLE(CMSG), + DATA_B3_CONF_INFO(CMSG)); + break; + + case CAPI_CONNECT_B3: + /*----- disconnect line -----*/ + Connection = GetConnectionByPLCI(CONNECT_B3_CONF_NCCI(CMSG) & 0x0000FFFF); + if (Connection == INVALID_CONNECTION_ID) + puts("Error: invalid PLCI in CONNECT_B3_CONF in function Handle_Confirmation"); + else + DISCONNECT_REQ(CMSG, Appl_Id, 0, GetConnectionPLCI(Connection), NULL, NULL, NULL, NULL); + break; + + case CAPI_DISCONNECT: + Connection = GetConnectionByPLCI(DISCONNECT_CONF_PLCI(CMSG)); + if (Connection == INVALID_CONNECTION_ID) + puts("Error: invalid PLCI in DISCONNECT_CONF in function Handle_Confirmation"); + break; + + case CAPI_DISCONNECT_B3: + Connection = GetConnectionByNCCI(DISCONNECT_B3_CONF_NCCI(CMSG)); + if (Connection == INVALID_CONNECTION_ID) + puts("Error: invalid NCCI in DISCONNECT_B3_CONF in function Handle_Confirmation"); + break; + case CAPI_LISTEN: + puts("Error: Info != 0 in LISTEN_CONF in function Handle_Confirmation"); + break; + case CAPI_INFO: + puts("Error: Info != 0 in INFO_CONF in function Handle_Confirmation"); + break; + case CAPI_ALERT: + puts("Error: Info != 0 in ALERT_CONF in function Handle_Confirmation"); + break; + } + + } else { /*----- no error -----*/ + + switch (CMSG->Command) { + case CAPI_CONNECT: + Connection = CMSG->Messagenumber; + SetConnectionPLCI(Connection, CONNECT_CONF_PLCI(CMSG)); + SetConnectionInitiator(Connection, TRUE); + ChangeState(Connection, D_ConnectPending); + return; + + case CAPI_CONNECT_B3: + Connection = GetConnectionByPLCI(CONNECT_B3_CONF_NCCI(CMSG) & 0x0000FFFF); + SetConnectionNCCI(Connection, CONNECT_B3_CONF_NCCI(CMSG)); + ChangeState(Connection, B_ConnectPending); + return; + + case CAPI_DISCONNECT: + Connection = GetConnectionByPLCI(DISCONNECT_CONF_PLCI(CMSG)); + if (Connection != INVALID_CONNECTION_ID) { + ChangeState(Connection, D_DisconnectPending); + } + return; + + case CAPI_DISCONNECT_B3: + Connection = GetConnectionByNCCI(DISCONNECT_B3_CONF_NCCI(CMSG)); + SetConnectionInitiator(Connection, TRUE); + ChangeState(Connection, B_DisconnectPending); + return; + + case CAPI_DATA_B3: + Connection = GetConnectionByNCCI(DATA_B3_CONF_NCCI(CMSG)); + DataConf(Connection, DATA_B3_CONF_DATAHANDLE(CMSG), + DATA_B3_CONF_INFO(CMSG)); + return; + case CAPI_LISTEN: + return; + case CAPI_INFO: + return; + case CAPI_ALERT: + return; + default: + puts("Error: Confirmation not handled in function Handle_Confirmation"); + return; + } + } +} + +/*--------------------------------------------------------------------------*\ + * Handle_CAPI_Msg: the main routine, checks for messages and handles them +\*--------------------------------------------------------------------------*/ +void Handle_CAPI_Msg(void) { + MESSAGE_EXCHANGE_ERROR Info; + int count; + + count=0; + do { + switch (Info = CAPI_GET_CMSG(CMSG, Appl_Id)) { + case 0x0000: /*----- a message has been read -----*/ + switch (CMSG->Subcommand) { + case CAPI_CONF: + Handle_Confirmation(); + break; + + case CAPI_IND: + Handle_Indication(); + break; + + default: /*----- neither indication nor confirmation ???? -----*/ + puts("Error: Unknown subcommand in function Handle_CAPI_Msg"); + return; + } + break; + + case 0x1104: + return; /*----- messagequeue is empty -----*/ + + default: + puts("Error: CAPI_GET_CMSG returns Info != 0 in function Handle_CAPI_Msg"); + return; + } + count++; + } while (count < 6); /*----- CAPI is checked maximal 5 times before returning -----*/ +} diff --git a/SOURCE/CAPI.H b/SOURCE/CAPI.H new file mode 100644 index 0000000..5fc4bc9 --- /dev/null +++ b/SOURCE/CAPI.H @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------*\ + + CAPI.H Version 1.1 1995 AVM + + Header file for CAPI.C + +\*--------------------------------------------------------------------------*/ +#ifndef _capi_h_ +#define _capi_h_ + + +/*--------------------------------------------------------------------------*\ + * Handle_CAPI_Msg: the main routine, checks for messages and handles them +\*--------------------------------------------------------------------------*/ +void Handle_CAPI_Msg(void); + + +#endif /*----- _capi_h_ -----*/ diff --git a/SOURCE/CONNECT.C b/SOURCE/CONNECT.C new file mode 100644 index 0000000..cf0d30d --- /dev/null +++ b/SOURCE/CONNECT.C @@ -0,0 +1,209 @@ +/*--------------------------------------------------------------------------*\ + + CONNECT.C Version 1.1 1995 AVM + + Functions concerning activation and deactivation of connections + +\*--------------------------------------------------------------------------*/ +#include +#include +#include + +#include "capi20.h" +#include "contr.h" +#include "init.h" +#include "connect.h" +#include "main.h" + +/*--------------------------------------------------------------------------*\ + * Listen: send a LISTEN_REQ + * parameters: CIPmask (which services shall be accepted) (see CAPI 2.0 spec.) + * Listen will be sent to the number of controllers specified in InitISDN. + * Listen with CIPmask = 0 results in getting no incoming calls signaled + * by CAPI. +\*--------------------------------------------------------------------------*/ +unsigned Listen(unsigned long CIPmask) { + MESSAGE_EXCHANGE_ERROR error; + _cmsg CMSG; + unsigned Controller; + unsigned numController; + + /*----- send listen to all controllers -----*/ + numController = GetNumController(); + for (Controller=1; Controller<=numController; Controller++) { + LISTEN_REQ_HEADER(&CMSG, Appl_Id, 0, Controller); + LISTEN_REQ_CIPMASK(&CMSG) = CIPmask; + if ((error = CAPI_PUT_CMSG(&CMSG)) != 0) + return error; + } + return 0; +} + +/*--------------------------------------------------------------------------*\ + * Connect: try's to connect to 'CalledPartyNumber' + * the return value of CAPI_PUT_CMSG is the same as CAPI_PUT_MESSAGE + * (defined in CAPI 2.0 spec. error class 0x11xx ) + * If CallingPartyNumber is not needed, set to NULL. + * CallingPartyNumber & CalledPartyNumber have to be zero terminated strings. + * For datatransmission set the protocols to zero, B3Configuration to NULL +\*--------------------------------------------------------------------------*/ +unsigned Connect(ConnectionID *Connection, + char *CalledPartyNumber, + char *CallingPartyNumber, + unsigned long Service, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration) { + + + _cmsg CMSG; + MESSAGE_EXCHANGE_ERROR error; + long Controller; + unsigned short CIPValue; + + assert (*Connection == INVALID_CONNECTION_ID); + + Controller = GetFreeController(); + if (Controller == INVAL_CONTROLLER) { + /*----- if no available controller use the first one for correct -----*/ + /*----- error signaling -----*/ + Controller = 1; + } + *Connection = AllocConnection(); + if (*Connection == INVALID_CONNECTION_ID) { + printf("Error: no available connection identifiers\n"); + /*----- no OS resources -----*/ + return 0x1108; + } + + /*----- use ConnectionIdentifier as Messagenumber -----*/ + CONNECT_REQ_HEADER(&CMSG, Appl_Id, (unsigned short)*Connection, Controller); + + /*----- build up service mask -----*/ + CIPValue = 0; + if (Service != 0) { + do { + if (Service & 1) break; + Service >>= 1; + CIPValue++; + } while (CIPValue<31); + } + CONNECT_REQ_CIPVALUE(&CMSG) = CIPValue; + + + SetCalledPartyNumber (*Connection, CalledPartyNumber); + SetCallingPartyNumber (*Connection, CallingPartyNumber); + + + CONNECT_REQ_CALLEDPARTYNUMBER(&CMSG) = GetCalledPartyNumberStruct(*Connection); + CONNECT_REQ_CALLINGPARTYNUMBER(&CMSG) = GetCallingPartyNumberStruct(*Connection); + CONNECT_REQ_B1PROTOCOL(&CMSG) = B1Protocol; + CONNECT_REQ_B2PROTOCOL(&CMSG) = B2Protocol; + CONNECT_REQ_B3PROTOCOL(&CMSG) = B3Protocol; + CONNECT_REQ_B3CONFIGURATION(&CMSG) = B3Configuration; + + error = CAPI_PUT_CMSG(&CMSG); + if (error != 0) { + FreeConnection (*Connection); + *Connection = INVALID_CONNECTION_ID; + printf("Connect: error in CAPI_PUT_MESSAGE\n"); + } + return error; + +/* + *all capi functions can also be called with all possible parameters specified + *direct in the function, e.g. + * + * error = CONNECT_REQ(&CMSG, Appl_Id, 0, + * Controller, CIPValue, + * CalledPartyNumber, CallingPartyNumber, + * CalledPartySubaddress, CallingPartySubaddress, + * B1Protokoll, B2Protokoll, B3Protokoll, + * B1Configuration, B2Configuration, B3Configuration, + * BC, LLC, HLC, + * NULL, NULL, NULL, NULL); + */ + +} + +/*--------------------------------------------------------------------------*\ + * Disconnect: disconnects one channel + * The ConnectionID must be valid +\*--------------------------------------------------------------------------*/ +unsigned Disconnect(ConnectionID Connection) { + _cmsg CMSG; + MESSAGE_EXCHANGE_ERROR error; + + assert (Connection != INVALID_CONNECTION_ID); + + switch (GetState(Connection)) { + case Connected: + case B_ConnectPending: + SetConnectionInitiator (Connection, TRUE); + DISCONNECT_B3_REQ_HEADER(&CMSG, Appl_Id, 0, GetConnectionNCCI (Connection)); + error = CAPI_PUT_CMSG(&CMSG); + break; + + case D_Connected: + case D_ConnectPending: + case B_DisconnectPending: + SetConnectionInitiator (Connection, TRUE); + DISCONNECT_REQ_HEADER(&CMSG, Appl_Id, 0, GetConnectionPLCI (Connection)); + error = CAPI_PUT_CMSG(&CMSG); + break; + + default: + error = 0; + break; + } + return error; +} + +/*--------------------------------------------------------------------------*\ + * IncomingCall: signals an incoming call + * This function will be executed if a CONNECT_INDication appears to + * inform the user. This function is implemented in the main program +\*--------------------------------------------------------------------------*/ +void IncomingCall(ConnectionID Connection, + char *CallingPartyNumber) { + + MainIncomingCall(Connection, CallingPartyNumber); +} + +/*--------------------------------------------------------------------------*\ + * AnswerCall: answers incoming call with the specified reject-value + * (some reject-values are defined in the req.h file) + * (for more see CAPI 2.0 spec.) +\*--------------------------------------------------------------------------*/ +unsigned AnswerCall(ConnectionID Connection, + RejectValue Reject, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration) { + + _cmsg CMSG; + + assert (Connection != INVALID_CONNECTION_ID); + + CONNECT_RESP_HEADER(&CMSG, Appl_Id, 0, GetConnectionPLCI (Connection)); + CONNECT_RESP_REJECT(&CMSG) = (unsigned short)Reject; + CONNECT_REQ_B1PROTOCOL(&CMSG) = B1Protocol; + CONNECT_REQ_B2PROTOCOL(&CMSG) = B2Protocol; + CONNECT_REQ_B3PROTOCOL(&CMSG) = B3Protocol; + CONNECT_REQ_B3CONFIGURATION(&CMSG) = B3Configuration; + + return CAPI_PUT_CMSG(&CMSG); +} + +/*--------------------------------------------------------------------------*\ + * StateChange: signals a state change on both B-channels (connected, disconnected) + * Whenever a channel changes his state this function is called + * This function is implemented in the main program +\*--------------------------------------------------------------------------*/ +void StateChange(ConnectionID Connection, + ConnectionState State) { + + MainStateChange(Connection, State); +} diff --git a/SOURCE/CONNECT.H b/SOURCE/CONNECT.H new file mode 100644 index 0000000..e0d3c98 --- /dev/null +++ b/SOURCE/CONNECT.H @@ -0,0 +1,88 @@ +/*--------------------------------------------------------------------------*\ + + CONNECT.H Version 1.1 1995 AVM + + Header file for CONNECT.C + +\*--------------------------------------------------------------------------*/ +#ifndef _connect_h_ +#define _connect_h_ + + +#include "id.h" + +/*--------------------------------------------------------------------------*\ + * Listen: send a LISTEN_REQ + * parameters: CIPmask (which services shall be accepted) (see CAPI 2.0 spec.) + * Listen will be sent to the number of controllers specified in InitISDN. + * Listen with CIPmask = 0 results in getting no incoming calls signaled + * by CAPI. +\*--------------------------------------------------------------------------*/ +#define NO_SERVICES 0x00000000 +#define ALL_SERVICES 0x1FFF03FF +#define SPEECH 0x00000002 +#define DATA_TRANSFER 0x00000004 +#define AUDIO3_1KHZ 0x00000010 +#define TELEPHONY 0x00010000 +#define FAX_GROUP2_3 0x00020000 + +unsigned Listen(unsigned long CIPmask); + +/*--------------------------------------------------------------------------*\ + * Connect: try's to connect to 'CalledPartyNumber' + * the return value of CAPI_PUT_CMSG is the same as CAPI_PUT_MESSAGE + * (defined in CAPI 2.0 spec. error class 0x11xx ) + * If CallingPartyNumber is not needed, set to NULL. + * CallingPartyNumber & CalledPartyNumber have to be zero terminated strings. + * For datatransmission set the protocols to zero, B3Configuration to NULL +\*--------------------------------------------------------------------------*/ +unsigned Connect(ConnectionID *Connection, + char *CalledPartyNumber, + char *CallingPartyNumber, + unsigned long Service, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration); + +/*--------------------------------------------------------------------------*\ + * Disconnect: disconnects one channel + * The ConnectionID must be valid +\*--------------------------------------------------------------------------*/ +unsigned Disconnect(ConnectionID Connection); + +/*--------------------------------------------------------------------------*\ + * IncomingCall: signals an incoming call + * This function will be executed if a CONNECT_INDication appears to + * inform the user. This function has to be implemented in the main program +\*--------------------------------------------------------------------------*/ +void IncomingCall(ConnectionID Connection, + char *CallingPartyNumber); + +/*--------------------------------------------------------------------------*\ + * AnswerCall: answers incoming call with the specified reject-value + * (for more see CAPI 2.0 spec.) +\*--------------------------------------------------------------------------*/ +typedef enum _RejectValue { + ACCEPT, + IGNORE, + REJECT +} RejectValue; + +unsigned AnswerCall(ConnectionID Connection, + RejectValue Reject, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration); + +/*--------------------------------------------------------------------------*\ + * StateChange: signals a state change on both B-channels (connected, disconnected) + * Whenever a channel changes his state this function is called + * This function has to be implemented in the main program +\*--------------------------------------------------------------------------*/ +void StateChange(ConnectionID Connection, + ConnectionState State); + + +#endif /*----- _connect_h_ -----*/ diff --git a/SOURCE/CONTR.C b/SOURCE/CONTR.C new file mode 100644 index 0000000..6aa1ef4 --- /dev/null +++ b/SOURCE/CONTR.C @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------*\ + + CONTR.C Version 1.1 1995 AVM + + Functions concerning physical conntrollers + +\*--------------------------------------------------------------------------*/ +#include + +#include "contr.h" +#include "id.h" +#include "os.h" + +/*--------------------------------------------------------------------------*\ + * GetNumController: Returns the number of controllers detected by CAPI +\*--------------------------------------------------------------------------*/ +unsigned GetNumController(void) { + + unsigned short Buffer[64 / sizeof (unsigned short)]; + + /*----- retrieve the number of installed controllers -----*/ + CAPI20_GET_PROFILE (0, (unsigned char *)Buffer); + return (unsigned)Buffer[0]; +} + +/*--------------------------------------------------------------------------*\ + * GetNumOfSupportedBChannels: Returns the number of supported B-channels + * for the specified controller +\*--------------------------------------------------------------------------*/ +unsigned GetNumOfSupportedBChannels (long Controller) { + + unsigned short Buffer[64 / sizeof (unsigned short)]; + + assert (Controller != INVAL_CONTROLLER); + + /*----- retrieve controller specific information -----*/ + CAPI20_GET_PROFILE((unsigned)Controller, (unsigned char *)Buffer); + return (unsigned)Buffer[1]; +} + +/*--------------------------------------------------------------------------*\ + * GetFreeController: Returns the number of the first controller that has + * one free B-channel, or INVAL_CONTROLLER if none found. +\*--------------------------------------------------------------------------*/ +long GetFreeController(void) { + + long Controller; + int numController; + + numController = GetNumController (); + + for (Controller = 1; Controller <= numController; Controller++) { + if (GetNumOfSupportedBChannels (Controller) > GetNumberOfConnections (Controller)) { + return Controller; + } + } + return INVAL_CONTROLLER; +} diff --git a/SOURCE/CONTR.H b/SOURCE/CONTR.H new file mode 100644 index 0000000..a30b23d --- /dev/null +++ b/SOURCE/CONTR.H @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------*\ + + CONTR.H Version 1.1 1995 AVM + + Header file for CONTR.C + +\*--------------------------------------------------------------------------*/ +#ifndef _contr_h_ +#define _contr_h_ + +/*--------------------------------------------------------------------------*\ + * GetNumController: Returns the number of controllers detected by CAPI +\*--------------------------------------------------------------------------*/ +unsigned GetNumController (void); + +/*--------------------------------------------------------------------------*\ + * GetNumOfSupportedBChannels: Returns the number of supported B-channels + * for the specified controller +\*--------------------------------------------------------------------------*/ +unsigned GetNumOfSupportedBChannels (long Controller); + +/*--------------------------------------------------------------------------*\ + * GetFreeController: Returns the number of the first controller that has + * one free B-channel, or INVAL_CONTROLLER if none found. +\*--------------------------------------------------------------------------*/ +long GetFreeController (void); + + +#endif /*----- _contr_h_ -----*/ diff --git a/SOURCE/DATA.C b/SOURCE/DATA.C new file mode 100644 index 0000000..064620b --- /dev/null +++ b/SOURCE/DATA.C @@ -0,0 +1,85 @@ +/*--------------------------------------------------------------------------*\ + + DATA.C Version 1.1 1995 AVM + + Functions concerning data transmission + +\*--------------------------------------------------------------------------*/ +#include + +#include "capi20.h" +#include "id.h" +#include "init.h" +#include "data.h" +#include "main.h" + +/*--------------------------------------------------------------------------*\ + * SendData: Sends one block with data over the specified channel +\*--------------------------------------------------------------------------*/ +unsigned SendData(ConnectionID Connection, + void __far *Data, + unsigned short DataLength, + unsigned short DataHandle) { + + _cmsg CMSG; + + assert (Connection != INVALID_CONNECTION_ID); + assert (GetState(Connection) == Connected); + + DATA_B3_REQ_HEADER(&CMSG, Appl_Id, 0, GetConnectionNCCI(Connection)); + DATA_B3_REQ_DATA(&CMSG) = (unsigned long)Data; + DATA_B3_REQ_DATALENGTH(&CMSG) = DataLength; + DATA_B3_REQ_DATAHANDLE(&CMSG) = DataHandle; + + return CAPI_PUT_CMSG(&CMSG); +} + +/*--------------------------------------------------------------------------*\ + * DataConf: signals the successful sending of a datablock + * This function is called after receiving a DATA_B3_CONFirmation. CAPI signals + * that the datablock identified by DataHandle has been sent and the memory + * area may be freed. The DataHandle is the same as specified in SendBlock. + * This function is implemented in the main program. +\*--------------------------------------------------------------------------*/ +void DataConf(ConnectionID Connection, + unsigned short DataHandle, + unsigned short Info) { + + MainDataConf(Connection, DataHandle, Info); +} + +/*--------------------------------------------------------------------------*\ + * DataAvailable: signals received data blocks + * This function is called after a DATA_B3_INDication is received. The flag + * DiscardData tells CAPI to free the memora area directly after the return + * of this function when set to TRUE (1) which is the preset. When the flag + * is set to FALSE (0) the data area MUST be freed later with ReleaseData. + * The datahandle identifies the memory area. When reaching 7 unconfirmed + * blocks, no more incoming data will be signaled until freeing at least + * one block. + * This function is implemented in the main program. +\*--------------------------------------------------------------------------*/ +void DataAvailable(ConnectionID Connection, + void __far *Data, + unsigned short DataLength, + unsigned short DataHandle, + int *DiscardData) { + + MainDataAvailable(Connection, Data, DataLength, DataHandle, DiscardData); +} + +/*--------------------------------------------------------------------------*\ + * ReleaseData: allows CAPI to reuse the memory area of the specified block. + * CAPI allows max. 7 unconfirmed Blocks. If the maximum of 7 is reached, + * no more DATA_B3_INDications will come up. +\*--------------------------------------------------------------------------*/ +unsigned ReleaseData(ConnectionID Connection, + unsigned short DataHandle) { + + _cmsg CMSG; + + assert (Connection != INVALID_CONNECTION_ID); + assert (GetState(Connection) == Connected); + + return DATA_B3_RESP(&CMSG, Appl_Id, 0, GetConnectionNCCI(Connection), DataHandle); +} diff --git a/SOURCE/DATA.H b/SOURCE/DATA.H new file mode 100644 index 0000000..6485af0 --- /dev/null +++ b/SOURCE/DATA.H @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------*\ + + DATA.H Version 1.1 1995 AVM + + Functions concerning data transmission + +\*--------------------------------------------------------------------------*/ +#ifndef _data_h_ +#define _data_h_ + + +#define SendBlockSize 2048 /*----- must not be greater than MaxB3DataBlockSize in req.c-----*/ + +/*--------------------------------------------------------------------------*\ + * SendData: Sends one block with data over the specified channel +\*--------------------------------------------------------------------------*/ +unsigned SendData(ConnectionID Connection, + void __far *Data, + unsigned short DataLength, + unsigned short DataHandle); + +/*--------------------------------------------------------------------------*\ + * DataConf: signals the successful sending of a datablock + * This function is called after receiving a DATA_B3_CONFirmation. CAPI signals + * that the datablock identified by DataHandle has been sent and the memory + * area may be freed. The DataHandle is the same as specified in SendBlock. + * This function is implemented in the main program. +\*--------------------------------------------------------------------------*/ +void DataConf(ConnectionID Connection, + unsigned short DataHandle, + unsigned short Info); + +/*--------------------------------------------------------------------------*\ + * DataAvailable: signals received data blocks + * This function is called after a DATA_B3_INDication is received. The flag + * DiscardData tells CAPI to free the memora area directly after the return + * of this function when set to TRUE (1) which is the preset. When the flag + * is set to FALSE (0) the data area MUST be freed later with ReleaseData. + * The datahandle identifies the memory area. When reaching 7 unconfirmed + * blocks, no more incoming data will be signaled until freeing at least + * one block. + * This function is implemented in the main program. +\*--------------------------------------------------------------------------*/ +void DataAvailable(ConnectionID Connection, + void __far *Data, + unsigned short DataLength, + unsigned short DataHandle, + int *DiscardData); + +/*--------------------------------------------------------------------------*\ + * ReleaseData: allows CAPI to reuse the memory area of the specified block. + * CAPI allows max. 7 unconfirmed Blocks. If the maximum of 7 is reached, + * no more DATA_B3_INDications will come up. +\*--------------------------------------------------------------------------*/ +unsigned ReleaseData(ConnectionID Connection, + unsigned short DataHandle); + +#endif /*----- _data_h_ -----*/ diff --git a/SOURCE/DEMO.PRT b/SOURCE/DEMO.PRT new file mode 100644 index 0000000..95811c7 --- /dev/null +++ b/SOURCE/DEMO.PRT @@ -0,0 +1,42 @@ ++--------------------------------------------------------------------- +| COMMON-ISDN-API Development Kit AVM-Berlin Version 2.0 +| +| Wed Feb 11 16:58:21 1998 ++--------------------------------------------------------------------- + +CONNECT_REQ ID=001 #0x0000 LEN=0040 00:00:02:36 + Controller/PLCI/NCCI = 0x00000001 + CIPValue = 0x0002 + CalledPartyNumber = <80>803 + CallingPartyNumber = default + CalledPartySubaddress = default + CallingPartySubaddress = default + BProtocol + B1protocol = 0x0000 + B2protocol = 0x0000 + B3protocol = 0x0000 + B1configuration = default + B2configuration = default + B3configuration = default + BC = default + LLC = default + HLC = default + AdditionalInfo + BChannelinformation = default + Keypadfacility = default + Useruserdata = default + Facilitydataarray = default + +CONNECT_CONF ID=001 #0x0000 LEN=0014 00:00:02:42 + Controller/PLCI/NCCI = 0x00000101 + Info = 0x0000 +***** state change slot 0 ID 0: D_ConnectPending ***** + +DISCONNECT_IND ID=001 #0x0002 LEN=0014 00:00:07:36 + Controller/PLCI/NCCI = 0x00000101 + Reason = 0x3301 +Reason 0x3301: Protocol error layer 1 (broken line or B-channel removed by signalling protocol) + +DISCONNECT_RESP ID=001 #0x0002 LEN=0012 00:00:07:42 + Controller/PLCI/NCCI = 0x00000101 +***** state change slot 0 ID 0: Disconnected ***** diff --git a/SOURCE/DOS/DEMO.PRT b/SOURCE/DOS/DEMO.PRT new file mode 100644 index 0000000..2690e57 --- /dev/null +++ b/SOURCE/DOS/DEMO.PRT @@ -0,0 +1,5 @@ ++--------------------------------------------------------------------- +| COMMON-ISDN-API Development Kit AVM-Berlin Version 2.0 +| +| Wed Feb 11 16:56:29 1998 ++--------------------------------------------------------------------- diff --git a/SOURCE/FAX.C b/SOURCE/FAX.C new file mode 100644 index 0000000..edce88d --- /dev/null +++ b/SOURCE/FAX.C @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------*\ + + FAX.C Version 1.1 1995 AVM + + Functions and constants used to FAX + +\*--------------------------------------------------------------------------*/ +#include + +#include "fax.h" + +char stationID[30] = "123456789012"; +char headLine [30] = "FAX with CAPI 2.0"; + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +void SetupB3Config(B3_PROTO_FAXG3 *B3conf, + int FAX_Format ) { + + int len1, len2; + + B3conf->resolution = 0; + B3conf->format = (unsigned short)FAX_Format; + + len1 = strlen( stationID ); + B3conf->Infos[0] = (unsigned char)len1; + strcpy( (char *)&B3conf->Infos[1], stationID ); + + len2 = strlen( headLine ); + B3conf->Infos[len1 + 1] = (unsigned char)len2; + strcpy( (char *)&B3conf->Infos[len1 + 2], headLine ); + B3conf->len = (unsigned char)(2 * sizeof( unsigned short ) + len1 + len2 + 2); +} diff --git a/SOURCE/FAX.H b/SOURCE/FAX.H new file mode 100644 index 0000000..f7c138d --- /dev/null +++ b/SOURCE/FAX.H @@ -0,0 +1,54 @@ +/*--------------------------------------------------------------------------*\ + + FAX.H Version 1.1 1995 AVM + + Header file for FAX.C + +\*--------------------------------------------------------------------------*/ +#ifndef _fax_h_ +#define _fax_h_ + + +/*----- FAX Resolutions -----------------------------------------------*/ +#define FAX_STANDARD_RESOLUTION 0 +#define FAX_HIGH_RESOLUTION 1 + +/*----- FAX Formats ---------------------------------------------------*/ +#define FAX_SFF_FORMAT 0 +#define FAX_PLAIN_FORMAT 1 +#define FAX_PCX_FORMAT 2 +#define FAX_DCX_FORMAT 3 +#define FAX_TIFF_FORMAT 4 +#define FAX_ASCII_FORMAT 5 +#define FAX_EXTENDED_ASCII_FORMAT 6 +#define FAX_BINARY_FILE_TRANSFER_FORMAT 7 + + +/*----- the pragma pack (1) directive tells the compiler to pack the -----*/ +/*----- members of the structure on 1 byte boundaries. The default is 2 -----*/ +#ifdef __linux__ +typedef struct fax3proto3 +{ unsigned char len; + unsigned short resolution __attribute__ ((packed));; + unsigned short format __attribute__ ((packed));; + unsigned char Infos[100] __attribute__ ((packed));; +} B3_PROTO_FAXG3; +#else +#pragma pack (1) +typedef struct fax3proto3 +{ unsigned char len; + unsigned short resolution; + unsigned short format; + unsigned char Infos[100]; +} B3_PROTO_FAXG3; +#pragma pack () +#endif + + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +void SetupB3Config(B3_PROTO_FAXG3 *B3conf, + int FAX_Format); + + +#endif /*----- _fax_h_ -----*/ diff --git a/SOURCE/FAXMAIN.C b/SOURCE/FAXMAIN.C new file mode 100644 index 0000000..17465b3 --- /dev/null +++ b/SOURCE/FAXMAIN.C @@ -0,0 +1,748 @@ +/*--------------------------------------------------------------------------*\ + + FAXMAIN.C Version 1.1 1995 AVM + + 's'+'S' Send fax + 'r'+'R' Receive fax + +\*--------------------------------------------------------------------------*/ +#if !defined (NDEBUG) +#define DEBUG +#define CPROT +#endif + +#include "os.h" +#include +#include +#include +#include +#include + +#include "capi20.h" +#include "c20msg.h" +#include "capi.h" +#include "connect.h" +#include "contr.h" +#include "data.h" +#include "id.h" +#include "init.h" +#include "fax.h" + + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +/*----- note: you may enter your own number here, but if you -----*/ +/*----- supply a wrong number, some PBXs may reject the -----*/ +/*----- CAPI messages containing the wrong number -----*/ +/*----- e.g.: static char *CallingPartyNumber = "1234567"; -----*/ +static char *CallingPartyNumber = NULL; + +static char CalledPartyNumberArr[40]; + +#ifdef DEBUG +static char CAPI_PROT_BUF[CAPI_PROTOCOL_INIT_BUF_SIZE]; +static char ProtocolFileName[80]; +static FILE *ProtocolFile; +#endif + +#define INVALID_SLOT -1 +#define maxSlots 2 /*----- this demo program handles max. -----*/ + /*----- two connections -----*/ +static ConnectionID Slot[maxSlots]; + + +#define B1PROTOCOL 4 +#define B2PROTOCOL 4 +#define B3PROTOCOL 4 + + +#define QueueSize 8 + +typedef struct __DataElement { + char DATA[SendBlockSize]; + unsigned short DATA_LENGTH; + unsigned SENT; +} _DataElement; + +typedef struct __DataQueue { + _DataElement Element[QueueSize]; + unsigned Head; + unsigned Tail; + unsigned Fill; +} _DataQueue; + +_DataQueue Queue; + +static unsigned FileTransfer = FALSE; /*----- signals if filetransfer is in progress -----*/ +static unsigned FileReceive = FALSE; /*----- signals if filetransfer is in progress -----*/ +static FILE *File; + +/*--------------------------------------------------------------------------*\ + * Press_Key: +\*--------------------------------------------------------------------------*/ +int Press_Key(void) { + int c; + + if ((c = getch()) == 0) + c = getch()+256; + return c; +} + +/*--------------------------------------------------------------------------*\ + * GetSlot: returns the slotnumber of the ConnectionID or INVALID_SLOT +\*--------------------------------------------------------------------------*/ +int GetSlot(ConnectionID Con) { + int x; + + for (x=0; x= QueueSize) Queue.Tail = 0; + Queue.Fill--; + } +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** datablock slot %d ID %d handle %d has been sent *****\n", + GetSlot(Connection), Connection, DataHandle); +# endif +} + +/*--------------------------------------------------------------------------*\ + * MainStateChange: signals a state change on both B-channels (connected, + * disconnected). Whenever a channel changes his state this function is called +\*--------------------------------------------------------------------------*/ +void MainStateChange(ConnectionID Connection, + ConnectionState State) { + int index; + + assert (Connection != INVALID_CONNECTION_ID); + + + index = GetSlot(Connection); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** state change slot %d ID %d: %s *****\n", index, Connection, + ConnectionStateString[State]); +# endif + + if (State == Disconnected) { + FreeSlot(index); + } +} + +/*--------------------------------------------------------------------------*\ + * MainIncomingCall: signals an incoming call + * This function will be executed if a CONNECT_INDication appears to + * inform the user. +\*--------------------------------------------------------------------------*/ +void MainIncomingCall(ConnectionID Connection, + char *CallingPartyNumber) { + + int index; + B3_PROTO_FAXG3 B3conf; + + assert (Connection != INVALID_CONNECTION_ID); + + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** incoming call ,ID %d, caller: \"%s\" *****\n",Connection,CallingPartyNumber); +# endif + index = AllocSlot(Connection); + + SetupB3Config( &B3conf, FAX_SFF_FORMAT); + + if (index == INVALID_SLOT) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** no free slot available, rejecting call... *****\n"); +# endif + AnswerCall(Connection, REJECT, 4, 4, 4, (_cstruct)&B3conf); + return; + } +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** call assigned to slot %d *****\n", index); +# endif + + AnswerCall(Connection, ACCEPT, 4, 4, 4, (_cstruct)&B3conf); +} + + +#ifdef DEBUG + +/*--------------------------------------------------------------------------*\ + * CAPI_PROT_HANDLE: This is a callback-function that has been specified + * with CAPI_PROTOCOL_INIT. The first parameter is a pointer to the protocol- + * message which is plain ASCII-text. The parameter t contains the type of + * the message which can be CAPI_PROTOCOL_HEADER (appears only once when + * calling CAPI_PROTOCOL_INIT), CAPI_PROTOCOL_MSG (the text contains a + * decoded CAPI-message) and CAPI_PROTOCOL_TXT (the buffers contains a debug + * message or a message sent with the function CAPI_PROTOCOL_TEXT). + * If the type of the message is CAPI_PROTOCOL_MSG, the last parameter contains + * a pointer to the decoded CAPI-message. +\*--------------------------------------------------------------------------*/ +void CAPI_PROT_HANDLE(char *Message, + CAPI_PROTOCOL_TYP t, + CAPI_MESSAGE m) { + + fprintf(ProtocolFile,"%s",Message); + if (t != CAPI_PROTOCOL_MSG) + puts(Message); + + if (t == CAPI_PROTOCOL_MSG) { + _cmsg CMSG; + + CAPI_MESSAGE_2_CMSG(&CMSG, m); + if ((FileTransfer || FileReceive) && + (CMSG.Command == CAPI_DATA_B3) && (CMSG.Info == 0) && + (CMSG.Reason == 0) && (CMSG.Reason_B3 == 0)) { + + return; + } + puts(Message); + if (CMSG.Info != 0) { + printf("Info 0x%04X: %s\n",CMSG.Info,Decode_Info(CMSG.Info)); + fprintf(ProtocolFile,"Info 0x%04X: %s\n",CMSG.Info,Decode_Info(CMSG.Info)); + } + if (CMSG.Reason != 0) { + printf("Reason 0x%04X: %s\n",CMSG.Reason,Decode_Info(CMSG.Reason)); + fprintf(ProtocolFile,"Reason 0x%04X: %s\n",CMSG.Reason,Decode_Info(CMSG.Reason)); + } + if (CMSG.Reason_B3 != 0) { + printf("Reason_B3 0x%04X: %s\n",CMSG.Reason_B3,Decode_Info(CMSG.Reason_B3)); + fprintf(ProtocolFile,"Reason_B3 0x%04X: %s\n",CMSG.Reason_B3,Decode_Info(CMSG.Reason_B3)); + } + } + +} + +/*--------------------------------------------------------------------------*\ + * Prot_Init: Initialisation of the protocol +\*--------------------------------------------------------------------------*/ +int Prot_Init(char *Filename) { + char *p; + + strcpy(ProtocolFileName, Filename); + p = strrchr(ProtocolFileName, '.'); + if (p) *p = '\0'; + strcat(ProtocolFileName, ".prt"); + + if ((ProtocolFile=fopen(ProtocolFileName, "w"))==NULL) { + printf("Can't open protocol-file !!\n"); + return FALSE; + } + CAPI_PROTOCOL_INIT(CAPI_PROT_BUF, CAPI_PROT_HANDLE); + return TRUE; +} +#endif + +/*--------------------------------------------------------------------------*\ + * The following _h functions are 'h'igh level functions for the ones + * implemented in CONNECT.C . The _h functions perform some parameter tests + * that would cause an assert on the low-level functions. +\*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*\ + * Connect_h: Asks for a number to call then executes 'Connect' +\*--------------------------------------------------------------------------*/ +unsigned Connect_h(ConnectionID *Connection, + char *CallingPartyNumber, + unsigned long Service, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration) { + + if (*Connection != INVALID_CONNECTION_ID) { + printf("Connect_h: Connection is already in use\n"); + return 0xFFFF; + } + + printf("Enter Number to call: "); + fflush (stdout); + gets(CalledPartyNumberArr); + + return Connect(Connection, + CalledPartyNumberArr, + CallingPartyNumber, + Service, + B1Protocol, + B2Protocol, + B3Protocol, + B3Configuration); +} + +/*--------------------------------------------------------------------------*\ + * Disconnect_h: high level Disconnect +\*--------------------------------------------------------------------------*/ +unsigned Disconnect_h(ConnectionID Connection) { + + int index; + ConnectionState State; + + if (Connection == INVALID_CONNECTION_ID) { + printf("Disconnect_h: ConnectionID is invalid\n"); + return 0xFFFF; + } + State = GetState(Connection); + if ((State == Disconnected) || (State == D_DisconnectPending)) { + index = GetSlot(Connection); + printf("Disconnect_h: slot %d ID %d is disconnected\n",index, Connection); + return 0xFFFF; + } + return Disconnect(Connection); +} + +/*--------------------------------------------------------------------------*\ + * SendData_h: high level SendData +\*--------------------------------------------------------------------------*/ +void InitQueue(void) { + unsigned x; + + for (x=0; x 0) { + t = Queue.Tail; + do { + if (Queue.Element[t].SENT == FALSE) { + error = SendData(index, + (void __far *)Queue.Element[t].DATA, + Queue.Element[t].DATA_LENGTH, + (unsigned short)t); + + if (error != 0) { + printf("Error transfering data: 0x%04X !!!\n",error); + break; + } + Queue.Element[t].SENT = TRUE; + } + if (++t >= QueueSize) t = 0; + } while (t != Queue.Head); + } +} + +/*--------------------------------------------------------------------------*\ + * SendFax: Asks for a filename and sends it as a fax +\*--------------------------------------------------------------------------*/ +unsigned SendFax(int SlotNr) { + + char Filename[80]; + unsigned count; + int FAX_Format; + B3_PROTO_FAXG3 B3conf; + + printf("This demo program can send ASCII and FAX-format files (.sff). Filenames\n"); + printf("with extensions other than .sff will be interpreted as ASCII-files.\n"); + printf("The name of the demo-fax-file is \"TESTFAX.SFF\".\n"); + printf("Enter Filename: "); + fflush (stdout); + gets(Filename); + FAX_Format = strstr( Filename, ".sff" ) ? FAX_SFF_FORMAT : FAX_ASCII_FORMAT; + + File = fopen(Filename, "rb"); + if (! File) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** could not open file: \"%s\" *****\n",Filename); +# endif + return 1; + } +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** opening file: \"%s\" *****\n",Filename); +# endif + + InitQueue(); + + SetupB3Config( &B3conf, FAX_Format); + Connect_h(&Slot[SlotNr], + CallingPartyNumber, + SPEECH, + B1PROTOCOL, + B2PROTOCOL, + B3PROTOCOL, + (_cstruct)&B3conf); + + do { + Handle_CAPI_Msg(); + if (Slot[SlotNr] == INVALID_CONNECTION_ID) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** disconnected, please try again *****\n\n"); +# endif + fclose(File); + return 2; + } + } while (GetState(Slot[SlotNr]) != Connected); + + + FileTransfer = TRUE; + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** Starting datatransfer, press any key to stop *****\n"); + CAPI_PROTOCOL_TEXT("***** there is no protocol output to the screen during transfer *****\n"); +# endif + do { + + if ((! feof(File)) && (Queue.Fill < 7)) { /*----- max. 7 outstanding blocks supported by CAPI -----*/ + count = fread(&(Queue.Element[Queue.Head].DATA[0]), 1, SendBlockSize, File); + if (count > 0) { + Queue.Element[Queue.Head].DATA_LENGTH = (unsigned short)count; + if (++Queue.Head >= QueueSize) Queue.Head = 0; + Queue.Fill++; + } + } + if (GetState(Slot[SlotNr]) != Connected) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** connection broken *****\n"); +# endif + break; + } + if (kbhit()) { + getch(); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** interrupted by user *****\n"); +# endif + break; + } + TransferData(SlotNr); + Handle_CAPI_Msg(); + + } while (!feof(File)); + + Disconnect_h(Slot[SlotNr]); + while ((Slot[SlotNr] != INVALID_CONNECTION_ID) && (GetState(Slot[SlotNr]) != Disconnected)) { + Handle_CAPI_Msg(); +# if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +# endif + if (kbhit()) { + getch(); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** interrupted by user *****\n"); +# endif + return 4; + } + + }; + + FileTransfer = FALSE; +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** End of transfer *****\n"); +# endif + fclose(File); + return 0; +} + +/*--------------------------------------------------------------------------*\ + * ReceiveFax: Waits for incoming data and stores it to disk +\*--------------------------------------------------------------------------*/ +unsigned ReceiveFax(int SlotNr) { + + char Filename[80]; + char *p; + + printf("The default extension for the FAX-data is .sff\n"); + printf("Enter Filename where incoming data shall be saved: "); + fflush (stdout); + gets(Filename); + + p = strchr(Filename, '.'); + if (p) *p = '\0'; + strcat(Filename, ".sff"); + + + File = fopen(Filename, "wb"); + if (! File) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** could not open file: \"%s\" *****\n",Filename); +# endif + return 3; + } + printf("opening file: \"%s\"\n\n",Filename); + + InitQueue(); + + FileReceive = TRUE; + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** Waiting for data , press any key to stop *****\n"); + CAPI_PROTOCOL_TEXT("***** there is no protocol output to the screen during transfer *****\n"); +# endif + + Listen(0x1FFF03FF); + + while (GetState(Slot[SlotNr]) != Connected) { + Handle_CAPI_Msg(); + if (kbhit()) { +# if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +# endif + getch(); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** interrupted by user *****\n"); +# endif + fclose(File); + FileReceive = FALSE; + return 0; + } + } + while (GetState(Slot[SlotNr]) != INVAL_STATE) { + Handle_CAPI_Msg(); + if (kbhit()) { +# if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +# endif + getch(); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** interrupted by user *****\n"); +# endif + FileReceive = FALSE; + fclose(File); + return 0; + } + } + + FileReceive = FALSE; + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** End of FAX-receive *****\n"); +# endif + + fclose(File); + return 0; +} + +/*--------------------------------------------------------------------------*\ + * HandleKeyStroke: Checks the keyboard +\*--------------------------------------------------------------------------*/ +int HandleKeyStroke(void) { + int i; + + if (kbhit()) { + i = Press_Key(); + switch (i) { + case 27: { /*----- ESCAPE -----*/ + printf("Exit program ? y/n "); + fflush (stdout); + i = Press_Key(); + if ((i == 'y') || (i =='Y')) { + puts("Y"); + return FALSE; + } + puts("N"); + return TRUE; + } + case 's': + case 'S': + SendFax(0); + break; + case 'r': + case 'R': + ReceiveFax(0); + break; + } + } + return TRUE; +} + +/*--------------------------------------------------------------------------*\ + * Interact: main loop, checks keystrokes and CAPI-messages +\*--------------------------------------------------------------------------*/ +void Interact(void) { + int numController; + int BChannels, Contr; + + + numController = GetNumController (); + BChannels = 0; + for (Contr=1; Contr<=numController; Contr++) + BChannels += GetNumOfSupportedBChannels(Contr); + + printf("Detected %i controllers with %i B-channels overall.\n\n", + numController, BChannels); + + puts("'s'+'S' Send fax"); + puts("'r'+'R' Receive fax"); + + do { +# if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +# endif + Handle_CAPI_Msg(); + } while (HandleKeyStroke()); + + puts("\nProgram terminated\n"); +} + +/*--------------------------------------------------------------------------*\ + * Hangup: Disconnect both channels +\*--------------------------------------------------------------------------*/ +void Hangup(void) { + int i; + + + if ((Slot[0] != INVALID_CONNECTION_ID) && + (GetState(Slot[0]) != Disconnected) && + (GetState(Slot[0]) != D_DisconnectPending)) + Disconnect(Slot[0]); + + if ((Slot[1] != INVALID_CONNECTION_ID) && + (GetState(Slot[1]) != Disconnected) && + (GetState(Slot[1]) != D_DisconnectPending)) + Disconnect(Slot[1]); + + do { + Handle_CAPI_Msg(); +# if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +# endif + if (kbhit()) { + while (kbhit()) { + getch(); + } + printf("Exit program ? y/n "); + fflush (stdout); + i = Press_Key(); + if ((i == 'y') || (i =='Y')) { + puts("Y"); + return; + } + puts("N"); + } + } + while ((Slot[0] != INVALID_CONNECTION_ID) || (Slot[1] != INVALID_CONNECTION_ID)); +} + +/*--------------------------------------------------------------------------*\ + * ctrlchandler: exits on CTRL-C and CTRL-BREAK +\*--------------------------------------------------------------------------*/ +void ctrlchandler(int sig) +{ + signal( SIGINT, ctrlchandler ); + exit(0); + sig = 0; /*----- suppress warning -----*/ +} + +/*--------------------------------------------------------------------------*\ + * main: Init & exit functions +\*--------------------------------------------------------------------------*/ +#ifdef DEBUG +int main(int ac, char *av[]) { +#else +int main(void) { +#endif + + Slot[0] = INVALID_CONNECTION_ID; + Slot[1] = INVALID_CONNECTION_ID; + + if (! RegisterCAPI ()) return 1; + atexit (ReleaseCAPI); + + signal(SIGINT, ctrlchandler); + + InitConnectionIDHandling (); + + +#ifdef DEBUG + if (! Prot_Init(av[ac-1])) return 2; +#endif + +#ifdef __linux__ + init_tty(); + atexit (restore_tty); +#endif + + Interact(); + + Hangup(); + +#ifdef DEBUG + fclose(ProtocolFile); +#endif + return 0; +} diff --git a/SOURCE/ID.C b/SOURCE/ID.C new file mode 100644 index 0000000..4030945 --- /dev/null +++ b/SOURCE/ID.C @@ -0,0 +1,420 @@ +/*--------------------------------------------------------------------------*\ + + ID.C Version 1.1 1995 AVM + + Functions for ConnectionID handling + +\*--------------------------------------------------------------------------*/ +#include +#include +#include + +#include "id.h" + +/*--------------------------------------------------------------------------*\ + * typedefinitions +\*--------------------------------------------------------------------------*/ +const char *ConnectionStateString[7] = {"Disconnected", + "D_ConnectPending", + "D_Connected", + "B_ConnectPending", + "Connected", + "B_DisconnectPending", + "D_DisconnectPending"}; + +typedef struct _ConnectionDesc { + unsigned InUse; + long PLCI; + long NCCI; + long Controller; + ConnectionState State; + int Initiator; + unsigned char *CalledPartyNumberStruct; /*----- CAPI struct -----*/ + unsigned char *CallingPartyNumberStruct; /*----- CAPI struct -----*/ +} ConnectionDesc; + +static ConnectionDesc C[maxConnections] = {0}; +static unsigned char * EmptyStruct = (unsigned char *)"\0"; + +/*--------------------------------------------------------------------------*\ + * InitConnectionIDHandling: Initialisation of internal structures. Must be + * executed before using the functions in this module. +\*--------------------------------------------------------------------------*/ +void InitConnectionIDHandling (void) { + unsigned Con; + + /*----- init local data -----*/ + for (Con=0; Con 1) + return (char *)(&(C[Con].CalledPartyNumberStruct[2])); + else + return (char *)EmptyStruct; +} + +/*--------------------------------------------------------------------------*\ + * GetCalledPartyNumberStruct: Returns the CalledPartyNumber belonging to the + * specified connection as a CAPI struct. +\*--------------------------------------------------------------------------*/ +unsigned char *GetCalledPartyNumberStruct (ConnectionID Con) { + + return C[Con].CalledPartyNumberStruct; +} + +/*--------------------------------------------------------------------------*\ + * SetCallingPartyNumber: Sets the CallingPartyNumber belonging to the + * specified connection. CalledPartyNumber has to be a zero terminated string + * containing only ASCII numbers. + * CallingPartyNumber contains always the number of the party that originated + * the call, if it is not needed you dont need to set it. +\*--------------------------------------------------------------------------*/ +void SetCallingPartyNumber (ConnectionID Con, + char *CallingNumber) { + + assert (Con != INVALID_CONNECTION_ID); + assert (C[Con].InUse); + + + FreeNumberStruct (&C[Con].CallingPartyNumberStruct); + if ((CallingNumber != NULL) && (*CallingNumber != 0)) { + int len; + + len = strlen(CallingNumber); + + /*----- \xLen\x00\x80 STRING '\0' -----*/ + + C[Con].CallingPartyNumberStruct = (unsigned char *)malloc(len + 3 + 1); + assert (C[Con].CallingPartyNumberStruct != NULL); + + C[Con].CallingPartyNumberStruct[0] = (unsigned char)(len + 2); + C[Con].CallingPartyNumberStruct[1] = 0x00; + C[Con].CallingPartyNumberStruct[2] = 0x80; + strcpy ((char *)&(C[Con].CallingPartyNumberStruct[3]), CallingNumber); + } +} + +/*--------------------------------------------------------------------------*\ + * SetCallingPartyNumberStruct: Sets the CallingPartyNumber belonging to the + * specified connection. CallingStruct has to be a valid CAPI struct. +\*--------------------------------------------------------------------------*/ +void SetCallingPartyNumberStruct (ConnectionID Con, + unsigned char *CallingStruct) { + + assert (Con != INVALID_CONNECTION_ID); + assert (C[Con].InUse); + + + FreeNumberStruct (&C[Con].CallingPartyNumberStruct); + if (CallingStruct != NULL) { + /*----- two more for the length byte and '\0' -----*/ + C[Con].CallingPartyNumberStruct = (unsigned char *)malloc((size_t)(CallingStruct[0] + 2)); + assert(C[Con].CallingPartyNumberStruct != NULL); + + memcpy(C[Con].CallingPartyNumberStruct, CallingStruct, (size_t)(CallingStruct[0] + 1)); + C[Con].CallingPartyNumberStruct[CallingStruct[0] + 1] = '\0'; + } +} + +/*--------------------------------------------------------------------------*\ + * GetCallingPartyNumber: Returns the CallingPartyNumber belonging to the + * specified connection as a zero terminated string. +\*--------------------------------------------------------------------------*/ +char *GetCallingPartyNumber (ConnectionID Con) { + + if (C[Con].CallingPartyNumberStruct[0] > 2) + return (char *)&(C[Con].CallingPartyNumberStruct[3]); + else + return (char *)EmptyStruct; +} + +/*--------------------------------------------------------------------------*\ + * GetCallingPartyNumberStruct: Returns the CallingPartyNumber belonging to the + * specified connection as a CAPI struct. +\*--------------------------------------------------------------------------*/ +unsigned char *GetCallingPartyNumberStruct (ConnectionID Con) { + + return C[Con].CallingPartyNumberStruct; +} diff --git a/SOURCE/ID.H b/SOURCE/ID.H new file mode 100644 index 0000000..1f72de6 --- /dev/null +++ b/SOURCE/ID.H @@ -0,0 +1,193 @@ +/*--------------------------------------------------------------------------*\ + + ID.H Version 1.1 1995 AVM + + Header file for ID.C + +\*--------------------------------------------------------------------------*/ +#ifndef _id_h_ +#define _id_h_ + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +typedef enum _ConnectionState { + Disconnected, + D_ConnectPending, + D_Connected, + B_ConnectPending, + Connected, + B_DisconnectPending, + D_DisconnectPending +} ConnectionState; + +extern const char *ConnectionStateString[7]; + + +typedef int ConnectionID; + +#define maxConnections 8 +#define INVALID_CONNECTION_ID (-1) +#define INVAL_STATE (-1) +#define INVAL_NCCI (-1) +#define INVAL_PLCI (-1) +#define INVAL_CONTROLLER (-1) +/*--------------------------------------------------------------------------*\ + * InitConnectionIDHandling: Initialisation of internal structures. Must be + * executed before using the functions in this module. +\*--------------------------------------------------------------------------*/ +void InitConnectionIDHandling (void); + +/*--------------------------------------------------------------------------*\ + * AllocConnection: allocates one connection structure. Returns + * INVALID_CONNECTION_ID if none free. All members are resetted. +\*--------------------------------------------------------------------------*/ +ConnectionID AllocConnection (void); + +/*--------------------------------------------------------------------------*\ + * FreeConnection: frees one connection, the ConnectionID is no longer valid +\*--------------------------------------------------------------------------*/ +void FreeConnection (ConnectionID Connection); + +/*--------------------------------------------------------------------------*\ + * SetConnectionPLCI: sets the PLCI (and controller) for one connection +\*--------------------------------------------------------------------------*/ +void SetConnectionPLCI (ConnectionID Con, + long PLCI); + +/*--------------------------------------------------------------------------*\ + * GetConnectionPLCI: returns the PLCI for one connection +\*--------------------------------------------------------------------------*/ +long GetConnectionPLCI (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * GetConnectionByPLCI: Searches the connection that uses the PLCI, if none + * found, returns INVALID_CONNECTION_ID. +\*--------------------------------------------------------------------------*/ +ConnectionID GetConnectionByPLCI (long PLCI); + +/*--------------------------------------------------------------------------*\ + * SetConnectionNCCI: Sets the NCCI for one connection. +\*--------------------------------------------------------------------------*/ +void SetConnectionNCCI (ConnectionID Con, + long NCCI); + +/*--------------------------------------------------------------------------*\ + * GetConnectionNCCI: Returns the NCCI for one connection. +\*--------------------------------------------------------------------------*/ +long GetConnectionNCCI (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * GetConnectionByNCCI: Searches the connection that uses the NCCI, if none + * found, returns INVALID_CONNECTION_ID. +\*--------------------------------------------------------------------------*/ +ConnectionID GetConnectionByNCCI (long NCCI); + +/*--------------------------------------------------------------------------*\ + * GetController: Returns the controller that is used by the specified + * connection. +\*--------------------------------------------------------------------------*/ +long GetController (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * GetNumberOfConnections: Returns the number of currently active connections + * on the specified controller. +\*--------------------------------------------------------------------------*/ +unsigned GetNumberOfConnections (long Controller); + +/*--------------------------------------------------------------------------*\ + * GetState: Returns the state of the specified connection. +\*--------------------------------------------------------------------------*/ +ConnectionState GetState (ConnectionID Connection); + +/*--------------------------------------------------------------------------*\ + * SetState: Sets the state of the specified connection. +\*--------------------------------------------------------------------------*/ +void SetState (ConnectionID Connection, + ConnectionState State); + +/*--------------------------------------------------------------------------*\ + * SetConnectionInitiator: Changes the Initiator flag to the specified value +\*--------------------------------------------------------------------------*/ +void SetConnectionInitiator (ConnectionID Con, + int Initiator); + +/*--------------------------------------------------------------------------*\ + * GetConnectionInitiator: Returns the Initiator flag for the specified + * connection +\*--------------------------------------------------------------------------*/ +int GetConnectionInitiator (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * SetCalledPartyNumber: Sets the CalledPartyNumber belonging to the specified + * connection. CalledPartyNumber has to be a zero terminated string containing + * only ASCII numbers. + * Note: CalledPartyNumber has to different meanings in incoming and outgoing + * call. For the outgoing call it contains the number of the party that will + * be called, in incoming calls it contains the number that has been dialed + * by the external party. On an ISDN access with multiple numbers this + * CalledPartyNumber must be used to determine which number has been called. + * Note, that this number may contain only the last one or two digits of + * the called number, but this is enough to uniquely identify the called port. +\*--------------------------------------------------------------------------*/ +void SetCalledPartyNumber (ConnectionID Con, + char *CalledPartyNumber); + +/*--------------------------------------------------------------------------*\ + * SetCalledPartyNumberStruct: Sets the CalledPartyNumber belonging to the + * specified connection. CalledStruct has to be a valid CAPI struct. +\*--------------------------------------------------------------------------*/ +void SetCalledPartyNumberStruct (ConnectionID Con, + unsigned char *CalledPartyNumber); + +/*--------------------------------------------------------------------------*\ + * GetCalledPartyNumber: Returns the CalledPartyNumber belonging to the + * specified connection as a zero terminated string. +\*--------------------------------------------------------------------------*/ +char *GetCalledPartyNumber (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * GetCalledPartyNumberStruct: Returns the CalledPartyNumber belonging to the + * specified connection as a CAPI struct. +\*--------------------------------------------------------------------------*/ +unsigned char *GetCalledPartyNumberStruct (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * SetCallingPartyNumber: Sets the CallingPartyNumber belonging to the + * specified connection. CalledPartyNumber has to be a zero terminated string + * containing only ASCII numbers. + * CallingPartyNumber contains always the number of the party that originated + * the call, if it is not needed you dont need to set it. +\*--------------------------------------------------------------------------*/ +void SetCallingPartyNumber (ConnectionID Con, + char *CallingPartyNumber); + +/*--------------------------------------------------------------------------*\ + * SetCallingPartyNumberStruct: Sets the CallingPartyNumber belonging to the + * specified connection. CallingStruct has to be a valid CAPI struct. +\*--------------------------------------------------------------------------*/ +void SetCallingPartyNumberStruct (ConnectionID Con, + unsigned char *CallingPartyNumber); + +/*--------------------------------------------------------------------------*\ + * GetCallingPartyNumber: Returns the CallingPartyNumber belonging to the + * specified connection as a zero terminated string. +\*--------------------------------------------------------------------------*/ +char *GetCallingPartyNumber (ConnectionID Con); + +/*--------------------------------------------------------------------------*\ + * GetCallingPartyNumberStruct: Returns the CallingPartyNumber belonging to the + * specified connection as a CAPI struct. +\*--------------------------------------------------------------------------*/ +unsigned char *GetCallingPartyNumberStruct (ConnectionID Con); + + +#endif /*----- _id_h_ -----*/ diff --git a/SOURCE/INIT.C b/SOURCE/INIT.C new file mode 100644 index 0000000..285e985 --- /dev/null +++ b/SOURCE/INIT.C @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------*\ + + INIT.C Version 1.1 1995 AVM + + The init function must be called before any other function that uses + CAPI messages + +\*--------------------------------------------------------------------------*/ + +#include +#include + +#include "capi20.h" +#include "init.h" +#include "contr.h" +#include "capi.h" + +#include "os.h" + +/*--------------------------------------------------------------------------*\ + * defines needed by InitISDN +\*--------------------------------------------------------------------------*/ +unsigned short Appl_Id = 0; + + +#define MaxNumBChan 2 /*----- max. number of B-channels -----*/ +#define MaxNumB3DataBlocks 7 /*----- max. number of unconfirmed B3-datablocks -----*/ + /*----- 7 is the maximal number supported by CAPI -----*/ +#define MaxB3DataBlockSize 2048 /*- max. B3-Datablocksize -----*/ + /*- 2048 is the maximum supported by CAPI -----*/ +#define MsgBufSize (1024 + (1024 * MaxNumBChan)) /*-- size of messagebuffer -----*/ + +static CAPI_MESSAGE CAPI_BUFFER = NULL; + +/*--------------------------------------------------------------------------*\ + * RegisterCAPI: Check for CAPI, allocate memory for CAPI-buffer and + * register application. This function has to be called before using any + * other CAPI functions. +\*--------------------------------------------------------------------------*/ +unsigned RegisterCAPI (void) { + CAPI_REGISTER_ERROR ErrorCode; + unsigned numController; + + if (!CAPI20_ISINSTALLED()) { + printf ("\nError: ISDN-driver not installed\n"); + return 0; + } + numController = GetNumController(); + if (numController == 0) { + printf("\nError: No ISDN-controller installed\n"); + return 0; + } +#if defined (TARGET_16BIT) + CAPI_BUFFER = malloc(MsgBufSize + (MaxNumBChan * MaxNumB3DataBlocks * MaxB3DataBlockSize)); + if (!CAPI_BUFFER) { + printf ("\nError: not enough memory in function RegisterCAPI\n"); + return 0; + } + Appl_Id = CAPI20_REGISTER(CAPI_BUFFER, MsgBufSize, MaxNumBChan, + MaxNumB3DataBlocks, MaxB3DataBlockSize, &ErrorCode); +#endif +#if defined (TARGET_32BIT) +#ifdef __linux__ + Appl_Id = CAPI20_REGISTER(MaxNumBChan, + MaxNumB3DataBlocks, MaxB3DataBlockSize, &ErrorCode); +#else + Appl_Id = CAPI20_REGISTER(MsgBufSize, MaxNumBChan, + MaxNumB3DataBlocks, MaxB3DataBlockSize, &ErrorCode); +#endif +#endif + + if (Appl_Id == 0) { + printf ("\nError: registering the application in function RegisterCAPI, "); + printf ("code: %04X\n",ErrorCode); + return 0; + } + return numController; +} + +/*--------------------------------------------------------------------------*\ + * ReleaseCAPI: deregister application +\*--------------------------------------------------------------------------*/ +void ReleaseCAPI (void) { + MESSAGE_EXCHANGE_ERROR ErrorCode; + + ErrorCode = CAPI20_RELEASE(Appl_Id); + if (ErrorCode != 0) { + printf("Error: deregistering the application in function ReleaseCAPI, "); + printf("code: 0x%04X\n",ErrorCode); + } + if (CAPI_BUFFER != NULL) { + free (CAPI_BUFFER); + CAPI_BUFFER = NULL; + } +} diff --git a/SOURCE/INIT.H b/SOURCE/INIT.H new file mode 100644 index 0000000..704d4ee --- /dev/null +++ b/SOURCE/INIT.H @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------*\ + + INIT.H Version 1.1 1995 AVM + + Header file for INIT.C + +\*--------------------------------------------------------------------------*/ +#ifndef _init_h_ +#define _init_h_ + +extern unsigned short Appl_Id; + +/*--------------------------------------------------------------------------*\ + * RegisterCAPI: Check for CAPI, allocate memory for CAPI-buffer and + * register application. This function has to be called before using any + * other CAPI functions. +\*--------------------------------------------------------------------------*/ +unsigned RegisterCAPI (void); + +/*--------------------------------------------------------------------------*\ + * ReleaseCAPI: deregister application +\*--------------------------------------------------------------------------*/ +void ReleaseCAPI (void); + + +#endif /*----- _init_h_ -----*/ diff --git a/SOURCE/LINUTI.C b/SOURCE/LINUTI.C new file mode 100644 index 0000000..0af89b2 --- /dev/null +++ b/SOURCE/LINUTI.C @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include +#include + +static struct termios sav; + +void restore_tty(void) +{ + (void)tcsetattr(0, TCSADRAIN, &sav); +} + +void init_tty(void) +{ + struct termios t; + + (void)tcgetattr(0, &t); + sav = t; + t.c_lflag &= ~(ICANON); + t.c_cc[VMIN] = 1; + t.c_cc[VTIME] = 0; + (void)tcsetattr(0, TCSADRAIN, &t); +} + +int kbhit(void) +{ + struct timeval tv; + fd_set ifd; + + FD_ZERO(&ifd); + FD_SET(0, &ifd); + tv.tv_sec = 0; + tv.tv_usec = 0; + + return select(1, &ifd, 0, 0, &tv) == 1; +} + +int getch(void) +{ + char c; + + fflush(stdout); + if (read(0, &c, 1) == 1) + return c; + restore_tty(); + exit(1); +} diff --git a/SOURCE/LINUTI.H b/SOURCE/LINUTI.H new file mode 100644 index 0000000..8571081 --- /dev/null +++ b/SOURCE/LINUTI.H @@ -0,0 +1,4 @@ +void restore_tty(void); +void init_tty(void); +int kbhit(void); +int getch(void); diff --git a/SOURCE/LINUX.MAK b/SOURCE/LINUX.MAK new file mode 100644 index 0000000..c596e10 --- /dev/null +++ b/SOURCE/LINUX.MAK @@ -0,0 +1,24 @@ + +CFLAGS = -O2 -W -Wall -I ../c20lib/source -g + +CFLAGS := $(CFLAGS) -DTARGET_32BIT + +DEMOCFILES = main.c c20msg.c capi.c connect.c contr.c \ + data.c id.c init.c linuti.c + +FAXCFILES = faxmain.c c20msg.c capi.c connect.c contr.c \ + data.c id.c init.c fax.c linuti.c + +DEMOOFILES = $(patsubst %.c,linux/%.o,$(DEMOCFILES)) +FAXOFILES = $(patsubst %.c,linux/%.o,$(FAXCFILES)) + +all: linux/demo linux/faxmain + +linux/demo: $(DEMOOFILES) ../c20lib/linux/libc20.a + $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) + +linux/faxmain: $(FAXOFILES) ../c20lib/linux/libc20.a + $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) + +linux/%.o: %.c + $(CC) $(CFLAGS) -c $^ -o $@ diff --git a/SOURCE/LINUX/DEMO b/SOURCE/LINUX/DEMO new file mode 100644 index 0000000000000000000000000000000000000000..341725f44569e8d913b097aded14b436044bddb6 GIT binary patch literal 132621 zcmeFa33yaR);C^#lRy&!34#iW&|nadEvy0(36LNtfrbu zsr8&wr%o;R-p<;bX_H+pm#{yENDxHTMibp5a4q~ori~CDktF(wZsH`-2Jw_Oq6&Es zwg6K|LP$hNK=>;Kq*3S$Oo7sYfk3j5j_5NOp)1001mdF` z0(}O^%Td2co}+z|kB~?@(m$ks`kW#!;$&Q@A5KN+j^IH^L7={)Pj7^DMnZJKwI9Oi z2xlRn3q)Upfe1Yi1|jrEI1OPmLMH_JbU^6I=AmCBON$rf-y``@)tUwg(Txk-PW@NW{X=@#t)Jr(q3t-k4?`yoBg z%6}2Aw<3KUu2g?MLY0=j9Q1=)`3lfGKwp3>LnwEYA=npk|BWP2juLe!FF8NIn zH-m0Q`V?HLzB>>+R{j%Ut@naj?TaE&W8$AA+W_%k}`;)Y8*IH-onAX#nVkW-0#(B3TRt z?S@aY%Z~xw)$(!FUKZ$npaHr5b3vPHl`nf3@Tzd%qWSck~acL+W=e z4>{C8#m{iQ34E6Pem{*tnapjcE~T8!^S#G=Gtv7#VQAy!rt z2mQj%U1afC5G-EqXEE}rSW$UsQ9)U0u%fI)R2DBS%`XuZ{`^A9P)eK?F;!Gn?k^=~ zEB#=kprowQFMn%!fQn zDl4Jfd{T_Rv=IGEek}nvkl^i_$ zWLr3zM7m<4a?=%)S_)m^nA7MA=iP;_9WhSmipi}zUE%yabcK^orz<9wesskIIFPQG zP&4R?31$RcG1-l#D<+uH#okCYQ_-Sp+Y3)#)cMr`jD0bl-5|!G-*3P zQ)Oc<(*m^yXj*IB#&jal9-_A}?Is#hh{hVGQ;4Q%t+9&fG@@yGZ7gS+dMA)Y^kSx| zmjY9W_A*Vq74Qk|>fobaHz-FTBnWo+j)DT_EbQaOK61|P-Y@)Xiy@ly1L_bJ$4b#(z-bQp4(_W%? z5M9nRSx2Cj=*3Kvl>}ZR+RHRqOQ4?UET$I|{UOmAOcxT}K(vSH0MRDVX-t<8y^m8i}GfmbONF%zI=_;bT61|P-4Mcm0-oo@|qWckD z!}QfeXAoV*bPds?i7p2XKKOHCBWZ1>RGFKFT~~a!1Dv!_E=tcu`g4?8y+VY?wuIV8 zk}0XCI(UW%?@Htn|5hd9`KR(Z?z%*--L8}hTG^0(!5kl&h^|SAhPoC-XQvfKbGn3o zX$hqVOz0`_B)ANu`~uV&U*_2tLpQPVeW+`^sn7h~H*=;r1PwsR-oQ}G`CX9^;a9qZ zGqceVBG~z!`4C}aZ7|vETjsjJ{2laO*M`(v?f+rk!bPl;QQ*fHUEnT?=B9v;wD7Mj zq3)88x_CbRxC{kXh$2)tz-D5n*XJ`IMh`O+<-|k@m}p!_jmT~dXJ#=sbE7Bz8OwvB zF>eRE2X>HjZ^zf~ll4dHcQ&|P^>vA_ULCPKVGqO54?P>-n8XPAq0 zn~Q%D7hn2?h%PutA~to1GZ0Jv3rPPYY)>idXYtJJDTV-SFFx}P=q<7*n)u>02;%k4 z3G_IC7B-*-D0^c|sLdR+EgIL9$^~QnP5O=IaBIC}Yd^=gHW#hcSoyuaz>&=U?s%(S+}MjM3ZyOn`LdVv|2KxbEF}eXJHWlo6f2A z2L4Xm_e3@(&C}vjEEfOC)uf}E&-H5dVNF5ReC`c2Q8gbnb2XoP&G+L|tZHsm)qJT} z^N^MKOK;#1Rdb!J=1Z@6ZG4JV%}iO1MeRrK>ib7P1@;(|10kk=_y=!5K-cEU$h&N? z#7)5HYG@^44;(<3Uok{D(+Q|P&`ps(kXxyzWagfMnrkWNBviLAAA1}c;5@Wtvw>4l z(tPXZmX@Kl6fNz)D7vOg5xbuS-Qf<&$xROAQ_lO4Ge8SJ^Gq-l_;4anE#jiHJ+o4u z*$wsXL8$Y>Z_SF%PMO6yP{k~B306)`se#c{%R-dcL7qw*6_Ovz-_X$O5-6v8XgYdKQ>K`cL}rBLta?C#LI)Hn?LAkCgNYQFqY@w3k|zr*<%`p&bP*Ck<&tJ~m`8&b@YZnqEoF#PwEeoO}$y+~1%|!N*L&sM_^$wNo-CXUr)nNNq*hhG;SNguhr)iQW=h`iBC$;gw4^SUf-B^on z*00w*6Dxe!BkUvCJ1UEK=LBjg|4Pb_jSrSocK*Oul&}y9auj_IRJ~xE&%BJHenq0s ztbr(7X>z6sq&74yaEQtbTZGX|yQjuUT$wd~ANWtAyQyRKD9a23dqA6QkQY2P(sD80 zKFw1x7u6+^Qzk*?1Wuv+?=OT)Sw!g1K=AH0yg2ZhCxR;;Y@ssQfo)b6$)o`F$uieH zq)7B&0$W9O;;W=$ulXX%MRt)3dM7wCK2K4k%d49)ceikfa3)p2^R{hPEo@A-D$O^} zwDp_1u_N53*&kb^jkT#8JAs&E-cHNKFR_cGKCoyGk%<1^AJ_i_1J_fTVc=i(e}pU3`rkYWX^_8ZT8(-3K@y#oc(Q;0NM(PT4=wB` zv=@l_SE=`6ED%U_aBqJ!@4~Lwd_9Bo8~lgq!JbrB71QFQC~s-89oRffix@xVX09N0 z!$w%E86^v<{UY2vFLhH85iRK(#jS~Md%Tt3mgx51{=YBm`<>(|4c9CSZ?Ue#uSes# z;RrH#k*8cMQ>)=)$y{&c-G{m}EL@|N7h3!Et+Y>i%|ITnR%RP;U~CJl;FE7{`zzds z;q!0U9<9}ySJRw&A?Cvwl*^4YxhjaQ9|JQf2oQ)h|)(<`aP6i^LO`9y4QS_ zGSC_AG8a3hz=v3($h}nWX;o$l;71fI4-|oNq40DhNYR?AziGiXg`O=hS>)WGg3G7r{|$E zG3M8`X+CopqFj663MP&D^@@FSE(rLjr=R*7mJ%U!fY8;1_7S>=(3gZvLLU~_le`Q}p`wM}`o&^7PC^CZTk#CKPEB1bn2eEVHI*@x*4va5+AnLN7>qr+ci zw#%R@N3z~uCcPUR@f7l}T#}i@g_jc1Co_SGu^=)N8IGq)FG8gnzil~XHd0d8Q+lS0 z>&v68Lt1G+iIYiw^hW{{+#iVyxj&kdHTmekK6S&9`y+uZ?LDfmATxzCTm6yD1ouaK zhTI>wqjJ4JTwFfZADJCEFY{l9yiWa{!1-^I{3kLI0Fl{=;c~#n(K`QKIDRAIQ#V~p zsmt)C>F-J0xJliRgT;O7rYC4%+{_Vq+(B;%L|n-c@1oes{LF4#-IYY7XP(T&g&;D! zGF%AQ_$)@9+Mi^u=hCe2&YA0&m`k~Cpj<0NW|*T$zl~Lh%Dj$gOTJA^uzWQPS-!c* zr^eq69MAHtr}2_`6Gv>I3Wp%0Q-Akz@)t-(f8D{vtwfxW`8y^qraEqCSWa~`K{I-P z-Ni{-dv|jLxA!vgI@^1glkcY{PS5;36FiO)p9AmwDv#cbh_P$ z{`rWB9ms+Hd7p_Wh|CWe)==^DiLYSHzcp|Y@dJCNy#M3~?w_8>>+GK|IQdoNME`uo z1ldF8=M3)zY&7wu`2UvUpQiksGrv^%8+Rjy^wYvo)PCbOeC@ays}7!&pE?7BN$mKO zgEkW4(+4`}i4OWw2YtPRe$zo8a?ouP=#D4E*FVugFLlt@ zIOqo)^lk_Jk9ZpUsnqS*P*q{>O5Jb{7Km%-G?65mcz~N)D8cpyeEd6lTtVQnG#o0qMQ%I%@a~Ld_a-(gj@Bf%qxLYH_*|}+TodD zCQN*Nrz5eYJ4K}bVvBh6If_Lp_ljU@ST?PvquSK+@zu9(g z!5MvH1rlLz(!^e+Qk^Xm3xH_!Q8LzZ(!S`abjvg!rotnU%I77~i8zgX01vB0cGCe1 z?%*vlr{K0QNZ<*vJ65BEzh>~a49^7IYAZ{*%K4Kj;BuAppT!nL{ zMtYzY`sVT{%kmIz5coJ^d3q3?^e~#A%1HN_Gte5WfK)-xN7!BNGf#p=Ai*2!8kW^- zzKKmiVoNzSKn7szMcjd9a>AEF?L)vYYg zxmtgMjiT_SOGI#OUCu!;DXMWB8NINWzLt2S6X(M`eh>4YM~BuN6u}Fm{G6o~?xIj) z({Q!lZzV@Ns0oL5(%%Pqbipa?T_4~Hf(6aAFLKxe#paUwf$3p6MuMs|gxy6f2YX^r97{TJTCx;K<+-@Oa8n@C&vhSCM4`A-9L%oex zbM(3c>p=tqYflOvz)W=-6{tXp-5=`?NC)r=a;-Z+lT&bD<4h_lJZX%7Y5jbV0 zju?n5`Wq)OjRU9}4Bf^iRBG3k`V7XhxdI)f97alD3q)%C8M&%Q#cbwN)X}QV+?I~Y z-=f@@U&%F?eYNURH~tYxfqzq#_W?Qd%lXg3nV{W#>c%kTAABP6(?jHr{DD=JFb@fG zm<4taeSVDoiD+`VGF`f4bjBb=tsP2!xMb}qye>EuF^wrIr_9g(coX#pjRN>%?v4x5 zf3$F*nP1+jvHOqxad5Tei?5;dXSty2kBbt?27P94c5!%~0|RE6t7)FaAN!l1kQUjk z29?jufwJLCM%D0m`GAw5e2lT+(q(O$dMNwh^q-MCvYWd7YiM#=lFuB8`$bKew*UBm z)9rD?W-Nyo?4u1-+$Ao~*I;X+DC-dYbwxIuIg$4!w)W9%NsE zM~ME0=#E5B3jdmvdQB;g`YnFro~GmTclA7(`2=RkNZs@3a@=!TIlB63dQ_}>6dvsh zR3UCzk}cI7bHpe(+S%^N>-PQ`mC++L zYutFi2aiy8EsESU4ov}e2OKS-2XF*nczjE+Yv3EmwQNG5^T~M1^)!5$pQ2UVi@BJ1 z=E*yW88MC2W}D7LxPd7=#c+ zRnauH@p6_<${V>UPf{#$#KAuiF`>5-cj1K2Fh%VK$_^yO2$nsu{%auzJ!3^no*scHsq`vDY0BM*R@gp$=2vb! zflp%#yNFHI$c85bJUbHIa(pfZqL5_;!ZJmE)1X_0;psDtwphtnmJ}c--E=C36{XYp zu+O{~a@gt15>-#!NjB&+U%`1b)(<{&-guO3uk3$lZS+nu9X_&yn2--r%{EQF`b=wUi#gk(A0q*7i$K20g*XxeKYNR)hrk+>{oF&3ZQ!6zz9 z!E<6}QRHdv-pGqqzY?RWU%ShG^_h`#V958=L-%%f$pORPx;)}N>&BlphLIlLn^lcR zFLCRyCl-tJ+@*GYDbwj0!2>O!-hn63*UNeb-l8slpRDB$YFulNYMN!fe-c-;ORFem zKXiY3BdOf>6l;gTN0`@B)E=xa;W6Rr#_UHd>6*I@5JCUPx1RV(o*mC)qH z^M_V{R-ux>mH2X+-qfKquu~$l?=j zEfKEu@Pmh6laSPZb9_Tq#Z@wGsnk3~(>hg>5}nhpV6{uQ?Was19#nJQ&z!Mm7Wazz&}FCyshc zj>@$9|BM$1_5R)2kn|k25Z=M<;CXpwsaz{^8x^tF7m;a3;<|s)!3$7ItK;8NM<3bv zWm-)$P?KZ4AEEurwNl;m_M_QGA{&yWR_@PSw|u{1Aha2XfH$r5M`OS}I?Bp#nVz&a zmRtnejG5LsG1$?z8##}_Hm+v{?;e40HZV9~4%rh%&DQT3S^U+O2U!<9ar z?a7r~%pV3$i7)&t6}IJL|I8*~JL%KdBL--^`XbrD<^B&Cg**&@S)KPp4jkIGIW3AZ zd$L?ryqBQzRN1qy>Wie9Ka}#)N&sG@Cwt)lJ$tEfPxtkuzF6Luc?Pg1B}?A3;!E5} zB{X@TYG!${@0p#ty^Z20vMZ9;lf`=n^C62jKE9&!?TVh_Wf=-*dFRYBr$Lz1?I%UE zdv@KEjkg}PXZmEun0y!?@OsfInhvW*yH=*iS(%nbSVPnrJS6S@r13i2z4Ox~p5LO` zXom9lPU@%*e168{WHjwTx5Ilp|16RW~lImFDxe63yXPGeAB1e6~)_2cNCWP(*1btg*u{Y zwBfXugrnO_clKUt3j%wg`xRy)4g)cS(*m{V8gu$CoTrqKyk->7KSp+M{3vu{;4?}Z zPDwMB{m|*GeD$L3GQ*sXT8g&Pkvd+rpm)^Luq8S}j!gL-Xm<)K`DQ29c~o)=Q4OH5 zuRY>r|kj5Q#wCo?&PdZGhdcnsy7c!rM_%Bm|$R`KsK{B!b{;=Qt&z_w9 zu01*53%t3COyf~cwZA@od#mbOxA$t4yP$e@)zI2!J%Eu94(@*>^^u&ax{a&gVi6NW92`!{Zxwrfz>bQXhS>9A&suiEY`R@>$%j$h*u{ozp^l z<=a_1cs0`%YM=U2j+AqSFn`5O64W~ma@plGgQT&`yU1r`ms{N@`44P|IWIE;_mIZV zLLq28QoEH(gk`xkDR>5Uw7q`80Z8vjM%6u(!E1i`vQ+@LAa1Np-CiH5Z|V?NKdXN` z3(nt=XWiZuY+36z{(z%v`j~U^6{&@_o`5%z>qI;3poZ2q(h#p6#WD1ZYTd?W^g^6%; zr(mb1o{su)N+}g*UBKwyz=aw=E!=)1i6rmWam`+H1Wu1&=#g3+xgElrsfR?U3(DR} zWucu!!srW&_#B> ziCVr+=*mHk_PV4#(}60F;ElYdG;I10p%c~nGp+QW`5^8;$^P0weTAcL7^^GOrbM+?0ZKk8GEP zlKeKltEca=(<3=%G^g2%n!SO;B(i4 zX54H83wXVX?1B)n%`8WAOt0BNvJK16*&EH-J0_<&b;CW#Wm$f^;9243c56?-BNV~R zrpvVc4L5fTwhuR-6l~K}NYQAA9tv+-YV{Z0 zV>T&m{T1GuV!nr0e7W~irFA5s_j&wU_6mo^qgUB;<7d#8v>&kYdpkXn1FK7^6B}r> zRzdLrLeZQbyyjQ7=#iY}@S0|EMLKdu(`K1tn9)RdgKJTz!{1QOQ1T9XioU55?O7ev zK6pmB`6BqIA&&fZf7th5WXah57hC7HK3QM?Abkz%)0)0o8Gq)3*h|RqkAb?->Ug{V zlc@V3hmbwrW>R9UHCa514F}II8*A5)uSuu=U6#f9xI;gDP8x8I`{@3s-*0HY?W8oj z{V}b!pB8IBATxlMqqqMc_7=x0zgv@kM{Dv+&(8AG!44F3%=Y`K_IJ?R6OFGy+xGm7 z!aRRS?YEnhWlMjy*7`-(bP?<%?<;LW1y=vbax{Nfy_TSrJAt!1{QZeMUhA83c)Wzy z;HN)MS!PQG-+F?qps6dTW2r&;=>~_{{0z$rQ)s8=&sOXW>sffjqPmg40Ma!0PZV{StcsyS7!JsCG?^G5ZBEs?)fcaO1Fmxz08#6l}c+3op2**-1R z{1eWLaHI0=q4>#)*MohE!oPG`*)#Q-zg1VZMD|yY_y^VaycE2L2qwvQ@oJmeSX??D zYr^`=st-S0QazXMv~_=#s(6X2h-ME@jF(RxEm_NKxgMn>Ec|>7eobJ(A>33rh*cWh z2fzlP3RMN@o;vB7=SlPRuH;y{LMymQ6{*>RL}0HuGhI5>UHW>1_tmV_r{EU(_j1B} z-LwVd2BT|muT{2*8yN>2?N*^ctlgQaUEI(*P!#b7nT75VZ#lRB_UWy*zc+4~e?0Oo z!~GIl*pE-vh4qfGn;gi%6RD{IkBrkJHILf3U&I?=o-#F_5_wvr-^y|7Bhglet&4a) z(0y*3pJ{RY)NHm}gchA)>-e~TKNG|Sc#w-XwJhZPUlG}{y zUR-~|73sN{#dV9O`=qu;51eRAV42l4)*2KlJKGbn^a$=p>k38oW>{et!~y;U*j>UO z0I?Xr@E9HOrZE^7@yY>{74dpFCOhKo$6!jN=0>|0r$xM%bEG%om8#6sR5@2u<$PO} zA9-S(YQXLKKR(>vyJ-6B9?kWz{?ehpqiHT)W7eHWTWPO$v6V(Xz&jsITiRP9A!%l@ zgru1jfL?Qm#;fvY4Ttl4Ec>I~h2@OK#WQl8_V@dqF{K@c{T+iJetICr(nFnf-NgLk zP_0q5A8Xa#kJTP+n`7;biEr-?+n8X%!fJnmy)K&&W2mcQ$g)vu$dZj(LzZk*4q1$HIb`8B z<&YgHhpg8uKP{%RnE!0WejWZQ#(y*yqwY8Qt1y(S`>XS?M3mF7l&0oE*`=V4<&Ged zlno+D*)nW*G$P{7V;h0Xn#*9E=9l2LAR|J*J}sT4uH8kB(yB zENw!p@8;t`LQ3m3_sRF>afVy3&J%vCy;A)F`ieF23m${Ao2b^BIP!db9P1ZuCw|>@ zooXk(D-xqN&?qFnKlcuH6|O!ohH zen4x|Ra5Q%FXW*^n3z0MRXbkuAKi{eo@3dYHlOUp6LPjORB4sR#(OL4x8t>ksyI2; zsirKq6vVjmn#o$L|DC?{^=o(4h}Yc43+TlE`S^*Sf1XXTRmS^)Vq%s*`J z@$*lA#Sea0ikHh$dNG%e)j$p z`{4~igjyq%Ei#xB%a@3gWX z#D2I2Ew@xXh4OUXh6^8yb#8nKF#bG-SlmGwMQB7|+o?E}`T#hvgV3w^GUu_xX*R!j z>Q-*Ntcz+00Nc=L)eaO-SWh*kZcmHUS9jsv{{pLJ8@`E4JRx^IE9yF_ zC>&8&r@V(m@f<5E3V53*d<*vNI%F%!vJ@C&UG<|Qf(rd#abNEuA~#K`_=`_%2-sz-E|+HSh6=C|<_$vKDv z->lSUAWs4q#1A@J!%Amz@qLFe8Qzr;%{_=Ua;)*jUUWuomp>jwhR3>&)xW6DYj(w5 zJDj#RK52DS4XFt~%!ov31q?`0oc(VyJ8+b94w!wgx}qf#YF@Xd8Apa<<*A&+63#w& zRZjC}qv=B1-&uEaqBT~s-On)^4=4=TsuW_!?=f)08x6*a$@O%auFp1DYI|ATj9!0xupV(1@fLkYIjz z_0$c>;Wb~u4Grj!ZZXVuuiHf$EQ%%o50y|%+D zXv0}?cuE!HWEAVqR{b~DQ^#W{mj5m$7h<1(LKrl1tZ7I3Zx8v;#Ert#{I>^0IYK=` zRwMlQSFQW+*6ml$4>|6H>||0F`*rSd9=WU{+a??DHHhuw;rB@OS^AX{JG^%`)lTcTv)>Fr-LEO3!4wr7O+oG)baR2@BZ}P9L=;sg2*ONSCGi+_dc!dWJo=wq*xj)Vm zrE+mD?wrHcBdRDnCFwh3g{v>bX=D595uL0FsXYl4TW_?+kqBLAM<0&{>kL#$qf9v? zuj!YM4>ewo6l;2t%P6W?^Iu1?<@j!@Lw|E4RN^WYFZW>8n3hmSUHqnGMNN!wGt8E9 zjaT5NH@tv$e?_G?UW_#IM~CfC0<~xvufmcW3EdsDmE&K=G^~8e%YLhUs$G?+ylBQ&%Dc4C1wiT zHAzFeSIz#wMR)d+5)y6h*tF6|MVJq!ev@ zC-tUXsoQr!byZ_M^68~^^>|Jzli%X)5NOv6yNd-_-SaerNh@tupgqM+r4Ah^W8)Ge&r<(`e8sQ z1vk|Kr;v>Fd&s;!=#s6!q0#;r3gFz|Z>$Lu+lZ6jCJifmP*Md;K(Hp?%4HeLmm54c&+=QxG- znyaLgQse>3(>s(y19T{{cf2cy5!U!s1^(}?7p5LtP18sP3waezYSPvUW4__R+ITxm zspe=E@xw%F`LK_kBI3@RPgN(Vs!31Q3Sl3u5OBxN+FC+j_2QX5p6s;4*9$3Gs2=mi z814ag6Q6%E>$IL|q>iEW0_Gph?Xkae(<2XC>oKjsKW*Kx8b6Ip#8#SUc>2K>9>1Lq zO5in|Ov)faCpOV}eTk;Yk`iaU&ajl8HomGMCx+Mo%M7 zTi!*E!{v!C_<__Q=MSGPU79W3$xTUo{)I=Ye$_^L4SX~IRz7Yug?A-c6)_K2iOrmT73bZ2 z(|F`f-TpLPA{wjS)a^H&Lvb1pbIg@rk#^ixt5RZX2fUHqLyq1=-;vorn4z0+l^HDl z=>Q}mbMf~}g^=R5pASXemH8qczC=g06eDZdIg?Ao)Tc_w^xY^i&MNV?tmCi}}*pycqbHoBHt&0!oZ2UI=Ysp{12 z+<%q|xf5oY&8Dt?*;^x?zVR%qDs`R$ztRw!hd(w!Kb+&L=AR7E8JJ_f#oH#Df8$zM z=8BFaZxLq++6bt&ejI=XVEp6%^!{#OGe#|Yvb)*S62=m47RQ^<d8h}u8!$~x~#u)OA_X_|Fl)0R2Hj z^LN+b7Y`U^0h#CH3;xje{D%-coJrp;>hFym44>T+`+H+BHuW**-O$pqONdEjrKR|j zlf`AFo?e-rsnh37m^L+g(WDvEr{_${n>u6qqN&;VkzknY>66kYyEPJsGR|WQ>?=*OQGJrpU@O zGd=x6rSz9B!ER*$e?hbV%#c6iADjmXEPjvOU?9KJv&8Q&m955ci$6XY^m_^*%Tj+l z!(%;tDs7IqNK7#W_)DLjftEsu@I!{)eJXp$=Pxbu(BHn4)#k4N$54!apr^vWjJgXN zrm}+v4~{R!wWDjK(7`grmc@9VN-?#xsLWCtv6(Dp`SUB${Zfy5)S`*Q<6;Mw<8N)Q z6qE8x`vyJqM>{>`6=lJ)g0hl9MX(7^uU^TvJuM21^=PJ5T|4xKk;2 zQCX<8Fy7F7^oLh%=4@s?Fe9tEfv^pKCAz(IwdZ30Y7d!Wu&g}35@@2rPyGgKw@t}| zKbDKXi%SJaQI!Q41*M+C5Nkp;B+c1&8&(&Q6I)VIb}{nDjZ^&PUigYoc@TbJ$!apc ziuepUkglxAL-IOWz~CtG7q9S3RmLpZq3yU_zfIwul~M`1&FR=vT=dbV=qEA-Z zeNs>sDk+4%tO3Yf6esKj`NiBXWL4zd{=e=Mk%K=2Ouf0ZB7eDOyvMV8NU29$D5i^S z{Qcen>VrPTG^ptB5X1RZdR7((0~9xL5V_J)e@UeWe_6SL+*@+8!2iBEzDa#O9*i$`hri(NCrytE%z4`7ZpS3QucI;1FD3Y zFO<#4+@Bmk8KQ4?>nTG;-%6Q6L!7%<&X}x5o?&}a%0!w*eVA~2D+@rSzW=f)S}l@A z^DM{Y$>;H+S3ddZIZ($6nZp_`tyD4Rs2Na0zRWP8puk@qbo7bseIVzATzU4Z51-xES{o|T-&VU$Tn0Yd#xb^--Q(w8EdkbKFK?k2Y+R# zyc`P}>Cg&76&183vR&vv59h-g08$l-$tC$q$;Ade$0$|A8SP>dFgSy1+ODJq;5_qD z4;+>!zr4JJh7f$N$SW(u(1WAbA}htTvZcrXFDBP>wDhA%fd10?K+p0}C93m#@`Iid zEI)#tp~FUdCawG1p6svjLL+{RR1$QE2|iFGZ)L zyYQFQ!DZ!Y@^Xdn#!%4=A69OaWuXcTKMZ!+PQXbuk zsj&hTEzu}jBUmylh3_t*i9QJ5jb4O}P$&L2y?HL7b-AY~1n;bLhUKJ(s*&m{C@b{G z^iaIK9MYl5pocYAfO!MfgbO)NmEI@>60c+6}&m1 z)rfz2d2qEw(o9rTQnqp+oRuy1N^A*A%3!q2Aumtmbb{p$@n2NDG*rPuLoz>@<=_qh zJ5=LpEbhyeLjY=x*Lwiqu^f$+RV+s}B-Wx?In#0`_;SST(u+&WR+iEj#$+N#ou@n> z6D+3G3Rbo~I{t@73d29Lk=kv%^jB@!U89tOekjE9R7@PI++w^76cdLXF=hA> zQ?%M*O~vUWuHGZ&(ONiSo){AtdP`^upapJxV~0-&f)+w^@=GwDLegwnodEj59kGk^ zEGZ6F_7{`$3yMpMgR33&)AkADn}>N^%QP3*-EQ{@yG@>k3jA2G`{V0swFD+P-auNT zpd^1aT>nr{KWiCZQd|npS`k|s!W5Qc0P#AWHo0(>vO zg(G3lLaP9KKTC~B`Qi5~E8(d;(BSei?ElH=sbesL;nK-m&mE5Gupj{5;n=P7l~&4Q zt5IA^6|)EEukCGlT7e_LjA^g7oUI);C8(Us;VE%AGI;4=9ycW+;?7aKb30|%p1*`n zN#Z#SpHOY7z%7A*G@Uf4M)%6CjOu8nGCbJg30oVoP3#dsrh_G+=THu9ABg zY(LRR=$K;2QWaJy+jk#dTbAths$V?`^iYkAX5d-sQA3cUbE4hm>-P!DAg3EE3k>x7v@f1-h{l_K2Of{nX{+P z!hVwl9SFr$+Da!;3W_TVLeTpVTO%HIxF)8{zKCZf537N)ihP=~aR>*mCVbdw(dfp& zwO3y>>n|l?u+*ci3D!f!IA$ZR$u-ci6n7RpB$hhZu%bf_V}$%mj2U|-uB5Jyo&V|L z%nadB3@#gLvp2X}UahU7c;~(ZhbqNO&{Gr9|LFOG{PO%IG4G!r3gWO7>-8gLppzXe zIk5s$jNwR1?y%vk%gR~kIC0|pq4joYQRk<%EE=}WKDfGEP9u6^Oo?%V=~-sb>KAMV zD~fsjS6IBX80+e|URiRO^l;(Fl1OVLUMAaQY1Tl?*uwZrvDk+lhx}q{A;gmB0M6 z3Nl-4;J~3WM9QctP{-XoNYN8hX;WMdJBH(dhlzP6TVRJLgDKKjr;%Xiuoh?W`pSjh z$`8`^M;|FDOBO(r>GEP6W5fU0t4_-lN(ZrKC=+arj7;kim6_r-zWHo~7063eDrv76 zkE>cbGq(q`&0;D1+R<3CrEg6t9t~T(R1*u8G(1 zRN9NuQ%bArYtlK~Kbb^7EP!iQbT zq`XBF7kOvR$eS@~#xyZ`!lbFwrsiF!DwsH2gNIj#8x10RLf!gWu{O=#TE3?6Ehs19xuJ_cj3`5Ur_lCXQ*A87;>qj~v$gNyz zm*NwHb1`-%<@(Nre-DN#N-I5aia5*^>?+O#8}@Br+%|3fHgJK=bId!zIr6@2DV&VG zZlU#&UB8@aa3)@XdyiJTW9?HASTOPAot?KRH^=9ja4!Dfg~r4OR@XkR233-qU2Xpp@1wP@xQ`Xa7ZF54xJ6N6GUbyy8KVu@5T5Wyl4h?9WUvbqR*Ev-~c$q+(v zDa%@HIxDi4r8=XW<*+>sF92h#awfH|jAxd17}}Cm=bMY+iyp3%HO5w#F^;K%n0)}p z>DAi6a20GVGY{W^!5n7Bm?gq84aFI^5vy0Pl(1xr&^e+{ff$EbWtG4*M&BOc5q$=o zS;sn%6%W8#S88_^0+qWQfzqoGh~9ue>6;NK{%Qn@ud%K-TGv}~rF?f- z^cGwx|9#f=_ty16T&et{2=sXXzdv#ff{m}VFwvI-uS6(82w3s!G+LtDJD; zIf$R()yq&h=f~#9j!)~6k(EX1Q3=WT!=6m!HbZMa5h2)LNA2V5V|0A zKyV|t5PpWN`w%{}WN+~#x%VTG9G~O*HwzP854;=UF@(FU_^YjJ6|R*Qrn~{*c@}*> zuHz8~TXZ_ECn2=-OmcsVK>0tmu7AOGr-dn=K2L+b7vTmgew}q)h3mx@o{#Hfgb^0q z57$!>Toz6B{DA&wK&VF``ep0-G_DU=_!eBN5SCl?Vq9k-oMq8e&iU!1rP)5#zTP-S zwnb&mi6pwGBP>KHMYsat8iczL9!Gcy;Vpzu5WYb;gwXM-M0XE_!3gIdOh;IVP>OH` z!ZiqYAv})o62e;upCEjLa0sDe6y*^HBb-Xp9c}D2;j2^p^5-L$>6Vwkr2~0T%zG?H2jE$>ooi~4e!-(5|m)q zKTN~98ZOpwRKxV=$*Tm-20}c-_$0>9GA3;b@hao4jNf65pB=;J6UO+-HhjKfd@AFg z8Fy!#gpR5b_%TF$Ix!|~3vn9b-i!w^KArJ6#(f!2WlX&X{WI>*cnRY(8J9C2!1xNr z0~tpd4`O^5<6(>+WsE;hgU|Dfsh5R#o$*M0{HH@VWuVgISy_T_T_cq2-hxaj-JUqr& z^01w;)ZxpFB|on*mi)ZSSn~4^#-}q6CgXmLe`GAjT?=D5?(hl#^drX+{l)SsaW?12 z>qfxR;|^q;$?+o@pTl@O;|Yw@9^*-j=QGY`j5m`|r~KTg;oXdyx7|HIhFI2kIg;u!(+5#tLuzBgm3!$FJ_IerXdS$`g5juuyG_&LS{ zIpGb)gBgF!So+)V7)yV9kg>GGHt6OmA^mM9#?s&RU@Y6pVcd%epB8_$hCkJCI?Sa? z78QjWzMAn+PPtEu|4zf_z`X3T>ovSf!(TDZ;(C%`f_DDl8ope^_i6Y;4bz_ovdfOv z@M;Y|qT#PJ+yf?Vm-T75TEnkuxIKn}oqvvoZ_x1T8twphW9Ofw;Y&6AB;$JpeLm9S zQ{kTMvV9o8!+Flu;zJs~Ps8spmh4sg0y&FiiL;A~*}NPH>p zB_+OG!)tiGDC4gXC}!nf%eW8`S>jSvPc0CpYR=PuE9Ec7S2}jJHCXQjfwus|eOvWx z0J8B$fvL`l-=yKqTK-ME)|C82c+DyCRXhqWV}3U9K6pLjjjH}yAiMqsU>dcXn73=i zHpSbuT3gp5hs{roDw{2?*YFLzHkLfx$ZKSYZ_;?XUU*bJw}}1<-zo+JOP;UgwYlWE z2C=f;T3mIWDgTYk^POTJc)kaCi?~zc`A+1pdA>`P%@%jF-X3P1$UJ}KdY%wz)rs!c zxt>S3o(~v5%KhHJ_%W988^(|GdjBBfCj`yRQr;)DcAwN_e+u?t=XpjfQg{cShsd(e zi7Qn6^L+l1is?T~Ji8uEDEX{p85=~+HFn?qlV#k*ay4jU zwgENT?fy%P|4hSQYBK&?&?;N<*~n*M5`QIpDt<3sNVNI6R|NYGWHs=2al|Ne`4?dEIA8|%*cUeU<>{}B^a z{zKwCgB?2{eO#9-e1>bi!hK!WDBREWkiz|4uPc0}>(2@gaJ{GSK-WHn2f6TPS}ooN zyE-d8#MNEl3>Wb6uqHa1D=e(cfNe4_#%6&MxwYCo}HiqPgZY#wWVS zKTw^uxRT!Jr>n6xb7kSM#*WWIJmCgh?Y0P0{R5CcU5s(1U6<${4ZH<7HcyQ~4x8t( z%!A~AoQ5;$Z?IW%o#UdFpv*Jg)mPyOu2Bl-xMnIm*|k{ViJBcwa?$K6>p7SEE{Eln z{LErJR`FJgy!w1WeLa`uy3kbvx%@1bkL8kMEsyPRCCATZJ6z9rjtff`QN#EG7cSy1 z#&caXZ$8TSLYD_v@^+!(AzRFIVJT+CFLu$YS?0-ir7OHdv*AM5Xca$S)58M%6;Qiu ziK`5_7VTzR%m!7>qPRr z$^~<=_`lTUQTQ@#JYMb^rsCIVvRvWHR`FFXufpqGbAY99xrBL^{-lz5lfE>l_^d@< z+qN5ksq6ukG2$v$GG56t%DH!_I#_0c8xO6jaon6U4J_8`$a+H`q3C7we}h;GB+q|^% zt!(pBF4T#S#P@6Q4{G=!S1*<4Vb=hKAJz2sn5MTsXnK2G)7ul8-nMCa+o9?0F4o)W zkgG~;ap5Q3TI9I6hjl2&#l4yi@7HwrdnHRPc%*Snay8&eI?P}lzUZof4yC*=s{GmF zC2m*7*J^mDHg;-VCtG!9i`}l?3cunSsPL}D_ zH(d?jO|F68)W-Om8lP{u+F50@#oHQwN3-pBwZ8kSYlO=Gp4KmacgikLb$v?Y-D*hMO8ifzIsulj# zb)&)uS$3(DRAZZpPcxoYxU*5Ka2MkZg%7zJ6c)x83LD0^3MUu`6ize}p%vLy8-s3s zNZi(-6H|%ZMy|r`j68*tjb#eAH^K^cG{|epvL_h#Dtwahgu*8qPb=Kjp!+8>|0%{B z3ZH8HRpIW&CkmftG%DP~Xabgg&t%&ugAG)PuUy+O#;;_XX^I;ocE2}32UPZ2wwcq7 znwxE#Ii3Crv&GNpG`uX_$FR$0i@qA}XT-*Df1{VmKfs9j|A9u#=MOSs>zN_OVwFF` zh|S|ejhM|0H)1w3!id?-NF!!5qYSox_@!)-rP<5`<2hCTXw7EE8n3GOamHU1&NTk6 z@Hxik3XeBTg(n&RQ8?S6-f@VQ28eLKZCMa54w@EE6+|2$)e!si=9fn`6Q zZqVB7F7C%Z2K6J=UyC?f{|&&LpZm^h)Zb$JUa!_)GY#7xW(%K&^NciA|p-VrN+q$ z7aJah%Z;%LR~T6euQo1H_%dU$!j~I44S}Xoi`e(3g2va6u!kc zQ{mf;426GZj92&$!>jO}#zhL>Z7f!Ji&3WVy+)P7zc+4D_yOa0z%Q~7nF%f>Z?(80 zn)z(NmGbOjJABkAzumUOM^*l8@fh2)lx-HJ(s-kMXR+b;cfrUo+|zeqHl3Z)kqzPsTSY&znZG!fzP|75ZQmLzr;ZqZ0W2AdRzKZXeaIwO@63P`$PY5a8 zH=#=5ehD`L4+H;M;F)Y}w1r84@xc8=j`$Eivzf~{S9~}z$$bf9FBa`d?i$8eCE&Tv z`x(y?Uf|~#&lP#VZvuM+aU;YB93K?(5l{A9h`5D!C6XE$F9vQv9*QU22iI|wh!6RZ zDgyY-L8u~tPXM8c06y0uR1v`EL4+y-_|Vv{B7hH#!zxDq`<@|bgzV|q{gUhlfwusY za->hDU9pW%P(C3Wr(-qfJelVtu|?sN#Wsac5w!}RD(V&PE*ca*P3%*+2Om<%I(v#V zI4Oxe!lQ66k)d#Jk)`nI!mDt)SgdegQLb=5QKfKyQKRsgVvE89#5RQoiduySiF$Tw-I8WiXX`jDarUzA`MEE_$=X3c(lk+c#OzWc&zX$oGBJ7e2yqrc)X}mI7`$h zJV9(xc%s;*@FY>IaJHydI7c)nJX!2h_*~vJN}i{PG;AOxo+>;FPZJpm=ZY+arwgyb zGXy>RAj{4a&4q>l13X$IK@!0&H2Al;RD4y{DYxDap2CY3-K>Gjx8PO`f`!2-) z%g>0Oi?L88u$jZ>c%Dg{&-v+2B%Z@z%uv)Y?#0AiTKsQ)ChY?*JCy7BR;%Z?K9e@C zJIR&B^<2Q1q1dQl{h744w0HyJRmtpPn1+{Vc&mor({L9oTkW#?Gig(_c>S5Q^;-OE z8rGjl>x_+>UFTE{S8I5;h7V|XsE5kl%hJqa%upQZd9#~14;aBmf8OjNj^}9cA>+wR zn80U<9%2ff2m28?UG!nUDxb?rXFs0=v)F=oOs&@3L|)g%eFc^bR(yYPg2HFARmx|X z(s{3uih8n85A6-R0jG;0A`3oT`urh?wd=_cScY454%6^R?fIEe;&zp1jM%F1Sn;sJ z=ZM%@%|v0U_-t)1&Jist{#+3|Diyw7#Lho&(D2P- zi^_A0ct+vhiCTs46mI~_`_vg~%~K0IBD)>Zi^l9GLHAxsE{eB#YXG*}B~0~XB7Zu@ zxaSY{ShyD{wobN+M1}9y@Ph*G)zaIeVt~Sr3tEv$eLf*#=Vsf)3o8Ce@ruHK5N{~F zUDPZ5taw-97qxZlOJc8zf0>`gl5OqO*0j4sUuCPWYU|iN;%pUPC(c#)H8D-$KWSs< z&)V2|Q>;{Z-V&E9T(6Czx5Z5={#|XY`&U7Cxh0?PYwO;>i`c!nkF_=MC%Cg@=l`dm zzxgW5Hi+p8|4YnK_)~4{e4&k%dy(CyxHA4vdtU-rXHo4x-)#y(S;}6KB|v~uLYv&1JuM{7(uAf-nwyp)m76rV zX+yKz-h0yp6{3QGvJ^$(A!^|H07V{%iirA*C;|_~imZwlkU!vtRZ-mi|IRrx^PQXS ziaZsrmi%Vs%*>fH+nJd&^L@^>+r1%W$HP8>qi?_pC&UM+bLxZCS@R*v9_G+ssZZyy zpxfg&2T6~QRA=i)DVwMhf-z4sD|oNRvx7|@pA=l-aZzv$@BqqEYxZIO(~S4^HVhL8 zcl=KR6aCvjGYfaA=sr5hzYl)jfgJFM@g(p?pdo+4G-J-AK>S_{`;f1%Q>d0-zsoje z7PB1WUQ(8^zSs7C^pP?4g{&0b*~@Fy8x&zwH2{I|Cb+IJSE zx%E2e81|O}FJauojvnAbtXOEQUIRQ1oR1KhTcuqIK1{8H3KTw??==g}F-XhBJ(kCP z@h?>N=SQ1%PjiB@KcB^CQ|rJ(t-%2feq+GUh7H**U&Q{0^St~a#z*+|(FADS8f_Ao z&bV#_4Q!ZA#~pe3w*!xxD3|N&jAKkMcE6=&2I$4^w~X&}h&^OE-{}y0$O^Uz6nn@@ zQvmw!aXMA1yjAdZWuIqa9@i;cul4{N%;}zHp;_T^i|O(BG(Mvf87?wI-hVOMC5rzN zwKnWBw|knUN(Vk&-LqJ3zUFDp;PX96=Pl+w?|-^^(Bl;fC(J|MzuP?Jaj*G_$9*O| z(@&Z`0weJuWt)Ds68bw>@c-^SSLE1DaYq zW;6|H;=2*RrveE-6Zq@ueG-^>mwh)mvZ-sj_9rP{;Q*sXVI{)buzU1RR?{vT0mpK(>c*D$y{EM$%RTL z7a^6f?2i9Q_)$AKjm!QCbK9M+>^E`QrQdzR_t^&X2~ayeZ#H{*{3-66!oy7_0)M%C zBJ^i+`gfYmKK;*d`UCJEN9(6CLHhFNI34NBcW@txI&sKs?9uBrv6kuQ8wnV*x*jJsUf zPlm7KXRhbJ0eY+}O9OV&oUYY?vtSx!h39fZu?3fc4~MH@jp%SS-~Sap=dxZW_O#*I z(*$T;UX#G5;UA^hhrfN`6Mq<|fQP_8`4fJv&F@*R-(BB(xtQr?@8v^`Ns_R|WqdT_ z2bBNr?!Dv{QTvy@m%|xzl4f`JUIsXBEk{0IrE|N&dhg|r%6~2z;Fx4<5(;0g@MeW0 zP-`50ox*zWWmNg=y_Z{+|8Er5doQ&(UUliOQ}`~0w2h~7 zjf^4s4Ej;{7n(!3kI4HH2lANn4E)Ej8rd5;Orn3`{yXc~a!2(LUZ+T3Mj(EIXR0?P z4pSKWB%bC7wN5;e^?!+b6kf=1=@gjjJU+(!m&eEAwF$QdIgrN(xr=%*j|p-Y^$=cz z{DR9nGiTj#s7+@Qe<_`px$JXH@fY2?qln8cWjtBd9f&jz{dR_p+hBEF;knq4MGa`% zBnep`q0!-&hvrVZOC3J_Q#k!Y;6IMFc_`ajCEGfd?NLm#K#iXZI8DhHR_AaDZsZ*` z$@dh4Wxa_aF0K6|z%`5|?jqnq?EQ{;ep*#|7ppWEtGwEk{lF51JJnp%Wx5eV_*tsn z25IFwl6qOpvXXjfz@pD>9u&bR6G;qQzuh2uHlw}5}=e;mSJOY1d#cBA+0MQ^_W z(lAEv;U^%gG4{>f!~c---<3W5dldcl#+JV_&DLYffl*@$tgU7Zu;XV~;c|qKSA7@s_@Xjc3Ax_z;ZAjb01cjgAB5r$vMVAm<%x&KJAK>Xr z`0RcO(yTQ_+;@m(0^ziuMtBl`>3n}V=UZWleZI2xku#w1c+8UWX8H9m$#;;FG2h~{5AnGD2=lPf%=jNy z_Km9S8<}3xd7GMd-mdaJSLJ&i=PP+h+@Emz7nm`mFXg&GrGJ4+|3W3(ixqyK%Igw! zhVnkVj^<=?xjHx5#P0}6886^6N_)G|=QRPer;R&_zh~fIfMeQ1^C2_oq{|+Vp&$B$G zjJGKH-|F+40GcZQIP>{sQ!wG=@MXp4mwns@^A#nB3B}vpN)BIBa*()voc{f06VjJ; z?)@tL`&If6DF1IN{GfRQsH87!R{4HM$z-#77wfwwv|V|av8*xg=P^h6$O9~&bHQ7! z`KIS#0?4hwCxI!QP0arjW{a246P~8QJOK*F+xL}xo>VrOPhnnkG?VJw?P;z%;YZT> z2

@>G-Ovi|076Pr`rPJg@q~^OUWX$&XcE_=%Fw&sDv=sOsf8j{8|I`|~V^|KWUJ zG7~;udHd@L&UbrnfBjbF`?AXS4=Ue3s(gRV`98<_zQpz>;TlPJJZjbZ%-7t}-#NDTi#+I4ExKIC3PXBoLkHbG4TV|@f4pVQE zyjkUSq{{24fJSs_lLf)3$Hypqd~mV%KS8}Wa$+#y{bvW?@c5+QL63`qA9{Q;V=336 zp3ez{(;iMW%2JD4E3RLYzvE{T*rnre9q0>9X|U;QPUbO|NjLn*;UCJR)aTV;%9VeG zl1a6aNsW@pDM1E#i+oNEF7UW6xXt4Q!IwO42<`)xGLoe)bP+CBDcAeEnCH`i)Yl!) zr>S;wn&Pw7+l)b53J&t=FAfSk?g)+r{xGMxEExA`E>mgJ$*$vH-msFgoDq-?c^Aj+ z4JLftl^pkB_>Y@jC97VQPExh2ekH>JCBw6o4A-dlTZR-~t8C}e>iw3iYFDGdy`KMd z!M8nLA3WyqhTsK{H!>Fauk<`mAUteiYjWDyJ8axZ{B`L#{2a??ESR{*)z^6}pFPS+ zK4VHgV?M72^DgE8ZY7`hDEVBd=M<+E>&&pa@EGp<9ug=pIY!kW6Nyd zLRhbkf5Y+oLDe3}s@1iJt5h4iMzyi4g91f1e+X0>9^`kxXQL`WwcT>_07! z{HqxMJH5}Z_eS)7$m=$ZT-9cK?~T81(_E%Q|7n)hDSBS1Vi@6hgqTe@YFhvUEyckqMGl#8Z1s5X^=U<}sJfrHKRE%#A z3wwV*7U<0xZX(`#yrCK zUuz8iG4o7T6uDz~05xumTa_`d<``bW`TpOI;eU^<+C1hTLdEYNZL8MId2v=|y~3~N z*sjkFZ%{luqVO~<1IC0+GhgBL3g4#i6AHf(Mn*1ft-|Lsrd6~tmolai)|jgq^YCOo zuIL|Dc#oPe%|eBjD7;?b8x(#_;a@R+6X*L^#)mQ98w+H*yFtH086VF0SjGj6n;91} z9$|a}<8v6xJa_@)6WMAn$s9}u;X;)e}TgKdrY5E^babUJY+v6 zNgDk-5XEq5HY@ygg+HzEvkD(w8^&Fw@U;qmTj4!0sg4=> zEmZgdh3{6F#Ommy3U5^SQwsk^;loi4F7Ch6zC1`n!SkN`|$0p*+_rfBoIS zJCy&=6n=9<7#Ckn_w{m~!uKnzzZ8a#9s{e<|^h5cdI>bN5I$dcBDFwJ6hpm_`MM+`?36$OTmST zx8vC=Q2bATWdZhsnV%!g2JmwOuF2&aFz+dL(LUL30Q5bCLl&+qB~)n!7+V3pG@*I=qK&?$67=8~%L=Cp@X} zaqz;B&OaP~`S!U?;nfOXuJBC?)49$=4|V-PMyn$8igoqwg^;Wc<&jCkG2j zK2R9(+n%1hFVirIDP=5ra-H(mdh&?!-xdA#Mn(Vcq~AWN%JuK0-)`Y@y*m2swC1q? z*5-w{MEPs|cAfIyUH$e`Dz4UVf2{mZZV7oTenR0rP^2-5YK~>R zo?TUpW#3>|-fwJUdeMi^RB678@zI>-Cgs1ocW3VBxFwv<(<+_ay*o2!F_pKL(`jMM z(5zQj-<_FI{x2z9*cQsIOW_YHe6PZLw1@Qi?o74v*LP>K%Kt8f_1&527^cUBeN&_G zc?y3{;h!mdEEWy!{l>+NB_aJy;diqCLmY4w@bNew$>L1pdSJSvM>@Q$FM#nAe3V+# z>32wuH3gog5Z}mg^v5gPzZ1ATcPf6K<9z3u4aj$TC*_Ox36bwi;BoU7wgWtg@tJG~ zSjl(=pT9IReyds=o`qapz6rH{>`}N^onQ3vy%H%`QmxnUCWcQ3Z(?{nXu3Tf;%{q8 z++lTpCuJr)ON4yWIRDE{fybNt z`yLH=wV~Ggzh9l5eZVBW|CM}p_F?AXKg?$Ea69uLZ)giYS1bF{|3FNa?=}9stN|~6 z?&-}$3=X#%DTYZtk&Fa3`r_3#${uc9q z$Nz2i^7VDAdduZD)n;y2_%kN_4%Fw=8!va5giq%Ss-4_ruJZn0Qtjl+=0@-T71d@Y z%s0LNSIwlycjGHzP7Yr;TRgtUyzKG+8WV9e512hX{+4=2bh9b({@+n=BnrL@bvlOE z@#x*luQL9y`5o}RjIT8>0e_1zzEutUDC3Wsp8-o7{+M|I*tKD*>+dtor_8hP|9^~c zF_VhM)ypJkT|XsU3qH4izR)~s3LbQA{t<5Td*XO?+&rS%+oOo#%Kn(zxA~sJ-&gmn ze_#qc{ZpzhOqyEn|BONQw(b4MoayoZGjI3!c|QM@_VyF-OIe2sBvtI zdCb%NN{wkRsWI(0=4DUwd-Xo&pVZs7e^z6iV5!H)xE`gB9_M=DfNc+UXpqm^fVfGO7E zy@IeWzadD$zlnL+FW3wo-pV}etLz^4Q#{O2JnXM{I3OtS=^vGh4hr<;QM<^bSR6HD|cqmXj9IbdbM)7d0;-Qdvcn|Y%Vz3!Je1zpN zi+PZGnWgMqPgMNOR{Wf#_&HheGbfnk%L@te%~z~5zjn8{l^J^v|S*qNJ&@8sqG z9C#ePG@S2f=hN|7=I2V-nJZjj3Or4vnp3KHA6WWqwOQq9%2}rp|M}|esZ&(H7W`}Q zQwx4DM48_M(>wMwzq>xA=k9UP{F%#AZ&DBCpZ;koeJo;pI<0EIy-lSlSkgSrP-B|QX~xZr?>e44RhlS} zPqRyQb0xBH8*TUNir=gvX zacOb)|DX_`%l;2>$d$l_WOb9b`cZkvwJQjK4&UE zXR>Z4e9q)GrttYD=5q$qAI5wZGJdnV?<}?!!ov}2U3ny1E{Ok8{3@;B0)8h`Fl-S$ z|AK}8nTr3JtQXZG-!WL-{Q+g^0;ap+wGX?p9H+`6-%XIR;M)pFU&?Ykm!+HeKY`1# zj`1um%VmsDa%#fqGM>+Jn2rO>apV=s;S`k0m8(|CA@^=O&6ZM@dV}pPiyM?28nN@?{F~JL zzEH_Qu*jiO$)S?vPypTvvD)l@#I=V-N)C&Z92O}#w6Ywe4J>9kNE>KlIY=95XE{h4 z=wLZWSvtV61Hcf@S*uywVpETwbZ`ZZ2;#)AXo%U&-~plKp#m?Vn=Y$NNR+GEPGK zGv*S;{j9%@GhW5|!Dkt-W|`c_c!2lHzRmb-(~P)}FJ8fwP`i3r%V|n|rOkl%&zP*oS@RB$NAX&!i@T1$ODS>JtG7%ysPCR^H2>}C z&oN){_-*EHkKeBLF5Y1t_WtLZA9#G8`LV}i=2srS)BMrncky>og`anu0|UqB`G!_D z;*aliOu^EAR;c!~g4@pzA?GplIvPuV!nl{$n=do&Grxs@-swb>s}&1I^8T?T4bu1#w0yF!f> z?^k2R2Ta=2U#aT!gUVJM-x={Vf<-WBJ5^3(d#O zq?gGxN+#DRnOvh}@?kaRT&u>MkEk&R-=qVd(zZXQWb!fiI+WbnDd`%%=x$) zbN)+>IX9>==SDT=2o{-KqhuocOGz&8EhhE2YXdi{^4_eiW}4&$(UcIf8}Hn-!lobKRZ8e16ePdOq(^eBPn>yhHK%dFJyn#2v>Q zywp~&X8Z-I7shvSz1+h1i>h9}sLJwXRhIuzW%-IK%Y=H@<*TY*?&dX>$meUSUIa^d z?@;BvgUfpt_$f5^o75AoUhY-py;qg@URB=vRK47<>g9e_mIqW>zNyOcEmf8WRlNun zKJQh0-phRcFZ20?ne==qX`r>^H(+=AFm5 zUS!^RoaZc=cb-uD)laB0eqWXANwsJA1Je&Gsf(xhogBeGRC|e&<^oUiG)6~9|BTwl z{*l^C6fE+2NXh3RmXD0X5A&EK*CL9?*5BGv>@Ewoyg70}eJ$TOJJ%VuV-ZKd2 z?)+dz;M#^@X#>xzHt;;RffFIaF=zwfy!;b2FaK1{%Rl3JISTqhd_!mA`>s9g9fWJo zy?MV;+QZ&KxDMJ!-C>vS??~I;FTj*++x(26!sGqbo~K~pfA1h%W9}W$8ncD@IV31} z((!Y!;^$z+&%uhHLli%UKvIr}nTnq`1-L?Bc{@z;BUt!3Sn+c(^V7@x936~#evVZ9 z9I5y@Qt@*X^CSJGAef1KW&S!kINbAawBqyF;7IRZ7%cGkIK}7j!3ytx0`C=z%moYo zM=Ji0Wd5Z+6a>^B)^S;i0`mhW+mlpTPEut#NtLBY$rf=v4|9}k=PKD2E1m@lZzn0< zPGa7!WPZwnZqHAt;z!;Uk+xT=_$gz4`nd@wq_BuwKcqLCH|C@OG-=?NsLN zF6O5tD1OS-X|v*|S@F}X_-Rr6v?zWSDSld2|6Q#35iI;PD}I`ppKmcg@nDnZXNlrx ziQ;F8;-{1Okv*cgs?)gQZK=Q@3gd46kP ze&}SlLh-yp@w`Iu{8lAH#Pw|{p=8*tWZ0u*C|Gz~p?F)ty#18d>dYt=fL%MT zuI2ZXq(7#EG4C%}%9~W>O>%kZ5wb#jDR7G~?>bf9b*jAURC(7c`L9>}Z&duBqxgTD zlD}Z#XPx3_9rHu{_ks78Np)rcyg&FP{|?~e@b|TJW})v1>NiFIooqYbH;u-GlTowA z{G;zK{j0pG^3gp=Cba8{?@}?Q8Pu2~(HF)H?baDn!uUgs=QCz#h86y>!rxH%XN=#( z5q8CvGI$H+E4GyTGM2o`7$41!dgZ^nwv=z@xFwv3 zwZb1$_)*5!OMw$1y*>*oWq&yfJB{&yOg{pAJXV-9OQ+|b&$!)OT{b=c8sI{F@r%ac zTY$%bY0YxG#dKaKbI^U9j^O)Ep7;M>Q{eFfrr6_enp%&)#rwt*_d%0_|DBxg!)7z` zy^r&HnDZ4H+L?9vKB8=p9#!};mDl5(ro?^1Z1i!zuh#odns8nDl$r1}KUCjAdsNvM zJ)>-j1U~{k$6z-_Yb(l&(m*$6`Ap(3{rdrz>sd4LbYA`zF4wcFT+f2Sl}p~16rP_~ zvidRVz|s7~Jmc|C%}+i4xw3J35w8Y1`d=8*KqbvznhuYDWv=n~*XCA_f1|$n`&;u% z@Bgy0fBT);FXGbty|RV-gE`&%|Is|^@t@2Q82g2XznB7#|7wR98q|B zFz)^L2)^U-o&mkHCF$n}zwmgk;Ex`|k`)b9X!Z^E_ISVGV2@`6M|!+}Fx%q;f_WYv z7&Ll(aM11XA;Bdc9~ykv<2MDL_V_S`pEDEQ|A=7oHt+=MmipcAxsClLr;RxoP9mIS z^%tg*HU6}2YLoi}WM@d_odAt1`y`;_hcM;4S2y+df?)hP*FFnaKP-U%IQ+x@UVzr% zWO%f)i8>~rQ*n{)v1$!o7@X++j}OSgMQCOPVAtXkgS8&d4leZgq~IeS7X`O_JSTuv zrj0u{*bF?YoA{3gW6wMOqs+hL6;(XTyPD!(7S#H5DuQv3D}zaotAg;{rzY6q{pSUg zs-!bN2*25VY7q9X+92#-bwSv_>VpX%w=wvO$4$Y(zP~gF;Wy}8f-&#k8ie1MUmV=% z{o8^kJZ=x3@wg*+(c{j5jF^Szc(Av}UBM|HFAY*2FAFw$e0p$!$IBIl-J175Q}xXd zPe5kWhNXRWdi|gL9Y2$RE`7q($7{N&PR|O8f9mS=EY&8@Qf=}qRlf<{QE|1R*pt4y1^OW4iRKI>_Fy?6l zf3=&&sP()ye1P$W;LjMZ9hQ^?j0Bj+s{FfN>4Ai z8R?HYczjqS99Q2Q zfx2(YczC4W<0B&Hczk5!ogNoNHhFw>gjN_LpJOApd0ZF?+xE=J1K$7m$fU<7M4t0_ zR^-=H@LH5{%pAI1`4Ihj&=i{4k%AZV@-JkW%vSX^Tgl`kC6gkBPmb*C^PLkp)Z@94 z!#plga*IYnJL*#U)Q~NES>%){_)_Nor0w!g^dDgUt0O7!FFIZ|^M5OsrCPP6YE_mR zRmORdTA%N!k+84TM#BA{1**OpBH?`07zy>grpWxjm8Cfn&POegE4}||kxzKs8oABm z#gS({Zi^fMPNh9`M4CNb5?ShTJksrPSL8oEUK+X6&dSJy_wSEv_IOp~d5>2|LLF})66$zoM?xKMFjAc7 z_!)|{dpsOD)8mmy%HvezHjmdvzTj~>^1mKu6dsL`t|jHIQFvWs())*a0&RiDt2=wB z@66-2C-p73!1Mm&0vJ?lE^$e6rsB$l-C5pUAZQK9dCpkKZJ>gdpR9A@cS)e z>J|U`?`^(eCCRXm%kpZz)mF{o z;fEBa3u!UgDZISL@=jE3Gj{{R5ueLbU0p1p& zV#-)?Ze&l7-=*-oBjK9sd^O))5DC{@7e+dK+>0Wio_2BMZ14ZR$a;@2iM-q6OCwi$ zd|4!1i*1VBGY2^ZLjn_$=tA`n_K9dA;KEzanq+>EERACzPJ~$q4mAX#<~%AUTU~iKIRL z@5n}vZ;gz3d|TuOk3SvxrpKR+92vNDJ{Jksu-}N>1nwlSdn5OFd|%`@Q}E?nU;o8& zxSH{ek$Gyaapjsso)mW+G_%YbBj;}n-(q_D-&K)1di|~njik7T(igVd zpE3T|(!uD0`?lUZpUM7(T*g;Z2W#eh|8I4$zvsQ&IP?GN=wk`ai>t_7rtqt&Q+*lv z7UBej=7I--$IWzJ2g%&D2Qw#lPuf1TbJku8zkzKjh31XwJV@~Ok>)JCm~fGuk0y|Y zOJ@?8^n_nB5Br(o-{s}gCJOeBn1?r79O`MLfjJ&#_;a5Iyy8Ke3J(YIOSgg##>?)` z{}A==;-RM2`wKo8d5ytBl=hSkXS_e#8B#hEpmpg_0@van`D3^+S@3);=n0PjS1EiP z{9a3QYa_}&hBDJ{Sm7%ao>2G~3eQ*-#yv&hHpb=DWXwwC{{e-+sPHoi?*qkUj3VM! zp>UtV7b^TIh3{7Q4+<9zglXz;uV@<*{T-GrreDB3bTh7Jd^Y0-#-ofI8K1|viSc_G zH#7bq;}*u_j9VGs%(#>Bos1cprx}m3gEaOrvrgz4qw(VRul~)T=~z^~TJ|k7IWHEQ zsm%-9K$G&fPQSe4SCHS&7|jM(!Fzg)(y?=?MV%soatLLH#0Jt?oG}$Lp=k-b9&9H z-ri`UcVs9vFqrI{V+Mw^)!CBy>5`h0qa~#krIoSr(#jeSD{4&d>Yj9UHab5YttqZ4 ziNa@aWO!8pM~v+#;^=T@VAXK4Pe@CNw7BNv5*t4^v}{Ufm_<2G(WIb`>?8xeLo> zf}}*nBQDmB4D^BDs`({VCXpbzgd~)pl9igo!bI=jNbeeQ#>mx|Tt^tx3lsgRk&F*m zHPGh+28Krnml4s>NMF(i3=a+rb6OmKq`%)sPf7F=ijvBv`vxS8-Ke2VGV4>!44lI$ zGI!a5A$Blxql$<1RAWB*jElqxu1BY!Aa<fG^?UO>$Ui+x7s-xvd zG)%_@C5QVEWE1oeR`z6)y8D3?VdP=Fsh7K4jncrW+gJVy6ATu)TgUs6GAR>3gxP7lp^pB+1SI5x6kr<0^ zEouuTjJf1jn6-(%o@`Hbw1V1TB}&}immuMG#Y(A${ zj1s7D6;BoD>&;hJn4PK|UnjmQd<}TPD_Ml4RT9q;bSPgXRxP#Y*)mb zf{xZRl&p?b*{)EA;RD?UN+yC*+_S2RN-!wFr^X;Ro*|>cpv;yfWeZ!wvOh)=)WeCjSInt9yp~29w+dOEF-S(tuG#WIesvfsx_ru2LEy z$}>F)OIclNCsKHEs$r?&Bhy+Ll@%j0JkrTbb|j6dv=oC&X(^>{Co9$!6Fu3Hp@CkR z`XLvcD8q-7VyR#YN1jD+BO2dM$%LX5LV0J zAY|J{&7(|;0H6AyzV>u{bY(C7h19%|V`Z)|acB%nMw6q-rcsi9tjraqH#x8_$svtH zsVqbjgL*OzI0>d(J=lFq#G-bLAtghBpR33H`lc-Z1e(#?u_<}fvOZ50@OEZ zt}T7gZ!r0m*VK;;4WUm}mz2Q83Jl3M^n_AXS+h8q$@HvB4v!A4L}#s{kql9L`qI^9 z#q&o?0nj?L=@B#?c*(%G!oa(uwZ6r9z}Z$GI&17Ou)@^!^$pN)(lgjH+&@xX>J-)m zCA}lV{R68;(>*-el$I4)eRYLdP?AcIWJjQ@fgRFT!Ow!|*7TySfTP{XhaHkhv1Jw8dPPx1q^iOXKFfLr zN0X3hc`=u|ey|5@(4cMga#ZzjvKJ#zScdWn)-ruaZvGV*WjMPAQW49FDq@@!xnwv; zX4pm`5tCnQa(GpCHTglihu;d*)YCgKIFQ|l^!o>_uptJ_p;?+c%8Dv6QX&UON2+K~ zI^Bcbi7?TC!&F*^`v!Ws!gAA)S;?i*nOr-H*(sOAEulA{dNFBo z7@>a?F0AV8#1#6T(E()$>Vs|07@6YG?~=$aIzQPkkm+?D0NFG+ zst(LK=$)L4_vBUMf~h2!%6tkmWi3dAiMnLUkn+~P<;1MS^;~7kqRJ0-M_Vl-eCf$u zWwH6my88OYjxI3Vvaqeavk`1|HlEg4FXh+N*|J#9P+}WcoYx!FT3qYwD#OYyiuT!1 z*Hu?t=9YEQ;?fGJv(y$b>Y?*eaH6%bZDCh4H3ssfMiXyr>!PYIx8onQES-9`jMf(9 z!_zfnkA)0~%Zpw9Wo|iBQGYObC97;%xdBD8E8R1k>Bj&QFJ-sY5y;s=LvsRMt-7fM`_0wq604_G!W6X3`5mGx1q^Pim7HX+w@XsdU|rR-f8l7-8li3rvW=` zBq^(`Ks@CpTb)8r9;!}3*?0aFFcg5LZyym6D`97T!+*Ec#%e_cn3vI zRddeL3lpoWn@Y7*Q)N{o=Qwonf!-u?ho<5+0SIY9G{+Uob&*U%eTSG_LZmDtofLjasCRs&KmsXM( zOHtP0K9Ueg!b_^W*sg6Ws%oOxV;aSL23p&Pwn1*B#i38dp-8TwW@84Z>$D7GlE-?J z>vni_2r_b-CPJMWmLXCOB7n43jixw8FBUIY!}B_pJ+OME9z;h!lt)i5xq8-Br^-vP zwOURdNC6({@)DDU3b2xQ^WtS_DG*<>4=RDv-|Dc4ikC;-jusU)Y?2F>HX$%(1FNDX zSmtvhBdwJr&_4YoqcE*yRcFs`rTP6fqrKzCC;8TUe`qj&>Y=Li9(%L8m^R3 zp6#xb5Mw7RC8Ch&d>gX`1@2^}1d<)Bl$^$9XCDynV9|q6zvyvm1s>bCTD*XAyNeeJ z+m*!&(d}gMLL_eSLhBE>cfS4r(ciuPpfqyUAM7z@{Xu>^S${CeE4cok^mb|eL42Zg6Smd9 zup@7^FCdw2F<-dFFi(zJ+2d&x+rLy!zwEB2^lV(26tJ^IN`Yv97#i(dkJ;GG7jdxE zD@Ddsg00jZoC9^yu~xL0HfwRPJ%VjVXyiOz^sXKqUXw}inHy~!$huGnt*5khOUS$J zrFP#~$gGzg18XqZ)7}VXLz<&9rNupID0f%`aemk%rn5mfU0#_X>mm89wl3*FYi8sm#Vww35o_Jw-U?*NWReYr<-m+bucw;5DxlNsT zV_1h`kl>w+U72`^es?Bb(C=*G1<4M!C@FO7i5KPB?!=22JDGTiV!IPB1@2_x1<9^Y zydd7e#EZ~foOnUG-HDgN+*shI?{J_Dw*-l9ClfD`=!qBZolm?V`nxAyN+W0DWsfNn zFZu0c;$@OoaN?!(c4^`zLO=16V@DG&4)Ma>GVHo-XJc;bi5Exaxf3r=_I7=*ELLG! zVb7GrN)o#Oc7Gjfe!D`BVJnR`7cku-XTNGKHB*+ceg|RdW&%!>Y13xvvXi$q7Q}d7 z_NOB$%mrcjs?)JbzYCGZK0>(fkh5{X8%v%u@ay*fb9NMnudTLf!Yu^~b{h&12`d>} zZ~nx}z4}p3`am`fZD4C93TxNDtuC=>bw(#-*M)J|8=b&VOAK{(VssM4%FY>8g!Tet z*%kUb%LNY#KHWh%$jW-p*CM4D; zs;!}7=)@VDn9xnV2&!ne5`^vj{xsPw(lWLQx+amr{*X<;6%sP!1ZW#mXB9Jj*lyZ- zvw%$fXvOSw7St1M7PzhZUDH`0MvC;x=`2y!SzxvI57t?tUT2{O^GfS1XnDK5S+G5w z1@?BkrLz$I?&vI_-^^U5{@=N!Z1cSjZrE zrv=0Q6h9m{(7EkGOa(GQme;W5wpL9Vl9^u2J}}OXMO%h(knQ#=*uEvSf@S-bm^Exs zb7Rad7iIeeX5xOprSp~nn7O5CLqRMAwo>=NAsMWZ={H&FxUqNZT~1F}WOo_#X)%|9 z%#Z7<<6fP>QEi!FTPPcs&UuNaP)IEeyxl`GqJ16&&_PZe9cYF`bdo~)fb5Riv}mg+ zWidA{Iz6*)YEV{zuoc9q$CD~&7B1z<0GbH@O~*)k39}ZeDV_^9+Q{fCik9n#Qe=P> z`R~*eg=(u5ZDgCfQ;?dNPRiZhAF{=Y)G#Y!wtzUID&=EhHYR97O9XGyB8VkHDe`85 zv=D?ThE0XYLl;hILI;kna-MAx!2 zHNTM2+z^*KVh*6cU@UZt4>Gydiw|#iy_3ZU)<=Hv;T9QWQtZsPowe{b78!_Y7Zxzn z-K~WMOnPP1+j?P9im}GoAd}5t0!D)i(N<^&5NDfBFtdqc%?UG8S^}rZpXMVr;H)Q$ zXKef0IYYuw5n*5&i(}N{XqJu_o#?Rk%Ml$G34YPCqsszVQh3pYtF7p^*KIK`QjGJG z{5C|2BvndIyfg*u*1D~HyW+*Y94}rnSkI)AG{;ncyX-pLo#@5o4OWTa8WyMMcQuB{ z$)cb4&>gki%?33#$$R~7wosolG7S4A+WfA}o|AyZ#VEGj*W+*-bdt$AiM~vh5>_!W zH4P=x!WhnJVSh7_B^!AdHz0Q`Joy#@{NRMipj`godj%4cdBiP~sSzuuM#N!SDgF;T zoUFZeQd*iFVj(#GhKOs=+X@gSR>P1PKBCRSJ=6z_Kex&uH>N7JO%I=qNm!Kmi54E~ zC5oL>i9$U5E`? zF!0!r8rYB|yIU{>Klp5PK3G!02i3?$LW*e4C6%s3HceL|vIdhxU5Q+hu0&N>hY>|s zB9u5RP^Il$6;vMB2+CEfgu2~p&{5ab%+6AA zwsbVoYzm88A+K+4KfMj6E%C0-min&7hU#*rYimz*buMkIudZO{vWAv;-2xcA(Y+GN zr7nI(TRm=BqF0i$qZ1b{;VKa>T_C!Nx0_AG5vy~dD+^rp%`L4B>_%D0-MT2zRli6| z0(aZO&i17paaS1lw0AVNxx&B+o*U~Hvj-OkUR`hTREEKD5 zSz|+@r6DebfzPtW&Ugz%in74ff$Kf-mbbuW6@`I&0sdbX7n!0!D8G0%v`E&_S*%aI zzOL2MLHI&Na&41Rmyq!-dBbqHHF0`l%fjX^DP2h!lQ%9|+OiB{sEb=~DMI7&j?P3I zYDi>77ey!)v<#bBCCBb;Of)R*5E>~-)Rzo<0}?5kKxtaq8tAqtB|`3o#%0x5BZ{-B zy|YVvVm=D{p*7HrSD}iZE;Pb-G|}2lMaLZ`y8bIU)uBbS;_40lQ1iuPO;O30ox(FY zx$QJGw!&t z@y5l8HvGr7Cn*VeE~{%@YI}@pMToj&X`}O%T2P$WqEIVu?rd*sUmB;jALG7(oSG;A zx9x0-o)iXR!4+45z7mmP$#S zomdCj3EEaQ%-u!gB!$kFF0@^=?{>0Yr-EDGGk}{L8| zwv#k2uIp%qY7x^C&28{>lA#7=>dxk^Awm-=2+o zSR6_2$HRboHms7jc|RVB@ZIPx5bWeaJSkfEKU5RSnlH*@cZ@oaXh+^x?z~6sFfZi# zHoV`Jp%@atx8X_2VYYP?n}t;zDaJ~F8$Rl`UnBwrSaPRAf?VB(2mN+#!+RxCQVMUw zBVfvHc)BMdJEitEJT9>LJ@DPU*A5$IQGm92uN~I*+ql;b%W%2P4gl+Ty4IP<;))$@ z63_zKJD>)Xnl&p|i=B0L9cle-1(6cyHLq_|zn z8YvbOJJ3jJ*&t+I!{@8@RwMOFARS^lO>gQZ1*V^EXnNRJu$mq#@;le`$gT)iIY|ZC zEk%jq!Frg6$6eP+5DBXK_Qx-1>Ql!ry06UR7l!(sk6)q=%lHLVcQ(d*HGa{BW9X$j z9=|}aTjSS`x;Wk1%jx2nQ2y2~Ug{2%x7o!p<87mhm*OS_J!6suAiHo3wzBn;NYQ0H zEMRes7X$uaa$RyT)=M|oL|%P3fWT@)eB5YlJ!vK27P43>Z!6g>ZW?d^Zs%rTG>LrZ zCTsan&)Flm@+^KfD{K;IKbIMk;-2ehNG`Jj)8_`rBHHre=y7>gcu1v3`suPm7ZwD# z!HxSX-mt?iZ--aXeFIz#h5qVRK&wVlWbTlK5SJukq( zDwn)*@l6JVvKqQWg|1sgGawbD8n@IWtQ281O&}aga+aXuK3hiHTc|>cfy;u~QQX3Z zZCxMAMf+of>|{;#M4FNCZPVE*8eJRX1P4ZXv$WphBMZ_O@GJz&2&Lf8leUcoY7EX5 zX-h#T7G5MPkI|~0k6CM6EkL_LQSo5Z3Ijn5V66_dLJG?RC@AOw(0Vj7`M8|1xQ!PF=8m=YwOTXcIWW`OpO?`FuT4|hL>f0g#veN z{=r5JxT9hXFL6oc6*pqQ1)5zoV!-8l=^axIFQM(&KC){!9*Eu@r0vSxaM16}hyf%! zFubJDtqm_xp6wbjAch~^)j^56TTK+`Mo@k!JokK}ngVxX!~l|AH(~(s4vZKOx{F2( zpxmwz1BJOEdq;+sL?`37quT1aHj%i2lx{r0y>lZ55dGao43tKW5d(WnF=8OUoft7N z$t!5YKZgshxDxmboVcm#xqiAuW1xx36 zS6wT1E$9@9=aL?rIt}y<^`ww5>9}nD?-V!MGR&EiLTYtuuBrx?7Qx09 z`~3rbp2h}5kwiZ-l2=0e@rDCdmT3HBvO`7TJ)pngxdCeYI4{QbXB#$a@L&S=d6#f& zr`v>V!vou$I+TZ62yTMsJi9`C_oeAdF~7(_x4$i^zw-=x1Ad^zpekEhTe{Aent^{x z!@pdCRJS{ZQWh@IM}X-;TT{DBSWQg+Jigf9%GFkUl-QKVDaZ@PG~ufdIzws*@`wld z(#|FJnytL(vJpRq0b%$zObBm14N_$7t)@>3!Y(QHS8cMcVw}_2LPJKXoKsRz*E~R{ zbO~~WugH*V%6m4H|AHxR*0A4{cWKzK9_<5Sz)VJeX-1>J-dr0--RhpFW`oSVp%UA- za^yLNu;n$7b`Qxl@w+8pk~~`N3oQC2fGSIZ2LW2*Qv{`a!ju=Q5yc63vAixqHN~&W zP{!_s6krM#hEOzYbz%?;(~CE@a;FJ9pQ|R@oe-geI+L?RN2Q7Nmw%~-CFcC5RHKar z`v#jF2E&$Rjo@5Tb>3iT`ytyP?y4%D8i8NL;DSlgQ^mKHuS-_-YN4?`Q5;hQE}n?$ zq$nPCP?JmJIHMdM?G1N)A$Gs}3rs^E?dG(QnK*37Ndtxh4`jhXnj;)NgQ?ZHN=MJv z&?aTPZ(tR6_V5Y_cBxz98^noM&NyZUkK5s3kTh>5PQmmJN9+712&h-3ds3@mHbRd9 z!MSp*bWG=}e* z-MPA8_X^#W%ej2_54@y~-9CF)jt+HS>AP}R*KhCHuPK+*aZa@DB^z#g@79uy=yzwy z2Kt>X+33PKj^eO@+NRw(LbqPBp*-7NvLU^lEZK-+yGu3-+{uy+B)h(31Mv=)YzW=O zB^xNWyJVxVU0Jdb-AraM(OR+ zl8p%cl8qdC$wqg{|6Z*XH_Y*dX0jhvGPI!$dk>7u+;L#3f}z+i#E2&DEgtc*J&q81 zvE!G4uRCRdFUDf~#vo3-<>jM(Ec$3!1WRlD_w3Q3l)EuRmLEKnrEo?to9qUAHev$8 zGfZ`zam07mqcxqu`_M3YfiVyMgKbw{!X(H%UPXYiAc{8>XxZsQASKGT+*xL!KbzJg z277Ztb#3v}X@R5t>}nW(iBOM+{knf}y|7M)c5#8x^!8N2&c5yb9we4h%Nad^VI1XbYsrvH zY%J+m!`Bi7jm{U3^we=lI;>$qEfml45a0 zTRs(Re>TVlvV75z9@dw!z_;hFM!Y9TohCPFH#||uAU{Z5jSVmwcrcXNOyYRc$!g}S zCZADD!PeJV*}C8RyWT+dz0T6yjSk!B4M;MyBgB*0Fzln3 zuhBksr)T){?5%qStb=^d5IJIh%#FQv7N7^RWawVzjavELK@3A2hjz54#&MfI7^Biz zd@LZwV?RbUZ(xAWz?>YNQ!ytxr(~{~GZ*#+^kEp(1I{_|X%2b@wTo^i!xj%)iE-G= zzygQfm299t{8lf4SkVIdQ(9ElAarF#O9YUSPrQW!D~cNUZ)Fi|zZ#cIa8=R5#z zY@LB5PUdcSw6r79)!soKWX}s%yb&u=PPiHaNKADqhg0a_v&y^ zWBNFDv*;nU-qkQSX1i7-3WK6$?JW)T&^rXQq=i9AQL_LNQb$~HtjL1WqK*df!mF18 zNK#z_D~j3$R2D61;?$~&ngy_gx~wn66Sv;cq6Uj%MawOs+y zFs-3|F$B!67Cfa{B9I#d zw?z)Y#M(uBu|yFQih8_0YY|>NZ$;yyKw^?((6X33C86>nW{R?8Ge|Vt8nbjs3mg2> z8|!fg%~A((`_Oupo23roRe&ZNDQX%VjG5&QmKth_Vo8h_OdDF<5i;Mir#HE68(ocO z>3tKe0paK{*#zKb+x*c=Xnl0djQIucNtO%BHEQEqbkGc8g5`|b_|65JdQl8426t%G zM(-9mqc*-NMd#RvBt~r*M(Mj6J2ncTD-k>V$_vKR?S171T~m5vu3a0v-O?#EUt^0m zgxF{@b=|Lx^2=PqAyG zfGKuu=mWV%FIa#3HTG`WwfSjhn?^6_k=rnO!DC5c^a7AbBv}QPYqe;gIC8B{!Tbu> z<&qmx^e8MfMflLwCcOTM!wCP5C_HV9G@v3UCzIpU!jqGyS%|(`Fl%Ak(i010UK*Se z-G(oopxuh{b-(Bwk`{eqj(+sLxZ;vI#gNPEe!C$9Gbgig2-aKpn@!8#)eiAZu#}mz zx+k;R%<0=W3{v@!VK%t|upd4MAEBcjMCAX{bLxoH zCx2FrfD9@3;4>gbl7q&{-1MvjA7&1%rSVw0nKL|+O`>4C_%*+4mp7b4CiMv1kQhL<37vP_xdlGa{ zg09x`N8yfc5iq5_2mTdYjPKPW5{0`T@kYNT_~+M)HW9P-N9obOW%%dlCf=8q zKY_v@G-QeJ$ECMI(M{rejFTI-o$pFZM_Ii9x)(s#aUvY{M|sf?pReS6Nrsit>G_q{ z<6DwcDElMc=$FDjibHgdS5D7={HEM|9o>3GHwn7Q?a-a8=w1Nb3!wWH{M^sU<=yZg zb|~K~tET5)`3Yk#0(SY)-+cVL#Qr6^!>gy~AO1;W?z|8V`y(3qU4ehD?Bpi8GyX6aG~9R1Ru0Xl^;_t@uM=K206V{#<&_y{*5~ ze6A8YEhlG6Uvo@uS38cLKO^dsp2jumouGG;arCaXoSRA!{-&8Xgbtu-JW_;S)3^q; zd!Nw3^!rY6%Xg@q=QQ8j#AlkJS_yyC%mJYTXj;xlM{fGcYWSOG4h|ha(~Nwt*LhAe zhdRiAr=b>gz2uo+{*~G!eScL5_u_A2J9h-NT!Mfn(T^xRF#DKO@OQJNr|=fIsozTY z-sW_GXT5u0{@yi((U0<5gTKX>g!yfYpIQ}8G_-i>hJ%-y#j7& znfsfcz}=zTFT-u%?x4S*&!+;{gTF#?9|HH|3#RAKA}7L6A~(hv8T9uzWlBKA?@W8fzFB;YQ%Jug2%*CKZYZug_~-!a8~!4&r;Q`}d; zy&CyLcr3pUkUJL2^J8$|_NBc1R-6BAaJwJn_j$NeivDX;!oLZ3!RqPxEH21r^OW!> z;LfV}Ps6h26x9~UjBNU-&t^PhWlCTJ{#_dr}Ofk$P<1y!aeqUUj8R+eO?6j!{t){l>X&# zUs(~R{~@?HqyHc}=YI{+EBCc<7yLXgpV}?S<7RTdn3uo6x<3zh3hp1<{J#zN`5VLb z|0vwOCG?jg5s5~>-@!ct?d2$T?`8H!xi;Moy$bR<0Q?*c z_eJlVp5Iza^U(h01h_lCDD9iV%iwNCdWde0!M_@~3!co&KLeP;JK>)3KhXQEyAST= zq(52uHE^$1@w0H7ABOSIg?s$cy!@wa{P&Uj>v{P!@>2RYz)j!IF1GI5;NF1r-pOw0 z4scICk(Ym$4Sx`B(m&utX@2?F$KdYxc3ytghW`TY%~$2+e-wWy{lDUG_pebtD~|(E z4+R)6s6O|{{|*Nj|3Y5=n{51(;lAz8y!?Z#yBh9Im*?fDZTv-WZ&Bqt1MWhbUIEfe z!2Pft?}@*DxHmtXmw&NMZ!O#xDS54fd;BBNTW$Ee;hu%`y5J`ME{8jX@(I`_?nQ7vuJY@Idke}#GdtDynQ(7L{e9fJ`{8~;(GS5*`Zd^u zboVyv;V!;AY~Po`{X5V%b9}TlxI4ZYhJOU^3FZDQ+_dfhIr87r+(qt*kp4cnQ;&!8 z_#WJw5PlZZ?`3`o_vB+?eHtj)n?976Uv2ASZ@9O-oR?o}=?{ZD|GjznP3$)2c(^AZ zuUZ>k1a~poUxRg5!#(+dy!@N2dm-E%UkUj;1MZnf?+cutF+Ff^LHly~50M-EF1PX5 z!M*thVSBq6?pcVBU>-j%hr8gxy!=AT|MhS?c^5$5pM-nzb9wo_HoZ?%xQhP;xSQc7 z6`$JISK#hI`+2XW-wgM1gn!cV`xx9~7|%A@@E^gw`SVyWTK9`^KaBQ|VUqjPpD0|7 z7yCiw?S3gQ{~Swy4BRu`pO^nu>z)fYtpmrbyBzM~r^52nc)l9^P=6(Un-IQ1m1hy$ z-H_MWHvV$BH(i;R|B{tY58NG_!~Sp%+%xWS>Fs4MA@>zw{vU#S;-0+xhirPc!+jC* zyT|5#7u=h_5st5q!oBHhA^k7m?#B3av5h|sHAm%x6Z6Af<^Z5U=mR3Jz0F~8PeMMV z|4{!bhI`AsVSk$k_a^Y?#)~GnjcOk~a9^$Du?p_-@8#tmX3L+2ds59W?}7U!MSlt0 zw2mbHXgs|d=uU*Uz)kZ07~B&WKR?Ruz0Ajn^8UR1^R4^y@FLvzsr-Kf_v3IMkMLvg@2_yrK!2+TCVAxV1%UqbPU}7x?iW=2!{F}z zDEP(Fhv<)od(*Xf`ERu4KN;>Bm>(~*@lS>OcZl!i_a?ZD(O<5!;mhEr{RTLZ-W$vc zxKo%M@S0Qw#p43+PDaM!B&?niK^K8*6%{C)=a1m*|V-+mAGEbxcq zSiZER+=Ti{+w>2BTi5@a;HG^FqNnyS7w(6@8oEp29)tek(rt4q@Y~@|AwMV2 zFA+WTGsn+2;dc50&F|lZyBYbPV)K6r?s4>ASD!Dzy$SuT)22^L?B$@Ju=IPvy&7&f zS$=!NJqCUb;_$u9Ot?27yxP(q3HN4A7LLbta2H^_EwtgCa8ICp{mQym z!=1wTbfC~FP_KvfMzBxFx=o?9_8XQ^KGnnAr)kM$e2Kd%@wc{(iI7?2*1^vF! zp`ncipQY%<&HWMno;#=-LMmiYJST4Y@W@q8qP$mY6J>HT)<>$ey_=9!ZEiMzzP$xL zwOPJg9?1Fbp8n__e+`R0az2)o<7k7)Q)qfYkLqZveaQeH?7|ZP_M2Ye$Fq82+e-|= zJj{Q#M1MuafAK_p2}OOTOK-W*}QD$YXlpYj`+9GyXvX zVhy+Ur(B5AH(%7n8GW54yvw5Q!Pv_)_HvD}S6jpwob3C=R&T0pp0>uDVstmfaLyW@ zSwk~2CBsf^uGyG&ZqF9Xn#G_cds`Ud5sy-On+$CJ_og;(_pMTH2)I@T0|@@yw0t{_ zFEse4a7A$5;6K;0Kld3;dQDUq?>Fl*atP?|!NfcGQ-*YL0j7KX?jgyX55>j#J~Vob zJwP-=$)TZI>fqP;lF@)A1 zniWE5I5ol9C3V0ss{MwdzIcJ6;kxwjh)Li}yEw54Z{g5e9T}rPuE$5}nQY(4Xf~nK zSQ6f`@uF5YC`b}ik$iTX?L&46Vwk>u=k9N)Pt%#yD6;KOj`Z_4eMZn{b1qYP<3%UA zPTU&7-Mie{l-FV95fZMu9D!u;&T(&+yDW1Ne&@jS_YaQZtP9mRylx;pGMt-i3(mLr zEnm~K5}#lHwS+qpshrO{=9Y&Zyrnbibnoi4moqNi5S0{cDz|7a{BVww zKDS%3tTj$#^1%!vHl`SG$fQnKVxw9yprvf_jb`_LDD^FVk6NUNGWDnM%AXj@>dfrz zL`g5lFi%BKpayY@h#FG-(;XWadiC_F8&dFbAGg$*8wn+n0?7^7&lF)h{75pqNM(b9@otv z7S)-i+*_hK1hR1ioMBG0=El-Ll1dJP5uE#438Qysl38@tfng^?b<=ms6VPs&4ZpSH zc!OC5w>ZcJNr(d$KqNrq)d_44JUAqBz{N)Q2%CeS8+cwq=nb>v*`H2u=ya_WL-t3;9y)DsI^+ZVtBti7p;Zi02utAPoO=fh!T z+N)^cM~b=CQ=fwjxpXWL?w;P-erf|0-kmKz?C4pUg6J@KZR@P*+aQS0>=wN_hSsnzzRK}(ftKx%&9we~rC_6$Mr{_Y>Y&*$C) zd(L<5=UQv8z4qgr$*j+vG1V{(;ao0}B#83doa`Qr``SjCHd=T@iWnezinB#K#8cYn z5b_{w2d0pMkc^Oo@OuhKqtFeQ0;N%HvPJ-;QP_H)5EQ7q$dKu^plb)GxG4;93-RGi zg4?BZ7qSh12w`-Jo5B{*6o@ZsV^~?qvSDRKL&{3ZgR6&DR}38?L_fq|ih!y_e}s+* zbe%14qCM_Zp03XF#-Ckn+!yyj2qbq0gmDO?5a=3?a27&3!X*f3j%68(J6*#N&O;c3 za1laJgpmk?5l(lJJU?`$o+6QSq+g_ey3Un1(F6B$5U4MDA@oM*gOG+m{YTe@2&6Z< zx+4rk$V3>AfNp>_2r&fV0)(LmbX|;aKEecqE(mmWLhul1|F|qU&pe?O@73dbw^KqyAs}S5zSnUI#ry+f+o&FT=3qU_-$o#uNn_B%Zf_Ccn zptlc#Uah6S0eTDQGTf=Xw-L61e%!9_kD$vSKiL=Q^KZC6iu79CDgT!Udq9)^i2fJC ztDte?{yUEQ`=DRJozh*X*V5A6pj$M$GiY}-*-iaK`OgB~12iDl*BkTz&@`^dJ}v@1 zPD>vIdKzfQzD9!fek03w6{%tz=mlE&Y|tiX8t2sB6`)sZ_00smc2vy1ia>8cddSXS z0(u+h%WXOU`ccqzHhn$lJz9Ms(654~@j~t02>N}{%W)^V26u~SJN@UNTeR}`gLcDL zBbnuY0JLM@)IX1b&avgC@vsv#jR(q4^zH=u0O+!3V(9|Dw2*x07*QRlDy&>1N-7Ei zWumgGq&!e8R#w|!g@470ij{t`Bxm8wNqN(!h$Tx318XY%OO^?LRaJR~Sndy0izU-% zEvXI^RRjY|1WHhKb`&x#5tTvYDfU+sixmZBWfg^@+F#}`42a_5vS77|D*fdvOR6f$ zMZvO)s(@HhQeJ}3CB&k{V6m#utP-oLN&(EDV&a@Us{NRIIo%xTLV6JWy3p zMv?e0s!Nua7nF%Ae?bvNl@o)-OchsD`pb#uYCrfXEUT#Yi$EcSDhQyQs(3}ESW*nO zgrk>&fPXcZES4NCxnjnw$&+R*nKgB)FL&;exsxW($Xy~h$C4$e87vj9qL$0h7`KR) z3a@3JAy%LedALEz09b>@rGA(A(GtY+7Zn5wAl5fUWj_zj*aggqqkY1%bCdfDFey$J=bjJks zd%9y1eV^_a%pcMnlR+chJwkj&_dXaabcZ82Om|FRN9dj@#8J9qGHanboW%*c_s1ZB z-0d;3CDR>~mz(aG=+o$q$t{EKLoxr+9TRyEx?_^*O?OQ69=eajyhwK}2nNs{&SNm$ zG2vS;z?1G5qIFCNEw=XCgijiKt^G*TCc&o0R$To^<0hpwH84$@H=#MvRL3;+fJxI~ z(@v(TCrl5~+nJ^wF$WM`%QW?j2~I^*h-vB}la?(_l}uAlnb|}yWtw`-oJO>lY3e!C zOLR8V)Pv>%qK7k0J!vi_+QT&Us7V4fWiU-WYgQ61n5G^!R}+2Ydqni3o;E{7H!@8< zZf+sEfobY_vzF*OrpW@#ZA9;6nk>QGPV{!B$s){0iLPauEW_MMbckuP5OWXFl}wYR zm~})iWtuF;e3fV~(_}ej1JT(`lLeXY6Fr=1vLv&SXb;n5QKm(72Ge9&<`JR=(_~?0 z3(-gZP4bhanF2$tsgY^2IFqKorUs_T^2`jP>zF1BGoi#4Ya?F9`!`C1tHOQbRKy74ytHH7PuM|_c= zpC9?$>zloY`sxMB^q-+TJ4c(QOz?ncMJQr2MnOX=5KA<_rhxEHJnACBG9Qen$+45K9C%~R0NMMI#4tA zKyCa5-mC>!^lh#SrdqQAQb@&-!;25p&{9YsJ(}+xQ8&K(=EDn9+<}hS;TGeDf9?S% zt(1$>^N{{LrPizz;R&t5j*(PKs;voJB*OcXxy0X8iFp30e6G7bnQM0{rGj=gq|cw{ zLle<;Y0+Sh;%I(GaWuDk_*iQ&(_8>OvB{fj3EfC)yV8ViV&(f$*Lc%+|H(Idwlxe5 zK&4*uAol?%rDJAAl|x_q5Gnwu7G zRr-A|zR5yra;5OjH(#RqN2C7vRyns_Dry$r;j{W+Itd@_5&ph4*wg%iGNmJvuQZwe zxte>BnandYTafavf>;XbIfR+7#=phsb;+PJ9yT1V11rR0&>dZz7G0My&-@80*r5n>F(tCGjAc5pF%?;>TLgpo-U5A>t4+6 zXK`=1LvnIc&EHebO~`51jYe&$)NUo!yB%@Se9xTp-3K7;A%uD_{MMXke%c()fhy)$ zpL&F7PB)*RS}sS4J>;phQ6c%U{S6Jh?q)OP?ds%h9uNEXSrf4Of=xgXDdCoO!Sj9A zG+3a|Yj!<`+@F18*WBEZ{jtybdmlB{Q6BY=c>6g|AO$|Wev=_LMwkWMZXqUzkGEg> z_xhBja2wE)h`Eyb6mlgL$6hghe1s1tLuKJC&XT@q3vxxrkT-gsnu#1ChlP)%nmtS( zs13h(F1H)ZlG@sIE*(30=fmsIj^v-P-p9HWy%)_t0Uw^*Bj2}ZX1n;WxAF*w$Hs)_O9HvdabU9`r)&2Cp(3MXT zdYI5Z3EfMm?{T2p2yvI610HG?@AO$uAquX>9EEhB6+$$I_K0sVsiy43;$N8KIAJ#u z9;8_YshjK4H{XgRpLr=&8dz-GV$&!WJ2sm?b0ekBLn=>CUh8($u?Ja1Qz|}d&EelA zyPLb!jJ5MyQ7p2}S%|dypb!kBiMG_S^lMeRK}}+df&~-hkoM*?mr;YCUyY@BBfROn zn)`DwGJV!NSj;Qmx#JG?x?rSr>UKFXvb_KR1E~R*izOUr5a(>!3t?e?N$}bB$I5T)Yw5C3QJ02 z>#RwBg}T~n<)R}Z`)R1Z9T*dzr#RC66%XdfRxT0Fq6&C^bj-VzjoRklYki8{4p;!& z>6`Dugk`-24N$M$4Pw644a%{;$4(1*Y^LA;+GaX^(-=suY8uDtNe*AenrRJ;!njk3 z*UM&L*}bi&QJqz4H#3K3XuC+TK`IV<6J{lKZq6cQ5gVYZ5p^{Wk3*Y|2VLp(C&qX9 zu$Sj5vxW-3^A)W3B|@(eVmqD%#@UYlim1||KI=zGLxu+q zo@*QN(>VRxlSCGE3?I_pm`ACt#i-b-{SGUt6k2Vu0dzQlgtaIl4WNopYf|e4)&kaQ z_u6Rkv(moiW5p}GA~4a~ie0Xii!CO&`^dTvK$`nVl(##g0_@3#NMX$@wDq8>Gs&s5 zHP|bb*PKX9{cRyi4QBqWUew$lu(L&T`>i3WxdX@(D`z+S4a7uO_#a(#4Le5muhup$ zoxW)|n6aXy+7@5>rk{aY?+Lf`3JeOj%#n1{9f*_*DSJGITdD%rhg+%x#m(1~80HdU zu=78iuDb)sx`ew6V{Q%20SklYngPl+4ry{0gTXoeWF@7XkCfQVr?0Y(BO;g5ycf*l+^Uc-NQqd7``V^tZ z3B62cI}p}_wbsi$ppZYo&S67eneR~ACZuVTAg#A|*#0Ci)NAG8XaY^3FZyt_*Sb{3 zVCoBWwxitks5~P5P+*wXI!l%7yMv;=R#L27x*gSku14jxR)6B_Q_QPq=h~XF)_W3m zvxW|aVH~kLh}9h}v54hxJ_6**N-1-}E%rgXuT*gvZEoc_`xJ_7t%iMwOMC zK@sP1#3L}WtR#-OuN|Hd{3P6xl)kBe;04%@rf(Vx7;bT;Z^{B_dLQR>&itNbaIsv( zXSo>ugt9!#Sumcm+HqtMk*hAuN@ijjWlmw3N13{UszRu zUpgU7-?SPzvfK>UQHl3EYVvpF_|K6)edGVZXO_X5E~1Q2BV)pTFRR0Fs&WkL{bka- zizA*v{#DDeQn>JPBKl<|F);x|Rx-nhROwZyRO7cjr{p6geIuo38C>67$~vr#_ER|7 z?vErUxIdB^a(}d7gQ5DD4j0omow`4g*wVN^3bWEUv)v!5OmKg6WXSz-FDlpj!{G9< z{>bXYd71wTmSO_Ak2g7Rso1Vj{Q|rO3 zja-`b-7RYa6ALKU?UZY!$O>~5>9;9_sI1$Vw&lBt36`&xA@idz_OWrY0`T`V|vAo*rY!<7o?uDS4jcc#=PTBaP3jr#a#d;$=x2^}ox>{@8eW zg(E(r2A5?$&&1D(=$G{yCaC|jo@2=VC6xqJ{yl3Sr;vQBx@Eo01nIx&FKB`KYd=R( ze>OEBD(fw#ZTSu{!SekdhAiKs$fx9chvQkkn|?{P{1hKr`=4?;JsLs(e89vWN^uYfww%WC8#;s^Fjc|YL@?w<>gH?e;{=j2zA6aDiSCdeMLK4W-4 zV3UOp#s5Dz{#nZ3E$go;f71cPkbYV@irR15iH|)NRvkPkKXVZVlh||KzvJn-3G@vK z^c@NG8wvDh3G@Zu$Jg&opcf|4I}+%93H0w1=%m*8`bQlV;Z32B?0=++h{!;?|j|BSS_VMjaOrWPH&{rqW>l5gj1p2-NdUpcdkU;-6 zfo@5lySd}}?VmtTO`sPg&?^$?n-l2A66kjl=x-9}vpU4{b4dcdAc5YPKtG*8zm-6L znLu|*jc;#m0v%4Ew}=!}l>_4iGn7bVbv1p2N7`nL)6hY56twD|UxCeU{z z(9b2%jS2Lz1p2H_@%0ajr?H<(--QiT2y<8ZrpvKFTz@qkS#A0n5$pT#rs!2lyY+2+ z@@DBVfTlZ;lcwcxi#vVO-ze`{;g*#2O>a=*DoT{|VYp>d`X+kx(zJ{s$7bCKoW6-( zD_TD)E6jw2&-G_#ZDiti_-q>XI26|KY=bzps!1yS0~Wx66jkK=xqt~g9-Gr3G{&k`gaNR?-S_1C(z%< z(@y_xfNBCG*Jp4?2YNQoxBG{+9vH|y5g6H=y=PG81ba!KM<>wZ66h?Owx0rO=Lx=f z*3fP^1fFNjr!Ahdr?(lgZ^)1He_!;h?St{Gao1!Q8`zE5;;$dgyY@@Ta(cop14T`@ zB08bJ*>-=9lkKJ|B*NaLiM>Lly4faXf@tzlGS+j_zCK5kZJLi$;W0?%^OERfob^1C zj?=0GbijhgC`+tqotOlkR4PvS&n0D`3etB^PR2*d!67&~nq#>KqlJ&q4BFp8az?Z9 zpwpV&nU0U#cFbjnsW=-))%L$wZKWbs)jBLX!v_bH8b0f7Y}9>LZ@klklKrqVDm9wu zS$w>HS)TXMQsh9a#svPhfWK0g&!YD*eAZQXEiQb}gOlq`1Hp5t&9c`$hZs4FWSZl( zKD!VybwGMTf1qk8u$UXvWPKJ9B-tr>I0zoX2Qy2PnkUAcXEOiuxj#xFZXSd_WgQ-p zBiU!I#yL~d3Q`5m&550JWO)cT1bm#bd@ashNe|;t9=!OhS!j(<57Rf%BUz_weAd~p z2qbu8UBj|^t;PMJmaj1Ooc%=`<`6+MN;TG{(zx(m!FPB9LPx$N=d*YO;In>-antk= zq9BOftt`(KT7QC#;_y$GiNN~$+!J6@)a0HZ16)cU%e>LaSHnDh1@oX+7uKB+f%#H? z&e8^Vy`aSAQEI>6Mvl9|KMw7rzc(u}{;lu-gvS?)TWBAUU=JAI_TVm#ZVZ9FVmR>h z8y^Oz^6{_vBvr5i6*yxdeV5l2K90G?i%jc>hL5`fCF{=#AIG`fHHc|?kVca8{3?7L zb5}j;ZMvDGHyqyxB4DmRJA527)p=B)3Mo#1Y&b3*z(M5NaGWNmz~H9YR8-27zI#D3 zjjqvn_COsm7e4s=7D?v#bX55eP=bCr|0QX$=F>NaDSwFa)04b}{O0SF zum}lqn3<^=ps$S4(}*UgE7PS*MrRB`)cO(Rhs)NV%j<$(h-pewIc0wK$2U=b&?taE z=I&UC{-cEh&HPP&qr|-ThnQYK!^<@|5vwngBQ))CXviW0w z^9|A>2h^bQS-DU)e972a9xv~4GL(-o7Fb@|uK9drKb-z8az_qOw|@ammZtcuF?b80 zIm_`M?{T^_ZrF_F5QBZRgNnPy#;17`^k;qf9*u`nydUEm@j=a4$EDkTBRGYOgWe|U z%qO~m>zea zpjI9LtJT!Bh@_X;8-}?e0L;&(>!azWD>479wW5Jv!0a=^zd;sN;(f8dEsZv1AnpM z@EfR1K3|Up@g7BfkK)Lkm!SY)Z$Nr*3FrZ&YQhs+13k>_E-CKPNv0n+vjQJh6kLS(73(XqJ_|JFoyo!#)n`m8|FkXDNmty%`j(pBbIUnPd zp%Ha>lE3+zK(}uXkz#@!_kC#;XBUTC&R_XOaU}O(o2(7Pux#7=(FbHn2zV{=7}iTQQ7~9y6F96I($S0eqmoQOS~zDby?jX zPkz3}_D7Qg*`RX>T7y%GY8UH1Db^2zkFb75QHQX;gvW%d8-HkJx5)d=Jrl+oJq&(l53*`cbv1G5d7$z~{9dK( zAF|X;b1HFvu31XlUq{@R<7*-|WA+X2KXLnHu7SShtyH3yR^l=$p~>sBO6~p(QD@(X zk3`e^;|LnqX_5Ts|Or!%F&3G#;^VlC4sI z;^o!+v}kS*%rUv$=_A8CXSUVX$@k1fV8Rhg=>z6UubBqMD4Qlfypc8o z*cT)u_1`?-h`JXjH9Dpan~CQLj(8iqg~yBF#Cra+WPMJzWHJKW-S$1rzGqOSi0@AK zNT6E}gx+{LQ>rDr&lBG7$qu))U%AsZBl}sh(l040nuOWtLetX?-S0C;;AW1+hn01i z5?|IgK81J;bn;pg-o}G#A|grlR7w61@{pe(r;usRrRtVy)qQy>s*CHd$bo%-NeQ#~ z0^{vEDp8=7c#%qI`mYZ=daMb*4@H3w=%FV3A>*OI4l}YD@B?=6wlQ(kS8`OL)qizD z{rehIo~IVVd$=9Eugfe|YDET85odi7nc+&_@Mk)B0ZMCg{M+j2CmX+BtLc*oC(W;? zXn(C%>M@j3?MHK5$!tirT3P>jZux%q4b+bj@TQf%mP(_e?EJRrNqb|-MWEgI8Qqct zogKTe*lujKwxLh{l7!Ym2c5sR|lo8k-KO@*EDc#8i2dwh{%)gJ8a zwC#NpUwGgdwD)a%k#EL2@}a%%C(EbVLlPFv+F*K7mHa_{CdZe$QI&!|6Wfz3xtKpR z&y6oUoeDepWdF=2;W+8@*dv;>+tv8&PK9V#*k1V|Y#3=)U6&>TrNis+?S~W3(S-HY zQ;}D{ZKzq@8m@DBt#4k#T%U7(59H+e=Kxt}|M;4p$DSg#pNt&;e*cz?D9RklHbT6Y zpz>5%PgJJ8`lkH9l$TZl@FEwm7dGjDUE_WpwXq9*hOH6iqnCLGuqP#3-b><3WKs!D z-e+1^UhI4F(|5H~{6zLg=3cGSj?^QO+VpOB<8yMuy?v?6`WUqoKS)RFcm{_hFdBftChohvcAw_M$>ok@w&buBe($07SrWRDyX?NiSJ;QjwG&rXtZ1}PIHXObg<>uGqhep&r=K+kocjD_O(x1o;)o)%6myZ}x&&N1~ zYB&zN?@}?R)Uc9ClKpg;eaF7^U2jDiqAyjV3>z7-E$vIbW^Wz98MIN8+e&-)>$$fw zaPk`Ln7%hx%DGZl-{GMR>g^4=obp-jq3FT2-Q_#GD{OO;`Y?B)%Sv75*JJ_bpb#t| zQuiR02+MNo((q31IA?u?1DU>4T%jG5!E5c>Zx_JRp*!l*cQr&BnmfhS&+3;7<4?%5 z;cy!4uzvGV9HrA`Ex<>l4ijKkd^59Nbij^oL|qfPoSLy5L+{MiZ*D<;(qQ-{DhYX- zehDh!ydcWiyk;xpso8u28NF5`^ain5RMQ1pb`tut4k2%ZnXxNgcj*rLc7C{}OQ1{h z1qt=z)Kn_YzJbv{Qm;DmK`Xc4L?X%Ohg`GQ8jaH|c<)FZjsU;MH}k$1!R{z~Kb6(( z3FiLbhcHK+NIlrd_lyTW!`-Av)0mQ$9kpwmuutiJ-Slu4|3QJ^WinqMbdi&MI<*!%%H~;B*3ZG1ZY4 zo!V&+y{+6lRyHfsS32ol>o06VIKQKEd*xXS7-?_U*GBu{!yX^z@bq0Sd`?c^l^S_{ z->2@#fe!CP7Pmlu_||m#t{#!aM;WIuK4N`+!e+V?Gu`wxnb%4>{z~&&cgc2HD9LZr zJ9_#dCq0sDMRQxcsM%}YS4jS|j(cIlx}!IuE7Lb`!smu{M?$y-ucu?Q{TY(c@cu6G ztbWF+X-;Y*y44Y23=^j$hMtt`YY&3fJ5F1J0$y)O=vl3nWnX$M95C6ad zzF|UkL5SF9mZQ0r*ZN52h2`fSj^-X7pWBkYX$NxImfs<8Nw}rM`mT7TBakJ(IAZrl zxTSNTW4Pt)K)dE5>UOk4FR3>#x6|pNBhk+L1)4olyPNmMjJ7-S(lLAUS#kDr9vkE0 z6L^Xu>*qXdn_(7b9P&q+PvD47vuB$$iAB7 z|0I)pE{&Egm$^l7+R5?t$^5m!lM^Cy-Smz4?~Ak3cfT5WwRy1aPl{V}zi*Dj{0Ep# z)6?7Fm(G79`_p&7UbC<@^2eIqG1lsn@yw4N7_^a;(=i!q26cL?`6rxT;lb%!Bk+~| z*8=^D!^gU>x*&b`A8V>xBVX5y{)lRPK?;7p2&Bkw+SN6;v$;%o%?kd`t`C36p=JR+ z`Rn}(Rk4?HT*e^jN-`R@9~i11XgMETml=C5UMga;)C?e z^Q84!4{|I$pcOnci_~sMBCyw*ohhB_eto^c`+QdFGjNOi_d~*md4ItTM%UrluWSm@i>Bwc zjz*84I06S4IO?#Jm0MfMh0VRyscSmXD1H4y*X ztnp-iPiKF$yRecmJpJPn0U~<@aktX6@%>XWHn@sgu51t=WfwrFhFY!a`jTk?Vbv=drT8lp{ zzizKRqItd9USYLA!d^=!#Te?L7_x2D9WwxRhsyqD>oJyx z4q;;QOjqsT+@t52$a6Y-)8>=Icw^5ohLBeI58B(A+CwN#jt#0Q+bsn!?z~p2*6M#v zU;6sBw`#;|?c@b?GM>pasPniV>+iWg;^&{|(j1lXe&7t}p9?i+{vYNa<|lss8L0U2 zS}*Z(S&AHQ@3H-lZ)>hQGqkBL&<*+zH>TGt=nz@#ZXV<8f74f`HV<(2r`Qiq3Z~ZQ zy79^|-jc7~u+B}|2)0KQ?)0Kq_|qi%D||^tLu9|PKk`;mo*TPRd%fel&7 zw=r?>W7pqAf2>ZU+t^QI|2NM^68}K^d#L^JWv+I?&P{jYFixE({BSXc?P>h7suu;L z$(wh6lI(76wE1fQ;c3L*n?^W-(C}&e`>Ia;FS1&8;*+?<8+$)vMcpP9g(K>kw0Dsx zo@Ye`-AREi$&r6G{~Tzk2n>aNo(N=A~?(` z5Nq)eYsJ>ljdUz8ADGzZy{9z`B~8>78i()Hyau&6t(*y4Q5P(|X0qY^afMX&m?U27 z-A9z}U?aCt$4n+`!5fGX<|Qf(rf2NnNEuAW1ygw%>eoUVUSo!9E|9Vscf>DP8g z)smX<}z@x!fF}a@3NO=BQbH^}YdfiecAOQ5r&KXc zMzQ{E(|=<)-=H&=eH`R`f~jR@I)O?K}@2>q>X z|J}ADkn=;XJ1HlXl*N9Xdz?outH`m*rUzWa_L=Z|s`_mGN{JJ^cMjD~&r6j5W-W(MF6{c;LXL6n&EW<2+F+7w6(G zKWROqin3FZzB5+1W+6@+JJyWuVoyjNNubzzqb-g^aG?`@CK{}Fp-LKM${BerzkHpk z>1Rl>rzd%SO%-eY>j!K(zMJaN-`oh5*vjJNod}I@4R+SWZ%$Rz_`;zVT4cT zQEKT_?(A9R<5S2&;4k9_3o9tR&!yHs(z!{+h4;0S@$gV>{k>W0qI~z(pCpA|Gqy}i zLN0B8(WXC3)6Pe`NAr5%yqHc#Bmdlz_wUHDEqNz!ij0`N#V#UE1Un@@PvmvJv402sj7f2{dq(kwPeoes=C{-D+@HQ{ zKU5c*;E``Hb!fnQV_E#I;!ftGUf5kM#_FD@Axv5sbIipQH=X0$cAL%9;>L@5zR&rW zQvRMYzx;dKkdIS}DWw(fI>Bb_Jy2_2T5GPm=@Mj*J+IT5Y2fVqbpbWMNcmAKIVQY+ zM73k7fr^^DlG{KGEte1#hTFDROkV31*|Ii~+ir^M%lJ|A-DCQGWv>VQFesRYhiYaS z$=FLWU7y=RJ%ssu8eY~|>vrA>G%G06H~bCt;Ht^AJtFXB+RINd6{8OJtxKOG!p0i9d@nT?q@5bC;sW1*K#MEPP!XN zx&m%J&8a*lL5&v&NG=+xtfW{1y$wQc88&U+NL8HAL~`>CWv^`(aw6O0pVhsEYHMI8 znxGD6=T>rg(=nkP(}PQky<_+ zp|^;*GoPZWlT_8DCwql(gjNW6VrOqHA+Y))oHL%Bw3F8hY1ycr<_+!vcQc=VG3&IR zXrhjx^#bM}&F!(jbJHsi4;Eosfq#0icUg*i2N4g_M8ne$w($5t2~YxG3(BGlB6wCa zo%c6U-P-!he1?R(i1#+h<_RKt+C)xo5NVR2*QPD&ZdN4Y!4lI8Z7tZ-h3k6ou>rlR zhgai<-orVOx_{r_jhe}Qz2+5E+g`j$LvMz1qrYY%ncmE0_Px>bh||`0=%whBKJ&z2Maot}MzGU{_tAdzdz- z^|?pz34Z}yC+n?l?Yf1(hQD<)ecg4-=F5qn{Fd03GPmOCdRSNg7J z=@!vg^``H-lPb`8m}jl}J88#lw<;yJcfgzJd(qK5=`)gl)XLw6yUbwoPX{0onTtR7 z7D0-;zx_V)j?5Q%e=i-?QjDx+-)t@sQ=cj!(+{A;Wp;_TWF04!sKg;_tj0D=98mSdL{+En;{LN$$c8Y- zYO!?n%ibFO?0}J2Rq8yMc{Icp{fjbZ;=OhL69zg1^Q<>{+eGtkTnnWJe((XN8)pgH z2yp&b0S!R)O$-Sz9!w8LEqk(GvZp1CCEOg2w_bQhGEWaRPIX@4u7T6wSJXbjm#leL zg5@P?f&Jy_H?-%Fc90p~(i5%=P3(AYifP)?`=M<+> z%jn1S;!CRRMV^_n=6b6AP&|REg7WHOKYkKZ zTBov{KE(H2lZyFQRFF)|s|r?tA@1`c&m`ZJ>C-*1DbLhN3x*U|RIMlocu3%C&w!!T z#l-`MdZvOZFIeG+HdmDdOb>qK(GSb3D6jTZ1WXbTM&hB&o>e92|7CuN0{JVe@Pm*v zmSiKW#_FNOjo(A{c`Axg)X$6!!AO*P2B&@J=KAJ>ouR&|Q~RQT)TYA*^hj-qs%5sB z7ghwziag~QjNEO+d|O6GiKL!WrR!=P?5Qk+;rOA~HJ*aya1pj8I%C;Kzia6z+fhDB zRr#x74drV**ZS8`$5#g`D&viqGzJA#gJET19{e0BetDD%kV2{pF*wRSMM3UPr}p@2 zY&#>AH1DV**n;he}Rz$mHNs)h~2#t}Dp z2syuUe;LetrN4?C5}52?-G5MjUw@AeKWU2DVzuaBg@`%*J#*}4DK6D(4>ODcOc-#a z7^pL+c&D?KRtGC9;jd-S6b7rR$m2WCX0V6z!NpZn`HRHVvV!GgDgn=FN)>ZPr`RM& z5>Q@=rxaL00qUXgT2NV8R#I3%^P8AkQQ=uZ2CGF@iy0NmkpaCXrz@J-$e8IjaR+-= z1gitopKug3NCKV_Bgc6ruL=08#pGZyoDeLh(C;s*_KY3vxt0<{9)?8$=8QtKI3Ql{Df7_`c$n1mFsbNSn5HmX zNcqCX+yOS8G2J&ecczm9cdUjE))S78^UNJOYWP6amSby5DP%C19mM1j$}Q?62;*z= z$Wx|_I%SGhTdb)#eZZO#w7h$2WHJgdnC&_j=|PlwmvtrP;JO z0StgUVi)IGRuZTlD5e$^mXwtQ)+E$Vy9JDI9_Dc^(~7|9cBfC+ZSpi!=*PkXE40(i zIRcX$uaE6fP*$)8u78AQfW00mD=CL(t%}W~Fa`R7c3zOkpE*aC;VR9OLmga4@W?2N4X|HsWs&a?KwS`a|Jvl_I^W`59M)F79{Qx zYEN7iI6%)i|v_LD)SqAGu-Kfn_pjdvQc7?wPzz~W*X8HjrlLs&Fm zatf@L>$hNe5gG}eRt#CH$}Z*j?lWu4mfe~BV#88;63+luDYg@~YjL_QAM-G^OVbRt z)6U*A%GC$c-k-rR!RxJ6*Cu1>!YLLC8+C+@K4n;fIone-x8Va%W zqV0jmr=>luScnZ?=fgWx(&7b)h=L8SLJpp@IC%hn7SIaOUj!qk+T_L?j@90>%56W$ zit-`V{xUfab2-&+PE1hRzL1erK&C2e!Fe0&tl4NzEC|GWlxhmo71*RbR)xnmchcN^ zpC@?=YI;$_5^_P<{Sn5q;^G6p*uE{mfwvamu9uiBPYBH6R86p1?W5$_@tEuZ_ z#~ZphvxC^{!(~HlKAMVs!DkMS5&gR1ncU!URidM^l;&d<5NhaH4-nAW3oK5s{Gi(_{-5Du;ZX#OfQ01 za^TwoF}9ZVuP&($h)Gyt!%*SpU>Y=>IJ$Z;h9yl$;EZESxFYnqur(SpT9>HI6tD5k`*Btv zFHxzavtm4>YUxOjTo4UrhsAREwI5=|k-jbQ;4X0f6{tQ#ele8oZ3Eg5l&rv*^{=ih zsalh;u8G(1bUHwz$pu=BPa&6HBzLCqV?s=tkvnIuun)MM`;tjG?4Fk^a;E#76nl+6 zedg3z!iQbTl(|bLFY(TqHFwsOSu@1cNmHiJm_B!*s$lXc4W3*b&QV3qq`8ymJ}1|g zi^}2(%pE`6DU>&9W*NSL9z}XF~n6 ziI=Hj`pg_^%I{*2<;==2`D8eO5Vs~@Z0?Z{n1m3sYu7J+Ezpx^*GEVRuk*# z|57!yo1><+YJMa`G~now%W$ej8rzTJB(6MJ>3_X64~ZXDT<@vV8HS$M=?!PQuN}Iy z)sJ*SkXOCjDa9uSS77W+$@5(S{~icd;dDJt5hs~~Q^mz#!+Fq!r$TK%=qi+XPWzxM zS3Y(shm&#EEwnyz>X%au7Qt0`7+|+M!8rwi1rtx+{JBf=a(%u@SKucGG~Q165Ds~q z!!joib=llGvu41f2{a$5IxXX8(hwadpSGea`~e?5`Wg_cai9l!wMopXIZI;OA1`Ko zn&>9C5f>{l86J#v=w!!pNEyM^B_?Xmckop6;!0njDp-gUt1QpV{24PuNzrMAK#iw< z=s9H(k{1u1UY=j=7wmkL+WA2IG;fm_zLoTlr^7wKXsM8uaOt*^mqco(k!lK8!XC^yxf zj^(MG+SB@Y)m%}fBJ52LEZjcjooa95VoQmW(@2zps;YuDsv3+swQ7jvCn;v|sh%Jx zR|X6nZ|g6@ItPnH?4hb-akhk0%5cg-2aWT1cLT5j@{Xh!0=(I9MyFm4#JW8EHP9BAk96N)@fov>kWJ1!2Skj32q)BRlOkGPV zu)WtXa&W`grRj@N9M)qksja_ai&mNBENmrZFL!N1Ev#wbmRONoeV-J~*_@TOOyz|R z$H#F-D_w0V7FT~;mB(cOLz*P^qM29dOSoRSY?nAr3`*71VKxy^aixm29uKxXd3m#D z4&iAWa~ooE{44!s75r$_b0yCE_?k2?Z^&eS6`YWy=V1*>o41iehoc_+?{_iQq^bRe zj2w%Vb52&j;iHN?7s^@FGb48KNsOBehlR= z2!BL)1>x5SZI$_-6n8%9#=b_395s5(*h|KZA3g$qlsfUE=PP`gLu(l7xVQ{>(USfS z!2j1*JDa=2JH9v}NC_zj_}d8rUmFn_2zYZ?bhqgqHr?B%JvNyE*oK8t&BI44d}iPWk5A_XT$R)wol>rS^Rp?v$^{zMJ;F%)VFR zPWc1&eI@SH?rH=ow-$lYLkL7~LZI|52o!%a0>#(b_dD$SHry%SeKx%vcgp{eegBnx ze-w8r|0Duk$MB~)8xb7*zKw}~6ZkcRy$H|S@y`9XS{&tl8Z-qRKdR9W*y(y6%6q?7 zj%d1WM%;}E8xe?h>RAVRwH-%%P^h+PhaZPODt8Ui7TH0shvMej<>n;hnVCRSxx~xi z$BAFoBgO4Qn1V14VF1E;2%QjI2(9=EP&2}x5&jRta|pjexE0|hgc}fo2o(rR5Uxa+ zif}2yaD=W10^u|KJ&oTXJdf}U!V?IOAUuF@7eWofMucjF3WQ>WB?wm`_z{mkd2A%3w#zr>$xfJBM21tv3-9V_g8F8@y`SQhfUv)`)vpzn_h{# zi7*>sk{vhHzW2esn~kX+y4r(2+B3!dIReq|*!S0Qf62yA;l2&wMw|XA?kf;{HcjQG z0*^%KYsYo5@9l9vhCZP@O}M{}@Ul(+2KR>$A~sEV60cQSn&V@g`*8bDAyb(fBFXMs z5PpI16vAGFHxWKY_!8lJgw9)&-RC0=MYtScCc-rce_TcgCb`^fBYUjE6J6knu#u_)FNhW-z86f&Li}Wb9{rG2?2+ zgBWjMJeVP={jLAa?@eO105<;ZHi-rXL`Wdd?jPaM&z#se6)FqY%a1-3#$j=N5b zaVT`jlejMY=8Bb5nt(#W$G8*Yd5n87p3k@+V`+!O87Fi6WsGJ0^BHrrsL}9C zj0bbVe=;7*_!Gv`-yUTw{cS5_X@?!q%^@NEZFk1f-}YfF+nUC>4-@mW_**snxrY10 zTtc#_Sgzq)8IRzUN3{5(8lD96a>{Pj@GBbrf^jz2vU(af}&?QVsu{u`K&I z@I_*fxMOgNd!Lr)TMc{Qo}4;IFqUlrny?KruW2HH`m=h-_ZP$@n^?C)s%#ai{zr<0DfP ziX&JDHUV!3hKslBDFkwGk-&6l#}{jOxt70}*Q1gjlh>sZm+(kE!u%BSp7~qGMXLTf zAgBIDU>eycn749~QRDDduC-N;91cGfs%(z9PQz8~-6apzypEPQpz(H{@ThuLih&BR z5<`I{&*g$9d&zSJkZiXOcb#X--vQHSCQcZ<;Q4Ie?Z7d8u0;-q=XI)Vj<|vKb^-Ed z^XUZE?_AF2NdgyP#Zx>PS_k6}Tvy6p|Yj{s^9phUB&E8VpTeNm-HQ8@R zdrqD^#S(?@;-DW%lKyQ-^Uo&AXbRojBjCi z>wz=HgF@Wm$hCvzlKej)?HPHtBM;n`%|G%h{IGy4wBsM;GbhRCV`7Yoe}d1DWc+`K zr7HeuQKIm#`Fuy_`Hgr$#s5~kpzyO|pTfJvpMa(8J9r#P86RLhG_s76Pm5*TD~>1` zUt$?guv~k!F}oKvI}6$pb*K+hAlKQ5JMH;0kUvwrEtcNu^wC?)e?P=;N4%3i2beC|?(emJc~8TC z()j;?_n9*PM|=(_@h4)Is;5!RSNPAOK;cjEHyxa|J`vGwVLfbOd`z=d zTcML| z@h$85F2*fvhxai)#{EKN>(C~qQt<%dLjtmEeUXiL%F~FuQ@?{BNB&H4o>6&QvU@l1 zcHo$g#XADHByZ;%j(^S(9u4=Q-?y^!^fhSZDDz)v^jEl_F;?M$#%zTzHkK-UkrA`Q z{>D#L{2=b5gDkJ)=Pkx~-N4RMhr7dDBQW*pdn{L$aRhRG#&TW4a>;Qw&Y*Gk4abi+ z$Tu2TB5xNH3@mX(I^#0uInVbRIsHE4#Mh<3BV8_f%Oj4x&VFJgR|k%agX;7pNkRQ}BI zGx=IS=4*V;=XxX$S7~?=>qN$1ZNOY?KCdx63NJBY<8G-jQpFc&vMe)lRD6-)RoHLL z1D3utpLv!(ge(&M2W4lA1&Yr)#F4zjPb2PBb`8r|YBWGb$!Dp`pChj2I%WI{4VP?6Nsxt%lcWI=_MKP0F&~7_IV$jLQ|?Y%EatMq`=6HyJAwj%Z^lYQ%i|&Bk3S z&n?C;fbVA+*D#-tF#f3;<8?@Pcy0uy{7>Zu~^y2aIBcA2e1f{E)Fh;fIZz72a)ZS9p){ zxWdmF&no<%MxDZM8m}n)meHW_+nUdR$M{6Wf2{fcPmF)5_(p>saLPV?M4J~LGw7$Y zW&9I{N8u-pAqqcZOjr0>V}`=J3_1^%WnVA~6y9sl*|3bSGpJW3-e-gr-fz?>e9)*> z_!Z*`g%26;DqL^S`LV3$RpTp#Uo$#lV95A4j4lc{7#A!2u5pRNe=xEXe&3j^@SluD z3V&dj3V&$atnf$1Z3_Rz_=Uos8;>gdSK~Jd|IMItXvv#p(BBZ1xXE}8cpuyO?d$`8 z2OJW28apv>e#-H8@px}${Bs@)a-Fly$kFCj$F>{Mw^ZjbJP~xcCxU zb9gvn;0VU%=W7igHE14}eE!S0K;dtUfeN>1zW10hLB$`}eDA-FSt|Z}BeoxD)y9i( zU8nN6Tp@*%T~USGxoQ=5yY5lAgXHvO$v=@p=C8xu>FY*dD%%bDGsPg+ z@NLdqHVD?^)IZqe%r7}&sD_8RXssf7819PM$w*gho*m`7O63{tDpGiit3=_ku9%;^ zMC zTGulwex2(%g>P^jQh2?qLE#OqMuj)J{;u#Q*B1(JcD2V?kan_M$zF$aM{kY5l&6$+ zgw5+ujZvlMWvR9)RbVm19!eZ!jJ%wgERY9wD|Z#JdH( zD9=b?0iVTqoHz_T0NBH)2||qIc%L|mc(OOL-^=e!rY>Nd4SXr`P&{E8Z&VzFJ}L1L%EgGHUfLqvnZLq(&)qs0-0 z$MB05lIO7^14@+m65&yJoEWa~cz$Lp^Gpz46`v)RDtx)9RCuBYDV!~86`mxvD?C~3 zRCtQ0Q#eO7D4Z)A6`m@ND0~HPmLxyZLFQ%g=dK23g?Mzg=Y${!n4Fug=dRO zh3D`yTUn=1)T;QoV!OimVyD9MM4iI(MT5c%M5DqB#Sw+!l~Ns^7mEyquMr-Fmk7Le zYs$ z7rDSo;6JnZDUJ}!*{^OBwT~vdf69J!o4`=Bb+S$Kt9Pq41I`&lqsnuyIHK@J)xlG${OppndmdmVKwFd_38G2g|-wlYOTq`>!?Gf1^Dk_$~D4$n}iyD*UWis_<^@ z{C|&d))+-dZ$i7c@tl4H_+Icp@q`E9{y%Ac|KIoAXxD^28y1xzemW?`|K#`F9>7=# ziJq*JGkLFOH|Lk{)f{BZMMX2?K1>|b;(zRWH6wcyKO?xFpD>p7|Je6xe$HjHx$tka zdKxvXzgII5B86mAVzGv6H2ji=zt`|^ELEMd6&lvxtD&D+cJk=&)qJGIUx-bZlShBA zrd*4ENW+$f&-cX2=4<$7#t#U(b}?osPW8^r5zYgqaOv;NB%^CX94o{q##5P^0(_A; zUu?(wDqi4B(U1MAd~YO^{rpnIZ$~_)R(rnd$7SUl)L&r9V8;&>v1d;gvsKD>Ei!qp zQHpx9Q4j401Kidy;d#P2ZyBc5Ib2{FZr3?d!(+7P`(wquD$jU&`@qgWK|HST<>G0D zCkspA9BnSn6|E}%3PHaiCFPnWx+v@uqZFPiE?0P-xKiN-B2VE(+Pr)ByI3@Y?JEA~ zVz)P2S>cB@{3sol*m<7B8*L7LO3;c-mVH{p&dPR*7ghYP#X*ICBVJc{muOJ< zIq{CdFKO%8z2dNne_0$=c%QbW-7oqp`+P-P#~u=ws`z?wg~G3j*t4YHX=CRNZS4G~ zSf%p6i6@qhj1Ag2dJ9iZocMRNweIi5!z%s{+Pe2o;#n2{p|%G8SY#{v{6x@i{7HQ_ zikS-kSgu8p0)iZYewZ{m7|EwN7FW)V{Ou%Ht}+13~0c7^|e6E!FPE3sYS zuf-Dz9~Hk<_+R1$g`keCY>_c{& zW@P-vvD-9g)8Vs|;pET34kw1YYR{p%8^cxpv$bdR=NS1a{#;|J!o3W?!slzxlrPZU z)97!6RGtCGR)sG%Y84)2+@|ng;~wCHkR_W>_JsIP#+}u(`#PjM{5Jwq{y!kk0DK>W zzL!h=RfM=-Ll3wyt^@uH@=!eC|J|oRNx1&^`#57+5C7A?k0ZZZ5n$Q%@8*1gF%sff z_>#UcT%h4v4Zp16e`&bag;e&;_d&xsKQ;llvKUJyiWq|_Tvb~9kKG47!DZz>=zvzw zkKG4lWRhIj%+Dak48=kX>-(SwwD>=0xE+@4Az4(6)$l3}Kc-m`_eHUK^nK7g zE&e_Y>-(U;Y4PXvkJVG4;h$^xO%12Ofrj{vULl4tmcpEBA5_A5PTmKt)5<={cq&)) zB5)?`hkW%R;O)Tf|J&Y|0M=Pl`_Ffq!bMriUKSxhfl@+A?#&(w+1t=GNt3h`Dcq*X zO%s~sa+7pHh3mp9OGT7Ld3!aS!4BDe<3Ss=fa~ ze4-`(hb!CWnQUYB7g4cSuuH~a6;^YZJAKj7C#W1w|wv~l3Y_!l{X z%2j6aZ^a!|;8C2fMd5!S<2cicEn*?tyNWGh5!;*xDE6o+W}9=dMJ!<(ez8R?HMvNq zh|?)kA+EBi5gLs80DrErbf1FTiH!E?=0AGbl-2_J8Iy#IXD@9_eBE63%vP^}Hy z&DXvEBBcYLpzOexnEO1{>UVGj1VN9oC@n$T`!rP7o8OlT|8Zx;Kw17@kmDbww7#`FL;ppGh0@7sf) zC5(%BJ>ChNLH!fA7NZ-3W25V9m8!;+TUFg}Wf1M2~C!cd@+uruO^A)~8?I&NX_KMf>8xT?#m*5tK zi+h=B50@L-p%)&bHDfhyjuH^MZBZGnz87^XLET)Cg&)boC|89AH!eA|2QzE z^K~x!4QAapT-mSZvP-|a!S~r(a|5VdzBig3JpKyzP2u5s6M?_jzzh9-oc?&H#z@8CWzvbqB?9Y1%OgFU`S;cugDIhyaV zzAJIZOrQ7vt{L+9UURy~_ZgC$(BE%Do&5XeGWbh*Zv}F;$KT*~E4IhCb9=@GlXY_cqaUgp+Njf@GnCEzZ3B(_?IDo-zE5$A%NeF_?IDo z-$VG9A%Nfi&o&8Bls&^-;=PtVLagulRWr@T^YvmC_bkS_3D3-_1MM&vU*zaK0J*$(Z*semC!2%l&<+YdZVS7%0g2P3HdfYs^3O8e{(1_pjgL zyf`a!I5yZa0?oU5|N6c29TED!!}-o)v@x>XqWMDR#9g`Yf_LY+Pw-v}@68qp;y<15 zUY*Kqb$2rc{f+#`kji%WM|d26_r$+5IWL_1Ag|8@kKzo7CM-!u`ljGqHTNB?@S#c{ zJIs{(xQFAxKkR`YL382(JU`yZ{N!fwLnDymhv>(cpQFqMU-qNm>-ag^^Ir=+)|I6e zx9ps*Rg1G=8fAs&Vtz42aG}yq%1oW7DL2Oh3!g``UMDuR;n~v|!d+hDz(h}JcHwXB zH^ce81^CC{pZp2`yUp*uz5I1^xX%VQk3l9_l-rL!-ZW=2>udhexE`Cq2+0}B69;ZmqFE}c^qzCmHV_wuar z*LyE}s|8s>8#s<8LyF}rO75+ZsYq-Q4l>g>*xmgf>27RA?`V9J5 z_|L!#1=L66{`>Ac<{S_IQLILG1ijpU-;;H0xj()auT!Kiqx0b>c)GgtzOTaAC-F2N zQ0v44SpS!}2b#}&np|_W#|NA1JU)bVZCQit&f|mJh2N9M1i2@^7q3B1;POt-T6gSi z(;3I#8}To}WuI-P-Qmif$7Po?9wqAzL>k2{;%PQ6?py%5^5*-os227WBnjaS4HLgU zPQTjZ`}B|H^v__~9;akmsbpKlvOR}ss@3>e&1s6PYSo&kj%!u&J=S1ZZ>~h#N^=~K z^Iv2vac>2lVHTKWo}Wfl-UTYn1uCy*Wk0Y`;Z`-*w3}s!A-pY8Zx=Lj9Z9_`U|C7M zG-uVzZZ_^X{(i#ZF8tj9KJkagaKiV3f9L=2HlAM@q5ivy#9?)E*|!(H{Xf}X@8LfH zS!LK4b$)P&|EByWvxk3FER4Ikv1J9*Y&^Dn2>!X&R`ZK0ohKEJVpGcTS)*_dV=#{2 zhky@5%N>I~%ms`OHDgCjja~(eds5s^r0rqi!cTA>w>`n4O9;;AHt+m*^YjILc7G?* z#Jwc$J47>v@F|vN9DnJ2e~j}jG1KmJI-#t6B+W82)za6R3WbkRdpO7Pj4JfU8EmOr zo+}Ne0gJ16A3|uV(VLxrjhX9lt=g}yQ*TquRr|LUs&5{z_J8K%1s7wayy5=v82lXn zE0>D18j9X{Sc2?5_i}Pz+dw1<8+FUekIbUaeEH)u-0tw zJgik^U(588&WF^z^I?_m87kj1WvoOSt~3(2mD4}VEW0}=D&;y$rGJ)6{~RUT^A!H1 z%IgAkhVn@>AF+kEi`BWwI^I8%GM>d{l=gOx&ua{5dmDEge^11}Ugq<&W(<5v8~6CNqlkr7Slo`QN0{zuC*A)_hIjTUB1SDf!>3)eNw93E2XKcf5}RrrUzLnb_|SNT4sWU^kp+w&t6+O9moSk{;i@t7n1 z@e!8Ki{P!2Z=Xt8#=wmm>&Ag8owu0(r_FjVpQk-dt$7+0P7Xg)?c^C{llgO#>uJW- zx!dzxcfyaPGqs4u!S$>-OqUVfwM^i|mGAF3ZWHJGCg*z+ z=NkmmzT?UpDBGlfShHoE!gs4B-<%+9d)o)gJWVuUeUZmNi95pSPY*Ia{k=K;i@03V z)q5b*RbKn5w>b7wc^#ngIxwISUHHijMm#=P;lqOSy#L|qosA=cG4DSs_`b(S20!#T zPrV~?6k};8dwV`94cf!G24$(ltrgd=$=~ra4*VSc5uXm<0QwoGFi4F#na5cs55j*G z{$U#{^m)~qV&z|=WKynVQlVsWY%pZ=rT1`Xwh>uX1-E!y9fbCfwZVh%mok#2uQ5+^ zxeB@7Utyk)4_dzKcs^dWlj9YijoxMq+7iFvBl#`}a*?Lsmf#TJDa9m*#X-iWxmcx1 zC%cY*iAwXtfON=%Ic{e#>fg!CF&j8COqvVtEdDWVaDgTcv`JAofbB>bFd8&<_uiDrJs*PQ!+StXa zjh)H)X24G+Zfb3ZGF-wue=Xm~%Y7b=9>e|C)sy$q(+SuhmuBZ7Nx3RBqnpX$6 z_%yFpXQo{7KzPUo0nw-&Y#Lb%W^->Qzh~1Z@|lVO)Y&xt2wf;6-X?-Ao{Zi5{a3Mb*xcLl zdvRH2aLL|HJBNDCm$V1S5`X?T>>S29U()ulj$?cjP z@1{M&&B!;GPiye~8{osRJNY2?S04tRVP>*kA^Id~7f$Cn!tWc@nmmP%GWx89tYsx` zKJsw5K<#uH+!joF{FY>(jk zUt*&>i`V{?<``(*T4@~keEfTf%id;E-*bDsZSZycw3{4{7b|>%vNvABmcqjGiIAg< z`$4tGdlI)ep;?OEVn=hbsq#3%dpmywKb6=Wz|_w29K&D7!#J?pf9nFi7d+#S=!C#i zOG8XG`0uJ8>a&vfLnav#5`J?OK9#YI4<7**YjR^g%XlZI|03`VoP@21Y`+2Q-t+k$ z}TfqbUxtgx)vvY9p3*yWsjY!`ockm z*4mGQw@REW(z@oS7VEY|qcZU}j=yegPHic1f7q6m0sjJV$)E7QTU&Y+WzV4O^xLndj-uzqWgJlw%y}} zoEK+h?os&N)D!et`&GrmzA!Y)2y14Z!XH!k9)*9e@Bx_gT-+9g&r#FU4dXoa{}W@;U8f#Pe9Blf zjWL}f<9%|*v@>qZ5sVQDze2|N4}MjQ<(^0r<7)O_%D9GcFJp%0V#Y1(xJvmytZ@GO ziJu&%c}vmnj%+fLjA>9&hxi$QEy||G4DOA)-g|&U)(RfYA@sO|1Kns*UA2XGp`3v)Nqyamdvw;=z2)5#~JCl_I?$Z!d< zW>LCsQu%*eVXY_MqWra<{G9UNRz3O8952%ZA`-? zW-VjUlh0QET2H=B`Aj;;DdUax+s`Zd=M;XEaV~eNov_KBk?v(070xi0v+qwS z|3?)LkfnzK3ow`|STX(>w!w7|zGYd6hnQSY3C#@k zZO6lu9qHj*p1*RwoTNDt$5)48wYDSjJsy~B?9Br?(UXBk%?H`GGsXBMKEL<~CS^uU2o0uEDE#PHv~GH@!b(W_o|v(tCV{DfReF|82xtNOqa`|EM9WF)7!_ z)SHK&Fjskhyq)eb-cFx@uYznd_#*7zum-%2@iOy2e|h`uI~jMFw}8K8@teSu7nOSl zTgGwxr8Msa%?xva8G8`-UV-V`wNXoh@16iTJ}*@5>LUK)z3_jr$@Mhr{97@#cmbr+ z`(L8YVLxq>-v3fQhaG1gt}vAkF|7%tIzYbqlcK%;dXT&$~y$>nxjq2{Zm()@38lE=T~Z;VR5@||44uYe~<|El>FXRw^LeSQQKj-M&Yel;i9+51loay{NInC0>I0hTwmzM=u9YKwOW!oK{z zAO-(VG7q~1l|RUdUc)@>tZZm^Q9MjjJnX7?*e%HQ>F=(1*hBHKr{ZBR#lzmr!&jMy z{ev;^AadAG@vy(*;RA|?0~8MjDjsqb4+kk84puxIqIj6WJUqfY91&Fh5a;qNhndWS z@H11{P9LH8nWgwSQt@+?;%9a+)63`Rpx)zr_1(aNV43%i1!s61S8uu&1*6`-I0)N( zX)xyf%Yz?zToH@|Z$MdQ;^y-+*zCZR$>s|WCtMsu*^650H{q`o6reI0)ctee8nA2=C8J}jWN)r=>PqSU6sqcge zmNZ*AO_EO+;@ycf-Tw9%@JEps`4gsgiES(X(aC#8;Q!foy54)oLn`>+;T?~Q(av3a z*6YXn*#B`B#M9jGcHzG8D)1;?+o5sqEsII#i7XcXX~4TP-kH~K`!e1|y(zH^rzvCI zuKa$5;N8^QLA#r9{NKYYLkyu2dC(@EG73xGkUmSWdK&^PR5voX)zL z@Hw5=n8N2i%;zGe-#@HxT9!QWPK)Y`BtzT4rl*k zSPpTec){SII%J$e~op zp_Jv21aC92+FbADFki`GzLLXyC5J|qgS3GKEC*==O)Lj#1I;W4X#*`R2Pq3_!;a@x zRrWU32HI5{Sft9nSgqMlP;Fp|Dz9KE?|fC>`CQ&Kmv_)C`;n{nrK-G3Re5E3q8S@z9Zr0y^ z$#@0p2Y+JR!!p@v3AMdm-YeUK@u_AW;_lCQCCf_cr4O}=_b#{(_VZnAsh0tkq14Nu zdJlOJ)UIAm<20qd(#XyE51C<)hs{Sk9>L4Ij%Jm)*yGjeUEDS1i{5{&`KrgKn>#)J zkh$06539Y4kC-RC{~6|4kIyu}@;GDO@c5(VFCKr4zpE={`MB9VaD0Bk(8@;q@y(YB zSlZ80)qa+8`+XPS#t|GEg&u3YQX-1jLpR$QXSicg!g zr@vIy>1WKj-XGtrnSez;=PCJ|$MRVPelpmjBl&!s@r5j(b&M}!`CJY>!+gQC{MgCl zN+pvkl}xTwGWnbubFNZj&ga#bgYO%HPifm=6p$wIf6wdS1Osv{?eDZyx0r!<-Jjr_eNFT8&!F~!sXqU`|nL$UTLeei{#33 zvntCis;FrRmumM2}k+^+b%UGaIl;`5u#=Z_F~)ZD>* zKFjz{sTam~alO33_-<7%cdN2|OO@r@sx048Wf@a%1btW4%e}m&68YSx>P4`W_jXm@ z+qt}NgP$3A<#^ne_W@Pj2UK|3JjwMU^UhDWUS!^R zisvkucb-=J)laK3{!EqY8MSBltm*dU`Z>S3B=z!~+Djbw_cChD^B5gnd;W#m$Nq1% zmnc}|^SF}F<18N;ho9gvN5|7=!!ng2zdBm9rK z(EI;Y&E0=fZy3IC=Q}Qei!aanFV40VvVBxb+@ma`x zivCv2GW-?uTp3jU%*pUL#q)7WhQ}$ME0qi@6`$2ghBZotwMvG9g}37rZ^tojZ!f~CAkRo*0*w~ouZI#~9sYcs1nL2@xNB_f4buTLrVUF zg`ZW5pH<8c@!tjB?*u>o%mR2Z_$2=^VA{+3cRI7s_XPEw>;Fr(ofl1^G2tlGtT9(J zjxqjc++Er;hw_qNjl%5;YunE2mH+b!Pn)XJQFvJ4Z!4^AI}5f8?+2eWtxvMW@v6zcwFK4pA_a>z<3{yFd19QdZrg!$~KkG>5LEJ zbk0@&+iFYsU5;D8={&8{*;ZT1!=S8Xc*TPIn2bdxg9>X~$~%<*YYOjwaww}tg)db2 zI|~0zVQotp!v=XqSTNd_vQPPcU14oY`B&v1PlV~LR`@1`Ur>0zWki1s=Um5Fn9yfo zYuW#C4!D@{?u>5(J`5|&ufV?XA;!%nFMn$EIp7)idK`_zZvc-1)0*Xv7Snl|%s~$V zIsA~x@%Ukr>+vHd-{VKQ#w6|!c;8s?4^0X*e_clTK4B_nToC;y%r<`3nA-TJJw&!gb}(&6rRBIrUAwCzXBCFO*G@;C;bo26j`l zwxaYY4RmRi&p7_lzk@+D!@OYfpUa6Bak*Yl<$3`Wu3Yj?sqp!dlGU#u3rF*c`Gv=? znpZvkwX$*g4PKyh^uINvfl8XMn--7XFjso~J9D$gzgORn{)2hl`~OkdzrAI4iMTZX zq-^2-Y)imtTyIkIF4|VRSna~8h;++odU8m zq;idc#+7{>(D6f<@@)eB3|Oj7d%?BOT-Fbh@E?VL*xz#lM6t3uNZCXk9MGw_$nX%g z2A>fe;r$N_$ihWvW(F9-EIuMQ&Er|YIUXMweBR@{;OidG4q%mO;~pKX2kvM7W5EW` ze~kH;ykd%Hd81YQi-Jm@PDwE8acMB_aaj+zx>XL-CtVc4yC|C3bT4DlFbMr~NyXRFu$$=~ra4(QS+ zOnp4lL2dGsVDx3zCQngq@)Xr3Pk{toT_jYST&C739l^n#W_fV5$DP439(M(;9w&ny zk5>ejc-*Vri9I#A+54{yzUOg&@QlX;+?FomvYZyI`;{xpX{vpmrua`Q{)hbgrL|@_ z$VHkrayn~+F`v$APUk!DA2q94CJ!@S!|S*wE#3ohf5~_)uUr3U@&53aHoP_fwD|O3 zw#Od|syzO1Kvr);|B;~G<1+%NMArXICAW;~*B=cso<{I?%V|to&1=JHjMoHz#dx*9 z#WbHD$#^aAAshpIm^nM>DVQ2EAGj;s4cuw7;2?jPy)_ydvCJw71v zQIB&Y>pVUvLMsfB&moapJf0B=+xGOxBi{e8$hgOcM_%-JX5@Dh@a-sL#_YXW`4Ig* zpqXK2Mb^EFw|QA6vs8V}QZhMG$s|wVqar)|d}l}Y_W0{lH_JcMGymn0aqurXUODssCYPmLwWV@ZmI_tIViv(8+~9Fz$nBWSPh9kuQ3@C~}9#Cq%|PUJ?oCqZ1=j!?`2k^qE?-G*aRHPmav<_>@S(<7JU> z-dP?Q^ZwnD^&YQ?yyS6DB-HVGBcYCWY9!S0`Xc!`uDtz`W{(FVCwV*=NqL-#+~VO049+mriEb0S)=s{~C>C(-mp z=q`!Ov;7geOG0^#A>5T~9N6(j*zrS{c-WECfdjt^#?&i}`B!Ee>^n4`IY~W5pSf?LGdO!XJ->YpzeI`R=Sp zxaK-1(&FQu8wvHa^CG8u|4&B3Gx`f6ANT$jMlSXEqDZ(FTNkqr4e&29If0=H3Sx{sc;k_z_2NnL5!e3SRVTGSj__qp2QBIeBk;1fwcm90}U!?GRcU7cf z-n*+pBPs5obcb!GfbqYU4pzrJPv^4e_i|5W{~7H6Zt7qca=!n&I+&d29>8TEXFc!` z#*@*d;UmwPSe#aWpjDg18gRFM@l*Kfyj!S2ALW-70PWNzAynG?LdnF5#K z9Ta{a+fs`E`_*}n;9R6R6E7y@+WBYgUHJO~cx1P^(gCOv`RpBQUp4t z3Z}1Sn(G+XFus{_E#tcw*D?Mc<9f#b#dsd$pE7P>{7c4-j5jcDW&Bsh49#Is+A{n_ zJ)Bpu{!$7q{4K_xnmP^me#VzfrL&C3fh$1|(VJ%(ubT>W+`Pv4 zQ&Z6t%$tlanF{E~#@s*TM2{XBN*_Ix?mW6Ciu{62C4o{7^$ezmh4)g5c2qo8Qe0X=|Mj8Ssh3G1ii?Wk zMTjqj7x5M3a}ouyQW2q#XoI;1@+)FRh}hjX*g=&7krz}HLT09GaAbL35?(CtQu5-$ zd4Cpe0acKps_jdz5ylIO<_wjllO28K1$p^-@mNJ~f5!^oc#Iq&vCEQ#T`YOJbbKBp zyOIjd+=XQ`K~kdP5f`fld%M7I*_?thlSmLmclAmbyHP_! z$zh-3Q19uSB6By~+s_VWZbb30nrh4^Kjb2Df~(OfD2N@aIud=oLvY3N=gcB8%uOJ; zl*9AMHR7F24_84kg_gQNak`lCm`|Ewij#STtGJK?i(O1{mY76CGlb7#ZjTk9EkFe2 zv3zL@-Mz`au7dJXY7MCMrG`CX@F*-Lj|z_7-;rLKOqaLEVsnNHVu^v|n&I+Te9o*` zOj1bZ&|ej6}n9Tu^eL3qdwPA7OdNP?EgMiYXst3-Zp6KH?E0}yy#VSy`ZH^%aTLCCNWHAh8U-nWt(Ci#?#T+t`c*3090 zMFpHPnC~1(VX_rNTswQ!J{D8aLJqw9>Fn6A+QvI zA^>V%<*|aiq7teT+iJK849AKv3c60^y~6IT`chXf_y1Ta+QexigTt;tq?7%CZoKMq zWMz&lF71ZMAR;ar+AU9T=%(ER)GgxZfboJk-32^2cBFfU1_ykQIW5_T$n9}%-=`(I z2h*#|<7nVWj74`EY6~TdyX2Re(-K`B!yV1FQh(F+TAsjSl&B4 zR30y~GK&{f6d|>O{1^);fgUxG>`T~q!*O(D=NAry&LZ6y z-A-1lD<(RI2m5Zo zJNtd4VvbaTNLWv_4=(5!SX-4!^$nrqWhHs!**LhOx^HD02Kn~Ew*HR3J_;($TMDzd zRB!c2cX!>IWM?wjg^sh5g3377f}s@%%ZddBpM$CfPDh$Gg98IigTrkjsT7oO%twU< z`2{xB*5r!Tv)8EycZW~$NNq-?VFXVWUD@+?ShJ_=^ zk!1Y{Nk3lXiqe_vU6tgJy8hHKL=%U4LOHdfMiA7zDw&4fznTI{Y{?c4tQ;6zO`>nX zkb!_wj=}Xs(v27S3Y;L_IMfBHbr5GuH(p%eQrWz84zNLkw$;l~)dR^+j6h)-ic46_^dZ^# zmtd6P>}p9xEXpg1b5`V%;T)M^8-YYjevQe26~jH`2kjnyOHF-8XK!Ec@LHtb-D`yn zF<=fIrn#diuM{ICa&UB{igu*a9q6416Ad^_rD33}x05R@I}MqYTpF#((?&2mWs|st zlp|_`p4^EU49u2cB?V^ddF2MDtR3p1KyceF!n|hXH?NV~QJFMNZt`ftP=hHxIqRT& zC!vXed5pp=tEGkl7SKFRp0ao%FIxw!E^sH9pIn>j=<2o-<1`9n;k48=O3noZvTVZK zHNsUw8O3DfM1Bpmlu1n1O-oHvO-lo(6O*Ran(V-00Yxr|Lq!44;*qG1v!BRescB7~ z3fZui$YK#DC@iGXR6CqrT$&t4=)8hLG&XJ{m{s7Cww9s+7pxRY^Xg|uk+h}?nl_3G z?Bw0j+T7k;)7+StS65YA*Xky5@4cXHE@pCc5>gqwZ~KyVtm^E<6#Aan0%Zv5gKf?j zncAS=C6QfhPO`RlsMB=-WK-*?S}^CJcXBS?lUI$^6G9oTHGJHD<)%CD)1i{i91 zD#KqKWv2C8ei0VaG)2(*7sC=($lR*S^0?7MrR6aYl^wQXj2UjJS5{VmxTsU~Qz*36 zajAktebth=amczbYw)s7x{X&j)IME*XfMKICWanSTh(4wUgVZDvHZdkDA3gUG0tMR zpx{JfUDMq5dDQ&Kmzrr?T~j+Xu3|glLa)=Q4;Rt$iF{Z=K*^!bgSa@~y z(%K5yZM70|w$NmdK<6&6$9>Aq@^pcjn;dTI!>#~4&?d@L@&^HHD72~%n-DI%9t#qS z%dl|hO0FSt0ia!g-4iN!)hh7aLEEbJQ1iovM#L0eo{Hr&utT){QZa>}^vamr5mFobTBKL*2|7kD17h{~`kM&s~(}wg|?wk z3Ck&j{=&Bti!P+jrSeO7>~zW!-mSJ{r8LXO%C>2V9xJ0r*x>womgv-}CoWOr`J5o> z8sPdLU!rbqr52|x3tp-5#_K!0Qp5i3W>;zxR$wu=3o~&AM!KDx7(i>8#0re)w`Bze z`mL?NID6KlU8n3tb95^(3U%6UxB^3YHoF2tjIFG|h(adqP0R@txRn(cNVc#7bDE%? zV?exx#S}vQV#=*Sc--D-Q3T4(E{Z5@GK(Uj+sdMdNZg``)-`Z%eO&{he|TL(X=JTy z*ki)FhWxg&u3?gQa9u;`O=?|3gnnH^4!^E(%LT9D(;3R7)*WaHv@-V*`4B}b_w6`+ z*@mS++$tz-I7PtOj}i4s^r>!4;a11OPQTT$fMkNjeBl<^JRNG4jweoRD^ofBa=x6> zvvFloz>XEE38Ld+XtYy3=3h5ow1K5gDKe%KY|(b$e5sv|%VPPo35)~tL2PG2@8yi#ct{&{eg(K{Ur?I&DWD8rL6uR-m zi}GxC;zf+DOuR&~*@>3|w=(g9WbzX)h_^8DB6N}yFDN%V@lu!@3*7V_4wT_mBhhVT z;w2J2@xs0Ji5Eow@We}LWKF#6F=65*zpYHXO!5v+yp-OgCSD@+6E8WoH1XnaFx-X1 zZr)}#{5GC=v6qxR@#4gA@_TUc64MAfDeSq?3g7PAV?A%z%yBFkY2yIXEpqnj)Iu|1 z;p%q>CT%O&%HFaC)?i`{v=z&i7?yd?aw9ZKplyNB-P1jS89ufR})d8ZW^w7g009BfX3fl=Q!DKJF8EeZ_ix2C|bT_J1ct{rCW z9Bfj7feqhg6&R$q6$OSUHmkr;;8qkEkW5~I0r3_T7=%tzfdS=a6&MPei~>V+TTx($ zL@O|GZ(V@_(Lb!fP#ReZ40}vaV90MP3JjCHg9;3#Hz@^%2)zPBjx8uKm;(OJc@Fa^ zcI0KZ9$UO}`cr~Y7Lz&Y9x?I6*equSS zlS7@DeP96|k2MV7wA^i6un|pYYRg76ace!J=Ek^PJIY=RY|;IIOUE(2u%%1W?t+*h zY^3{vL$Zn^`*Jb`a%1ntTb`aU&u%&BBWW%J**Mpfw|R8}r?W+d4X$ilI@%?kLLoKO z^4<^0h&Fu?K!-Y2bcPuc(LoC71F}_W)1rN&l*Qb*=$Op9sXfYde>$JSvO(^s+_&L+EjEf+I88)u4>AmVdkfJ+%I#b%6l zr%vCb2_hD}Lv}Y!>(a92LyQS*hCXz3YuTBYU&v^7h)W$Yd(mGo7P`d;*>&s1hd1ut z%Hjj-Bft1?iwv?`b~fV9#9tV~&h6N~WS!q3-CVyHyu$5>HnN?#C*v=UehKdLS(^x6Pn1$q~Oj@w` z`+H4Vu%M8VY{jGn%a0*+Fzm#`AZM;$8OG=&w+GfDjlBa&@~1{Ml5$IKZg|$hAjKDo z^7X+s`XKsC0d*Msjq%^!0a)UwcEM%Si&Dq%R@wy^_U$5EO2#(5D2@B}f=Nu|v5EGA zBvneT?a=(TEo}!A(&pL@ZZ`S0Lni-2sU%IHCE#v&6>gt&;`$5g`*012QVL*#TP zf=>$^wcWP|HI4&1{l2|WpFW5h<8A)Z;nNeaAQ`~{!)jOvf=)6yJ<&BZObM%)n0Nb= zX<-Z}(y%A$9j03bFwsEnSXJ{q4EVtbqf5Cy!#6V|Ci94UIuj$7PK=0S!$SNYc16SX z;!a`Va6b#d@z+mWd)}6UFwp~3aQKL-4tIYSY$n|jj@+1s)qwK%e)5X-L65()UN=pUwg9|_cvy9-9%BxdrY?GU%$j60cf2cW<}l1aY% zSZIbj={f=34FFE2`+ISvj!w#k;>DebUJ7&iQ)gn(I^Ei(Gr^HTAVu#?^jQj7lE6(J zloTQCy3?&L#6WX$yAyP$6JfAp#YzG)$0f%hx?9%H*KJl0CDO1Vw+7a5IV)wdLR)I! zu_o2KCP|jdUB(VPoPU5RX(u0&+rCW*Qdxg=eQ%CN{Jim*f| zaaf>I+qp`pJg~Bq%W4UAKL)pf!W%N=Kp#fN-#69QTyg8n-jTu%2&x%#5?`JLYl3OI^S6%@ z33clTtq^_F(fg}MxX?sZDR)j12|q{D|A^|FXJLh*1U`j1gy~99XGdM zSBPne?+CWz(hK@_Ut)M|Dv4XBpe?TGORVlm4#0woYEG)RFM;VKO?MTg3HK#Pb8?G- zz699!{g&?fO}M**t1-Ce(v7)M-`$~>m34Q=TJCS_-5qQu<7xp?w+oO8Gx4qt-?YJ1 zfn=hkCehf?G(WMRY6&*e$qAIGscLF&LIIq+p{ZpNnWo}4B`BJz7SwTsI1{u~wa;T` zp*R~_>PS_9&9ac!%xgZO2}V3^?X3+p?RB-~#Z1@KoM>-d)KpVm!p_CD4Q*A`Fx#V> zIh0FP+lfszxTlI&yK)7^)=qBFsIMIe!t#e&j;HsI|&{)fEl!e@l^Aqhg z^Q9zkH_dHrUewa&3Im_!mbxZa7&yUmUDX2i;Nrlm{e!;zCS5H1*x`%55npfg@L;o|F3EjnW8`_zj)R*NY+ru ztWR4_RimYY@P&%x+9aheAoFGNhUs-<;)J?}x%1kkbOl9BUbk>j!(xb`s?B;!5$cw- zv?iKRLn14>YD1}@W!TJ0Id*GZqIOY>&`3#QzGT?=kVvrvO4HC(OZROl5pvhoEiT6b zSe*6Et?l9y_fgmnt%2?g3su_*LL+>~5{=DNbld`?3)GTR6n$J*&gFs5uz?!ROfu978ED8DAda5wKg|3FKVNJ~s?^Km207IlGmBwFbzQhA}&1w5NuPh{h7n4VMn zER>Qsi?|lF6SS>zTo@3MlN4GT+R=8=zMIMZp9*e$PXwM8<*uKL@s;X^XRV&i9Ts2pdJv;(kZ8>4M%!{O`EVZ`sA~z6VlPFQs zhCT*s^Lz{rc*Vd!a{$YGe&zsef`)rc7Hm&nO1JEBqmA{(jh-ApL2-9dUKoH0J*E?R zVF1?evv8A*BgqQ`FoB;1EA>sjFn~n(b~&4|Z}~|9Qnc`Ys3w#(KQ(}@Kk7iD9eH1Q zH6Uh(c_G*D3HU81iXj2~o&YI1%(jkVv#^RI#lV$%`wBqJ?JY?J3b5o(g#@{JPXP3r zc~8JAk&;sQo&W+SyeB|6ZDbqRz9)byfPRC28(#+SR|PitG5{_rZsKJCGQXu)BIq^% zto`X?Y+@Lf6ln*9R{!1sHK5R}T;3zr;=`+8b!U3JQDOOJMRK?kX5lyvERPu!7K`UX zv*~AWVBy=>yZmTlpTp^d#ydhQWv@%qLTYllG%|CF4es4dJ}hGHm&Jl)5L0etjKR& z(<2KiT!tkTWSbNviU&Js8XhOFlOPgQ_05l8(9|c6Uv%S}$1e=^TOYqf9hUJ6s_ra| z_iFs2E8EaZw>*Af&_oF{_JXLiu~Uc%eHj-((lZjJJs{UWoe~+{FRN z0v>~{>}w@bbe$0kSX_k0fZvx~mF$am(j7pNR~JrKu-XtGH(FayS_!y?ESAcfN_H5x zEI0u7n}@I|g?#8PaB+Xfse`yQE`ByEY!YZcml>1drtnBeF0%vEX9vh4+VbM)as60$ zNTmn6aZ3SHA-Z{SA@1XN6BfI?9av6xDR8+K`m0+3tr$$vcG?h%Dl84jMfd_=cIy#? zhdWrbUU7KY!w?Lta!npr2i?9B-3i0OtBhtqDo8o*`AJw|1#-hQfp9FzS%QxH;Ue1J zLKRXBT(=w^!8-=9BJ4uBXn%~5ovf*zNHY??Z8{r8ql6%ySELFMpr)fOm=ZNAe-d$``jlysFW3ymVa_z(4ETb^IQ)QB+) zv+Fx$Vp_zPMQ~N^pKPIlYi!oU6qmH#aSIJxikhs22A(gF-Z9a{6xxpMBa^$^LG+99SZFZGJ7}Rn=}pQ)g9yEa206Ti1_m!&0F)8WUpU{kJL_~i9d`zKs({kp z20Km+w6Xj|1D4Kh?NyD~wV)$1Cg{MCT5nf>M+*6pj?4EPoZ?1XhFNn`NFClUEGVle zh8?M7;cmv2*VCojHGFR6PS$ZDkiDwu&VxAUH5oJU0p-6N}h*WJT_6q$xLlk&z1(#n-u!tHihm-Up zEQm0H;rxK#jR8pGe1}a5C6uOUTB;WMEa%o`C)$dGy7Yj%$D1m~rYEwn958WJ)1vyS zn)XGlIJ2xrSYygsMG`NH(Cy6;jhmJykhImcHdHkxniegnwu!0uXg91xQc-bm?`#Ah z51E2l-DtxN<#gvN5^h_uJJgL8loUZFFhc`fHo#!i8$?T?R#M(wMncCaBmRps#$Hqo zU3hV!ScX~%5{qEKi~auIE>B|vVo0JJ8Oc+t-FO89D@!zfvPYt#@E*|L@n8crejJ8l z`?Cp~HF$CY`@9RewbQ-H6qc;BV3<^e@=y!G&GxK^Yl!bITr4hRYWk!g?2=-C)h6pI z#yOp#H)N#BIUxmgp#^kGmmpX84iC8|ya+`3S5J8Lhy5nJ?8AOFXde&*W-|IqGaCK% zw&<`}S2tQU8)VB4mDs*EB+pBPEw7fedq}RHUw#3T z)PJmDkbmokB_`%>u)hgkDI$Lx3&tBZIShski|fF-r0TrE(B?xnLEK)JKQRKo@WBO> zq$i4RBVU)S>eWJHd!jfd2wXf7)k#r2?4Tys<8ekgFwzskBHfYdflUlOrv&HnzK(&FnB|!in+Ivw9FTvCnhchcfE|4p@^BP^ z!{3Rw0?9-xYsm&PB@~En*3%e1Iiq@YmGB+96_|C+@Sk`cAG>|_Rv;bfzSFk?v990T z!)X()$rO+1L^#x^?@BfTvw*$_I(B^xL=yJVxV$t>B3ZYxVRBGF4W zxVOG!1JOUcWTP~)mTc@XVaY~*TUoL($ve1Yqx2@VWFtbqWFv=OveB*ie^hJ5U3$Di zn(T&o3T@UdQ*T(5$9XA!l|fuqme(m>_d+%0x0RHvP`q zZ6Av_FQ*Wkg4ug9Eoo(5rlY&={$VJZI0mBgIrf&VU0QgOyy<}`*ja)H@;XTfN<2d zGj7TF6GsLh|ND$TailQ8hLd;Valq(}KjDGlosS%q@h2T7WLu5$uDp&24;PV)Kk3E3 z$ryibyHzHv5wuli_K?`n)X>gn)pU-}EuO5<@Te;mN3`Wr!uDr_G8Xvu z++K$l8L87`C+&tO3hCn~z00uyMgtFqGMh;op6|1o`3efcX0A4iCR;ac7VR3=R$6@w z-;3Dzt}b6)@cynhkbSQ+qj#gjCVB&s4DAT<=s4MlL#aml*p{B*&$Bn~8L$rWJwxP( z{V_N8+F5`;O(8?~VsF&S?(Vu;ym_aRPzP~_>j&~vDqcF zW3vm6HnWe0eF1%12laq+PJG;i9+GXRtJko_!&YJ&>}6nqLoajI(jR{9m_R(Qn*J2# zRn-bzQQkrUWaQJ!CDGp8LLOw# z3s+kmR-&A6IR=pW#^x&8z94e455xYcbrt3{!X6GGV!sBvAsDscIreyIaiSxQ?{o0y zLkeQ_vN*l+!jt&`N=go=(80-Hp%BFlE38Ee7ByD!x){gwZP?ACN8&nrU~bHItw25iH2KY7AZ0bcZu(aBuQ5(I`E^zZgRUvPG25;U-frm>ny<0N8$#?dI}D)0lK-ad+9*U8 z+7tuxq1d&-+h2=t0c6)k{_@T<`G$6FZd8u!9Y!kkCQg?piwlQu#Za zHnY>ozS+x%h6JSghRtj;7d5jP4kyi2PrAxE_(Zid3Zvg4_(vab zB)XSD_cH#Ti$MDBBmHvhKl(!F`|*$HQXk8SrT}gM5rtD)^q0ONNllXC5?$`uIni8v zME60L8T=e91Kz>Xy?hSx-JZS~EOB?mUrLXfdo}(!x@qU;M5n>C#qvktj&43MrA^=L zU3OkhbQvO1xcd=r^jnC3j;;rEJ)paVn6*DjkNz#jKS!5)0m^}oWzN92R^88~w^Y%! z;Mv(dz${T74&DGdG&%lJ_}ZTbrria?*FkEFI^Q2W7nqwR8vobP(O=b!OxFv6sYGP@ zx-Qi{m4n(0wPl^&wZ9L{{nWAS&!y+woBBJ&b0?uwvT~;Mbq?gF+{51#?(y2K8W_B% zc*zLOl&ls_;Z%z7H^sa!bO24^ks|b(!ZoPfJB1FW-+6*tzWMDur?BLli_)iB34c?} zZlMEcO4dk6Zu+8a_?u$(3>`pIjC>o}c}_9%edN$RJxk&_=JmI!P13h+g=Po-{+Q)UWWTkxTR(8YJLs(%gX&{xG#sh1%D0d`~4{J zRU+;1WMF&n=T?hRkgi5?6$$%Ds?n{%Q8 zx)QnjCZxA&g8PgK?z1Mi&xd;q`BTM_ye=U3QK9@UhkM18xF1yX z_e==CcY^y7xbOJj)F_J!^82p|;ZMOGogL;s4)>05k0Mjz@3(O0|5r}*TDYnFe}VfM zq*nYN(Qa0A%Y%!YgalR|e9 z-0nx^J!XQt8t$)vzYO>w{^r7+mp?UnjCC)7d+gbq=xUqa$#7TxJSX~sb@#%Z|6ES= z=^Wv24cr@E$cf%y>-QYEdkUmIQ2H0aJu?=j{~5Tu(0>q}^S^@VmHTsWuX`mY`bV4J zm&yHVPPE#(Z-;vv?qAvbe+c*fePR2j@2|Tbm46)WT!hQeyQ_I|Lih%_*Fb-vuddVR z_eZ!l+>sMKklj0&X*2~qkQ2QP^4SgbkqdY3@YHByCCx*-n#17E2mQg8z7Xznksh3e z{L0~8_jFG5L>s;k?hSWAU$X8_xGx7i^*^FN74GX*eENQS>X|V9N8mOW ze+=$1q}L8N@plp2<4@*9du{mV;9jrNyAJMrRbO|){S?wahUt+O+|w~$y7V4}djrP* zT$|n#6#v$o=!h-fGjOLc9W>uvHn>Ms_#<%Bx&*=CXM6J)+~!+h{O8~v|8Xd<*Wpef{1m3& z!9<~=wIKXF>)spgWxvmf7FzeAaL)sO_3Xwv4DS5z=kRz<li76X+(2;1MjaIb$oCwjW2KML;D zB{|WPt-Bmk-y}Jx`2CB$%DrGI}lF&kH+gI2!9Z6KpsC&hI{=_bE2nm z_zvb&xW^PfABTGb#wUrtgZT{HsZWLZe*x~%dvl_X+xU0G{S?x_pWVjX2lp-ah2!mW z6n`wF|1;d{FG$58qbMe z8gIW06#b;=CnWE$!99xc^*?O<+u=^3e|*BaAA)-v`j;#JQ*h_rm=k>r^9GgY6}YcO zd)=SYhxWe%#v7y$C)eNhaLh{4nM$xYu0|{mABjDcsZ0fA+QUKM!{X`!GI%-u1^_;a;QU zIUVlQT{+RTjXw)+-5v_yrhN?rbNiSJci(NHyAkdUm_J?mOW~dd`NwQ}-Eg0a{4(q| zW+jC~e|*A*p9yyh=I8UQdmY@PFN^+3<-L~N=)cuA{5x>3NB?s2eF*MpXn!vMr{Q+` z1kL~Ba9@u6kG1)~3U>zm+0}1=J%kkI(^i}QPH5qiF@`oY+$HM&-!dGy88&e1O2IzBcyj}$NI*i9NYC2+q?>9ZSa1-Rc*{9Xh1DCVbSmi~6Qqjr2c7=Cxdy&mJUo8L@l zdU$9U&tu~hoDReB7*u}>M;cwTaTwAym{`#_xV)n;!JDy(j*&I+t!Zz@=aF$losfI~ zT_gSdYv~hg}1Y^66LL3n<$gh9RQ?CyTJ)b)#l~` zI@Zt^%fPBO_!nEqtS=Pm&lB<&#n>b3D`Z)YCKywNMjiBAkG>Be8Q`O5;b+G>VJl2* zz}(D#@I`-r#(yhDeM3fl42JK^B0k9qfA|^M8vO?8Mh}U)2Nv1-L0%rTPY2>;N#5AQ z!JP5WBoKpm3t+-ED}A3vUB}UvWWpOV>UNF2l4Gyz7<*wxOw7q@P%Ho^TKs7nzX_&% z6U_0fIh!?KBLg*T+-4i2Y3JrF%&f5u8nU;rAs+FLr?>RLQ9);F?Pi~MGsv$XAbhm5TTKI#HwP*q`2<&!mZ)Sb* zpp9=?qtn=9Nz3YFsHM-utqx(tlnsZ1Q~9iA)!fyZM_)gXpx+=>&inXT$5Si8Nx%+ox|LXnWykW5vIGlZv^LLsMLW~ zz3IV$>|`5oHpY)3n~vp!>0x51jo!iyAM7MA)QY{>7}CScws+VjX6;L1JmIhM$VD3p zm+>s?p7TaCp1STIJF=EAv!H10Yge5lH6%$>`7T?i!&#zKHP zXovFwDx$ML<+9`%dcn{Nli*WrTRT}bfOkUaUR1Y1zg~krmHmZMo^5za*i`MIJ$EL1 zS0(ZBSbYf;LJV)6N&iJ-Q&*4Ow6hSyI36;>iy)9Xf74bcv(R))@5>rvcp6J2MYEgR z*jx>Rv*!AGx_H)3j}#^_&<})FYHz-U-*|>G3`)s@;STC8`e6|l-b%)#YX_dtZk!b? zh!8{8rashyo?^c{J@GMia3nJj-k2RmPw!m4>3-sd2V#!;GK_f)H$847@&O-cRd^lE zH9G3R_Kq_TF&NnB!_AsLEUDZe*mO5$`SY;Us-BNVQv}D{6s2iW1M;JN^;+p2xc7{D Jv|lkc{|`(|8j%11 literal 0 HcmV?d00001 diff --git a/SOURCE/MAIN.C b/SOURCE/MAIN.C new file mode 100644 index 0000000..60153e8 --- /dev/null +++ b/SOURCE/MAIN.C @@ -0,0 +1,849 @@ +/*--------------------------------------------------------------------------*\ + + MAIN.C 1995 AVM + + This demo program shows how to use the CAPI 2.0 Development Kit. + When the program is started, it prompts for a number which will be + called from the CONNECT routine. After that there is the main loop where + the program handles CAPI and keystrokes. + Following is a list of available keys: + 'l' Listen (CIP mask = 0x1FFF03FF) every service will be indicated + 'L' Listen (CIP mask = 0x00000000) no incoming call will be indicated + Listen is sent to all available controllers + 'c' Connect to specified number on slot 0 + 'C' Connect to specified number on slot 1 + 'd' Disconnect slot 0 + 'D' Disconnect slot 1 + 's' Send datablock with size "SendBlockSize" on slot 0 + 'S' Send datablock with size "SendBlockSize" on slot 1 + 'f' Transfer a file on slot 0 + 'F' Transfer a file on slot 1 + 'v' Receive a file on slot 0 + 'V' Receive a file on slot 1 + 'a' Accept incoming call on slot 0 + 'A' Accept incoming call on slot 1 + 'i' Ignore incoming call on slot 0 + 'I' Ignore incoming call on slot 1 + 'r' Reject incoming call on slot 0 + 'R' Reject incoming call on slot 1 + + Next is an example how to connect the local 2 B-channels: + !! This will cost the same as one telephone call !! + After the start press 'l' so that every incoming call will be indicated. + Press 'c' and the program asks for a number to call, then dials the number. + There should be an incoming call indication on slot 1. Press 'A' and the + program answers the call on the second slot. Now everytime you send data + with 's' or 'S' there must be an data indication on the opposite slot. + Disconnect the slot with 'd' or 'D' + +\*--------------------------------------------------------------------------*/ +#if !defined (NDEBUG) +#define DEBUG +#define CPROT +#endif + +#include "os.h" +#include +#include +#include +#include +#include + +#include "capi20.h" +#include "c20msg.h" +#include "capi.h" +#include "connect.h" +#include "contr.h" +#include "data.h" +#include "id.h" +#include "init.h" + +/*--------------------------------------------------------------------------*\ +\*--------------------------------------------------------------------------*/ +static char testblock[2048]; + +/*----- note: you may enter your own number here, but if you -----*/ +/*----- supply a wrong number, some PBXs may reject the -----*/ +/*----- CAPI messages containing the wrong number -----*/ +/*----- e.g.: static char *CallingPartyNumber = "1234567"; -----*/ +static char *CallingPartyNumber = NULL; + +static char CalledPartyNumberArr[40]; + +#ifdef DEBUG +static char CAPI_PROT_BUF[CAPI_PROTOCOL_INIT_BUF_SIZE]; +static char ProtocolFileName[80]; +static FILE *ProtocolFile; +#endif + +#define INVALID_SLOT -1 +#define maxSlots 2 /*----- this demo program handles max. -----*/ + /*----- two connections -----*/ +static ConnectionID Slot[maxSlots]; + + +#define B1PROTOCOL 0 +#define B2PROTOCOL 0 +#define B3PROTOCOL 0 +#define B3CONFIGURATION NULL + + +#define QueueSize 8 + +typedef struct __DataElement { + char DATA[SendBlockSize]; + unsigned short DATA_LENGTH; + unsigned SENT; +} _DataElement; + +typedef struct __DataQueue { + _DataElement Element[QueueSize]; + unsigned Head; + unsigned Tail; + unsigned Fill; +} _DataQueue; + +_DataQueue Queue; + +static unsigned FileTransfer = FALSE; /*----- signals if filetransfer is in progress -----*/ +static unsigned FileReceive = FALSE; /*----- signals if filetransfer is in progress -----*/ +static FILE *File; + +/*--------------------------------------------------------------------------*\ + * Press_Key: +\*--------------------------------------------------------------------------*/ +int Press_Key(void) { + int c; + + if ((c = getch()) == 0) + c = getch()+256; + return c; +} + +/*--------------------------------------------------------------------------*\ + * GetSlot: returns the slotnumber of the ConnectionID or INVALID_SLOT +\*--------------------------------------------------------------------------*/ +int GetSlot(ConnectionID Con) { + int x; + + for (x=0; x= QueueSize) Queue.Tail = 0; + Queue.Fill--; + } +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** datablock slot %d ID %d handle %d has been sent *****\n", + GetSlot(Connection), Connection, DataHandle); +# endif +} + +/*--------------------------------------------------------------------------*\ + * MainStateChange: signals a state change on both B-channels (connected, + * disconnected). Whenever a channel changes his state this function is called +\*--------------------------------------------------------------------------*/ +void MainStateChange(ConnectionID Connection, + ConnectionState State) { + int index; + + assert (Connection != INVALID_CONNECTION_ID); + + + index = GetSlot(Connection); +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** state change slot %d ID %d: %s *****\n", index, Connection, + ConnectionStateString[State]); +# endif + if (State == Disconnected) { + FreeSlot(index); + } +} + +/*--------------------------------------------------------------------------*\ + * MainIncomingCall: signals an incoming call + * This function will be executed if a CONNECT_INDication appears to + * inform the user. +\*--------------------------------------------------------------------------*/ +void MainIncomingCall(ConnectionID Connection, + char *CallingPartyNumber) { + int index; + + assert (Connection != INVALID_CONNECTION_ID); + + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** incoming call ,ID %d, caller: \"%s\" *****\n",Connection,CallingPartyNumber); +# endif + index = AllocSlot(Connection); + + if (index == INVALID_SLOT) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** no free slot available, rejecting call... *****\n"); +# endif + AnswerCall(Connection, REJECT,0,0,0,NULL); + return; + } +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** call assigned to slot %d *****\n", index); +# endif +} + + +#ifdef DEBUG + +/*--------------------------------------------------------------------------*\ + * CAPI_PROT_HANDLE: This is a callback-function that has been specified + * with CAPI_PROTOCOL_INIT. The first parameter is a pointer to the protocol- + * message which is plain ASCII-text. The parameter t contains the type of + * the message which can be CAPI_PROTOCOL_HEADER (appears only once when + * calling CAPI_PROTOCOL_INIT), CAPI_PROTOCOL_MSG (the text contains a + * decoded CAPI-message) and CAPI_PROTOCOL_TXT (the buffers contains a debug + * message or a message sent with the function CAPI_PROTOCOL_TEXT). + * If the type of the message is CAPI_PROTOCOL_MSG, the last parameter contains + * a pointer to the decoded CAPI-message. +\*--------------------------------------------------------------------------*/ +void CAPI_PROT_HANDLE(char *Message, + CAPI_PROTOCOL_TYP t, + CAPI_MESSAGE m) { + + fprintf(ProtocolFile,"%s",Message); + if (t != CAPI_PROTOCOL_MSG) + puts(Message); + + if (t == CAPI_PROTOCOL_MSG) { + _cmsg CMSG; + + CAPI_MESSAGE_2_CMSG(&CMSG, m); + if ((FileTransfer || FileReceive) && + (CMSG.Command == CAPI_DATA_B3) && (CMSG.Info == 0) && + (CMSG.Reason == 0) && (CMSG.Reason_B3 == 0)) { + + return; + } + puts(Message); + if (CMSG.Info != 0) { + printf("Info 0x%04X: %s\n",CMSG.Info,Decode_Info(CMSG.Info)); + fprintf(ProtocolFile,"Info 0x%04X: %s\n",CMSG.Info,Decode_Info(CMSG.Info)); + } + if (CMSG.Reason != 0) { + printf("Reason 0x%04X: %s\n",CMSG.Reason,Decode_Info(CMSG.Reason)); + fprintf(ProtocolFile,"Reason 0x%04X: %s\n",CMSG.Reason,Decode_Info(CMSG.Reason)); + } + if (CMSG.Reason_B3 != 0) { + printf("Reason_B3 0x%04X: %s\n",CMSG.Reason_B3,Decode_Info(CMSG.Reason_B3)); + fprintf(ProtocolFile,"Reason_B3 0x%04X: %s\n",CMSG.Reason_B3,Decode_Info(CMSG.Reason_B3)); + } + } + fflush(ProtocolFile); +} + +/*--------------------------------------------------------------------------*\ + * Prot_Init: Initialisation of the protocol +\*--------------------------------------------------------------------------*/ +int Prot_Init(char *Filename) { + char *p; + + strcpy(ProtocolFileName, Filename); + p = strrchr(ProtocolFileName, '.'); + if (p) *p = '\0'; + strcat(ProtocolFileName, ".prt"); + + if ((ProtocolFile=fopen(ProtocolFileName, "w"))==NULL) { + printf("Can't open protocol-file !!\n"); + return FALSE; + } + CAPI_PROTOCOL_INIT(CAPI_PROT_BUF, CAPI_PROT_HANDLE); + return TRUE; +} +#endif + +/*--------------------------------------------------------------------------*\ + * The following _h functions are 'h'igh level functions for the ones + * implemented in CONNECT.C . The _h functions perform some parameter tests + * that would cause an assert on the low-level functions. +\*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*\ + * Connect_h: Asks for a number to call then executes 'Connect' +\*--------------------------------------------------------------------------*/ +unsigned Connect_h(ConnectionID *Connection, + char *CallingPartyNumber, + unsigned long Service, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration) { + + if (*Connection != INVALID_CONNECTION_ID) { + printf("Connect_h: Connection is already in use\n"); + return 0xFFFF; + } + + printf("Enter Number: "); + fflush (stdout); + gets(CalledPartyNumberArr); + + return Connect(Connection, + CalledPartyNumberArr, + CallingPartyNumber, + Service, + B1Protocol, + B2Protocol, + B3Protocol, + B3Configuration); +} + +/*--------------------------------------------------------------------------*\ + * Disconnect_h: high level Disconnect +\*--------------------------------------------------------------------------*/ +unsigned Disconnect_h(ConnectionID Connection) { + + int index; + ConnectionState State; + + if (Connection == INVALID_CONNECTION_ID) { + printf("Disconnect_h: ConnectionID is invalid\n"); + return 0xFFFF; + } + State = GetState(Connection); + if ((State == Disconnected) || (State == D_DisconnectPending)) { + index = GetSlot(Connection); + printf("Disconnect_h: slot %d ID %d is disconnected\n",index, Connection); + return 0xFFFF; + } + return Disconnect(Connection); +} + +/*--------------------------------------------------------------------------*\ + * SendData_h: high level SendData +\*--------------------------------------------------------------------------*/ +unsigned SendData_h(ConnectionID Connection, + void __far *Data, + unsigned short DataLength, + unsigned short DataHandle) { + + int index; + ConnectionState State; + + if (Connection == INVALID_CONNECTION_ID) { + printf("SendData_h: ConnectionID is invalid\n"); + return 0xFFFF; + } + State = GetState(Connection); + if (State != Connected) { + index = GetSlot(Connection); + printf("SendData_h: slot %d ID %d is not connected\n",index, Connection); + return 0xFFFF; + } + return SendData(Connection, Data, DataLength, DataHandle); +} + +/*--------------------------------------------------------------------------*\ + * AnswerCall_h: high level AnswerCall +\*--------------------------------------------------------------------------*/ +unsigned AnswerCall_h(ConnectionID Connection, + RejectValue Reject, + unsigned short B1Protocol, + unsigned short B2Protocol, + unsigned short B3Protocol, + unsigned char __far *B3Configuration) { + + int index; + ConnectionState State; + + if (Connection == INVALID_CONNECTION_ID) { + printf("AnswerCall_h: ConnectionID is invalid\n"); + return 0xFFFF; + } + State = GetState(Connection); + if (State != D_ConnectPending) { + index = GetSlot(Connection); + printf("AnswerCall_h: slot %d ID %d is the wrong state for answering\n",index, Connection); + return 0xFFFF; + } + return AnswerCall(Connection, + Reject, + B1Protocol, + B2Protocol, + B3Protocol, + B3Configuration); +} + +/*--------------------------------------------------------------------------*\ + * InitQueue: resets the data queue +\*--------------------------------------------------------------------------*/ +void InitQueue(void) { + unsigned x; + + for (x=0; x 0) { + t = Queue.Tail; + do { + if (Queue.Element[t].SENT == FALSE) { + error = SendData(index, + (void __far *)Queue.Element[t].DATA, + Queue.Element[t].DATA_LENGTH, + (unsigned short)t); + + if (error != 0) { + printf("Error transfering data: 0x%04X !!!",error); + break; + } + Queue.Element[t].SENT = TRUE; + } + if (++t >= QueueSize) t = 0; + } while (t != Queue.Head); + } +} + +/*--------------------------------------------------------------------------*\ + * SendFile: Sends a file +\*--------------------------------------------------------------------------*/ +unsigned SendFile(int index) { + + char Filename[80]; + unsigned count; + + if (Slot[index] == INVALID_CONNECTION_ID) { + printf("SendFile: ConnectionID is invalid\n"); + return 1; + } + if (GetState(Slot[index]) != Connected) { + printf("SendFile: slot %d ID %d is not connected\n",index, Slot[index]); + return 2; + } + printf("Enter Filename: "); + fflush (stdout); + gets(Filename); + + File = fopen(Filename, "rb"); + if (! File) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** file not found *****\n"); +# endif + return 3; + } + InitQueue(); + + FileTransfer = TRUE; + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** Starting datatransfer on slot %d, press any key to stop *****\n",index); + CAPI_PROTOCOL_TEXT("***** there is no protocol output to the screen during transfer *****\n\n"); +# endif + do { + + if ((! feof(File)) && (Queue.Fill < 7)) { /*----- max. 7 outstanding blocks supported by CAPI -----*/ + count = fread(&(Queue.Element[Queue.Head].DATA[0]), 1, SendBlockSize, File); + if (count > 0) { + Queue.Element[Queue.Head].DATA_LENGTH = (unsigned short)count; + if (++Queue.Head >= QueueSize) Queue.Head = 0; + Queue.Fill++; + } + } + if (GetState(Slot[index]) != Connected) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** connection broken *****\n"); +# endif + break; + } + if (kbhit()) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** interrupted by user *****\n"); +# endif + break; + } + TransferData(index); + Handle_CAPI_Msg(); + } while (Queue.Fill > 0); + + FileTransfer = FALSE; +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** End of filetransfer *****\n"); +# endif + fclose(File); + return 0; +} + +/*--------------------------------------------------------------------------*\ + * ReceiveFile: Receives a file and writes it to disk +\*--------------------------------------------------------------------------*/ +unsigned ReceiveFile(int index) { + + char Filename[80]; + + if (Slot[index] == INVALID_CONNECTION_ID) { + printf("ReceiveFile: ConnectionID is invalid\n"); + return 1; + } + if (GetState(Slot[index]) != Connected) { + printf("ReceiveFile: slot %d ID %d is not connected\n",index, Slot[index]); + return 2; + } + printf("Enter Filename where incoming data shall be saved: "); + fflush (stdout); + gets(Filename); + + File = fopen(Filename, "wb"); + if (! File) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** could not open file *****\n"); +# endif + return 3; + } + InitQueue(); + + FileReceive = TRUE; + +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** Waiting for data on slot %d, press any key to stop *****\n",index); + CAPI_PROTOCOL_TEXT("***** there is no protocol output to the screen during transfer *****\n"); +# endif + do { + if (GetState(Slot[index]) != Connected) { +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** connection broken *****\n"); +# endif + break; + } + Handle_CAPI_Msg(); + } while (! kbhit()); + + getch(); + FileReceive = FALSE; +# ifdef DEBUG + CAPI_PROTOCOL_TEXT("***** End of filetransfer *****\n"); +# endif + fclose(File); + return 0; +} + +/*---------------------------------------------------------------------------*\ + * PrintHelp: tell the user the options +\*---------------------------------------------------------------------------*/ +static void PrintHelp (void) { + + puts("\n\n"); + puts("'ESC' Exit program"); + puts("'l' Listen (CIP mask = 0x1FFF03FF) every service will be indicated"); + puts("'L' Listen (CIP mask = 0x00000000) no incoming call will be indicated"); + puts("'c'+'C' Connect, the specified number will be called"); + puts("'d' Disconnect slot 0"); + puts("'D' Disconnect slot 1"); + puts("'s' Send datablock with size \"SendBlockSize\" on slot 0"); + puts("'S' Send datablock with size \"SendBlockSize\" on slot 1"); + puts("'f' Transfer a file on slot 0"); + puts("'F' Transfer a file on slot 1"); + puts("'v' Receive a file on slot 0"); + puts("'V' Receive a file on slot 1"); + puts("'a' Accept incoming call on slot 0"); + puts("'A' Accept incoming call on slot 1"); + puts("'i' Ignore incoming call on slot 0"); + puts("'I' Ignore incoming call on slot 1"); + puts("'r' Reject incoming call on slot 0"); + puts("'R' Reject incoming call on slot 1"); + puts("'?' Print this help screen"); +} + +/*--------------------------------------------------------------------------*\ + * HandleKeyStroke: Checks the keyboard +\*--------------------------------------------------------------------------*/ +int HandleKeyStroke(void) { + int i; + +#if defined (TARGET_NW) + delay(50); // the netware NLM has to be cooperative +#endif + if (kbhit()) { + i = Press_Key(); + switch (i) { + case 'q': + case 27: { /*----- ESCAPE -----*/ + printf("Exit program ? y/n "); + fflush (stdout); + i = Press_Key(); + if ((i == 'y') || (i =='Y')) { + puts("Y"); + return FALSE; + } + puts("N"); + return TRUE; + } + case 'l': + Listen(ALL_SERVICES); + break; + case 'L': + Listen(NO_SERVICES); + break; + case 'c': + Connect_h(&Slot[0], + CallingPartyNumber, + DATA_TRANSFER, + B1PROTOCOL, + B2PROTOCOL, + B3PROTOCOL, + B3CONFIGURATION); + break; + case 'C': + Connect_h(&Slot[1], + CallingPartyNumber, + DATA_TRANSFER, + B1PROTOCOL, + B2PROTOCOL, + B3PROTOCOL, + B3CONFIGURATION); + break; + case 'd': + Disconnect_h(Slot[0]); + break; + case 'D': + Disconnect_h(Slot[1]); + break; + case 's': + SendData_h(Slot[0], (void __far *)&testblock, SendBlockSize, 1); + break; + case 'S': + SendData_h(Slot[1], (void __far *)&testblock, SendBlockSize, 1); + break; + case 'f': + SendFile(Slot[0]); + break; + case 'F': + SendFile(Slot[1]); + break; + case 'v': + ReceiveFile(Slot[0]); + break; + case 'V': + ReceiveFile(Slot[1]); + break; + case 'a': + AnswerCall_h(Slot[0],ACCEPT,B1PROTOCOL,B2PROTOCOL,B3PROTOCOL,NULL); + break; + case 'A': + AnswerCall_h(Slot[1],ACCEPT,B1PROTOCOL,B2PROTOCOL,B3PROTOCOL,NULL); + break; + case 'i': + AnswerCall_h(Slot[0],IGNORE,0,0,0,NULL); + break; + case 'I': + AnswerCall_h(Slot[1],IGNORE,0,0,0,NULL); + break; + case 'r': + AnswerCall_h(Slot[0],REJECT,0,0,0,NULL); + break; + case 'R': + AnswerCall_h(Slot[1],REJECT,0,0,0,NULL); + break; + case 'h': + case '?': + PrintHelp(); + break; + } + } + return TRUE; +} + +/*--------------------------------------------------------------------------*\ + * Interact: main loop, checks keystrokes and CAPI-messages +\*--------------------------------------------------------------------------*/ +void Interact(void) { + int numController; + int BChannels, Contr; + + + numController = GetNumController (); + BChannels = 0; + for (Contr=1; Contr<=numController; Contr++) + BChannels += GetNumOfSupportedBChannels(Contr); + + printf("Detected %i controllers with %i B-channels overall.\n", + numController, BChannels); + PrintHelp (); + + do { + Handle_CAPI_Msg(); + } while (HandleKeyStroke()); + + puts("\nProgram terminated\n"); +} + +/*--------------------------------------------------------------------------*\ + * Hangup: Disconnect both channels +\*--------------------------------------------------------------------------*/ +void Hangup(void) { + int i; + + + if ((Slot[0] != INVALID_CONNECTION_ID) && + (GetState(Slot[0]) != Disconnected) && + (GetState(Slot[0]) != D_DisconnectPending)) + Disconnect(Slot[0]); + + if ((Slot[1] != INVALID_CONNECTION_ID) && + (GetState(Slot[1]) != Disconnected) && + (GetState(Slot[1]) != D_DisconnectPending)) + Disconnect(Slot[1]); + + do { + Handle_CAPI_Msg(); + if (kbhit()) { + while (kbhit()) { + getch(); + } + printf("Exit program ? y/n "); + fflush (stdout); + i = Press_Key(); + if ((i == 'y') || (i =='Y')) { + puts("Y"); + return; + } + puts("N"); + } + } + while ((Slot[0] != INVALID_CONNECTION_ID) || (Slot[1] != INVALID_CONNECTION_ID)); +} + +/*--------------------------------------------------------------------------*\ + * ctrlchandler: exits on CTRL-C and CTRL-BREAK +\*--------------------------------------------------------------------------*/ +void ctrlchandler(int sig) +{ + signal( SIGINT, ctrlchandler ); + exit(0); + sig = 0; /*----- suppress warning -----*/ +} + +/*--------------------------------------------------------------------------*\ + * main: Init & exit functions +\*--------------------------------------------------------------------------*/ +#ifdef DEBUG +int main(int ac, char *av[]) { +#else +int main(void) { +#endif + + Slot[0] = INVALID_CONNECTION_ID; + Slot[1] = INVALID_CONNECTION_ID; + + if (! RegisterCAPI ()) return 1; + atexit (ReleaseCAPI); + + signal(SIGINT, ctrlchandler); + + InitConnectionIDHandling (); + + +#ifdef DEBUG + if (! Prot_Init(av[ac-1])) return 2; +#endif + +#ifdef __linux__ + init_tty(); + atexit (restore_tty); +#endif + + Interact(); + + Hangup(); + +#ifdef DEBUG + fclose(ProtocolFile); +#endif + + return 0; +} diff --git a/SOURCE/MAIN.H b/SOURCE/MAIN.H new file mode 100644 index 0000000..6b03926 --- /dev/null +++ b/SOURCE/MAIN.H @@ -0,0 +1,52 @@ +/*--------------------------------------------------------------------------*\ + + MAIN.H 1995 AVM + + Header file for MAIN.C and FAXMAIN.C + +\*--------------------------------------------------------------------------*/ +#ifndef _main_h_ +#define _main_h_ + + +/*--------------------------------------------------------------------------*\ + * MainDataAvailable: signals received data blocks + * This function is called after a DATA_B3_INDication is received. After + * leaving this function, the data is invalid so it must be copied for + * further processing. + * Set DiscardData to FALSE (0) if you want to free the data area later + * with ReleaseData. DiscardData is preset with TRUE (1). +\*--------------------------------------------------------------------------*/ +void MainDataAvailable(ConnectionID Connection, + void __far *Data, + _cword DataLength, + _cword DataHandle, + int *DiscardData); + +/*--------------------------------------------------------------------------*\ + * MainDataConf: signals the successful sending of a datablock + * This function is called after receiving a DATA_B3_CONFirmation. CAPI signals + * that the datablock identified by DataHandle has been sent and the memory + * area may be freed. The DataHandle is the same as specified in SendBlock. +\*--------------------------------------------------------------------------*/ +void MainDataConf(ConnectionID Connection, + _cword DataHandle, + unsigned short Info); + +/*--------------------------------------------------------------------------*\ + * MainStateChange: signals a state change on both B-channels (connected, disconnected) + * Whenever a channel changes his state this function is called +\*--------------------------------------------------------------------------*/ +void MainStateChange(ConnectionID Connection, + ConnectionState State); + +/*--------------------------------------------------------------------------*\ + * MainIncomingCall: signals an incoming call + * This function will be executed if a CONNECT_INDication appears to + * inform the user. +\*--------------------------------------------------------------------------*/ +void MainIncomingCall(ConnectionID Connection, + char *CallingPartyNumber); + + +#endif /*----- _main_h_ -----*/ diff --git a/SOURCE/MAKEDEMO.BAT b/SOURCE/MAKEDEMO.BAT new file mode 100644 index 0000000..6da570b --- /dev/null +++ b/SOURCE/MAKEDEMO.BAT @@ -0,0 +1,13 @@ +@ +@rem Make utility for building the DOS based demo.exe example for connection +@rem handling and simple file transfer. This example has to be compiled +@rem with the Microsoft Visual C compiler for DOS. +@ +@ set CAPI20LIB=..\c20lib\dos +@ set CAPI20H=..\c20lib\source +@ +@ set cl=/c /AL /W4 /I%CAPI20H% /nologo /DTARGET_16BIT + cl main.c c20msg.c capi.c connect.c contr.c data.c id.c init.c + link @makedemo.lnk + del *.obj + del *.map diff --git a/SOURCE/MAKEDEMO.LNK b/SOURCE/MAKEDEMO.LNK new file mode 100644 index 0000000..1b62537 --- /dev/null +++ b/SOURCE/MAKEDEMO.LNK @@ -0,0 +1,12 @@ +c20msg.obj + +capi.obj + +connect.obj + +contr.obj + +data.obj + +id.obj + +init.obj + +main.obj + +, +DEMO.exe +DEMO + ..\c20lib\dos\capi20ld.lib; diff --git a/SOURCE/MAKEFAX.BAT b/SOURCE/MAKEFAX.BAT new file mode 100644 index 0000000..ba8c406 --- /dev/null +++ b/SOURCE/MAKEFAX.BAT @@ -0,0 +1,13 @@ +@ +@rem Make utility for building the DOS based faxdemo.exe example for simple +@rem fax handling. This example has to be compiled with the Microsoft Visual C +@rem compiler for a DOS. +@ +@ set CAPI20LIB=..\c20lib\dos +@ set CAPI20H=..\c20lib\source +@ +@ set cl=/c /AL /W4 /I%CAPI20H% /nologo /DTARGET_16BIT + cl faxmain.c c20msg.c capi.c connect.c contr.c data.c id.c init.c fax.c + link @makefax.lnk + del *.obj + del *.map diff --git a/SOURCE/MAKEFAX.LNK b/SOURCE/MAKEFAX.LNK new file mode 100644 index 0000000..97c1524 --- /dev/null +++ b/SOURCE/MAKEFAX.LNK @@ -0,0 +1,13 @@ +c20msg.obj + +capi.obj + +connect.obj + +contr.obj + +data.obj + +id.obj + +init.obj + +fax.obj + +faxmain.obj + +, +FAX.exe +FAX +/STACK:3072 ..\c20lib\dos\capi20ld.lib; diff --git a/SOURCE/MKDEM32.BAT b/SOURCE/MKDEM32.BAT new file mode 100644 index 0000000..d972e4f --- /dev/null +++ b/SOURCE/MKDEM32.BAT @@ -0,0 +1,15 @@ +@ +@rem Make utility for building the Win32 based demo32.exe example for +@rem connection handling and simple file transfer. This example has to be +@rem compiled with the Microsoft Visual C for Win32. +@ +@ set CAPI20LIB=..\c20lib\win32 +@ set CAPI20H=..\c20lib\source +@ +@ set cl=-DWIN32 -DCON -Di386 -D_X86_ -D_NTWIN -W3 -Gs -D_DEBUG -Zi +@ set cl=%cl% /c /I%CAPI20H% /nologo /DTARGET_32BIT + cl main.c c20msg.c capi.c connect.c contr.c data.c id.c init.c + link @mkdem32.lnk + del *.obj + del *.ilk + del *.pdb diff --git a/SOURCE/MKDEM32.LNK b/SOURCE/MKDEM32.LNK new file mode 100644 index 0000000..74137e6 --- /dev/null +++ b/SOURCE/MKDEM32.LNK @@ -0,0 +1,11 @@ +-machine:i386 -debug:notmapped,full -debugtype:cv -subsystem:console kernel32.lib +-OUT:demo32.exe +c20msg.obj +capi.obj +connect.obj +contr.obj +data.obj +id.obj +init.obj +main.obj +..\c20lib\win32\cap2032d.lib diff --git a/SOURCE/MKDEMO2.CMD b/SOURCE/MKDEMO2.CMD new file mode 100644 index 0000000..fa3ad3e --- /dev/null +++ b/SOURCE/MKDEMO2.CMD @@ -0,0 +1,11 @@ +@ +@rem Make utility for building the OS/2 based demo2.exe example for connection +@rem handling and simple file transfer. This example has to be compiled +@rem with the IBM VisualAge C++ compiler. +@ +@ set CAPI20LIB=..\c20lib\os2 +@ set CAPI20H=..\c20lib\source +@ +@ set icc=/I%CAPI20H% /DTARGET_32BIT /DTARGET_OS2 + icc /Fedemo2.exe main.c c20msg.c capi.c connect.c contr.c data.c id.c init.c %CAPI20LIB%\capi20d.lib + del *.obj diff --git a/SOURCE/MKFAX2.CMD b/SOURCE/MKFAX2.CMD new file mode 100644 index 0000000..b717388 --- /dev/null +++ b/SOURCE/MKFAX2.CMD @@ -0,0 +1,11 @@ +@ +@rem Make utility for building the OS/2 based fax2.exe example for simple +@rem fax handling. This example has to be compiled with the IBM VisualAge C++ +@rem compiler. +@ +@ set CAPI20LIB=..\c20lib\os2 +@ set CAPI20H=..\c20lib\source +@ +@ set icc=/I%CAPI20H% /DTARGET_32BIT /DTARGET_OS2 + icc /Fefax2.exe faxmain.c c20msg.c capi.c connect.c contr.c data.c id.c init.c fax.c %CAPI20LIB%\capi20d.lib + del *.obj diff --git a/SOURCE/NETWARE/DEMO.NLM b/SOURCE/NETWARE/DEMO.NLM new file mode 100644 index 0000000000000000000000000000000000000000..c1146b35d0a1822e61369b7e5477be023277744e GIT binary patch literal 118357 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 x9$GzCD|<|$1hQp=a+6d;&07(}%=U2JZSS0`e literal 0 HcmV?d00001 diff --git a/SOURCE/NW_DMO.RSP b/SOURCE/NW_DMO.RSP new file mode 100644 index 0000000..988dec0 --- /dev/null +++ b/SOURCE/NW_DMO.RSP @@ -0,0 +1,41 @@ +FORMAT NOVELL NLM 'AVM CAPI 2.0 DEMO' +Name NETWARE\DEMO.NLM +OPTION Copyright 'Copyright 1998, AVM GmbH Berlin. All rights reserved.' +OPTION Version=1.00 +OPTION ScreenName 'ADK_DEMO' +OPTION ThreadName 'AVM Demo' +OPTION Stack=8k +OPTION NODEFAULTLIBS +OPTION CaseExact +OPTION Verbose +OPTION Map +OPTION MULTILoad +DEBUG ALL DEBUG NOVELL + +File netware\c20msg.obj +File netware\capi.obj +File netware\connect.obj +File netware\contr.obj +File netware\data.obj +File netware\id.obj +File netware\init.obj +File netware\main.obj + +IMPORT CAPI_Register +IMPORT CAPI_Release +IMPORT CAPI_PutMessage +IMPORT CAPI_GetMessage +IMPORT CAPI_GetProfile +IMPORT CAPI_GetManufacturer +IMPORT CAPI_GetVersion +IMPORT CAPI_GetSerialNumber + +IMPORT @%WATCOM%\NOVI\clib.imp +IMPORT @%WATCOM%\NOVI\threads.imp +IMPORT @%WATCOM%\NOVI\nlmlib.imp + +LIBRARY %WATCOM%\LIB386\NETWARE\clib3s.lib +LIBRARY %WATCOM%\LIB386\plib3s.lib +LIBRARY ..\c20lib\netware\CAP2032.LIB + +MODULE CLIB diff --git a/SOURCE/NW_FAX.RSP b/SOURCE/NW_FAX.RSP new file mode 100644 index 0000000..5498eb0 --- /dev/null +++ b/SOURCE/NW_FAX.RSP @@ -0,0 +1,41 @@ +FORMAT NOVELL NLM 'AVM CAPI 2.0 FAXDEMO' +Name NETWARE\FAXDEMO.NLM +OPTION Copyright 'Copyright 1998, AVM GmbH Berlin. All rights reserved.' +OPTION Version=1.00 +OPTION ScreenName 'AVM_FAXDEMO' +OPTION ThreadName 'AVM FaxDemo' +OPTION Stack=8k +OPTION NODEFAULTLIBS +OPTION CaseExact +OPTION Verbose +OPTION Map +DEBUG ALL DEBUG NOVELL + +File netware\c20msg.obj +File netware\capi.obj +File netware\connect.obj +File netware\contr.obj +File netware\data.obj +File netware\id.obj +File netware\init.obj +File netware\fax.obj +File netware\faxmain.obj + +IMPORT CAPI_Register +IMPORT CAPI_Release +IMPORT CAPI_PutMessage +IMPORT CAPI_GetMessage +IMPORT CAPI_GetProfile +IMPORT CAPI_GetManufacturer +IMPORT CAPI_GetVersion +IMPORT CAPI_GetSerialNumber + +IMPORT @%WATCOM%\NOVI\clib.imp +IMPORT @%WATCOM%\NOVI\threads.imp +IMPORT @%WATCOM%\NOVI\nlmlib.imp + +LIBRARY %WATCOM%\LIB386\NETWARE\clib3s.lib +LIBRARY %WATCOM%\LIB386\plib3s.lib +LIBRARY ..\c20lib\netware\CAP2032.LIB + +MODULE CLIB diff --git a/SOURCE/NW_MKDMO.BAT b/SOURCE/NW_MKDMO.BAT new file mode 100644 index 0000000..3de63b4 --- /dev/null +++ b/SOURCE/NW_MKDMO.BAT @@ -0,0 +1,34 @@ +@ +@rem Make utility for building the NetWare based demo.nlm example for +@rem CAPI 2.0 calls. This example has been compiled with the 32Bit +@rem Watcom C 10.5 compiler. +@rem We assume that the Environment variable WATCOM contains the Install +@rem directory of your Watcom C Compiler (e.g. C:\wc105) +@ +@ +@ set CAPI20LIB=..\c20lib\netware +@ set CAPI20H=..\c20lib\source +@ set COMP=%WATCOM%\BINW\WCC386 +@ +@if "%1"=="rel" goto NODEBUG +@ set WCC386=/d2 /s /3s /ox /zq /wx /I%CAPI20H% /DB1 /DAVM /DTARGET_32BIT /DTARGET_NW +goto compile + +:NODEBUG +@ set WCC386=/d1 /s /3s /ox /zq /wx /I%CAPI20H% /DNDEBUG /DB1 /DAVM /DTARGET_32BIT /DTARGET_NW +goto compile + +:compile +%COMP% /bt=netware /fonetware\main.obj main.c > errors.nlm +%COMP% /bt=netware /fonetware\c20msg.obj c20msg.c >> errors.nlm +%COMP% /bt=netware /fonetware\capi.obj capi.c >> errors.nlm +%COMP% /bt=netware /fonetware\connect.obj connect.c >> errors.nlm +%COMP% /bt=netware /fonetware\contr.obj contr.c >> errors.nlm +%COMP% /bt=netware /fonetware\data.obj data.c >> errors.nlm +%COMP% /bt=netware /fonetware\id.obj id.c >> errors.nlm +%COMP% /bt=netware /fonetware\init.obj init.c >> errors.nlm + +%WATCOM%\BINW\wlink @nw_dmo.rsp >> errors.nlm +del netware\*.obj +del *.map + diff --git a/SOURCE/NW_MKFAX.BAT b/SOURCE/NW_MKFAX.BAT new file mode 100644 index 0000000..f356e18 --- /dev/null +++ b/SOURCE/NW_MKFAX.BAT @@ -0,0 +1,36 @@ +@ +@rem Make utility for building the NetWare based faxdemo.nlm example for +@rem simple fax handling. This example has been compiled with the 32Bit +@rem Watcom C 10.5 compiler. +@rem We assume that the Environment variable WATCOM contains the Install +@rem directory of your Watcom C Compiler (e.g. C:\wc105) +@ +@ +@ set CAPI20LIB=..\c20lib\netware +@ set CAPI20H=..\c20lib\source +@ set COMP=%WATCOM%\BINW\WCC386 +@ +@if "%1"=="rel" goto NODEBUG +@ set WCC386=/d2 /s /3s /ox /zq /wx /I%CAPI20H% /DB1 /DAVM /DTARGET_32BIT /DTARGET_NW +goto compile + +:NODEBUG +@ set WCC386=/d1 /s /3s /ox /zq /wx /I%CAPI20H% /DNDEBUG /DB1 /DAVM /DTARGET_32BIT /DTARGET_NW +goto compile + +:compile +%COMP% /bt=netware /fonetware\faxmain.obj faxmain.c > errors.nlm +%COMP% /bt=netware /fonetware\c20msg.obj c20msg.c >>errors.nlm +%COMP% /bt=netware /fonetware\capi.obj capi.c >>errors.nlm +%COMP% /bt=netware /fonetware\connect.obj connect.c >>errors.nlm +%COMP% /bt=netware /fonetware\contr.obj contr.c >>errors.nlm +%COMP% /bt=netware /fonetware\data.obj data.c >>errors.nlm +%COMP% /bt=netware /fonetware\id.obj id.c >>errors.nlm +%COMP% /bt=netware /fonetware\init.obj init.c >>errors.nlm +%COMP% /bt=netware /fonetware\fax.obj fax.c >>errors.nlm + +%WATCOM%\BINW\wlink @nw_fax.rsp >> errors.nlm +del netware\*.obj +del *.map + + diff --git a/SOURCE/OS.H b/SOURCE/OS.H new file mode 100644 index 0000000..f28681f --- /dev/null +++ b/SOURCE/OS.H @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------*\ + + OS.H Version 1.1 1997 AVM + + Header file for OS.H + +\*--------------------------------------------------------------------------*/ +#ifndef _os_h_ +#define _os_h_ +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#if defined (TARGET_32BIT) +# ifdef __linux__ +# include "clinux.h" +# include "linuti.h" +# elif defined (TARGET_OS2) +# include "cos2.h" +# include +# elif defined (TARGET_NW) +# include "c_nw.h" +# include +# include +# else +# include "cwin32.h" +# include +# endif +#else +# include "cdos.h" +# include +#endif +/*---------------------------------------------------------------------------*\ +\*---------------------------------------------------------------------------*/ +#endif diff --git a/SOURCE/TESTFAX.SFF b/SOURCE/TESTFAX.SFF new file mode 100644 index 0000000000000000000000000000000000000000..7d24a2e84b9eb89f7b0b5efcc8508e4a0e548718 GIT binary patch literal 87337 zcmeEvdt6gjo;Z0zUO*8d1c;zOQBWcR3St{T5fE*(Dya`9@l}-AS|3@4wzCNc)LN~! zSZJ-Y!3V{P5*3}+uH6f%))v}{)=H$?PMm33EOCC>X?1rxzs~-?=iEnb9w4)`zyG#; zYLa`;Irp6J`*qHJa?_?woFMdH9R3&mle&ItLcz+#34aYocL-rn5ZNLqh@fGGv+BQcxzT*EywasDD zHwi;r%$K-pTRU-M&lktmo8%SxON?WyPS+$1cf~js>uw0=B_4ar!EcOLJmLy=rKsk| zY>J3EBhE&vnSicv-L){P0xW%i^qVYY@klguCO5*VJ{=p=RAX0(>#r)k(BH^TpFsY+T8; zv*t@l7j*NDB+{5ruGk>o?* zj{0cvgO|@8)VB#A%XWwBTH8(Ue*&wBW!-7q%-s}46q$9xcsv8;gG}MAQq%l8Lv(L( zV*@ujT9;~Snx&J=0^AnxBgK{?Q}98PU|RoTrLijE!EE8J6{h*zuT{JENhKkUPb?;a z%kA4>RX5;A`!+B{TY_wL9Qg+8d^6P`QQDct*~8x;nFHX_IfClrr4mEy%KE5G>Ji=z zv^twmD%sGw%tSRve4w6b4Hdg0qCYU5Kd9$4=4Pf7RyC)Q+j&s;%%1??J}nBG1eu0m ztD2X`f5WQBEhZaRrV4LuHm~Jg{gwUpHLJxI7bV}RwbXODiyS0)12mBh?bK>aTxp+{ z-Q=WsjqHbcYU@FLK~t_GT!)*a5u-NAi-sn3b)l!!RFk|}A;MczVU)x7tokXoy3idv zRfN^Tog2T>OfAT-iDYMVxK>ji JTGD-ArA>I~}-qEw)v`d8HI{8wTRN8rr7aS9L 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 b*}o8#$Db(hgL9HqXnv!%E+0tzZ;$^6anZr& literal 0 HcmV?d00001 diff --git a/WHATS.NEW b/WHATS.NEW new file mode 100644 index 0000000..f273080 --- /dev/null +++ b/WHATS.NEW @@ -0,0 +1,27 @@ + +The COMMON ISDN API 2.0 Application Development Kit V1.6 +--------------------------------------------------------- + - NetWare support + + +The COMMON ISDN API 2.0 Application Development Kit V1.5 +--------------------------------------------------------- + - VxD interface function CAPI20_ISINSTALLED improved + + +The COMMON ISDN API 2.0 Application Development Kit V1.4 +--------------------------------------------------------- + - OS/2 and Linux support + - improved ANSI-C conformity + - minor corrections und improvements + + +The COMMON ISDN API 2.0 Application Development Kit V1.3 +--------------------------------------------------------- + + - started providing "whats.new" + - added CAPI20.DLL and CAPI2032.DLL protocol DLLs, + check new DEBUG.DLL directory + - corrected CIPmask constants (connect.h) + - deleted sample CALLING_PARTY_NUMBER (main.c) due to problems + with some PBXs