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.
298 lines
9.7 KiB
298 lines
9.7 KiB
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include <wiadebug.h>
|
|
#include <wiaffmt.h>
|
|
#include "wiadefui.h"
|
|
#include "wiauiext.h"
|
|
|
|
extern HINSTANCE g_hInstance;
|
|
|
|
STDMETHODIMP CWiaDefaultUI::Initialize( IWiaItem *pWiaItem, LONG nMediaType )
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CWiaDefaultUI::Initialize")));
|
|
m_WiaFormatPairs.Destroy();
|
|
m_nDefaultFormat = 0;
|
|
HRESULT hr = S_OK;
|
|
if (!pWiaItem)
|
|
return(E_POINTER);
|
|
GUID guidDefaultClipFormat = GUID_NULL;
|
|
|
|
//
|
|
// Don't worry about failure, we will come up with our own default if the driver doesn't report on
|
|
//
|
|
PropStorageHelpers::GetProperty( pWiaItem, WIA_IPA_PREFERRED_FORMAT, guidDefaultClipFormat );
|
|
WIA_PRINTGUID((guidDefaultClipFormat,TEXT("guidDefaultClipFormat")));
|
|
if (guidDefaultClipFormat == GUID_NULL)
|
|
{
|
|
if (TYMED_FILE == nMediaType || TYMED_MULTIPAGE_FILE == nMediaType)
|
|
{
|
|
guidDefaultClipFormat = WiaImgFmt_BMP;
|
|
}
|
|
else
|
|
{
|
|
guidDefaultClipFormat = WiaImgFmt_MEMORYBMP;
|
|
}
|
|
}
|
|
|
|
//
|
|
// if the transfer mechanism is known to be incompatible
|
|
// with the current tymed, change it
|
|
//
|
|
if (guidDefaultClipFormat == WiaImgFmt_BMP && nMediaType == TYMED_CALLBACK)
|
|
{
|
|
guidDefaultClipFormat = WiaImgFmt_MEMORYBMP;
|
|
}
|
|
else if ((guidDefaultClipFormat == WiaImgFmt_MEMORYBMP) && ((nMediaType == TYMED_FILE) || (TYMED_MULTIPAGE_FILE == nMediaType)))
|
|
{
|
|
guidDefaultClipFormat = WiaImgFmt_BMP;
|
|
}
|
|
|
|
//
|
|
// Get the data transfer interface
|
|
//
|
|
CComPtr<IWiaDataTransfer> pWiaDataTransfer;
|
|
hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer );
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
//
|
|
// Get the format info enumerator
|
|
//
|
|
CComPtr<IEnumWIA_FORMAT_INFO> pEnumWIA_FORMAT_INFO;
|
|
hr = pWiaDataTransfer->idtEnumWIA_FORMAT_INFO(&pEnumWIA_FORMAT_INFO);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
//
|
|
// Enumerate the formats
|
|
//
|
|
ULONG ulFetched = 0;
|
|
WIA_FORMAT_INFO WiaFormatInfo;
|
|
while (pEnumWIA_FORMAT_INFO->Next(1,&WiaFormatInfo,&ulFetched) == S_OK)
|
|
{
|
|
//
|
|
// If this is the media type we are interested in...
|
|
//
|
|
if (static_cast<LONG>(WiaFormatInfo.lTymed) == nMediaType)
|
|
{
|
|
//
|
|
// The friendly description for this file type
|
|
//
|
|
CSimpleString strDescription;
|
|
|
|
//
|
|
// Get the file extension for this type
|
|
//
|
|
CSimpleString strExtension = CWiaFileFormat::GetExtension( WiaFormatInfo.guidFormatID, nMediaType, pWiaItem );
|
|
if (strExtension.Length())
|
|
{
|
|
//
|
|
// Save the extension
|
|
//
|
|
CSimpleString strExtensionPlusDot = TEXT(".");
|
|
strExtensionPlusDot += strExtension;
|
|
if (strExtensionPlusDot.Length())
|
|
{
|
|
//
|
|
// Get the description
|
|
//
|
|
SHFILEINFO SHFileInfo;
|
|
if (SHGetFileInfo(strExtensionPlusDot.String(), FILE_ATTRIBUTE_NORMAL, &SHFileInfo, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ))
|
|
{
|
|
strDescription = SHFileInfo.szTypeName;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// SUCCESS! Save the extension and description
|
|
//
|
|
int nIndex = m_WiaFormatPairs.Append( CWiaFormatPair( static_cast<GUID>(WiaFormatInfo.guidFormatID), strExtension, CSimpleStringConvert::WideString(strDescription) ) );
|
|
|
|
//
|
|
// Save the default format index, if this is the default format
|
|
//
|
|
if (guidDefaultClipFormat == WiaFormatInfo.guidFormatID)
|
|
{
|
|
m_nDefaultFormat = nIndex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetFormatCount( LONG *pnCount )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if (!pnCount)
|
|
return(E_POINTER);
|
|
*pnCount = m_WiaFormatPairs.Size();
|
|
return(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetFormatType( LONG nFormat, GUID *pcfClipFormat )
|
|
{
|
|
WIA_PUSH_FUNCTION((TEXT("CWiaDefaultUI::GetFormatType")));
|
|
WIA_PRINTGUID((*pcfClipFormat,TEXT("nFormat: %d, pcfClipFormat:"),nFormat));
|
|
WIA_TRACE((TEXT("m_WiaFormatPairs.Size(): %d"),m_WiaFormatPairs.Size()));
|
|
HRESULT hr = S_OK;
|
|
// Out of range
|
|
if (nFormat >= m_WiaFormatPairs.Size() || nFormat < 0)
|
|
return(E_FAIL);
|
|
*pcfClipFormat = m_WiaFormatPairs[nFormat].Type();
|
|
return(hr);
|
|
}
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetFormatExtension( LONG nFormat, LPWSTR pszExtension, int nMaxLen )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
// Out of range
|
|
if (nFormat >= m_WiaFormatPairs.Size() || nFormat < 0)
|
|
return(E_FAIL);
|
|
CSimpleStringWide str = m_WiaFormatPairs[nFormat].Extension();
|
|
if (static_cast<int>(str.Length()) >= nMaxLen)
|
|
return(E_FAIL);
|
|
lstrcpyW( pszExtension, str.String() );
|
|
return(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetFormatDescription( LONG nFormat, LPWSTR pszDescription, int nMaxLen )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
// Out of range
|
|
if (nFormat >= m_WiaFormatPairs.Size() || nFormat < 0)
|
|
return(E_FAIL);
|
|
CSimpleStringWide str = m_WiaFormatPairs[nFormat].Description();
|
|
if (static_cast<int>(str.Length()) >= nMaxLen)
|
|
return(E_FAIL);
|
|
lstrcpyW( pszDescription, str.String() );
|
|
return(hr);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetDefaultClipboardFileFormat( GUID *pguidFormat )
|
|
{
|
|
if (!pguidFormat)
|
|
return E_POINTER;
|
|
return GetFormatType(m_nDefaultFormat,pguidFormat);
|
|
}
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetDefaultClipboardFileFormatIndex( LONG *pnIndex )
|
|
{
|
|
if (!pnIndex)
|
|
return E_POINTER;
|
|
if (m_nDefaultFormat >= m_WiaFormatPairs.Size() || m_nDefaultFormat < 0)
|
|
return(E_FAIL);
|
|
*pnIndex = m_nDefaultFormat;
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CWiaDefaultUI::GetClipboardFileExtension( GUID guidFormat, LPWSTR pszExt, DWORD nMaxLen )
|
|
{
|
|
if (!pszExt)
|
|
{
|
|
return E_POINTER;
|
|
}
|
|
|
|
CSimpleString strExtension = CWiaFileFormat::GetExtension( guidFormat );
|
|
if (strExtension.Length())
|
|
{
|
|
CSimpleStringWide strwExtension = CSimpleStringConvert::WideString(strExtension);
|
|
if (strwExtension.Length() < nMaxLen)
|
|
{
|
|
lstrcpyW( pszExt, strwExtension.String() );
|
|
return S_OK;
|
|
}
|
|
}
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CWiaDefaultUI::ChangeClipboardFileExtension( GUID guidFormat, LPWSTR pszFilename, DWORD nMaxLen )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if (!pszFilename || guidFormat==GUID_NULL) // We don't accept a default type here
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
WCHAR szExtension[MAX_PATH]=L"";
|
|
GetClipboardFileExtension( guidFormat, szExtension, ARRAYSIZE(szExtension) );
|
|
if (!lstrlenW(szExtension))
|
|
{
|
|
return S_FALSE; // Not really an error, just an unknown file type.
|
|
}
|
|
|
|
CSimpleStringWide strName(pszFilename);
|
|
// Make sure the string is valid
|
|
if (strName.Length())
|
|
{
|
|
int nPeriodFind = strName.ReverseFind( L'.' );
|
|
int nBSlashFind = strName.ReverseFind( L'\\' );
|
|
if (nPeriodFind < 0) // No extension found
|
|
{
|
|
strName += L'.';
|
|
strName += szExtension;
|
|
}
|
|
else if (nPeriodFind > nBSlashFind) // Assume this is an extension, because it is following a back slash
|
|
{
|
|
strName = strName.Left(nPeriodFind);
|
|
strName += L'.';
|
|
strName += szExtension;
|
|
}
|
|
else // It must not be an extension
|
|
{
|
|
strName += L'.';
|
|
strName += szExtension;
|
|
}
|
|
|
|
// Make sure this string can handle the addition of the extension
|
|
if ((strName.Length()+1) <= nMaxLen)
|
|
{
|
|
lstrcpyW( pszFilename, strName.String() );
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CWiaDefaultUI::ConstructFileOpenDialogStyleString( BSTR *pbstrString )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
int nLength = 0;
|
|
|
|
// For each ext: "Foo Files (*.foo)|*.foo|"
|
|
for (int i=0;i<m_WiaFormatPairs.Size();i++)
|
|
{
|
|
nLength += m_WiaFormatPairs[i].Description().Length() +
|
|
lstrlenW(L" (*.") +
|
|
m_WiaFormatPairs[i].Extension().Length() +
|
|
lstrlenW(L")|*.") +
|
|
m_WiaFormatPairs[i].Extension().Length() +
|
|
lstrlenW(L"|");
|
|
}
|
|
*pbstrString = SysAllocStringLen( NULL, nLength );
|
|
if (*pbstrString)
|
|
{
|
|
CSimpleStringWide strTmp;
|
|
for (i=0;i<m_WiaFormatPairs.Size();i++)
|
|
{
|
|
strTmp += m_WiaFormatPairs[i].Description() +
|
|
L" (*." +
|
|
m_WiaFormatPairs[i].Extension() +
|
|
L")|*." +
|
|
m_WiaFormatPairs[i].Extension() +
|
|
L"|";
|
|
CopyMemory( *pbstrString, strTmp.String(), nLength * sizeof(WCHAR) );
|
|
}
|
|
}
|
|
else hr = E_OUTOFMEMORY;
|
|
return(hr);
|
|
}
|
|
|