/* C K N T A P  --  Kermit Telephony interface for MS Win32 TAPI systems */

/*
  Author: Jeffrey E Altman (jaltman@secure-endpoints.com),
          Secure Endpoints Inc., New York City.

  Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New
  York.
*/

#ifdef CK_TAPI
#ifdef COMMENT
#undef CK_TAPI
#endif /* COMMENT */
#else
#ifndef COMMENT
#ifndef NODIAL
#define CK_TAPI
#endif /* NODIAL */
#endif /* COMMENT */
#endif

_PROTOTYP( int cktapiinit, (void) ) ;
_PROTOTYP( int cktapiopen, (void) ) ;
_PROTOTYP( int cktapiclose, (void) ) ;
_PROTOTYP( int cktapiload, (void) ) ;
_PROTOTYP( int cktapiunload, (void) ) ;
_PROTOTYP( int cktapidial, (char *) ) ;
_PROTOTYP( int cktapihangup, (void) ) ;
_PROTOTYP( int cktapianswer, (void) ) ;
_PROTOTYP( int cktapiBuildLineTable, (struct keytab **, struct keytab **, int *) ) ;
_PROTOTYP( int cktapiBuildLocationTable, (struct keytab **, int *) ) ;
_PROTOTYP( int cktapiFetchLocationInfoByID, (int) ) ;
_PROTOTYP( int cktapiFetchLocationInfoByName, (char *) ) ;
_PROTOTYP( int cktapiGetCurrentLocationID, (void) ) ;
_PROTOTYP( void CopyTapiLocationInfoToKermitDialCmd, ( void ));
_PROTOTYP( void cktapiConfigureLine, (int) );
_PROTOTYP( void cktapiDialingProp, (void) );
_PROTOTYP( int cktapiConvertPhoneNumber, (char * source, char ** converted));
_PROTOTYP( int cktapiCallInProgress, (void));
_PROTOTYP( int tapi_open, ( char * ) ) ;
_PROTOTYP( int tapi_clos, ( void ) ) ;
_PROTOTYP( HANDLE GetModemHandleFromLine, ( HLINE ) );
_PROTOTYP( struct mdminf * cktapiGetModemInf, (DWORD,HANDLE) );
_PROTOTYP( void DisplayCommProperties, (HANDLE));
_PROTOTYP( void cktapiDisplayRegistryModemInfo, (LPCSTR));
_PROTOTYP( void cktapiDisplayTapiLocationInfo, (VOID));

#define SUCCESS 0
extern int TAPIAvail ;

#ifdef COMMENT
From "comm/datamodem":

When using the lineGetDevConfig and lineSetDevConfig functions, some service
providers require that the configuration data for this device class have the
following format.
#endif /* COMMENT */
// Device setting information
typedef struct  tagDEVCFGDR  {
  DWORD       dwSize;
  DWORD       dwVersion;
  WORD        fwOptions;
  WORD        wWaitBong;
} DEVCFGHDR;

typedef struct  tagDEVCFG  {
  DEVCFGHDR   dfgHdr;
  COMMCONFIG  commconfig;
} DEVCFG, *PDEVCFG, FAR* LPDEVCFG;

#ifdef COMMENT
Contains device configuration information for use with the lineGetDevConfig
and lineSetDevConfig functions.

dwSize          Sum of the size of the DEVCFGHDR structure and the actual
                size of COMMCONFIG structure.
dwVersion       Version number of the Unimodem DevConfig structure. This
                member can be MDMCFG_VERSION (0x00010003).
fwOptions       Option flags that appear on the Unimodem Option page.
                This member can be a combination of these values:

TERMINAL_PRE  (1)       Displays the preterminal screen.
TERMINAL_POST (2)       Displays the post terminal screen.
MANUAL_DIAL   (4)       Dials the phone manually, if capable of doing so.
LAUNCH_LIGHTS (8)       Displays the modem tray icon.

                Only the LAUNCH_LIGHTS value is set by default.
wWaitBong       Number of seconds (in two seconds granularity) to replace
                the wait for credit tone ($).
commconfig      COMMCONFIGstructure that can be used with the Win32
                communications and MCX functions.
#endif /* COMMENT */

#ifdef COMMENT
From lineSetDevConfig:

Typically, an application will call lineGetID to identify the media stream
device associated with a line, and then call lineConfigDialog to allow the
user to set up the device configuration. It could then call lineGetDevConfig
and save the configuration information in a phone book or other database
associated with a particular call destination. When the user later wants
to call the same destination again, this function lineSetDevConfig can be
used to restore the configuration settings selected by the user.
lineSetDevConfig, lineConfigDialog, and lineGetDevConfigcan be used, in
that order, to allow the user to view and update the settings.

The exact format of the data contained within the structure is specific
to the line and media stream API (device class), is undocumented, and is
undefined. The application must treat it as "opaque" and not manipulate the
contents directly. Generally, the structure can be sent using this function
only to the same device from which it was obtained. Certain Telephony
service providers may, however, permit structures to be interchanged between
identical devices (that is, multiple ports on the same multi-port modem card).
Such interchangability is not guaranteed in any way, even for devices of
the same device class.

Note that some service providers may permit the configuration to be set
while a call is active, and others may not.
#endif /* COMMENT */

#ifdef COMMENT
Service providers that support LINEBEARERMODE_PASSTHROUGH indicate it in the
dwBearerModes member of the LINEDEVCAPS structure. When
LINEBEARERMODE_PASSTHROUGH is indicated, the Unimodem service provider will
also include in the DevSpecific area of the LINEDEVCAPS structure the registry
key used to access information about the modem associated with the line device,
in the following format:
#endif

typedef struct  tagDEVREGKEY {
    DWORD dwContents;   // Set to 1 (indicates containing key)
    DWORD dwKeyOffset;  // Offset to key from start of this
                        // structure (not from start of
                        // LINEDEVCAPS structure). 8 in
                        // our case.
    BYTE rgby[1];       // place containing null-terminated
                        // registry key.
} DEVREGKEY;

#ifdef COMMENT
For example:
    00000001 00000008 74737953 435c6d65  ........System\C
    65727275 6f43746e 6f72746e 7465536c  urrentControlSet
    7265535c 65636976 6c435c73 5c737361  urrentControlSet
    65646f4d 30305c6d xx003030 xxxxxxxx  Modem\0000.

This registry key could then be opened using this function:
RegOpenKey(HKEY_LOCAL_MACHINE, pszDevSpecificRegKey, &phkResult)
#endif

int cktapiGetModemSettings(LPDEVCFG *, LPMODEMSETTINGS *, LPCOMMCONFIG *, DCB **);
int cktapiDisplayModemSettings(LPDEVCFG, LPMODEMSETTINGS, LPCOMMCONFIG, DCB *);
int cktapiSetModemSettings(LPDEVCFG,LPCOMMCONFIG);