//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// The use and distribution terms for this software are covered by the
// Microsoft Limited Public License (Ms-LPL)
// which can be found in the file MS-LPL.txt at the root of this distribution.
// By using this software in any fashion, you are agreeing to be bound by
// the terms of this license.
//
// The software is licensed “as-is.”
//
// You must not remove this notice, or any other, from this software.
//
//
//
// Demux code for Windows CE
//
//-------------------------------------------------------------------------
//======================================================================
// Demux code for Windows CE
//======================================================================
#ifndef __REGISTRY_PREFS_H__
#define __REGISTRY_PREFS_H__
//
// Registry Prefs.H
//
// Classes to support storing values in the registry
// Over the long term these will become more general
// purpose.
//
// RegKey
//
// Represents a registry key. Most of these functions are thin wrappers,
// so I could put them in the header to gain inline properties, at the
// cost of obscuring the declaration. Let me know if you want them here...
//
// Provides a weak guarantee of construction - any opened keys will be
// closed, but it is possible to construct a NULL object, that all operations
// will fail on. exceptions would be needed to provide a stronger
// guarantee, and the world does not seem ready for that yet ;-)
class RegKey {
HKEY hKey;
REGSAM sam;
protected:
// Takes ownership, assumed already open
RegKey(HKEY h, REGSAM r) : hKey(h), sam(r) {}
// I hope you know what you are doing if you call these
void Close() { RegCloseKey(hKey); }
void Open( HKEY hParent
, LPCTSTR szName
, REGSAM Desired
);
public:
enum { GUIDStringLen = 39 };
// Allocate szString to be GUIDStringLen characters.
// makes szString as a registry style string: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
static void APIENTRY StringFromGUID(REFGUID guid, LPTSTR szString, unsigned Len = GUIDStringLen);
RegKey( HKEY hParent
, LPCTSTR szName = TEXT("")
, REGSAM Desired = KEY_ALL_ACCESS
);
RegKey( const RegKey& hParent
, LPCTSTR szName // use copy constructor when no szName specified
, REGSAM Desired = KEY_ALL_ACCESS
);
RegKey( HKEY hParent
, REFGUID guid
, REGSAM Desired = KEY_ALL_ACCESS
);
RegKey( const RegKey& hParent
, REFGUID guid
, REGSAM Desired = KEY_ALL_ACCESS
);
RegKey(const RegKey&);
RegKey(const RegKey&, REGSAM samDesired);
virtual ~RegKey();
REGSAM SAM() const { return sam; }
bool IsOpen() const { return hKey != NULL; }
const RegKey& operator=(const RegKey&);
RegKey CreateSubKey( LPCTSTR szName
, REGSAM samDesired = KEY_ALL_ACCESS
, LPTSTR lpClass = NULL
, DWORD dwOptions = REG_OPTION_NON_VOLATILE
, LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL
, LPDWORD lpdwDisposition = NULL
) const;
RegKey OpenSubKey( LPCTSTR szName
, REGSAM samDesired = KEY_ALL_ACCESS
) const;
LONG DeleteSubKey(LPCTSTR szName) const;
LONG SetValue( LPCTSTR lpValueName
, DWORD dwType
, CONST BYTE* lpData
, DWORD cbData
) const;
LONG SetValue( LPCTSTR lpValueName
, LPCTSTR szData
) const;
LONG QueryValue( LPCTSTR lpValueName
, LPDWORD lpType
, LPBYTE lpData
, LPDWORD lpcbData
) const;
LONG EnumValue( DWORD dwIndex
, LPTSTR lpValueName
, LPDWORD lpcbValueName
, LPDWORD lpType
, LPBYTE lpData
, LPDWORD lpcbData
) const;
// Guarantees the key is written to disk
LONG Flush() const { return RegFlushKey(hKey); }
private: // private, until I find a compelling use for it
// be sure to duplicate/reopen this if you want to call regclosekey()
operator HKEY() const { return hKey; }
};
// implementation. here to help guarantee inline properties
inline RegKey::RegKey(const RegKey& k, REGSAM samDesired) : hKey(NULL), sam(samDesired)
{ Open(k, NULL, sam); }
inline LONG RegKey::DeleteSubKey(LPCTSTR szName) const { return RegDeleteKey(hKey, szName); }
//
// RegDWORDPref
//
// Aims to look like a DWORD to the user. Has a read cache
// and write-through semantics to the registry
class RegDWORDPref {
DWORD value;
RegKey Key;
LPTSTR szName;
bool IsInRegistry() const { return Key.IsOpen(); }
void WriteThrough();
public:
RegDWORDPref(const RegKey& key, LPCTSTR szValName, DWORD Default = 0);
~RegDWORDPref();
operator const DWORD() const { return value; }
void Refresh();
RegDWORDPref& operator=(const DWORD NewValue) { value = NewValue; WriteThrough(); return *this; }
RegDWORDPref& operator=(const RegDWORDPref& lhs) { value = lhs.value; WriteThrough(); return *this; }
RegDWORDPref& operator&=(const DWORD lhs) { value &= lhs; WriteThrough(); return *this; }
RegDWORDPref& operator&=(const RegDWORDPref& lhs) { value &= lhs.value; WriteThrough(); return *this; }
RegDWORDPref& operator|=(const DWORD lhs) { value |= lhs; WriteThrough(); return *this; }
RegDWORDPref& operator|=(const RegDWORDPref& lhs) { value |= lhs.value; WriteThrough(); return *this; }
private:
RegDWORDPref(const RegDWORDPref&);
};
// Shell/Registry utilites
//
// AddShellFileExtention
//
// Add a file extension to the registry:
// HKCR\szExtention
// @=szType
// "Content Type"=szContentType
// eg:
// HKCR\.AC3
// @="AC3File"
// "Content Type"="audio\ac3"
// returns a RegXXX result code
extern LONG APIENTRY AddShellFileExtention(LPCTSTR szExtention, LPCTSTR szType, LPCTSTR szContentType = NULL);
extern LONG APIENTRY RemoveShellFileExtention(LPCTSTR szExtention);
// Register media type stuff
// Add media check bytes
STDAPI RegisterCheckBytes(
REFGUID Type,
REFGUID SubType,
REFCLSID clsidSource,
LPCTSTR szN,
LPCTSTR szCheckBytes
);
#endif //__REGISTRY_PREFS_H__