/*++

Copyright (C) Microsoft Corporation, 1998 - 1998

Module Name:

    location.hxx

Abstract:

    This module provides all the functions for determining the
    machines current physical location.

Author:

    Steve Kiraly (SteveKi) 13-July-1998

Revision History:

    Steve Kiraly (SteveKi) 13-July-1998 Genesis

--*/
#ifndef _PHYSLOC_HXX_
#define _PHYSLOC_HXX_

#include "asyncdlg.hxx"

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

    Physical location class.

********************************************************************/
class TPhysicalLocation
{

public:

    enum EPhysicalLocations
    {
        kMaxPhysicalLocation = MAX_PATH,
    };

    TPhysicalLocation::
    TPhysicalLocation(
        VOID
        );

    TPhysicalLocation::
    ~TPhysicalLocation(
        VOID
        );

    BOOL
    TPhysicalLocation::
    bValid(
        VOID
        ) const;

    BOOL
    TPhysicalLocation::
    Discover(
        VOID
        );

    BOOL
    TPhysicalLocation::
    GetExact(
        IN TString &strLocation
        ) const;

    BOOL
    TPhysicalLocation::
    GetSearch(
        IN TString &strLocation
        ) const;

    VOID
    TPhysicalLocation::
    Invalidate(
        VOID
        );

    BOOL
    TPhysicalLocation::
    ReadGroupPolicyLocationSetting(
        IN OUT TString &strLocation
        );

    BOOL
    TPhysicalLocation::
    ReadUserLocationProperty(
        IN OUT TString &strLocation
        );

    BOOL
    TPhysicalLocation::
    ReadMachinesLocationProperty(
        IN OUT TString &strLocation
        );

    BOOL
    TPhysicalLocation::
    ReadSubnetLocationProperty(
        IN OUT TString &strLocation
        );

    BOOL
    TPhysicalLocation::
    ReadSiteLocationProperty(
        IN OUT TString &strLocation
        );

    static
    VOID
    TPhysicalLocation::
    vTrimSlash(
        IN OUT TString &strLocation
        );


    static
    BOOL
    TPhysicalLocation::
    bLocationEnabled(
        VOID
        );

private:

    class TSubnets
    {
    public:

        TSubnets::
        TSubnets(
            VOID
            );

        TSubnets::
        ~TSubnets(
            VOID
            );

        VOID
        TSubnets::
        ClearAll(
            VOID
            );

        BOOL
        TSubnets::
        AddEntry(
            IN LPCTSTR pszNew
            );

        UINT
        TSubnets::
        NumEntries(
            VOID
            );

        TString &
        TSubnets::
        Table(
            UINT Index
            );

    private:

        //
        // Operator = and copy are not defined.
        //
        TSubnets &
        TSubnets::
        operator =(
            const TSubnets &rhs
            );

        TSubnets::
        TSubnets(
            const TSubnets &rhs
            );

        UINT    m_uNumEntries;
        TString *m_pstrTable;
    };

    enum EDiscoveryType
    {
        kDiscoveryTypeUnknown,
        kDiscoveryTypePolicy,
        kDiscoveryTypeMachine,
        kDiscoveryTypeSubnet,
        kDiscoveryTypeSite,
    };

    typedef DWORD (WINAPI *pfGetIpAddrTable)( PMIB_IPADDRTABLE, PULONG, BOOL );
    typedef BOOLEAN (SEC_ENTRY *pfGetComputerObjectName)( EXTENDED_NAME_FORMAT, LPTSTR, PULONG );
    typedef BOOLEAN (SEC_ENTRY *pfGetUserNameEx)( EXTENDED_NAME_FORMAT, LPTSTR, PULONG );
    typedef DWORD (WINAPI *pfDsAddressToSiteNames)( LPCTSTR, DWORD, PSOCKET_ADDRESS, LPTSTR **, LPTSTR ** );
    typedef VOID (WINAPI *pfNetApiBufferFree)( PVOID );
    typedef char *(WSAAPI *LPFN_INET_NTOA)( struct in_addr );

    //
    // Operator = and copy are not defined.
    //
    TPhysicalLocation &
    TPhysicalLocation::
    operator =(
        const TPhysicalLocation &rhs
        );

    TPhysicalLocation::
    TPhysicalLocation(
        const TPhysicalLocation &rhs
        );

    BOOL
    TPhysicalLocation::
    AddrToSite(
        IN DWORD    dwAddr,
        IN TString  &strSiteName,
        IN TString  &strSubnetName
        );

    BOOL
    TPhysicalLocation::
    GetIpAddressTable(
        IN OUT PMIB_IPADDRTABLE    *ppAddrTable
        );

    VOID
    TPhysicalLocation::
    DisplayLocation(
        VOID
        );

    BOOL
    TPhysicalLocation::
    GetSubnetObjectNames(
        IN TSubnets &Subnets
        );

    BOOL
    TPhysicalLocation::
    GetSubnetNames(
        IN TSubnets &Subnets
        );

    UINT
    TPhysicalLocation::
    NumSetBits(
        DWORD Value
        );

    BOOL
    TPhysicalLocation::
    GetSiteLocationString(
        IN      LPCTSTR strSiteName,
        IN OUT  TString &strSiteLocation
        );

    BOOL
    TPhysicalLocation::
    GetSubnetLocationString(
        IN      LPCTSTR pszSubnetName,
        IN OUT  TString &strSubnetLocation
        );

    BOOL
    TPhysicalLocation::
    WidenScope(
        IN      LPCTSTR pszString,
        IN      UINT    uCount,
        IN OUT  TString &strString
        ) const;

    BOOL                                m_fInitalized;
    TString                             m_strLocation;
    TString                             m_strConfigurationContainer;
    EDiscoveryType                      m_eDiscoveryType;
    TLibrary                            m_IpHlpApi;
    pfGetIpAddrTable                    m_GetIpAddrTable;
    TLibrary                            m_SecExt;
    pfGetComputerObjectName             m_GetComputerObjectName;
    pfGetUserNameEx                     m_GetUserNameEx;
    TLibrary                            m_NetApi;
    pfDsAddressToSiteNames              m_DsAddressToSiteNames;
    pfNetApiBufferFree                  m_NetApiBufferFree;
    TLibrary                            m_WinSock;
    LPFN_INET_NTOA                      m_inet_ntoa;
    TDirectoryService                   m_Ds;

};

#endif // _PHYSLOC_HXX_