//+----------------------------------------------------------------------------
//
//  Copyright (C) 2000, Microsoft Corporation
//
//  File:       DfsRegistryRootFolder.hxx
//
//  Contents:   the Root DFS Folder class for Registry Store
//
//  Classes:    DfsRegistryRootFolder
//
//  History:    Dec. 8 2000,   Author: udayh
//
//-----------------------------------------------------------------------------

#ifndef __DFS_REGISTRY_ROOT_FOLDER__
#define __DFS_REGISTRY_ROOT_FOLDER__

#include "DfsRootFolder.hxx"
#include "DfsRegistryStore.hxx"
//+----------------------------------------------------------------------------
//
//  Class:      DfsRegistryRootFolder
//
//  Synopsis:   This class implements The Dfs Registry root folder.
//
//-----------------------------------------------------------------------------


class DfsRegistryRootFolder: public DfsRootFolder
{

private:
    DfsRegistryStore *_pStore;    // Pointer to registered store
                                  // that owns this root.


protected:

    DfsStore *
    GetMetadataStore() 
    {
        return _pStore;
    }

    //
    // Function GetMetadataKey: Gets the registry metadata key for
    // this root folder.
    //

    DFSSTATUS
    GetMetadataHandle( PDFS_METADATA_HANDLE pRootHandle )
    {
        HKEY RootKey;
        DFSSTATUS Status;

        Status = GetMetadataKey( &RootKey );
        if (Status == ERROR_SUCCESS)
        {
            *pRootHandle = CreateMetadataHandle(RootKey);
        }
        return Status;
    }

    VOID
    ReleaseMetadataHandle( DFS_METADATA_HANDLE RootHandle )
    {
        HKEY RootKey;

        RootKey = (HKEY)ExtractFromMetadataHandle(RootHandle);

        ReleaseMetadataKey(RootKey);

        DestroyMetadataHandle(RootHandle);

        return;

    }

private:
    DFSSTATUS
    GetMetadataKey( PHKEY pOpenedKey )
    {
        return _pStore->GetRootKey( GetNameContextString(),
                                    GetRootRegKeyNameString(),
                                    NULL,
                                    pOpenedKey );
    }

    //
    // Function ReleaseMetadataKey: Closes the registry metadata key for
    // this root folder.
    //

    VOID
    ReleaseMetadataKey( HKEY OpenedKey )
    {
        RegCloseKey( OpenedKey );
    }

public:

    //
    // Function DfsRegistryRootFolder: Constructor.
    // Initializes the RegistryRootFolder class instance.
    //
    DfsRegistryRootFolder(
	LPWSTR NameContext,
        LPWSTR RootRegistryName,
        PUNICODE_STRING pLogicalName,
        PUNICODE_STRING pPhysicalShare,
        DfsRegistryStore *pParentStore,
        DFSSTATUS *pStatus );

    ~DfsRegistryRootFolder()
    {
        DfsFreeUnicodeString(&_DfsVisibleContext);
        if (_pStore != NULL)
        {
            _pStore->ReleaseReference();
            _pStore = NULL;
        }
    }

    //
    // Function Synchronize: This function overrides the synchronize
    // defined in the base class.
    // The synchronize function updates the root folder's children
    // with the uptodate information available in the store's metadata.
    //
    DFSSTATUS
    Synchronize();

    DFSSTATUS
    GetMetadataLogicalToLinkName( PUNICODE_STRING pIn,
                                  PUNICODE_STRING pOut )
    {
        UNICODE_STRING FirstComp;

        return DfsGetFirstComponent( pIn,
                                     &FirstComp,
                                     pOut );
    }

    VOID
    ReleaseMetadataLogicalToLinkName( PUNICODE_STRING pIn )
    {
        UNREFERENCED_PARAMETER(pIn);
        return NOTHING;
    }
};


#endif // __DFS_REGISTRY_ROOT_FOLDER__