// DVBSTuneRequestPage.h : Declaration of the CDVBSTuneRequestPage #ifndef __DVBSTUNEREQUESTPAGE_H_ #define __DVBSTUNEREQUESTPAGE_H_ #include "resource.h" // main symbols #include "misccell.h" #include EXTERN_C const CLSID CLSID_DVBSTuneRequestPage; ///////////////////////////////////////////////////////////////////////////// // CDVBSTuneRequestPage class ATL_NO_VTABLE CDVBSTuneRequestPage : public CComObjectRootEx, public CComCoClass, public IPropertyPageImpl, public CDialogImpl, public IBroadcastEvent { public: CDVBSTuneRequestPage() { m_dwTitleID = IDS_TITLEDVBSTuneRequestPage; m_dwHelpFileID = IDS_HELPFILEDVBSTuneRequestPage; m_dwDocStringID = IDS_DOCSTRINGDVBSTuneRequestPage; } ~CDVBSTuneRequestPage () { ReleaseTuningSpaces (); } enum {IDD = IDD_DVBSTUNEREQUESTPAGE}; DECLARE_REGISTRY_RESOURCEID(IDR_DVBSTUNEREQUESTPAGE) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CDVBSTuneRequestPage) COM_INTERFACE_ENTRY(IPropertyPage) COM_INTERFACE_ENTRY(IBroadcastEvent) END_COM_MAP() BEGIN_MSG_MAP(CDVBSTuneRequestPage) CHAIN_MSG_MAP(IPropertyPageImpl) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) COMMAND_HANDLER(IDC_BUTTON_REST_TO_DEFAULT_LOCATOR, BN_CLICKED, OnClickedButton_rest_to_default_locator) COMMAND_HANDLER(IDC_BUTTON_SUBMIT_TUNE_REQUEST, BN_CLICKED, OnClickedButton_submit_tune_request) COMMAND_HANDLER(IDC_LIST_TUNING_SPACES, LBN_SELCHANGE, OnSelchangeList_tuning_spaces) END_MSG_MAP() typedef IPropertyPageImpl PPGBaseClass; void ReleaseTuningSpaces (); STDMETHOD(SetObjects)(ULONG nObjects, IUnknown** ppUnk) { // Use SetObjects to perform basic sanity checks on the objects whose properties will be set // This page can only handle a single object // and that object must support the IBDA_NetworkProvider interface. // We return E_INVALIDARG in any other situation HRESULT hr = E_INVALIDARG; if (nObjects == 1) // Single object { CComQIPtr pNP(ppUnk[0]); // Must support IBDA_NetworkProvider if (pNP) hr = PPGBaseClass::SetObjects(nObjects, ppUnk); } return hr; } STDMETHOD(Activate)(HWND hWndParent, LPCRECT prc, BOOL bModal) { // If we don't have any objects, this method should not be called // Note that OleCreatePropertyFrame will call Activate even if a call to SetObjects fails, so this check is required if (!m_ppUnk) return E_UNEXPECTED; // Use Activate to update the property page's UI with information // obtained from the objects in the m_ppUnk array // We update the page to display the Name and ReadOnly properties of the document // Call the base class HRESULT hr = PPGBaseClass::Activate(hWndParent, prc, bModal); if (!m_ppUnk[0]) return E_UNEXPECTED; //if already advised, unadvise if (m_pBroadcastEventService) { CComQIPtr pConPoint(m_pBroadcastEventService); if (pConPoint) pConPoint->Unadvise (m_dwEventCookie); m_pBroadcastEventService.Release (); } IBroadcastEvent* pEvent = NULL; //register for events hr = CBDAMiscellaneous::RegisterForEvents ( m_ppUnk[0], static_cast(this), &pEvent, m_dwEventCookie ); if (SUCCEEDED (hr)) m_pBroadcastEventService.Attach (pEvent); m_pTuner = m_ppUnk[0]; if (!m_pTuner) return E_FAIL; ReleaseTuningSpaces (); HWND hwndListBox = GetDlgItem (IDC_LIST_TUNING_SPACES); ::SendMessage (hwndListBox, LB_RESETCONTENT, NULL, NULL); //get the tunning spaces CComPtr pTuneSpaces; hr = m_pTuner->EnumTuningSpaces (&pTuneSpaces); bool bFound = false; if (SUCCEEDED (hr) && (pTuneSpaces)) { ITuningSpace* pTuneSpace = NULL; IDVBSTuningSpace* pDVBSTuningSpace; while (pTuneSpaces->Next (1, &pTuneSpace, 0) == S_OK) { hr = pTuneSpace->QueryInterface(__uuidof (IDVBSTuningSpace), reinterpret_cast (&pDVBSTuningSpace)); if (FAILED (hr) || (!pDVBSTuningSpace)) { ASSERT (FALSE); continue; } CComBSTR uniqueName; hr = pDVBSTuningSpace->get_UniqueName (&uniqueName.m_str); if (FAILED (hr)) continue; //don't bother to release the DVBSTuningSpace pointers //they will be added to a list that will be released later AddItemToListBox (uniqueName, pDVBSTuningSpace);//we will identify the items from the name bFound = true; } } if (!bFound) { //no available tuning space so just disable all controls EnableControls (FALSE); return S_OK; } if (!m_pTuneRequest) { //Now, let's see if there is any current tunerequest we can get CComPtr pTuneRequest; hr = m_pTuner->get_TuneRequest (&pTuneRequest); m_pTuneRequest = pTuneRequest; } CComPtr pLocator; if (m_pTuneRequest) { hr = m_pTuneRequest->get_Locator (&pLocator); if (FAILED (hr) || (!pLocator)) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } CComQIPtr pDVBSLocator (pLocator); if (!pDVBSLocator) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } FillControlFromLocator (pDVBSLocator); //try to find the coresponding tuning space from the list CComPtr pReferenceTuneSpace; hr = m_pTuneRequest->get_TuningSpace (&pReferenceTuneSpace); if (FAILED (hr) || (!pReferenceTuneSpace)) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } CComQIPtr pDVBSReferenceTuningSpace (pReferenceTuneSpace); if (!pDVBSReferenceTuningSpace) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } CComBSTR refUniqueName; hr = pDVBSReferenceTuningSpace->get_UniqueName (&refUniqueName.m_str); if (FAILED (hr)) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } TUNING_SPACES::iterator it = m_tunigSpaceList.begin (); CComBSTR uniqueName; int nCount = 0; while (it != m_tunigSpaceList.end ()) { //BUGBUG - should check for all properties not only for UniqueName hr = (*it)->get_UniqueName (&uniqueName.m_str); if (FAILED (hr)) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } if (uniqueName == refUniqueName) { //we found it, so select the proper tuning space from the list HWND hwndListBox = GetDlgItem (IDC_LIST_TUNING_SPACES); ::SendMessage (hwndListBox, LB_SETCURSEL, nCount, NULL); break; } ++it; ++nCount; } FillControlsFromTuneRequest (m_pTuneRequest); } else { //no tune request so get the first tuning space from the list HWND hwndListBox = GetDlgItem (IDC_LIST_TUNING_SPACES); ::SendMessage (hwndListBox, LB_SETCURSEL, 0, NULL); LRESULT dwData = ::SendMessage (hwndListBox, LB_GETITEMDATA, 0, NULL); if (dwData == LB_ERR) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } IDVBSTuningSpace* pSelTuningSpace = reinterpret_cast (dwData); if (!pSelTuningSpace) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } hr = pSelTuningSpace->get_DefaultLocator (&pLocator); if (FAILED (hr) || (!pLocator)) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } CComQIPtr pDVBSLocator (pLocator); if (!pDVBSLocator) { ASSERT (FALSE); EnableControls (FALSE); return S_OK; } FillControlFromLocator (pDVBSLocator); SetDlgItemInt (IDC_EDIT_ONID, -1); SetDlgItemInt (IDC_EDIT_TSID, -1); SetDlgItemInt (IDC_EDIT_SID, -1); } //if everything went fine EnableControls (true); return S_OK; } STDMETHOD(Apply)(void) { //ATLTRACE(_T("CDVBS_TuneRequest::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { // Do something interesting here } m_bDirty = FALSE; return S_OK; } private: CComQIPtr m_pTuner; CComQIPtr m_pEventInterface; CBDAMiscellaneous m_misc; CComQIPtr m_pTuneRequest; CComPtr m_pBroadcastEventService; DWORD m_dwEventCookie; bool m_fFirstTime; typedef std::list TUNING_SPACES; TUNING_SPACES m_tunigSpaceList;//mantaing a list of available tuning spaces //so we can access them easier LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { USES_CONVERSION; //set the spins HWND hwndSpin = GetDlgItem (IDC_SPIN_SID); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_ONID); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_CARRIER); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_SYMBOL_RATE); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_TSID); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_AZIMUTH); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_ELEVATION); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); hwndSpin = GetDlgItem (IDC_SPIN_ORBITAL_POSITION); ::SendMessage(hwndSpin, UDM_SETRANGE32, -1, 1000000000); //fill the combos HWND hwndCombo = GetDlgItem (IDC_COMBO_INNER_FEC); int nIndex = 0; MAP_FECMethod::iterator it; for (it = m_misc.m_FECMethodMap.begin ();it != m_misc.m_FECMethodMap.end ();it++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_FEC_RATE); nIndex = 0; MAP_BinaryConvolutionCodeRate::iterator it2; for (it2 = m_misc.m_BinaryConvolutionCodeRateMap.begin ();it2 != m_misc.m_BinaryConvolutionCodeRateMap.end ();it2++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it2).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it2).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_MODULATION); nIndex = 0; MAP_ModulationType::iterator it3; for (it3 = m_misc.m_ModulationTypeMap.begin ();it3 != m_misc.m_ModulationTypeMap.end ();it3++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it3).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it3).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_OUTER_FEC); nIndex = 0; MAP_FECMethod::iterator it4; for (it4 = m_misc.m_FECMethodMap.begin ();it4 != m_misc.m_FECMethodMap.end ();it4++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it4).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it4).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_OUTER_FEC_RATE); nIndex = 0; MAP_BinaryConvolutionCodeRate::iterator it5; for (it5 = m_misc.m_BinaryConvolutionCodeRateMap.begin ();it5 != m_misc.m_BinaryConvolutionCodeRateMap.end ();it5++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it5).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it5).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_OUTER_SIGNAL_POLARISATION); nIndex = 0; MAP_Polarisation::iterator it6; for (it6 = m_misc.m_PolarisationMap.begin ();it6 != m_misc.m_PolarisationMap.end ();it6++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it6).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it6).second ); ++nIndex; } hwndCombo = GetDlgItem (IDC_COMBO_SPECTRAL_INVERSION); nIndex = 0; MAP_SpectralInversion::iterator it7; for (it7 = m_misc.m_SpectralInversionMap.begin ();it7 != m_misc.m_SpectralInversionMap.end ();it7++) { nIndex = ::SendMessage ( hwndCombo, CB_INSERTSTRING, nIndex, reinterpret_cast (A2T(const_cast ((*it7).first.c_str()))) ); //set the associated data ::SendMessage ( hwndCombo, CB_SETITEMDATA, nIndex, (*it7).second ); ++nIndex; } //SetModifiedFlag (false); return 0; } void SetModifiedFlag (bool fValue) { //this will also set the m_bDirty flag SetDirty (fValue); HWND hwndSubmit = GetDlgItem (IDC_BUTTON_SUBMIT_TUNE_REQUEST); ::EnableWindow (hwndSubmit, fValue); } HRESULT FillControlFromLocator ( IDVBSLocator* pLocator ); HRESULT FillControlsFromTuneRequest ( IDVBTuneRequest* pDVBSTuneRequest ); HRESULT FillLocatorFromControls ( IDVBSLocator* pLocator ); HRESULT FillTuneRequestFromControls (IDVBTuneRequest* pTuneRequest); int AddItemToListBox ( CComBSTR strItem, IDVBSTuningSpace* const dwData ); void SelectComboBoxFromString ( UINT nID, CComBSTR strToFind ); CComBSTR GetComboText ( UINT nID ); void EnableControls ( BOOL bValue ); HRESULT GetSelectedTuningSpace (IDVBSTuningSpace** pTuneSpace) { HWND hwndListBox = GetDlgItem (IDC_LIST_TUNING_SPACES); int nSelIndex = ::SendMessage (hwndListBox, LB_GETCURSEL, NULL, NULL); if (nSelIndex == LB_ERR) { ASSERT (FALSE); return E_FAIL; } LRESULT dwData = ::SendMessage (hwndListBox, LB_GETITEMDATA, nSelIndex, NULL); if (dwData == LB_ERR) { ASSERT (FALSE); return E_FAIL; } IDVBSTuningSpace* pSelTuningSpace = reinterpret_cast (dwData); if (!pSelTuningSpace) { ASSERT (FALSE); return E_FAIL; } *pTuneSpace = pSelTuningSpace; (*pTuneSpace)->AddRef (); return S_OK; } HRESULT GetDVBSLocatorFromTuningSpace (IDVBSTuningSpace* pTuneSpace, IDVBSLocator** pDVBSLoc) { CComPtr pLocator; HRESULT hr = pTuneSpace->get_DefaultLocator (&pLocator); if (FAILED (hr) || (!pLocator)) { MESSAGEBOX (this, IDS_CANNOT_GET_DEFLOC); return E_FAIL; } CComQIPtr pDVBSLocator (pLocator); if (!pDVBSLocator) { MESSAGEBOX (this, IDS_CANNOT_GET_DEF_DVBSLOCATOR); return E_FAIL; } *pDVBSLoc = pDVBSLocator; (*pDVBSLoc)->AddRef (); return S_OK; } LRESULT OnClickedButton_rest_to_default_locator(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { CComPtr pTuneSpace; HRESULT hr = GetSelectedTuningSpace (&pTuneSpace); if (FAILED (hr) || (!pTuneSpace)) { ASSERT (FALSE); return 0; } CComPtr pDVBSLocator; GetDVBSLocatorFromTuningSpace (pTuneSpace, &pDVBSLocator); //no error FillControlFromLocator (pDVBSLocator); return 0; } LRESULT OnClickedButton_submit_tune_request(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { CComPtr pTuneSpace; HRESULT hr = GetSelectedTuningSpace (&pTuneSpace); if (FAILED (hr) || (!pTuneSpace)) { ASSERT (FALSE); return 0; } CComPtr pSelDVBSLocator; hr = GetDVBSLocatorFromTuningSpace (pTuneSpace, &pSelDVBSLocator); if (FAILED (hr) || (!pSelDVBSLocator)) { ASSERT (FALSE); return 0; } hr = FillLocatorFromControls (pSelDVBSLocator); if (FAILED (hr)) { ASSERT (FALSE); return 0; } ASSERT (m_pTuner); CComPtr pTuneRequest; hr = pTuneSpace->CreateTuneRequest (&pTuneRequest); if (FAILED (hr) || (!pTuneRequest)) { MESSAGEBOX (this, IDS_CANNOT_CREATE_NEW_TUNEREQUEST); return 0; } CComQIPtr pDVBSTuneRequest (pTuneRequest); if (!pDVBSTuneRequest) { MESSAGEBOX (this, IDS_CANNOT_RETRIEVE_DVBSTUNEREQUEST); return 0; } hr = pDVBSTuneRequest->put_Locator (pSelDVBSLocator); if (FAILED (hr)) { MESSAGEBOX (this, IDS_CANNOT_SET_LOCATOR_FOR_TUNEREQUEST); return 0; } hr = FillTuneRequestFromControls (pDVBSTuneRequest); if (FAILED (hr)) { //already pop-up a message error dialog box return 0; } hr = m_pTuner->put_TuneRequest (pDVBSTuneRequest); if (FAILED (hr)) { MESSAGEBOX (this, IDS_CANNOT_PUT_TUNE_REQUEST); return 0; } return 0; } LRESULT OnSelchangeList_tuning_spaces(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) { CComPtr pTuneSpace; HRESULT hr = GetSelectedTuningSpace (&pTuneSpace); if (FAILED (hr) || (!pTuneSpace)) { ASSERT (FALSE); return 0; } CComPtr pDVBSLocator; GetDVBSLocatorFromTuningSpace (pTuneSpace, &pDVBSLocator); //no error FillControlFromLocator (pDVBSLocator); return 0; } STDMETHOD(Fire)(GUID EventID) { #ifdef DEBUG TCHAR szInfo[MAX_PATH]; CComBSTR bstrEventID; USES_CONVERSION; StringFromCLSID (EventID, &bstrEventID); wsprintf (szInfo, _T("Notification received for %s"), OLE2T (bstrEventID)); ATLTRACE (szInfo); #endif if (EventID == EVENTID_TuningChanged) { ATLTRACE ("Starting to refresh"); Refresh (); } return S_OK; } HRESULT Refresh () { //get the tunning spaces //1. get the current tuning space CComPtr pTuneSpace; CComPtr pTuneRequest; HRESULT hr = m_pTuner->get_TuneRequest (&pTuneRequest); if ((FAILED (hr)) || (!pTuneRequest)) return E_FAIL; if (m_pTuneRequest) m_pTuneRequest.Release (); m_pTuneRequest = pTuneRequest; if (!m_pTuneRequest) //could be just the first tune request, we will get notification again.. return S_OK; FillControlsFromTuneRequest (m_pTuneRequest); return S_OK; } virtual void OnFinalMessage( HWND hWnd ) { if (m_pBroadcastEventService) { CComQIPtr pConPoint(m_pBroadcastEventService); pConPoint->Unadvise (m_dwEventCookie); } } }; #endif //__DVBSTUNEREQUESTPAGE_H_