You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
7.1 KiB
319 lines
7.1 KiB
/************************************************************************
|
|
|
|
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;
|
|
}
|