mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
156 lines
4.7 KiB
C++
156 lines
4.7 KiB
C++
/*
|
|
* ReactOS Explorer
|
|
*
|
|
* Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
|
|
#define DEFBROWSERSTREAM L"Settings"
|
|
#define DEFAULT_VID GUID_NULL // We don't support WebView
|
|
#define CURRENT_VERSION ( DEFFOLDERSETTINGS::VER_XP )
|
|
|
|
template<class S, class D> static void CopyTo(const S &Src, D &Dst)
|
|
{
|
|
Dst.FolderSettings = Src.FolderSettings;
|
|
}
|
|
|
|
static void EnsureValid(FOLDERSETTINGS &fs)
|
|
{
|
|
if ((int)fs.ViewMode < FVM_AUTO || (int)fs.ViewMode > FVM_LAST)
|
|
fs.ViewMode = SBFOLDERSETTINGS::DEF_FVM;
|
|
|
|
fs.fFlags &= ~(FWF_OWNERDATA | FWF_DESKTOP | FWF_TRANSPARENT | FWF_NOCLIENTEDGE |
|
|
FWF_NOSUBFOLDERS | FWF_NOSCROLL | FWF_NOENUMREFRESH | FWF_NOVISIBLE);
|
|
}
|
|
|
|
static void EnsureValid(DEFFOLDERSETTINGS &dfs)
|
|
{
|
|
EnsureValid(dfs.FolderSettings);
|
|
}
|
|
|
|
static void InitializeDefaults(DEFFOLDERSETTINGS &dfs)
|
|
{
|
|
C_ASSERT(FIELD_OFFSET(DEFFOLDERSETTINGS, FolderSettings) == 4);
|
|
C_ASSERT(FIELD_OFFSET(DEFFOLDERSETTINGS, ViewPriority) == DEFFOLDERSETTINGS::SIZE_IE4);
|
|
C_ASSERT(sizeof(DEFFOLDERSETTINGS) == DEFFOLDERSETTINGS::SIZE_XP);
|
|
|
|
*(UINT*)&dfs = FALSE; // Set all unknown flags to FALSE
|
|
dfs.Statusbar = TRUE;
|
|
dfs.FolderSettings.ViewMode = SBFOLDERSETTINGS::DEF_FVM;
|
|
dfs.FolderSettings.fFlags = SBFOLDERSETTINGS::DEF_FWF;
|
|
dfs.vid = DEFAULT_VID;
|
|
dfs.Version = CURRENT_VERSION;
|
|
dfs.Counter = 0;
|
|
dfs.ViewPriority = VIEW_PRIORITY_CACHEMISS;
|
|
}
|
|
|
|
void SBFOLDERSETTINGS::Load()
|
|
{
|
|
DEFFOLDERSETTINGS dfs;
|
|
CGlobalFolderSettings::Load(dfs);
|
|
CopyTo(dfs, *this);
|
|
}
|
|
|
|
CGlobalFolderSettings::CGlobalFolderSettings()
|
|
{
|
|
}
|
|
|
|
CGlobalFolderSettings::~CGlobalFolderSettings()
|
|
{
|
|
}
|
|
|
|
HRESULT CGlobalFolderSettings::ResetBrowserSettings()
|
|
{
|
|
return Save(NULL);
|
|
}
|
|
|
|
HRESULT CGlobalFolderSettings::SaveBrowserSettings(const SBFOLDERSETTINGS &sbfs)
|
|
{
|
|
DEFFOLDERSETTINGS dfs;
|
|
InitializeDefaults(dfs);
|
|
CopyTo(sbfs, dfs);
|
|
return Save(&dfs);
|
|
}
|
|
|
|
HRESULT CGlobalFolderSettings::Load(DEFFOLDERSETTINGS &dfs)
|
|
{
|
|
HKEY hStreamsKey = SHGetShellKey(SHKEY_Key_Explorer, L"Streams", FALSE);
|
|
if (hStreamsKey)
|
|
{
|
|
DWORD cb = sizeof(DEFFOLDERSETTINGS);
|
|
DWORD err = SHRegGetValueW(hStreamsKey, NULL, DEFBROWSERSTREAM,
|
|
SRRF_RT_REG_BINARY, NULL, &dfs, &cb);
|
|
RegCloseKey(hStreamsKey);
|
|
if (!err && cb >= DEFFOLDERSETTINGS::SIZE_NT4)
|
|
{
|
|
if (cb < FIELD_OFFSET(DEFFOLDERSETTINGS, vid))
|
|
{
|
|
dfs.FolderSettings.fFlags = SBFOLDERSETTINGS::DEF_FWF;
|
|
}
|
|
if (cb < FIELD_OFFSET(DEFFOLDERSETTINGS, Version))
|
|
{
|
|
dfs.vid = DEFAULT_VID;
|
|
}
|
|
if (cb <= FIELD_OFFSET(DEFFOLDERSETTINGS, ViewPriority))
|
|
{
|
|
dfs.Version = CURRENT_VERSION;
|
|
}
|
|
dfs.ViewPriority = VIEW_PRIORITY_STALECACHEHIT;
|
|
EnsureValid(dfs);
|
|
return S_OK;
|
|
}
|
|
}
|
|
InitializeDefaults(dfs);
|
|
return S_FALSE;
|
|
}
|
|
|
|
HRESULT CGlobalFolderSettings::Save(const DEFFOLDERSETTINGS *pFDS)
|
|
{
|
|
HKEY hStreamsKey = SHGetShellKey(SHKEY_Key_Explorer, L"Streams", TRUE);
|
|
if (!hStreamsKey)
|
|
return E_FAIL;
|
|
|
|
HRESULT hr = E_INVALIDARG;
|
|
if (!pFDS)
|
|
{
|
|
DWORD err = SHDeleteValueW(hStreamsKey, NULL, DEFBROWSERSTREAM);
|
|
hr = (!err || err == ERROR_FILE_NOT_FOUND) ? S_OK : HResultFromWin32(err);
|
|
}
|
|
else
|
|
{
|
|
DWORD cb = sizeof(DEFFOLDERSETTINGS);
|
|
hr = HResultFromWin32(SHSetValueW(hStreamsKey, NULL, DEFBROWSERSTREAM, REG_BINARY, pFDS, cb));
|
|
}
|
|
RegCloseKey(hStreamsKey);
|
|
return hr;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Get(struct DEFFOLDERSETTINGS *pFDS, UINT cb)
|
|
{
|
|
if (cb != sizeof(DEFFOLDERSETTINGS) || !pFDS)
|
|
return E_INVALIDARG;
|
|
return Load(*pFDS);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Set(const struct DEFFOLDERSETTINGS *pFDS, UINT cb, UINT unknown)
|
|
{
|
|
// NULL pFDS means reset
|
|
if (cb != sizeof(DEFFOLDERSETTINGS) && pFDS)
|
|
return E_INVALIDARG;
|
|
return Save(pFDS);
|
|
}
|