/*++

Copyright (C) Microsoft Corporation, 1997 - 1997
All rights reserved.

Module Name:

    persist.hxx

Abstract:

    Persistent store class headers.

Author:

    Steve Kiraly (SteveKi)  05/12/97

Revision History:

--*/

#ifndef _PERSIST_HXX
#define _PERSIST_HXX

/********************************************************************

    Persistant registry store class.

********************************************************************/

class TPersist 
{
public:
    
    enum EIoFlags 
    {
        kRead       = 1 << 0,
        kWrite      = 1 << 1,
        kCreate     = 1 << 2,
        kOpen       = 1 << 3,
    };

    enum EConstants 
    {
        kHint       = 256,
    };

    TPersist(
        IN LPCTSTR  pszSection,
        IN UINT     ioFlags,
        IN HKEY     hOpenedKey = HKEY_CURRENT_USER
        );

    ~TPersist(
        VOID
        );

    BOOL
    bValid(
        VOID
        ) const;

    DWORD 
    dwLastError(
        VOID
        ) const;

    BOOL
    bRead( 
        IN      LPCTSTR  pValueName, 
        IN OUT  DWORD    &dwValue 
        );

    BOOL
    bRead( 
        IN      LPCTSTR  pValueName, 
        IN OUT  BOOL     &bValue 
        );

    BOOL
    bRead( 
        IN      LPCTSTR  pValueName, 
        IN OUT  TString  &strValue 
        );

    BOOL
    bRead( 
        IN      LPCTSTR  pValueName, 
        IN OUT  PVOID    pValue, 
        IN      DWORD    cbSize,  
           OUT  LPDWORD  pcbNeeded = NULL
        );

    BOOL
    bWrite( 
        IN       LPCTSTR  pValueName, 
        IN const DWORD    dwValue 
        );

    BOOL
    bWrite( 
        IN       LPCTSTR  pValueName, 
        IN       LPCTSTR  pszValue 
        );

    BOOL
    bWrite( 
        IN       LPCTSTR  pValueName, 
        IN const PVOID    pValue, 
        IN       DWORD    cbSize 
        );

    BOOL
    bRemove( 
        IN LPCTSTR  pValueName
        );

    BOOL
    bRemoveKey( 
        IN LPCTSTR  pKeyName
        );

private:
    
    //
    // Copying and assignment are not defined.
    //        
    TPersist( const TPersist & );               
    TPersist& operator =( const TPersist & );

    DWORD
    dwRecursiveRegDeleteKey( 
        IN HKEY     hKey, 
        IN LPCTSTR  pszSubkey 
        ) const;


    TString strSection_;        
    HKEY    hKey_;
    DWORD   dwStatus_;

};

#if DBG 

VOID
TestPersistClass(
    VOID
    );

#endif

#endif