Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

503 lines
14 KiB

  1. // PageTerminals.cpp : Implementation of CPageTerminals
  2. #include "stdafx.h"
  3. #include "PageTerm.h"
  4. #include "AVTapi.h"
  5. #include "PageAddress.h"
  6. #define IMAGE_WIDTH 16
  7. #define IMAGE_MARGIN 5
  8. static HWND hWnds[5];
  9. /////////////////////////////////////////////////////////////////////////////
  10. // CPageTerminals
  11. IMPLEMENT_MY_HELP(CPageTerminals)
  12. CPageTerminals::CPageTerminals()
  13. {
  14. m_dwTitleID = IDS_TITLEPageTerminals;
  15. m_dwHelpFileID = IDS_HELPFILEPageTerminals;
  16. m_dwDocStringID = IDS_DOCSTRINGPageTerminals;
  17. m_hIml = NULL;
  18. m_hImlMedia = NULL;
  19. m_dwAddressType = LINEADDRESSTYPE_IPADDRESS;
  20. m_bUSBPresent = FALSE;
  21. m_bstrUSBCaptureTerm = NULL;
  22. m_bstrUSBRenderTerm = NULL;
  23. }
  24. CPageTerminals::~CPageTerminals()
  25. {
  26. if ( m_hIml ) ImageList_Destroy( m_hIml );
  27. if ( m_hImlMedia ) ImageList_Destroy( m_hImlMedia );
  28. if( m_bstrUSBCaptureTerm )
  29. {
  30. SysFreeString( m_bstrUSBCaptureTerm );
  31. m_bstrUSBCaptureTerm = NULL;
  32. }
  33. if( m_bstrUSBRenderTerm )
  34. {
  35. SysFreeString( m_bstrUSBRenderTerm );
  36. m_bstrUSBRenderTerm = NULL;
  37. }
  38. }
  39. int CPageTerminals::ItemFromAddressType( DWORD dwAddressType )
  40. {
  41. switch ( dwAddressType )
  42. {
  43. case LINEADDRESSTYPE_SDP: return IMAGE_CONFERENCE;
  44. case LINEADDRESSTYPE_PHONENUMBER: return IMAGE_TELEPHONE;
  45. }
  46. return IMAGE_COMPUTER;
  47. }
  48. STDMETHODIMP CPageTerminals::Apply()
  49. {
  50. ATLTRACE(_T("CPageTerminals::Apply\n"));
  51. // Validate dialog data....
  52. TCHAR szNum[100];
  53. ::GetWindowText( GetDlgItem(IDC_EDT_MAX_WINDOWS), szNum, ARRAYSIZE(szNum) - 1 );
  54. DWORD dwTemp = _ttol( szNum );
  55. if ( dwTemp > MAX_VIDEO )
  56. _Module.DoMessageBox( IDS_ER_MAX_VIDEO_EXCEEDED, MB_ICONINFORMATION, true );
  57. IAVTapi *pAVTapi;
  58. if ( SUCCEEDED(m_ppUnk[0]->QueryInterface(IID_IAVTapi, (void **) &pAVTapi)) )
  59. {
  60. pAVTapi->UnpopulateTerminalsDialog( m_dwAddressType, hWnds );
  61. pAVTapi->Release();
  62. }
  63. //
  64. // Let save the USB value into registry
  65. //
  66. UINT uCheck = ::IsDlgButtonChecked(m_hWnd, IDC_CHK_USBALWAYS);
  67. USBCheckChanged( (uCheck>0) ? FALSE : TRUE);
  68. //
  69. // Try to change the phone settings
  70. //
  71. IAVTapi2* pAVTapi2 = NULL;
  72. if( SUCCEEDED(m_ppUnk[0]->QueryInterface(IID_IAVTapi2, (void**)&pAVTapi2)) )
  73. {
  74. if( (m_bUSBPresent == TRUE) && (m_bDirty == TRUE) )
  75. {
  76. HRESULT hr = pAVTapi2->USBSetHandling( (uCheck>0) );
  77. if( FAILED(hr) )
  78. {
  79. // Go back to the previous status
  80. BOOL bUSBAlways = FALSE;
  81. pAVTapi2->USBGetDefaultUse( &bUSBAlways );
  82. UINT uCheck = bUSBAlways ? BST_CHECKED : BST_UNCHECKED;
  83. ::CheckDlgButton( m_hWnd, IDC_CHK_USBALWAYS, uCheck);
  84. USBCheckChanged( (uCheck>0) ? FALSE : TRUE);
  85. }
  86. }
  87. pAVTapi2->Release();
  88. }
  89. //
  90. // Let save the AEC into registry
  91. //
  92. uCheck = ::IsDlgButtonChecked(m_hWnd, IDC_CHK_AEC);
  93. SetAECRegistryValue( (uCheck == BST_CHECKED) );
  94. m_bDirty = FALSE;
  95. return S_OK;
  96. }
  97. STDMETHODIMP CPageTerminals::Activate( /* [in] */ HWND hWndParent,
  98. /* [in] */ LPCRECT pRect,
  99. /* [in] */ BOOL bModal)
  100. {
  101. CPageAddress::m_pPageTerminals = this;
  102. ATLTRACE(_T(".enter.CPageTerminals::Activate().\n"));
  103. // Create image lists
  104. m_hIml = ImageList_LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_TERMINAL_TYPES), IMAGE_WIDTH, 0, RGB(255, 0, 255) );
  105. m_hImlMedia = ImageList_LoadBitmap( _Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_MEDIA_TYPES), IMAGE_WIDTH, 0, RGB(255, 0, 255) );
  106. HRESULT hr = IPropertyPageImpl<CPageTerminals>::Activate(hWndParent, pRect, bModal);
  107. if ( SUCCEEDED(hr) )
  108. {
  109. // Popuplate combo box with call types
  110. TCHAR szText[255];
  111. UINT nIDS[] = { IDS_TELEPHONE_CALLS, IDS_INTERNET_CALLS, IDS_INTERNET_CONFS };
  112. DWORD dwType[] = { LINEADDRESSTYPE_PHONENUMBER, LINEADDRESSTYPE_IPADDRESS, LINEADDRESSTYPE_SDP };
  113. for ( int i = 0; i < ARRAYSIZE(nIDS); i++ )
  114. {
  115. LoadString( _Module.GetResourceInstance(), nIDS[i], szText, ARRAYSIZE(szText) );
  116. int nInd = (int) SendDlgItemMessage( IDC_CBO_CALLTYPE, CB_ADDSTRING, 0, (LPARAM) szText );
  117. if ( nInd >= 0 )
  118. SendDlgItemMessage( IDC_CBO_CALLTYPE, CB_SETITEMDATA, nInd, dwType[i] );
  119. }
  120. // Load combo boxes with terminal information based on selected call type
  121. hWnds[0] = GetDlgItem(IDC_CBO_AUDIO_IN);
  122. hWnds[1] = GetDlgItem(IDC_CBO_AUDIO_OUT);
  123. hWnds[2] = GetDlgItem(IDC_CBO_VIDEO_IN);
  124. hWnds[3] = GetDlgItem(IDC_CHK_VIDEO_OUT);
  125. hWnds[4] = GetDlgItem(IDC_EDT_MAX_WINDOWS);
  126. IAVTapi *pAVTapi;
  127. if ( SUCCEEDED(m_ppUnk[0]->QueryInterface(IID_IAVTapi, (void **) &pAVTapi)) )
  128. {
  129. // Select the media from the list box
  130. pAVTapi->get_dwPreferredMedia( &m_dwAddressType );
  131. SendDlgItemMessage( IDC_CBO_CALLTYPE, CB_SETCURSEL, ItemFromAddressType(m_dwAddressType), 0 );
  132. pAVTapi->PopulateTerminalsDialog( m_dwAddressType, hWnds );
  133. //
  134. // Disable/Enable the check box for the USBPhones
  135. //
  136. IAVTapi2* pAVTapi2 = NULL;
  137. if( SUCCEEDED(pAVTapi->QueryInterface( IID_IAVTapi2, (void**)&pAVTapi2)) )
  138. {
  139. // Is USB present
  140. BOOL bUSBPresent = FALSE;
  141. pAVTapi2->USBIsPresent( &bUSBPresent );
  142. // Terminals
  143. pAVTapi2->USBGetTerminalName( AVTERM_CAPTURE, &m_bstrUSBCaptureTerm );
  144. pAVTapi2->USBGetTerminalName( AVTERM_RENDER, &m_bstrUSBRenderTerm );
  145. // Clean-up
  146. pAVTapi2->Release();
  147. m_bUSBPresent = bUSBPresent;
  148. ::EnableWindow(GetDlgItem(IDC_CHK_USBALWAYS), bUSBPresent);
  149. }
  150. pAVTapi->Release();
  151. }
  152. // Max Video Windows only valid for Multi-cast conferences
  153. ::ShowWindow( GetDlgItem(IDC_EDT_MAX_WINDOWS), (m_dwAddressType == LINEADDRESSTYPE_SDP) ? SW_SHOW : SW_HIDE );
  154. ::ShowWindow( GetDlgItem(IDC_LBL_MAX_WINDOWS), (m_dwAddressType == LINEADDRESSTYPE_SDP) ? SW_SHOW : SW_HIDE );
  155. ::EnableWindow(GetDlgItem(IDC_EDT_MAX_WINDOWS), IsDlgButtonChecked(IDC_CHK_VIDEO_OUT));
  156. // Put the multimedia control panel icon on the button
  157. SendDlgItemMessage( IDC_BTN_MMSYS_CPL, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadIcon(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_MULTIMEDIA)) );
  158. //
  159. // Try to get the USB use flag
  160. //
  161. IAVTapi2* pAVTapi2 = NULL;
  162. BOOL bUSBAlways = FALSE;
  163. if( SUCCEEDED(m_ppUnk[0]->QueryInterface(IID_IAVTapi2, (void**)&pAVTapi2)) )
  164. {
  165. pAVTapi2->USBGetDefaultUse( &bUSBAlways );
  166. pAVTapi2->Release();
  167. }
  168. UINT uCheck = bUSBAlways ? BST_CHECKED : BST_UNCHECKED;
  169. ::CheckDlgButton( m_hWnd, IDC_CHK_USBALWAYS, uCheck);
  170. USBCheckChanged( (uCheck>0) ? FALSE : TRUE);
  171. // AEC registry value
  172. BOOL bAEC = GetAECRegistryValue();
  173. uCheck = bAEC ? BST_CHECKED : BST_UNCHECKED;
  174. ::CheckDlgButton( m_hWnd, IDC_CHK_AEC, uCheck);
  175. }
  176. return hr;
  177. }
  178. STDMETHODIMP CPageTerminals::Deactivate()
  179. {
  180. CPageAddress::m_pPageTerminals = NULL;
  181. return IPropertyPageImpl<CPageTerminals>::Deactivate();
  182. }
  183. LRESULT CPageTerminals::OnSelChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  184. {
  185. if ( hWndCtl == GetDlgItem(IDC_CBO_CALLTYPE) )
  186. {
  187. HCURSOR hCursorOld = SetCursor( LoadCursor(NULL, IDC_WAIT) );
  188. int nInd = (int) ::SendMessage( hWndCtl, CB_GETCURSEL, 0, 0 );
  189. if ( nInd >= 0 )
  190. {
  191. // Load combo boxes with terminal information based on selected call type
  192. IAVTapi *pAVTapi;
  193. if ( SUCCEEDED(m_ppUnk[0]->QueryInterface(IID_IAVTapi, (void **) &pAVTapi)) )
  194. {
  195. // Store current terminal information
  196. pAVTapi->UnpopulateTerminalsDialog( m_dwAddressType, hWnds );
  197. // Load terminal information for selected address
  198. m_dwAddressType = ::SendMessage( hWndCtl, CB_GETITEMDATA, nInd, 0 );
  199. // Max Video Windows only valid for Multi-cast conferences
  200. ::ShowWindow( GetDlgItem(IDC_EDT_MAX_WINDOWS), (m_dwAddressType == LINEADDRESSTYPE_SDP) ? SW_SHOW : SW_HIDE );
  201. ::ShowWindow( GetDlgItem(IDC_LBL_MAX_WINDOWS), (m_dwAddressType == LINEADDRESSTYPE_SDP) ? SW_SHOW : SW_HIDE );
  202. pAVTapi->PopulateTerminalsDialog( m_dwAddressType, hWnds );
  203. pAVTapi->Release();
  204. // Re-paint selected call type bitmap
  205. RECT rc;
  206. ::GetWindowRect( GetDlgItem(IDC_LBL_CALLTYPE), &rc );
  207. OffsetRect( &rc, -(IMAGE_WIDTH + IMAGE_MARGIN), 0 );
  208. rc.right = rc.left + IMAGE_WIDTH;
  209. rc.bottom = rc.top + IMAGE_WIDTH;
  210. ScreenToClient( &rc );
  211. InvalidateRect( &rc );
  212. ::EnableWindow(GetDlgItem(IDC_EDT_MAX_WINDOWS), IsDlgButtonChecked(IDC_CHK_VIDEO_OUT));
  213. }
  214. }
  215. if( bHandled )
  216. {
  217. UINT uCheck = ::IsDlgButtonChecked(m_hWnd, IDC_CHK_USBALWAYS);
  218. USBCheckChanged( (uCheck>0) ? FALSE : TRUE);
  219. }
  220. SetCursor( hCursorOld );
  221. bHandled = true;
  222. }
  223. else
  224. {
  225. // Dirty property page
  226. SetDirty( TRUE );
  227. }
  228. return 0;
  229. }
  230. LRESULT CPageTerminals::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  231. {
  232. // Must have valid image list to work
  233. if ( !m_hIml ) return 0;
  234. PAINTSTRUCT ps;
  235. HDC hDC = BeginPaint( &ps );
  236. if ( !hDC ) return 0;
  237. // IDS of items to paint
  238. UINT nID[] = { IDC_LBL_AUDIO_IN,
  239. IDC_LBL_AUDIO_OUT,
  240. IDC_LBL_VIDEO_IN,
  241. IDC_CHK_VIDEO_OUT,
  242. IDC_CHK_USBALWAYS,
  243. IDC_CHK_AEC};
  244. RECT rc;
  245. // Paint bitmaps next to corresponding images
  246. for ( int i = 0; i < ARRAYSIZE(nID); i++ )
  247. {
  248. ::GetWindowRect( GetDlgItem(nID[i]), &rc );
  249. ScreenToClient( &rc );
  250. // Paint image of rect
  251. ImageList_Draw( m_hIml, i, hDC, rc.left - (IMAGE_WIDTH + IMAGE_MARGIN), rc.top, ILD_NORMAL );
  252. }
  253. // Paint bitmap next to selected style of media
  254. int nInd = SendDlgItemMessage( IDC_CBO_CALLTYPE, CB_GETCURSEL, 0, 0 );
  255. if ( nInd >= 0 )
  256. {
  257. ::GetWindowRect( GetDlgItem(IDC_LBL_CALLTYPE), &rc );
  258. ScreenToClient( &rc );
  259. ImageList_Draw( m_hImlMedia, ItemFromAddressType(SendDlgItemMessage(IDC_CBO_CALLTYPE, CB_GETITEMDATA, nInd, 0)),
  260. hDC, rc.left - (IMAGE_WIDTH + IMAGE_MARGIN), rc.top, ILD_NORMAL );
  261. }
  262. EndPaint( &ps );
  263. bHandled = true;
  264. return 0;
  265. }
  266. LRESULT CPageTerminals::OnEdtChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  267. {
  268. SetDirty( true );
  269. return 0;
  270. }
  271. LRESULT CPageTerminals::OnBnClick(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  272. {
  273. switch ( wID )
  274. {
  275. case IDC_BTN_MMSYS_CPL:
  276. return OnMMSysCPL( wNotifyCode, wID, hWndCtl, bHandled );
  277. break;
  278. case IDC_CHK_VIDEO_OUT:
  279. ::EnableWindow(GetDlgItem(IDC_EDT_MAX_WINDOWS), IsDlgButtonChecked(IDC_CHK_VIDEO_OUT));
  280. break;
  281. case IDC_CHK_USBALWAYS:
  282. {
  283. UINT uCheck = ::IsDlgButtonChecked(m_hWnd, IDC_CHK_USBALWAYS);
  284. USBCheckChanged( (uCheck>0) ? FALSE : TRUE);
  285. }
  286. break;
  287. }
  288. SetDirty( true );
  289. return 0;
  290. }
  291. LRESULT CPageTerminals::OnMMSysCPL(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  292. {
  293. TCHAR szControl[MAX_PATH];
  294. TCHAR szCPL[MAX_PATH];
  295. LoadString( _Module.GetResourceInstance(), IDN_CONTROL_PANEL_EXE, szControl, ARRAYSIZE(szControl) );
  296. LoadString( _Module.GetResourceInstance(), IDN_CONTROL_MMSYS_CPL, szCPL, ARRAYSIZE(szCPL) );
  297. return (LRESULT) ShellExecute( GetParent(), NULL, szControl, szCPL, NULL, SW_SHOW );
  298. }
  299. void CPageTerminals::UpdateSel()
  300. {
  301. HWND hWndCtl = GetDlgItem( IDC_CBO_CALLTYPE );
  302. if ( hWndCtl )
  303. {
  304. BOOL bHandled = FALSE;
  305. OnSelChange(0, 0, hWndCtl, bHandled);
  306. }
  307. }
  308. BOOL CPageTerminals::GetAECRegistryValue(
  309. )
  310. {
  311. BOOL bAEC = FALSE;
  312. //
  313. // Read the registry for the previous
  314. // setting for AEC
  315. //
  316. TCHAR szText[255], szType[255];
  317. LoadString( _Module.GetResourceInstance(), IDN_REG_REDIAL_KEY, szText, ARRAYSIZE(szText) );
  318. CRegKey regKey;
  319. if( regKey.Open( HKEY_CURRENT_USER, szText, KEY_READ )!= ERROR_SUCCESS)
  320. {
  321. return bAEC;
  322. };
  323. //
  324. // Read data
  325. //
  326. DWORD dwValue = 0;
  327. LoadString( _Module.GetResourceInstance(), IDN_REG_REDIAL_AEC, szType, ARRAYSIZE(szType) );
  328. if( regKey.QueryValue(dwValue, szType) != ERROR_SUCCESS)
  329. {
  330. return FALSE;
  331. }
  332. return (BOOL)dwValue;
  333. }
  334. HRESULT CPageTerminals::SetAECRegistryValue(
  335. IN BOOL bAEC
  336. )
  337. {
  338. CRegKey regKey;
  339. TCHAR szText[255], szType[255];
  340. LoadString( _Module.GetResourceInstance(), IDN_REG_REDIAL_KEY, szText, ARRAYSIZE(szText) );
  341. LoadString( _Module.GetResourceInstance(), IDN_REG_REDIAL_AEC, szType, ARRAYSIZE(szType) );
  342. if( regKey.Create( HKEY_CURRENT_USER, szText) != ERROR_SUCCESS)
  343. {
  344. return E_FAIL;
  345. }
  346. // Set the value
  347. if( regKey.SetValue((DWORD)bAEC, szType) != ERROR_SUCCESS)
  348. {
  349. return E_FAIL;
  350. }
  351. return S_OK;
  352. }
  353. HRESULT CPageTerminals::USBCheckChanged(
  354. IN BOOL bStandard
  355. )
  356. {
  357. // Is USB present?
  358. if( !m_bUSBPresent )
  359. {
  360. // We don't have an USB, that's it!
  361. return S_OK;
  362. }
  363. // Enable or disable the comboboxs
  364. HWND hWnds[3];
  365. hWnds[0] = GetDlgItem(IDC_CBO_CALLTYPE);
  366. hWnds[1] = GetDlgItem(IDC_CBO_AUDIO_IN);
  367. hWnds[2] = GetDlgItem(IDC_CBO_AUDIO_OUT);
  368. for( int nWnd = 1; nWnd < 3; nWnd++)
  369. {
  370. ::EnableWindow( hWnds[ nWnd ], bStandard);
  371. }
  372. if( bStandard )
  373. {
  374. BOOL bHandled = FALSE;
  375. OnSelChange( 0, 0, hWnds[0], bHandled);
  376. return S_OK;
  377. }
  378. //
  379. // Select the USB handset terminals
  380. //
  381. // Capture
  382. LRESULT res = ::SendMessage( hWnds[1],
  383. CB_FINDSTRING,
  384. (WPARAM)-1,
  385. (LPARAM)m_bstrUSBCaptureTerm);
  386. if( res != CB_ERR && res != (LRESULT)-1)
  387. {
  388. // Change the selectiion in the combobox
  389. ::SendMessage( hWnds[1], CB_SETCURSEL, (WPARAM)res,0);
  390. }
  391. // Render
  392. res = ::SendMessage( hWnds[2],
  393. CB_FINDSTRING,
  394. (WPARAM)-1,
  395. (LPARAM)m_bstrUSBRenderTerm);
  396. if( res != CB_ERR && res != (LRESULT)-1)
  397. {
  398. // Change the selectiion in the combobox
  399. ::SendMessage( hWnds[2], CB_SETCURSEL, (WPARAM)res,0);
  400. }
  401. return S_OK;
  402. }