//*************************************************************
//
//  Copyright (c) Microsoft Corporation 1998
//  All rights reserved
//
//  util.hxx
//
//*************************************************************

#ifndef _UTIL_HXX_
#define _UTIL_HXX_

#define HOMESHARE_VARIABLE  L"%HOMESHARE%"
#define HOMESHARE_VARLEN    11
#define HOMEDRIVE_VARIABLE  L"%HOMEDRIVE%"
#define HOMEDRIVE_VARLEN    11
#define HOMEPATH_VARIABLE   L"%HOMEPATH%"
#define HOMEPATH_VARLEN     10

typedef enum tagCSCPinCommands
{
    PinFile,
    UnpinFile
} CSCPINCOMMAND;

//
//class to keep track of copy failures in a recursive file copy operation
//
class CCopyFailData {
public:
    CCopyFailData();
    ~CCopyFailData();
    DWORD   RegisterFailure (LPCTSTR pwszSource, LPCTSTR pwszDest);
    BOOL    IsCopyFailure(void);
    LPCTSTR GetSourceName (void);
    LPCTSTR GetDestName (void);

private:
    BOOL    m_bCopyFailed;
    DWORD   m_dwSourceBufLen;
    WCHAR * m_pwszSourceName;
    DWORD   m_dwDestBufLen;
    WCHAR * m_pwszDestName;
};

DWORD
IsOnNTFS(
    const WCHAR* pwszPath
    );

void
ModifyAccessAllowedAceCounts (
    PACE_HEADER pAce,
    LONG* pCount,
    LONG* pContainerCount,
    LONG* pObjectCount
    );

DWORD
RestrictMyDocsRedirection(
    HANDLE      hToken,
    HKEY        hKeyRoot,
    BOOL        fRestrict
    );

BOOL
GroupInList (
    WCHAR * pwszSid,
    PTOKEN_GROUPS pGroups
    );

NTSTATUS
AllocateAndInitSidFromString (
    const WCHAR* lpszSidStr,
    PSID* ppSid
    );

NTSTATUS
LoadSidAuthFromString (
    const WCHAR* pString,
    PSID_IDENTIFIER_AUTHORITY pSidAuth
    );

NTSTATUS
GetIntFromUnicodeString (
    const WCHAR* szNum,
    ULONG Base,
    PULONG pValue
    );

DWORD CALLBACK CopyProgressRoutine (
    LARGE_INTEGER TotalFileSize,
    LARGE_INTEGER TotalBytesTransferred,
    LARGE_INTEGER StreamSize,
    LARGE_INTEGER StreamBytesTransferred,
    DWORD         dwStreamNumber,
    DWORD         dwCallbackReason,
    HANDLE        hSourceFile,
    HANDLE        hDestinationFile,
    LPVOID        lpData
    );

DWORD FullFileCopyW (
    const WCHAR*  wszSource,
    const WCHAR*  wszDest,
    BOOL          bFailIfExists
    );

DWORD FullDirCopyW (
    const WCHAR* pwszSource,
    const WCHAR* pwszDest,
    BOOL bSkipDacl
    );

DWORD FileInDir (
    LPCWSTR pwszFile,
    LPCWSTR pwszDir,
    BOOL* pExists
    );

DWORD ComparePaths (
    LPCWSTR pwszSource,
    LPCWSTR pwszDest,
    int* pResult
    );

DWORD
CheckIdenticalSpecial (
    LPCWSTR pwszSource,
    LPCWSTR pwszDest,
    int* pResult
    );

LPTSTR CheckSlash (
    LPTSTR lpDir
    );

BOOL RegDelnodeRecurse (
    HKEY hKeyRoot,
    LPTSTR lpSubKey
    );

BOOL RegDelnode (
    HKEY hKeyRoot,
    LPTSTR lpSubKey
    );

void GetSetOwnerPrivileges (
    HANDLE hToken
    );

DWORD
SafeGetPrivateProfileStringW (
    const WCHAR * pwszSection,
    const WCHAR * pwszKey,
    const WCHAR * pwszDefault,
    WCHAR **      ppwszReturnedString,
    DWORD *       pSize,
    const WCHAR * pwszIniFile
    );

DWORD
MySidCopy (
    PSID * ppDestSid,
    PSID pSourceSid
    );

BOOL GetShareStatus (
    const WCHAR * pwszShare,
    DWORD * pdwStatus,
    DWORD * pdwPinCount,
    DWORD * pdwHints
    );

SHARESTATUS
GetCSCStatus (
   const WCHAR * pwszPath
   );

void
MoveDirInCSC (
   const WCHAR * pwszSource,
   const WCHAR * pwszDest,
   const WCHAR * pwszSkipSubdir,
   SHARESTATUS   StatusFrom,
   SHARESTATUS   StatusTo,
   BOOL          bAllowRdrTimeoutForDel,
   BOOL          bAllowRdrTimeoutForRen
   );

DWORD
DoCSCRename (
   const WCHAR * pwszSource,
   const WCHAR * pwszDest,
   BOOL          bOverwrite,
   BOOL          bAllowRdrTimeout
   );

DWORD
DeleteCSCFileTree (
   const WCHAR * pwszSource,
   const WCHAR * pwszSkipSubdir,
   BOOL  bAllowRdrTimeout
   );

DWORD
DeleteCSCFile (
   const WCHAR * pwszPath,
   BOOL  bAllowRdrTimeout
   );

void
DisplayStatusMessage (
   UINT rid
   );

DWORD
DeleteCSCShareIfEmpty (
   LPCTSTR pwszFileName,
   SHARESTATUS shStatus
   );

DWORD
MergePinInfo (
   LPCTSTR pwszSource,
   LPCTSTR pwszDest,
   SHARESTATUS StatusFrom,
   SHARESTATUS StatusTo
   );

DWORD
PinIfNecessary (
   const WCHAR * pwszPath,
   SHARESTATUS shStatus
   );


DWORD
CacheDesktopIni (
   LPCTSTR pwszPath,
   SHARESTATUS shStatus,
   CSCPINCOMMAND uCommand
   );

DWORD WINAPI
CSCCallbackProc (
   LPCTSTR              pszName,
   DWORD                dwStatus,
   DWORD                dwHintFlags,
   DWORD                dwPinCount,
   LPWIN32_FIND_DATA    pFind32,
   DWORD                dwReason,
   DWORD                dwParam1,
   DWORD                dwParam2,
   DWORD_PTR            dwContext
   );

HRESULT
UpdateMyPicsShellLinks (
   HANDLE           hUserToken,
   const WCHAR *    pwszMyPicsLocName
   );

DWORD
LoadLocalizedFolderNames (
   void
   );

DWORD
DeleteCachedConfigFiles (
   const PGROUP_POLICY_OBJECT pGPOList,
   CFileDB * pFileDB
   );

void
SimplifyPath (
   WCHAR * pwszPath
   );

DWORD
PrecreateUnicodeIniFile (
   LPCTSTR lpszFilePath
   );

BOOL
IsPathLocal (
  LPCWSTR pwszPath
  );

DWORD
ExpandPathSpecial (
  CFileDB * pFileDB,
  const WCHAR * pwszPath,
  const WCHAR * pwszUserName,
  WCHAR * wszExpandedPath,
  ULONG * pDesiredBufferSize = NULL
  );

DWORD
ExpandHomeDir (
  REDIRECTABLE  rID,
  const WCHAR * pwszPath,
  BOOL          bAllowMyPics,
  WCHAR **      ppwszExpandedPath,
  const WCHAR * pwszHomedir = NULL
  );

DWORD
ExpandHomeDirPolicyPath (
  REDIRECTABLE  rID,
  const WCHAR * pwszPath,
  BOOL          bAllowMyPics,
  WCHAR **      ppwszExpandedPath,
  const WCHAR * pwszHomedir = NULL
  );

BOOL
IsHomedirPath (
  REDIRECTABLE  rID,
  LPCWSTR       pwszPath,
  BOOL          bAllowMyPics
  );

BOOL
IsHomedirPolicyPath (
  REDIRECTABLE  rID,
  LPCWSTR       pwszPath,
  BOOL          bAllowMyPics
  );

BOOL
HasHomeVariables (
  LPCWSTR       pwszPath
  );

DWORD
GetWin32ErrFromHResult (
  HRESULT       hr
  );

DWORD
GetExpandedPath(
    IN  CFileDB*      pFileDB,
    IN  WCHAR*        wszSourcePath,
    IN  int           rID,
    IN  BOOL          bAllowMyPics,
    OUT WCHAR**       ppwszExpandedPath);

#endif _UTIL_HXX_