tspi.c
来自「wince下的源代码集合打包」· C语言 代码 · 共 1,992 行 · 第 1/5 页
C
1,992 行
cbSize = sizeof( DEVMINICFG ); lpDeviceConfigOut->dwUsedSize = sizeof(VARSTRING); lpDeviceConfigOut->dwNeededSize = sizeof(VARSTRING) + cbSize; // Validate the output buffer size // if (lpDeviceConfigOut->dwTotalSize >= lpDeviceConfigOut->dwNeededSize) { PDEVMINICFG pDevMiniConfig; // Initialize the buffer // lpDeviceConfigOut->dwStringFormat = STRINGFORMAT_BINARY; lpDeviceConfigOut->dwStringSize = cbSize; lpDeviceConfigOut->dwStringOffset = sizeof(VARSTRING); lpDeviceConfigOut->dwUsedSize += cbSize; pDevMiniConfig = (PDEVMINICFG)(lpDeviceConfigOut+1); // Bring up property sheets for modems and get the updated commconfig // if (!TSPI_EditMiniConfig(hwndOwner, pLineDev, (PDEVMINICFG)lpDeviceConfigIn, pDevMiniConfig)) { DEBUGMSG(ZONE_MISC,(TEXT("UNIMODEM:TSPI_lineConfigDialogEdit User canceled in line config dialog\n"))); } DEBUGMSG(ZONE_DIAL, (TEXT("UNIMODEM:TSPI_lineConfigDialogEdit After config dialog edit, Dial Modifier %s\n"), pDevMiniConfig->szDialModifier)); } else { DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:TSPI_lineConfigDialogEdit Insufficient space in output buffer (passed %d, needed %d)\n"), lpDeviceConfigOut->dwTotalSize, lpDeviceConfigOut->dwNeededSize)); } DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineConfigDialogEdit x%X (Used %d, Need %d)\n"), dwRet, lpDeviceConfigOut->dwUsedSize, lpDeviceConfigOut->dwNeededSize)); return dwRet;}//// Unimodem specific extensions - see common\oak\inc\unimodem.h for more details. Currently only setting properties of// a DEVMINCONFIG is supported.//LONG TSPIAPITSPI_lineDevSpecific( DRV_REQUESTID dwRequestID, HDRVLINE hdLine, DWORD dwAddressID, HDRVCALL hdCall, LPVOID lpParams, DWORD dwSize ){ DWORD rc; LPDWORD lpdwCmd; PTLINEDEV pLineDev; DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineDevSpecific\n"))); lpdwCmd = (LPDWORD)lpParams; // The first 4 bytes is the command code switch (*lpdwCmd) { case UNIMDM_CMD_CHG_DEVCFG: if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineDevSpecific ** Invalid Line Handle\n"))); rc = LINEERR_OPERATIONFAILED; goto exitPoint; } SetAsyncOp(pLineDev, PENDING_LINEDEVSPECIFIC); if (rc = DevSpecificLineConfigEdit(pLineDev,(PUNIMDM_CHG_DEVCFG)lpParams)) { goto exitPoint; } SetAsyncStatus(pLineDev, 0); break; default: rc = LINEERR_OPERATIONUNAVAIL; goto exitPoint; } rc = SetAsyncID(pLineDev, dwRequestID);exitPoint: DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineDevSpecific, rc x%X\n"), rc)); return rc;} // TSPI_lineDevSpecificLONG TSPIAPITSPI_lineDial( DRV_REQUESTID dwRequestID, HDRVCALL hdCall, LPCWSTR lpszDestAddress, DWORD dwCountryCode ){ PTLINEDEV pLineDev; LONG rc; DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:+TSPI_lineDial\n"))); if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) { DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDial ** Invalid Call Handle\n"))); rc = LINEERR_INVALLINEHANDLE; goto exitPoint; } if (pLineDev->DevState != DEVST_PORTCONNECTWAITFORLINEDIAL) { DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDial ** DevState != DEVST_PORTCONNECTWAITFORLINEDIAL\n"))); rc = LINEERR_INVALCALLSTATE; goto exitPoint; } // Validate lpszDestAddress and get the processed form of it. DEBUGMSG(ZONE_MISC|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDial - validating destination address\n"))); rc = ValidateAddress(pLineDev, lpszDestAddress, pLineDev->szAddress); if (SUCCESS != rc){ DEBUGMSG(ZONE_FUNC|ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDial ** Invalid Address\n"))); goto exitPoint; } rc = ControlThreadCmd(pLineDev, PENDING_LINEDIAL, dwRequestID); if (!(rc & 0x80000000)) { rc = SetAsyncID(pLineDev, dwRequestID); }exitPoint: DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:-TSPI_lineDial, rc x%X\n"), rc)); return rc; } // TSPI_lineDial//// Terminate a call or abandon a call attempt in progress// LONG TSPIAPITSPI_lineDrop(DRV_REQUESTID dwRequestID, HDRVCALL hdCall, LPCSTR lpsUserUserInfo, DWORD dwSize ){ PTLINEDEV pLineDev; LONG rc; DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:+TSPI_lineDrop\n"))); if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) { DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDrop ** Invalid Call Handle\n"))); return LINEERR_INVALCALLHANDLE; } if (pLineDev->dwCallState == LINECALLSTATE_IDLE) { DEBUGMSG(ZONE_ERROR|ZONE_CALLS, (TEXT("UNIMODEM:TSPI_lineDrop ** Invalid Call State\n"))); return LINEERR_INVALCALLSTATE; } EnterCriticalSection(&pLineDev->OpenCS); pLineDev->dwCallFlags |= CALL_DROPPING; // Flag that this call is going away pLineDev->dwCallFlags &= ~CALL_ACTIVE; LeaveCriticalSection(&pLineDev->OpenCS); if (pLineDev->fTakeoverMode) { pLineDev->fTakeoverMode = FALSE; pLineDev->DevState = DEVST_DISCONNECTED; NewCallState(pLineDev, LINECALLSTATE_DISCONNECTED, LINEDISCONNECTMODE_NORMAL); NewCallState(pLineDev, LINECALLSTATE_IDLE, 0); SetAsyncOp(pLineDev, PENDING_LINEDROP); SetAsyncStatus(pLineDev, 0); rc = 0; } else { rc = ControlThreadCmd(pLineDev, PENDING_LINEDROP, dwRequestID); } if (!(rc & 0x80000000)) { rc = SetAsyncID(pLineDev, dwRequestID); } DEBUGMSG(ZONE_FUNC|ZONE_CALLS, (TEXT("UNIMODEM:-TSPI_lineDrop, rc x%X\n"), rc)); return rc;} // TSPI_lineDropLONGTSPIAPITSPI_lineGetAddressCaps( DWORD dwDeviceID, DWORD dwAddressID, DWORD dwTSPIVersion, DWORD dwExtVersion, LPLINEADDRESSCAPS lpAddressCaps ){ LONG rc; PTLINEDEV pLineDev; int cbDevClassLen; int cbAvailMem; DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetAddressCaps\n"))); rc = 0; InitVarData((LPVOID)lpAddressCaps, sizeof(LINEADDRESSCAPS)); // Validate the device ID if ((pLineDev = GetLineDevfromID(dwDeviceID)) == NULL) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetAddressCaps ** Invalid DeviceID\n"))); rc = LINEERR_NODEVICE; goto exitPoint; } // Validate the address ID if(dwAddressID != 0) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetAddressCaps ** Invalid AddressID\n"))); rc = LINEERR_INVALADDRESSID; goto exitPoint; } lpAddressCaps->dwLineDeviceID = dwDeviceID; lpAddressCaps->dwAddressSharing = LINEADDRESSSHARING_PRIVATE; lpAddressCaps->dwCallInfoStates = LINECALLINFOSTATE_APPSPECIFIC | LINECALLINFOSTATE_MEDIAMODE; lpAddressCaps->dwCallerIDFlags = LINECALLPARTYID_UNAVAIL; lpAddressCaps->dwCalledIDFlags = LINECALLPARTYID_UNAVAIL; lpAddressCaps->dwConnectedIDFlags = LINECALLPARTYID_UNAVAIL; lpAddressCaps->dwRedirectionIDFlags = LINECALLPARTYID_UNAVAIL; lpAddressCaps->dwRedirectingIDFlags = LINECALLPARTYID_UNAVAIL; lpAddressCaps->dwCallStates = LINECALLSTATE_IDLE | LINECALLSTATE_OFFERING | LINECALLSTATE_ACCEPTED | LINECALLSTATE_DIALTONE | LINECALLSTATE_DIALING | LINECALLSTATE_CONNECTED | LINECALLSTATE_PROCEEDING | LINECALLSTATE_DISCONNECTED | LINECALLSTATE_UNKNOWN; lpAddressCaps->dwDialToneModes = LINEDIALTONEMODE_UNAVAIL; lpAddressCaps->dwBusyModes = LINEBUSYMODE_UNAVAIL; lpAddressCaps->dwSpecialInfo = LINESPECIALINFO_UNAVAIL; lpAddressCaps->dwDisconnectModes = LINEDISCONNECTMODE_UNAVAIL | LINEDISCONNECTMODE_NORMAL | LINEDISCONNECTMODE_BUSY | LINEDISCONNECTMODE_NODIALTONE | LINEDISCONNECTMODE_NOANSWER; lpAddressCaps->dwMaxNumActiveCalls = 1; lpAddressCaps->dwAddrCapFlags = LINEADDRCAPFLAGS_PARTIALDIAL; if (!IS_NULL_MODEM(pLineDev)) { lpAddressCaps->dwAddrCapFlags |= LINEADDRCAPFLAGS_DIALED; } lpAddressCaps->dwCallFeatures = LINECALLFEATURE_ANSWER | LINECALLFEATURE_ACCEPT | LINECALLFEATURE_SETCALLPARAMS | LINECALLFEATURE_DIAL | LINECALLFEATURE_DROP; cbAvailMem = (int) (lpAddressCaps->dwTotalSize - lpAddressCaps->dwUsedSize); cbDevClassLen = sizeof(g_szzClassList); // Copy device classes if it fits if (cbAvailMem >= cbDevClassLen) { memcpy((LPBYTE)lpAddressCaps + lpAddressCaps->dwUsedSize, g_szzClassList, cbDevClassLen); lpAddressCaps->dwDeviceClassesSize = cbDevClassLen; lpAddressCaps->dwDeviceClassesOffset= lpAddressCaps->dwUsedSize; lpAddressCaps->dwUsedSize += cbDevClassLen; cbAvailMem -= cbDevClassLen; } else { lpAddressCaps->dwDeviceClassesSize = 0; lpAddressCaps->dwDeviceClassesOffset = 0; } lpAddressCaps->dwNeededSize += cbDevClassLen;exitPoint: DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetAddressCaps 0x%x\n"), rc)); return rc;} // TSPI_lineGetAddressCapsLONGTSPIAPITSPI_lineGetAddressStatus( HDRVLINE hdLine, DWORD dwAddressID, LPLINEADDRESSSTATUS lpAddressStatus ){ LONG rc; PTLINEDEV pLineDev; DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetAddressStatus\n"))); rc = 0; InitVarData((LPVOID)lpAddressStatus, sizeof(LINEADDRESSSTATUS)); if ((pLineDev = GetLineDevfromHandle ((DWORD)hdLine)) == NULL) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetAddressStatus ** Invalid hdLine\n"))); rc = LINEERR_INVALLINEHANDLE; goto exitPoint; } if(dwAddressID != 0) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetAddressStatus ** Invalid AddressID\n"))); rc = LINEERR_INVALADDRESSID; goto exitPoint; } if (pLineDev->dwCallFlags & CALL_ACTIVE) { lpAddressStatus->dwNumInUse = 1; lpAddressStatus->dwNumActiveCalls = (pLineDev->dwCallState != LINECALLSTATE_IDLE) ? 1 : 0; } else { lpAddressStatus->dwNumInUse = 0; lpAddressStatus->dwNumActiveCalls = 0; }; lpAddressStatus->dwAddressFeatures = (pLineDev->dwCallFlags & CALL_ALLOCATED) ? 0 : LINEADDRFEATURE_MAKECALL; exitPoint: DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:-TSPI_lineGetAddressStatus 0x%x\n"), rc)); return rc;} // TSPI_lineGetAddressStatusLONGTSPIAPITSPI_lineGetCallInfo( HDRVCALL hdCall, LPLINECALLINFO lpCallInfo ){ PTLINEDEV pLineDev; LONG rc; DEBUGMSG(ZONE_FUNC, (TEXT("UNIMODEM:+TSPI_lineGetCallInfo\n"))); InitVarData((LPVOID)lpCallInfo, sizeof(LINECALLINFO)); if ((pLineDev = GetLineDevfromHandle ((DWORD)hdCall)) == NULL) { DEBUGMSG(ZONE_ERROR, (TEXT("UNIMODEM:TSPI_lineGetCallInfo Invalid hdCall\n"))); rc = LINEERR_INVALCALLHANDLE; goto exitPoint; } rc = 0; lpCallInfo->dwLineDeviceID = pLineDev->dwDeviceID; lpCallInfo->dwAddressID = 0; lpCallInfo->dwBearerMode = pLineDev->dwCurBearerModes; lpCallInfo->dwRate = pLineDev->dwCurrentBaudRate; lpCallInfo->dwMediaMode = pLineDev->dwCurMediaModes; lpCallInfo->dwAppSpecific = 0; lpCallInfo->dwCallStates = pLineDev->dwCallFlags & CALL_INBOUND ? (LINECALLSTATE_IDLE | LINECALLSTATE_OFFERING | LINECALLSTATE_ACCEPTED | LINECALLSTATE_CONNECTED | LINECALLSTATE_DISCONNECTED | LINECALLSTATE_UNKNOWN) : (LINECALLSTATE_IDLE | LINECALLSTATE_DIALTONE | LINECALLSTATE_DIALING | LINECALLSTATE_PROCEEDING | LINECALLSTATE_CONNECTED | LINECALLSTATE_DISCONNECTED | LINECALLSTATE_UNKNOWN); lpCallInfo->dwOrigin = pLineDev->dwCallFlags & CALL_INBOUND ? LINECALLORIGIN_INBOUND : LINECALLORIGIN_OUTBOUND; lpCallInfo->dwReason = pLineDev->dwCallFlags & CALL_INBOUND ? LINECALLREASON_UNAVAIL : LINECALLREASON_DIRECT; lpCallInfo->dwCallerIDFlags = LINECALLPARTYID_UNAVAIL; lpCallInfo->dwCalledIDFlags = LINECALLPARTYID_UNAVAIL; lpCallInfo->dwConnectedIDFlags = LINECALLPARTYID_UNAVAIL; lpCallInfo->dwRedirectionIDFlags = LINECALLPARTYID_UNAVAIL; lpCallInfo->dwRedirectingIDFlags = LINECALLPARTYID_UNAVAIL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?