|
|
#include "settings.h"
#include "setenum.h"
#include "dtctreg.h"
#include "svcsync.h"
#include "sfstr.h"
#include "cmmn.h"
#include "misc.h"
#include <shlwapi.h>
#include "tfids.h"
#include "dbg.h"
#define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0]))
HRESULT _GetEventHandlerHelper(LPCWSTR pszDeviceID, LPCWSTR pszEventType, LPWSTR pszEventHandler, DWORD cchEventHandler) { CHWDeviceInst* phwdevinst; CNamedElem* pelemToRelease; HRESULT hr = _GetHWDeviceInstFromDeviceOrVolumeIntfID(pszDeviceID, &phwdevinst, &pelemToRelease);
if (SUCCEEDED(hr) && (S_FALSE != hr)) { WCHAR szDeviceHandler[MAX_DEVICEHANDLER];
hr = _GetDeviceHandler(phwdevinst, szDeviceHandler, ARRAYSIZE(szDeviceHandler));
if (SUCCEEDED(hr) && (S_FALSE != hr)) { hr = _GetEventHandlerFromDeviceHandler(szDeviceHandler, pszEventType, pszEventHandler, cchEventHandler); }
pelemToRelease->RCRelease(); }
return hr; }
HRESULT CAutoplayHandlerImpl::_Init(LPCWSTR pszDeviceID, LPCWSTR pszEventType) { HRESULT hr = _GetDeviceID(pszDeviceID, _szDeviceIDReal, ARRAYSIZE(_szDeviceIDReal)); if (SUCCEEDED(hr)) { hr = _GetEventHandlerHelper(_szDeviceIDReal, pszEventType, _szEventHandler, ARRAYSIZE(_szEventHandler));
if (SUCCEEDED(hr)) { if (S_FALSE != hr) { _fInited = TRUE; } else { hr = E_FAIL; } } else { TRACE(TF_SHHWDTCTDTCTREG, TEXT("_Init, _GetEventHandlerHelper FAILED or S_FALSE'd: 0x%08X"), hr); } } else { TRACE(TF_SHHWDTCTDTCTREG, TEXT("_Init, _GetDeviceID FAILED: 0x%08X"), hr); }
return hr; }
STDMETHODIMP CAutoplayHandlerImpl::Init(LPCWSTR pszDeviceID, LPCWSTR pszEventType) { HRESULT hr;
if (pszDeviceID && *pszDeviceID && pszEventType && *pszEventType) { hr = _Init(pszDeviceID, pszEventType); } else { hr = E_INVALIDARG; }
return hr; }
STDMETHODIMP CAutoplayHandlerImpl::InitWithContent(LPCWSTR pszDeviceID, LPCWSTR /*pszEventType*/, LPCWSTR pszContentTypeHandler) { HRESULT hr; if (pszDeviceID && *pszDeviceID && pszContentTypeHandler && *pszContentTypeHandler) { hr = _GetDeviceID(pszDeviceID, _szDeviceIDReal, ARRAYSIZE(_szDeviceIDReal));
if (SUCCEEDED(hr)) { if (!lstrcmpi(pszContentTypeHandler, TEXT("CDAudioContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("PlayCDAudioOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("DVDMovieContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("PlayDVDMovieOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("BlankCDContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("HandleCDBurningOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("MusicFilesContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("PlayMusicFilesOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("PicturesContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("ShowPicturesOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("VideoFilesContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("PlayVideoFilesOnArrival"), ARRAYSIZE(_szEventHandler)); } else if (!lstrcmpi(pszContentTypeHandler, TEXT("MixedContentHandler"))) { hr = SafeStrCpyN(_szEventHandler, TEXT("MixedContentOnArrival"), ARRAYSIZE(_szEventHandler)); } else { hr = E_FAIL; }
if (SUCCEEDED(hr)) { _fInited = TRUE; } } else { TRACE(TF_SHHWDTCTDTCTREG, TEXT("_Init, _GetDeviceID FAILED: 0x%08X"), hr); } } else { hr = E_INVALIDARG; }
return hr; }
STDMETHODIMP CAutoplayHandlerImpl::GetDefaultHandler(LPWSTR* ppszHandler) { HRESULT hr;
TRACE(TF_SHHWDTCTDTCTREG, TEXT("Entered CAutoplayHandlerImpl"));
if (ppszHandler) { *ppszHandler = NULL;
if (_fInited) { WCHAR szHandler[MAX_HANDLER];
hr = _GetUserDefaultHandler(_szDeviceIDReal, _szEventHandler, szHandler, ARRAYSIZE(szHandler), GUH_IMPERSONATEUSER);
if (SUCCEEDED(hr)) { if (S_FALSE != hr) { // Watch out! The hr from _GetUserDefaultHandler is more
// than just S_OK/S_FALSE. Keep its value, unless we fail!
HRESULT hrTmp = _CoTaskMemCopy(szHandler, ppszHandler);
if (FAILED(hrTmp)) { hr = hrTmp; } } else { hr = E_FAIL; } } } else { hr = E_FAIL; } } else { hr = E_POINTER; }
return hr; }
#define SOFTPREFIX TEXT("[soft]")
STDMETHODIMP CAutoplayHandlerImpl::SetDefaultHandler(LPCWSTR pszHandler) { HRESULT hr;
if (_fInited) { if (pszHandler && *pszHandler) { if (StrNCmp(SOFTPREFIX, pszHandler, (ARRAYSIZE(SOFTPREFIX) - 1))) { hr = _SetUserDefaultHandler(_szDeviceIDReal, _szEventHandler, pszHandler); } else { hr = _SetSoftUserDefaultHandler(_szDeviceIDReal, _szEventHandler, pszHandler + ARRAYSIZE(SOFTPREFIX) - 1); } } else { hr = E_INVALIDARG; } } else { hr = E_FAIL; }
return hr; }
STDMETHODIMP CAutoplayHandlerImpl::EnumHandlers(IEnumAutoplayHandler** ppenum) { HRESULT hr;
if (ppenum) { *ppenum = NULL;
if (_fInited) { CEnumAutoplayHandler* penum = new CEnumAutoplayHandler(NULL);
if (penum) { hr = penum->_Init(_szEventHandler);
if (SUCCEEDED(hr)) { *ppenum = penum; } else { delete penum; } } else { hr = E_OUTOFMEMORY; } } else { hr = E_FAIL; } } else { hr = E_INVALIDARG; }
return hr; }
CAutoplayHandlerImpl::CAutoplayHandlerImpl() : _fInited(FALSE) { _CompleteShellHWDetectionInitialization(); }
//
CAutoplayHandlerPropertiesImpl::CAutoplayHandlerPropertiesImpl() : _fInited(FALSE) { _CompleteShellHWDetectionInitialization(); }
STDMETHODIMP CAutoplayHandlerPropertiesImpl::Init(LPCWSTR pszHandler) { HRESULT hr;
if (pszHandler && *pszHandler) { if (!_fInited) { hr = SafeStrCpyN(_szHandler, pszHandler, ARRAYSIZE(_szHandler));
if (SUCCEEDED(hr)) { _fInited = TRUE; } } else { hr = E_UNEXPECTED; } } else { hr = E_INVALIDARG; }
return hr; }
STDMETHODIMP CAutoplayHandlerPropertiesImpl::GetInvokeProgIDAndVerb( LPWSTR* ppszInvokeProgID, LPWSTR* ppszInvokeVerb) { HRESULT hr;
if (ppszInvokeProgID && ppszInvokeVerb) { *ppszInvokeProgID = NULL; *ppszInvokeVerb = NULL;
if (_fInited) { WCHAR szInvokeProgID[MAX_INVOKEPROGID];
hr = _GetInvokeProgIDFromHandler(_szHandler, szInvokeProgID, ARRAYSIZE(szInvokeProgID));
if (SUCCEEDED(hr) && (S_FALSE != hr)) { WCHAR szInvokeVerb[MAX_INVOKEVERB];
hr = _GetInvokeVerbFromHandler(_szHandler, szInvokeVerb, ARRAYSIZE(szInvokeVerb));
if (SUCCEEDED(hr) && (S_FALSE != hr)) { hr = _CoTaskMemCopy(szInvokeProgID, ppszInvokeProgID);
if (SUCCEEDED(hr)) { hr = _CoTaskMemCopy(szInvokeVerb, ppszInvokeVerb);
if (FAILED(hr)) { if (*ppszInvokeProgID) { CoTaskMemFree((PVOID)*ppszInvokeProgID); *ppszInvokeProgID = NULL; } } } } }
if (S_FALSE == hr) { hr = E_FAIL; } } else { hr = E_UNEXPECTED; } } else { hr = E_INVALIDARG; }
return hr; }
|