#include "shellprv.h" #include "ids.h" #include "apprmdlg.h" #include "mtpt.h" #include "hwcmmn.h" #include "mixctnt.h" static DWORD s_rgdwHelpIDsArray[] = { // Context Help IDs IDC_AP_MXCT_TOPICON, NO_HELP, IDC_AP_MXCT_TOPTEXT, NO_HELP, IDC_AP_MXCT_TOPTEXT2, NO_HELP, IDC_AP_MXCT_LIST, NO_HELP, IDC_AP_MXCT_CHECKBOX, NO_HELP, 0, 0 }; CBaseContentDlg::CBaseContentDlg() : CBaseDlg((ULONG_PTR)s_rgdwHelpIDsArray), _pszDeviceID(NULL), _hiconInfo(NULL), _hiconTop(NULL) {} CBaseContentDlg::~CBaseContentDlg() { if (_pszDeviceID) { LocalFree((HLOCAL)_pszDeviceID); } if (_hiconInfo) { DestroyIcon(_hiconInfo); } if (_hiconTop) { DestroyIcon(_hiconTop); } } HRESULT CBaseContentDlg::_SetHandler() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler)); phandlerdata->Release(); } return hr; } HRESULT CBaseContentDlg::Init(LPCWSTR pszDeviceID, LPCWSTR pszDeviceIDAlt, DWORD dwContentType, BOOL fCheckAlwaysDoThis) { HRESULT hr = E_INVALIDARG; _fCheckAlwaysDoThis = fCheckAlwaysDoThis; if (pszDeviceID) { _pszDeviceID = StrDup(pszDeviceID); if (_pszDeviceID) { _szDeviceIDAlt[0] = 0; if (pszDeviceIDAlt) { if (InRange(*pszDeviceIDAlt, 'a', 'z') || InRange(*pszDeviceIDAlt, 'A', 'Z')) { lstrcpyn(_szDeviceIDAlt, pszDeviceIDAlt, ARRAYSIZE(_szDeviceIDAlt)); _dwContentType = dwContentType; hr = _GetContentTypeHandler(dwContentType, _szContentTypeHandler, ARRAYSIZE(_szContentTypeHandler)); } } hr = S_OK; } else { hr = E_OUTOFMEMORY; } } return hr; } #define COL_ACTION 0 #define COL_PROVIDER 1 const UINT c_auTileColumns[] = {COL_ACTION, COL_PROVIDER}; const UINT c_auTileSubItems[] = {COL_PROVIDER}; HRESULT CBaseContentDlg::_InitListView() { HWND hwndList = GetDlgItem(_hwnd, IDC_AP_MXCT_LIST); HRESULT hr = _uilListView.Init(hwndList); if (SUCCEEDED(hr)) { hr = _uilListView.InitTileInfo(c_auTileSubItems, ARRAYSIZE(c_auTileSubItems)); if (SUCCEEDED(hr)) { RECT rc = {0}; LVTILEVIEWINFO lvtvi = {0}; HIMAGELIST himagelist; ListView_SetView(hwndList, LV_VIEW_TILE); for (int i = 0; i < ARRAYSIZE(c_auTileColumns); ++i) { LVCOLUMN lvcolumn = {0}; lvcolumn.mask = LVCF_SUBITEM; lvcolumn.iSubItem = c_auTileColumns[i]; ListView_InsertColumn(hwndList, i, &lvcolumn); } GetClientRect(hwndList, &rc); lvtvi.cbSize = sizeof(LVTILEVIEWINFO); lvtvi.dwMask = LVTVIM_TILESIZE | LVTVIM_COLUMNS; lvtvi.dwFlags = LVTVIF_FIXEDWIDTH; // Leave room for the scroll bar when setting tile sizes or listview gets screwed up. lvtvi.sizeTile.cx = ((rc.right - rc.left) - GetSystemMetrics(SM_CXVSCROLL)); lvtvi.cLines = ARRAYSIZE(c_auTileSubItems); ListView_SetTileViewInfo(hwndList, &lvtvi); Shell_GetImageLists(&himagelist, NULL); if (himagelist) { ListView_SetImageList(hwndList, himagelist, LVSIL_NORMAL); hr = S_OK; } } } return hr; } LRESULT CBaseContentDlg::OnInitDialog(WPARAM wParam, LPARAM lParam) { HRESULT hr = _InitListView(); if (SUCCEEDED(hr)) { hr = _FillListView(); if (SUCCEEDED(hr)) { hr = _InitStaticsCommon(); if (SUCCEEDED(hr)) { hr = _InitStatics(); if (SUCCEEDED(hr)) { hr = _InitSelections(); } } } } if (_szDeviceIDAlt[0]) { _SetAutoplayPromptHWND(_szDeviceIDAlt, _hwnd); } return TRUE; } LRESULT CBaseContentDlg::OnNotify(WPARAM wParam, LPARAM lParam) { LRESULT lRes = FALSE; LPNMHDR pNMHDR = (NMHDR *)lParam; UINT_PTR idFrom = pNMHDR->idFrom; UINT uCode = pNMHDR->code; switch (idFrom) { case IDC_AP_MXCT_LIST: if (LVN_ITEMCHANGED == uCode) { NMLISTVIEW* pNMLV = (NMLISTVIEW*)pNMHDR; // Is a new item being selected/unselected? if (pNMLV->uChanged & LVIF_STATE) { // Yes _OnListSelChange(); } } else if (NM_DBLCLK == uCode) { OnOK(0); } lRes = CBaseDlg::OnNotify(wParam, lParam); break; default: lRes = CBaseDlg::OnNotify(wParam, lParam); break; } return lRes; } LRESULT CBaseContentDlg::OnDestroy(WPARAM wParam, LPARAM lParam) { _uilListView.ResetContent(); return CBaseDlg::OnDestroy(wParam, lParam); } LRESULT CBaseContentDlg::OnOK(WORD wNotif) { // Wait cursor... EndDialog(_hwnd, IDOK); return FALSE; } LRESULT CBaseContentDlg::OnCancel(WORD wNotif) { EndDialog(_hwnd, IDCANCEL); return FALSE; } HRESULT CBaseContentDlg::_InitStaticsCommon() { // Initialize _szDeviceName to something HRESULT hr = _InitDeviceName(); if (SUCCEEDED(hr)) { SetWindowText(_hwnd, _szDeviceName); } if (_fCheckAlwaysDoThis) { Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis); } if (_szDeviceIDAlt[0]) { // Initialize _szDeviceName to something CMountPoint* pmtpt = CMountPoint::GetMountPoint(_szDeviceIDAlt); if (pmtpt) { WCHAR szIconLocation[MAX_PATH + 12]; int iIcon = pmtpt->GetIcon(szIconLocation, ARRAYSIZE(szIconLocation)); if (SUCCEEDED(hr)) { if (!szIconLocation[0]) { lstrcpy(szIconLocation, TEXT("shell32.dll")); } int iImage = Shell_GetCachedImageIndex(szIconLocation, iIcon, 0); HIMAGELIST himagelist; if ((-1 != iImage) && Shell_GetImageLists(&himagelist, NULL)) { _hiconTop = ImageList_GetIcon(himagelist, iImage, ILD_TRANSPARENT); SendDlgItemMessage(_hwnd, IDC_AP_MXCT_TOPICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop); } } pmtpt->Release(); } } return hr; } HRESULT CBaseContentDlg::_InitDeviceName() { HRESULT hr = E_FAIL; if (_szDeviceIDAlt[0]) { CMountPoint* pmtpt = CMountPoint::GetMountPoint(_szDeviceIDAlt); if (pmtpt) { hr = pmtpt->GetDisplayName(_szDeviceName, ARRAYSIZE(_szDeviceName)); pmtpt->Release(); } } if (FAILED(hr)) { GetWindowText(_hwnd, _szDeviceName, ARRAYSIZE(_szDeviceName)); hr = S_FALSE; } return hr; } /////////////////////////////////////////////////////////////////////////////// CHWContentPromptDlg::CHWContentPromptDlg() : CBaseContentDlg() {} CHWContentPromptDlg::~CHWContentPromptDlg() {} HRESULT CHWContentPromptDlg::_InitDataObjects() { HRESULT hr = _data.Init(_pszDeviceID, _dwContentType); if (SUCCEEDED(hr)) { hr = _dlmanager.AddDataObject(&_data); } return hr; } HRESULT CHWContentPromptDlg::_FillListView() { HRESULT hr = _InitDataObjects(); if (SUCCEEDED(hr)) { int c = _data.GetHandlerCount(); for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CHandlerData* phandlerdata = _data.GetHandlerData(i); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem(); if (puidata) { hr = puidata->InitData(phandlerdata); if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); } if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; } phandlerdata->Release(); } } } return hr; } HRESULT CHWContentPromptDlg::_InitStatics() { // Set content icon if (_hiconTop) { DestroyIcon(_hiconTop); } _hiconTop = _GetIconFromIconLocation(_data._szIconLocation, FALSE); SendDlgItemMessage(_hwnd, IDC_AP_MXCT_CONTENTICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop); // Set content name SetDlgItemText(_hwnd, IDC_AP_MXCT_CONTENTTYPE, _data._szIconLabel); return S_OK; } HRESULT CHWContentPromptDlg::_InitSelections() { HRESULT hr; if (_data._pszHandlerDefaultOriginal && *(_data._pszHandlerDefaultOriginal)) { hr = _uilListView.SelectItem(_data._pszHandlerDefaultOriginal); } else { hr = _uilListView.SelectFirstItem(); } if (SUCCEEDED(hr)) { CHandlerData* phandlerdata; hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler)); _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler); phandlerdata->Release(); } } Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis); return hr; } HRESULT CHWContentPromptDlg::_UpdateHandlerSettings() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler); phandlerdata->Release(); } return hr; } HRESULT CHWContentPromptDlg::_OnListSelChange() { return _UpdateHandlerSettings(); } LRESULT CHWContentPromptDlg::OnOK(WORD wNotif) { if (BST_CHECKED == Button_GetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX))) { _SaveSettings(FALSE); // return value???? } else { _SaveSettings(TRUE); } _SetHandler(); // Do default processing return CBaseContentDlg::OnOK(wNotif); } HRESULT CHWContentPromptDlg::_SaveSettings(BOOL fSoftCommit) { _data._fSoftCommit = fSoftCommit; return _dlmanager.Commit(); } CMixedContentDlg::CMixedContentDlg() : _dpaContentTypeData(NULL) { } CMixedContentDlg::~CMixedContentDlg() { if (_dpaContentTypeData) { int c = _dpaContentTypeData.GetPtrCount(); for (int i = 0; i < c; ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i); pdata->Release(); } _dpaContentTypeData.Destroy(); } } const DWORD c_rgdwContentTypeAutoplay[] = { CT_AUTOPLAYMUSIC, CT_AUTOPLAYPIX, CT_AUTOPLAYMOVIE, }; HRESULT CMixedContentDlg::_InitDataObjects() { HRESULT hr = _dpaContentTypeData.Create(4) ? S_OK : E_OUTOFMEMORY; if (SUCCEEDED(hr)) { for (DWORD dw = 0; dw < ARRAYSIZE(c_rgdwContentTypeAutoplay); ++dw) { if (_dwContentType & c_rgdwContentTypeAutoplay[dw]) { CContentTypeData* pdata = new CContentTypeData(); if (pdata) { hr = pdata->Init(_pszDeviceID, _dwContentType & c_rgdwContentTypeAutoplay[dw]); if (SUCCEEDED(hr)) { if (-1 == _dpaContentTypeData.AppendPtr(pdata)) { hr = E_OUTOFMEMORY; } } if (FAILED(hr)) { pdata->Release(); } } else { hr = E_OUTOFMEMORY; } } } if (SUCCEEDED(hr)) { // Eliminate the duplicates. Go thru all the content types // and then thru all their handlers and see if their would // not be two duplicate handlers that were brought by two diff // content type. E.g.: Open folder is registered for music, // pictures and video int cContentType = _dpaContentTypeData.GetPtrCount(); for (int iContentType = 0; iContentType < cContentType; ++iContentType) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(iContentType); if (pdata) { int cHandler = pdata->GetHandlerCount(); for (int iHandler = 0; iHandler < cHandler; ++iHandler) { CHandlerData* phandlerdata = pdata->GetHandlerData(iHandler); if (phandlerdata) { for (int iContentTypeInner = 0; iContentTypeInner < cContentType; ++iContentTypeInner) { BOOL fExitInnerLoop = FALSE; // Cannot have duplicate handler within same content type if (iContentTypeInner != iContentType) { CContentTypeData* pdataInner = _dpaContentTypeData.GetPtr(iContentTypeInner); if (pdataInner) { int cHandlerInner = pdataInner->GetHandlerCount(); for (int iHandlerInner = 0; !fExitInnerLoop && (iHandlerInner < cHandlerInner); ++iHandlerInner) { CHandlerData* phandlerdataInner = pdataInner->GetHandlerData(iHandlerInner); if (phandlerdataInner) { if (!lstrcmp(phandlerdataInner->_pszHandler, phandlerdata->_pszHandler)) { pdataInner->RemoveHandler(iHandlerInner); // Can be only one duplicate for a // handler within another content type fExitInnerLoop = TRUE; } phandlerdataInner->Release(); } } } } } phandlerdata->Release(); } } } } } } else { hr = E_OUTOFMEMORY; } return hr; } HRESULT CMixedContentDlg::_FillListView() { HRESULT hr = _InitDataObjects(); if (SUCCEEDED(hr)) { if (_dpaContentTypeData) { int c = _dpaContentTypeData.GetPtrCount(); for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i); if (pdata) { pdata->AddRef(); int cHandler = pdata->GetHandlerCount(); for (int j = 0; SUCCEEDED(hr) && (j < cHandler); ++j) { CHandlerData* phandlerdata = pdata->GetHandlerData(j); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem(); if (puidata) { hr = puidata->InitData(phandlerdata); if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); } if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; } phandlerdata->Release(); } } pdata->Release(); } } } } return hr; } HRESULT CMixedContentDlg::_InitStatics() { return S_OK; } HRESULT CMixedContentDlg::_InitSelections() { HRESULT hr = _uilListView.SelectFirstItem(); if (SUCCEEDED(hr)) { CHandlerData* phandlerdata; hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler)); phandlerdata->Release(); } } return hr; } HRESULT CMixedContentDlg::_OnListSelChange() { return S_OK; } LRESULT CMixedContentDlg::OnOK(WORD wNotif) { _SetHandler(); if (_dpaContentTypeData) { BOOL fFound = FALSE; int c = _dpaContentTypeData.GetPtrCount(); for (int i = 0; !fFound && (i < c); ++i) { CContentTypeData* pdata = _dpaContentTypeData.GetPtr(i); if (pdata) { pdata->AddRef(); int cHandler = pdata->GetHandlerCount(); for (int j = 0; !fFound && (j < cHandler); ++j) { CHandlerData* phandlerdata = pdata->GetHandlerData(j); if (phandlerdata) { if (!lstrcmp(phandlerdata->_pszHandler, _szHandler)) { lstrcpyn(_szContentTypeHandler, pdata->_szContentTypeHandler, ARRAYSIZE(_szContentTypeHandler)); fFound = TRUE; } phandlerdata->Release(); } } pdata->Release(); } } } // Do default processing return CBaseContentDlg::OnOK(wNotif); } /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// CNoContentDlg::CNoContentDlg() : CBaseContentDlg() {} CNoContentDlg::~CNoContentDlg() {} HRESULT CNoContentDlg::_InitDataObjects() { HRESULT hr = _data.Init(_pszDeviceID); if (SUCCEEDED(hr)) { hr = _dlmanager.AddDataObject(&_data); } _SetAutoplayPromptHWND(_pszDeviceID, _hwnd); return hr; } HRESULT CNoContentDlg::_FillListView() { HRESULT hr = _InitDataObjects(); if (SUCCEEDED(hr)) { int c = _data.GetHandlerCount(); for (int i = 0; SUCCEEDED(hr) && (i < c); ++i) { CHandlerData* phandlerdata = _data.GetHandlerData(i); if (phandlerdata) { CHandlerLVItem* puidata = new CHandlerLVItem(); if (puidata) { hr = puidata->InitData(phandlerdata); if (SUCCEEDED(hr)) { hr = _uilListView.AddItem(puidata); } if (FAILED(hr)) { delete puidata; } } else { hr = E_OUTOFMEMORY; } phandlerdata->Release(); } } } return hr; } HRESULT CNoContentDlg::_InitStatics() { if (_hiconTop) { DestroyIcon(_hiconTop); } // Set device icon _hiconTop = _GetIconFromIconLocation(_data._pszIconLocation, TRUE); SendDlgItemMessage(_hwnd, IDC_AP_MXCT_TOPICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)_hiconTop); // Set device name SetWindowText(_hwnd, _data._pszIconLabel); return S_OK; } HRESULT CNoContentDlg::_InitSelections() { HRESULT hr; if (_data._pszHandlerDefaultOriginal && *(_data._pszHandlerDefaultOriginal)) { hr = _uilListView.SelectItem(_data._pszHandlerDefaultOriginal); } else { hr = _uilListView.SelectFirstItem(); } if (SUCCEEDED(hr)) { CHandlerData* phandlerdata; hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { lstrcpyn(_szHandler, phandlerdata->_pszHandler, ARRAYSIZE(_szHandler)); _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler); phandlerdata->Release(); } } Button_SetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX), _fCheckAlwaysDoThis); return hr; } HRESULT CNoContentDlg::_UpdateHandlerSettings() { CHandlerData* phandlerdata; HRESULT hr = _uilListView.GetSelectedItemData(&phandlerdata); if (SUCCEEDED(hr)) { _SetHandlerDefault(&(_data._pszHandlerDefault), phandlerdata->_pszHandler); phandlerdata->Release(); } return hr; } HRESULT CNoContentDlg::_OnListSelChange() { return _UpdateHandlerSettings(); } LRESULT CNoContentDlg::OnOK(WORD wNotif) { if (BST_CHECKED == Button_GetCheck(GetDlgItem(_hwnd, IDC_AP_MXCT_CHECKBOX))) { _SaveSettings(FALSE); // return value???? } else { _SaveSettings(TRUE); } _SetHandler(); // Do default processing return CBaseContentDlg::OnOK(wNotif); } HRESULT CNoContentDlg::_SaveSettings(BOOL fSoftCommit) { _data._fSoftCommit = fSoftCommit; return _dlmanager.Commit(); }