//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: update.h // //-------------------------------------------------------------------------- #ifndef _UPDATE_H_ #define _UPDATE_H_ #include #include "cscentry.h" #include "util.h" // ENUM_REASON #include "nopin.h" // // Flags used in CscUpdateCache // #define CSC_UPDATE_STARTNOW 0x00000002 // Don't wait for user confirmation to start update #define CSC_UPDATE_SELECTION 0x00000004 // Update current selection (CSC_NAMELIST_HDR buffer) #define CSC_UPDATE_PINFILES 0x00000008 // Pin files while updating them #define CSC_UPDATE_PIN_RECURSE 0x00000010 // Recurse into subfolders when pinning #define CSC_UPDATE_REINT 0x00000020 // Perform outward reintegration #define CSC_UPDATE_FILL_QUICK 0x00000040 // Perform quick inward sync (fill sparse files) #define CSC_UPDATE_FILL_ALL 0x00000080 // Perform full inward sync (overrides CSC_UPDATE_FILL_QUICK) #define CSC_UPDATE_NOTIFY_DONE 0x00000100 // Send CSCWM_DONESYNCING to notify window when done. #define CSC_UPDATE_SHOWUI_ALWAYS 0x00000200 // Nothing to sync but show SyncMgr UI anyway. #define CSC_UPDATE_IGNORE_ACCESS 0x00000400 // Default is to sync files with USER and/or GUEST access. #define CSC_UPDATE_RECONNECT 0x00000800 // Transition all servers online after syncing #define CSC_UPDATE_UNATTENDED 0x00001000 // Run sync unattended. Can't prompt user. HRESULT CscUpdateCache(DWORD dwUpdateFlags, CscFilenameList *pfnl=NULL); void BuildSilentFolderList(CscFilenameList *pfnlSilentFolders, CscFilenameList *pfnlSpecialFolders); class CCscUpdate; typedef CCscUpdate *PCSCUPDATE; typedef struct { PCSCUPDATE pThis; SYNCMGRITEMID ItemID; HANDLE hThread; LPTSTR pszShareName; TCHAR szDrive[4]; DWORD dwSyncStatus; LONG cFilesToSync; LONG cFilesDone; CscFilenameList *pUndoExclusionList; DWORD dwCscContext; DWORD dwPinHints; } SYNCTHREADDATA, *PSYNCTHREADDATA; class CCscUpdate : ISyncMgrSynchronize { private: LONG m_cRef; CscFilenameList *m_pFileList; DWORD m_dwSyncFlags; HDSA m_hSyncItems; CSCEntryLog m_ShareLog; LPSYNCMGRSYNCHRONIZECALLBACK m_pSyncMgrCB; HDPA m_hSyncThreads; CRITICAL_SECTION m_csThreadList; HWND m_hwndDlgParent; HANDLE m_hSyncMutex; HANDLE m_hSyncInProgMutex; BOOL m_bCacheIsEncrypted; CscFilenameList *m_pConflictPinList; CscFilenameList *m_pSilentFolderList; CscFilenameList *m_pSpecialFolderList; CscFilenameList m_ReconnectList; CNoPinList m_NoPinList; public: CCscUpdate(); ~CCscUpdate(); static HRESULT WINAPI CreateInstance(REFIID riid, LPVOID *ppv); // IUnknown methods STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // ISyncMgrSynchronize methods STDMETHODIMP Initialize(DWORD dwReserved, DWORD dwSyncFlags, DWORD cbCookie, const BYTE *lpCookie); STDMETHODIMP GetHandlerInfo(LPSYNCMGRHANDLERINFO *ppSyncMgrHandlerInfo); STDMETHODIMP EnumSyncMgrItems(LPSYNCMGRENUMITEMS *ppenum); STDMETHODIMP GetItemObject(REFSYNCMGRITEMID rItemID, REFIID riid, LPVOID *ppv); STDMETHODIMP ShowProperties(HWND hWndParent, REFSYNCMGRITEMID rItemID); STDMETHODIMP SetProgressCallback(LPSYNCMGRSYNCHRONIZECALLBACK pCallback); STDMETHODIMP PrepareForSync(ULONG cbNumItems, SYNCMGRITEMID *pItemIDs, HWND hWndParent, DWORD dwReserved); STDMETHODIMP Synchronize(HWND hWndParent); STDMETHODIMP SetItemStatus(REFSYNCMGRITEMID pItemID, DWORD dwSyncMgrStatus); STDMETHODIMP ShowError(HWND hWndParent, REFSYNCMGRERRORID ErrorID); private: HRESULT LogError(REFSYNCMGRITEMID rItemID, LPCTSTR pszText, DWORD dwLogLevel = SYNCMGRLOGLEVEL_ERROR, REFSYNCMGRERRORID ErrorID = GUID_NULL); DWORD LogError(REFSYNCMGRITEMID rItemID, DWORD dwLogLevel, UINT nFormatID, ...); DWORD LogError(REFSYNCMGRITEMID rItemID, UINT nFormatID, LPCTSTR pszName, DWORD dwErr, DWORD dwLogLevel = SYNCMGRLOGLEVEL_ERROR); HRESULT SynchronizeShare(SYNCMGRITEMID *pItemID, LPCTSTR pszShareName, BOOL bRasConnected); void SetLastSyncTime(LPCTSTR pszShareName); DWORD GetLastSyncTime(LPCTSTR pszShareName, LPFILETIME pft); void SyncThreadCompleted(PSYNCTHREADDATA pSyncData); void SyncCompleted(void); DWORD CopyLocalFileWithDriveMapping(LPCTSTR pszSrc, LPCTSTR pszDst, LPCTSTR pszShare, LPCTSTR pszDrive, BOOL bDirectory = FALSE); DWORD HandleFileConflict(PSYNCTHREADDATA pSyncData, LPCTSTR pszName, DWORD dwStatus, DWORD dwHintFlags, LPWIN32_FIND_DATA pFind32); DWORD HandleDeleteConflict(PSYNCTHREADDATA pSyncData, LPCTSTR pszName, DWORD dwStatus, DWORD dwHintFlags, LPWIN32_FIND_DATA pFind32); DWORD CscCallback(PSYNCTHREADDATA pSyncData, LPCTSTR pszName, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, LPWIN32_FIND_DATA pFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2); static void NotifySyncMgr(PSYNCTHREADDATA pSyncData, LPSYNCMGRPROGRESSITEM pspi); static DWORD WINAPI _CscCallback(LPCTSTR pszName, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, LPWIN32_FIND_DATA pFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD_PTR dwContext); BOOL PinLinkTarget(LPCTSTR pszName, PSYNCTHREADDATA pSyncData); static DWORD WINAPI _PinNewFilesW32Callback(LPCTSTR pszName, ENUM_REASON eReason, LPWIN32_FIND_DATA pFind32, LPARAM lpContext); static DWORD WINAPI _PinNewFilesCSCCallback(LPCTSTR pszName, ENUM_REASON eReason, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, LPWIN32_FIND_DATA pFind32, LPARAM lpContext); static DWORD WINAPI _SyncThread(LPVOID pThreadData); DWORD MergeShare(PSYNCTHREADDATA pSyncData); DWORD FillShare(PSYNCTHREADDATA pSyncData, int cPinned, DWORD dwConnectionSpeed); void PinFiles(PSYNCTHREADDATA pSyncData, BOOL bConflictPinList=FALSE); void NotifyUndo(PSYNCTHREADDATA pSyncData, LPCTSTR pszName); void UndoPinFiles(PSYNCTHREADDATA pSyncData); static DWORD WINAPI _UndoProgress(LPCTSTR pszItem, LPARAM lpContext); BOOL SkipEFSPin(PSYNCTHREADDATA pSyncData, LPCTSTR pszItem); typedef enum { SyncStop = 0, SyncPause, SyncResume } eSetSyncStatus; HRESULT SetSyncThreadStatus(eSetSyncStatus status, REFGUID rItemID); HRESULT GetSilentFolderList(void); BOOL IsSilentFolder(LPCTSTR pszName) { return (m_pSilentFolderList && m_pSilentFolderList->FileExists(pszName, false)); } BOOL IsSilentShare(LPCTSTR pszShare) { return (m_pSilentFolderList && m_pSilentFolderList->ShareExists(pszShare)); } BOOL IsSpecialFolder(LPCTSTR pszName) { return ((m_pSpecialFolderList && m_pSpecialFolderList->FileExists(pszName, false)) || IsSilentFolder(pszName)); } BOOL IsSpecialFolderShare(LPCTSTR pszShare) { return ((m_pSpecialFolderList && m_pSpecialFolderList->ShareExists(pszShare)) || IsSilentShare(pszShare)); } BOOL ShouldPinRecurse(LPCTSTR pszName); void _BuildOfflineShareList(CscFilenameList *pfnl); friend class CUpdateEnumerator; }; class CUpdateEnumerator : ISyncMgrEnumItems { private: LONG m_cRef; PCSCUPDATE m_pUpdate; HANDLE m_hFind; BOOL m_bEnumFileSelection; INT m_cCheckedItemsEnumerated; CscFilenameList::ShareIter m_SelectionIterator; public: CUpdateEnumerator(PCSCUPDATE pUpdate); ~CUpdateEnumerator(); // IUnknown methods STDMETHODIMP QueryInterface(REFIID, LPVOID*); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // ISyncMgrEnumItems methods STDMETHODIMP Next(ULONG celt, LPSYNCMGRITEM rgelt, PULONG pceltFetched); STDMETHODIMP Skip(ULONG celt); STDMETHODIMP Reset(void); STDMETHODIMP Clone(LPSYNCMGRENUMITEMS *ppenum); }; typedef CUpdateEnumerator *PUPDATEENUM; #endif // _UPDATE_H_