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

Copyright (c) 1995-1998  Microsoft Corporation

Module Name:

    espexe.h

Abstract:



Author:

    Dan Knudson (DanKn)    15-Sep-1995

Revision History:

--*/


#include "windows.h"
#include "tapi.h"
#include "tspi.h"
#include "..\tsp\intrface.h"
#include "resource.h"
#include "espidl.h"


#define MAX_STRING_PARAM_SIZE   32

#define PT_DWORD                1
#define PT_FLAGS                2
#define PT_STRING               3
#define PT_ORDINAL              4

typedef struct _MYWIDGET
{
    DWORD               dwWidgetID;

    DWORD               dwWidgetType;

    ULONG_PTR           hdXxx;

    ULONG_PTR           htXxx;

    DWORD               dwCallState;

    DWORD               dwCallAddressID;

    struct _MYWIDGET   *pPrev;

    struct _MYWIDGET   *pNext;

} MYWIDGET, *PMYWIDGET;


typedef struct _LOOKUP
{
    DWORD               dwVal;

    char far           *pszVal;

} LOOKUP, *PLOOKUP;


typedef struct _PBXSETTING
{
    DWORD               dwNumber;

    LPCSTR              pszEvent;

    DWORD               dwTime;

} PBXSETTING, *PPBXSETTING;


typedef struct _EVENT_PARAM
{
    char far           *szName;

    DWORD               dwType;

    ULONG_PTR           dwValue;

    union
    {
        PLOOKUP         pLookup;

        char far       *buf;

        LPVOID          ptr;

        ULONG_PTR       dwDefValue;

    };

} EVENT_PARAM, far *PEVENT_PARAM;


typedef struct _EVENT_PARAM_HEADER
{
    DWORD               dwNumParams;

    LPSTR               pszDlgTitle;

    DWORD               dwEventType;

    PEVENT_PARAM        aParams;

} EVENT_PARAM_HEADER, far *PEVENT_PARAM_HEADER;



LOOKUP aPBXNumbers[] =
{
    { 0,    "0"     },
    { 1,    "1"     },
    { 2,    "2"     },
    { 5,    "5"     },
    { 10,   "10"    },
    { 20,   "20"    },
    { 50,   "50"    },
    { 100,  "100"   },
    { 200,  "200"   },
    { 500,  "500"   },
    { 1000, "1000"  },
    { 0,    NULL    }
};


LOOKUP aPBXTimes[] =
{
    { 1000,      "second" },
    { 60000,     "minute" },
    { 3600000,   "hour"   },
    { 86400000,  "day"    },
    { 604800000, "week"   },
    { 0,         NULL     }
};


#define NUM_PBXSETTINGS 2


PBXSETTING gPBXSettings[NUM_PBXSETTINGS] =
{
    { 0, "incoming calls", 0 },
    { 0, "disconnections", 0 }
};


LOOKUP aCallStates[] =
{
    { LINECALLSTATE_IDLE               ,"IDLE"               },
    { LINECALLSTATE_OFFERING           ,"OFFERING"           },
    { LINECALLSTATE_ACCEPTED           ,"ACCEPTED"           },
    { LINECALLSTATE_DIALTONE           ,"DIALTONE"           },
    { LINECALLSTATE_DIALING            ,"DIALING"            },
    { LINECALLSTATE_RINGBACK           ,"RINGBACK"           },
    { LINECALLSTATE_BUSY               ,"BUSY"               },
    { LINECALLSTATE_SPECIALINFO        ,"SPECIALINFO"        },
    { LINECALLSTATE_CONNECTED          ,"CONNECTED"          },
    { LINECALLSTATE_PROCEEDING         ,"PROCEEDING"         },
    { LINECALLSTATE_ONHOLD             ,"ONHOLD"             },
    { LINECALLSTATE_CONFERENCED        ,"CONFERENCED"        },
    { LINECALLSTATE_ONHOLDPENDCONF     ,"ONHOLDPENDCONF"     },
    { LINECALLSTATE_ONHOLDPENDTRANSFER ,"ONHOLDPENDTRANSFER" },
    { LINECALLSTATE_DISCONNECTED       ,"DISCONNECTED"       },
    { LINECALLSTATE_UNKNOWN            ,"UNKNOWN"            },
    { 0xffffffff                       ,""                   }
};


LOOKUP aLineErrs[] =
{
    { 0                                ,"<SUCCESS>"              },
    { LINEERR_ALLOCATED                ,"ALLOCATED"              },
    { LINEERR_BADDEVICEID              ,"BADDEVICEID"            },
    { LINEERR_BEARERMODEUNAVAIL        ,"BEARERMODEUNAVAIL"      },
    { LINEERR_CALLUNAVAIL              ,"CALLUNAVAIL"            },
    { LINEERR_COMPLETIONOVERRUN        ,"COMPLETIONOVERRUN"      },
    { LINEERR_CONFERENCEFULL           ,"CONFERENCEFULL"         },
    { LINEERR_DIALBILLING              ,"DIALBILLING"            },
    { LINEERR_DIALDIALTONE             ,"DIALDIALTONE"           },
    { LINEERR_DIALPROMPT               ,"DIALPROMPT"             },
    { LINEERR_DIALQUIET                ,"DIALQUIET"              },
    { LINEERR_INCOMPATIBLEAPIVERSION   ,"INCOMPATIBLEAPIVERSION" },
    { LINEERR_INCOMPATIBLEEXTVERSION   ,"INCOMPATIBLEEXTVERSION" },
    { LINEERR_INIFILECORRUPT           ,"INIFILECORRUPT"         },
    { LINEERR_INUSE                    ,"INUSE"                  },
    { LINEERR_INVALADDRESS             ,"INVALADDRESS"           },
    { LINEERR_INVALADDRESSID           ,"INVALADDRESSID"         },
    { LINEERR_INVALADDRESSMODE         ,"INVALADDRESSMODE"       },
    { LINEERR_INVALADDRESSSTATE        ,"INVALADDRESSSTATE"      },
    { LINEERR_INVALAPPHANDLE           ,"INVALAPPHANDLE"         },
    { LINEERR_INVALAPPNAME             ,"INVALAPPNAME"           },
    { LINEERR_INVALBEARERMODE          ,"INVALBEARERMODE"        },
    { LINEERR_INVALCALLCOMPLMODE       ,"INVALCALLCOMPLMODE"     },
    { LINEERR_INVALCALLHANDLE          ,"INVALCALLHANDLE"        },
    { LINEERR_INVALCALLPARAMS          ,"INVALCALLPARAMS"        },
    { LINEERR_INVALCALLPRIVILEGE       ,"INVALCALLPRIVILEGE"     },
    { LINEERR_INVALCALLSELECT          ,"INVALCALLSELECT"        },
    { LINEERR_INVALCALLSTATE           ,"INVALCALLSTATE"         },
    { LINEERR_INVALCALLSTATELIST       ,"INVALCALLSTATELIST"     },
    { LINEERR_INVALCARD                ,"INVALCARD"              },
    { LINEERR_INVALCOMPLETIONID        ,"INVALCOMPLETIONID"      },
    { LINEERR_INVALCONFCALLHANDLE      ,"INVALCONFCALLHANDLE"    },
    { LINEERR_INVALCONSULTCALLHANDLE   ,"INVALCONSULTCALLHANDLE" },
    { LINEERR_INVALCOUNTRYCODE         ,"INVALCOUNTRYCODE"       },
    { LINEERR_INVALDEVICECLASS         ,"INVALDEVICECLASS"       },
    { LINEERR_INVALDEVICEHANDLE        ,"INVALDEVICEHANDLE"      },
    { LINEERR_INVALDIALPARAMS          ,"INVALDIALPARAMS"        },
    { LINEERR_INVALDIGITLIST           ,"INVALDIGITLIST"         },
    { LINEERR_INVALDIGITMODE           ,"INVALDIGITMODE"         },
    { LINEERR_INVALDIGITS              ,"INVALDIGITS"            },
    { LINEERR_INVALEXTVERSION          ,"INVALEXTVERSION"        },
    { LINEERR_INVALGROUPID             ,"INVALGROUPID"           },
    { LINEERR_INVALLINEHANDLE          ,"INVALLINEHANDLE"        },
    { LINEERR_INVALLINESTATE           ,"INVALLINESTATE"         },
    { LINEERR_INVALLOCATION            ,"INVALLOCATION"          },
    { LINEERR_INVALMEDIALIST           ,"INVALMEDIALIST"         },
    { LINEERR_INVALMEDIAMODE           ,"INVALMEDIAMODE"         },
    { LINEERR_INVALMESSAGEID           ,"INVALMESSAGEID"         },
    { LINEERR_INVALPARAM               ,"INVALPARAM"             },
    { LINEERR_INVALPARKID              ,"INVALPARKID"            },
    { LINEERR_INVALPARKMODE            ,"INVALPARKMODE"          },
    { LINEERR_INVALPOINTER             ,"INVALPOINTER"           },
    { LINEERR_INVALPRIVSELECT          ,"INVALPRIVSELECT"        },
    { LINEERR_INVALRATE                ,"INVALRATE"              },
    { LINEERR_INVALREQUESTMODE         ,"INVALREQUESTMODE"       },
    { LINEERR_INVALTERMINALID          ,"INVALTERMINALID"        },
    { LINEERR_INVALTERMINALMODE        ,"INVALTERMINALMODE"      },
    { LINEERR_INVALTIMEOUT             ,"INVALTIMEOUT"           },
    { LINEERR_INVALTONE                ,"INVALTONE"              },
    { LINEERR_INVALTONELIST            ,"INVALTONELIST"          },
    { LINEERR_INVALTONEMODE            ,"INVALTONEMODE"          },
    { LINEERR_INVALTRANSFERMODE        ,"INVALTRANSFERMODE"      },
    { LINEERR_LINEMAPPERFAILED         ,"LINEMAPPERFAILED"       },
    { LINEERR_NOCONFERENCE             ,"NOCONFERENCE"           },
    { LINEERR_NODEVICE                 ,"NODEVICE"               },
    { LINEERR_NODRIVER                 ,"NODRIVER"               },
    { LINEERR_NOMEM                    ,"NOMEM"                  },
    { LINEERR_NOREQUEST                ,"NOREQUEST"              },
    { LINEERR_NOTOWNER                 ,"NOTOWNER"               },
    { LINEERR_NOTREGISTERED            ,"NOTREGISTERED"          },
    { LINEERR_OPERATIONFAILED          ,"OPERATIONFAILED"        },
    { LINEERR_OPERATIONUNAVAIL         ,"OPERATIONUNAVAIL"       },
    { LINEERR_RATEUNAVAIL              ,"RATEUNAVAIL"            },
    { LINEERR_RESOURCEUNAVAIL          ,"RESOURCEUNAVAIL"        },
    { LINEERR_REQUESTOVERRUN           ,"REQUESTOVERRUN"         },
    { LINEERR_STRUCTURETOOSMALL        ,"STRUCTURETOOSMALL"      },
    { LINEERR_TARGETNOTFOUND           ,"TARGETNOTFOUND"         },
    { LINEERR_TARGETSELF               ,"TARGETSELF"             },
    { LINEERR_UNINITIALIZED            ,"UNINITIALIZED"          },
    { LINEERR_USERUSERINFOTOOBIG       ,"USERUSERINFOTOOBIG"     },
    { LINEERR_REINIT                   ,"REINIT"                 },
    { LINEERR_ADDRESSBLOCKED           ,"ADDRESSBLOCKED"         },
    { LINEERR_BILLINGREJECTED          ,"BILLINGREJECTED"        },
    { LINEERR_INVALFEATURE             ,"INVALFEATURE"           },
    { LINEERR_NOMULTIPLEINSTANCE       ,"NOMULTIPLEINSTANCE"     },
    { 0xffffffff                       ,""                   }
};


LOOKUP aLineMsgs[] =
{
    { LINE_ADDRESSSTATE                ,"ADDRESSSTATE"           },
    { LINE_CALLDEVSPECIFIC             ,"CALLDEVSPECIFIC"        },
    { LINE_CALLDEVSPECIFICFEATURE      ,"CALLDEVSPECIFICFEATURE" },
    { LINE_CREATEDIALOGINSTANCE        ,"CREATEDIALOGINSTANCE"   },
    { LINE_CLOSE                       ,"CLOSE"                  },
    { LINE_DEVSPECIFIC                 ,"DEVSPECIFIC"            },
    { LINE_DEVSPECIFICFEATURE          ,"DEVSPECIFICFEATURE"     },
    { LINE_GATHERDIGITS                ,"GATHERDIGITS"           },
    { LINE_GENERATE                    ,"GENERATE"               },
    { LINE_LINEDEVSTATE                ,"LINEDEVSTATE"           },
    { LINE_MONITORDIGITS               ,"MONITORDIGITS"          },
    { LINE_MONITORMEDIA                ,"MONITORMEDIA"           },
    { LINE_MONITORTONE                 ,"MONITORTONE"            },
    { LINE_CREATE                      ,"CREATE"                 },
    { LINE_REMOVE                      ,"REMOVE"                 },
    { LINE_SENDDIALOGINSTANCEDATA      ,"SENDDIALOGINSTANCEDATA" },
    { 0xffffffff                       ,""                       }
};


LOOKUP aPhoneMsgs[] =
{
    { PHONE_BUTTON                     ,"BUTTON"                 },
    { PHONE_CLOSE                      ,"CLOSE"                  },
    { PHONE_DEVSPECIFIC                ,"DEVSPECIFIC"            },
    { PHONE_STATE                      ,"STATE"                  },
    { PHONE_CREATE                     ,"CREATE"                 },
    { PHONE_REMOVE                     ,"REMOVE"                 },
    { 0xffffffff                       ,""                       }
};


LOOKUP aVersions[] =
{
    { 0x00010003                       ,"1.0"                    },
    { 0x00010004                       ,"1.4"                    },
    { 0x00020000                       ,"2.0"                    },
    { 0x00020001                       ,"2.1"                    },
    { 0x00020002                       ,"2.2"                    },
    { 0x00030000                       ,"3.0"                    },
    { 0x00030001                       ,"3.1"                    },
    { 0xffffffff                       ,""                       }
};


BOOL        gbESPLoaded = FALSE;
            gbPBXThreadRunning,
            gbAutoClose,
            gbDisableUI;
LONG        cxList1,
            cxWnd;
HWND        ghwndMain,
            ghwndList1,
            ghwndList2,
            ghwndEdit;
DWORD       gdwTSPIVersion,
            gdwNumLines,
            gdwNumAddrsPerLine,
            gdwNumCallsPerAddr,
            gdwNumPhones,
            gdwDebugOptions,
            gdwCompletionMode,
            gbAutoGatherGenerateMsgs;
HMENU       ghMenu;
HINSTANCE   ghInstance;
PMYWIDGET   gpWidgets;

char        szMySection[] = "ESP32";

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

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

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

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

void
ProcessWidgetEvent(
    PWIDGETEVENT    pEvent
    );

void
UpdateESPOptions(
    void
    );

void
SaveIniFileSettings(
    void
    );

void
xxxShowStr(
    char   *psz
    );

void
ShowStr(
    char   *pszFormat,
    ...
    );

LPVOID
MyAlloc(
    size_t numBytes
    );

void
MyFree(
    LPVOID  p
    );

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