//____________________________________________________________________________ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 1996. // // File: xicon.cxx // // Contents: implementation of CJobsEI & CJobsEIA classes. // // Classes: // // Functions: // // History: 1/4/1996 RaviR Created // //____________________________________________________________________________ #include "..\pch\headers.hxx" #pragma hdrstop #include "dbg.h" #include "macros.h" #include "..\inc\resource.h" #include "dll.hxx" #include "jobidl.hxx" #include "util.hxx" #include "jobicons.hxx" // // extern // extern HINSTANCE g_hInstance; //#undef DEB_TRACE //#define DEB_TRACE DEB_USER1 const TCHAR c_szTask[] = TEXT("task!"); extern const TCHAR TEMPLATE_STR[] = TEXT("wizard:"); //____________________________________________________________________________ // // Class: CJobsEI // // Purpose: Provide IExtractIcon interface to Job Folder objects. // // History: 1/24/1996 RaviR Created //____________________________________________________________________________ class CJobsEI : public IExtractIcon { public: CJobsEI(LPCTSTR pszFolderPath, LPITEMIDLIST pidl) : m_pszFolderPath(pszFolderPath), m_pidl(pidl), m_JobIcon(), m_ulRefs(1) {} ~CJobsEI() { ILFree(m_pidl); } // IUnknown methods DECLARE_STANDARD_IUNKNOWN; // IExtractIcon methods STDMETHOD(GetIconLocation)(UINT uFlags, LPTSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); STDMETHOD(Extract)(LPCTSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); private: CDllRef m_DllRef; LPCTSTR m_pszFolderPath; LPITEMIDLIST m_pidl; CJobIcon m_JobIcon; }; //____________________________________________________________________________ // // Member: IUnknown methods //____________________________________________________________________________ IMPLEMENT_STANDARD_IUNKNOWN(CJobsEI); STDMETHODIMP CJobsEI::QueryInterface(REFIID riid, LPVOID* ppvObj) { if (IsEqualIID(IID_IUnknown, riid) || IsEqualIID(IID_IExtractIcon, riid)) { *ppvObj = (IUnknown*)(IExtractIcon*) this; this->AddRef(); return S_OK; } *ppvObj = NULL; return E_NOINTERFACE; } //____________________________________________________________________________ // // Member: CJobsEI::IExtractIcon::GetIconLocation // // Arguments: [uFlags] -- IN // [szIconFile] -- IN // [cchMax] -- IN // [piIndex] -- IN // [pwFlags] -- IN // // Returns: HTRESULT // // History: 1/5/1996 RaviR Created // //____________________________________________________________________________ STDMETHODIMP CJobsEI::GetIconLocation( UINT uFlags, LPTSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags) { TRACE(CJobsEI, GetIconLocation); szIconFile[0] = '\0'; // init if (uFlags & GIL_OPENICON) { return S_FALSE; } *pwFlags = GIL_NOTFILENAME | GIL_PERINSTANCE; PJOBID pjid = (PJOBID)m_pidl; if (cchMax <= (UINT)(lstrlen(c_szTask) + lstrlen(pjid->GetAppName()))) { DEBUG_OUT((DEB_ERROR, "CJobsEI::GetIconLocation: insufficient buffer\n")); return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); } lstrcpy(szIconFile, c_szTask); if (pjid->IsTemplate()) { lstrcat(szIconFile, TEMPLATE_STR); *piIndex = 0; } else { lstrcat(szIconFile, pjid->GetAppName()); *piIndex = ! pjid->IsJobFlagOn(TASK_FLAG_DISABLED); } return S_OK; } //____________________________________________________________________________ // // Member: CJobsEI::Extract // // Arguments: [pszFile] -- IN // [nIconIndex] -- IN // [phiconLarge] -- IN // [phiconSmall] -- IN // [nIconSize] -- IN // // Returns: STDMETHODIMP // // History: 1/5/1996 RaviR Created //____________________________________________________________________________ STDMETHODIMP CJobsEI::Extract( LPCTSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize) { TRACE(CJobsEI, Extract); if (((PJOBID)m_pidl)->IsTemplate()) { m_JobIcon.GetTemplateIcons(phiconLarge, phiconSmall); } else { m_JobIcon.GetIcons(((PJOBID)m_pidl)->GetAppName(), nIconIndex, phiconLarge, phiconSmall); } return S_OK; } //____________________________________________________________________________ // // Function: JFGetExtractIcon // // Synopsis: Function to create IExtractIcon // // Arguments: [ppvObj] -- OUT // // Returns: HRESULT // // History: 1/31/1996 RaviR Created // //____________________________________________________________________________ HRESULT JFGetExtractIcon( LPVOID * ppvObj, LPCTSTR pszFolderPath, LPCITEMIDLIST pidl) { Win4Assert(pidl != NULL); LPITEMIDLIST pidlClone = ILClone(pidl); if (pidlClone == NULL) { CHECK_HRESULT(E_OUTOFMEMORY); return E_OUTOFMEMORY; } CJobsEI* pObj = new CJobsEI(pszFolderPath, pidlClone); if (NULL == pObj) { ILFree(pidlClone); return E_OUTOFMEMORY; } HRESULT hr = pObj->QueryInterface(IID_IExtractIcon, ppvObj); pObj->Release(); return hr; } //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////// CJobsEIA ////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// #ifdef UNICODE //____________________________________________________________________________ // // Class: CJobsEIA // // Purpose: Provide IExtractIconA interface to Job Folder objects. // // History: 1/24/1996 RaviR Created //____________________________________________________________________________ class CJobsEIA : public IExtractIconA { public: CJobsEIA(LPCTSTR pszFolderPath, LPITEMIDLIST pidl) : m_pszFolderPath(pszFolderPath), m_pidl(pidl), m_JobIcon(), m_ulRefs(1) {} ~CJobsEIA() { ILFree(m_pidl); } // IUnknown methods DECLARE_STANDARD_IUNKNOWN; // IExtractIcon methods STDMETHOD(GetIconLocation)(UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); STDMETHOD(Extract)(LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); private: CDllRef m_DllRef; LPCTSTR m_pszFolderPath; LPITEMIDLIST m_pidl; CJobIcon m_JobIcon; }; //____________________________________________________________________________ // // Member: IUnknown methods //____________________________________________________________________________ IMPLEMENT_STANDARD_IUNKNOWN(CJobsEIA); STDMETHODIMP CJobsEIA::QueryInterface(REFIID riid, LPVOID* ppvObj) { if (IsEqualIID(IID_IUnknown, riid) || IsEqualIID(IID_IExtractIconA, riid)) { *ppvObj = (IUnknown*)(IExtractIconA*) this; this->AddRef(); return S_OK; } *ppvObj = NULL; return E_NOINTERFACE; } //____________________________________________________________________________ // // Member: CJobsEIA::GetIconLocation // // Arguments: [uFlags] -- IN // [szIconFile] -- IN // [cchMax] -- IN // [piIndex] -- IN // [pwFlags] -- IN // // Returns: HTRESULT // // History: 1/5/1996 RaviR Created // //____________________________________________________________________________ STDMETHODIMP CJobsEIA::GetIconLocation( UINT uFlags, LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags) { TRACE(CJobsEIA, GetIconLocation); HRESULT hr = S_OK; szIconFile[0] = '\0'; // init if (uFlags & GIL_OPENICON) { return S_FALSE; } *pwFlags = GIL_NOTFILENAME | GIL_PERINSTANCE; WCHAR wcBuff[MAX_PATH]; PJOBID pjid = (PJOBID)m_pidl; lstrcpy(wcBuff, c_szTask); if (pjid->IsTemplate()) { lstrcat(wcBuff, TEMPLATE_STR); *piIndex = 0; } else { lstrcat(wcBuff, pjid->GetAppName()); *piIndex = ! pjid->IsJobFlagOn(TASK_FLAG_DISABLED); } hr = UnicodeToAnsi(szIconFile, wcBuff, cchMax); return hr; } //____________________________________________________________________________ // // Member: CJobsEIA::Extract // // Arguments: [pszFile] -- IN // [nIconIndex] -- IN // [phiconLarge] -- IN // [phiconSmall] -- IN // [nIconSize] -- IN // // Returns: HTRESULT // // History: 1/5/1996 RaviR Created // //____________________________________________________________________________ STDMETHODIMP CJobsEIA::Extract( LPCSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize) { TRACE(CJobsEIA, Extract); if (((PJOBID)m_pidl)->IsTemplate()) { m_JobIcon.GetTemplateIcons(phiconLarge, phiconSmall); } else { m_JobIcon.GetIcons(((PJOBID)m_pidl)->GetAppName(), nIconIndex, phiconLarge, phiconSmall); } return S_OK; } //____________________________________________________________________________ // // Function: JFGetExtractIconA // // Synopsis: Function to create IExtractIconA // // Arguments: [ppvObj] -- OUT // // Returns: HRESULT // // History: 1/31/1996 RaviR Created // //____________________________________________________________________________ HRESULT JFGetExtractIconA( LPVOID * ppvObj, LPCTSTR pszFolderPath, LPCITEMIDLIST pidl) { Win4Assert(pidl != NULL); LPITEMIDLIST pidlClone = ILClone(pidl); if (pidlClone == NULL) { CHECK_HRESULT(E_OUTOFMEMORY); return E_OUTOFMEMORY; } CJobsEIA* pObj = new CJobsEIA(pszFolderPath, pidlClone); if (NULL == pObj) { ILFree(pidlClone); return E_OUTOFMEMORY; } HRESULT hr = pObj->QueryInterface(IID_IExtractIcon, ppvObj); pObj->Release(); return hr; } #endif // UNICODE