Source code of Windows XP (NT5)
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.4 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);
}