Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1179 lines
34 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
*
* TITLE: THRDMSG.H
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 9/28/1999
*
* DESCRIPTION: These classes are instantiated for each message posted to the
* background thread. Each is derived from CThreadMessage, and
* is sent to the thread message handler.
*
*******************************************************************************/
#ifndef __THRDMSG_H_INCLUDED
#define __THRDMSG_H_INCLUDED
#include <windows.h>
#include "bkthread.h"
#include "wia.h"
#include "memdib.h"
#include "gphelper.h"
#include "thrdntfy.h"
#include "itranspl.h"
#include "itranhlp.h"
#include "isuppfmt.h"
#include "wiadevdp.h"
// Thread queue messages
#define TQ_DESTROY (WM_USER+1)
#define TQ_DOWNLOADIMAGE (WM_USER+2)
#define TQ_DOWNLOADTHUMBNAIL (WM_USER+3)
#define TQ_SCANPREVIEW (WM_USER+4)
#define TQ_DOWNLOADERROR (WM_USER+5)
#define TQ_DELETEIMAGES (WM_USER+6)
// Base class for other thread messages messages
class CGlobalInterfaceTableThreadMessage : public CNotifyThreadMessage
{
private:
DWORD m_dwGlobalInterfaceTableCookie;
private:
// No implementation
CGlobalInterfaceTableThreadMessage(void);
CGlobalInterfaceTableThreadMessage &operator=( const CGlobalInterfaceTableThreadMessage & );
CGlobalInterfaceTableThreadMessage( const CGlobalInterfaceTableThreadMessage & );
public:
CGlobalInterfaceTableThreadMessage( int nMessage, HWND hWndNotify, DWORD dwGlobalInterfaceTableCookie );
DWORD GlobalInterfaceTableCookie(void) const;
};
//
// Thread handler class for downloading all the camera thumbnails images
//
class CDownloadThumbnailsThreadMessage : public CNotifyThreadMessage
{
private:
CSimpleDynamicArray<DWORD> m_Cookies;
HANDLE m_hCancelEvent;
private:
// No implementation
CDownloadThumbnailsThreadMessage(void);
CDownloadThumbnailsThreadMessage &operator=( const CDownloadThumbnailsThreadMessage & );
CDownloadThumbnailsThreadMessage( const CDownloadThumbnailsThreadMessage & );
public:
// Sole constructor
CDownloadThumbnailsThreadMessage(
HWND hWndNotify,
const CSimpleDynamicArray<DWORD> &Cookies,
HANDLE hCancelEvent
);
virtual ~CDownloadThumbnailsThreadMessage(void);
HRESULT Download(void);
};
//
// Notification message that gets sent for each thumbnail download
//
class CDownloadThumbnailsThreadNotifyMessage : public CThreadNotificationMessage
{
public:
enum COperation
{
DownloadAll,
DownloadThumbnail
};
enum CStatus
{
Begin,
Update,
End
};
private:
COperation m_Operation;
CStatus m_Status;
HRESULT m_hr;
UINT m_nPictureCount;
UINT m_nCurrentPicture;
DWORD m_dwCookie;
PBYTE m_pBitmapData;
LONG m_nWidth;
LONG m_nHeight;
LONG m_nBitmapDataLength;
GUID m_guidDefaultFormat;
LONG m_nAccessRights;
LONG m_nPictureWidth;
LONG m_nPictureHeight;
CAnnotationType m_AnnotationType;
CSimpleString m_strDefExt;
private:
CDownloadThumbnailsThreadNotifyMessage(void);
CDownloadThumbnailsThreadNotifyMessage( const CDownloadThumbnailsThreadNotifyMessage & );
CDownloadThumbnailsThreadNotifyMessage &operator=( const CDownloadThumbnailsThreadNotifyMessage & );
private:
CDownloadThumbnailsThreadNotifyMessage( COperation Operation, CStatus Status, HRESULT hr, UINT nPictureCount, UINT nCurrentPicture, DWORD dwCookie, PBYTE pBitmapData, LONG nWidth, LONG nHeight, LONG nBitmapDataLength, const GUID &guidDefaultFormat, LONG nAccessRights, LONG nPictureWidth, LONG nPictureHeight, CAnnotationType AnnotationType, const CSimpleString &strDefExt )
: CThreadNotificationMessage( TQ_DOWNLOADTHUMBNAIL ),
m_Operation(Operation),
m_Status(Status),
m_hr(hr),
m_nPictureCount(nPictureCount),
m_nCurrentPicture(nCurrentPicture),
m_dwCookie(dwCookie),
m_pBitmapData(pBitmapData),
m_nWidth(nWidth),
m_nHeight(nHeight),
m_nBitmapDataLength(nBitmapDataLength),
m_guidDefaultFormat(guidDefaultFormat),
m_nAccessRights(nAccessRights),
m_nPictureWidth(nPictureWidth),
m_nPictureHeight(nPictureHeight),
m_AnnotationType(AnnotationType),
m_strDefExt(strDefExt)
{
}
public:
virtual ~CDownloadThumbnailsThreadNotifyMessage(void)
{
if (m_pBitmapData)
{
LocalFree(m_pBitmapData);
m_pBitmapData = NULL;
}
}
COperation Operation(void) const
{
return m_Operation;
}
CStatus Status(void) const
{
return m_Status;
}
HRESULT hr(void) const
{
return m_hr;
}
UINT PictureCount(void) const
{
return m_nPictureCount;
}
UINT CurrentPicture(void) const
{
return m_nCurrentPicture;
}
DWORD Cookie(void) const
{
return m_dwCookie;
}
PBYTE BitmapData(void) const
{
return m_pBitmapData;
}
LONG Width(void) const
{
return m_nWidth;
}
LONG Height(void) const
{
return m_nHeight;
}
LONG BitmapDataLength(void) const
{
return m_nBitmapDataLength;
}
GUID DefaultFormat(void) const
{
return m_guidDefaultFormat;
}
LONG AccessRights(void) const
{
return m_nAccessRights;
}
LONG PictureWidth(void) const
{
return m_nPictureWidth;
}
LONG PictureHeight(void) const
{
return m_nPictureHeight;
}
PBYTE DetachBitmapData(void)
{
PBYTE pResult = m_pBitmapData;
m_pBitmapData = NULL;
return pResult;
}
CAnnotationType AnnotationType(void) const
{
return m_AnnotationType;
}
CSimpleString DefExt() const
{
return m_strDefExt;
}
public:
static CDownloadThumbnailsThreadNotifyMessage *BeginDownloadAllMessage( UINT nPictureCount )
{
return new CDownloadThumbnailsThreadNotifyMessage( DownloadAll, Begin, S_OK, nPictureCount, 0, 0, NULL, 0, 0, 0, IID_NULL, 0, 0, 0, AnnotationNone, TEXT("") );
}
static CDownloadThumbnailsThreadNotifyMessage *BeginDownloadThumbnailMessage( UINT nCurrentPicture, DWORD dwCookie )
{
return new CDownloadThumbnailsThreadNotifyMessage( DownloadThumbnail, Begin, S_OK, 0, nCurrentPicture, dwCookie, NULL, 0, 0, 0, IID_NULL, 0, 0, 0, AnnotationNone, TEXT("") );
}
static CDownloadThumbnailsThreadNotifyMessage *EndDownloadThumbnailMessage( UINT nCurrentPicture, DWORD dwCookie, PBYTE pBitmapData, LONG nWidth, LONG nHeight, LONG nBitmapDataLength, const GUID &guidFormat, LONG nAccessRights, LONG nPictureWidth, LONG nPictureHeight, CAnnotationType AnnotationType, const CSimpleString &strDefExt )
{
return new CDownloadThumbnailsThreadNotifyMessage( DownloadThumbnail, End, S_OK, 0, nCurrentPicture, dwCookie, pBitmapData, nWidth, nHeight, nBitmapDataLength, guidFormat, nAccessRights, nPictureWidth, nPictureHeight, AnnotationType, strDefExt );
}
static CDownloadThumbnailsThreadNotifyMessage *EndDownloadAllMessage( HRESULT hr )
{
return new CDownloadThumbnailsThreadNotifyMessage( DownloadAll, End, hr, 0, 0, 0, 0, 0, 0, NULL, IID_NULL, 0, 0, 0, AnnotationNone, TEXT("") );
}
};
class CTransferItem
{
private:
CComPtr<IWiaItem> m_pWiaItem;
CSimpleString m_strFilename;
GUID m_guidInputFormat;
GUID m_guidOutputFormat;
HANDLE m_hFile;
LONG m_nMediaType;
public:
CTransferItem( IWiaItem *pWiaItem = NULL, const CSimpleString &strFilename=TEXT("") )
: m_pWiaItem(pWiaItem),
m_strFilename(strFilename),
m_guidInputFormat(IID_NULL),
m_guidOutputFormat(IID_NULL),
m_hFile(INVALID_HANDLE_VALUE),
m_nMediaType(TYMED_FILE)
{
}
CTransferItem( const CTransferItem &other )
: m_pWiaItem(other.WiaItem()),
m_strFilename(other.Filename()),
m_guidInputFormat(other.InputFormat()),
m_guidOutputFormat(other.OutputFormat()),
m_hFile(INVALID_HANDLE_VALUE),
m_nMediaType(other.MediaType())
{
if (other.FileHandle() != INVALID_HANDLE_VALUE)
{
DuplicateHandle( GetCurrentProcess(), other.FileHandle(), GetCurrentProcess(), &m_hFile, 0, FALSE, DUPLICATE_SAME_ACCESS );
}
}
void Destroy(void)
{
ClosePlaceholderFile();
m_pWiaItem = NULL;
m_strFilename = TEXT("");
m_guidInputFormat = IID_NULL;
m_guidOutputFormat = IID_NULL;
m_nMediaType = 0;
}
~CTransferItem(void)
{
Destroy();
}
CTransferItem &operator=( const CTransferItem &other )
{
if (&other != this)
{
Destroy();
m_pWiaItem = other.WiaItem();
m_strFilename = other.Filename();
m_guidInputFormat = other.InputFormat();
m_guidOutputFormat = other.OutputFormat();
m_nMediaType = other.MediaType();
if (other.FileHandle() != INVALID_HANDLE_VALUE)
{
DuplicateHandle( GetCurrentProcess(), other.FileHandle(), GetCurrentProcess(), &m_hFile, 0, FALSE, DUPLICATE_SAME_ACCESS );
}
}
return *this;
}
bool operator==( const CTransferItem &other )
{
return (other.WiaItem() == WiaItem());
}
IWiaItem *WiaItem(void) const
{
return m_pWiaItem;
}
IWiaItem *WiaItem(void)
{
return m_pWiaItem;
}
void WiaItem( IWiaItem *pWiaItem )
{
m_pWiaItem = pWiaItem;
}
CSimpleString Filename(void) const
{
return m_strFilename;
}
void Filename( const CSimpleString &strFilename )
{
m_strFilename = strFilename;
}
GUID InputFormat(void) const
{
//
// Assume IID_NULL;
//
GUID guidResult = m_guidInputFormat;
if (guidResult == IID_NULL)
{
//
// Get the InputFormat helpers
//
CComPtr<IWiaSupportedFormats> pWiaSupportedFormats;
HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaSupportedFormats, (void**)&pWiaSupportedFormats );
if (SUCCEEDED(hr))
{
//
// Initialize the supported formats helper by telling it we are saving to a file
//
hr = pWiaSupportedFormats->Initialize( m_pWiaItem, TYMED_FILE );
if (SUCCEEDED(hr))
{
//
// Get the default InputFormat
//
hr = pWiaSupportedFormats->GetDefaultClipboardFileFormat( &guidResult );
}
}
}
return guidResult;
}
GUID OutputFormat(void) const
{
//
// Assume IID_NULL;
//
GUID guidResult = m_guidOutputFormat;
if (guidResult == IID_NULL)
{
//
// Get the OutputFormat helpers
//
CComPtr<IWiaSupportedFormats> pWiaSupportedFormats;
HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaSupportedFormats, (void**)&pWiaSupportedFormats );
if (SUCCEEDED(hr))
{
//
// Initialize the supported formats helper by telling it we are saving to a file
//
hr = pWiaSupportedFormats->Initialize( m_pWiaItem, TYMED_FILE );
if (SUCCEEDED(hr))
{
//
// Get the default OutputFormat
//
hr = pWiaSupportedFormats->GetDefaultClipboardFileFormat( &guidResult );
}
}
}
return guidResult;
}
void InputFormat( const GUID &guidInputFormat )
{
m_guidInputFormat = guidInputFormat;
}
void OutputFormat( const GUID &guidOutputFormat )
{
m_guidOutputFormat = guidOutputFormat;
}
HRESULT OpenPlaceholderFile(void)
{
HRESULT hr;
if (m_strFilename.Length())
{
m_hFile = CreateFile( m_strFilename, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL );
if (m_hFile != INVALID_HANDLE_VALUE)
{
hr = S_OK;
}
else
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
else
{
hr = E_FAIL;
}
return hr;
}
HRESULT ClosePlaceholderFile(void)
{
if (m_hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
}
return S_OK;
}
HRESULT DeleteFile(void)
{
ClosePlaceholderFile();
if (m_strFilename.Length())
{
::DeleteFile( m_strFilename );
}
return S_OK;
}
HANDLE FileHandle(void) const
{
return m_hFile;
}
LONG MediaType(void) const
{
return m_nMediaType;
}
void MediaType( LONG nMediaType )
{
m_nMediaType = nMediaType;
}
};
//
// Thread handler class for downloading selected images
//
class CDownloadImagesThreadMessage : public CNotifyThreadMessage, public IWiaDataCallback
{
private:
CSimpleDynamicArray<DWORD> m_Cookies;
CSimpleDynamicArray<int> m_Rotation;
CSimpleString m_strDirectory;
CSimpleString m_strFilename;
GUID m_guidFormat;
HANDLE m_hCancelDownloadEvent;
HANDLE m_hPauseDownloadEvent;
HANDLE m_hFilenameCreationMutex;
CGdiPlusHelper m_GdiPlusHelper;
bool m_bStampTime;
UINT m_nLastStatusUpdatePercent;
CMemoryDib m_MemoryDib;
bool m_bFirstTransfer;
DWORD m_nCurrentCookie;
int m_nCurrentPreviewImageLine;
private:
//
// No implementation
//
CDownloadImagesThreadMessage(void);
CDownloadImagesThreadMessage &operator=( const CDownloadImagesThreadMessage & );
CDownloadImagesThreadMessage( const CDownloadImagesThreadMessage & );
public:
//
// Sole constructor
//
CDownloadImagesThreadMessage(
HWND hWndNotify,
const CSimpleDynamicArray<DWORD> &Cookies,
const CSimpleDynamicArray<int> &Rotation,
LPCTSTR pszDirectory,
LPCTSTR pszFilename,
const GUID &guidFormat,
HANDLE hCancelDownloadEvent,
bool bStampTime,
HANDLE hPauseDownloadEvent
);
virtual ~CDownloadImagesThreadMessage(void);
//
// Worker functions
//
HRESULT Download(void);
//
// Static helper functions
//
static CSimpleString GetDateString(void);
static int ReportError( HWND hWndNotify, const CSimpleString &strMessage, int nMessageBoxFlags );
static int ReportDownloadError( HWND hWndNotify, IWiaItem *pWiaItem, HRESULT &hr, bool bAllowContinue, bool bPageFeederActive, bool bMultipageFile, bool bMultiPageTransfer );
static HRESULT GetListOfTransferItems( IWiaItem *pWiaItem, CSimpleDynamicArray<CTransferItem> &TransferItems );
BOOL GetCancelledState();
HRESULT ReserveTransferItemFilenames( CSimpleDynamicArray<CTransferItem> &TransferItems, LPCTSTR pszDirectory, LPCTSTR pszFilename, LPCTSTR pszNumberMask, bool bAllowUnNumberedFile, int &nPrevFileNumber );
//
// IUnknown
//
STDMETHODIMP QueryInterface( REFIID riid, LPVOID *ppvObject );
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//
// IWiaDataCallback
//
STDMETHODIMP BandedDataCallback( LONG, LONG, LONG, LONG, LONG, LONG, LONG, PBYTE );
//
// IImageTransferPluginProgressCallback methods
//
STDMETHODIMP SetProgressMessage( BSTR bstrMessage );
STDMETHODIMP SetCurrentFile( UINT nIndex );
STDMETHODIMP SetOverallPercent( UINT nPercent );
STDMETHODIMP SetFilePercent( UINT nPercent );
STDMETHODIMP Cancelled( UINT *bCancelled );
};
class CDownloadedFileInformation
{
private:
bool m_bDeleteOnError;
CSimpleString m_strFilename;
DWORD m_dwCookie;
bool m_bIncludeInFileCount;
public:
CDownloadedFileInformation( const CDownloadedFileInformation &other )
: m_bDeleteOnError(other.DeleteOnError()),
m_strFilename(other.Filename()),
m_dwCookie(other.Cookie()),
m_bIncludeInFileCount(other.IncludeInFileCount())
{
}
CDownloadedFileInformation( const CSimpleString &strFilename, bool bDeleteOnError, DWORD dwCookie, bool bIncludeInFileCount )
: m_bDeleteOnError(bDeleteOnError),
m_strFilename(strFilename),
m_dwCookie(dwCookie),
m_bIncludeInFileCount(bIncludeInFileCount)
{
}
CDownloadedFileInformation(void)
: m_bDeleteOnError(false),
m_strFilename(TEXT("")),
m_dwCookie(0),
m_bIncludeInFileCount(false)
{
}
CDownloadedFileInformation &operator=( const CDownloadedFileInformation &other )
{
if (this != &other)
{
m_bDeleteOnError = other.DeleteOnError();
m_strFilename = other.Filename();
m_dwCookie = other.Cookie();
m_bIncludeInFileCount = other.IncludeInFileCount();
}
return *this;
}
bool DeleteOnError(void) const
{
return m_bDeleteOnError;
}
void DeleteOnError( bool bDeleteOnError )
{
m_bDeleteOnError = bDeleteOnError;
}
const CSimpleString &Filename(void) const
{
return m_strFilename;
}
DWORD Cookie(void) const
{
return m_dwCookie;
}
bool IncludeInFileCount(void) const
{
return m_bIncludeInFileCount;
}
};
class CDownloadedFileInformationList : public CSimpleDynamicArray<CDownloadedFileInformation>
{
public:
CDownloadedFileInformationList(void)
{
}
CDownloadedFileInformationList( const CDownloadedFileInformationList &other )
{
for (int i=0;i<other.Size();i++)
{
Append(other[i]);
}
}
CDownloadedFileInformationList &operator=( const CDownloadedFileInformationList &other )
{
if (&other != this)
{
Destroy();
for (int i=0;i<other.Size();i++)
{
Append(other[i]);
}
}
return *this;
}
HRESULT DeleteAllFiles(void)
{
WIA_PUSHFUNCTION(TEXT("DeleteAllFiles"));
HRESULT hr = S_OK;
for (int i=0;i<Size();i++)
{
if ((*this)[i].DeleteOnError())
{
WIA_TRACE((TEXT("Calling DeleteFile on %s!"),(*this)[i].Filename().String()));
if (!DeleteFile((*this)[i].Filename()))
{
if (SUCCEEDED(hr))
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
WIA_PRINTHRESULT((hr,TEXT("DeleteFile failed on %s!"),(*this)[i].Filename().String()));
}
}
}
return hr;
}
HRESULT GetAllFiles( CSimpleDynamicArray<CSimpleStringAnsi> &AllFiles )
{
AllFiles.Destroy();
for (int i=0;i<Size();i++)
{
AllFiles.Append(CSimpleStringConvert::AnsiString((*this)[i].Filename()));
}
return S_OK;
}
HRESULT GetAllFiles( CSimpleDynamicArray<CSimpleStringWide> &AllFiles )
{
AllFiles.Destroy();
for (int i=0;i<Size();i++)
{
AllFiles.Append(CSimpleStringConvert::WideString((*this)[i].Filename()));
}
return S_OK;
}
HRESULT GetUniqueFiles( CSimpleDynamicArray<CSimpleString> &UniqueFiles )
{
UniqueFiles.Destroy();
for (int i=0;i<Size();i++)
{
if (UniqueFiles.Find((*this)[i].Filename()) < 0)
{
UniqueFiles.Append((*this)[i].Filename());
}
}
return S_OK;
}
int Find( LPCTSTR pszFilename )
{
if (pszFilename && lstrlen(pszFilename))
{
for (int i=0;i<Size();i++)
{
if ((*this)[i].Filename().Length())
{
if (!lstrcmp(pszFilename,(*this)[i].Filename()))
{
//
// Found a match
//
return i;
}
}
}
}
return -1;
}
int FindByFilenameOnly( LPCTSTR pszFilename )
{
if (pszFilename)
{
for (int i=0;i<Size();i++)
{
if ((*this)[i].Filename().Length())
{
LPTSTR pszFilenameOnly = PathFindFileName( (*this)[i].Filename() );
if (pszFilenameOnly && !lstrcmp(pszFilenameOnly,pszFilename))
{
//
// Found a match
//
return i;
}
}
}
}
return -1;
}
};
class CDownloadImagesThreadNotifyMessage : public CThreadNotificationMessage
{
public:
enum COperation
{
DownloadAll,
DownloadImage,
PreviewImage
};
enum CStatus
{
Begin,
Update,
End
};
private:
COperation m_Operation;
CStatus m_Status;
HRESULT m_hr;
UINT m_nPercentComplete;
UINT m_nPictureCount;
UINT m_nCurrentPicture;
DWORD m_dwCookie;
CSimpleString m_strExtendedErrorInformation;
CSimpleString m_strFilename;
CDownloadedFileInformationList m_DownloadedFileInformation;
HBITMAP m_hPreviewBitmap;
private:
CDownloadImagesThreadNotifyMessage(void);
CDownloadImagesThreadNotifyMessage( const CDownloadImagesThreadNotifyMessage & );
CDownloadImagesThreadNotifyMessage &operator=( const CDownloadImagesThreadNotifyMessage & );
private:
CDownloadImagesThreadNotifyMessage( COperation Operation, CStatus Status, HRESULT hr, UINT nPercentComplete, UINT nPictureCount, UINT nCurrentPicture, DWORD dwCookie, const CSimpleString &strExtendedErrorInformation, const CSimpleString &strFilename, const CDownloadedFileInformationList *pDownloadedFileInformation, HBITMAP hPreviewBitmap )
: CThreadNotificationMessage( TQ_DOWNLOADIMAGE ),
m_Operation(Operation),
m_Status(Status),
m_hr(hr),
m_nPercentComplete(nPercentComplete),
m_nPictureCount(nPictureCount),
m_nCurrentPicture(nCurrentPicture),
m_dwCookie(dwCookie),
m_strExtendedErrorInformation(strExtendedErrorInformation),
m_strFilename(strFilename),
m_hPreviewBitmap(hPreviewBitmap)
{
if (pDownloadedFileInformation)
{
m_DownloadedFileInformation = *pDownloadedFileInformation;
}
}
public:
virtual ~CDownloadImagesThreadNotifyMessage(void)
{
}
COperation Operation(void) const
{
return m_Operation;
}
CStatus Status(void) const
{
return m_Status;
}
HRESULT hr(void) const
{
return m_hr;
}
UINT PercentComplete(void) const
{
return m_nPercentComplete;
}
UINT PictureCount(void) const
{
return m_nPictureCount;
}
UINT CurrentPicture(void) const
{
return m_nCurrentPicture;
}
DWORD Cookie(void) const
{
return m_dwCookie;
}
CSimpleString ExtendedErrorInformation(void)
{
return m_strExtendedErrorInformation;
}
CSimpleString Filename(void)
{
return m_strFilename;
}
const CDownloadedFileInformationList &DownloadedFileInformation(void) const
{
return m_DownloadedFileInformation;
}
HBITMAP PreviewBitmap(void) const
{
return m_hPreviewBitmap;
}
public:
static CDownloadImagesThreadNotifyMessage *BeginDownloadAllMessage( UINT nPictureCount )
{
return new CDownloadImagesThreadNotifyMessage( DownloadAll, Begin, S_OK, 0, nPictureCount, 0, 0, TEXT(""), TEXT(""), NULL, NULL );
}
static CDownloadImagesThreadNotifyMessage *BeginDownloadImageMessage( UINT nCurrentPicture, DWORD dwCookie, const CSimpleString &strFilename )
{
return new CDownloadImagesThreadNotifyMessage( DownloadImage, Begin, S_OK, 0, 0, nCurrentPicture, dwCookie, TEXT(""), strFilename, NULL, NULL );
}
static CDownloadImagesThreadNotifyMessage *UpdateDownloadImageMessage( UINT nPercentComplete )
{
return new CDownloadImagesThreadNotifyMessage( DownloadImage, Update, S_OK, nPercentComplete, 0, 0, 0, TEXT(""), TEXT(""), NULL, NULL );
}
static CDownloadImagesThreadNotifyMessage *EndDownloadImageMessage( UINT nCurrentPicture, DWORD dwCookie, const CSimpleString &strFilename, HRESULT hr )
{
return new CDownloadImagesThreadNotifyMessage( DownloadImage, End, hr, 100, 0, nCurrentPicture, dwCookie, TEXT(""), strFilename, NULL, NULL );
}
static CDownloadImagesThreadNotifyMessage *EndDownloadAllMessage( HRESULT hr, const CSimpleString &strExtendedErrorInformation, const CDownloadedFileInformationList *pDownloadedFileInformation )
{
return new CDownloadImagesThreadNotifyMessage( DownloadAll, End, hr, 0, 0, 0, 0, strExtendedErrorInformation, TEXT(""), pDownloadedFileInformation, NULL );
}
static CDownloadImagesThreadNotifyMessage *BeginPreviewMessage( DWORD dwCookie, HBITMAP hPreviewBitmap )
{
return new CDownloadImagesThreadNotifyMessage( PreviewImage, Begin, S_OK, 100, 0, 0, dwCookie, TEXT(""), TEXT(""), NULL, hPreviewBitmap );
}
static CDownloadImagesThreadNotifyMessage *UpdatePreviewMessage( DWORD dwCookie, HBITMAP hPreviewBitmap )
{
return new CDownloadImagesThreadNotifyMessage( PreviewImage, Update, S_OK, 100, 0, 0, dwCookie, TEXT(""), TEXT(""), NULL, hPreviewBitmap );
}
static CDownloadImagesThreadNotifyMessage *EndPreviewMessage( DWORD dwCookie )
{
return new CDownloadImagesThreadNotifyMessage( PreviewImage, End, S_OK, 100, 0, 0, dwCookie, TEXT(""), TEXT(""), NULL, NULL );
}
};
//
// Thread handler class for deleting selected images
//
class CDeleteImagesThreadMessage : public CNotifyThreadMessage
{
private:
CSimpleDynamicArray<DWORD> m_Cookies;
HANDLE m_hCancelDeleteEvent;
HANDLE m_hPauseDeleteEvent;
bool m_bSlowItDown;
private:
//
// No implementation
//
CDeleteImagesThreadMessage(void);
CDeleteImagesThreadMessage &operator=( const CDeleteImagesThreadMessage & );
CDeleteImagesThreadMessage( const CDeleteImagesThreadMessage & );
public:
//
// Sole constructor
//
CDeleteImagesThreadMessage(
HWND hWndNotify,
const CSimpleDynamicArray<DWORD> &Cookies,
HANDLE hCancelDeleteEvent,
HANDLE hPauseDeleteEvent,
bool bSlowItDown
);
virtual ~CDeleteImagesThreadMessage(void);
//
// Worker functions
//
HRESULT DeleteImages(void);
};
class CDeleteImagesThreadNotifyMessage : public CThreadNotificationMessage
{
public:
enum COperation
{
DeleteAll,
DeleteImage,
};
enum CStatus
{
Begin,
End
};
private:
COperation m_Operation;
CStatus m_Status;
HRESULT m_hr;
UINT m_nPictureCount;
UINT m_nCurrentPicture;
DWORD m_dwCookie;
private:
CDeleteImagesThreadNotifyMessage(void);
CDeleteImagesThreadNotifyMessage( const CDeleteImagesThreadNotifyMessage & );
CDeleteImagesThreadNotifyMessage &operator=( const CDeleteImagesThreadNotifyMessage & );
private:
CDeleteImagesThreadNotifyMessage( COperation Operation, CStatus Status, HRESULT hr, UINT nPictureCount, UINT nCurrentPicture, DWORD dwCookie )
: CThreadNotificationMessage( TQ_DOWNLOADIMAGE ),
m_Operation(Operation),
m_Status(Status),
m_hr(hr),
m_nPictureCount(nPictureCount),
m_nCurrentPicture(nCurrentPicture),
m_dwCookie(dwCookie)
{
}
public:
virtual ~CDeleteImagesThreadNotifyMessage(void)
{
}
COperation Operation(void) const
{
return m_Operation;
}
CStatus Status(void) const
{
return m_Status;
}
HRESULT hr(void) const
{
return m_hr;
}
UINT PictureCount(void) const
{
return m_nPictureCount;
}
UINT CurrentPicture(void) const
{
return m_nCurrentPicture;
}
DWORD Cookie(void) const
{
return m_dwCookie;
}
public:
static CDeleteImagesThreadNotifyMessage *BeginDeleteAllMessage( UINT nPictureCount )
{
return new CDeleteImagesThreadNotifyMessage( DeleteAll, Begin, S_OK, nPictureCount, 0, 0 );
}
static CDeleteImagesThreadNotifyMessage *BeginDeleteImageMessage( UINT nCurrentPicture, DWORD dwCookie )
{
return new CDeleteImagesThreadNotifyMessage( DeleteImage, Begin, S_OK, 0, nCurrentPicture, dwCookie );
}
static CDeleteImagesThreadNotifyMessage *EndDeleteImageMessage( UINT nCurrentPicture, DWORD dwCookie, HRESULT hr )
{
return new CDeleteImagesThreadNotifyMessage( DeleteImage, End, hr, 0, nCurrentPicture, dwCookie );
}
static CDeleteImagesThreadNotifyMessage *EndDeleteAllMessage( HRESULT hr )
{
return new CDeleteImagesThreadNotifyMessage( DeleteAll, End, hr, 0, 0, 0 );
}
};
//
// Notification message that gets sent when there is a download error
//
class CDownloadErrorNotificationMessage : public CThreadNotificationMessage
{
private:
CSimpleString m_strMessage;
HANDLE m_hHandledMessageEvent;
HANDLE m_hRespondedMessageEvent;
int m_nMessageBoxFlags;
int &m_nResult;
private:
CDownloadErrorNotificationMessage(void);
CDownloadErrorNotificationMessage( const CDownloadErrorNotificationMessage & );
CDownloadErrorNotificationMessage &operator=( const CDownloadErrorNotificationMessage & );
private:
CDownloadErrorNotificationMessage( const CSimpleString &strMessage, HANDLE hHandledMessageEvent, HANDLE hRespondedMessageEvent, int nMessageBoxFlags, int &nResult )
: CThreadNotificationMessage( TQ_DOWNLOADERROR ),
m_strMessage(strMessage),
m_hHandledMessageEvent(hHandledMessageEvent),
m_hRespondedMessageEvent(hRespondedMessageEvent),
m_nMessageBoxFlags(nMessageBoxFlags),
m_nResult(nResult)
{
}
public:
virtual ~CDownloadErrorNotificationMessage(void)
{
}
CSimpleString Message(void) const
{
return m_strMessage;
}
int MessageBoxFlags(void)
{
return m_nMessageBoxFlags;
}
void Handled(void)
{
if (m_hHandledMessageEvent)
{
SetEvent(m_hHandledMessageEvent);
}
}
void Response( int nResult )
{
m_nResult = nResult;
if (m_hRespondedMessageEvent)
{
SetEvent(m_hRespondedMessageEvent);
}
}
public:
static CDownloadErrorNotificationMessage *ReportDownloadError( const CSimpleString &strMessage, HANDLE hHandledMessageEvent, HANDLE hRespondedMessageEvent, int nMessageBoxFlags, int &nResult )
{
return new CDownloadErrorNotificationMessage( strMessage, hHandledMessageEvent, hRespondedMessageEvent, nMessageBoxFlags, nResult );
}
};
// Thread handler class for downloading selected images
class CPreviewScanThreadMessage : public CNotifyThreadMessage, public IWiaDataCallback
{
private:
HWND m_hwndNotify;
DWORD m_dwCookie;
CMemoryDib m_MemoryDib;
bool m_bFirstTransfer;
HANDLE m_hCancelPreviewEvent;
private:
// No implementation
CPreviewScanThreadMessage(void);
CPreviewScanThreadMessage &operator=( const CPreviewScanThreadMessage & );
CPreviewScanThreadMessage( const CPreviewScanThreadMessage & );
public:
// Sole constructor
CPreviewScanThreadMessage(
HWND hWndNotify,
DWORD dwCookie,
HANDLE hCancelPreviewEvent
);
~CPreviewScanThreadMessage();
HRESULT Scan(void);
// IUnknown
STDMETHODIMP QueryInterface( REFIID riid, LPVOID *ppvObject );
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IWiaDataCallback
STDMETHODIMP BandedDataCallback( LONG, LONG, LONG, LONG, LONG, LONG, LONG, PBYTE );
};
class CPreviewScanThreadNotifyMessage : public CThreadNotificationMessage
{
public:
enum CStatus
{
Begin,
Update,
End
};
private:
CStatus m_Status;
HRESULT m_hr;
DWORD m_dwCookie;
HBITMAP m_hBitmap;
private:
CPreviewScanThreadNotifyMessage(void);
CPreviewScanThreadNotifyMessage( const CPreviewScanThreadNotifyMessage & );
CPreviewScanThreadNotifyMessage &operator=( const CPreviewScanThreadNotifyMessage & );
private:
CPreviewScanThreadNotifyMessage( CStatus Status, HRESULT hr, DWORD dwCookie, HBITMAP hBitmap )
: CThreadNotificationMessage( TQ_SCANPREVIEW ),
m_Status(Status),
m_hr(hr),
m_dwCookie(dwCookie),
m_hBitmap(hBitmap)
{
}
public:
virtual ~CPreviewScanThreadNotifyMessage(void)
{
m_hBitmap = NULL;
}
CStatus Status(void) const
{
return m_Status;
}
HRESULT hr(void) const
{
return m_hr;
}
DWORD Cookie(void) const
{
return m_dwCookie;
}
HBITMAP Bitmap(void) const
{
return m_hBitmap;
}
public:
static CPreviewScanThreadNotifyMessage *BeginDownloadMessage( DWORD dwCookie )
{
return new CPreviewScanThreadNotifyMessage( Begin, S_OK, dwCookie, NULL );
}
static CPreviewScanThreadNotifyMessage *UpdateDownloadMessage( DWORD dwCookie, HBITMAP hBitmap )
{
return new CPreviewScanThreadNotifyMessage( Update, S_OK, dwCookie, hBitmap );
}
static CPreviewScanThreadNotifyMessage *EndDownloadMessage( DWORD dwCookie, HBITMAP hBitmap, HRESULT hr )
{
return new CPreviewScanThreadNotifyMessage( End, hr, dwCookie, hBitmap );
}
};
#endif // __THRDMSG_H_INCLUDED