⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavetsp.cpp

📁 使用环境VC++ 6.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:

    pac->dwCallFeatures         = LINECALLFEATURE_DIAL |
                                  LINECALLFEATURE_DROP |
                                  LINECALLFEATURE_GENERATEDIGITS;

    pac->dwAddressFeatures      = LINEADDRFEATURE_MAKECALL;
    
    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetID(
    HDRVLINE    hdLine,
    DWORD       dwAddressID,
    HDRVCALL    hdCall,
    DWORD       dwSelect,
    LPVARSTRING pDeviceID,
    LPCWSTR     pszDeviceClass,
    HANDLE      hTargetProcess)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetID")
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(dwAddressID)
        DWORD_IN_ENTRY(hdCall)
        DWORD_IN_ENTRY(dwSelect)
        DWORD_IN_ENTRY(pDeviceID)
        STRING_IN_ENTRY(pszDeviceClass)
        DWORD_IN_ENTRY(hTargetProcess)
    END_PARAM_TABLE()
    
    LONG    tr = LINEERR_NODEVICE;

    /*
    // TAPI handles "tapi/line" and "tapi/phone",
    // so long as this function is present and returns LINEERR_NODEVICE

    LONG        tr = 0;
    CtspCall*   pCall = (dwSelect == LINECALLSELECT_CALL ? (CtspCall*)hdCall : 0);
    CtspLine*   pLine = (dwSelect == LINECALLSELECT_LINE ? (CtspLine*)hdLine : (pCall ? pCall->GetLine() : 0));

    if( lstrcmpiW(pszDeviceClass, L"tapi/line") == 0 )
    {
        pDeviceID->dwNeededSize = sizeof(VARSTRING) + sizeof(DWORD);

        if( pDeviceID->dwNeededSize <= pDeviceID->dwTotalSize )
        {
            pDeviceID->dwUsedSize      = pDeviceID->dwNeededSize;
            pDeviceID->dwStringFormat  = STRINGFORMAT_BINARY;
            pDeviceID->dwStringSize    = sizeof(DWORD);
            pDeviceID->dwStringOffset  = sizeof(VARSTRING);
            
            *((LPDWORD)(pDeviceID + 1)) = pLine->GetDeviceID();
        }
        else
        {
            pDeviceID->dwUsedSize = 3 * sizeof(DWORD);
            tr = LINEERR_STRUCTURETOOSMALL;
        }
    }
    else
    {
        tr = LINEERR_NODEVICE;
    }
    */
    
    return EPILOG(tr);
}

LONG TSPIAPI TSPI_lineOpen(
    DWORD       dwDeviceID,
    HTAPILINE   htLine,
    LPHDRVLINE  phdLine,
    DWORD       dwTSPIVersion,
    LINEEVENT   pfnEventProc)
{
    BEGIN_PARAM_TABLE("TSPI_lineOpen")
        DWORD_IN_ENTRY(dwDeviceID)
        DWORD_IN_ENTRY(htLine)
        DWORD_OUT_ENTRY(phdLine)
        DWORD_IN_ENTRY(dwTSPIVersion)
        DWORD_IN_ENTRY(pfnEventProc)
    END_PARAM_TABLE()
    
    LONG        tr = LINEERR_NOMEM;
    CtspLine*   pLine = new CtspLine(htLine, pfnEventProc, dwDeviceID);

    if( pLine )
    {
        *phdLine = (HDRVLINE)pLine;
        tr = 0;
    }
    
    return EPILOG(tr);
}

LONG TSPIAPI TSPI_lineSetDefaultMediaDetection(
    HDRVLINE    hdLine,
    DWORD       dwMediaModes)
{
    BEGIN_PARAM_TABLE("TSPI_lineSetDefaultMediaDetection")
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(dwMediaModes)
    END_PARAM_TABLE()
    
    // This function is required, or TAPISRV will crash
    // if any application attempts to open this line
    // for incoming calls (sigh)
    return EPILOG(LINEERR_OPERATIONUNAVAIL);
}

LONG TSPIAPI TSPI_lineGetNumAddressIDs(
    HDRVLINE    hdLine,
    LPDWORD     pdwNumAddressIDs)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetNumAddressIDs")
        DWORD_IN_ENTRY(hdLine)
        DWORD_OUT_ENTRY(pdwNumAddressIDs)
    END_PARAM_TABLE()
    
    // We only support 1 address (id=0)
    *pdwNumAddressIDs = 1;
    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineClose(
    HDRVLINE    hdLine)
{
    BEGIN_PARAM_TABLE("TSPI_lineClose")
        DWORD_IN_ENTRY(hdLine)
    END_PARAM_TABLE()

    delete (CtspLine*)hdLine;

    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineMakeCall(
    DRV_REQUESTID       dwRequestID,
    HDRVLINE            hdLine,
    HTAPICALL           htCall,
    LPHDRVCALL          phdCall,
    LPCWSTR             pszDestAddress,
    DWORD               dwCountryCode,
    LPLINECALLPARAMS    const pCallParams)
{
    BEGIN_PARAM_TABLE("TSPI_lineMakeCall")
        DWORD_IN_ENTRY(dwRequestID)
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(htCall)
        DWORD_OUT_ENTRY(phdCall)
        STRING_IN_ENTRY(pszDestAddress)
        DWORD_IN_ENTRY(dwCountryCode)
        DWORD_IN_ENTRY(pCallParams)
    END_PARAM_TABLE()

    LONG        tr;
    CtspLine*   pLine = (CtspLine*)hdLine;
    tr = pLine->MakeCall(dwRequestID, htCall, phdCall, pszDestAddress, dwCountryCode, pCallParams);
    return EPILOG(tr);
}

LONG TSPIAPI TSPI_lineSetStatusMessages(
    HDRVLINE    hdLine,
    DWORD       dwLineStates,
    DWORD       dwAddressStates)
{
    BEGIN_PARAM_TABLE("TSPI_lineSetStatusMessages")
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(dwLineStates)
        DWORD_IN_ENTRY(dwAddressStates)
    END_PARAM_TABLE()

    // Since we don't ever send status messages of any kind
    // we're happy at any limit. However, some apps require
    // that this function return successfully before a call
    // can be made, e.g. Outlook 98.

    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineDrop(
    DRV_REQUESTID   dwRequestID,
    HDRVCALL        hdCall,
    LPCSTR          psUserUserInfo,
    DWORD           dwSize)
{
    BEGIN_PARAM_TABLE("TSPI_lineDrop")
        DWORD_IN_ENTRY(dwRequestID)
        DWORD_IN_ENTRY(hdCall)
        DWORD_IN_ENTRY(psUserUserInfo)
        DWORD_IN_ENTRY(dwSize)
    END_PARAM_TABLE()

    CtspCall*   pCall = (CtspCall*)hdCall;

    pCall->Drop();
    g_pfnCompletionProc(dwRequestID, 0);

    return EPILOG(dwRequestID);
}

LONG TSPIAPI TSPI_lineCloseCall(
    HDRVCALL    hdCall)
{
    BEGIN_PARAM_TABLE("TSPI_lineCloseCall")
        DWORD_IN_ENTRY(hdCall)
    END_PARAM_TABLE()

    // Note that in TAPI 2.0 TSPI_lineCloseCall can get called
    // without TSPI_lineDrop ever being called, so we need to
    // be prepared for either case.
    CtspCall*   pCall = (CtspCall*)hdCall;

    pCall->Drop();
    delete pCall;

    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetAddressStatus(
    HDRVLINE            hdLine,
    DWORD               dwAddressID,
    LPLINEADDRESSSTATUS pas)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetAddressStatus")
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(dwAddressID)
        DWORD_IN_ENTRY(pas)
    END_PARAM_TABLE()

    pas->dwNeededSize = sizeof(LINEADDRESSSTATUS);
    pas->dwUsedSize   = sizeof(LINEADDRESSSTATUS);
    pas->dwNumActiveCalls  = ((CtspLine*)hdLine)->GetNumActiveCalls();
    pas->dwAddressFeatures = LINEADDRFEATURE_MAKECALL;
    
    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetCallAddressID(
    HDRVCALL    hdCall,
    LPDWORD     pdwAddressID)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetCallAddressID")
        DWORD_IN_ENTRY(hdCall)
        DWORD_OUT_ENTRY(pdwAddressID)
    END_PARAM_TABLE()

    // We only support 1 address (id=0)
    *pdwAddressID = 0;

    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetCallInfo(
    HDRVCALL        hdCall,
    LPLINECALLINFO  pli)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetCallInfo")
        DWORD_IN_ENTRY(hdCall)
        DWORD_IN_ENTRY(pli)
    END_PARAM_TABLE()

    pli->dwNeededSize           = sizeof(LINECALLINFO);
    pli->dwUsedSize             = sizeof(LINECALLINFO);
    
    pli->dwBearerMode           = LINEBEARERMODE_VOICE;
    pli->dwMediaMode            = LINEMEDIAMODE_INTERACTIVEVOICE;
    pli->dwCallStates           = LINECALLSTATE_IDLE |
                                  LINECALLSTATE_DIALING |
                                  LINECALLSTATE_CONNECTED |
                                  LINECALLSTATE_PROCEEDING |
                                  LINECALLSTATE_UNKNOWN;

    pli->dwOrigin               = LINECALLORIGIN_OUTBOUND;
    pli->dwReason               = LINECALLREASON_DIRECT;
    pli->dwCallerIDFlags        = LINECALLPARTYID_UNAVAIL;
    pli->dwCalledIDFlags        = LINECALLPARTYID_UNAVAIL;
    pli->dwConnectedIDFlags     = LINECALLPARTYID_UNAVAIL;
    pli->dwRedirectionIDFlags   = LINECALLPARTYID_UNAVAIL;
    pli->dwRedirectingIDFlags   = LINECALLPARTYID_UNAVAIL;
    
    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetCallStatus(
    HDRVCALL            hdCall,
    LPLINECALLSTATUS    pls)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetCallStatus")
        DWORD_IN_ENTRY(hdCall)
        DWORD_IN_ENTRY(pls)
    END_PARAM_TABLE()

    CtspCall*   pCall = (CtspCall*)hdCall;

    pls->dwNeededSize = sizeof(LINECALLSTATUS);
    pls->dwUsedSize   = sizeof(LINECALLSTATUS);
    pls->dwCallState  = pCall->GetCallState();
    
    if( pls->dwCallState != LINECALLSTATE_IDLE )
    {
        pls->dwCallFeatures = LINECALLFEATURE_DROP;
    }
    
    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetLineDevStatus(
    HDRVLINE        hdLine,
    LPLINEDEVSTATUS plds)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetLineDevStatus")
        DWORD_IN_ENTRY(hdLine)
        DWORD_IN_ENTRY(plds)
    END_PARAM_TABLE()

    plds->dwUsedSize        = sizeof(LINEDEVSTATUS);
    plds->dwNeededSize      = sizeof(LINEDEVSTATUS);
    
    plds->dwNumActiveCalls  = ((CtspLine*)hdLine)->GetNumActiveCalls();
    plds->dwDevStatusFlags  = LINEDEVSTATUSFLAGS_CONNECTED |
                              LINEDEVSTATUSFLAGS_INSERVICE;

    return EPILOG(0);
}

LONG TSPIAPI TSPI_lineGetIcon(
    DWORD   dwDeviceID,
    LPCWSTR lpszDeviceClass,  
    LPHICON lphIcon)
{
    BEGIN_PARAM_TABLE("TSPI_lineGetIcon")
        DWORD_IN_ENTRY(dwDeviceID)
        STRING_IN_ENTRY(lpszDeviceClass)
        DWORD_OUT_ENTRY(lphIcon)
    END_PARAM_TABLE()

    *lphIcon = LoadIcon(g_hinst, MAKEINTRESOURCE(IDI_WAVETSP));

    return EPILOG(0);
}

⌨️ 快捷键说明

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