/*++

   Copyright (c) 1996-1999 Microsoft Corporation.


   Component

  		Unimodem TSP Public Header

   File

  		UNIMODEM.H

   History

  		10/25/1997  JosephJ Created, taking stuff from nt50\tsp\public.h
  		01/29/1998  JosephJ Revised, allowing multiple diagnostics objects,
                            as well as expanding the  LINEDIAGNOSTICS_PARSEREC
                            structure from 2 to 4 fields.

--*/

#ifndef  _UNIMODEM_H_
#define  _UNIMODEM_H_

#if _MSC_VER > 1000
#pragma once
#endif

#include <setupapi.h>

#ifdef __cplusplus
extern "C" {
#endif


//====================================================================
//      Supported TAPI Device Classes
//
//====================================================================
#define szUMDEVCLASS_COMM                    TEXT("comm")
#define szUMDEVCLASS_COMM_DATAMODEM          TEXT("comm/datamodem")
#define szUMDEVCLASS_COMM_DATAMODEM_PORTNAME TEXT("comm/datamodem/portname")
#define szUMDEVCLASS_TAPI_LINE_DIAGNOSTICS   TEXT("tapi/line/diagnostics")

//=========================================================================
//
//      "comm"
//
//
//      Supported APIS:
//              lineGet/SetDevConfig
//              lineConfigDialog
//              lineConfigDialogEdit
//
//      The associated configuration object is UMDEVCFG defined below...
//
//=========================================================================

// Device Setting Information
//
typedef struct  // UMDEVCFGHDR
{
    DWORD       dwSize;
    DWORD       dwVersion;        // Set to MDMCFG_VERSION
    WORD        fwOptions;        // One or more of the flags below...

    #define UMTERMINAL_NONE       0x00000000
    #define UMTERMINAL_PRE        0x00000001
    #define UMTERMINAL_POST       0x00000002
    #define UMMANUAL_DIAL         0x00000004
    #define UMLAUNCH_LIGHTS       0x00000008   // Not supported on NT5.

    WORD        wWaitBong;        // seconds to wait for the BONG character
                                  // for modems that do not support detection
                                  // of the BONG tone.

}   UMDEVCFGHDR, *PUMDEVCFGHDR;


typedef struct // UMDEVCFG
{
    UMDEVCFGHDR   dfgHdr;
    COMMCONFIG  commconfig;
}   UMDEVCFG, *PUMDEVCFG;

#define  UMDEVCFG_VERSION     0x00010003  // Version number of structure



// How much to wait for a credit-card-bong if modem doesn't support it.
// (TODO: move this somewhere else!)
//
#define  UMMIN_WAIT_BONG      0
#define  UMMAX_WAIT_BONG      60
#define  UMDEF_WAIT_BONG      8
#define  UMINC_WAIT_BONG      2

//=========================================================================
//
//      "comm/datamodem"
//
//  Supported APIS:
//         lineGetID   Returns the structure below.
//
//=========================================================================

//=========================================================================
//
//      "comm/datamodem/portname"
//
//  Supported APIS:
//         lineGetID The Varstring is of type ASCII string and
//                   contains the null-terminated name of the COMM port
//                   attached to the device, if there is one.
//
//=========================================================================


//=========================================================================
//
//      "tapi/line/diagnostics"
//
//  Supported APIS:
//         lineGet/SetDevConfig: LINEDIAGNOSTICSCONFIG is the associated
//                            configuration object...
//         lineGetID: LINEDIAGNOSTICS is the returned object.
//
//
//=========================================================================

//
// Many of the diagnostics-related structures and sub-structures defined
// below have a 4-DWORD header defined below:
//
//
typedef struct // LINEDIAGNOSTICSOBJECTHEADER
{
    DWORD dwSig;                // object-specific signature. All
                                // signatures defined here have
                                // prefix "LDSIG_", and are defined below:

    #define LDSIG_LINEDIAGNOSTICSCONFIG 0xb2f78d82 // LINEDIAGNOSTICSCONFIG sig
    #define LDSIG_LINEDIAGNOSTICS       0xf0c4d4e0 // LINEDIAGNOSTICS sig
    #define LDSIG_RAWDIAGNOSTICS        0xf78b949b // see LINEDIAGNOSTICS defn.
    #define LDSIG_PARSEDDIAGNOSTICS     0x16cf3208 // see LINEDIAGNOSTICS defn.


    DWORD dwNextObjectOffset;   // Offset from the start of this header to
                                // the next object if any (0 if none following).
                                // Depending on the type of object, this
                                // field may or may not be used.
    DWORD dwTotalSize;          // Total size of this object
    DWORD dwFlags;              // object-specific flags
    DWORD dwParam;              // object-specific data

} LINEDIAGNOSTICSOBJECTHEADER, *PLINEDIAGNOSTICSOBJECTHEADER;

//
// The following structure defines the diagnostics capabilities and
// curent settings of the device. It is accessed via
// lineGet/SetDevConfig("tapi/line/diagnostics");
//

typedef struct // LINEDIAGNOSTICSCONFIG
{
    LINEDIAGNOSTICSOBJECTHEADER hdr;
    //
    // hdr.dwSig must be set to LDSIG_LINEDIAGNOSTICSCONFIG
    // hdr.dwNextObjectOffset will point to the next configuration object,
    //          if any.
    // hdr.dwTotalSize must be set to the current size of this
    //          structure.
    // hdr.dwFlags contains read only diagnostics capabilities --- one
    //      of the constants defined below ...
    //      This field is ignored when the structure is passed
    //      in a call to lineSetDevConfig
    //
    #define fSTANDARD_CALL_DIAGNOSTICS 0x1

    // hdr.dwParam contains current diagnostics settings. One or more
    // constants defined above -- indicate that the
    // corresponding capability is enabled for
    // the device.

} LINEDIAGNOSTICSCONFIG, *PLINEDIAGNOSTICSCONFIG;


//
// Diagnostic information is accessed by lineGetID("tapi/line/diagnostics"),
// with CALLSELECT_CALL. On return, the supplied VARSTRING will be filled
// in with one or more LINEDIAGNOSTICS structures defined below, and.
// potentially other kinds of structures (all with header
// LINEDIAGNOSTICSOBJECTHEADER).
//
// Note that this information can only be obtained if (a) diagnostics
// have been enabled by a previous call to
// lineSetDevConfig("tapi/line/diagnostics) and (b) a valid call handle
// exists. Typically this information is obtained just before
// deallocating the call.
//
// The LINEDIAGNOSTICS structure includes the raw
// diagnostics information returned by the device as well as summary
// information and variable-length arrays containing parsed information.
//
// All the diagnostic information in a particular LINEDIAGNOSTICS object
// is "domain ID" specific. The dwDomainID field of the structure defines the
// domain, or name space, from which any constants are taken. The
// currently Domain IDs are defined below, and have prefix  "DOMAINID":
//

#define DOMAINID_MODEM     0x522aa7e1
#define DOMAINID_NULL      0x0


typedef struct // LINEDIAGNOSTICS
{
    //
    // The following 2 fields provide version and size informatio about
    // this structure, as well as identify the domain (name space) of the
    // diagnostics information applies to. All subsequent fields in the
    // structure are domainID-specific.
    //

    LINEDIAGNOSTICSOBJECTHEADER hdr;
    //
    //  hdr.dwSig must be set to constant LDSIG_LINEDIAGNOSTICS
    //  hdr.dwNextObjectOffset will point to the next diagnostic object,
    //          if any.
    //  hdr.dwTotalSize contains the total size of this structure,
    //          including variable portion
    //  hdr.dwFlags is reserved and must be ignored.
    //  hdr.dwParam is set to the current sizeof(LINEDIAGNOSTICS) --
    //          used for versioning of the LINEDIAGNOSICS structure.
    //          Note that this does NOT include the size of the
    //          variable length portion.

    DWORD dwDomainID;    // Identifies the name space from which the
                         // interpretation of any constants are taken.


    //
    // The following 5 DWORD fields provide summary diagnostic information,
    // obtained by analyzing all the diagnostic information.
    //

    DWORD dwResultCode; // dDomainID-specific LDRC_ constants defined below
    DWORD dwParam1;     // Params1-4 are dwResultCode-specific data items.
    DWORD dwParam2;
    DWORD dwParam3;
    DWORD dwParam4;


    //
    //  The remaining fields point to variable length objects containing
    //  parsed and unparsed (raw) diagnostics information.
    //
    //  Each variable length object starts with a
    //  LINEDIAGNOSTICSOBJECTHEADER structure, referred to as "ohdr" in
    //  the documentation below.
    //

    DWORD dwRawDiagnosticsOffset;
    //
    //          Offset from the start of this structure
    //          to the start of an object containing
    //          the raw diagnostics output.
    //
    //          ohdr.dwSig will be set to LDSIG_RAWDIAGNOSTICS
    //          ohdr.dwNextObjectOffset UNUSED and will be set to 0.
    //          ohdr.dwTotalSize is set to the total size of the
    //                       raw-diagnostics object.
    //          ohdr.dwFlags is undefined and should be ignored.
    //          ohdr.dwParam is set to the size, in bytes of raw
    //                      diagnostics data following ohdr.
    //
    //          Note that ohdr.dwTotalSize will be equal to
    //              (   sizeof(LINEDIAGNOSTICSOBJECTHEADER)
    //                + ohdr.dwParam)
    //
    //          The raw diagnostics bytes will be null terminated and
    //          the ohdr.dwParam includes the size of the terminating null.
    //          HOWEVER, the raw diagnostics may contain embedded nulls.
    //          For  DEVCLASSID_MODEM,  the bytestring will contain
    //          no embedded nulls and has the HTML-like tagged format
    //          defined in the AT#UD diagnostics specification.
    //
    // The following macros help extract and validate raw diagnostics
    // information...
    //
    #define RAWDIAGNOSTICS_HDR(_plinediagnostics)                           \
            ((LINEDIAGNOSTICSOBJECTHEADER*)                                 \
                 (  (BYTE*)(_plinediagnostics)                              \
                  + ((_plinediagnostics)->dwRawDiagnosticsOffset)))

    #define IS_VALID_RAWDIAGNOSTICS_HDR(_praw_diagnostics_hdr)              \
            ((_praw_diagnostics_hdr)->dwSig==LDSIG_RAWDIAGNOSTICS)

    #define RAWDIAGNOSTICS_DATA(_plinediagnostics)                          \
            (  (BYTE*)(_plinediagnostics)                                   \
             + ((_plinediagnostics)->dwRawDiagnosticsOffset)                \
             + sizeof(LINEDIAGNOSTICSOBJECTHEADER))

    #define RAWDIAGNOSTICS_DATA_SIZE(_praw_diagnostics_hdr)                 \
            ((_praw_diagnostics_hdr)->dwParam)

    DWORD dwParsedDiagnosticsOffset;
    //
    //          Offset from the start of this structure
    //          to the start of an object containing
    //          parsed diagnostics output.
    //
    //          ohdr.dwSig will be set to LDSIG_PARSEDDIAGNOSTICS
    //          ohdr.dwNextObjectOffset UNUSED and will be set to 0.
    //          ohdr.dwTotalSize is set to the total size of the
    //                       parsed-diagnostics object.
    //          ohdr.dwFlags is undefined and should be ignored.
    //          ohdr.dwParam is set to the number of contiguous
    //                      LINEDIAGNOSTICS_PARSEREC structures (defined below)
    //                      following ohdr.
    //          Note that ohdr.dwTotalSize will be equal to
    //              (   sizeof(LINEDIAGNOSTICSOBJECTHEADER)
    //                + ohdr.dwParam*sizeof(LINEDIAGNOSTICS_PARSEREC))
    //
    // The following macros help extract and validate parsed diagnostics
    // information...
    //
    #define PARSEDDIAGNOSTICS_HDR(_plinediagnostics)                        \
            ((LINEDIAGNOSTICSOBJECTHEADER*)                                 \
                 (  (BYTE*)(_plinediagnostics)                              \
                  + ((_plinediagnostics)->dwParsedDiagnosticsOffset)))

    #define PARSEDDIAGNOSTICS_DATA(_plinediagnostics)                       \
                            ((LINEDIAGNOSTICS_PARSEREC*)                    \
                            (  (BYTE*)(_plinediagnostics)                   \
                             + ((_plinediagnostics)->dwParsedDiagnosticsOffset)\
                             + sizeof(LINEDIAGNOSTICSOBJECTHEADER)))

    #define PARSEDDIAGNOSTICS_NUM_ITEMS(_pparsed_diagnostics_hdr)           \
            ((_pparsed_diagnostics_hdr)->dwParam)

    #define IS_VALID_PARSEDDIAGNOSTICS_HDR(_pparsed_diagnostics_hdr)        \
            ((_pparsed_diagnostics_hdr)->dwSig==LDSIG_PARSEDDIAGNOSTICS)


} LINEDIAGNOSTICS, *PLINEDIAGNOSTICS;


//
// The following structure defines a keyword-value pair of parsed-diagnostic
// information.
//
typedef struct // LINEDIAGNOSTICS_PARSEREC
{

    DWORD dwKeyType;
    //
    //  "Super key" -- identifying the type of key
    //

    DWORD dwKey;
    //
    //      This is domain-specific and key-type specific. For DEVCLASSID_MODEM,
    //      This will be one of the MODEMDIAGKEY_* constants
    //      defined below.

    DWORD dwFlags;
    //
    //      Help to identify the meaning of dwValue
    //      One or more of the following flags:
    //      (1st 4 are mutually exclusive)
    //
            #define fPARSEKEYVALUE_INTEGER                       (0x1<<0)
            //          value is an integer literal

            #define fPARSEKEYVALUE_LINEDIAGNOSTICSOBJECT         (0x1<<1)
            //          value is the offset in bytes to a LINEDIGAGNOSTICS
            //          object which contains the information associated
            //          with this entry. The byte offset is from the start
            //          of the object containing the parsed information,
            //          not from start of the containing LINEDIAGNOSTICS object.


            #define fPARSEKEYVALUE_ASCIIZ_STRING                 (0x1<<2)
            //          value is the offset in bytes to an ASCII
            //          null-terminated string. The byte offset is from the
            //          start of the object containing the parsed information,
            //          not from start of the containing LINEDIAGNOSTICS object.

            #define fPARSEKEYVALUE_UNICODEZ_STRING               (0x1<<3)
            //          value is the offset in bytes to a UNICODE
            //          null-terminated string. The byte offset is from the
            //          start of the object containing the parsed information,
            //          not from start of the containing LINEDIAGNOSTICS object.


    DWORD dwValue;
    //
    //      This is dwKey specific. The documentation
    //      associated with each MODEMDIAGKEY_* constant definition
    //      precicely describes the content of its corresponding dwValue.
    //      See also dwFlags above.
    //

} LINEDIAGNOSTICS_PARSEREC, *PLINEDIAGNOSTICS_PARSEREC;



// -----------------------------------------------------------------------------
// ANALOG MODEM SUMMARY DIAGNOSIC INFORMATION
// -----------------------------------------------------------------------------
//
// Diagnostics Result Codes (LDRC_*) for modems
//
#define LDRC_UNKNOWN    0
//      The result code is unknown. Raw diagnostics information may be present,
//      if so dwRawDiagnosticsOffset and dwRawDiagnosticsSize will be nonzero.
//      dwParam1-4: unused and will be set to zero.

// Other codes are TBD.


// -----------------------------------------------------------------------------
//  LINEDIAGNOSTICS_PARSEREC KeyType,
//  key and value definitions for domainID DOMAINID_MODEM
// -----------------------------------------------------------------------------

//
// KEYTYPE
//
#define MODEM_KEYTYPE_STANDARD_DIAGNOSTICS 0x2a4d3263

// All the modem-domain-id key constants have prefix "MODEMDIAGKEY_". Both
// keys and values are based on the AT#UD diagnostic specification.
//
// Most of the values corresponding to the keys defined below are DWORD-sized
// bitfields or counters. A few of the values are offsets (from the start
// of the LINEDIAGNOSTICS structure) to variable-sized values. The formats
// of all values are documented directly after the corresponding key definition,
// and have prefix "MODEMDIAG_". Where useful, macros are provided which
// extract individual bits or bitfields out of the dwValue field. For example,
// see the macros associated with the MODEMDIAGKEY_V34_INFO key, which contains
// information extracted from the V.34 INFO structure.


#define MODEMDIAGKEY_VERSION                    0x0

    // Value: DWORD. HiWord represents major version;
    //       LoWord represents minor version;
    // Following Macros may be used to extract the hi- and low- version numbers.
    // from the parserec's .dwValue field...
    //
    #define MODEMDIAG_MAJORVER(_ver) ((HIWORD) (_ver))
    #define MODEMDIAG_MINORVER(_ver) ((LOWORD) (_ver))

#define MODEMDIAGKEY_CALL_SETUP_RESULT          0x1

    // Value: Call Setup Result codes based on on Table 2 of the
    //           AT#UD specification....

    #define MODEMDIAG_CALLSETUPCODE_NO_PREVIOUS_CALL 0x0
                //
                // Modem log has be en cleared since any previous calls...
                //

    #define MODEMDIAG_CALLSETUPCODE_NO_DIAL_TONE            0x1
                //
                // No dial tone detected.
                //

    #define MODEMDIAG_CALLSETUPCODE_REORDER_SIGNAL          0x2
                //
                // Reorder signal detected, network busy.
                //

    #define MODEMDIAG_CALLSETUPCODE_BUSY_SIGNAL             0x3
                //
                // Busy signal detected
                //

    #define MODEMDIAG_CALLSETUPCODE_NO_SIGNAL               0x4
                //
                //  No recognized signal detected.
                //

    #define MODEMDIAG_CALLSETUPCODE_VOICE                   0x5
                //
                // Analog voice detected
                //

    #define MODEMDIAG_CALLSETUPCODE_TEXT_TELEPHONE_SIGNAL   0x6
                //
                // Text telephone signal detected (V.18)
                //

    #define MODEMDIAG_CALLSETUPCODE_DATA_ANSWERING_SIGNAL   0x7
                //
                // Data answering signal detected (e.g. V.25 ANS, V.8 ANSam)
                //

    #define MODEMDIAG_CALLSETUPCODE_DATA_CALLING_SIGNAL     0x8
                //
                // Data calling signal detected (e.g. V.25 CT, V.8 CI).
                //

    #define MODEMDIAG_CALLSETUPCODE_FAX_ANSWERING_SIGNAL    0x9
                //
                // Fax answering signal detected (e.g. T.30 CED, DIS).
                //

    #define MODEMDIAG_CALLSETUPCODE_FAX_CALLING_SIGNAL      0xa
                //
                // Fax calling signal detected (e.g. T.30 CNG)
                //

    #define MODEMDIAG_CALLSETUPCODE_V8BIS_SIGNAL            0xb
                //
                // V.8bis signal detected.
                //


#define MODEMDIAGKEY_MULTIMEDIA_MODE        0x2

    // Value: Multimedia mode, based on Table 3 of the AT#UD specification...

    #define MODEMDIAG_MMMODE_DATA_ONLY      0x0
    #define MODEMDIAG_MMMODE_FAX_ONLY       0x1
    #define MODEMDIAG_MMMODE_VOICE_ONLY     0x2
    #define MODEMDIAG_MMMODE_VOICEVIEW      0x3
    #define MODEMDIAG_MMMODE_ASVD_V61      0x4
    #define MODEMDIAG_MMMODE_ASVD_V34Q     0x5
    #define MODEMDIAG_MMMODE_DSVD_MT        0x6
    #define MODEMDIAG_MMMODE_DSVD_1_2       0x7
    #define MODEMDIAG_MMMODE_DSVD_70        0x8
    #define MODEMDIAG_MMMODE_H324           0x9
    #define MODEMDIAG_MMMODE_OTHER_V80      0xa




#define MODEMDIAGKEY_DTE_DCE_INTERFACE_MODE 0x3

    // Value: DTE-DCE interface mode, based on Table 4 of the AT#UD specication
    //          ...
    #define MODEMDIAG_DCEDTEMODE_ASYNC_DATA             0x0
    #define MODEMDIAG_DCEDTEMODE_V80_TRANSPARENT_SYNC  0x1
    #define MODEMDIAG_DCEDTEMODE_V80_FRAMED_SYNC       0x2

#define V8_CM_STRING                        0x4
    // Value: offset from the start of the LINEDIAGNOSTICS structure to
    // the V.8 CM octet string, same format as V.25ter Annex A.
    // The offset points to a contiguous region of memory who

// TODO: define parsed-versions of V.8 CM and V.8 JM octet strings, not
//       covered in the information returned in PARSEREC

#define  MODEMDIAGKEY_RECEIVED_SIGNAL_POWER     0x10
    // Value: Received signal power level, in -dBm.

#define  MODEMDIAGKEY_TRANSMIT_SIGNAL_POWER     0x11
    // Value: Transmit signal power level, in -dBm.

#define MODEMDIAGKEY_NOISE_LEVEL                0x12
    // Value: Estimated noise level, in -dBM.

#define MODEMDIAGKEY_NORMALIZED_MSE             0x13
    // Value: Normalized Mean Squared error. JosephJ: TODO: Of what?

#define MODEMDIAGKEY_NEAR_ECHO_LOSS             0x14
    // Value: Near echo loss, in units of dB

#define MODEMDIAGKEY_FAR_ECHO_LOSS              0x15
    // Value: Far echo loss, in units of dB

#define MODEMDIAGKEY_FAR_ECHO_DELAY             0x16
    // Value: Far echo delay, in units of ms.

#define MODEMDIAGKEY_ROUND_TRIP_DELAY           0x17
    // Value: Round trip delay, in units of ms.

#define MODEMDIAGKEY_V34_INFO                  0x18
    // Value: V.34 INFO bitmap, based on Table 5 of the AT#UD specifiction.
    // This DWORD value encodes 32 bits extracted from the V.34 INFO bitmap.
    // The following Macros extract specific V.34 INFO bit ranges out of
    // the 32-bit value:
    //
    // 10/30/1997 JosephJ: TODO what exactly are these? Also, what
    // does 20;0, 50;0 below mean?

    #define MODEMDIAG_V34_INFO0_20_0(_value)            (((_value)>>30) & 0x3)
        //
        // INFO0 bit 20;0
        //

    #define MODEMDIAG_V34_INFOc_79_88(_value)           (((_value)>>20) & 0x3ff)
        //
        // INFOc bit 79-88
        //

    #define MODEMDIAG_V34_INFOc_PRE_EMPHASIS(_value)    (((_value)>>16) & 0xf)
        //
        // Pre-emphasis field, selected by the symbol rate chosen.
        // INFOc bits 26-29 or 35-38 or 44-47 or 53-56 or 62-65 or 71-74
        //
    #define MODEMDIAG_V34_INFOa_26_29(_value)           (((_value)>>12) & 0xf)
        //
        // INFOa bits 26-29
        //

    #define MODEMDIAG_V34_INFO_MP_50_0(_value)          (((_value)>>10) & 0x3)
        //
        // MP bit 50;0
        //

    #define MODEMDIAG_V34_INFOa_40_49(_value)           (((_value)>>0) & 0x3ff)
        //
        // INFOa bits 40-49
        //

#define MODEMDIAGKEY_TRANSMIT_CARRIER_NEGOTIATION_RESULT    0x20
        //  Value: based on Table 6 of the AT#UD specification
        // TODO: fill out...


#define MODEMDIAGKEY_RECEIVE_CARRIER_NEGOTIATION_RESULT     0x21
        //  Value: based on Table 6 of the AT#UD specification
        // TODO: fill out...

#define MODEMDIAGKEY_TRANSMIT_CARRIER_SYMBOL_RATE           0x22
        //  Value: Transmit carrier symbol rate.


#define MODEMDIAGKEY_RECEIVE_CARRIER_SYMBOL_RATE            0x23
        //  Value: Receive carrier symbol rate.

#define MODEMDIAGKEY_TRANSMIT_CARRIER_FREQUENCY             0x24
        //  Value: Transmit carrier frequency TODO: units? Hz?

#define MODEMDIAGKEY_RECEIVE_CARRIER_FREQUENCY              0x25
        //  Value: Transmit carrier frequency TODO: units? Hz?

#define MODEMDIAGKEY_INITIAL_TRANSMIT_CARRIER_DATA_RATE     0x26
        // Value: Initial transmit carrier data rate. TODO: units? /sec?

#define MODEMDIAGKEY_INITIAL_RECEIVE_CARRIER_DATA_RATE      0x27
        // Value: Initial receive carrier data rate. TODO: units? /sec?

#define MODEMDIAGKEY_TEMPORARY_CARRIER_LOSS_EVENT_COUNT     0x30
        // Value: Temporary carrier loss event count

#define MODEMDIAGKEY_CARRIER_RATE_RENEGOTIATION_COUNT       0x31
        // Value: Carrier rate renegotiation event count

#define MODEMDIAGKEY_CARRIER_RETRAINS_REQUESTED             0x32
        // Value: Carrier retrains requested

#define MODEMDIAGKEY_CARRIER_RETRAINS_GRANTED               0x33
        // Value: Carrier retrains granted.

#define MODEMDIAGKEY_FINAL_TRANSMIT_CARRIER_RATE            0x34
        // Value: final carrier transmit rate   TODO: units? /sec?

#define MODEMDIAGKEY_FINAL_RECEIVE_CARRIER_RATE            0x35
        // Value: final carrier receive rate   TODO: units? /sec?

#define MODEMDIAGKEY_PROTOCOL_NEGOTIATION_RESULT           0x40
        // Value: Protocol negotiation result code, based on
        //      Table 7 of the AT#UD diagnostics specification...

#define MODEMDKAGKEY_ERROR_CONTROL_FRAME_SIZE              0x41
        // Value: Error control frame size. TODO: units? bytes?

#define MODEMDIAGKEY_ERROR_CONTROL_LINK_TIMEOUTS           0x42
        // Value: Error control link timeouts. TODO: time or count?

#define MODMEDIAGKEY_ERROR_CONTROL_NAKs                    0x43
        // Value: Error control NAKs

#define MODEMDIAGKEY_COMPRESSION_NEGOTIATION_RESULT        0x44
        // Value: Compression negotiation result, based on
        //        Table 8 of the AT#UD spec.
        //
        // TODO: add specific constant definitions here...

#define MODEMDIAGKEY_COMPRESSION_DICTIONARY_SIZE          0x45
        // Value: compression dictionary size. TODO: size? bytes?


#define MODEMDIAGKEY_TRANSMIT_FLOW_CONTROL               0x50
        // Value: Transmit flow control, defined by
        // one of the following constants:

        #define MODEMDIAG_FLOW_CONTROL_OFF      0x0
        //
        //  No flow control
        //

        #define MODEMDIAG_FLOW_CONTROL_DC1_DC3  0x2
        //
        //  DC1/DC3 (XON/XOFF) flow control
        //

        #define MODEMDIAG_FLOW_CONTROL_RTS_CTS  0x3
        //
        // RTS/CTS (V.24 ckt 106/133) flow control: TODO verify that latter
        // is the same as RTS/CTS.
        //

#define MODEMDIAGKEY_RECEIVE_FLOW_CONTROL               0x51
        // Value: Receive flow control, defined by the above
        //  (MODEMDiG_FLOW_CONTROL_*) constants.

#define MODEMDIAGKEY_DTE_TRANSMIT_CHARACTERS            0x52
        // Value: Transmit characters obtained from DTE

#define MODEMDIAGKEY_DTE_RECEIVED_CHARACTERS             0x53
        // Value: Received characters sent to DTE

#define MODEMDIAGKEY_DTE_TRANSMIT_CHARACTERS_LOST       0x54
        // Value: Transmit characters lost (data overrun errors from DTE)

#define MODEMDIAGKEY_DTE_RECEIVED_CHARACTERS_LOST       0x55
        // Value: Transmit characters lost (data overrun errors to DTE)

#define MODEMDIAGKEY_EC_TRANSMIT_FRAME_COUNT            0x56
        // Value: Error control protocol transmit frame count

#define MODEMDIAGKEY_EC_RECEIVED_FRAME_COUNT            0x57
        // Value: Error control protocol received frame count

#define MODEMDIAGKEY_EC_TRANSMIT_FRAME_ERROR_COUNT      0x58
        // Value: Error control protocol transmit frame error count

#define MODEMDIAGKEY_EC_RECEIVED_FRAME_ERROR_COUNT      0x59
        // Value: Error control protocol received frame error count

#define MODEMDIAGKEY_TERMINATION_CAUSE                  0x60
       // Value: Termination cause, based on Table 9-10 of the AT#UD
       //        specification.

#define MODEMDIAGKEY_CALL_WAINTING_EVENT_COUNT         0x61
       // Value: Call wainting event count.
       // TODO: Define specific  constants.


//
// KEYTYPE
//
#define MODEM_KEYTYPE_AT_COMMAND_RESPONSE  0x5259091c
//
// The values are responses to specific AT commands. This type is relevant
// only to AT ("Hayes(tm) compatible") modems.
// The key (one of the MODEMDIAGKEY_ATRESP_* constants ) identifies the
// command.
//

#define MODEMDIAGKEY_ATRESP_CONNECT         0x1
       // Value: Connect response string.
       // This will be a null-terminated ascii string.

// ========================================================================
//  UNIMODEM DEVICE-SPECIFIC returned for lineGetDevCaps

// The following structure is located at dwDevSpecificOffset into
// the  LINEDEVCAPS structure returned by lineGetDevCaps.
//
typedef struct // DEVCAPS_DEVSPECIFIC_UNIMODEM
{
    DWORD dwSig;
    //
    //  This will be set to 0x1;

    DWORD dwKeyOffset;
    //
    // This is the offset from the start of THIS structure, to
    // a null-terminated ASCI (not UNICODE) string giving
    // the device's driver key.
    //
    // WARNING: this is present for compatibility reasons. Applications
    // are STRONGLY discouraged to use this information, because the
    // location of the driver key could change on upgrade, so if
    // applications save away this key, the application could fail
    // on upgrade of the OS.
    //

} DEVCAPS_DEVSPECIFIC_UNIMODEM, *PDEVCAPS_DEVSPECIFIC_UNIMODEM;

// ========================================================================

typedef struct  // ISDN_STATIC_CONFIG
{
    DWORD dwSig;
    //
    //      Must be  set to dwSIG_ISDN_STATIC_CONFIGURATION
    //
    #define dwSIG_ISDN_STATIC_CONFIGURATION 0x877bfc9f

    DWORD dwTotalSize;
    //
    //  Total size of this structure, including variable portion, if any.
    //

    DWORD dwFlags;              // reserved
    DWORD dwNextHeaderOffset;   // reserved

    DWORD dwSwitchType;
    //
    //      One of the dwISDN_SWITCH_* values below.
    //
    #define dwISDN_SWITCH_ATT1      0   // AT&T 5ESS Customm
    #define dwISDN_SWITCH_ATT_PTMP  1   // AT&T Point to Multipoint
    #define dwISDN_SWITCH_NI1       2   // National ISDN 1
    #define dwISDN_SWITCH_DMS100    3   // North3ern Telecom DMS-100 NT1
    #define dwISDN_SWITCH_INS64     4   // NTT INS64 - (Japan)
    #define dwISDN_SWITCH_DSS1      5   // DSS1 (Euro-ISDN)
    #define dwISDN_SWITCH_1TR6      6   // 1TR6 (Germany)
    #define dwISDN_SWITCH_VN3       7   // VN3  (France)
    #define dwISDN_SWITCH_BELGIUM1  8   // Belgian National
    #define dwISDN_SWITCH_AUS1      9   // Australian National TPH 1962
    #define dwISDN_SWITCH_UNKNOWN  10   // Unknown

    DWORD dwSwitchProperties;
    //
    //      One or more fISDN_SWITCHPROP_* flags below
    //
    // Note the following three are exclusive, so only one can be
    // set at a time:
    #define fISDN_SWITCHPROP_US     (0x1<<0) // Uses DN/SPID
    #define fISDN_SWITCHPROP_MSN    (0x1<<1) // Uses MSN
    #define fISDN_SWITCHPROP_EAZ    (0x1<<2) // Uses EAX
    #define fISDN_SWITCHPROP_1CH    (0x1<<3) // Only one channel.

    DWORD dwNumEntries;
    //
    //      The number of channels OR MSNs.
    //      The numbers and possibly IDs are specified in the following
    //      two offsets.
    //

    DWORD dwNumberListOffset;
    //
    //      Offset in BYTES from the start of this structure to a
    //      UNICODE multi-sz set of strings representing numbers.
    //      There will dwNumChannels entries.
    //
    //      The interpretation of these numbers is switch-property-specific,
    //      and is as follows:
    //           US: Directory Number.
    //          MSN: MSN Number
    //          EAZ: EAZ Number.

    DWORD dwIDListOffset;
    //
    //      Offset in BYTES from the start of this structure to a
    //      UNICODE multi-sz set of strings representing IDs.
    //      There will dwNumChannels entries.
    //
    //      The interpretation of these IDs is switch-property-specific and
    //      is as follows:
    //           US: SPID.
    //          MSN: Not used and should be set to 0.
    //          EAZ: EAZ

    //
    //  variable length portion, if any, follows...
    //

} ISDN_STATIC_CONFIG;


typedef struct  // ISDN_STATIC_CAPS
{
    DWORD dwSig;
    //
    //      Must be  set to dwSIG_ISDN_STATIC_CAPS
    //
    #define dwSIG_ISDN_STATIC_CAPS 0xd11c5587
    DWORD dwTotalSize;
    //
    //  Total size of this structure, including variable portion, if any.
    //

    DWORD dwFlags;              // reserved
    DWORD dwNextHeaderOffset;   // reserved


    DWORD dwNumSwitchTypes;
    DWORD dwSwitchTypeOffset;
    //
    //  Offset to switch types, which is a DWORD array of types.
    //

    DWORD dwSwitchPropertiesOffset;
    //
    //  Offset to a DWORD array of properties of the corresponding switch.
    //

    DWORD dwNumChannels;
    //
    //  The number of channels supported.
    //

    DWORD dwNumMSNs;
    //
    //  The number of MSNs supported.
    //

    DWORD dwNumEAZ;
    //
    //  The number of EAZs supported.
    //

    //
    //  variable length portion, if any, follows...
    //

} ISDN_STATIC_CAPS;

typedef struct // MODEM_CONFIG_HEADER
{
    DWORD dwSig;
    DWORD dwTotalSize;
    DWORD dwNextHeaderOffset;
    DWORD dwFlags;

} MODEM_CONFIG_HEADER;

typedef struct // MODEM_PROTOCOL_CAPS
{

    MODEM_CONFIG_HEADER hdr;
    //
    //      hdr.dwSig must be  set to dwSIG_MODEM_PROTOCOL_CAPS
    //      hdr.dwFlags are reserved and should be ignored by app.
    //
    #define dwSIG_MODEM_PROTOCOL_CAPS 0x35ccd4b3

    DWORD dwNumProtocols;
    //
    //  The number of protocols supported.
    //

    DWORD dwProtocolListOffset;
    //
    //  Offset to a DWORD array of protocols supported.
    //

    //
    //  variable length portion, if any, follows...
    //

} MODEM_PROTOCOL_CAPS;

typedef struct _PROTOCOL_ITEM {
    DWORD     dwProtocol;                  //   Protocol Supported

    DWORD     dwProtocolNameOffset;        //  Offset from beggining of MODEM_PROTOCOL_CAPS structure
                                           //  to NULL terminated friendly name of the protocol.
} PROTOCOL_ITEM, *PPROTOCOL_ITEM;



//=========================================================================
//
//      Modem install wizard structures and flags
//
//=========================================================================

#define UM_MAX_BUF_SHORT               32
#define UM_LINE_LEN                   256

#define MIPF_NT4_UNATTEND       0x1
    // Take the information about what modem to install
    // from the unattended.txt file
#define MIPF_DRIVER_SELECTED    0x2
    // The modem driver is selected, just register
    // and install it


// Unattended install parameters
typedef struct _tagUMInstallParams
{
    DWORD   Flags;                  // Flags that specify the unattended mode
    WCHAR   szPort[UM_MAX_BUF_SHORT];  // Port on which to install the modem
    WCHAR   szInfName[MAX_PATH];    // for NT4 method, inf name
    WCHAR   szSection[UM_LINE_LEN];    // for NT4 method, section name


} UM_INSTALLPARAMS, *PUM_INSTALLPARAMS, *LPUM_INSTALLPARAMS;


// This structure is the private structure that may be
// specified in the SP_INSTALLWIZARD_DATA's PrivateData field.
typedef struct tagUM_INSTALL_WIZARD
{
    DWORD            cbSize;             // set to the size of the structure
    DWORD            Reserved1;          // reserved, must be 0
    DWORD            Reserved2;          // reserved, must be 0
    LPARAM           Reserved3;          // reserved, must be 0
    UM_INSTALLPARAMS InstallParams;    // parameters for the wizard

} UM_INSTALL_WIZARD, *PUM_INSTALL_WIZARD, *LPUM_INSTALL_WIZARD;



//=========================================================================
//
//      Modem properties defines
//
//=========================================================================

#define REGSTR_VAL_DEVICEEXTRAPAGES   TEXT("DeviceExtraPages")  // Property pages provided by the device manufacturer

typedef BOOL (APIENTRY *PFNADDEXTRAPAGES)(HDEVINFO,PSP_DEVINFO_DATA,LPFNADDPROPSHEETPAGE,LPARAM);


#ifdef __cplusplus
}
#endif

#endif //  _UNIMODEM_H_