/*++ BUILD Version: 0000    // Increment this if a change has global effects

Copyright (c) 1994-1998  Microsoft Corporation

Module Name:

    tb.h

Abstract:

    Header file for the TAPI Browser util

Author:

    Dan Knudson (DanKn)    23-Aug-1994

Revision History:

--*/


#include <windows.h>
#include <tapi.h>

#if INTERNAL_3_0
#include <tapimmc.h>
#endif


//
// Symbolic constants
//

#define DS_NONZEROFIELDS            0x00000001
#define DS_ZEROFIELDS               0x00000002
#define DS_BYTEDUMP                 0x00000004

#define WT_LINEAPP                  1
#define WT_LINE                     2
#define WT_CALL                     3
#define WT_PHONEAPP                 4
#define WT_PHONE                    5

#define PT_DWORD                    1
#define PT_FLAGS                    2
#define PT_POINTER                  3
#define PT_STRING                   4
#define PT_CALLPARAMS               5
#define PT_FORWARDLIST              6
#define PT_ORDINAL                  7

#define FT_DWORD                    1
#define FT_FLAGS                    2
#define FT_ORD                      3
#define FT_SIZE                     4
#define FT_OFFSET                   5

#define MAX_STRING_PARAM_SIZE       96

#define MAX_USER_BUTTONS            6

#define MAX_USER_BUTTON_TEXT_SIZE   8

#define MAX_LINEFORWARD_ENTRIES     5

#define TABSIZE 4

#if TAPI_2_0
#define LAST_LINEERR                LINEERR_DIALVOICEDETECT
#else
#define LAST_LINEERR                LINEERR_NOMULTIPLEINSTANCE
#endif


//
//
//

typedef LONG (WINAPI *PFN1)(ULONG_PTR);
typedef LONG (WINAPI *PFN2)(ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN3)(ULONG_PTR, ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN4)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN5)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR);
typedef LONG (WINAPI *PFN6)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN7)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR, ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN8)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN9)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                            ULONG_PTR);
typedef LONG (WINAPI *PFN10)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                             ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                             ULONG_PTR, ULONG_PTR);
typedef LONG (WINAPI *PFN12)(ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                             ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR,
                             ULONG_PTR, ULONG_PTR, ULONG_PTR, ULONG_PTR);


typedef struct _MYWIDGET
{
    DWORD       dwType;

    struct _MYWIDGET   *pNext;

} MYWIDGET, *PMYWIDGET;


typedef struct _MYLINEAPP
{
    MYWIDGET    Widget;

    HLINEAPP    hLineApp;

} MYLINEAPP, *PMYLINEAPP;


typedef struct _MYLINE
{
    MYWIDGET    Widget;

    HLINE       hLine;

    HLINEAPP    hLineApp;

    DWORD       dwDevID;

    DWORD       dwPrivileges;

    DWORD       dwMediaModes;

    DWORD       dwAPIVersion;

    PMYLINEAPP  pLineApp;

} MYLINE, *PMYLINE;


typedef struct _MYCALL
{
    MYWIDGET    Widget;

    HCALL       hCall;

    DWORD       dwCallState;

    LONG        lMakeCallReqID;

    LONG        lDropReqID;

    DWORD       dwCompletionID;

    DWORD       dwNumGatheredDigits;

    char        *lpsGatheredDigits;

    PMYLINE     pLine;

    BOOL        bMonitor;

} MYCALL, *PMYCALL;


typedef struct _MYPHONEAPP
{
    MYWIDGET    Widget;

    HPHONEAPP   hPhoneApp;

} MYPHONEAPP, *PMYPHONEAPP;


typedef struct _MYPHONE
{
    MYWIDGET    Widget;

    HPHONE      hPhone;

    HPHONEAPP   hPhoneApp;

    DWORD       dwDevID;

    DWORD       dwPrivilege;

    DWORD       dwAPIVersion;

    PMYPHONEAPP pPhoneApp;

} MYPHONE, *PMYPHONE;


typedef struct _LOOKUP
{
    DWORD       dwVal;

    char        lpszVal[20];

} LOOKUP, *PLOOKUP;


typedef enum
{
    lAccept,
#if TAPI_1_1
    lAddProvider,
#if TAPI_2_0
    lAddProviderW,
#endif
#endif
    lAddToConference,
#if TAPI_2_0
    lAgentSpecific,
#endif
    lAnswer,
    lBlindTransfer,
#if TAPI_2_0
    lBlindTransferW,
#endif
    lClose,
    lCompleteCall,
    lCompleteTransfer,
    lConfigDialog,
#if TAPI_2_0
    lConfigDialogW,
#endif
#if TAPI_1_1
    lConfigDialogEdit,
#if TAPI_2_0
    lConfigDialogEditW,
#endif
    lConfigProvider,
#endif
    lDeallocateCall,
    lDevSpecific,
    lDevSpecificFeature,
    lDial,
#if TAPI_2_0
    lDialW,
#endif
    lDrop,
    lForward,
#if TAPI_2_0
    lForwardW,
#endif
    lGatherDigits,
#if TAPI_2_0
    lGatherDigitsW,
#endif
    lGenerateDigits,
#if TAPI_2_0
    lGenerateDigitsW,
#endif
    lGenerateTone,
    lGetAddressCaps,
#if TAPI_2_0
    lGetAddressCapsW,
#endif
    lGetAddressID,
#if TAPI_2_0
    lGetAddressIDW,
#endif
    lGetAddressStatus,
#if TAPI_2_0
    lGetAddressStatusW,
    lGetAgentActivityList,
    lGetAgentActivityListW,
    lGetAgentCaps,
    lGetAgentGroupList,
    lGetAgentStatus,
#endif
#if TAPI_1_1
    lGetAppPriority,
#if TAPI_2_0
    lGetAppPriorityW,
#endif
#endif
    lGetCallInfo,
#if TAPI_2_0
    lGetCallInfoW,
#endif
    lGetCallStatus,
    lGetConfRelatedCalls,
#if TAPI_1_1
    lGetCountry,
#if TAPI_2_0
    lGetCountryW,
#endif
#endif
    lGetDevCaps,
#if TAPI_2_0
    lGetDevCapsW,
#endif
    lGetDevConfig,
#if TAPI_2_0
    lGetDevConfigW,
#endif
    lGetIcon,
#if TAPI_2_0
    lGetIconW,
#endif
    lGetID,
#if TAPI_2_0
    lGetIDW,
#endif
    lGetLineDevStatus,
#if TAPI_2_0
    lGetLineDevStatusW,
    lGetMessage,
#endif
    lGetNewCalls,
    lGetNumRings,
#if TAPI_1_1
    lGetProviderList,
#if TAPI_2_0
    lGetProviderListW,
#endif
#endif
    lGetRequest,
#if TAPI_2_0
    lGetRequestW,
#endif
    lGetStatusMessages,
    lGetTranslateCaps,
#if TAPI_2_0
    lGetTranslateCapsW,
#endif
    lHandoff,
#if TAPI_2_0
    lHandoffW,
#endif
    lHold,
    lInitialize,
#if TAPI_2_0
    lInitializeEx,
    lInitializeExW,
#endif
    lMakeCall,
#if TAPI_2_0
    lMakeCallW,
#endif
    lMonitorDigits,
    lMonitorMedia,
    lMonitorTones,
    lNegotiateAPIVersion,
    lNegotiateExtVersion,
    lOpen,
#if TAPI_2_0
    lOpenW,
#endif
    lPark,
#if TAPI_2_0
    lParkW,
#endif
    lPickup,
#if TAPI_2_0
    lPickupW,
#endif
    lPrepareAddToConference,
#if TAPI_2_0
    lPrepareAddToConferenceW,
    lProxyMessage,
    lProxyResponse,
#endif
    lRedirect,
#if TAPI_2_0
    lRedirectW,
#endif
    lRegisterRequestRecipient,
#if TAPI_1_1
    lReleaseUserUserInfo,
#endif
    lRemoveFromConference,
#if TAPI_1_1
    lRemoveProvider,
#endif
    lSecureCall,
    lSendUserUserInfo,
#if TAPI_2_0
    lSetAgentActivity,
    lSetAgentGroup,
    lSetAgentState,
#endif
#if TAPI_1_1
    lSetAppPriority,
#if TAPI_2_0
    lSetAppPriorityW,
#endif
#endif
    lSetAppSpecific,
#if TAPI_2_0
    lSetCallData,
#endif
    lSetCallParams,
    lSetCallPrivilege,
#if TAPI_2_0
    lSetCallQualityOfService,
    lSetCallTreatment,
#endif
    lSetCurrentLocation,
    lSetDevConfig,
#if TAPI_2_0
    lSetDevConfigW,
    lSetLineDevStatus,
#endif
    lSetMediaControl,
    lSetMediaMode,
    lSetNumRings,
    lSetStatusMessages,
    lSetTerminal,
    lSetTollList,
#if TAPI_2_0
    lSetTollListW,
#endif
    lSetupConference,
#if TAPI_2_0
    lSetupConferenceW,
#endif
    lSetupTransfer,
#if TAPI_2_0
    lSetupTransferW,
#endif
    lShutdown,
    lSwapHold,
    lTranslateAddress,
#if TAPI_2_0
    lTranslateAddressW,
#endif
#if TAPI_1_1
    lTranslateDialog,
#if TAPI_2_0
    lTranslateDialogW,
#endif
#endif
    lUncompleteCall,
    lUnhold,
    lUnpark,
#if TAPI_2_0
    lUnparkW,
#endif

#if INTERNAL_3_0
    mmcAddProvider,
    mmcConfigProvider,
    mmcGetAvailableProviders,
    mmcGetLineInfo,
    mmcGetLineStatus,
    mmcGetPhoneInfo,
    mmcGetPhoneStatus,
    mmcGetProviderList,
    mmcGetServerConfig,
    mmcInitialize,
    mmcRemoveProvider,
    mmcSetLineInfo,
    mmcSetPhoneInfo,
    mmcSetServerConfig,
    mmcShutdown,
#endif

    pClose,
    pConfigDialog,
#if TAPI_2_0
    pConfigDialogW,
#endif
    pDevSpecific,
    pGetButtonInfo,
#if TAPI_2_0
    pGetButtonInfoW,
#endif
    pGetData,
    pGetDevCaps,
#if TAPI_2_0
    pGetDevCapsW,
#endif
    pGetDisplay,
    pGetGain,
    pGetHookSwitch,
    pGetIcon,
#if TAPI_2_0
    pGetIconW,
#endif
    pGetID,
#if TAPI_2_0
    pGetIDW,
#endif
    pGetLamp,
#if TAPI_2_0
    pGetMessage,
#endif
    pGetRing,
    pGetStatus,
#if TAPI_2_0
    pGetStatusW,
#endif
    pGetStatusMessages,
    pGetVolume,
    pInitialize,
#if TAPI_2_0
    pInitializeEx,
    pInitializeExW,
#endif
    pOpen,
    pNegotiateAPIVersion,
    pNegotiateExtVersion,
    pSetButtonInfo,
#if TAPI_2_0
    pSetButtonInfoW,
#endif
    pSetData,
    pSetDisplay,
    pSetGain,
    pSetHookSwitch,
    pSetLamp,
    pSetRing,
    pSetStatusMessages,
    pSetVolume,
    pShutdown,

    tGetLocationInfo,
#if TAPI_2_0
    tGetLocationInfoW,
#endif
    tRequestDrop,
    tRequestMakeCall,
#if TAPI_2_0
    tRequestMakeCallW,
#endif
    tRequestMediaCall,
#if TAPI_2_0
    tRequestMediaCallW,
#endif

    OpenAllLines,
    OpenAllPhones,
    CloseHandl,
    DumpBuffer,
#if (INTERNAL_VER >= 0x20000)
    iNewLocationW,
#endif

    MiscBegin,

    DefValues,
    lCallParams,
    lForwardList

} FUNC_INDEX;


typedef struct _FUNC_PARAM
{
    char far        *szName;

    DWORD           dwType;

    ULONG_PTR       dwValue;

    union
    {
        LPVOID      pLookup;

        char far    *buf;

        LPVOID      ptr;

        ULONG_PTR   dwDefValue;

    } u;

} FUNC_PARAM, *PFUNC_PARAM;


typedef struct _FUNC_PARAM_HEADER
{
    DWORD       dwNumParams;

    FUNC_INDEX  FuncIndex;

    PFUNC_PARAM aParams;

    union
    {
        PFN1    pfn1;
        PFN2    pfn2;
        PFN3    pfn3;
        PFN4    pfn4;
        PFN5    pfn5;
        PFN6    pfn6;
        PFN7    pfn7;
        PFN8    pfn8;
        PFN9    pfn9;
        PFN10   pfn10;
        PFN12   pfn12;

    } u;

} FUNC_PARAM_HEADER, *PFUNC_PARAM_HEADER;


typedef struct _STRUCT_FIELD
{
    char far    *szName;

    DWORD       dwType;

    DWORD       dwValue;

    LPVOID      pLookup;

} STRUCT_FIELD, *PSTRUCT_FIELD;


typedef struct _STRUCT_FIELD_HEADER
{
    LPVOID      pStruct;

    char far    *szName;

    DWORD       dwNumFields;

    PSTRUCT_FIELD   aFields;

} STRUCT_FIELD_HEADER, *PSTRUCT_FIELD_HEADER;


//
// Func prototypes
//

INT_PTR
CALLBACK
MainWndProc(
    HWND    hwnd,
    UINT    msg,
    WPARAM  wParam,
    LPARAM  lParam
    );

void
FAR
ShowStr(
    LPCSTR format,
    ...
    );

void
ShowBytes(
    DWORD   dwSize,
    LPVOID  lp,
    DWORD   dwNumTabs
    );

VOID
CALLBACK
tapiCallback(
    DWORD       hDevice,
    DWORD       dwMsg,
    ULONG_PTR   CallbackInstance,
    ULONG_PTR   Param1,
    ULONG_PTR   Param2,
    ULONG_PTR   Param3
    );

INT_PTR
CALLBACK
ParamsDlgProc(
    HWND hwnd,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam
    );

INT_PTR
CALLBACK
AboutDlgProc(
    HWND hwnd,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam
    );

INT_PTR
CALLBACK
IconDlgProc(
    HWND hwnd,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam
    );

BOOL
IsLineAppSelected(
    void
    );

BOOL
IsLineSelected(
    void
    );

BOOL
IsCallSelected(
    void
    );

BOOL
IsTwoCallsSelected(
    void
    );

BOOL
IsPhoneAppSelected(
    void
    );

BOOL
IsPhoneSelected(
    void
    );

LONG
DoFunc(
    PFUNC_PARAM_HEADER pHeader
    );

INT_PTR
LetUserMungeParams(
    PFUNC_PARAM_HEADER pParamsHeader
    );

void
ShowLineFuncResult(
    LPSTR lpFuncName,
    LONG  lResult
    );

void
FuncDriver(
    FUNC_INDEX funcIndex
    );

void
UpdateWidgetList(
    void
    );

void
InsertWidgetInList(
    PMYWIDGET pNewWidget,
    PMYWIDGET pWidgetInsertBefore
    );

BOOL
RemoveWidgetFromList(
    PMYWIDGET pWidgetToRemove
    );

PMYLINEAPP
AllocLineApp(
    void
    );

PMYLINEAPP
GetLineApp(
    HLINEAPP hLineApp
    );

VOID
FreeLineApp(
    PMYLINEAPP pLineApp
    );

PMYLINE
AllocLine(
    PMYLINEAPP pLineApp
    );

PMYLINE
GetLine(
    HLINE hLine
    );

VOID
FreeLine(
    PMYLINE pLine
    );

PMYCALL
AllocCall(
    PMYLINE pLine
    );

PMYCALL
GetCall(
    HCALL hCall
    );

VOID
FreeCall(
    PMYCALL pCall
    );

VOID
MoveCallToLine(
    PMYCALL pCall,
    HLINE hLine
    );

PMYPHONEAPP
AllocPhoneApp(
    void
    );

PMYPHONEAPP
GetPhoneApp(
    HPHONEAPP hPhoneApp
    );

VOID
FreePhoneApp(
    PMYPHONEAPP pPhoneApp
    );

PMYPHONE
AllocPhone(
    PMYPHONEAPP pPhoneApp
    );

PMYPHONE
GetPhone(
    HPHONE hPhone
    );

VOID
FreePhone(
    PMYPHONE pPhone
    );

int
GetWidgetIndex(
    PMYWIDGET pWidget
    );

void
SelectWidget(
    PMYWIDGET pWidget
    );

void
UpdateResults(
    BOOL bBegin
    );

INT_PTR
CALLBACK
UserButtonsDlgProc(
    HWND hwnd,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam
    );

void
ErrorAlert(
    void
    );

//
// Macros
//

#define CHK_LINEAPP_SELECTED()                      \
        if (!IsLineAppSelected())                   \
        {                                           \
            break;                                  \
        }

#define CHK_LINE_SELECTED()                         \
        if (!IsLineSelected())                      \
        {                                           \
            break;                                  \
        }

#define CHK_CALL_SELECTED()                         \
        if (!IsCallSelected())                      \
        {                                           \
            break;                                  \
        }

#define CHK_TWO_CALLS_SELECTED()                    \
        if (!IsTwoCallsSelected())                  \
        {                                           \
            break;                                  \
        }

#define CHK_PHONEAPP_SELECTED()                     \
        if (!IsPhoneAppSelected())                  \
        {                                           \
            break;                                  \
        }

#define CHK_PHONE_SELECTED()                        \
        if (!IsPhoneSelected())                     \
        {                                           \
            break;                                  \
        }