//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1995.
//
//  File:       domcache.h
//
//  Contents:
//
//  Classes:
//
//  Functions:
//
//  History:    3-29-96   RichardW   Created
//
//----------------------------------------------------------------------------


#ifdef DATA_TYPES_ONLY

//
// Domain specific types
//

//
// Define the structure that controls the trusted domain cache
//

typedef enum _DOMAIN_ENTRY_TYPE {
    DomainInvalid,                      // 0 never valid
    DomainUPN,                          // Special UPN domain
    DomainMachine,                      // Local machine domain
    DomainNt4,                          // An NT4 domain
    DomainNt5,                          // An NT5 domain
    DomainMitRealm,                     // An MIT realm
    DomainMitUntrusted,                 // An untrusted MIT realm
    DomainNetworkProvider,              // A fake entry 
    DomainTypeMax
} DOMAIN_ENTRY_TYPE ;


typedef struct _DOMAIN_CACHE_ENTRY {

    LONG RefCount ;                         // Ref Count

    ULONG Flags ;                           // Flags (below)

    DOMAIN_ENTRY_TYPE Type ;                // Type of entry

    UNICODE_STRING FlatName ;               // Flat name of object (OPTIONAL)

    UNICODE_STRING DnsName ;                // Dns name of object (OPTIONAL)

    UNICODE_STRING DisplayName ;            // Display Name
    
} DOMAIN_CACHE_ENTRY, * PDOMAIN_CACHE_ENTRY ;

#define DCE_DEFAULT_ENTRY   0x00000001      // This is displayed by default
#define DCE_REACHABLE_MIT   0x00000002      // This MIT realm is reachable

#define DCacheReferenceEntry( x )   InterlockedIncrement( &(x)->RefCount );

typedef struct _DOMAIN_CACHE_ARRAY {

    ULONG Count ;

    ULONG MaxCount ;

    BOOL Sorted ;

    PDOMAIN_CACHE_ENTRY * List ;

} DOMAIN_CACHE_ARRAY, * PDOMAIN_CACHE_ARRAY ;


//
// Keep these in order.  They're used to determine UI behavior
//
typedef enum _DOMAIN_CACHE_STATE {
    DomainCacheEmpty,               // got nothing
    DomainCacheDefaultOnly,         // default values only (machine and primary domain)
    DomainCacheRegistryCache,       // default + cached values
    DomainCacheReady                // Fully up-to-date.
} DOMAIN_CACHE_STATE ;

typedef struct _DOMAIN_CACHE {

    //
    // Critical section that protects the data in this structure
    //

    CRITICAL_SECTION CriticalSection;

    //
    // Fields protected by that critical section:
    //

    //
    // Task that gets invoked if the domain changes.
    //

    HANDLE Task ;

    //
    // Window to be notified when the update thread completes
    //

    HWND UpdateNotifyWindow;
    UINT Message;

    //
    // last update time
    //

    LARGE_INTEGER   CacheUpdateTime;
    LARGE_INTEGER   RegistryUpdateTime ;

    HANDLE Key ;
    DOMAIN_CACHE_STATE State ;

    //
    // Default domain.  Used only when there is an async thread running
    // so it can set the appropriate default name.
    //

    PWSTR   DefaultDomain ;

    //
    // Flag indicating if we are in a MIT or Safemode state, which means
    // we shouldn't pester netlogon about trusted domains.
    //

    ULONG Flags ;

#define DCACHE_MIT_MODE     0x00000001  // In MIT mode
#define DCACHE_READ_ONLY    0x00000002  // Read-only copy of cache
#define DCACHE_ASYNC_UPDATE 0x00000004  // Async thread running
#define DCACHE_MEMBER       0x00000008  // This is a domain member
#define DCACHE_NO_CACHE     0x00000010  // No cache was found
#define DCACHE_DEF_UNKNOWN  0x00000020  // The default domain could not be found


    //
    // This pointer may *only* be accessed under the critical 
    // section.  This array will get swapped in and out, and
    // only references to it while it is locked are safe.
    //

    PDOMAIN_CACHE_ARRAY Array ;

} DOMAIN_CACHE, *PDOMAIN_CACHE;

#define DCACHE_UPDATE_CONFLICT      3
#define DCACHE_UPDATE_COMBOBOX      2
#define DCACHE_UPDATE_SUCCESSFUL    1
#define DCACHE_UPDATE_FAILURE       0




#else // DATA_TYPES_ONLY


#define WM_CACHE_UPDATE_COMPLETE    WM_USER+256

//
// Exported function prototypes
//

BOOL
DCacheInitialize(
    VOID
    );


VOID
DCacheDereferenceEntry(
    PDOMAIN_CACHE_ENTRY Entry
    );


PDOMAIN_CACHE_ENTRY
DCacheSearchArray(
    PDOMAIN_CACHE_ARRAY Array,
    PUNICODE_STRING DomainName
    );

PDOMAIN_CACHE
DCacheCreate(
    VOID 
    );

PDOMAIN_CACHE_ENTRY
DCacheCreateEntry(
    DOMAIN_ENTRY_TYPE Type,
    PUNICODE_STRING FlatName OPTIONAL,
    PUNICODE_STRING DnsName OPTIONAL,
    PUNICODE_STRING DisplayName OPTIONAL
    );

BOOL
DCacheUpdateMinimal(
    PDOMAIN_CACHE Cache,
    PWSTR DefaultDomain OPTIONAL,
    BOOL CompleteAsync
    );

BOOL
DCacheUpdateFull(
    PDOMAIN_CACHE Cache,
    PWSTR Default OPTIONAL
    );

PDOMAIN_CACHE_ARRAY
DCacheCopyCacheArray(
    PDOMAIN_CACHE Cache
    );

VOID
DCacheFreeArray(
    PDOMAIN_CACHE_ARRAY Array
    );

BOOL
DCacheSetNotifyWindowIfNotReady(
    PDOMAIN_CACHE Cache,
    HWND Window,
    UINT Message
    );

BOOL
DCachePopulateListBoxFromArray(
    PDOMAIN_CACHE_ARRAY Array,
    HWND ComboBox,
    LPWSTR LastKey OPTIONAL
    );

BOOL
DCacheAddNetworkProviders(
    PDOMAIN_CACHE_ARRAY Array
    );

BOOL
DCacheValidateCache(
    PDOMAIN_CACHE Cache
    );

DOMAIN_CACHE_STATE
DCacheGetCacheState(
    PDOMAIN_CACHE Cache
    );

ULONG
DCacheGetFlags(
    PDOMAIN_CACHE Cache 
    );

BOOL
DCacheAddNetworkProviders(
    PDOMAIN_CACHE_ARRAY Array
    );

BOOL
DCacheSetDefaultEntry(
    PDOMAIN_CACHE Cache,
    PWSTR FlatName OPTIONAL,
    PWSTR DnsName OPTIONAL
    );

PDOMAIN_CACHE_ENTRY
DCacheLocateEntry(
    PDOMAIN_CACHE Cache,
    PWSTR Domain
    );

#endif