394 lines
13 KiB
C
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__
|
|
|