|
|
#include "precomp.h"
#pragma hdrstop
#include <simstr.h>
#include <wiadebug.h>
#include "wiadefui.h"
#include "uicommon.h"
#include "wiauiext.h"
#include "resource.h"
extern HINSTANCE g_hInstance;
STDMETHODIMP CWiaDefaultUI::BandedDataCallback( LONG lReason, LONG lStatus, LONG lPercentComplete, LONG lOffset, LONG lLength, LONG lReserved, LONG lResLength, PBYTE pbBuffer) { WIA_PUSH_FUNCTION((TEXT("CWiaDefaultUI::BandedDataCallback(%08X,%08X,%08X,%08X,%08X,%08X,%08X,%08X)"),lReason,lStatus,lPercentComplete,lOffset,lLength,lReserved,lResLength,pbBuffer)); HRESULT hr = S_OK; if (m_pSecondaryCallback) hr = m_pSecondaryCallback->BandedDataCallback(lReason,lStatus,lPercentComplete,lOffset,lLength,lReserved,lResLength,pbBuffer); WIA_PRINTHRESULT((hr,TEXT("m_pSecondaryCallback->BandedDataCallback returned"))); if (SUCCEEDED(hr) && hr != S_FALSE && lReason == IT_MSG_STATUS) { if (m_pWiaProgressDialog) { m_pWiaProgressDialog->SetPercentComplete(lPercentComplete); BOOL bCancelled = FALSE; if (SUCCEEDED(m_pWiaProgressDialog->Cancelled(&bCancelled)) && bCancelled) { hr = S_FALSE; } } } else if (SUCCEEDED(hr) && hr != S_FALSE && lReason == IT_MSG_DATA) { if (m_pWiaProgressDialog) { m_pWiaProgressDialog->SetPercentComplete(lPercentComplete); BOOL bCancelled = FALSE; if (SUCCEEDED(m_pWiaProgressDialog->Cancelled(&bCancelled)) && bCancelled) { hr = S_FALSE; } } } WIA_PRINTHRESULT((hr,TEXT("CWiaDefaultUI::BandedDataCallback is returning"))); return(hr); }
STDMETHODIMP CWiaDefaultUI::TransferItemBanded( IWiaItem *pWiaItem, HWND hwndParent, DWORD dwFlags, GUID guidFormat, ULONG ulBufferSize, IWiaDataCallback *pSecondaryCallback ) { if (!pWiaItem) { return E_INVALIDARG; } // Create status window, if requested
m_pSecondaryCallback = pSecondaryCallback; HRESULT hr; if (0 == (dwFlags&WIA_TRANSFERHELPER_NOPROGRESS)) { hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaProgressDialog, (void**)&m_pWiaProgressDialog ); if (SUCCEEDED(hr)) { m_pWiaProgressDialog->Create( hwndParent, WIA_PROGRESSDLG_NO_ANIM ); m_pWiaProgressDialog->SetTitle(CSimpleStringConvert::WideString(CSimpleString(IDS_TRANSFER_IMAGE_ACQUIRING,g_hInstance))); m_pWiaProgressDialog->SetMessage(CSimpleStringConvert::WideString(CSimpleString(IDS_TRANSFER_IMAGE_PERCENT,g_hInstance))); m_pWiaProgressDialog->Show(); } } if (m_pWiaProgressDialog || (dwFlags&WIA_TRANSFERHELPER_NOPROGRESS)) { CComPtr<IWiaDataCallback> pWiaDataCallback; hr = this->QueryInterface(IID_IWiaDataCallback, (void **)&pWiaDataCallback); if (SUCCEEDED(hr)) { CComPtr<IWiaPropertyStorage> pWiaPropertyStorage; hr = pWiaItem->QueryInterface(IID_IWiaPropertyStorage, (void **)&pWiaPropertyStorage); if (SUCCEEDED(hr)) { if (guidFormat == GUID_NULL) { CComPtr<IWiaSupportedFormats> pWiaSupportedFormats; hr = this->QueryInterface(IID_IWiaSupportedFormats, (void **)&pWiaSupportedFormats); if (SUCCEEDED(hr)) { hr = pWiaSupportedFormats->Initialize( pWiaItem, TYMED_CALLBACK ); if (SUCCEEDED(hr)) { hr = GetDefaultClipboardFileFormat( &guidFormat ); } } }
if (guidFormat == GUID_NULL) guidFormat = WiaImgFmt_MEMORYBMP;
PROPSPEC PropSpec[2] = {0}; PROPVARIANT PropVariant[2] = {0};
PropSpec[0].ulKind = PRSPEC_PROPID; PropSpec[0].propid = WIA_IPA_FORMAT; PropSpec[1].ulKind = PRSPEC_PROPID; PropSpec[1].propid = WIA_IPA_TYMED;
PropVariant[0].vt = VT_CLSID; PropVariant[0].puuid = &guidFormat; PropVariant[1].vt = VT_I4; PropVariant[1].lVal = TYMED_CALLBACK;
hr = pWiaPropertyStorage->WriteMultiple( ARRAYSIZE(PropVariant), PropSpec, PropVariant, WIA_IPA_FIRST ); if (SUCCEEDED(hr)) {
CComPtr<IWiaDataTransfer> pIWiaDataTransfer; hr = pWiaItem->QueryInterface(IID_IWiaDataTransfer, (void **)&pIWiaDataTransfer); if (SUCCEEDED(hr)) { if (!ulBufferSize) { LONG lMinimumBufferSize; if (!PropStorageHelpers::GetProperty( pWiaItem, WIA_IPA_MIN_BUFFER_SIZE, lMinimumBufferSize )) { lMinimumBufferSize = 0x0000FFFF; // 64K
} ulBufferSize = static_cast<ULONG>(lMinimumBufferSize); } WIA_DATA_TRANSFER_INFO WiaDataTransferInfo = {0}; WiaDataTransferInfo.ulSize = sizeof(WIA_DATA_TRANSFER_INFO); WiaDataTransferInfo.ulBufferSize = ulBufferSize; hr = pIWiaDataTransfer->idtGetBandedData(&WiaDataTransferInfo, pWiaDataCallback); WIA_PRINTHRESULT((hr,TEXT("pIWiaDataTransfer->idtGetBandedData returned"))); } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemBanded, QI on IID_IWiaDataTransfer"))); } } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemBanded, pIWiaPropertyStorage->WriteMultiple failed"))); } } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemBanded, QI of IID_IWiaPropertyStorage failed."))); } } if (m_pWiaProgressDialog) { m_pWiaProgressDialog->Destroy(); m_pWiaProgressDialog = NULL; } } else { WIA_ERROR((TEXT("TransferItemBanded, unable to create status window"))); hr = HRESULT_FROM_WIN32(GetLastError()); } return hr; }
STDMETHODIMP CWiaDefaultUI::TransferItemFile( IWiaItem *pWiaItem, HWND hwndParent, DWORD dwFlags, GUID guidFormat, LPCWSTR pszFilename, IWiaDataCallback *pSecondaryCallback, LONG nMediaType ) { WIA_PUSH_FUNCTION((TEXT("CWiaDefaultUI::TransferItemFile( %08X )"), pWiaItem )); if (!pszFilename || !lstrlenW(pszFilename) || !pWiaItem) { return E_INVALIDARG; } //
// Create status window, if requested
//
m_pSecondaryCallback = pSecondaryCallback; HRESULT hr; if (0 == (dwFlags&WIA_TRANSFERHELPER_NOPROGRESS)) { hr = CoCreateInstance( CLSID_WiaDefaultUi, NULL, CLSCTX_INPROC_SERVER, IID_IWiaProgressDialog, (void**)&m_pWiaProgressDialog ); if (SUCCEEDED(hr)) { m_pWiaProgressDialog->Create( hwndParent, WIA_PROGRESSDLG_NO_ANIM ); m_pWiaProgressDialog->SetTitle(CSimpleStringConvert::WideString(CSimpleString(IDS_TRANSFER_IMAGE_ACQUIRING,g_hInstance))); m_pWiaProgressDialog->SetMessage(CSimpleStringConvert::WideString(CSimpleString(IDS_TRANSFER_IMAGE_PERCENT,g_hInstance))); m_pWiaProgressDialog->Show(); } } if (m_pWiaProgressDialog || (dwFlags&WIA_TRANSFERHELPER_NOPROGRESS)) { CComPtr<IWiaDataCallback> pWiaDataCallback; hr = this->QueryInterface(IID_IWiaDataCallback, (void **)&pWiaDataCallback); if (SUCCEEDED(hr)) { CComPtr<IWiaPropertyStorage> pWiaPropertyStorage; hr = pWiaItem->QueryInterface(IID_IWiaPropertyStorage, (void **)&pWiaPropertyStorage); if (SUCCEEDED(hr)) { if (guidFormat == GUID_NULL) { CComPtr<IWiaSupportedFormats> pWiaSupportedFormats; hr = this->QueryInterface(IID_IWiaSupportedFormats, (void **)&pWiaSupportedFormats); if (SUCCEEDED(hr)) { hr = pWiaSupportedFormats->Initialize( pWiaItem, nMediaType ); if (SUCCEEDED(hr)) { hr = GetDefaultClipboardFileFormat( &guidFormat ); } } }
if (guidFormat == GUID_NULL) guidFormat = WiaImgFmt_BMP;
PROPSPEC PropSpec[2] = {0}; PROPVARIANT PropVariant[2] = {0};
PropSpec[0].ulKind = PRSPEC_PROPID; PropSpec[0].propid = WIA_IPA_FORMAT; PropSpec[1].ulKind = PRSPEC_PROPID; PropSpec[1].propid = WIA_IPA_TYMED;
PropVariant[0].vt = VT_CLSID; PropVariant[0].puuid = &guidFormat; PropVariant[1].vt = VT_I4; PropVariant[1].lVal = nMediaType;
WIA_PRINTGUID((guidFormat,TEXT("TYMED: %d, guidFormat"), nMediaType )); hr = pWiaPropertyStorage->WriteMultiple( ARRAYSIZE(PropVariant), PropSpec, PropVariant, WIA_IPA_FIRST ); if (SUCCEEDED(hr)) { CComPtr<IWiaDataTransfer> pIWiaDataTransfer; hr = pWiaItem->QueryInterface(IID_IWiaDataTransfer, (void **)&pIWiaDataTransfer); if (SUCCEEDED(hr)) { STGMEDIUM stgMedium = {0}; hr = pIWiaDataTransfer->idtGetData(&stgMedium, pWiaDataCallback); WIA_PRINTHRESULT((hr,TEXT("pIWiaDataTransfer->idtGetData returned")));
//
// If the transfer succeeded, or it failed with the possibility of having a file
// left over AND we want to preserve any leftover file.
//
if (SUCCEEDED(hr)) { //
// Make sure we didn't cancel.
//
if (hr != S_FALSE) { //
// Get the file names
//
CSimpleString strName = CSimpleStringConvert::NaturalString(CSimpleStringWide(stgMedium.lpszFileName)); CSimpleString strTarget = CSimpleStringConvert::NaturalString(CSimpleStringWide(pszFilename)); if (strName.Length() && strTarget.Length()) { //
// This function will first try to move, then copy+erase the src file to the tgt file
//
hr = WiaUiUtil::MoveOrCopyFile( strName.String(), strTarget.String() ); } else { hr = E_OUTOFMEMORY; WIA_ERROR((TEXT("TransferItemFile, unable to create source filename"))); } } else { WIA_ERROR((TEXT("TransferItemFile, user cancelled"))); } } else if ((WIA_ERROR_PAPER_JAM == hr || WIA_ERROR_PAPER_EMPTY == hr || WIA_ERROR_PAPER_PROBLEM == hr) && (dwFlags & WIA_TRANSFERHELPER_PRESERVEFAILEDFILE)) { //
// Get the file names
//
CSimpleString strName = CSimpleStringConvert::NaturalString(CSimpleStringWide(stgMedium.lpszFileName)); CSimpleString strTarget = CSimpleStringConvert::NaturalString(CSimpleStringWide(pszFilename)); if (strName.Length() && strTarget.Length()) { //
// Don't preserve any errors we encounter here.
//
WiaUiUtil::MoveOrCopyFile( strName.String(), strTarget.String() ); } } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemFile, idtGetData failed"))); }
//
// Call this even in the error case, in case the driver/service left a file laying around.
//
ReleaseStgMedium(&stgMedium); } } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemFile, pIWiaPropertyStorage->WriteMultiple failed"))); } } else { WIA_PRINTHRESULT((hr,TEXT("TransferItemFile, QI of IWiaPropertyStorage failed."))); } } if (m_pWiaProgressDialog) { m_pWiaProgressDialog->Destroy(); m_pWiaProgressDialog = NULL; } } else { WIA_ERROR((TEXT("TransferItemFile, unable to create status window"))); hr = HRESULT_FROM_WIN32(GetLastError()); } return hr; }
|