NT4/private/windows/rover/filesync/syncui/twin.h
2020-09-30 17:12:29 +02:00

394 lines
13 KiB
C

//
// twin.h: Declares data, defines and struct types for twin handling
// module.
//
//
#ifndef __TWIN_H__
#define __TWIN_H__
///////////////////////////////////////////////////// INCLUDES
///////////////////////////////////////////////////// DEFINES
#define CMP_RECNODES 1L
#define CMP_FOLDERTWINS 2L
#define OBJECT_TWIN_ATTRIBUTES (FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY)
///////////////////////////////////////////////////// MACROS
#ifdef DEBUG
#define Sync_Dump(lpvBuf, type) Sync_FnDump((LPVOID)lpvBuf, sizeof(type))
extern CONST LPCTSTR rgcpcszTwinResult[];
#define SzFromTR(tr) (rgcpcszTwinResult[(tr)])
#else
#define Sync_Dump(lpvBuf, type)
#define Sync_DumpRecItem(tr, lpri, pszMsg)
#define Sync_DumpRecNode(tr, lprn)
#define Sync_DumpRecList(tr, lprl, pszMsg)
#define SzFromTR(tr) (tr)
#endif
// Global v-table to the engine
//
typedef struct
{
HINSTANCE hinst;
OPENBRIEFCASEINDIRECT OpenBriefcase;
SAVEBRIEFCASEINDIRECT SaveBriefcase;
CLOSEBRIEFCASEINDIRECT CloseBriefcase;
DELETEBRIEFCASEINDIRECT DeleteBriefcase;
GETOPENBRIEFCASEINFOINDIRECT GetOpenBriefcaseInfo;
CLEARBRIEFCASECACHEINDIRECT ClearBriefcaseCache;
FINDFIRSTBRIEFCASEINDIRECT FindFirstBriefcase;
FINDNEXTBRIEFCASEINDIRECT FindNextBriefcase;
FINDBRIEFCASECLOSEINDIRECT FindBriefcaseClose;
ADDOBJECTTWININDIRECT AddObjectTwin;
ADDFOLDERTWININDIRECT AddFolderTwin;
RELEASETWINHANDLEINDIRECT ReleaseTwinHandle;
DELETETWININDIRECT DeleteTwin;
GETOBJECTTWINHANDLEINDIRECT GetObjectTwinHandle;
ISFOLDERTWININDIRECT IsFolderTwin;
CREATEFOLDERTWINLISTINDIRECT CreateFolderTwinList;
DESTROYFOLDERTWINLISTINDIRECT DestroyFolderTwinList;
GETFOLDERTWINSTATUSINDIRECT GetFolderTwinStatus;
ISORPHANOBJECTTWININDIRECT IsOrphanObjectTwin;
COUNTSOURCEFOLDERTWINSINDIRECT CountSourceFolderTwins;
ANYTWINSINDIRECT AnyTwins;
CREATETWINLISTINDIRECT CreateTwinList;
DESTROYTWINLISTINDIRECT DestroyTwinList;
ADDTWINTOTWINLISTINDIRECT AddTwinToTwinList;
ADDALLTWINSTOTWINLISTINDIRECT AddAllTwinsToTwinList;
REMOVETWINFROMTWINLISTINDIRECT RemoveTwinFromTwinList;
REMOVEALLTWINSFROMTWINLISTINDIRECT RemoveAllTwinsFromTwinList;
CREATERECLISTINDIRECT CreateRecList;
DESTROYRECLISTINDIRECT DestroyRecList;
RECONCILEITEMINDIRECT ReconcileItem;
BEGINRECONCILIATIONINDIRECT BeginReconciliation;
ENDRECONCILIATIONINDIRECT EndReconciliation;
ISPATHONVOLUMEINDIRECT IsPathOnVolume;
GETVOLUMEDESCRIPTIONINDIRECT GetVolumeDescription;
} VTBLENGINE, * PVTBLENGINE;
// Function wrappers
//
// TWINRESULT Sync_Verify(fn, args)
// Returns the twinresult of the function that is called
//
#ifdef DEBUG
#define Sync_Verify(fn, args) \
(Sync_SetLastError(g_vtblEngine[0].##fn args), VERIFYSZ2(TR_SUCCESS == Sync_GetLastError(), TEXT("Assert ") TEXT(#fn) TEXT(": %s (LastError=%ldL)"), SzFromTR(Sync_GetLastError()), GetLastError()), Sync_GetLastError())
#else
// Optimized version for retail
//
#define Sync_Verify(fn, args) \
Sync_SetLastError(g_vtblEngine[0].##fn args)
#endif
// BOOL Sync_IsEngineLoaded();
// Returns TRUE if the engine is loaded.
//
BOOL PUBLIC Sync_IsEngineLoaded();
// TWINRESULT Sync_SetLastError(TWINRESULT tr);
//
TWINRESULT PUBLIC Sync_SetLastError(TWINRESULT tr);
// TWINRESULT Sync_GetLastError();
//
TWINRESULT PUBLIC Sync_GetLastError(void);
// TWINRESULT Sync_OpenBriefcase(LPCSTR pszPath, DWORD dwFlags, HWND hwndOwner, HBRFCASE FAR * lphbrf);
//
#define Sync_OpenBriefcase(lpcsz, dwflags, hwnd, lphbrf) \
Sync_Verify(OpenBriefcase, (lpcsz, dwflags, hwnd, lphbrf))
// TWINRESULT Sync_SaveBriefcase(HBRFCASE hbrf);
//
#define Sync_SaveBriefcase(hbrf) \
Sync_Verify(SaveBriefcase, (hbrf))
// TWINRESULT Sync_DeleteBriefcase(LPCSTR pszPath);
//
#define Sync_DeleteBriefcase(lpcsz) \
Sync_Verify(DeleteBriefcase, (lpcsz))
// TWINRESULT Sync_CloseBriefcase(HBRFCASE hbrf);
//
#define Sync_CloseBriefcase(hbrf) \
Sync_Verify(CloseBriefcase, (hbrf))
// TWINRESULT Sync_GetOpenBriefcaseInfo(HBRFCASE hbrf, POPENBRFCASEINFO pinfo);
//
#define Sync_GetOpenBriefcaseInfo(hbrf, pinfo) \
Sync_Verify(GetOpenBriefcaseInfo, (hbrf, pinfo))
// TWINRESULT Sync_ClearBriefcaseCache(HBRFCASE hbrf);
//
#define Sync_ClearBriefcaseCache(hbrf) \
Sync_Verify(ClearBriefcaseCache, (hbrf))
// TWINRESULT Sync_FindFirst(PHBRFCASEITER phbrfiter, PBRFCASEINFO pinfo);
//
#define Sync_FindFirst(phbrfiter, pinfo) \
Sync_Verify(FindFirstBriefcase, (phbrfiter, pinfo))
// TWINRESULT Sync_FindNext(HBRFCASEITER hbrfiter, PBRFCASEINFO pinfo);
//
#define Sync_FindNext(hbrfiter, pinfo) \
Sync_Verify(FindNextBriefcase, (hbrfiter, pinfo))
// TWINRESULT Sync_FindClose(HBRFCASEITER hbrfiter);
//
#define Sync_FindClose(hbrfiter) \
Sync_Verify(FindBriefcaseClose, (hbrfiter))
// TWINRESULT Sync_AddObject(HBRFCASE hbrf, LPNEWOBJECTTWIN lpnot, HTWIN FAR * lphtfam);
//
#define Sync_AddObject(hbrf, lpnot, lphtfam) \
Sync_Verify(AddObjectTwin, (hbrf, lpnot, lphtfam))
// TWINRESULT Sync_AddFolder(HBRFCASE hbrf, LPNEWFOLDERTWIN lpnft, HTWIN FAR * lphft);
//
#define Sync_AddFolder(hbrf, lpnft, lphft) \
Sync_Verify(AddFolderTwin, (hbrf, lpnft, lphft))
// TWINRESULT Sync_ReleaseTwin(HTWIN htwin);
//
#define Sync_ReleaseTwin(htwin) \
Sync_Verify(ReleaseTwinHandle, ((HTWIN)htwin))
// TWINRESULT Sync_DeleteTwin(HTWIN htwin);
//
#define Sync_DeleteTwin(htwin) \
Sync_Verify(DeleteTwin, ((HTWIN)htwin))
// TWINRESULT Sync_AnyTwins(HBRFCASE hbrf, BOOL FAR * lpb);
//
#define Sync_AnyTwins(hbrf, lpb) \
Sync_Verify(AnyTwins, (hbrf, lpb))
// TWINRESULT Sync_CountSourceFolders(HOBJECTTWIN hot, ULONG FAR * lpulcSource);
//
#define Sync_CountSourceFolders(hot, lpulcSource) \
Sync_Verify(CountSourceFolderTwins, (hot, lpulcSource))
// TWINRESULT Sync_IsExplicitObject(HOBJECTTWIN hot, BOOL FAR * lpb);
//
#define Sync_IsExplicitObject(hot, lpb) \
Sync_Verify(IsOrphanObjectTwin, (hot, lpb))
// TWINRESULT Sync_GetObject(HBRFCASE hbrf, LPCSTR pszDir, LPCSTR pszName, HOBJECTTWIN FAR * lphot);
//
#define Sync_GetObject(hbrf, lpszFolder, lpszName, lphot) \
Sync_Verify(GetObjectTwinHandle, (hbrf, lpszFolder, lpszName, lphot))
// TWINRESULT Sync_IsFolder(HBRFCASE hbrf, LPCSTR pszFolder, BOOL FAR * lpb);
//
#define Sync_IsFolder(hbrf, lpszFolder, lpb) \
Sync_Verify(IsFolderTwin, (hbrf, lpszFolder, lpb))
// TWINRESULT Sync_GetFolderTwinStatus(HFOLDERTWIN hft, CREATERECLISTPROC crlp, LPARAM lpCallbackData, PFOLDERTWINSTATUS pfts);
//
#ifdef NEW_REC
#define Sync_GetFolderTwinStatus(hft, crlp, lpcb, pfts) \
Sync_Verify(GetFolderTwinStatus, (hft, crlp, lpcb, pfts))
#else
#define Sync_GetFolderTwinStatus(hft, crlp, lpcb, pfts) \
Sync_Verify(GetFolderTwinStatus, (hft, crlp, lpcb, CRL_FLAGS, pfts))
#endif
// TWINRESULT Sync_CreateFolderList(HBRFCASE hbrf, LPCSTR pszDir, LPFOLDERTWINLIST FAR * lplpftl);
//
#define Sync_CreateFolderList(hbrf, lpszFolder, lplpftl) \
Sync_Verify(CreateFolderTwinList, (hbrf, lpszFolder, lplpftl))
// TWINRESULT Sync_DestroyFolderList(LPFOLDERTWINLIST lpftl);
//
#define Sync_DestroyFolderList(lpftl) \
Sync_Verify(DestroyFolderTwinList, (lpftl))
// TWINRESULT Sync_CreateTwinList(HBRFCASE hbrf, LPHTWINLIST lphtl);
//
#define Sync_CreateTwinList(hbrf, lphtl) \
Sync_Verify(CreateTwinList, (hbrf, lphtl))
// TWINRESULT Sync_DestroyTwinList(HTWINLIST htl);
//
#define Sync_DestroyTwinList(htl) \
Sync_Verify(DestroyTwinList, (htl))
// TWINRESULT Sync_AddToTwinList(HTWINLIST htl, HTWIN htwin);
//
#define Sync_AddToTwinList(htl, htwin) \
Sync_Verify(AddTwinToTwinList, (htl, (HTWIN)htwin))
// TWINRESULT Sync_AddAllToTwinList(HTWINLIST htl);
//
#define Sync_AddAllToTwinList(htl) \
Sync_Verify(AddAllTwinsToTwinList, (htl))
// TWINRESULT Sync_RemoveFromTwinList(HTWINLIST htl, HTWIN htwin);
//
#define Sync_RemoveFromTwinList(htl, htwin) \
Sync_Verify(RemoveTwinFromTwinList, (htl, (HTWIN)htwin))
// TWINRESULT Sync_RemoveAllFromTwinList(HTWINLIST htl);
//
#define Sync_RemoveAllFromTwinList(htl) \
Sync_Verify(RemoveAllTwinsFromTwinList, (htl))
// TWINRESULT Sync_CreateRecList(HTWINLIST htl, CREATERECLISTPROC crlp, LPARAM lpcb, LPRECLIST FAR * lplprl);
//
#ifdef NEW_REC
#define Sync_CreateRecList(htl, crlp, lpcb, lplprl) \
Sync_Verify(CreateRecList, (htl, crlp, lpcb, lplprl))
#else
#define Sync_CreateRecList(htl, crlp, lpcb, lplprl) \
Sync_Verify(CreateRecList, (htl, crlp, lpcb, CRL_FLAGS, lplprl))
#endif
// TWINRESULT Sync_DestroyRecList(LPRECLIST lprl);
//
#define Sync_DestroyRecList(lprl) \
Sync_Verify(DestroyRecList, (lprl))
// TWINRESULT Sync_BeginRec(HBRFCASE hbrf);
//
#define Sync_BeginRec(hbrf) \
Sync_Verify(BeginReconciliation, (hbrf))
// TWINRESULT Sync_EndRec(HBRFCASE hbrf);
//
#define Sync_EndRec(hbrf) \
Sync_Verify(EndReconciliation, (hbrf))
// TWINRESULT Sync_ReconcileItem(LPRECITEM lpri, RECSTATUSPROC rsp, LPARAM lpCallbackData, DWORD dwFlags, HWND hwndOwner, HWND hwndStatusText);
//
#define Sync_ReconcileItem(lpri, rsp, lpcb, flags, hwnd, hwndStatusText) \
Sync_Verify(ReconcileItem, (lpri, rsp, lpcb, flags, hwnd, hwndStatusText))
// BOOL Sync_IsPathOnVolume(LPCSTR pszPath, HVOLUMEID hvid);
//
#define Sync_IsPathOnVolume(pszPath, hvid, pbool) \
Sync_Verify(IsPathOnVolume, (pszPath, hvid, pbool))
// BOOL Sync_GetVolumeDecription(HVOLUMEID hvid, PVOLUMEDESC pvd);
//
#define Sync_GetVolumeDescription(hvid, pvd) \
Sync_Verify(GetVolumeDescription, (hvid, pvd))
#ifdef NEW_REC
// Returns TRUE if the recitem is referring to a file (not a folder)
#define IsFileRecItem(pri) (0 != *(pri)->pcszName)
#else
#define IsFileRecItem(pri) TRUE
#endif
extern const TCHAR szAll[];
extern VTBLENGINE g_vtblEngine[1];
int CALLBACK _export NCompareFolders (LPVOID lpv1, LPVOID lpv2, LPARAM lParam);
// Structure for the ChooseSide functions
typedef struct tagCHOOSESIDE
{
DWORD dwFlags; // CSF_* flags
int nRank; // Higher means better choice
HTWIN htwin;
HVOLUMEID hvid;
LPCTSTR pszFolder;
PRECNODE prn; // Only if CSF_FOLDER is clear
} CHOOSESIDE, * PCHOOSESIDE;
#define CSF_FOLDER 0x0001
#define CSF_INSIDE 0x0002 // Ranking for inside
#ifdef DEBUG
void PUBLIC ChooseSide_DumpList(HDSA hdsa);
#endif
void PUBLIC ChooseSide_InitAsFile(HDSA hdsa, PRECITEM pri);
HRESULT PUBLIC ChooseSide_CreateEmpty(HDSA * phdsa);
HRESULT PUBLIC ChooseSide_CreateAsFile(HDSA * phdsa, PRECITEM pri);
HRESULT PUBLIC ChooseSide_CreateAsFolder(HDSA * phdsa, PFOLDERTWINLIST pftl);
BOOL PUBLIC ChooseSide_GetBest(HDSA hdsa, LPCTSTR pszBrfPath, LPCTSTR pszFolder, PCHOOSESIDE * ppchside);
BOOL PUBLIC ChooseSide_GetNextBest(HDSA hdsa, PCHOOSESIDE * ppchside);
void PUBLIC ChooseSide_Free(HDSA hdsa);
HRESULT PUBLIC Sync_GetNodePair(PRECITEM pri, LPCTSTR pszBrfPath, LPCTSTR pszFolder, PRECNODE * pprnInside, PRECNODE * pprnOutside);
void PUBLIC Sync_ChangeRecItemAction(PRECITEM pri, LPCTSTR pszBrfPath, LPCTSTR pszInsideDir, UINT uAction);
BOOL PUBLIC Sync_QueryVTable();
void PUBLIC Sync_ReleaseVTable();
BOOL PUBLIC Sync_AddPathToTwinList(HBRFCASE hbrf, HTWINLIST htl, LPCTSTR lpcszPath, PFOLDERTWINLIST * lplpftl);
HRESULT PUBLIC Sync_CreateCompleteRecList(HBRFCASE hbrf, PABORTEVT pabortevt, PRECLIST * pprl);
HRESULT PUBLIC Sync_CreateRecListEx(HTWINLIST htl, PABORTEVT pabortevt, PRECLIST * pprl);
// Flags for Sync_ReconcileRecList
#define RF_DEFAULT 0x0000
#define RF_ONADD 0x0001
HRESULT PUBLIC Sync_ReconcileRecList (PRECLIST lprl, LPCTSTR pszPathBrf, HWND hwndParent, UINT uFlags);
// Flags for Sync_Split
#define SF_NOCONFIRM 0x0001
#define SF_QUIET 0x0002
// Flags for Sync_IsTwin and Sync_Split
#define SF_ISFOLDER 0x1000
#define SF_ISFILE 0x2000
#define SF_ISTWIN 0x4000
#define SF_ISNOTTWIN 0x8000
HRESULT PUBLIC Sync_IsTwin (HBRFCASE hbrf, LPCTSTR lpcszPath, UINT uFlags);
HRESULT PUBLIC Sync_Split (HBRFCASE hbrf, LPCTSTR pszList, UINT cFiles, HWND hwndOwner, UINT uFlags);
ULONG PUBLIC CountActionItems(PRECLIST prl);
#ifdef DEBUG
void PUBLIC Sync_FnDump (LPVOID lpvBuf, UINT cbBuf);
void PUBLIC Sync_DumpRecItem (TWINRESULT tr, PRECITEM lpri, LPCTSTR pszMsg);
void PUBLIC Sync_DumpRecNode (TWINRESULT tr, PRECNODE lprn);
void PUBLIC Sync_DumpRecList(TWINRESULT tr, PRECLIST lprl, LPCTSTR pszMsg);
void PUBLIC Sync_DumpFolderTwin(PCFOLDERTWIN pft);
void PUBLIC Sync_DumpFolderTwinList(PFOLDERTWINLIST pftl, LPCTSTR pszMsg);
#endif
#endif // __TWIN_H__