#include "precomp.h" #include "rsop.h" #include "channels.h" #include static BOOL CALLBACK addEditChannelRSoPProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); ///////////////////////////////////////////////////////////////////// DWORD AddItemsToList(HWND hwndList, CDlgRSoPData *pDRD, BSTR bstrTempClass, BOOL bCategory, PCHANNEL paChannels) { DWORD dwRet = 0; __try { _bstr_t bstrClass = bstrTempClass; CPSObjData **paObj = NULL; long nObjects = 0; HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass, L"rsopPrecedence", &paObj, &nObjects); if (SUCCEEDED(hr)) { // For each button returned from any GPO long nObj; PCHANNEL pChan; for (nObj = 0, pChan = paChannels; nObj < nObjects; nObj++, pChan++) { _bstr_t bstrGPOName = L" ("; bstrGPOName += pDRD->GetGPONameFromPSAssociation(paObj[nObj]->pObj, L"rsopPrecedence") + L")"; pChan->fCategory = bCategory; // title field _variant_t vtValue; hr = paObj[nObj]->pObj->Get(L"title", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { _bstr_t bstrValue = vtValue; _bstr_t bstrEntry = bstrValue + bstrGPOName; StrCpy(pChan->szTitle, (LPCTSTR)bstrValue); if (bCategory) { // categoryHTMLPage field hr = paObj[nObj]->pObj->Get(L"categoryHTMLPage", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { bstrValue = vtValue; StrCpy(pChan->szWebUrl, (LPCTSTR)bstrValue); } } else { // channelDefinitionURL field hr = paObj[nObj]->pObj->Get(L"channelDefinitionURL", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { bstrValue = vtValue; StrCpy(pChan->szWebUrl, (LPCTSTR)bstrValue); } // channelDefinitionFilePath field hr = paObj[nObj]->pObj->Get(L"channelDefinitionFilePath", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { bstrValue = vtValue; StrCpy(pChan->szPreUrlPath, (LPCTSTR)bstrValue); } // makeAvailableOffline hr = paObj[nObj]->pObj->Get(L"makeAvailableOffline", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) pChan->fOffline = (bool)vtValue ? TRUE : FALSE; } // iconPath field hr = paObj[nObj]->pObj->Get(L"iconPath", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { bstrValue = vtValue; StrCpy(pChan->szIcon, (LPCTSTR)bstrValue); } // narrowImagePath field hr = paObj[nObj]->pObj->Get(L"narrowImagePath", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { bstrValue = vtValue; StrCpy(pChan->szLogo, (LPCTSTR)bstrValue); } int nItem = (int)SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)((LPCTSTR)bstrEntry)); SendMessage(hwndList, LB_SETITEMDATA, (WPARAM)nItem, (LPARAM)pChan); } } dwRet = nObj; CoTaskMemFree(paObj); } } __except(TRUE) { } return dwRet; } ///////////////////////////////////////////////////////////////////// DWORD InitChannelsDlgInRSoPMode(HWND hDlg, CDlgRSoPData *pDRD) { DWORD dwRet = 0; __try { // First go through all PS objects and look for channels data _bstr_t bstrClass = L"RSOP_IEAKPolicySetting"; HRESULT hr = pDRD->GetArrayOfPSObjects(bstrClass); if (SUCCEEDED(hr)) { CPSObjData **paPSObj = pDRD->GetPSObjArray(); long nPSObjects = pDRD->GetPSObjCount(); BOOL bDeleteHandled = FALSE; BOOL bEnableHandled = FALSE; for (long nObj = 0; nObj < nPSObjects; nObj++) { // deleteExistingChannels field _variant_t vtValue; if (!bDeleteHandled) { hr = paPSObj[nObj]->pObj->Get(L"deleteExistingChannels", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { if ((bool)vtValue) CheckDlgButton(hDlg, IDC_DELETECHANNELS, BST_CHECKED); bDeleteHandled = TRUE; } } // enableDesktopChannelBarByDefault field if (!bEnableHandled) { hr = paPSObj[nObj]->pObj->Get(L"enableDesktopChannelBarByDefault", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) { if ((bool)vtValue) CheckDlgButton(hDlg, IDC_CHANBARON, BST_CHECKED); bEnableHandled = TRUE; } } // no need to process other GPOs since enabled properties have been found if (bDeleteHandled && bEnableHandled) break; } } EnableDlgItem2(hDlg, IDC_DELETECHANNELS, FALSE); EnableDlgItem2(hDlg, IDC_CHANBARON, FALSE); EnableDlgItem2(hDlg, IDC_DELETELINKS, FALSE); // Now go through all Channel & Category objects and populate the list HWND hwndList = GetDlgItem(hDlg, IDC_CHANNELLIST); SendDlgItemMessage(hDlg, IDC_CHANNELLIST, LB_RESETCONTENT, 0, 0); PCHANNEL paChannels = (PCHANNEL)CoTaskMemAlloc(sizeof(CHANNEL) * MAX_CHAN); if (NULL != paChannels) { ZeroMemory(paChannels, sizeof(CHANNEL) * MAX_CHAN); PCHANNEL paOldChannels = (PCHANNEL)SetWindowLongPtr(hwndList, GWLP_USERDATA, (LONG_PTR)paChannels); // delete previous allocation(mainly for profile manager) if (paOldChannels != NULL) CoTaskMemFree(paOldChannels); AddItemsToList(hwndList, pDRD, L"RSOP_IEChannelItem", FALSE, paChannels); AddItemsToList(hwndList, pDRD, L"RSOP_IECategoryItem", TRUE, paChannels); } SendMessage(hwndList, LB_SETCURSEL, (WPARAM)-1, 0); EnableDlgItem2(hDlg, IDC_ADDCATEGORY, FALSE); EnableDlgItem2(hDlg, IDC_ADDCHANNEL, FALSE); EnableDlgItem2(hDlg, IDC_REMOVECHANNEL, FALSE); EnableDlgItem2(hDlg, IDC_EDITCHANNEL, FALSE); EnableDlgItem2(hDlg, IDC_IMPORTCHAN, FALSE); } __except(TRUE) { } return dwRet; } ///////////////////////////////////////////////////////////////////// HRESULT InitChanDeletePrecPage(CDlgRSoPData *pDRD, HWND hwndList) { HRESULT hr = NOERROR; __try { _bstr_t bstrClass = L"RSOP_IEAKPolicySetting"; hr = pDRD->GetArrayOfPSObjects(bstrClass); if (SUCCEEDED(hr)) { CPSObjData **paPSObj = pDRD->GetPSObjArray(); long nPSObjects = pDRD->GetPSObjCount(); for (long nObj = 0; nObj < nPSObjects; nObj++) { _bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj); // deleteExistingChannels field BOOL bDelete = FALSE; _variant_t vtValue; hr = paPSObj[nObj]->pObj->Get(L"deleteExistingChannels", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) bDelete = (bool)vtValue ? TRUE : FALSE; _bstr_t bstrSetting; if (bDelete) { TCHAR szTemp[MAX_PATH]; LoadString(g_hInstance, IDS_DELETE_CHAN_SETTING, szTemp, countof(szTemp)); bstrSetting = szTemp; } else bstrSetting = GetDisabledString(); InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting); } } } __except(TRUE) { } return hr; } ///////////////////////////////////////////////////////////////////// HRESULT InitChanEnablePrecPage(CDlgRSoPData *pDRD, HWND hwndList) { HRESULT hr = NOERROR; __try { _bstr_t bstrClass = L"RSOP_IEAKPolicySetting"; hr = pDRD->GetArrayOfPSObjects(bstrClass); if (SUCCEEDED(hr)) { CPSObjData **paPSObj = pDRD->GetPSObjArray(); long nPSObjects = pDRD->GetPSObjCount(); for (long nObj = 0; nObj < nPSObjects; nObj++) { _bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj); // enableDesktopChannelBarByDefault field BOOL bEnable = FALSE; _variant_t vtValue; hr = paPSObj[nObj]->pObj->Get(L"enableDesktopChannelBarByDefault", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) bEnable = (bool)vtValue ? TRUE : FALSE; _bstr_t bstrSetting; if (bEnable) { TCHAR szTemp[MAX_PATH]; LoadString(g_hInstance, IDS_ENABLE_CHBAR_SETTING, szTemp, countof(szTemp)); bstrSetting = szTemp; } else bstrSetting = GetDisabledString(); InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting); } } } __except(TRUE) { } return hr; } ///////////////////////////////////////////////////////////////////// HRESULT InitChannelsPrecPage(CDlgRSoPData *pDRD, HWND hwndList) { HRESULT hr = NOERROR; __try { _bstr_t bstrClass = L"RSOP_IEAKPolicySetting"; hr = pDRD->GetArrayOfPSObjects(bstrClass); if (SUCCEEDED(hr)) { CPSObjData **paPSObj = pDRD->GetPSObjArray(); long nPSObjects = pDRD->GetPSObjCount(); for (long nObj = 0; nObj < nPSObjects; nObj++) { _bstr_t bstrGPOName = pDRD->GetGPONameFromPS(paPSObj[nObj]->pObj); // channels field long nChan = 0, nCat = 0; _variant_t vtValue; hr = paPSObj[nObj]->pObj->Get(L"channels", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) nChan = vtValue; // categories field hr = paPSObj[nObj]->pObj->Get(L"categories", 0, &vtValue, NULL, NULL); if (SUCCEEDED(hr) && !IsVariantNull(vtValue)) nCat = vtValue; _bstr_t bstrSetting; if (nChan > 0 || nCat > 0) { TCHAR szTemp[MAX_PATH]; LoadString(g_hInstance, IDS_CHAN_AND_CAT_SETTING, szTemp, countof(szTemp)); TCHAR szSetting[MAX_PATH]; wnsprintf(szSetting, countof(szSetting), szTemp, nChan, nCat); bstrSetting = szSetting; } else bstrSetting = GetDisabledString(); InsertPrecedenceListItem(hwndList, nObj, bstrGPOName, bstrSetting); } } } __except(TRUE) { } return hr; } ///////////////////////////////////////////////////////////////////// BOOL CALLBACK addEditChannelRSoPProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { PCHANNEL pSelCh = (PCHANNEL)lParam; if (pSelCh->fCategory) { EnableDBCSChars(hDlg, IDC_CATEGORYHTML); EnableDBCSChars(hDlg, IDE_CATEGORYTITLE); SetDlgItemText(hDlg, IDC_CATEGORYHTML, pSelCh->szWebUrl); SetDlgItemText(hDlg, IDE_CATEGORYTITLE, pSelCh->szTitle); EnableDlgItem2(hDlg, IDC_CATEGORYHTML, FALSE); EnableDlgItem2(hDlg, IDE_CATEGORYTITLE, FALSE); EnableDlgItem2(hDlg, IDC_BROWSECATHTML, FALSE); } else { EnableDBCSChars(hDlg, IDE_CHANNELSRVURL2); EnableDBCSChars(hDlg, IDE_CHANNELTITLE2); SetDlgItemText(hDlg, IDE_CHANNELSRVURL2, pSelCh->szWebUrl); SetDlgItemText(hDlg, IDE_CHANNELTITLE2, pSelCh->szTitle); EnableDlgItem2(hDlg, IDE_CHANNELSRVURL2, FALSE); EnableDlgItem2(hDlg, IDE_CHANNELTITLE2, FALSE); EnableDlgItem2(hDlg, IDC_BROWSECDF2, FALSE); } EnableDBCSChars(hDlg, IDC_CHANNELBITMAP2); EnableDBCSChars(hDlg, IDC_CHANNELICON2); SetDlgItemText(hDlg, IDC_CHANNELBITMAP2, pSelCh->szLogo); SetDlgItemText(hDlg, IDC_CHANNELICON2, pSelCh->szIcon); EnableDlgItem2(hDlg, IDC_CHANNELBITMAP2, FALSE); EnableDlgItem2(hDlg, IDC_CHANNELICON2, FALSE); EnableDlgItem2(hDlg, IDC_BROWSECHICO2, FALSE); EnableDlgItem2(hDlg, IDC_BROWSECHBMP2, FALSE); if (!pSelCh->fCategory) { EnableDBCSChars(hDlg, IDC_CHANNELURL2); SetDlgItemText(hDlg, IDC_CHANNELURL2, pSelCh->szPreUrlPath); if (pSelCh->fOffline) CheckDlgButton(hDlg, IDC_CHANNELOFFL, BST_CHECKED); EnableDlgItem2(hDlg, IDC_CHANNELURL2, FALSE); EnableDlgItem2(hDlg, IDC_CHANNELOFFL, FALSE); } break; } case WM_COMMAND: switch(HIWORD(wParam)) { case BN_CLICKED: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog( hDlg, IDCANCEL ); break; case IDOK: EndDialog( hDlg, IDOK ); break; } break; } break; default: return FALSE; } return TRUE; }