tspline.cpp
上传用户:hcyyun520
上传日期:2019-05-14
资源大小:365k
文件大小:4k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // tspLine.cpp
  2. #include "pch.h"
  3. #include "tspline.h"
  4. #include "tspcall.h"
  5. extern ASYNC_COMPLETION g_pfnCompletionProc;
  6. extern HINSTANCE        g_hinst;
  7. extern HPROVIDER        g_hProvider;
  8. extern LINEDIALPARAMS   g_dpMin;
  9. extern LINEDIALPARAMS   g_dpDef;
  10. extern LINEDIALPARAMS   g_dpMax;
  11. CtspLine::CtspLine(
  12.     HTAPILINE   htLine,
  13.     LINEEVENT   pfnEventProc,
  14.     DWORD       dwDeviceID)
  15. :
  16.     m_pfnEventProc(pfnEventProc),
  17.     m_htLine(htLine),
  18.     m_nActiveCalls(0),
  19.     m_dwDeviceID(dwDeviceID)
  20. {
  21. }
  22. void CtspLine::Event(
  23.     HTAPILINE   htLine,
  24.     HTAPICALL   htCall,
  25.     DWORD       dwMsg,
  26.     DWORD       dwParam1,
  27.     DWORD       dwParam2,
  28.     DWORD       dwParam3)
  29. {
  30.     m_pfnEventProc(htLine, htCall, dwMsg, dwParam1, dwParam2, dwParam3);
  31. }
  32. DWORD CtspLine::GetNumActiveCalls()
  33. {
  34.     return m_nActiveCalls;
  35. }
  36. DWORD CtspLine::GetDeviceID()
  37. {
  38.     return m_dwDeviceID;
  39. }
  40. inline
  41. DWORD NearestValue(DWORD dw, DWORD dwMin, DWORD dwDef, DWORD dwMax)
  42. {
  43.     if( dw == 0 ) return dwDef;
  44.     if( dw < dwMin ) return dwMin;
  45.     if( dw > dwMax ) return dwMax;
  46.     return dw;
  47. }
  48. long CtspLine::MakeCall(
  49.     DRV_REQUESTID       dwRequestID,
  50.     HTAPICALL           htCall,
  51.     LPHDRVCALL          phdCall,
  52.     LPCWSTR             pszDestAddress,
  53.     DWORD               dwCountryCode,
  54.     LPLINECALLPARAMS    const pCallParams)
  55. {                        
  56.     // Check to see if there's already another call
  57.     if( m_nActiveCalls )
  58.     {
  59.         return LINEERR_CALLUNAVAIL;
  60.     }
  61.     // Check media mode
  62.     if( pCallParams &&
  63.         pCallParams->dwMediaMode != LINEMEDIAMODE_INTERACTIVEVOICE )
  64.     {
  65.         return LINEERR_INVALMEDIAMODE;
  66.     }
  67.     // Check LINEDIALPARAMS
  68.     LINEDIALPARAMS  dp = g_dpDef;
  69.     if( pCallParams )
  70.     {
  71.         dp = pCallParams->DialParams;
  72.         dp.dwDialPause      = NearestValue(dp.dwDialPause,      g_dpMin.dwDialPause,        g_dpDef.dwDialPause,        g_dpMax.dwDialPause);
  73.         dp.dwDialSpeed      = NearestValue(dp.dwDialSpeed,      g_dpMin.dwDialSpeed,        g_dpDef.dwDialSpeed,        g_dpMax.dwDialSpeed);
  74.         dp.dwDigitDuration  = NearestValue(dp.dwDigitDuration,  g_dpMin.dwDigitDuration,    g_dpDef.dwDigitDuration,    g_dpMax.dwDigitDuration);
  75.         dp.dwWaitForDialtone= NearestValue(dp.dwWaitForDialtone,g_dpMin.dwWaitForDialtone,  g_dpDef.dwWaitForDialtone,  g_dpMax.dwWaitForDialtone);
  76.     }
  77.     // Set up dial string
  78.     // If it's empty, make it ""
  79.     if( !pszDestAddress ) pszDestAddress = L"";
  80.     // If there's an initial 'T' or 'P' (for Tone or Pulse) in the
  81.     // dest address then disregard it.
  82.     if( *pszDestAddress == L'T' || *pszDestAddress == L'P' )
  83.     {
  84.         pszDestAddress++;
  85.     }
  86.     
  87.     // Create the new call
  88.     CtspCall*   pCall = new CtspCall(this, htCall);
  89.     if( !pCall )
  90.     {
  91.         return LINEERR_NOMEM;
  92.     }
  93.     LONG    tr = LINEERR_OPERATIONFAILED;
  94.     // If it's an empty string, we're done
  95.     if( !*pszDestAddress )
  96.     {
  97.         g_pfnCompletionProc(dwRequestID, 0);
  98.         tr = dwRequestID;
  99.     }
  100.     // If there's a string to dial, start the process
  101.     else
  102.     {
  103.         // Send message to UI portion via TUISPI_providerGenericDialog
  104.         tr = pCall->StartDial(g_hinst, g_hProvider, dwRequestID, pszDestAddress, dp);
  105.         if( tr == 0 )
  106.         {
  107.             tr = dwRequestID;
  108.         }
  109.         else
  110.         {
  111.             delete pCall;
  112.             pCall = 0;
  113.         }
  114.     }
  115.     // Tell TAPI our handle to the call
  116.     *phdCall = (HDRVCALL)pCall;
  117.     return tr;
  118. }