tspi.c

来自「wince下的源代码集合打包」· C语言 代码 · 共 1,992 行 · 第 1/5 页

C
1,992
字号
/***********************************************************************//**Copyright (c) 1995-2000 Microsoft Corporation.  All rights reserved**//***********************************************************************/////	tapi.c		The Telephony Service Provider Interface////	@doc	EX_TSPI////	@topic	TSPI |////		Tspi Stuff////#include "windows.h"#include "types.h"#include "memory.h"#include "mcx.h"#include "tspi.h"#include "linklist.h"#include "tspip.h"#include "tapicomn.h"#include "config.h"#include "resource.h"TSPIGLOBALS TspiGlobals;const GETIDINFO aGetID[] ={{TEXT("tapi/line"),     STRINGFORMAT_BINARY},                           {TEXT("comm"),          STRINGFORMAT_UNICODE},                           {TEXT("comm/datamodem"),STRINGFORMAT_BINARY},                           {TEXT("ndis"),          STRINGFORMAT_BINARY}};const WCHAR g_szzClassList[] = {TEXT("tapi/line")TEXT("\0")                                TEXT("comm")TEXT("\0")                                TEXT("comm/datamodem")TEXT("\0")                                TEXT("ndis")TEXT("\0\0")};const WCHAR g_szDeviceClass[] = TEXT("com");extern const WCHAR szSettings[];extern const WCHAR szDialSuffix[];HANDLE g_hCoreDLL;// Debug Zones.#ifdef DEBUGDBGPARAM dpCurSettings = {    TEXT("Unimodem"), {        TEXT("Init"),   TEXT("Temp"),       TEXT("Async"),      TEXT(""),        TEXT(""),       TEXT(""),           TEXT(""),           TEXT("Dial"),        TEXT("Thread"), TEXT("Lists"),      TEXT("Call State"), TEXT("Misc"),        TEXT("Alloc"),  TEXT("Function"),   TEXT("Warning"),    TEXT("Error") },    0xC000}; #endifextern BOOL IsAPIReady(DWORD dwAPISet);// **********************************************************************// First, we have the TSPI_provider functions// **********************************************************************LONG TSPIAPITSPI_providerInit(    DWORD             dwTSPIVersion,  // @parm TSPI Version - in    DWORD             dwPermanentProviderID, // @parm Permanent Provider ID - in    DWORD             dwLineDeviceIDBase, // @parm Line Base ID - in    DWORD             dwPhoneDeviceIDBase, // @parm phone Base ID - in    DWORD             dwNumLines,  // @parm Number of lines - in    DWORD             dwNumPhones,  // @parm Number of phones - in    ASYNC_COMPLETION  lpfnCompletionProc, // @parm Pointer to callback - in    LPDWORD           lpdwTSPIOptions // @parm Optional Behaviour Flags - out    ){    DEBUGMSG(ZONE_FUNC|ZONE_INIT,             (TEXT("UNIMODEM:+TSPI_providerInit, dwPPID 0x%X, dwDeviceIDBase 0x%X, dwNumLines 0x%X\n"),              dwPermanentProviderID,              dwLineDeviceIDBase,              dwNumLines));        TspiGlobals.fnCompletionCallback = lpfnCompletionProc;    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerInit\n")));    return SUCCESS;}LONG TSPIAPITSPI_providerInstall(    HWND   hwndOwner,    DWORD  dwPermanentProviderID    ){    DEBUGMSG(ZONE_FUNC|ZONE_INIT,             (TEXT("UNIMODEM:+TSPI_providerInstall, dwPPID 0x%X\n"),              dwPermanentProviderID ));        // Unimodem doesn't really need an install.  Just say OK.    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerInstall\n")));    return SUCCESS;}LONG TSPIAPITSPI_providerShutdown(    DWORD    dwTSPIVersion    ){    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:+TSPI_providerShutdown\n")));    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerShutdown\n")));    return SUCCESS;}LONG TSPIAPI TSPI_providerEnumDevices(    DWORD       dwPermanentProviderID,    LPDWORD     lpdwNumLines,    LPDWORD     lpdwNumPhones,    HPROVIDER   hProvider,    LINEEVENT   lpfnLineCreateProc,    PHONEEVENT  lpfnPhoneCreateProc    ){    DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:+TSPI_providerEnumDevices\n")));    *lpdwNumLines = 0;    // This should be the same event proc that gets passed in to    // lineOpen. but I need it here and now so that I can notify    // TAPI about devices coming and going.  I'll probably go ahead    // and store the per device copy just in case TAPI decides that    // the two funcs should be different for some reason.    TspiGlobals.fnLineEventProc  = lpfnLineCreateProc;    TspiGlobals.dwProviderID     = dwPermanentProviderID;    TspiGlobals.hProvider        = hProvider;        // Note that the only devices that we actually enumerate are    // the external modems.  All other entries are created when the    // device loader loads the physical device and notifies us about    // it.    EnumExternModems();        DEBUGMSG(ZONE_FUNC|ZONE_INIT, (TEXT("UNIMODEM:-TSPI_providerEnumDevices\n")));    return SUCCESS;}// **********************************************************************// Then, we have the TSPI_line functions// **********************************************************************//// This function serves as a stub in the vtbl for any of the TSPI// functions which we choose not to support//LONGTSPIAPITSPI_Unsupported( void ){    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_Unsupported\n")));    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_Unsupported\n")));    return LINEERR_OPERATIONUNAVAIL;}LONGTSPIAPITSPI_lineAccept(    DRV_REQUESTID dwRequestID,    HDRVCALL      hdCall,    LPCSTR        lpsUserUserInfo,    DWORD         dwSize    ){    PTLINEDEV pLineDev;    LONG rc;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineAccept\n")));        if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAccept ** Invalid Call Handle\n")));        rc = LINEERR_INVALCALLHANDLE;        goto exitPoint;    }    if (LINECALLSTATE_OFFERING == pLineDev->dwCallState) {        SetAsyncOp(pLineDev, PENDING_LINEACCEPT);        SetAsyncStatus(pLineDev, 0);        NewCallState(pLineDev, LINECALLSTATE_ACCEPTED, 0);        rc = SetAsyncID(pLineDev, dwRequestID);    } else {        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAccept ** Invalid Call State\n")));        rc = LINEERR_INVALCALLSTATE;    }exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineAccept %x\n"), rc));    return rc;}LONGTSPIAPITSPI_lineAnswer(    DRV_REQUESTID  dwRequestID,    HDRVCALL       hdCall,    LPCSTR         lpsUserUserInfo,    DWORD          dwSize    ){    LONG rc;    PTLINEDEV  pLineDev;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineAnswer\n")));    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAnswer ** Invalid Call Handle\n")));        rc = LINEERR_INVALCALLHANDLE;        goto exitPoint;    }    if ((pLineDev->dwCallState != LINECALLSTATE_OFFERING) &&        (pLineDev->dwCallState != LINECALLSTATE_ACCEPTED)) {        DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineAnswer ** Invalid Call State\n")));        rc = LINEERR_INVALCALLSTATE;        goto exitPoint;    }    rc = ControlThreadCmd(pLineDev, PENDING_LINEANSWER, dwRequestID);    if (!(rc & 0x80000000)) {        rc = SetAsyncID(pLineDev, dwRequestID);    }exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineAnswer %x\n"), rc));    return rc;}   // TSPI_lineAnswer//// Close a specified open line device// LONG TSPIAPITSPI_lineClose(    HDRVLINE hdLine    ){    PTLINEDEV  pLineDev;      DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineClose\n")));    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineClose ** Invalid Line Handle\n")));        return LINEERR_OPERATIONFAILED;    }    EnterCriticalSection(&pLineDev->OpenCS);    pLineDev->dwDetMediaModes = 0;    pLineDev->htLine = NULL;    LeaveCriticalSection(&pLineDev->OpenCS);    if (ControlThreadCmd(pLineDev, PENDING_EXIT, INVALID_PENDINGID)) {        // Make sure that we do not leave anything open        DevlineClose(pLineDev, TRUE);                }    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineClose\n")));    return SUCCESS;}LONG TSPIAPITSPI_lineCloseCall(    HDRVCALL hdCall    ){    LONG rc;    PTLINEDEV  pLineDev;      DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineCloseCall\n")));    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineCloseCall ** Invalid Call Handle\n")));        rc = LINEERR_OPERATIONFAILED;        goto exitPoint;    }    // Mark call as unused    pLineDev->dwCallFlags &= ~(CALL_ALLOCATED|CALL_ACTIVE);    pLineDev->htCall = NULL;    rc = 0;exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineCloseCall\n")));    return rc;}LONG TSPIAPITSPI_lineConditionalMediaDetection(    HDRVLINE hdLine,    DWORD dwMediaModes,    LPLINECALLPARAMS const lpCallParams    ){    LONG rc;    PTLINEDEV  pLineDev;      DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineConditionalMediaDetection\n")));    if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Line Handle\n")));        rc = LINEERR_OPERATIONFAILED;        goto exitPoint;    }    // Check the requested modes. There must be only our media modes.    //    if (dwMediaModes & ~pLineDev->dwMediaModes) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Media Mode\n")));        rc = LINEERR_INVALMEDIAMODE;        goto exitPoint;    }      // Check the call paramaters    //    if ((lpCallParams->dwBearerMode & (~pLineDev->dwBearerModes)) ||        (lpCallParams->dwMediaMode  & (~pLineDev->dwMediaModes)) ||        (lpCallParams->dwAddressMode & (~LINEADDRESSMODE_ADDRESSID))) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Call Params\n")));        rc = LINEERR_INVALCALLPARAMS;        goto exitPoint;    }    if ((lpCallParams->dwAddressType) && (lpCallParams->dwAddressType != LINEADDRESSTYPE_PHONENUMBER)) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineConditionalMediaDetection ** Invalid Call Params Address Type\n")));        rc = LINEERR_INVALCALLPARAMS;        goto exitPoint;    }      rc = 0;exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineConditionalMediaDetection\n")));    return rc;}   // TSPI_lineConditionalMediaDetectionLONG TSPIAPITSPI_lineConfigDialogEdit(    DWORD dwDeviceID,    HWND hwndOwner,     LPCWSTR lpszDeviceClass,    LPVOID const lpDeviceConfigIn,     DWORD dwSize,    LPVARSTRING lpDeviceConfigOut    ){    PTLINEDEV pLineDev;    BYTE cbSize;    DWORD dwRet = SUCCESS;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineConfigDialogEdit\n")));        // Validate the input/output buffer    //    if (lpDeviceConfigOut == NULL) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit Invalid lpDeviceConfigOut\n")));        return LINEERR_INVALPOINTER;    }    if (lpDeviceConfigIn == NULL) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit Invalid lpDeviceConfigIn\n")));        return LINEERR_INVALPOINTER;    }    if (lpDeviceConfigOut->dwTotalSize < sizeof(VARSTRING)) {        DEBUGMSG(ZONE_FUNC|ZONE_ERROR, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit lpDeviceConfigOut too small\n")));        return LINEERR_STRUCTURETOOSMALL;    }    // Validate the requested device class    //    if (lpszDeviceClass != NULL)    {        if (!ValidateDevCfgClass(lpszDeviceClass))            return LINEERR_INVALDEVICECLASS;    };    // Validate the device ID    //    if ((pLineDev = GetLineDevfromID(dwDeviceID)) == NULL)        return LINEERR_NODEVICE;    // Validate the device configuration structure    //    if (pLineDev->DevMiniCfg.wVersion != ((PDEVMINICFG)lpDeviceConfigIn)->wVersion)        return LINEERR_INVALPARAM;    // Set the output buffer size    //

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?