/************************************************************************ Copyright (c) 2000 - 2000 Microsoft Corporation Module Name : cjob.h Abstract : Main header file for files. Author : Revision History : ***********************************************************************/ class CFile; class CJob; class CFileExternal; class CJobExternal; class CFileExternal : public IBackgroundCopyFile { public: friend CFile; // IUnknown Methods STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject); ULONG _stdcall AddRef(void); ULONG _stdcall Release(void); // IBackgroundCopyFile methods HRESULT STDMETHODCALLTYPE GetRemoteNameInternal( /* [out] */ LPWSTR *pVal); HRESULT STDMETHODCALLTYPE GetRemoteName( /* [out] */ LPWSTR *pVal) { EXTERNAL_FUNC_WRAP( GetRemoteNameInternal( pVal ) ) } HRESULT STDMETHODCALLTYPE GetLocalNameInternal( /* [out] */ LPWSTR *pVal); HRESULT STDMETHODCALLTYPE GetLocalName( /* [out] */ LPWSTR *pVal) { EXTERNAL_FUNC_WRAP( GetLocalNameInternal( pVal ) ) } HRESULT STDMETHODCALLTYPE GetProgressInternal( /* [out] */ BG_FILE_PROGRESS *pVal); HRESULT STDMETHODCALLTYPE GetProgress( /* [out] */ BG_FILE_PROGRESS *pVal) { EXTERNAL_FUNC_WRAP( GetProgressInternal( pVal ) ) } // other methods CFileExternal( CFile * file, CJobExternal * JobExternal ); ~CFileExternal(); private: long m_refs; long m_ServiceInstance; CFile * m_file; CJobExternal * m_JobExternal; }; class CFile : public ITransferCallback { public: friend CFileExternal; // ITransferCallback methods virtual bool DownloaderProgress( UINT64 BytesTransferred, UINT64 BytesTotal ); virtual bool PollAbort(); virtual bool UploaderProgress( UINT64 BytesTransferred ); // other methods CFile( CJob* Job, BG_JOB_TYPE FileType, StringHandle RemoteName, StringHandle LocalName ); virtual ~CFile(); bool Transfer( HANDLE hToken, BG_JOB_PRIORITY priority, const PROXY_SETTINGS & ProxySettings, const CCredentialsContainer *Credentials, QMErrInfo & ErrInfo ); void DiscoverBytesTotal( HANDLE Token, const PROXY_SETTINGS & ProxySettings, const CCredentialsContainer * Credentials, QMErrInfo & ErrorInfo ); HRESULT GetRemoteName( LPWSTR *pVal ) const; HRESULT GetLocalName( LPWSTR *pVal ) const; const StringHandle & GetRemoteName() const { return m_RemoteName; } const StringHandle & GetLocalName() const { return m_LocalName; } const StringHandle & GetTemporaryName() const { return m_TemporaryName; } void GetProgress( BG_FILE_PROGRESS *pVal ) const; HRESULT Serialize( HANDLE hFile ); static CFile * Unserialize( HANDLE hFile, CJob* Job ); UINT64 _GetBytesTransferred() const { return m_BytesTransferred; } UINT64 _GetBytesTotal() const { return m_BytesTotal; } void SetBytesTotal( UINT64 BytesTotal ) { m_BytesTotal = BytesTotal; } void SetBytesTransferred( UINT64 BytesTransferred ) { m_BytesTransferred = BytesTransferred; } bool IsCompleted() { return m_Completed; } bool ReceivedAllData() { return (m_BytesTotal == m_BytesTransferred); } CFileExternal * CreateExternalInterface(); CJob* GetJob() const { return m_Job; } HRESULT CheckClientAccess( IN DWORD RequestedAccess ) const; HRESULT MoveTempFile(); HRESULT DeleteTempFile(); HRESULT VerifyLocalName( LPCWSTR name, BG_JOB_TYPE JobType ); BOOL VerifyRemoteName( LPCWSTR name ); static HRESULT VerifyLocalFileName( LPCWSTR name, BG_JOB_TYPE JobType ); bool IsCanonicalVolume( const WCHAR *CanonicalVolume ) { return ( _wcsicmp( m_CanonicalVolumePath, CanonicalVolume ) == 0 ); } HRESULT ValidateAccessForUser( SidHandle sid, bool fWrite ); bool ValidateDriveInfo( HANDLE hToken, QMErrInfo & ErrInfo ); bool OnDiskChange( const WCHAR *CanonicalVolume, DWORD VolumeSerialNumber ); bool OnDismount( const WCHAR *CanonicalVolume ); void ChangedOnServer(); static bool IsDriveTypeRemote( UINT DriveType ) { return ( DriveType == DRIVE_UNKNOWN ) || ( DriveType == DRIVE_NO_ROOT_DIR ) || ( DriveType == DRIVE_REMOTE ); } static bool IsAbsolutePath( const WCHAR * Path ) { bool ret; if ( (Path [0] == L'\\' && Path[1] == L'\\') || (iswalpha ( Path [0] ) && Path [1] == L':' && Path[ 2 ] == L'\\') ) { ret = true; } else { ret = false; } return ret; } static bool IsUncPath( LPCWSTR Path ) { if (Path [0] == L'\\' && Path[1] == L'\\') { return true; } return false; } DWORD GetSizeEstimate() { // // Serialize() will store five file paths and five constants // return (5 * MAX_PATH * sizeof(WCHAR)) + 5 * sizeof( UINT64 ); } HANDLE OpenLocalFileForUpload() throw( ComError ); HRESULT SetLocalFileTime( FILETIME Time ); private: CFile( CJob* Job ); StringHandle m_RemoteName; StringHandle m_LocalName; StringHandle m_TemporaryName; FILETIME m_LocalFileTime; UINT64 m_BytesTotal; UINT64 m_BytesTransferred; bool m_Completed; CJob * m_Job; // Drive information StringHandle m_VolumePath; StringHandle m_CanonicalVolumePath; UINT m_DriveType; DWORD m_VolumeSerialNumber; }; /** * When deleting a file, some errors are OK to ignore because they imply that * the file has already been deleted by an external agent. This fn filters * out those errors. * * @param Hr HRESULT form of the error from deletion * @param Path the file being deleted * * @return true if the error should be reported, * false if the error should be ignored */ inline bool IsReportableFileDeletionError( HRESULT Hr, LPCWSTR Path ) { if (Hr == HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND )) { return false; } // // ERROR_PATH_NOT_FOUND is returned when we try to delete a UNC path while // the Workstation service is halted. Tn this case, report the error. // if (Hr == HRESULT_FROM_WIN32( ERROR_PATH_NOT_FOUND ) && false == CFile::IsUncPath(Path)) { return false; } return true; }