432 lines
13 KiB
C++
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
|
|
|