tspi.c

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

C
1,992
字号
    lpCallInfo->dwAddressType = LINEADDRESSTYPE_PHONENUMBER;    exitPoint:      DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetCallInfo %x\n"), rc));    return rc;}   // TSPI_lineGetCallInfoLONGTSPIAPITSPI_lineGetCallStatus(    HDRVCALL hdCall,    LPLINECALLSTATUS lpCallStatus    ){    PTLINEDEV  pLineDev;    LONG rc;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetCallStatus\n")));        InitVarData((LPVOID)lpCallStatus, sizeof(LINECALLSTATUS));        if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) {        DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetCallStatus Invalid hdCall\n")));        rc = LINEERR_INVALCALLHANDLE;        goto exitPoint;    }        rc = 0;    //    // Current call information    //    lpCallStatus->dwCallState     = pLineDev->dwCallState;    lpCallStatus->dwCallStateMode = pLineDev->dwCallStateMode;        // if we are in takeover mode, disallow all dwCallFeatures    if (!pLineDev->fTakeoverMode) {        switch(lpCallStatus->dwCallState) {        case LINECALLSTATE_OFFERING:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_ACCEPT |            LINECALLFEATURE_SETCALLPARAMS |            LINECALLFEATURE_DROP;            // We can only answer if a possible media mode is DATAMODEM.            if (pLineDev->dwCurMediaModes & LINEMEDIAMODE_DATAMODEM) {                lpCallStatus->dwCallFeatures |= LINECALLFEATURE_ANSWER;            }            break;                case LINECALLSTATE_DIALTONE:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_DROP;            break;                case LINECALLSTATE_DIALING:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_DROP;            if (DEVST_PORTCONNECTWAITFORLINEDIAL == pLineDev->DevState) {                lpCallStatus->dwCallFeatures |= LINECALLFEATURE_DIAL;            }            break;                case LINECALLSTATE_ACCEPTED:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_SETCALLPARAMS|LINECALLFEATURE_DROP;            // We can only answer if a possible media mode is DATAMODEM.            if (pLineDev->dwCurMediaModes & LINEMEDIAMODE_DATAMODEM) {                lpCallStatus->dwCallFeatures |= LINECALLFEATURE_ANSWER;            }            break;                case LINECALLSTATE_CONNECTED:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_SETCALLPARAMS |            LINECALLFEATURE_DROP;            break;                case LINECALLSTATE_UNKNOWN:        case LINECALLSTATE_PROCEEDING:        case LINECALLSTATE_DISCONNECTED:            lpCallStatus->dwCallFeatures  = LINECALLFEATURE_DROP;            break;                case LINECALLSTATE_IDLE:        default:            lpCallStatus->dwCallFeatures  = 0;            break;        }    }exitPoint:    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetCallStatus %x\n"), rc));    return rc;}   // TSPI_lineGetCallStatusstatic const WCHAR szProviderName[] = TEXT("UNIMODEM");//// Determine Telephony capabilites for the specified device.//// NOTES:// WinCE UNIMODEM uses a DWORD of DevSpecific information (denoted by// LINEDEVCAPS.dwDevSpecificSize and LINEDEVCAPS.dwDevSpecificOffset).// The format of of these 4 bytes is that the first WORD is a device type// and the second WORD is an "active" indicator (0 for PC card modems that// have been removed).//// The provider name is stored in the ProviderInfo section (denoted by// LINEDEVCAPS.dwProviderInfoSize and LINEDEVCAPS.dwProviderInfoOffset).// LONG TSPIAPITSPI_lineGetDevCaps(    DWORD dwDeviceID,    DWORD dwTSPIVersion,    DWORD dwExtVersion,    LPLINEDEVCAPS lpLineDevCaps    ){    PTLINEDEV pLineDev;    int  cbLineNameLen = 0;    int  cbProviderNameLen = 0;    int  cbDevClassLen = 0;    int cbAvailMem = 0;    DWORD dwRet = SUCCESS;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetDevCaps\n")));    InitVarData((LPVOID)lpLineDevCaps, sizeof(LINEDEVCAPS));     // We need to fill in a device caps struct specific to     // the device.    if ((pLineDev = GetLineDevfromID ((DWORD)dwDeviceID)) == NULL)        return LINEERR_NODEVICE;    // Check to see how much memory we'll need.    cbLineNameLen = (wcslen(pLineDev->szFriendlyName) + 1) * sizeof(WCHAR);    cbProviderNameLen = (wcslen(szProviderName) + 1) * sizeof(WCHAR);    cbDevClassLen = sizeof(g_szzClassList);        cbAvailMem = (int) (lpLineDevCaps->dwTotalSize - lpLineDevCaps->dwUsedSize);      // Enter the size we ideally need.    lpLineDevCaps->dwNeededSize = lpLineDevCaps->dwUsedSize +        cbLineNameLen +         // room for linename        cbProviderNameLen +     // room for provider name        cbDevClassLen +         // room for device class list        (2*sizeof(WORD));       // and room for DevSpecific info        if (cbAvailMem >= sizeof(DWORD) )    {        *(LPWORD)((LPSTR)lpLineDevCaps + lpLineDevCaps->dwUsedSize) = pLineDev->wDeviceType;        *((LPWORD)((LPSTR)lpLineDevCaps + lpLineDevCaps->dwUsedSize) + 1) = pLineDev->wDeviceAvail;                DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:TSPI_lineGetDevCaps Storing Device Type x%X, available x%X\n"),                  pLineDev->wDeviceType,                  pLineDev->wDeviceAvail));        lpLineDevCaps->dwDevSpecificSize = sizeof( DWORD );        lpLineDevCaps->dwDevSpecificOffset = lpLineDevCaps->dwUsedSize;                lpLineDevCaps->dwUsedSize += lpLineDevCaps->dwDevSpecificSize;        cbAvailMem -= lpLineDevCaps->dwDevSpecificSize;    }    else    {        lpLineDevCaps->dwDevSpecificSize = 0;        lpLineDevCaps->dwDevSpecificOffset = 0;        lpLineDevCaps->dwNeededSize += sizeof(WORD);    }         // If the provider info fits, then also append the line name    if (cbAvailMem >= cbLineNameLen)    {        wcscpy((LPWSTR)((LPSTR)lpLineDevCaps + lpLineDevCaps->dwUsedSize),                pLineDev->szFriendlyName);        lpLineDevCaps->dwLineNameSize = cbLineNameLen;        lpLineDevCaps->dwLineNameOffset = lpLineDevCaps->dwUsedSize;        lpLineDevCaps->dwUsedSize += cbLineNameLen;        cbAvailMem -= cbLineNameLen;    }    else    {        lpLineDevCaps->dwLineNameSize = 0;        lpLineDevCaps->dwLineNameOffset = 0;    }    if (cbAvailMem >= cbProviderNameLen)    {        wcscpy((LPWSTR)((LPSTR)lpLineDevCaps + lpLineDevCaps->dwUsedSize), szProviderName);        lpLineDevCaps->dwProviderInfoSize = cbProviderNameLen;        lpLineDevCaps->dwProviderInfoOffset = lpLineDevCaps->dwUsedSize;        lpLineDevCaps->dwUsedSize += cbProviderNameLen;        cbAvailMem -= cbProviderNameLen;    }    else    {        lpLineDevCaps->dwProviderInfoSize = 0;        lpLineDevCaps->dwProviderInfoOffset = 0;    }         // TODO - We don't have permanent ID's yet.    lpLineDevCaps->dwPermanentLineID = 0;    lpLineDevCaps->dwStringFormat = STRINGFORMAT_UNICODE;    lpLineDevCaps->dwAddressModes = LINEADDRESSMODE_ADDRESSID;    lpLineDevCaps->dwNumAddresses = 1;     // Bearer mode & information    lpLineDevCaps->dwMaxRate      = pLineDev->dwMaxDCERate;    lpLineDevCaps->dwBearerModes  = pLineDev->dwBearerModes;     // Media mode    lpLineDevCaps->dwMediaModes = pLineDev->dwMediaModes;    // We can simulate wait-for-bong if the modem isn't capable of    // supporting it.    lpLineDevCaps->dwDevCapFlags  = pLineDev->dwDevCapFlags |        LINEDEVCAPFLAGS_DIALBILLING |        LINEDEVCAPFLAGS_CLOSEDROP;    lpLineDevCaps->dwRingModes         = 1;    lpLineDevCaps->dwMaxNumActiveCalls = 1;     // Line device state to be notified    lpLineDevCaps->dwLineStates = LINEDEVSTATE_CONNECTED |        LINEDEVSTATE_DISCONNECTED |        LINEDEVSTATE_OPEN |        LINEDEVSTATE_CLOSE |        LINEDEVSTATE_INSERVICE |        LINEDEVSTATE_OUTOFSERVICE |        LINEDEVSTATE_REMOVED |        LINEDEVSTATE_RINGING |        LINEDEVSTATE_REINIT;    lpLineDevCaps->dwLineFeatures = LINEFEATURE_MAKECALL;    //    // Don't go beyond older version app's buffer    //    if (lpLineDevCaps->dwTotalSize >= sizeof(LINEDEVCAPS)) {        lpLineDevCaps->dwSettableDevStatus = 0;                 // Copy device classes if it fits        if (cbAvailMem >= cbDevClassLen) {            memcpy((LPBYTE)lpLineDevCaps + lpLineDevCaps->dwUsedSize, g_szzClassList, cbDevClassLen);            lpLineDevCaps->dwDeviceClassesSize  = cbDevClassLen;            lpLineDevCaps->dwDeviceClassesOffset= lpLineDevCaps->dwUsedSize;            lpLineDevCaps->dwUsedSize += cbDevClassLen;            cbAvailMem -= cbDevClassLen;        } else {            lpLineDevCaps->dwDeviceClassesSize = 0;            lpLineDevCaps->dwDeviceClassesOffset = 0;        }                lpLineDevCaps->dwAddressTypes = LINEADDRESSTYPE_PHONENUMBER;        lpLineDevCaps->dwAvailableTracking = 0;    }    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetDevCaps x%X\n"), dwRet));        return dwRet;}//// WINCE NOTE:// TSPI_lineGetDevConfig returns the default device configuration for the specified device.// This is done so applications can avoid storing the devcfg when the user wants the default// settings. If the settings are different than the default, then the application needs to store// them and set them via lineSetDevConfig whether lineGetDevConfig returns defaults or not.// LONG TSPIAPITSPI_lineGetDevConfig(    DWORD dwDeviceID,    LPVARSTRING lpDeviceConfig,    LPCWSTR lpszDeviceClass    ){    PTLINEDEV pLineDev;    DWORD dwRet = SUCCESS;    BYTE  cbSize;    PDEVMINICFG pDevMiniCfg;        DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetDevConfig\n")));    // Validate the requested device class    //    if (lpszDeviceClass != NULL)    {        if (!ValidateDevCfgClass(lpszDeviceClass))            return LINEERR_INVALDEVICECLASS;    }        // Validate the buffer    //    if (lpDeviceConfig == NULL)        return LINEERR_INVALPOINTER;    if (lpDeviceConfig->dwTotalSize < sizeof(VARSTRING))        return LINEERR_STRUCTURETOOSMALL;    // Validate the device ID    //    if ((pLineDev = GetLineDevfromID (dwDeviceID)) == NULL)        return LINEERR_NODEVICE;        // Validate the buffer size    //    cbSize = sizeof(DEVMINICFG);    lpDeviceConfig->dwUsedSize = sizeof(VARSTRING);    lpDeviceConfig->dwNeededSize = sizeof(VARSTRING) + cbSize;    if (lpDeviceConfig->dwTotalSize >= lpDeviceConfig->dwNeededSize)    {        pDevMiniCfg = (PDEVMINICFG)(((LPBYTE)lpDeviceConfig) + sizeof(VARSTRING));        // If someone does a SetDevCfg for some provider who needs a post-dial-terminal        // and they then want to create a new connection via GetDevCfg/CfgDialogEdit,        // they will end up with the default connection lookin like the original.        // To work around this, I will always return the default config here.  If the app        // needs to remember a specific config for later edit, they must store it themselves.        // LAM        getDefaultDevConfig( pLineDev, pDevMiniCfg );                lpDeviceConfig->dwStringFormat = STRINGFORMAT_BINARY;        lpDeviceConfig->dwStringSize = cbSize;        lpDeviceConfig->dwStringOffset = sizeof(VARSTRING);        lpDeviceConfig->dwUsedSize += cbSize;        DEBUGMSG(ZONE_FUNC|ZONE_CALLS,                 (TEXT("UNIMODEM:TSPI_lineGetDevConfig (DevID %d): dwModemOptions x%X, fwOptions x%X, dwCallSetupFail x%X\n"),                  dwDeviceID, pDevMiniCfg->dwModemOptions, pDevMiniCfg->fwOptions, pDevMiniCfg->dwCallSetupFailTimer));    }    else    {        // Not enough room        DEBUGMSG(ZONE_FUNC,                 (TEXT("UNIMODEM:TSPI_lineGetDevConfig needed %d bytes, had %d\n"),                  lpDeviceConfig->dwNeededSize, lpDeviceConfig->dwTotalSize));    };    DEBUGMSG(ZONE_FUNC,             (TEXT("UNIMODEM:-TSPI_lineGetDevConfig x%X (Used %d, Need %d)\n"),              dwRet, lpDeviceConfig->dwUsedSize, lpDeviceConfig->dwNeededSize));    return dwRet;}typedef HICON (WINAPI * PFN_LOADICON)(HINSTANCE, LPCWSTR);LONGTSPIAPITSPI_lineGetIcon(    DWORD    dwDeviceID,    LPCWSTR   lpszDeviceClass,    LPHICON  lphIcon    ){    LONG rc;    PFN_LOADICON pfnLoadIcon;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetIcon\n")));    rc = LINEERR_RESOURCEUNAVAIL;    //    // TODO: First check that the device class corresponds to the icon    //    if (TspiGlobals.hIconLine == NULL) {        if (IsAPIReady(SH_WMGR)) {            if (pfnLoadIcon = (PFN_LOADICON)GetProcAddress(g_hCoreDLL, L"LoadIconW")) {                TspiGlobals.hIconLine = pfnLoadIcon(                                            TspiGlobals.hInstance,                                            (LPCWSTR)MAKEINTRESOURCE(LINE_ICON)                                            );                rc = 0;            }        }    } else {        rc = 0;    }        *lphIcon = TspiGlobals.hIconLine;    DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetIcon returning %x\n"), rc));    return rc;}   // TSPI_lineGetIcon//// Get the device ID for the specified device.  The caller// can use the returned ID with the corresponding media (i.e. for// serial lines the ID can be passed to ReadFile(), WriteFile(),// etc).// LONG TSPIAPITSPI_lineGetID(    HDRVLINE       hdLine,    DWORD          dwAddressID,    HDRVCALL       hdCall,

⌨️ 快捷键说明

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