// gfldset.cpp // // A class that manages global folder settings. #include "priv.h" #include "sccls.h" class CGlobalFolderSettings : public IGlobalFolderSettings { public: // *** IUnknown methods *** STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj); STDMETHOD_(ULONG,AddRef)(THIS); STDMETHOD_(ULONG,Release)(THIS); // *** IGlobalFolderSettings meTHODs *** STDMETHOD(Get)(THIS_ DEFFOLDERSETTINGS *pdfs, int cbDfs); STDMETHOD(Set)(THIS_ const DEFFOLDERSETTINGS *pdfs, int cbDfs, UINT flags); protected: friend HRESULT CGlobalFolderSettings_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi); CGlobalFolderSettings(); ~CGlobalFolderSettings(); LONG m_cRef; }; STDAPI CGlobalFolderSettings_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi) { // class factory will take care of denying aggregation and giving a null // back on failure ASSERT(pUnkOuter == NULL); CGlobalFolderSettings* pid = new CGlobalFolderSettings(); if (pid) { *ppunk = SAFECAST(pid, IGlobalFolderSettings*); return S_OK; } else { return E_OUTOFMEMORY; } } ///////////////////////////////////////////////////////////////////////////////////////////////////// CGlobalFolderSettings::CGlobalFolderSettings() : m_cRef(1) { } ///////////////////////////////////////////////////////////////////////////////////////////////////// CGlobalFolderSettings::~CGlobalFolderSettings() { } ///////////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CGlobalFolderSettings::QueryInterface ( REFIID riid, LPVOID * ppvObj ) { if ( riid == IID_IUnknown || riid == IID_IGlobalFolderSettings) { *ppvObj = SAFECAST( this, IGlobalFolderSettings *); AddRef(); } else { return E_NOINTERFACE; } return NOERROR; } ///////////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CGlobalFolderSettings:: AddRef () { return InterlockedIncrement( &m_cRef ); } ///////////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_( ULONG ) CGlobalFolderSettings:: Release () { ASSERT( 0 != m_cRef ); ULONG cRef = InterlockedDecrement( &m_cRef ); if ( 0 == cRef ) { delete this; } return cRef; } ///////////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CGlobalFolderSettings::Get(DEFFOLDERSETTINGS *pdfs, int cbDfs) { if (cbDfs < sizeof(DEFFOLDERSETTINGS_W2K)) { return E_INVALIDARG; } else if (cbDfs > sizeof(DEFFOLDERSETTINGS)) { ZeroMemory(pdfs, cbDfs); } CopyMemory(pdfs, &g_dfs, min(cbDfs, sizeof(g_dfs))); return S_OK; } ///////////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CGlobalFolderSettings::Set(const DEFFOLDERSETTINGS *pdfs, int cbDfs, UINT flags) { if (flags & ~GFSS_VALID) { ASSERT(!"Invalid flags passed to CGlobalFolderSettings::Set"); return E_INVALIDARG; } // // Special hack: If you pass (NULL, 0) then it means "reset to // default". // if (pdfs == NULL) { if (cbDfs == 0) { static DEFFOLDERSETTINGS dfs = INIT_DEFFOLDERSETTINGS; dfs.vid = g_bRunOnNT5 ? VID_LargeIcons : DFS_VID_Default; pdfs = &dfs; cbDfs = sizeof(dfs); } else { return E_INVALIDARG; } } else if (cbDfs < sizeof(DEFFOLDERSETTINGS_W2K)) { ASSERT(!"Invalid cbDfs passed to CGlobalFolderSettings::Set"); return E_INVALIDARG; } // Preserve the dwDefRevCount, otherwise we'll never be able // to tell if the structure has been revised! DWORD dwDefRevCount = g_dfs.dwDefRevCount; CopyMemory(&g_dfs, pdfs, min(cbDfs, sizeof(g_dfs))); g_dfs.dwDefRevCount = dwDefRevCount; SaveDefaultFolderSettings(flags); return S_OK; }