windows-nt/Source/XPSP1/NT/printscan/ui/uicommon/wiaffmt.h
2020-09-26 16:20:57 +08:00

432 lines
13 KiB
C++

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: WIAFFMT.H
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 8/24/2000
*
* DESCRIPTION: Helper class which encapsulates WIA image file formats
*
*******************************************************************************/
#ifndef __WIAFFMT_H_INCLUDED
#define __WIAFFMT_H_INCLUDED
#include <windows.h>
#include <simstr.h>
#include <wia.h>
#include <pshelper.h>
class CWiaFileFormat
{
private:
GUID m_guidFormat;
CSimpleString m_strExtension;
CSimpleString m_strDescription;
HICON m_hIcon;
public:
CWiaFileFormat( const GUID &guidFormat=IID_NULL, const CSimpleString &strExtension=TEXT(""), const CSimpleString &strDescription=TEXT(""), const HICON hIcon=NULL )
: m_guidFormat(guidFormat),
m_strExtension(strExtension),
m_strDescription(strDescription),
m_hIcon(NULL)
{
if (hIcon)
{
m_hIcon = CopyIcon(hIcon);
}
}
CWiaFileFormat( const CWiaFileFormat &other )
: m_guidFormat(other.Format()),
m_strExtension(other.Extension()),
m_strDescription(other.Description()),
m_hIcon(NULL)
{
if (other.Icon())
{
m_hIcon = CopyIcon(other.Icon());
}
}
CWiaFileFormat( const GUID &guidFormat, const HICON hDefaultIcon )
: m_guidFormat(guidFormat),
m_strExtension(GetExtension(guidFormat)),
m_strDescription(TEXT("")),
m_hIcon(NULL)
{
if (m_strExtension.Length())
{
AcquireDescription();
AcquireIcon(hDefaultIcon);
}
}
~CWiaFileFormat(void)
{
Destroy();
}
CWiaFileFormat &operator=( const CWiaFileFormat &other )
{
if (this != &other)
{
m_guidFormat = other.Format();
m_strExtension = other.Extension();
m_strDescription = other.Description();
if (other.Icon())
{
m_hIcon = CopyIcon(other.Icon());
}
}
return *this;
}
void Destroy(void)
{
m_guidFormat = IID_NULL;
m_strExtension = TEXT("");
m_strDescription = TEXT("");
if (m_hIcon)
{
DestroyIcon(m_hIcon);
m_hIcon = NULL;
}
}
bool IsValid(void) const
{
return (m_guidFormat != IID_NULL && m_strExtension.Length());
}
HICON AcquireIcon( const HICON hDefaultIcon, bool bSmall=true )
{
if (!IsValid())
{
return false;
}
//
// If we've already gotten the icon, return it
//
if (m_hIcon)
{
return m_hIcon;
}
//
// Use the extension to get the icon
//
CSimpleString strExtension(m_strExtension.ToUpper());
SHFILEINFO SHFileInfo = {0};
if (SHGetFileInfo( CSimpleString(TEXT(".")) + strExtension, 0, &SHFileInfo, sizeof(SHFileInfo), bSmall ? SHGFI_SMALLICON|SHGFI_ICON|SHGFI_USEFILEATTRIBUTES : SHGFI_ICON|SHGFI_USEFILEATTRIBUTES ))
{
//
// We will take ownership of this icon
//
if (SHFileInfo.hIcon)
{
m_hIcon = SHFileInfo.hIcon;
}
}
//
// If we haven't gotten the icon, use the default icon
//
if (!m_hIcon && hDefaultIcon)
{
m_hIcon = CopyIcon(hDefaultIcon);
}
return m_hIcon;
}
CSimpleString AcquireDescription(void)
{
if (!IsValid())
{
return TEXT("");
}
//
// If we've already gotten the description, return it
//
if (m_strDescription.Length())
{
return m_strDescription;
}
//
// Use the extension to get the description
//
CSimpleString strExtension(m_strExtension.ToUpper());
SHFILEINFO SHFileInfo = {0};
if (SHGetFileInfo( CSimpleString(TEXT(".")) + strExtension, 0, &SHFileInfo, sizeof(SHFileInfo), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ))
{
//
// We will take ownership of this icon
//
if (lstrlen(SHFileInfo.szTypeName))
{
m_strDescription = SHFileInfo.szTypeName;
}
}
return m_strDescription;
}
static CSimpleString GetExtension( const GUID &guidFormat )
{
static const struct
{
const GUID *guidFormat;
LPCTSTR pszExtension;
}
cs_WiaFormatExtensions[] =
{
{ &WiaImgFmt_BMP, TEXT("bmp")},
{ &WiaImgFmt_MEMORYBMP, TEXT("bmp")},
{ &WiaImgFmt_JPEG, TEXT("jpg")},
{ &WiaImgFmt_TIFF, TEXT("tif")},
{ &WiaImgFmt_FLASHPIX, TEXT("fpx")},
{ &WiaImgFmt_GIF, TEXT("gif")},
{ &WiaImgFmt_EXIF, TEXT("jpg")},
{ &WiaImgFmt_WMF, TEXT("wmf")},
{ &WiaImgFmt_PNG, TEXT("png")},
{ &WiaImgFmt_PHOTOCD, TEXT("pcd")},
{ &WiaImgFmt_EMF, TEXT("emf")},
{ &WiaImgFmt_ICO, TEXT("ico")},
{ &WiaAudFmt_WAV, TEXT("wav")},
{ &WiaAudFmt_MP3, TEXT("mp3")},
{ &WiaAudFmt_AIFF, TEXT("aif")},
{ &WiaAudFmt_WMA, TEXT("wma")},
{ &WiaImgFmt_RTF, TEXT("rtf")},
{ &WiaImgFmt_XML, TEXT("xml")},
{ &WiaImgFmt_HTML, TEXT("htm")},
{ &WiaImgFmt_TXT, TEXT("txt")},
{ &WiaImgFmt_MPG, TEXT("mpg")},
{ &WiaImgFmt_AVI, TEXT("avi")}
};
for (int i=0;i<ARRAYSIZE(cs_WiaFormatExtensions);i++)
{
if (*cs_WiaFormatExtensions[i].guidFormat == guidFormat)
{
return cs_WiaFormatExtensions[i].pszExtension;
}
}
return TEXT("");
}
static CSimpleString GetExtension( const GUID &guidFormat, LONG nMediaType, IUnknown *pUnknown )
{
//
// First, try to get the extension from the static table above
//
CSimpleString strResult = GetExtension( guidFormat );
if (!strResult.Length())
{
//
// Save the current media type and format, because (unfortunately), there is no way to
// get the preferred extension for a given format without setting it.
//
LONG nOldMediaType = 0;
if (PropStorageHelpers::GetProperty( pUnknown, WIA_IPA_TYMED, nOldMediaType ))
{
//
// Save the current format
//
GUID guidOldFormat = IID_NULL;
if (PropStorageHelpers::GetProperty( pUnknown, WIA_IPA_FORMAT, guidOldFormat ))
{
//
// Set the format and media type to the ones chosen
//
if (PropStorageHelpers::SetProperty( pUnknown, WIA_IPA_FORMAT, guidFormat ) &&
PropStorageHelpers::SetProperty( pUnknown, WIA_IPA_TYMED, nMediaType ))
{
//
// Try to read the extension property
//
CSimpleStringWide strwExtension;
if (PropStorageHelpers::GetProperty( pUnknown, WIA_IPA_FILENAME_EXTENSION, strwExtension ))
{
//
// If we got an extension, save it as the result
//
strResult = CSimpleStringConvert::NaturalString(strwExtension);
}
}
//
// Restore the original format property
//
PropStorageHelpers::SetProperty( pUnknown, WIA_IPA_FORMAT, guidOldFormat );
}
//
// Restore the original media type property
//
PropStorageHelpers::SetProperty( pUnknown, WIA_IPA_TYMED, nOldMediaType );
}
}
return strResult;
}
static bool IsKnownAudioFormat( const GUID &guidFormat )
{
static const GUID *cs_WiaAudioFormats[] =
{
&WiaAudFmt_WAV,
&WiaAudFmt_MP3,
&WiaAudFmt_AIFF,
&WiaAudFmt_WMA
};
for (int i=0;i<ARRAYSIZE(cs_WiaAudioFormats);i++)
{
if (*cs_WiaAudioFormats[i] == guidFormat)
{
return true;
}
}
return false;
}
GUID Format(void) const
{
return m_guidFormat;
}
CSimpleString Extension(void) const
{
return m_strExtension;
}
CSimpleString Description(void) const
{
return m_strDescription;
}
HICON Icon(void) const
{
return m_hIcon;
}
void Format( const GUID &guidFormat )
{
m_guidFormat = guidFormat;
}
void Extension( const CSimpleString &strExtension )
{
m_strExtension = strExtension;
}
void Description( const CSimpleString &strDescription )
{
m_strDescription = strDescription;
}
void Icon( const HICON hIcon )
{
if (m_hIcon)
{
DestroyIcon(m_hIcon);
m_hIcon = NULL;
}
if (hIcon)
{
m_hIcon = CopyIcon(m_hIcon);
}
}
bool operator==( const CWiaFileFormat &other )
{
return ((other.Format() == Format()) != 0);
}
bool operator==( const GUID &guidFormat )
{
return ((guidFormat == Format()) != 0);
}
void Dump(void)
{
WIA_PUSHFUNCTION(TEXT("CWiaFileFormat::Dump()"));
WIA_PRINTGUID((m_guidFormat,TEXT(" m_guidFormat")));
WIA_TRACE((TEXT(" m_strExtension: %s"), m_strExtension.String()));
WIA_TRACE((TEXT(" m_strDescription: %s"), m_strDescription.String()));
WIA_TRACE((TEXT(" m_strDescription: %p"), m_hIcon));
}
};
class CWiaFileFormatList
{
private:
CSimpleDynamicArray<CWiaFileFormat> m_FormatList;
private:
CWiaFileFormatList( const CWiaFileFormatList & );
CWiaFileFormatList &operator=( const CWiaFileFormatList & );
public:
CWiaFileFormatList(void);
CWiaFileFormatList( const GUID **pguidFormats, UINT nFormatCount, HICON hDefaultIcon )
{
if (pguidFormats)
{
for (UINT i=0;i<nFormatCount;i++)
{
m_FormatList.Append( CWiaFileFormat( *pguidFormats[i], hDefaultIcon ) );
}
}
}
CWiaFileFormatList( IWiaItem *pWiaItem, HICON hDefaultIcon )
{
//
// Get the data transfer interface
//
CComPtr<IWiaDataTransfer> pWiaDataTransfer;
HRESULT 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 (WiaFormatInfo.lTymed == TYMED_FILE)
{
CWiaFileFormat newFormat(WiaFormatInfo.guidFormatID,hDefaultIcon);
if (newFormat.IsValid())
{
m_FormatList.Append(newFormat);
}
}
}
}
}
}
const CSimpleDynamicArray<CWiaFileFormat> &FormatList(void) const
{
return m_FormatList;
}
CWiaFileFormatList &Union( const CWiaFileFormatList &other )
{
for (int nSource=0;nSource<other.FormatList().Size();nSource++)
{
int nFindResult = m_FormatList.Find(other.FormatList()[nSource]);
if (nFindResult < 0)
{
m_FormatList.Append(other.FormatList()[nSource]);
}
}
return *this;
}
void Dump(void)
{
for (int i=0;i<m_FormatList.Size();i++)
{
m_FormatList[i].Dump();
}
}
};
#endif // __WIAFFMT_H_INCLUDED