/******************************************************************************* * * (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 #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 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 &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 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 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 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 m_Cookies; CSimpleDynamicArray 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 &Cookies, const CSimpleDynamicArray &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 &TransferItems ); BOOL GetCancelledState(); HRESULT ReserveTransferItemFilenames( CSimpleDynamicArray &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 { public: CDownloadedFileInformationList(void) { } CDownloadedFileInformationList( const CDownloadedFileInformationList &other ) { for (int i=0;i &AllFiles ) { AllFiles.Destroy(); for (int i=0;i &AllFiles ) { AllFiles.Destroy(); for (int i=0;i &UniqueFiles ) { UniqueFiles.Destroy(); for (int i=0;i 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 &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