#include "precomp.h" #pragma hdrstop #include #include #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 pWiaDataTransfer; hr = pWiaItem->QueryInterface( IID_IWiaDataTransfer, (void**)&pWiaDataTransfer ); if (SUCCEEDED(hr)) { // // Get the format info enumerator // CComPtr 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(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(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(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(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