windows-nt/Source/XPSP1/NT/printscan/ui/wiadefui/tranhlp.cpp
2020-09-26 16:20:57 +08:00

326 lines
14 KiB
C++

#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;
}