gfldset.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 4k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. // gfldset.cpp
  2. //
  3. //  A class that manages global folder settings.
  4. #include "priv.h"
  5. #include "sccls.h"
  6. class CGlobalFolderSettings : public IGlobalFolderSettings
  7. {
  8.     public:
  9.     // *** IUnknown methods ***
  10.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj);
  11.     STDMETHOD_(ULONG,AddRef)(THIS);
  12.     STDMETHOD_(ULONG,Release)(THIS);
  13.     // *** IGlobalFolderSettings meTHODs ***
  14.     STDMETHOD(Get)(THIS_ DEFFOLDERSETTINGS *pdfs, int cbDfs);
  15.     STDMETHOD(Set)(THIS_ const DEFFOLDERSETTINGS *pdfs, int cbDfs, UINT flags);
  16.     protected:
  17.         friend HRESULT CGlobalFolderSettings_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi);
  18.         CGlobalFolderSettings();
  19.         ~CGlobalFolderSettings();
  20.         LONG            m_cRef;
  21. };
  22. STDAPI CGlobalFolderSettings_CreateInstance(IUnknown* pUnkOuter, IUnknown** ppunk, LPCOBJECTINFO poi)
  23. {
  24.     // class factory will take care of denying aggregation and giving a null
  25.     // back on failure
  26.     ASSERT(pUnkOuter == NULL);
  27.     CGlobalFolderSettings* pid = new CGlobalFolderSettings();
  28.     if (pid)
  29.     {
  30.         *ppunk = SAFECAST(pid, IGlobalFolderSettings*);
  31.         return S_OK;
  32.     }
  33.     else
  34.     {
  35.         return E_OUTOFMEMORY;
  36.     }
  37. }
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////
  39. CGlobalFolderSettings::CGlobalFolderSettings() : m_cRef(1)
  40. {
  41. }
  42. /////////////////////////////////////////////////////////////////////////////////////////////////////
  43. CGlobalFolderSettings::~CGlobalFolderSettings()
  44. {
  45. }
  46. /////////////////////////////////////////////////////////////////////////////////////////////////////
  47. STDMETHODIMP CGlobalFolderSettings::QueryInterface ( REFIID riid, LPVOID * ppvObj )
  48. {
  49.     if ( riid == IID_IUnknown || riid == IID_IGlobalFolderSettings)
  50.     {
  51.         *ppvObj = SAFECAST( this, IGlobalFolderSettings *);
  52.         AddRef();
  53.     }
  54.     else
  55.     {
  56.         return E_NOINTERFACE;
  57.     }
  58.     return NOERROR;
  59. }
  60. /////////////////////////////////////////////////////////////////////////////////////////////////////
  61. STDMETHODIMP_( ULONG ) CGlobalFolderSettings:: AddRef ()
  62. {
  63.     InterlockedIncrement( &m_cRef );
  64.     return m_cRef;
  65. }
  66. /////////////////////////////////////////////////////////////////////////////////////////////////////
  67. STDMETHODIMP_( ULONG ) CGlobalFolderSettings:: Release ()
  68. {
  69.     if ( InterlockedDecrement( &m_cRef ) == 0 )
  70.     {
  71.         delete this;
  72.         return 0;
  73.     }
  74.     return m_cRef;
  75. }
  76. /////////////////////////////////////////////////////////////////////////////////////////////////////
  77. STDMETHODIMP CGlobalFolderSettings::Get(DEFFOLDERSETTINGS *pdfs, int cbDfs)
  78. {
  79.     if (cbDfs < sizeof(DEFFOLDERSETTINGS))
  80.     {
  81.         return E_INVALIDARG;
  82.     }
  83.     else if (cbDfs > sizeof(DEFFOLDERSETTINGS))
  84.     {
  85.         ZeroMemory(pdfs, cbDfs);
  86.     }
  87.     *pdfs = g_dfs;
  88.     return S_OK;
  89. }
  90. /////////////////////////////////////////////////////////////////////////////////////////////////////
  91. STDMETHODIMP CGlobalFolderSettings::Set(const DEFFOLDERSETTINGS *pdfs, int cbDfs, UINT flags)
  92. {
  93.     if (flags & ~GFSS_VALID) {
  94.         ASSERT(!"Invalid flags passed to CGlobalFolderSettings::Set");
  95.         return E_INVALIDARG;
  96.     }
  97.     //
  98.     //  Special hack:  If you pass (NULL, 0) then it means "reset to
  99.     //  default".
  100.     //
  101.     if (pdfs == NULL && cbDfs == 0)
  102.     {
  103.         static DEFFOLDERSETTINGS dfs = INIT_DEFFOLDERSETTINGS;
  104.         dfs.vid = g_bRunOnNT5 ? VID_LargeIcons : DFS_VID_Default;
  105.         pdfs = &dfs;
  106.     }
  107.     else if (cbDfs < sizeof(DEFFOLDERSETTINGS))
  108.     {
  109.         ASSERT(!"Invalid cbDfs passed to CGlobalFolderSettings::Set");
  110.         return E_INVALIDARG;
  111.     }
  112.     // Preserve the dwDefRevCount, otherwise we'll never be able
  113.     // to tell if the structure has been revised!
  114.     DWORD dwDefRevCount = g_dfs.dwDefRevCount;
  115.     g_dfs = *pdfs;
  116.     g_dfs.dwDefRevCount = dwDefRevCount;
  117.     SaveDefaultFolderSettings(flags);
  118.     return S_OK;
  119. }