windows-nt/Source/XPSP1/NT/shell/ext/cdfview/tooltip.cpp
2020-09-26 16:20:57 +08:00

333 lines
6.4 KiB
C++

//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// infotip.cpp
//
// IQueryInfo for folder items.
//
// History:
//
// 4/21/97 edwardp Created.
//
////////////////////////////////////////////////////////////////////////////////
//
// Includes
//
#include "stdinc.h"
#include "cdfidl.h"
#include "xmlutil.h"
#include "tooltip.h"
#include "dll.h"
//
// Constructor and destructor.
//
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::CQueryInfo ***
//
// Constructor.
//
////////////////////////////////////////////////////////////////////////////////
CQueryInfo::CQueryInfo(
PCDFITEMIDLIST pcdfidl,
IXMLElementCollection* pIXMLElementCollection
)
: m_cRef(1)
{
ASSERT(CDFIDL_IsValid(pcdfidl));
ASSERT(ILIsEmpty(_ILNext(pcdfidl)));
ASSERT(XML_IsCdfidlMemberOf(pIXMLElementCollection, pcdfidl));
ASSERT(NULL == m_pIXMLElement);
if (pIXMLElementCollection)
{
XML_GetElementByIndex(pIXMLElementCollection, CDFIDL_GetIndex(pcdfidl),
&m_pIXMLElement);
}
if (m_pIXMLElement)
m_fHasSubItems = XML_IsFolder(m_pIXMLElement);
TraceMsg(TF_OBJECTS, "+ IQueryInfo");
DllAddRef();
return;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::CQueryInfo ***
//
// Constructor.
//
////////////////////////////////////////////////////////////////////////////////
CQueryInfo::CQueryInfo(
IXMLElement* pIXMLElement,
BOOL fHasSubItems
)
: m_cRef(1)
{
if (pIXMLElement)
{
pIXMLElement->AddRef();
m_pIXMLElement = pIXMLElement;
}
m_fHasSubItems = fHasSubItems;
TraceMsg(TF_OBJECTS, "+ IQueryInfo");
DllAddRef();
return;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::~CQueryInfo ***
//
// Destructor.
//
////////////////////////////////////////////////////////////////////////////////
CQueryInfo::~CQueryInfo(
void
)
{
ASSERT(0 == m_cRef);
if (m_pIXMLElement)
m_pIXMLElement->Release();
TraceMsg(TF_OBJECTS, "- IQueryInfo");
DllRelease();
return;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::QueryInterface ***
//
// CQueryInfo QI.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CQueryInfo::QueryInterface (
REFIID riid,
void **ppv
)
{
ASSERT(ppv);
HRESULT hr;
*ppv = NULL;
if (IID_IUnknown == riid || IID_IQueryInfo == riid)
{
AddRef();
*ppv = (IQueryInfo*)this;
hr = S_OK;
}
else
{
hr = E_NOINTERFACE;
}
ASSERT((SUCCEEDED(hr) && *ppv) || (FAILED(hr) && NULL == *ppv));
return hr;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::AddRef ***
//
// CQueryInfo AddRef.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CQueryInfo::AddRef (
void
)
{
ASSERT(m_cRef != 0);
ASSERT(m_cRef < (ULONG)-1);
return ++m_cRef;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo::Release ***
//
// CQueryInfo Release.
//
////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG)
CQueryInfo::Release (
void
)
{
ASSERT (m_cRef != 0);
ULONG cRef = --m_cRef;
if (0 == cRef)
delete this;
return cRef;
}
//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// *** CQueryInfo:: ***
//
//
// Description:
// Returns an info tip for the current pidl.
//
// Parameters:
// [In] dwFlags -
// [Out] ppwszText - A pointer to a text buffer. MAX_PATH length assumed!
//
// Return:
// S_OK if the tip was extracted and returned.
// E_OUTOFMEMORY if not enough memory is available.
// E_FAIL otherwise.
//
// Comments:
//
//
////////////////////////////////////////////////////////////////////////////////
HRESULT
CQueryInfo::GetInfoTip(
DWORD dwFlags,
WCHAR** ppwszTip
)
{
ASSERT(ppwszTip);
*ppwszTip = NULL;
HRESULT hr;
if (m_pIXMLElement)
{
BSTR bstr;
bstr = XML_GetAttribute(m_pIXMLElement, XML_ABSTRACT);
if (bstr)
{
if (*bstr)
{
//
// REVIEW: SHAlloc correct allocator?
//
int cbSize = SysStringByteLen(bstr) + sizeof(WCHAR);
*ppwszTip = (WCHAR*)SHAlloc(cbSize);
if (*ppwszTip)
{
StrCpyW(*ppwszTip, bstr);
hr = S_OK;
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
//
// REVIEW: InfoTip when there is no abstract?
//
hr = E_FAIL;
}
SysFreeString(bstr);
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_OUTOFMEMORY;
}
ASSERT((SUCCEEDED(hr) && *ppwszTip) || (FAILED(hr) && *ppwszTip == NULL));
return hr;
}
HRESULT
CQueryInfo::GetInfoFlags(
DWORD *pdwFlags
)
{
ASSERT(pdwFlags);
HRESULT hr = S_OK;
if(!pdwFlags)
return E_INVALIDARG;
*pdwFlags = QIF_CACHED; // Assume cached by default
if (!m_fHasSubItems)
*pdwFlags |= QIF_DONTEXPANDFOLDER;
if (m_pIXMLElement)
{
BSTR bstrURL = XML_GetAttribute(m_pIXMLElement, XML_HREF);
if (bstrURL)
{
if (*bstrURL)
{
BOOL fCached;
//
// REVIEW: SHAlloc correct allocator?
//
fCached = CDFIDL_IsCachedURL(bstrURL);
if(!fCached)
*pdwFlags &= ~QIF_CACHED;
}
SysFreeString(bstrURL);
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
//
// If m_pIXMLElement is NULL either its a low memory situation, or
// the corresponding cdf is not in the cache.
//
*pdwFlags &= ~QIF_CACHED;
}
return hr;
}