Leaked source code of windows server 2003
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.
 
 
 
 
 
 

2189 lines
81 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 1998
*
* TITLE: ACQMGRCW.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 9/27/1999
*
* DESCRIPTION:
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include <windows.h>
#include <simcrack.h>
#include <commctrl.h>
#include <wiatextc.h>
#include <pviewids.h>
#include <commctrl.h>
#include "resource.h"
#include "acqmgrcw.h"
#include "wia.h"
#include "wiadevdp.h"
#include "evntparm.h"
#include "itranhlp.h"
#include "bkthread.h"
#include "wiaitem.h"
#include "errors.h"
#include "isuppfmt.h"
#include "uiexthlp.h"
#include "gphelper.h"
#include "svselfil.h"
#include "gwiaevnt.h"
#include "modlock.h"
#include "comfin.h"
#include "comprog.h"
#include "upquery.h"
#include "comdelp.h"
#include "devprop.h"
#include "mboxex.h"
#include "dumpprop.h"
#include "psutil.h"
#undef TRY_SMALLER_THUMBNAILS
#if defined(TRY_SMALLER_THUMBNAILS)
static const int c_nDefaultThumbnailWidth = 80;
static const int c_nDefaultThumbnailHeight = 80;
static const int c_nMaxThumbnailWidth = 80;
static const int c_nMaxThumbnailHeight = 80;
static const int c_nMinThumbnailWidth = 80;
static const int c_nMinThumbnailHeight = 80;
#else
static const int c_nDefaultThumbnailWidth = 90;
static const int c_nDefaultThumbnailHeight = 90;
static const int c_nMaxThumbnailWidth = 120;
static const int c_nMaxThumbnailHeight = 120;
static const int c_nMinThumbnailWidth = 80;
static const int c_nMinThumbnailHeight = 80;
#endif
//
// Property sheet pages' window class declarations
//
#include "comfirst.h"
#include "camsel.h"
#include "comtrans.h"
#include "scansel.h"
// -------------------------------------------------
// CAcquisitionManagerControllerWindow
// -------------------------------------------------
CAcquisitionManagerControllerWindow::CAcquisitionManagerControllerWindow( HWND hWnd )
: m_hWnd(hWnd),
m_pEventParameters(NULL),
m_DeviceTypeMode(UnknownMode),
m_hWizardIconSmall(NULL),
m_hWizardIconBig(NULL),
m_guidOutputFormat(IID_NULL),
m_bDeletePicturesIfSuccessful(false),
m_nThreadNotificationMessage(RegisterWindowMessage(STR_THREAD_NOTIFICATION_MESSAGE)),
m_nWiaEventMessage(RegisterWindowMessage(STR_WIAEVENT_NOTIFICATION_MESSAGE)),
m_bDisconnected(false),
m_pThreadMessageQueue(NULL),
m_bStampTimeOnSavedFiles(true),
m_bOpenShellAfterDownload(true),
m_bSuppressFirstPage(false),
m_nFailedImagesCount(0),
m_nDestinationPageIndex(-1),
m_nFinishPageIndex(-1),
m_nDeleteProgressPageIndex(-1),
m_nSelectionPageIndex(-1),
m_hWndWizard(NULL),
m_bTakePictureIsSupported(false),
m_nWiaWizardPageCount(0),
m_nUploadWizardPageCount(0),
m_bUploadToWeb(false),
m_cRef(1),
m_nScannerType(ScannerTypeUnknown),
m_OnDisconnect(0),
m_dwLastEnumerationTickCount(0)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::CAcquisitionManagerControllerWindow"));
// This sets up the map that maps thread messages to message handlers, which are declared to be static
// member functions.
static CThreadMessageMap s_MsgMap[] =
{
{ TQ_DESTROY, OnThreadDestroy},
{ TQ_DOWNLOADIMAGE, OnThreadDownloadImage},
{ TQ_DOWNLOADTHUMBNAIL, OnThreadDownloadThumbnail},
{ TQ_SCANPREVIEW, OnThreadPreviewScan},
{ TQ_DELETEIMAGES, OnThreadDeleteImages},
{ 0, NULL}
};
// Assume the default thumbnail size, in case we aren't able to calculate it
m_sizeThumbnails.cx = c_nDefaultThumbnailWidth;
m_sizeThumbnails.cy = c_nDefaultThumbnailHeight;
//
// Read the initial settings
//
CSimpleReg reg( HKEY_CURRENT_USER, REGSTR_PATH_USER_SETTINGS_WIAACMGR, false, KEY_READ );
m_bOpenShellAfterDownload = (reg.Query( REG_STR_OPENSHELL, m_bOpenShellAfterDownload ) != FALSE);
m_bSuppressFirstPage = (reg.Query( REG_STR_SUPRESSFIRSTPAGE, m_bSuppressFirstPage ) != FALSE);
//
// Initialize the background thread queue, which will handle all of our background requests
//
m_pThreadMessageQueue = new CThreadMessageQueue;
if (m_pThreadMessageQueue)
{
//
// Note that CBackgroundThread takes ownership of m_pThreadMessageQueue, and it doesn't have to be deleted in this thread
//
m_hBackgroundThread = CBackgroundThread::Create( m_pThreadMessageQueue, s_MsgMap, m_CancelEvent.Event(), NULL );
}
ZeroMemory( m_PublishWizardPages, sizeof(m_PublishWizardPages) );
}
CAcquisitionManagerControllerWindow::~CAcquisitionManagerControllerWindow(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::~CAcquisitionManagerControllerWindow"));
if (m_pEventParameters)
{
if (m_pEventParameters->pWizardSharedMemory)
{
delete m_pEventParameters->pWizardSharedMemory;
}
m_pEventParameters = NULL;
}
}
LRESULT CAcquisitionManagerControllerWindow::OnDestroy( WPARAM, LPARAM )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::OnDestroy"));
//
// Tell the publishing wizard to release us
//
if (m_pPublishingWizard)
{
IUnknown_SetSite( m_pPublishingWizard, NULL );
}
//
// Release the publishing wizard and its data
//
m_pPublishingWizard = NULL;
//
// Stop downloading thumbnails
//
m_EventThumbnailCancel.Signal();
//
// Unpause the background thread
//
m_EventPauseBackgroundThread.Signal();
//
// Tell the background thread to destroy itself
//
m_pThreadMessageQueue->Enqueue( new CThreadMessage(TQ_DESTROY),CThreadMessageQueue::PriorityUrgent);
//
// Issue a cancel io command for this item
//
WiaUiUtil::IssueWiaCancelIO(m_pWiaItemRoot);
//
// Tell other instances we are done before the background thread is finished,
// so we can immediately start again
//
if (m_pEventParameters && m_pEventParameters->pWizardSharedMemory)
{
m_pEventParameters->pWizardSharedMemory->Close();
}
//
// Wait for the thread to exit
//
WiaUiUtil::MsgWaitForSingleObject( m_hBackgroundThread, INFINITE );
CloseHandle( m_hBackgroundThread );
//
// Clean up the icons
//
if (m_hWizardIconSmall)
{
DestroyIcon( m_hWizardIconSmall );
m_hWizardIconSmall = NULL;
}
if (m_hWizardIconBig)
{
DestroyIcon( m_hWizardIconBig );
m_hWizardIconBig = NULL;
}
return 0;
}
BOOL WINAPI CAcquisitionManagerControllerWindow::OnThreadDestroy( CThreadMessage *pMsg )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::OnThreadDestroy"));
// Return false to close the queue
return FALSE;
}
BOOL WINAPI CAcquisitionManagerControllerWindow::OnThreadDownloadImage( CThreadMessage *pMsg )
{
CDownloadImagesThreadMessage *pDownloadImageThreadMessage = dynamic_cast<CDownloadImagesThreadMessage*>(pMsg);
if (pDownloadImageThreadMessage)
{
pDownloadImageThreadMessage->Download();
}
else
{
WIA_ERROR((TEXT("pDownloadImageThreadMessage was NULL")));
}
return TRUE;
}
BOOL WINAPI CAcquisitionManagerControllerWindow::OnThreadDownloadThumbnail( CThreadMessage *pMsg )
{
CDownloadThumbnailsThreadMessage *pDownloadThumnailsThreadMessage = dynamic_cast<CDownloadThumbnailsThreadMessage*>(pMsg);
if (pDownloadThumnailsThreadMessage)
{
pDownloadThumnailsThreadMessage->Download();
}
else
{
WIA_ERROR((TEXT("pDownloadThumnailThreadMessage was NULL")));
}
return TRUE;
}
BOOL WINAPI CAcquisitionManagerControllerWindow::OnThreadPreviewScan( CThreadMessage *pMsg )
{
CPreviewScanThreadMessage *pPreviewScanThreadMessage = dynamic_cast<CPreviewScanThreadMessage*>(pMsg);
if (pPreviewScanThreadMessage)
{
pPreviewScanThreadMessage->Scan();
}
else
{
WIA_ERROR((TEXT("pPreviewScanThreadMessage was NULL")));
}
return TRUE;
}
BOOL WINAPI CAcquisitionManagerControllerWindow::OnThreadDeleteImages( CThreadMessage *pMsg )
{
CDeleteImagesThreadMessage *pDeleteImagesThreadMessage = dynamic_cast<CDeleteImagesThreadMessage*>(pMsg);
if (pDeleteImagesThreadMessage)
{
pDeleteImagesThreadMessage->DeleteImages();
}
else
{
WIA_ERROR((TEXT("pPreviewScanThreadMessage was NULL")));
}
return TRUE;
}
HRESULT CAcquisitionManagerControllerWindow::CreateDevice(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::CreateDevice"));
CComPtr<IWiaDevMgr> pWiaDevMgr;
HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)&pWiaDevMgr );
if (SUCCEEDED(hr))
{
bool bRetry = true;
for (DWORD dwRetryCount = 0;dwRetryCount < CREATE_DEVICE_RETRY_MAX_COUNT && bRetry;dwRetryCount++)
{
hr = pWiaDevMgr->CreateDevice( CSimpleBStr(m_pEventParameters->strDeviceID), &m_pWiaItemRoot );
WIA_PRINTHRESULT((hr,TEXT("pWiaDevMgr->CreateDevice returned")));
if (SUCCEEDED(hr))
{
//
// Break out of loop
//
bRetry = false;
//
// Register for events
//
CGenericWiaEventHandler::RegisterForWiaEvent( m_pEventParameters->strDeviceID, WIA_EVENT_DEVICE_DISCONNECTED, &m_pDisconnectEventObject, m_hWnd, m_nWiaEventMessage );
CGenericWiaEventHandler::RegisterForWiaEvent( m_pEventParameters->strDeviceID, WIA_EVENT_ITEM_DELETED, &m_pDeleteItemEventObject, m_hWnd, m_nWiaEventMessage );
CGenericWiaEventHandler::RegisterForWiaEvent( m_pEventParameters->strDeviceID, WIA_EVENT_DEVICE_CONNECTED, &m_pConnectEventObject, m_hWnd, m_nWiaEventMessage );
CGenericWiaEventHandler::RegisterForWiaEvent( m_pEventParameters->strDeviceID, WIA_EVENT_ITEM_CREATED, &m_pCreateItemEventObject, m_hWnd, m_nWiaEventMessage );
}
else if (WIA_ERROR_BUSY == hr)
{
//
// Wait a little while before retrying
//
Sleep(CREATE_DEVICE_RETRY_WAIT);
}
else
{
//
// All other errors are considered fatal
//
bRetry = false;
}
}
}
return hr;
}
void CAcquisitionManagerControllerWindow::GetCookiesOfSelectedImages( CWiaItem *pCurr, CSimpleDynamicArray<DWORD> &Cookies )
{
while (pCurr)
{
GetCookiesOfSelectedImages(pCurr->Children(),Cookies);
if (pCurr->IsDownloadableItemType() && pCurr->SelectedForDownload())
{
Cookies.Append(pCurr->GlobalInterfaceTableCookie());
}
pCurr = pCurr->Next();
}
}
void CAcquisitionManagerControllerWindow::MarkAllItemsUnselected( CWiaItem *pCurrItem )
{
while (pCurrItem)
{
pCurrItem->SelectedForDownload(false);
MarkAllItemsUnselected( pCurrItem->Children() );
pCurrItem = pCurrItem->Next();
}
}
void CAcquisitionManagerControllerWindow::MarkItemSelected( CWiaItem *pItem, CWiaItem *pCurrItem )
{
while (pCurrItem)
{
if (pItem == pCurrItem && !pCurrItem->Deleted())
{
pCurrItem->SelectedForDownload(true);
}
MarkItemSelected( pItem, pCurrItem->Children() );
pCurrItem = pCurrItem->Next();
}
}
void CAcquisitionManagerControllerWindow::GetSelectedItems( CWiaItem *pCurr, CSimpleDynamicArray<CWiaItem*> &Items )
{
while (pCurr)
{
GetSelectedItems(pCurr->Children(),Items);
if (pCurr->IsDownloadableItemType() && pCurr->SelectedForDownload())
{
Items.Append(pCurr);
}
pCurr = pCurr->Next();
}
}
void CAcquisitionManagerControllerWindow::GetRotationOfSelectedImages( CWiaItem *pCurr, CSimpleDynamicArray<int> &Rotation )
{
while (pCurr)
{
GetRotationOfSelectedImages(pCurr->Children(),Rotation);
if (pCurr->IsDownloadableItemType() && pCurr->SelectedForDownload())
{
Rotation.Append(pCurr->Rotation());
}
pCurr = pCurr->Next();
}
}
void CAcquisitionManagerControllerWindow::GetCookiesOfAllImages( CWiaItem *pCurr, CSimpleDynamicArray<DWORD> &Cookies )
{
while (pCurr)
{
GetCookiesOfAllImages(pCurr->Children(),Cookies);
if (pCurr->IsDownloadableItemType())
{
Cookies.Append(pCurr->GlobalInterfaceTableCookie());
}
pCurr = pCurr->Next();
}
}
int CAcquisitionManagerControllerWindow::GetSelectedImageCount( void )
{
CSimpleDynamicArray<DWORD> Cookies;
CSimpleDynamicArray<int> Rotation;
GetCookiesOfSelectedImages( m_WiaItemList.Root(), Cookies );
GetRotationOfSelectedImages( m_WiaItemList.Root(), Rotation );
if (Rotation.Size() != Cookies.Size())
{
return 0;
}
return Cookies.Size();
}
bool CAcquisitionManagerControllerWindow::DeleteDownloadedImages( HANDLE hCancelDeleteEvent )
{
//
// Make sure we are not paused
//
m_EventPauseBackgroundThread.Signal();
CSimpleDynamicArray<DWORD> Cookies;
for (int i=0;i<m_DownloadedFileInformationList.Size();i++)
{
Cookies.Append(m_DownloadedFileInformationList[i].Cookie());
}
if (Cookies.Size())
{
CDeleteImagesThreadMessage *pDeleteImageThreadMessage = new CDeleteImagesThreadMessage(
m_hWnd,
Cookies,
hCancelDeleteEvent,
m_EventPauseBackgroundThread.Event(),
true
);
if (pDeleteImageThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pDeleteImageThreadMessage, CThreadMessageQueue::PriorityNormal );
}
else
{
WIA_TRACE((TEXT("Uh-oh! Couldn't allocate the thread message")));
return false;
}
}
else
{
WIA_TRACE((TEXT("Uh-oh! No selected items! Cookies.Size() = %d"), Cookies.Size()));
return false;
}
return true;
}
bool CAcquisitionManagerControllerWindow::DeleteSelectedImages(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::DeleteSelectedImages"));
CSimpleDynamicArray<DWORD> Cookies;
GetCookiesOfSelectedImages( m_WiaItemList.Root(), Cookies );
//
// Make sure we are not paused
//
m_EventPauseBackgroundThread.Signal();
if (Cookies.Size())
{
CDeleteImagesThreadMessage *pDeleteImageThreadMessage = new CDeleteImagesThreadMessage(
m_hWnd,
Cookies,
NULL,
m_EventPauseBackgroundThread.Event(),
false
);
if (pDeleteImageThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pDeleteImageThreadMessage, CThreadMessageQueue::PriorityNormal );
}
else
{
WIA_TRACE((TEXT("Uh-oh! Couldn't allocate the thread message")));
return false;
}
}
else
{
WIA_TRACE((TEXT("Uh-oh! No selected items! Cookies.Size() = %d"), Cookies.Size()));
return false;
}
return true;
}
bool CAcquisitionManagerControllerWindow::DownloadSelectedImages( HANDLE hCancelDownloadEvent )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::DownloadSelectedImages"));
CSimpleDynamicArray<DWORD> Cookies;
CSimpleDynamicArray<int> Rotation;
GetCookiesOfSelectedImages( m_WiaItemList.Root(), Cookies );
GetRotationOfSelectedImages( m_WiaItemList.Root(), Rotation );
//
// Make sure we are not paused
//
m_EventPauseBackgroundThread.Signal();
if (Cookies.Size() && Rotation.Size() == Cookies.Size())
{
CDownloadImagesThreadMessage *pDownloadImageThreadMessage = new CDownloadImagesThreadMessage(
m_hWnd,
Cookies,
Rotation,
m_szDestinationDirectory,
m_szRootFileName,
m_guidOutputFormat,
hCancelDownloadEvent,
m_bStampTimeOnSavedFiles,
m_EventPauseBackgroundThread.Event()
);
if (pDownloadImageThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pDownloadImageThreadMessage, CThreadMessageQueue::PriorityNormal );
}
else
{
WIA_TRACE((TEXT("Uh-oh! Couldn't allocate the thread message")));
return false;
}
}
else
{
WIA_TRACE((TEXT("Uh-oh! No selected items! Cookies.Size() = %d, Rotation.Size() = %d"), Cookies.Size(), Rotation.Size()));
return false;
}
return true;
}
bool CAcquisitionManagerControllerWindow::DirectoryExists( LPCTSTR pszDirectoryName )
{
// Try to determine if this directory exists
DWORD dwFileAttributes = GetFileAttributes(pszDirectoryName);
if (dwFileAttributes == 0xFFFFFFFF || !(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
return false;
else return true;
}
bool CAcquisitionManagerControllerWindow::RecursiveCreateDirectory( CSimpleString strDirectoryName )
{
// If this directory already exists, return true.
if (DirectoryExists(strDirectoryName))
return true;
// Otherwise try to create it.
CreateDirectory(strDirectoryName,NULL);
// If it now exists, return true
if (DirectoryExists(strDirectoryName))
return true;
else
{
// Remove the last subdir and try again
int nFind = strDirectoryName.ReverseFind(TEXT('\\'));
if (nFind >= 0)
{
RecursiveCreateDirectory( strDirectoryName.Left(nFind) );
// Now try to create it.
CreateDirectory(strDirectoryName,NULL);
}
}
//Does it exist now?
return DirectoryExists(strDirectoryName);
}
bool CAcquisitionManagerControllerWindow::IsCameraThumbnailDownloaded( const CWiaItem &WiaItem, LPARAM lParam )
{
CAcquisitionManagerControllerWindow *pControllerWindow = reinterpret_cast<CAcquisitionManagerControllerWindow*>(lParam);
if (pControllerWindow &&
(pControllerWindow->m_DeviceTypeMode==CameraMode || pControllerWindow->m_DeviceTypeMode==VideoMode) &&
WiaItem.IsDownloadableItemType() &&
!WiaItem.BitmapData())
{
return true;
}
else
{
return false;
}
}
int CAcquisitionManagerControllerWindow::GetCookies( CSimpleDynamicArray<DWORD> &Cookies, CWiaItem *pCurr, ComparisonCallbackFuntion pfnCallback, LPARAM lParam )
{
while (pCurr)
{
GetCookies(Cookies, pCurr->Children(), pfnCallback, lParam );
if (pfnCallback && pfnCallback(*pCurr,lParam))
{
Cookies.Append(pCurr->GlobalInterfaceTableCookie());
}
pCurr = pCurr->Next();
}
return Cookies.Size();
}
// Download all of the camera's thumbnails that haven't been downloaded yet
void CAcquisitionManagerControllerWindow::DownloadAllThumbnails()
{
//
// Get all of the images in the device
//
CSimpleDynamicArray<DWORD> Cookies;
GetCookies( Cookies, m_WiaItemList.Root(), IsCameraThumbnailDownloaded, reinterpret_cast<LPARAM>(this) );
if (Cookies.Size())
{
m_EventThumbnailCancel.Reset();
CDownloadThumbnailsThreadMessage *pDownloadThumbnailsThreadMessage = new CDownloadThumbnailsThreadMessage( m_hWnd, Cookies, m_EventThumbnailCancel.Event() );
if (pDownloadThumbnailsThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pDownloadThumbnailsThreadMessage, CThreadMessageQueue::PriorityNormal );
}
}
}
bool CAcquisitionManagerControllerWindow::PerformPreviewScan( CWiaItem *pWiaItem, HANDLE hCancelPreviewEvent )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::PerformPreviewScan"));
if (pWiaItem)
{
CPreviewScanThreadMessage *pPreviewScanThreadMessage = new CPreviewScanThreadMessage( m_hWnd, pWiaItem->GlobalInterfaceTableCookie(), hCancelPreviewEvent );
if (pPreviewScanThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pPreviewScanThreadMessage, CThreadMessageQueue::PriorityNormal );
return true;
}
}
return false;
}
void CAcquisitionManagerControllerWindow::DisplayDisconnectMessageAndExit(void)
{
//
// Make sure we are not doing this more than once
//
if (!m_bDisconnected)
{
//
// Don't do this again
//
m_bDisconnected = true;
//
// Close the shared memory section so another instance can start up
//
if (m_pEventParameters && m_pEventParameters->pWizardSharedMemory)
{
m_pEventParameters->pWizardSharedMemory->Close();
}
if (m_OnDisconnect & OnDisconnectFailDownload)
{
//
// Set an appropriate error message
//
m_hrDownloadResult = WIA_ERROR_OFFLINE;
m_strErrorMessage.LoadString( IDS_DEVICE_DISCONNECTED, g_hInstance );
}
if ((m_OnDisconnect & OnDisconnectGotoLastpage) && m_hWndWizard)
{
//
// Find any active dialogs and close them
//
HWND hWndLastActive = GetLastActivePopup(m_hWndWizard);
if (hWndLastActive && hWndLastActive != m_hWndWizard)
{
SendMessage( hWndLastActive, WM_CLOSE, 0, 0 );
}
//
// Go to the finish page
//
PropSheet_SetCurSelByID( m_hWndWizard, IDD_COMMON_FINISH );
}
}
}
void CAcquisitionManagerControllerWindow::SetMainWindowInSharedMemory( HWND hWnd )
{
//
// Try to grab the mutex
//
if (m_pEventParameters && m_pEventParameters->pWizardSharedMemory)
{
HWND *pHwnd = m_pEventParameters->pWizardSharedMemory->Lock();
if (pHwnd)
{
//
// Save the hWnd
//
*pHwnd = hWnd;
//
// Release the mutex
//
m_pEventParameters->pWizardSharedMemory->Release();
}
m_hWndWizard = hWnd;
}
}
bool CAcquisitionManagerControllerWindow::GetAllImageItems( CSimpleDynamicArray<CWiaItem*> &Items, CWiaItem *pCurr )
{
while (pCurr)
{
if (pCurr->IsDownloadableItemType())
{
Items.Append( pCurr );
}
GetAllImageItems( Items, pCurr->Children() );
pCurr = pCurr->Next();
}
return(Items.Size() != 0);
}
bool CAcquisitionManagerControllerWindow::GetAllImageItems( CSimpleDynamicArray<CWiaItem*> &Items )
{
return GetAllImageItems( Items, m_WiaItemList.Root() );
}
bool CAcquisitionManagerControllerWindow::CanSomeSelectedImagesBeDeleted(void)
{
CSimpleDynamicArray<CWiaItem*> Items;
GetSelectedItems( m_WiaItemList.Root(), Items );
//
// Since we get these access flags in the background, if we don't actually have any yet,
// we will assume some images CAN be deleted
//
bool bNoneAreInitialized = true;
for (int i=0;i<Items.Size();i++)
{
if (Items[i])
{
if (Items[i]->AccessRights())
{
// At least one of the selected images has been initialized
bNoneAreInitialized = false;
// If at least one can be deleted, return true immediately
if (Items[i]->AccessRights() & WIA_ITEM_CAN_BE_DELETED)
{
return true;
}
}
}
}
// If none of the images have been initialized, then we will report true
if (bNoneAreInitialized)
{
return true;
}
else
{
return false;
}
}
CWiaItem *CAcquisitionManagerControllerWindow::FindItemByName( LPCWSTR pwszItemName )
{
WIA_PUSH_FUNCTION((TEXT("CAcquisitionManagerControllerWindow::FindItemByName( %ws )"), pwszItemName ));
if (!pwszItemName)
return NULL;
if (!m_pWiaItemRoot)
return NULL;
return m_WiaItemList.Find(pwszItemName);
}
BOOL CAcquisitionManagerControllerWindow::ConfirmWizardCancel( HWND hWndParent )
{
//
// Always let it exit, for now.
//
return FALSE;
}
int CALLBACK CAcquisitionManagerControllerWindow::PropSheetCallback( HWND hWnd, UINT uMsg, LPARAM lParam )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::PropSheetCallback"));
if (PSCB_INITIALIZED == uMsg)
{
//
// Try to bring the window to the foreground.
//
SetForegroundWindow(hWnd);
}
return 0;
}
void CAcquisitionManagerControllerWindow::DetermineScannerType(void)
{
LONG nProps = ScannerProperties::GetDeviceProps( m_pWiaItemRoot );
m_nScannerType = ScannerTypeUnknown;
//
// Determine which scanner type we have, based on which properties the scanner has, as follows:
//
// HasFlatBed HasDocumentFeeder SupportsPreview SupportsPageSize
// 1 1 1 1 ScannerTypeFlatbedAdf
// 1 0 1 0 ScannerTypeFlatbed
// 0 1 1 1 ScannerTypeFlatbedAdf
// 0 1 0 0 ScannerTypeScrollFed
//
// otherwise it is ScannerTypeUnknown
//
const int nMaxControllingProps = 4;
static struct
{
LONG ControllingProps[nMaxControllingProps];
int nScannerType;
}
s_DialogResourceData[] =
{
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, NULL },
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, ScannerTypeFlatbedAdf },
{ ScannerProperties::HasFlatBed, 0, ScannerProperties::SupportsPreview, 0, ScannerTypeFlatbed },
{ 0, ScannerProperties::HasDocumentFeeder, ScannerProperties::SupportsPreview, ScannerProperties::SupportsPageSize, ScannerTypeFlatbedAdf },
{ 0, ScannerProperties::HasDocumentFeeder, 0, 0, ScannerTypeScrollFed },
{ 0, ScannerProperties::HasDocumentFeeder, 0, ScannerProperties::SupportsPageSize, ScannerTypeFlatbedAdf },
{ ScannerProperties::HasFlatBed, ScannerProperties::HasDocumentFeeder, 0, ScannerProperties::SupportsPageSize, ScannerTypeFlatbedAdf },
};
//
// Find the set of flags that match this device. If they match, use this scanner type.
// Loop through each type description.
//
for (int nCurrentResourceFlags=1;nCurrentResourceFlags<ARRAYSIZE(s_DialogResourceData) && (ScannerTypeUnknown == m_nScannerType);nCurrentResourceFlags++)
{
//
// Loop through each controlling property
//
for (int nControllingProp=0;nControllingProp<nMaxControllingProps;nControllingProp++)
{
//
// If this property DOESN'T match, break out prematurely
//
if ((nProps & s_DialogResourceData[0].ControllingProps[nControllingProp]) != s_DialogResourceData[nCurrentResourceFlags].ControllingProps[nControllingProp])
{
break;
}
}
//
// If the current controlling property is equal to the maximum controlling property,
// we had matches all the way through, so use this type
//
if (nControllingProp == nMaxControllingProps)
{
m_nScannerType = s_DialogResourceData[nCurrentResourceFlags].nScannerType;
}
}
}
CSimpleString CAcquisitionManagerControllerWindow::GetCurrentDate(void)
{
SYSTEMTIME SystemTime;
TCHAR szText[MAX_PATH] = TEXT("");
GetLocalTime( &SystemTime );
GetDateFormat( LOCALE_USER_DEFAULT, 0, &SystemTime, CSimpleString(IDS_DATEFORMAT,g_hInstance), szText, ARRAYSIZE(szText) );
return szText;
}
bool CAcquisitionManagerControllerWindow::SuppressFirstPage(void)
{
return m_bSuppressFirstPage;
}
bool CAcquisitionManagerControllerWindow::IsSerialCamera(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::IsSerialCamera"));
//
// Only check for serial devices if we are a camera
//
if (m_DeviceTypeMode==CameraMode)
{
#if defined(WIA_DIP_HW_CONFIG)
//
// Get the hardware configuration information
//
LONG nHardwareConfig = 0;
if (PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DIP_HW_CONFIG, nHardwareConfig ))
{
//
// If this is a serial device, return true
//
if (nHardwareConfig & STI_HW_CONFIG_SERIAL)
{
return true;
}
}
#else
CSimpleStringWide strwPortName;
if (PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DIP_PORT_NAME, strwPortName ))
{
//
// Compare the leftmost 3 characters to the word COM (as in COM1, COM2, ... )
//
if (strwPortName.Left(3).CompareNoCase(CSimpleStringWide(L"COM"))==0)
{
WIA_TRACE((TEXT("A comparison of %ws and COM succeeded"), strwPortName.Left(3).String() ));
return true;
}
//
// Compare the portname to the word AUTO
//
else if (strwPortName.CompareNoCase(CSimpleStringWide(L"AUTO"))==0)
{
WIA_TRACE((TEXT("A comparison of %ws and AUTO succeeded"), strwPortName.String() ));
return true;
}
}
#endif
}
//
// Not a serial camera
//
return false;
}
HRESULT CAcquisitionManagerControllerWindow::CreateAndExecuteWizard(void)
{
//
// Structure used to setup our data-driven property sheet factory
//
enum CPageType
{
NormalPage = 0,
FirstPage = 1,
LastPage = 2
};
struct CPropertyPageInfo
{
LPCTSTR pszTemplate;
DLGPROC pfnDlgProc;
int nIdTitle;
int nIdSubTitle;
TCHAR szTitle[256];
TCHAR szSubTitle[1024];
CPageType PageType;
bool *pbDisplay;
int *pnPageIndex;
};
//
// Maximum number of statically created wizard pages
//
const int c_nMaxWizardPages = 7;
HRESULT hr = S_OK;
//
// Register common controls
//
INITCOMMONCONTROLSEX icce;
icce.dwSize = sizeof(icce);
icce.dwICC = ICC_WIN95_CLASSES | ICC_LISTVIEW_CLASSES | ICC_USEREX_CLASSES | ICC_PROGRESS_CLASS | ICC_LINK_CLASS;
InitCommonControlsEx( &icce );
//
// Register custom window classes
//
CWiaTextControl::RegisterClass( g_hInstance );
RegisterWiaPreviewClasses( g_hInstance );
//
// These are the pages we'll use for the scanner wizard, if it doesn't have an ADF
//
CPropertyPageInfo ScannerPropSheetPageInfo[] =
{
{ MAKEINTRESOURCE(IDD_SCANNER_FIRST), CCommonFirstPage::DialogProc, 0, 0, TEXT(""), TEXT(""), FirstPage, NULL, NULL },
{ MAKEINTRESOURCE(IDD_SCANNER_SELECT), CScannerSelectionPage::DialogProc, IDS_SCANNER_SELECT_TITLE, IDS_SCANNER_SELECT_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nSelectionPageIndex },
{ MAKEINTRESOURCE(IDD_SCANNER_TRANSFER), CCommonTransferPage::DialogProc, IDS_SCANNER_TRANSFER_TITLE, IDS_SCANNER_TRANSFER_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDestinationPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_PROGRESS), CCommonProgressPage::DialogProc, IDS_SCANNER_PROGRESS_TITLE, IDS_SCANNER_PROGRESS_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nProgressPageIndex },
{ MAKEINTRESOURCE(IDD_UPLOAD_QUERY), CCommonUploadQueryPage::DialogProc, IDS_COMMON_UPLOAD_TITLE, IDS_COMMON_UPLOAD_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nUploadQueryPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_DELETE), CCommonDeleteProgressPage::DialogProc, IDS_COMMON_DELETE_TITLE, IDS_COMMON_DELETE_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDeleteProgressPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_FINISH), CCommonFinishPage::DialogProc, 0, 0, TEXT(""), TEXT(""), LastPage, NULL, &m_nFinishPageIndex }
};
//
// These are the pages we'll use for the scanner wizard, if it is a scroll-fed scanner
//
CPropertyPageInfo ScannerScrollFedPropSheetPageInfo[] =
{
{ MAKEINTRESOURCE(IDD_SCANNER_FIRST), CCommonFirstPage::DialogProc, 0, 0, TEXT(""), TEXT(""), FirstPage, NULL, NULL },
{ MAKEINTRESOURCE(IDD_SCANNER_SELECT), CScannerSelectionPage::DialogProc, IDS_SCROLLFED_SELECT_TITLE, IDS_SCROLLFED_SELECT_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nSelectionPageIndex },
{ MAKEINTRESOURCE(IDD_SCANNER_TRANSFER), CCommonTransferPage::DialogProc, IDS_SCANNER_TRANSFER_TITLE, IDS_SCANNER_TRANSFER_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDestinationPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_PROGRESS), CCommonProgressPage::DialogProc, IDS_SCANNER_PROGRESS_TITLE, IDS_SCANNER_PROGRESS_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nProgressPageIndex },
{ MAKEINTRESOURCE(IDD_UPLOAD_QUERY), CCommonUploadQueryPage::DialogProc, IDS_COMMON_UPLOAD_TITLE, IDS_COMMON_UPLOAD_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nUploadQueryPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_DELETE), CCommonDeleteProgressPage::DialogProc, IDS_COMMON_DELETE_TITLE, IDS_COMMON_DELETE_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDeleteProgressPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_FINISH), CCommonFinishPage::DialogProc, 0, 0, TEXT(""), TEXT(""), LastPage, NULL, &m_nFinishPageIndex }
};
//
// These are the pages we'll use for the scanner wizard, if it does have an ADF
//
CPropertyPageInfo ScannerADFPropSheetPageInfo[] =
{
{ MAKEINTRESOURCE(IDD_SCANNER_FIRST), CCommonFirstPage::DialogProc, 0, 0, TEXT(""), TEXT(""), FirstPage, NULL, NULL },
{ MAKEINTRESOURCE(IDD_SCANNER_ADF_SELECT), CScannerSelectionPage::DialogProc, IDS_SCANNER_SELECT_TITLE, IDS_SCANNER_SELECT_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nSelectionPageIndex },
{ MAKEINTRESOURCE(IDD_SCANNER_TRANSFER), CCommonTransferPage::DialogProc, IDS_SCANNER_TRANSFER_TITLE, IDS_SCANNER_TRANSFER_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDestinationPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_PROGRESS), CCommonProgressPage::DialogProc, IDS_SCANNER_PROGRESS_TITLE, IDS_SCANNER_PROGRESS_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nProgressPageIndex },
{ MAKEINTRESOURCE(IDD_UPLOAD_QUERY), CCommonUploadQueryPage::DialogProc, IDS_COMMON_UPLOAD_TITLE, IDS_COMMON_UPLOAD_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nUploadQueryPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_DELETE), CCommonDeleteProgressPage::DialogProc, IDS_COMMON_DELETE_TITLE, IDS_COMMON_DELETE_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDeleteProgressPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_FINISH), CCommonFinishPage::DialogProc, 0, 0, TEXT(""), TEXT(""), LastPage, NULL, &m_nFinishPageIndex }
};
//
// These are the pages we'll use for the camera wizard
//
CPropertyPageInfo CameraPropSheetPageInfo[] =
{
{ MAKEINTRESOURCE(IDD_CAMERA_FIRST), CCommonFirstPage::DialogProc, 0, 0, TEXT(""), TEXT(""), FirstPage, NULL, NULL },
{ MAKEINTRESOURCE(IDD_CAMERA_SELECT), CCameraSelectionPage::DialogProc, IDS_CAMERA_SELECT_TITLE, IDS_CAMERA_SELECT_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nSelectionPageIndex },
{ MAKEINTRESOURCE(IDD_CAMERA_TRANSFER), CCommonTransferPage::DialogProc, IDS_CAMERA_TRANSFER_TITLE, IDS_CAMERA_TRANSFER_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDestinationPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_PROGRESS), CCommonProgressPage::DialogProc, IDS_CAMERA_PROGRESS_TITLE, IDS_CAMERA_PROGRESS_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nProgressPageIndex },
{ MAKEINTRESOURCE(IDD_UPLOAD_QUERY), CCommonUploadQueryPage::DialogProc, IDS_COMMON_UPLOAD_TITLE, IDS_COMMON_UPLOAD_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nUploadQueryPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_DELETE), CCommonDeleteProgressPage::DialogProc, IDS_COMMON_DELETE_TITLE, IDS_COMMON_DELETE_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDeleteProgressPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_FINISH), CCommonFinishPage::DialogProc, 0, 0, TEXT(""), TEXT(""), LastPage, NULL, &m_nFinishPageIndex }
};
//
// These are the pages we'll use for the video wizard
//
CPropertyPageInfo VideoPropSheetPageInfo[] =
{
{ MAKEINTRESOURCE(IDD_VIDEO_FIRST), CCommonFirstPage::DialogProc, 0, 0, TEXT(""), TEXT(""), FirstPage, NULL, NULL },
{ MAKEINTRESOURCE(IDD_VIDEO_SELECT), CCameraSelectionPage::DialogProc, IDS_VIDEO_SELECT_TITLE, IDS_VIDEO_SELECT_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nSelectionPageIndex },
{ MAKEINTRESOURCE(IDD_CAMERA_TRANSFER), CCommonTransferPage::DialogProc, IDS_CAMERA_TRANSFER_TITLE, IDS_CAMERA_TRANSFER_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDestinationPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_PROGRESS), CCommonProgressPage::DialogProc, IDS_CAMERA_PROGRESS_TITLE, IDS_CAMERA_PROGRESS_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nProgressPageIndex },
{ MAKEINTRESOURCE(IDD_UPLOAD_QUERY), CCommonUploadQueryPage::DialogProc, IDS_COMMON_UPLOAD_TITLE, IDS_COMMON_UPLOAD_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nUploadQueryPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_DELETE), CCommonDeleteProgressPage::DialogProc, IDS_COMMON_DELETE_TITLE, IDS_COMMON_DELETE_SUBTITLE, TEXT(""), TEXT(""), NormalPage, NULL, &m_nDeleteProgressPageIndex },
{ MAKEINTRESOURCE(IDD_COMMON_FINISH), CCommonFinishPage::DialogProc, 0, 0, TEXT(""), TEXT(""), LastPage, NULL, &m_nFinishPageIndex }
};
//
// Initialize all of these variables, which differ depending on which type of device we are loading
//
LPTSTR pszbmWatermark = NULL;
LPTSTR pszbmHeader = NULL;
CPropertyPageInfo *pPropSheetPageInfo = NULL;
int nPropPageCount = 0;
int nWizardIconId = 0;
CSimpleString strDownloadManagerTitle = TEXT("");
//
// Decide which pages to use.
//
switch (m_DeviceTypeMode)
{
case CameraMode:
pszbmWatermark = MAKEINTRESOURCE(IDB_CAMERA_WATERMARK);
pszbmHeader = MAKEINTRESOURCE(IDB_CAMERA_HEADER);
pPropSheetPageInfo = CameraPropSheetPageInfo;
nPropPageCount = ARRAYSIZE(CameraPropSheetPageInfo);
strDownloadManagerTitle.LoadString( IDS_DOWNLOAD_MANAGER_TITLE, g_hInstance );
nWizardIconId = IDI_CAMERA_WIZARD;
break;
case VideoMode:
pszbmWatermark = MAKEINTRESOURCE(IDB_VIDEO_WATERMARK);
pszbmHeader = MAKEINTRESOURCE(IDB_VIDEO_HEADER);
pPropSheetPageInfo = VideoPropSheetPageInfo;
nPropPageCount = ARRAYSIZE(VideoPropSheetPageInfo);
strDownloadManagerTitle.LoadString( IDS_DOWNLOAD_MANAGER_TITLE, g_hInstance );
nWizardIconId = IDI_VIDEO_WIZARD;
break;
case ScannerMode:
DetermineScannerType();
pszbmWatermark = MAKEINTRESOURCE(IDB_SCANNER_WATERMARK);
pszbmHeader = MAKEINTRESOURCE(IDB_SCANNER_HEADER);
strDownloadManagerTitle.LoadString( IDS_DOWNLOAD_MANAGER_TITLE, g_hInstance );
nWizardIconId = IDI_SCANNER_WIZARD;
if (m_nScannerType == ScannerTypeFlatbedAdf)
{
pPropSheetPageInfo = ScannerADFPropSheetPageInfo;
nPropPageCount = ARRAYSIZE(ScannerADFPropSheetPageInfo);
}
else if (m_nScannerType == ScannerTypeFlatbed)
{
pPropSheetPageInfo = ScannerPropSheetPageInfo;
nPropPageCount = ARRAYSIZE(ScannerPropSheetPageInfo);
}
else if (m_nScannerType == ScannerTypeScrollFed)
{
pPropSheetPageInfo = ScannerScrollFedPropSheetPageInfo;
nPropPageCount = ARRAYSIZE(ScannerScrollFedPropSheetPageInfo);
}
else
{
//
// Unknown scanner type
//
}
break;
default:
return E_INVALIDARG;
}
HICON hIconSmall=NULL, hIconBig=NULL;
if (!SUCCEEDED(WiaUiExtensionHelper::GetDeviceIcons( CSimpleBStr(m_strwDeviceUiClassId), m_nDeviceType, &hIconSmall, &hIconBig )))
{
//
// Load the icons. They will be set using WM_SETICON in the first pages.
//
hIconSmall = reinterpret_cast<HICON>(LoadImage( g_hInstance, MAKEINTRESOURCE(nWizardIconId), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR ));
hIconBig = reinterpret_cast<HICON>(LoadImage( g_hInstance, MAKEINTRESOURCE(nWizardIconId), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR ));
}
//
// Make copies of these icons to work around NTBUG 351806
//
if (hIconSmall)
{
m_hWizardIconSmall = CopyIcon(hIconSmall);
DestroyIcon(hIconSmall);
}
if (hIconBig)
{
m_hWizardIconBig = CopyIcon(hIconBig);
DestroyIcon(hIconBig);
}
//
// Make sure we have a valid set of data
//
if (pszbmWatermark && pszbmHeader && pPropSheetPageInfo && nPropPageCount)
{
const int c_MaxPageCount = 20;
HPROPSHEETPAGE PropSheetPages[c_MaxPageCount] = {0};
//
// We might not be adding all of the pages.
//
int nTotalPageCount = 0;
for (int nCurrPage=0;nCurrPage<nPropPageCount && nCurrPage<c_MaxPageCount;nCurrPage++)
{
//
// Only add the page if the controlling pbDisplay variable is NULL or points to a non-FALSE value
//
if (!pPropSheetPageInfo[nCurrPage].pbDisplay || *(pPropSheetPageInfo[nCurrPage].pbDisplay))
{
PROPSHEETPAGE CurrentPropSheetPage = {0};
//
// Set up all of the required fields from out static info.
//
CurrentPropSheetPage.dwSize = sizeof(PROPSHEETPAGE);
CurrentPropSheetPage.hInstance = g_hInstance;
CurrentPropSheetPage.lParam = reinterpret_cast<LPARAM>(this);
CurrentPropSheetPage.pfnDlgProc = pPropSheetPageInfo[nCurrPage].pfnDlgProc;
CurrentPropSheetPage.pszTemplate = pPropSheetPageInfo[nCurrPage].pszTemplate;
CurrentPropSheetPage.pszTitle = strDownloadManagerTitle.String();
CurrentPropSheetPage.dwFlags = PSP_DEFAULT;
//
// Add in the fusion flags to get COMCTLV6
//
WiaUiUtil::PreparePropertyPageForFusion( &CurrentPropSheetPage );
//
// If we want to save the index of this page, save it
//
if (pPropSheetPageInfo[nTotalPageCount].pnPageIndex)
{
*(pPropSheetPageInfo[nTotalPageCount].pnPageIndex) = nTotalPageCount;
}
if (FirstPage == pPropSheetPageInfo[nCurrPage].PageType)
{
//
// No title or subtitle needed for "first pages"
//
CurrentPropSheetPage.dwFlags |= PSP_PREMATURE | PSP_HIDEHEADER | PSP_USETITLE;
}
else if (LastPage == pPropSheetPageInfo[nCurrPage].PageType)
{
//
// No title or subtitle needed for "last pages"
//
CurrentPropSheetPage.dwFlags |= PSP_HIDEHEADER | PSP_USETITLE;
}
else
{
//
// Add header and subtitle
//
CurrentPropSheetPage.dwFlags |= PSP_PREMATURE | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE | PSP_USETITLE;
//
// Load the header and subtitle
//
LoadString( g_hInstance, pPropSheetPageInfo[nCurrPage].nIdTitle, pPropSheetPageInfo[nCurrPage].szTitle, ARRAYSIZE(pPropSheetPageInfo[nCurrPage].szTitle) );
LoadString( g_hInstance, pPropSheetPageInfo[nCurrPage].nIdSubTitle, pPropSheetPageInfo[nCurrPage].szSubTitle, ARRAYSIZE(pPropSheetPageInfo[nCurrPage].szSubTitle) );
//
// Assign the title and subtitle strings
//
CurrentPropSheetPage.pszHeaderTitle = pPropSheetPageInfo[nCurrPage].szTitle;
CurrentPropSheetPage.pszHeaderSubTitle = pPropSheetPageInfo[nCurrPage].szSubTitle;
}
//
// Create and add one more page
//
HPROPSHEETPAGE hPropSheetPage = CreatePropertySheetPage(&CurrentPropSheetPage);
if (!hPropSheetPage)
{
WIA_PRINTHRESULT((HRESULT_FROM_WIN32(GetLastError()),TEXT("CreatePropertySheetPage failed on page %d"), nCurrPage ));
return E_FAIL;
}
PropSheetPages[nTotalPageCount++] = hPropSheetPage;
}
}
//
// Save the count of our pages
//
m_nWiaWizardPageCount = nTotalPageCount;
//
// Create the property sheet header
//
PROPSHEETHEADER PropSheetHeader = {0};
PropSheetHeader.hwndParent = NULL;
PropSheetHeader.dwSize = sizeof(PROPSHEETHEADER);
PropSheetHeader.dwFlags = PSH_NOAPPLYNOW | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_USECALLBACK;
PropSheetHeader.pszbmWatermark = pszbmWatermark;
PropSheetHeader.pszbmHeader = pszbmHeader;
PropSheetHeader.hInstance = g_hInstance;
PropSheetHeader.nPages = m_nWiaWizardPageCount;
PropSheetHeader.phpage = PropSheetPages;
PropSheetHeader.pfnCallback = PropSheetCallback;
PropSheetHeader.nStartPage = SuppressFirstPage() ? 1 : 0;
//
// Display the property sheet
//
INT_PTR nResult = PropertySheet( &PropSheetHeader );
//
// Check for an error
//
if (nResult == -1)
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
}
else
{
//
// Generic failure will have to do
//
hr = E_FAIL;
//
// Dismiss the wait dialog before we display the message box
//
if (m_pWiaProgressDialog)
{
m_pWiaProgressDialog->Destroy();
m_pWiaProgressDialog = NULL;
}
//
// Display an error message telling the user this is not a supported device
//
CMessageBoxEx::MessageBox( m_hWnd, CSimpleString(IDS_UNSUPPORTED_DEVICE,g_hInstance), CSimpleString(IDS_ERROR_TITLE,g_hInstance), CMessageBoxEx::MBEX_ICONWARNING );
WIA_ERROR((TEXT("Unknown device type")));
}
//
// Make sure the status dialog has been dismissed by now
//
if (m_pWiaProgressDialog)
{
m_pWiaProgressDialog->Destroy();
m_pWiaProgressDialog = NULL;
}
return hr;
}
bool CAcquisitionManagerControllerWindow::EnumItemsCallback( CWiaItemList::CEnumEvent EnumEvent, UINT nData, LPARAM lParam, bool bForceUpdate )
{
//
// We would return false to cancel enumeration
//
bool bResult = true;
//
// Get the instance of the controller window
//
CAcquisitionManagerControllerWindow *pThis = reinterpret_cast<CAcquisitionManagerControllerWindow*>(lParam);
if (pThis)
{
//
// Which event are we being called for?
//
switch (EnumEvent)
{
case CWiaItemList::ReadingItemInfo:
//
// This is the event that is sent while the tree is being built
//
if (pThis->m_pWiaProgressDialog && pThis->m_bUpdateEnumerationCount && nData)
{
//
// We don't want to update the status text any more often than this (minimizes flicker)
//
const DWORD dwMinDelta = 200;
//
// Get the current tick count and see if it has been more than dwMinDelta milliseconds since our last update
//
DWORD dwCurrentTickCount = GetTickCount();
if (bForceUpdate || dwCurrentTickCount - pThis->m_dwLastEnumerationTickCount >= dwMinDelta)
{
//
// Assume we haven't been cancelled
//
BOOL bCancelled = FALSE;
//
// Set the progress message
//
pThis->m_pWiaProgressDialog->SetMessage( CSimpleStringWide().Format( IDS_ENUMERATIONCOUNT, g_hInstance, nData ) );
//
// Find out if we've been cancelled
//
pThis->m_pWiaProgressDialog->Cancelled(&bCancelled);
//
// If we have been cancelled, we'll return false to stop the enumeration
//
if (bCancelled)
{
bResult = false;
}
//
// Save the current tick count for next time
//
pThis->m_dwLastEnumerationTickCount = dwCurrentTickCount;
}
}
break;
}
}
return bResult;
}
LRESULT CAcquisitionManagerControllerWindow::OnPostInitialize( WPARAM, LPARAM )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::OnInitialize"));
//
// Try to get the correct animation for this device type. If we can't get the type,
// just use the camera animation. If there is a real error, it will get handled later
//
int nAnimationType = WIA_PROGRESSDLG_ANIM_CAMERA_COMMUNICATE;
LONG nAnimationDeviceType = 0;
//
// We don't want to update our enumeration count in the progress dialog for scanners, but we do for cameras
//
m_bUpdateEnumerationCount = true;
if (SUCCEEDED(WiaUiUtil::GetDeviceTypeFromId( CSimpleBStr(m_pEventParameters->strDeviceID), &nAnimationDeviceType )))
{
if (StiDeviceTypeScanner == GET_STIDEVICE_TYPE(nAnimationDeviceType))
{
nAnimationType = WIA_PROGRESSDLG_ANIM_SCANNER_COMMUNICATE;
m_bUpdateEnumerationCount = false;
}
else if (StiDeviceTypeStreamingVideo == GET_STIDEVICE_TYPE(nAnimationDeviceType))
{
nAnimationType = WIA_PROGRESSDLG_ANIM_VIDEO_COMMUNICATE;
}
}
//
// Put up a wait dialog
//
HRESULT hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaProgressDialog, (void**)&m_pWiaProgressDialog );
if (SUCCEEDED(hr))
{
m_pWiaProgressDialog->Create( m_hWnd, nAnimationType|WIA_PROGRESSDLG_NO_PROGRESS );
m_pWiaProgressDialog->SetTitle( CSimpleStringConvert::WideString(CSimpleString(IDS_DOWNLOADMANAGER_NAME,g_hInstance)));
m_pWiaProgressDialog->SetMessage( CSimpleStringConvert::WideString(CSimpleString(IDS_PROGDLG_MESSAGE,g_hInstance)));
//
// Show the progress dialog
//
m_pWiaProgressDialog->Show();
//
// Create the global interface table
//
hr = CoCreateInstance( CLSID_StdGlobalInterfaceTable, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (VOID**)&m_pGlobalInterfaceTable );
if (SUCCEEDED(hr))
{
//
// Create the device
//
hr = WIA_FORCE_ERROR(FE_WIAACMGR,100,CreateDevice());
if (SUCCEEDED(hr))
{
//
// Save a debug snapshot, if the entry is in the registry
//
WIA_SAVEITEMTREELOG(HKEY_CURRENT_USER,REGSTR_PATH_USER_SETTINGS_WIAACMGR,TEXT("CreateDeviceTreeSnapshot"),true,m_pWiaItemRoot);
//
// First, figure out what kind of device it is and get the UI class ID
//
if (PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DIP_DEV_TYPE, m_nDeviceType ) &&
PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DIP_UI_CLSID, m_strwDeviceUiClassId ))
{
switch (GET_STIDEVICE_TYPE(m_nDeviceType))
{
case StiDeviceTypeScanner:
m_DeviceTypeMode = ScannerMode;
break;
case StiDeviceTypeDigitalCamera:
m_DeviceTypeMode = CameraMode;
break;
case StiDeviceTypeStreamingVideo:
m_DeviceTypeMode = VideoMode;
break;
default:
m_DeviceTypeMode = UnknownMode;
hr = E_FAIL;
break;
}
}
else
{
hr = E_FAIL;
WIA_ERROR((TEXT("Unable to read the device type")));
}
if (SUCCEEDED(hr))
{
//
// Get the device name
//
PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DIP_DEV_NAME, m_strwDeviceName );
//
// Find out if Take Picture is supported
//
m_bTakePictureIsSupported = WiaUiUtil::IsDeviceCommandSupported( m_pWiaItemRoot, WIA_CMD_TAKE_PICTURE );
//
// Enumerate all the items in the device tree
//
hr = m_WiaItemList.EnumerateAllWiaItems(m_pWiaItemRoot,EnumItemsCallback,reinterpret_cast<LPARAM>(this));
if (S_OK == hr)
{
if (ScannerMode == m_DeviceTypeMode)
{
//
// Mark only one scanner item as selected, and save it as the current scanner item
//
MarkAllItemsUnselected( m_WiaItemList.Root() );
CSimpleDynamicArray<CWiaItem*> Items;
GetAllImageItems( Items, m_WiaItemList.Root() );
if (Items.Size() && Items[0])
{
m_pCurrentScannerItem = Items[0];
MarkItemSelected(Items[0],m_WiaItemList.Root());
//
// Make sure we have all of the properties we need to construct the device
//
hr = WiaUiUtil::VerifyScannerProperties(Items[0]->WiaItem());
}
else
{
hr = E_FAIL;
WIA_ERROR((TEXT("There don't seem to be any transfer items on this scanner")));
}
}
else if (VideoMode == m_DeviceTypeMode || CameraMode == m_DeviceTypeMode)
{
//
// Get the thumbnail width
//
LONG nWidth, nHeight;
if (PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DPC_THUMB_WIDTH, nWidth ) &&
PropStorageHelpers::GetProperty( m_pWiaItemRoot, WIA_DPC_THUMB_HEIGHT, nHeight ))
{
int nMax = max(nWidth,nHeight); // Allow for rotation
m_sizeThumbnails.cx = max(c_nMinThumbnailWidth,min(nMax,c_nMaxThumbnailWidth));
m_sizeThumbnails.cy = max(c_nMinThumbnailHeight,min(nMax,c_nMaxThumbnailHeight));
}
}
}
}
}
}
}
if (!SUCCEEDED(hr))
{
//
// Dismiss the wait dialog
//
if (m_pWiaProgressDialog)
{
m_pWiaProgressDialog->Destroy();
m_pWiaProgressDialog = NULL;
}
//
// Choose an appropriate error message if we have a recognizable error.
//
CSimpleString strMessage;
int nIconId = 0;
switch (hr)
{
case WIA_ERROR_BUSY:
strMessage.LoadString( IDS_DEVICE_BUSY, g_hInstance );
nIconId = MB_ICONINFORMATION;
break;
case WIA_S_NO_DEVICE_AVAILABLE:
strMessage.LoadString( IDS_DEVICE_NOT_FOUND, g_hInstance );
nIconId = MB_ICONINFORMATION;
break;
case HRESULT_FROM_WIN32(ERROR_SERVICE_DISABLED):
strMessage = WiaUiUtil::GetErrorTextFromHResult(HRESULT_FROM_WIN32(ERROR_SERVICE_DISABLED));
nIconId = MB_ICONINFORMATION;
break;
default:
strMessage.LoadString( IDS_UNABLETOCREATE, g_hInstance );
nIconId = MB_ICONINFORMATION;
break;
}
//
// Tell the user we had a problem creating the device
//
MessageBox( m_hWnd, strMessage, CSimpleString( IDS_DOWNLOAD_MANAGER_TITLE, g_hInstance ), nIconId );
}
else if (S_OK == hr)
{
hr = CreateAndExecuteWizard();
}
//
// If we were cancelled, shut down the progress UI
//
else if (m_pWiaProgressDialog)
{
m_pWiaProgressDialog->Destroy();
m_pWiaProgressDialog = NULL;
}
//
// Make sure we kill this window, and thus, this thread.
//
PostMessage( m_hWnd, WM_CLOSE, 0, 0 );
return 0;
}
LRESULT CAcquisitionManagerControllerWindow::OnCreate( WPARAM, LPARAM lParam )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::OnCreate"));
//
// Ensure the background thread was started
//
if (!m_hBackgroundThread || !m_pThreadMessageQueue)
{
WIA_ERROR((TEXT("There was an error starting the background thread")));
return -1;
}
//
// Make sure we got a valid lParam
//
LPCREATESTRUCT pCreateStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
if (!pCreateStruct)
{
WIA_ERROR((TEXT("pCreateStruct was NULL")));
return -1;
}
//
// Get the event parameters
//
m_pEventParameters = reinterpret_cast<CEventParameters*>(pCreateStruct->lpCreateParams);
if (!m_pEventParameters)
{
WIA_ERROR((TEXT("m_pEventParameters was NULL")));
return -1;
}
SetForegroundWindow(m_hWnd);
//
// Center ourselves on the parent window
//
WiaUiUtil::CenterWindow( m_hWnd, m_pEventParameters->hwndParent );
PostMessage( m_hWnd, PWM_POSTINITIALIZE, 0, 0 );
return 0;
}
void CAcquisitionManagerControllerWindow::OnNotifyDownloadImage( UINT nMsg, CThreadNotificationMessage *pThreadNotificationMessage )
{
CDownloadImagesThreadNotifyMessage *pDownloadImageThreadNotifyMessage = dynamic_cast<CDownloadImagesThreadNotifyMessage*>(pThreadNotificationMessage);
if (pDownloadImageThreadNotifyMessage)
{
switch (pDownloadImageThreadNotifyMessage->Status())
{
case CDownloadImagesThreadNotifyMessage::End:
{
switch (pDownloadImageThreadNotifyMessage->Operation())
{
case CDownloadImagesThreadNotifyMessage::DownloadImage:
{
if (S_OK != pDownloadImageThreadNotifyMessage->hr())
{
m_nFailedImagesCount++;
}
}
break;
case CDownloadImagesThreadNotifyMessage::DownloadAll:
{
if (S_OK == pDownloadImageThreadNotifyMessage->hr())
{
m_DownloadedFileInformationList = pDownloadImageThreadNotifyMessage->DownloadedFileInformation();
}
else
{
m_DownloadedFileInformationList.Destroy();
}
}
break;
}
}
break;
case CDownloadImagesThreadNotifyMessage::Begin:
{
switch (pDownloadImageThreadNotifyMessage->Operation())
{
case CDownloadImagesThreadNotifyMessage::DownloadAll:
{
m_nFailedImagesCount = 0;
}
break;
}
}
break;
}
}
}
void CAcquisitionManagerControllerWindow::OnNotifyDownloadThumbnail( UINT nMsg, CThreadNotificationMessage *pThreadNotificationMessage )
{
WIA_PUSH_FUNCTION((TEXT("CAcquisitionManagerControllerWindow::OnNotifyDownloadThumbnail( %d, %p )"), nMsg, pThreadNotificationMessage ));
CDownloadThumbnailsThreadNotifyMessage *pDownloadThumbnailsThreadNotifyMessage= dynamic_cast<CDownloadThumbnailsThreadNotifyMessage*>(pThreadNotificationMessage);
if (pDownloadThumbnailsThreadNotifyMessage)
{
switch (pDownloadThumbnailsThreadNotifyMessage->Status())
{
case CDownloadThumbnailsThreadNotifyMessage::Begin:
{
}
break;
case CDownloadThumbnailsThreadNotifyMessage::Update:
{
}
break;
case CDownloadThumbnailsThreadNotifyMessage::End:
{
switch (pDownloadThumbnailsThreadNotifyMessage->Operation())
{
case CDownloadThumbnailsThreadNotifyMessage::DownloadThumbnail:
{
WIA_TRACE((TEXT("Handling CDownloadThumbnailsThreadNotifyMessage::DownloadThumbnail")));
//
// Find the item in the list
//
CWiaItem *pWiaItem = m_WiaItemList.Find( pDownloadThumbnailsThreadNotifyMessage->Cookie() );
if (pWiaItem)
{
//
// Set the flag that indicates we've tried this image already
//
pWiaItem->AttemptedThumbnailDownload(true);
//
// Make sure we have valid thumbnail data
//
if (pDownloadThumbnailsThreadNotifyMessage->BitmapData())
{
//
// Don't replace existing thumbnail data
//
if (!pWiaItem->BitmapData())
{
//
// Set the item's thumbnail data. Take ownership of the thumbnail data
//
WIA_TRACE((TEXT("Found the thumbnail for the item with the GIT cookie %08X"), pDownloadThumbnailsThreadNotifyMessage->Cookie() ));
pWiaItem->BitmapData(pDownloadThumbnailsThreadNotifyMessage->DetachBitmapData());
pWiaItem->Width(pDownloadThumbnailsThreadNotifyMessage->Width());
pWiaItem->Height(pDownloadThumbnailsThreadNotifyMessage->Height());
pWiaItem->BitmapDataLength(pDownloadThumbnailsThreadNotifyMessage->BitmapDataLength());
pWiaItem->ImageWidth(pDownloadThumbnailsThreadNotifyMessage->PictureWidth());
pWiaItem->ImageHeight(pDownloadThumbnailsThreadNotifyMessage->PictureHeight());
pWiaItem->AnnotationType(pDownloadThumbnailsThreadNotifyMessage->AnnotationType());
pWiaItem->DefExt(pDownloadThumbnailsThreadNotifyMessage->DefExt());
}
else
{
WIA_TRACE((TEXT("Already got the image data for item %08X!"), pDownloadThumbnailsThreadNotifyMessage->Cookie()));
}
}
else
{
WIA_ERROR((TEXT("pDownloadThumbnailsThreadNotifyMessage->BitmapData was NULL!")));
}
//
// Assign the default format
//
pWiaItem->DefaultFormat(pDownloadThumbnailsThreadNotifyMessage->DefaultFormat());
//
// Assign the access flags
//
pWiaItem->AccessRights(pDownloadThumbnailsThreadNotifyMessage->AccessRights());
//
// Make sure we discard rotation angles if rotation is not possible
//
pWiaItem->DiscardRotationIfNecessary();
}
else
{
WIA_ERROR((TEXT("Can't find %08X in the item list"), pDownloadThumbnailsThreadNotifyMessage->Cookie() ));
}
}
break;
}
}
break;
}
}
}
LRESULT CAcquisitionManagerControllerWindow::OnThreadNotification( WPARAM wParam, LPARAM lParam )
{
WIA_PUSH_FUNCTION((TEXT("CAcquisitionManagerControllerWindow::OnThreadNotification( %d, %08X )"), wParam, lParam ));
CThreadNotificationMessage *pThreadNotificationMessage = reinterpret_cast<CThreadNotificationMessage*>(lParam);
if (pThreadNotificationMessage)
{
switch (pThreadNotificationMessage->Message())
{
case TQ_DOWNLOADTHUMBNAIL:
OnNotifyDownloadThumbnail( static_cast<UINT>(wParam), pThreadNotificationMessage );
break;
case TQ_DOWNLOADIMAGE:
OnNotifyDownloadImage( static_cast<UINT>(wParam), pThreadNotificationMessage );
break;
}
//
// Notify all the registered windows
//
m_WindowList.SendMessage( m_nThreadNotificationMessage, wParam, lParam );
//
// Free the message structure
//
delete pThreadNotificationMessage;
}
return HANDLED_THREAD_MESSAGE;
}
void CAcquisitionManagerControllerWindow::AddNewItemToList( CGenericWiaEventHandler::CEventMessage *pEventMessage )
{
WIA_PUSHFUNCTION((TEXT("CAcquisitionManagerControllerWindow::AddNewItemToList")));
//
// Check to see if the item is already in our list
//
CWiaItem *pWiaItem = m_WiaItemList.Find(pEventMessage->FullItemName());
if (pWiaItem)
{
//
// If it is already in our list, just return.
//
return;
}
//
// Get an IWiaItem interface pointer for this item
//
CComPtr<IWiaItem> pItem;
HRESULT hr = m_pWiaItemRoot->FindItemByName( 0, CSimpleBStr(pEventMessage->FullItemName()).BString(), &pItem );
if (SUCCEEDED(hr) && pItem)
{
//
// Add it to the root of the item tree
//
m_WiaItemList.Add( NULL, new CWiaItem(pItem) );
}
}
void CAcquisitionManagerControllerWindow::RequestThumbnailForNewItem( CGenericWiaEventHandler::CEventMessage *pEventMessage )
{
WIA_PUSHFUNCTION((TEXT("CAcquisitionManagerControllerWindow::RequestThumbnailForNewItem")));
//
// Find the item in our list
//
CWiaItem *pWiaItem = m_WiaItemList.Find(pEventMessage->FullItemName());
if (pWiaItem)
{
//
// Add this item's cookie to an empty list
//
CSimpleDynamicArray<DWORD> Cookies;
Cookies.Append( pWiaItem->GlobalInterfaceTableCookie() );
if (Cookies.Size())
{
//
// Reset the cancel event
//
m_EventThumbnailCancel.Reset();
//
// Prepare and send the request
//
CDownloadThumbnailsThreadMessage *pDownloadThumbnailsThreadMessage = new CDownloadThumbnailsThreadMessage( m_hWnd, Cookies, m_EventThumbnailCancel.Event() );
if (pDownloadThumbnailsThreadMessage)
{
m_pThreadMessageQueue->Enqueue( pDownloadThumbnailsThreadMessage, CThreadMessageQueue::PriorityNormal );
}
}
}
}
LRESULT CAcquisitionManagerControllerWindow::OnEventNotification( WPARAM wParam, LPARAM lParam )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::OnEventNotification"));
CGenericWiaEventHandler::CEventMessage *pEventMessage = reinterpret_cast<CGenericWiaEventHandler::CEventMessage *>(lParam);
if (pEventMessage)
{
//
// If we got an item created message, add the item to the list
//
if (pEventMessage->EventId() == WIA_EVENT_ITEM_CREATED)
{
AddNewItemToList( pEventMessage );
}
//
// On Disconnect, perform disconnection operations
//
else if (pEventMessage->EventId() == WIA_EVENT_DEVICE_DISCONNECTED)
{
DisplayDisconnectMessageAndExit();
}
//
// Propagate the message to all currently registered windows
//
m_WindowList.SendMessage( m_nWiaEventMessage, wParam, lParam );
//
// Make sure we ask for the new thumbnail *AFTER* we tell the views the item exists
//
if (pEventMessage->EventId() == WIA_EVENT_ITEM_CREATED)
{
RequestThumbnailForNewItem( pEventMessage );
}
//
// If this is a deleted item event, mark this item deleted
//
if (pEventMessage->EventId() == WIA_EVENT_ITEM_DELETED)
{
CWiaItem *pWiaItem = m_WiaItemList.Find(pEventMessage->FullItemName());
if (pWiaItem)
{
pWiaItem->MarkDeleted();
}
}
//
// On a connect event for this device, close the wizard
//
if (pEventMessage->EventId() == WIA_EVENT_DEVICE_CONNECTED)
{
if (m_bDisconnected && m_hWndWizard)
{
PropSheet_PressButton(m_hWndWizard,PSBTN_CANCEL);
}
}
//
// Free the event message
//
delete pEventMessage;
}
return HANDLED_EVENT_MESSAGE;
}
LRESULT CAcquisitionManagerControllerWindow::OnPowerBroadcast( WPARAM wParam, LPARAM lParam )
{
if (PBT_APMQUERYSUSPEND == wParam)
{
}
return TRUE;
}
LRESULT CALLBACK CAcquisitionManagerControllerWindow::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
SC_BEGIN_REFCOUNTED_MESSAGE_HANDLERS(CAcquisitionManagerControllerWindow)
{
SC_HANDLE_MESSAGE( WM_CREATE, OnCreate );
SC_HANDLE_MESSAGE( WM_DESTROY, OnDestroy );
SC_HANDLE_MESSAGE( PWM_POSTINITIALIZE, OnPostInitialize );
SC_HANDLE_MESSAGE( WM_POWERBROADCAST, OnPowerBroadcast );
}
SC_HANDLE_REGISTERED_MESSAGE(m_nThreadNotificationMessage,OnThreadNotification);
SC_HANDLE_REGISTERED_MESSAGE(m_nWiaEventMessage,OnEventNotification);
SC_END_MESSAGE_HANDLERS();
}
bool CAcquisitionManagerControllerWindow::Register( HINSTANCE hInstance )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::Register"));
WNDCLASSEX WndClassEx;
memset( &WndClassEx, 0, sizeof(WndClassEx) );
WndClassEx.cbSize = sizeof(WNDCLASSEX);
WndClassEx.lpfnWndProc = WndProc;
WndClassEx.hInstance = hInstance;
WndClassEx.hCursor = LoadCursor(NULL,IDC_ARROW);
WndClassEx.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClassEx.lpszClassName = ACQUISITION_MANAGER_CONTROLLER_WINDOW_CLASSNAME;
BOOL bResult = (::RegisterClassEx(&WndClassEx) != 0);
DWORD dw = GetLastError();
return(bResult != 0);
}
HWND CAcquisitionManagerControllerWindow::Create( HINSTANCE hInstance, CEventParameters *pEventParameters )
{
return CreateWindowEx( 0, ACQUISITION_MANAGER_CONTROLLER_WINDOW_CLASSNAME,
TEXT("WIA Acquisition Manager Controller Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, pEventParameters );
}
//
// Reference counting for our object
//
STDMETHODIMP_(ULONG) CAcquisitionManagerControllerWindow::AddRef(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::AddRef"));
ULONG nRes = InterlockedIncrement(&m_cRef);
WIA_TRACE((TEXT("m_cRef: %d"),m_cRef));
return nRes;
}
STDMETHODIMP_(ULONG) CAcquisitionManagerControllerWindow::Release(void)
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::Release"));
if (InterlockedDecrement(&m_cRef)==0)
{
WIA_TRACE((TEXT("m_cRef: 0")));
//
// Cause this thread to exit
//
PostQuitMessage(0);
//
// Delete this instance of the wizard
//
delete this;
return 0;
}
WIA_TRACE((TEXT("m_cRef: %d"),m_cRef));
return(m_cRef);
}
HRESULT CAcquisitionManagerControllerWindow::QueryInterface( REFIID riid, void **ppvObject )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::QueryInterface"));
HRESULT hr = S_OK;
*ppvObject = NULL;
if (IsEqualIID( riid, IID_IUnknown ))
{
*ppvObject = static_cast<IWizardSite*>(this);
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
}
else if (IsEqualIID( riid, IID_IWizardSite ))
{
*ppvObject = static_cast<IWizardSite*>(this);
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
}
else if (IsEqualIID( riid, IID_IServiceProvider ))
{
*ppvObject = static_cast<IServiceProvider*>(this);
reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
}
else
{
WIA_PRINTGUID((riid,TEXT("Unknown interface")));
*ppvObject = NULL;
hr = E_NOINTERFACE;
}
return hr;
}
//
// IWizardSite
//
HRESULT CAcquisitionManagerControllerWindow::GetPreviousPage(HPROPSHEETPAGE *phPage)
{
if (!phPage)
{
return E_INVALIDARG;
}
*phPage = PropSheet_IndexToPage( m_hWndWizard, m_nUploadQueryPageIndex );
if (*phPage)
{
return S_OK;
}
return E_FAIL;
}
HRESULT CAcquisitionManagerControllerWindow::GetNextPage(HPROPSHEETPAGE *phPage)
{
if (!phPage)
{
return E_INVALIDARG;
}
*phPage = PropSheet_IndexToPage( m_hWndWizard, m_nFinishPageIndex );
if (*phPage)
{
return S_OK;
}
return E_FAIL;
}
HRESULT CAcquisitionManagerControllerWindow::GetCancelledPage(HPROPSHEETPAGE *phPage)
{
return GetNextPage(phPage);
}
//
// IServiceProvider
//
HRESULT CAcquisitionManagerControllerWindow::QueryService( REFGUID guidService, REFIID riid, void **ppv )
{
WIA_PUSHFUNCTION(TEXT("CAcquisitionManagerControllerWindow::QueryService"));
WIA_PRINTGUID((guidService,TEXT("guidService")));
WIA_PRINTGUID((riid,TEXT("riid")));
if (!ppv)
{
return E_INVALIDARG;
}
//
// Initialize result
//
*ppv = NULL;
if (guidService == SID_PublishingWizard)
{
}
else
{
}
return E_FAIL;
}
static CSimpleString GetDisplayName( IShellItem *pShellItem )
{
CSimpleString strResult;
if (pShellItem)
{
LPOLESTR pszStr = NULL;
if (SUCCEEDED(pShellItem->GetDisplayName( SIGDN_FILESYSPATH, &pszStr )) && pszStr)
{
strResult = CSimpleStringConvert::NaturalString(CSimpleStringWide(pszStr));
CComPtr<IMalloc> pMalloc;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
pMalloc->Free( pszStr );
}
}
}
return strResult;
}
//
// These two functions are needed to use the generic event handler class
//
void DllAddRef(void)
{
#if !defined(DBG_GENERATE_PRETEND_EVENT)
_Module.Lock();
#endif
}
void DllRelease(void)
{
#if !defined(DBG_GENERATE_PRETEND_EVENT)
_Module.Unlock();
#endif
}