windows-nt/Source/XPSP1/NT/net/upnp/upnpui/dll/ishellf2.cpp
2020-09-26 16:20:57 +08:00

398 lines
12 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: I S H E L L F 2 . C P P
//
// Contents: IShellFolder2 implementation for CUPnPDeviceFolder
//
// Notes: The IShellFolder2 interface extends the capabilities of
// IShellFolder. It provides the shell information that
// can be used to populate the column ("details") view.
//
// The methods of IShellFolder2 superset those of IShellFolder.
// This file only implements the methods specific to
// IShellFolder2.
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::GetDefaultSearchGUID
//
// Purpose: Returns the globally unique identifier (GUID) of the default
// search object for the folder.
//
// Arguments:
// lpGUID [out] GUID of the default search object.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::GetDefaultSearchGUID(GUID * pguid)
{
return E_NOTIMPL;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::EnumSearches
//
// Purpose: Requests a pointer to an interface that allows a client
// to enumerate the available search objects.
//
// Arguments:
// ppEnum [out] Address of a pointer to an enumerator
// object's IEnumExtraSearch interface.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::EnumSearches(IEnumExtraSearch ** ppenum)
{
return E_NOTIMPL;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::GetDefaultColumn
//
// Purpose: Gets the default sorting and display columns.
//
// Arguments:
// dwReserved [in] Reserved. Set to zero.
// pSort [out] Pointer to a value that receives the
// index of the default sorted column.
// pDisplay [out] Pointer to a value that receives the
// index of the default display column.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::GetDefaultColumn(DWORD dwRes,
ULONG * pSort,
ULONG * pDisplay)
{
return E_NOTIMPL;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::GetDefaultColumnState
//
// Purpose: Retrieves the default state for a specified column.
//
// Arguments:
// iColumn [in] Integer that specifies the column
// number.
// pcsFlags [out] Pointer to a value that contains flags
// that indicate the default column state.
// This parameter can include a combination
// of the SHCOLSTATE_* flags.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::GetDefaultColumnState(UINT iColumn, DWORD * pcsFlags)
{
return E_NOTIMPL;
}
//+---------------------------------------------------------------------------
//
// Function: HrVariantFromSz
//
// Purpose: Converts the given string into a variant to pass back from
// GetDetailsEx().
//
// Arguments:
// sz [in] String to convert
// pvar [out] Returns new allocated BSTR in variant
//
// Returns: S_OK if success, E_FAIL if string was empty, OLE error otherwise
//
// Author: danielwe 2001/05/3
//
// Notes: Nothing needs to be freed after this
//
HRESULT HrVariantFromSz(LPCWSTR sz, VARIANT *pvar)
{
HRESULT hr = S_OK;
if (*sz)
{
BSTR bstr;
bstr = ::SysAllocString(sz);
if (bstr)
{
V_VT(pvar) = VT_BSTR;
V_BSTR(pvar) = bstr;
}
else
{
hr = E_OUTOFMEMORY;
TraceError("HrVariantFromSz: SysAllocString", hr);
}
}
else
{
hr = E_FAIL;
}
TraceError("HrVariantFromSz", hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::GetDetailsEx
//
// Purpose: Retrieves detailed information, identified by a property
// set ID (FMTID) and property ID (PID), on an item in a shell
// folder.
//
// Arguments:
// pidl [in] PIDL of the item, relative to the
// parent folder. This method accepts
// only single-level PIDLs. The structure
// must contain exactly one SHITEMID
// structure followed by a terminating
// zero.
// pscid [in] Pointer to an SHCOLUMNID structure that
// identifies the column.
// pv [out] Pointer to a VARIANT with the requested
// information. The value will be fully
// typed.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes: In the "My Network Places" folder, there are two columns:
// "Name" and "Comment". The "Name" column should contain
// the display name (a.k.a. FriendlyName) of the device, which
// is returned by GetDisplayNameOf(). This supplies the value
// of the "Comment" column, which is:
// - the device's get_Description() property, if supplied
// - an empty string otherwise (returning an error yields this)
//
STDMETHODIMP
CUPnPDeviceFolder::GetDetailsEx(LPCITEMIDLIST pidl,
const SHCOLUMNID * pscid,
VARIANT * pv)
{
TraceTag(ttidShellFolderIface, "OBJ: CUPnPDeviceFolder::GetDetailsEx");
HRESULT hr;
PUPNPDEVICEFOLDPIDL pupdfp;
hr = S_OK;
pupdfp = NULL;
if (!pidl)
{
hr = E_INVALIDARG;
goto Cleanup;
}
if (!pscid)
{
hr = E_INVALIDARG;
goto Cleanup;
}
if (!pv)
{
hr = E_INVALIDARG;
goto Cleanup;
}
// Make sure that the pidls passed in are our pidls.
//
{
BOOL fResult;
fResult = FIsUPnPDeviceFoldPidl(pidl);
if (!fResult)
{
// not one of our PIDLs, can't do anything
hr = E_INVALIDARG;
goto Cleanup;
}
}
pupdfp = ConvertToUPnPDevicePIDL(pidl);
if (IsEqualGUID(pscid->fmtid, FMTID_SummaryInformation))
{
switch (pscid->pid)
{
case PIDSI_COMMENTS: // "Comment" column
{
CUPnPDeviceFoldPidl udfp;
hr = udfp.HrInit(pupdfp);
if (SUCCEEDED(hr))
{
hr = HrVariantFromSz(udfp.PszGetDescriptionPointer(), pv);
if (FAILED(hr))
{
goto Cleanup;
}
}
break;
}
default:
TraceTag(ttidShellFolderIface, "CUPnPDeviceFolder::GetDetailsEx: "
"Unknown column: %x", pscid->pid);
hr = E_FAIL;
goto Cleanup;
break;
}
}
else if (IsEqualGUID(pscid->fmtid, FMTID_ShellDetails))
{
switch (pscid->pid)
{
case PID_NETWORKLOCATION:
BSTR bstrLocation;
bstrLocation= ::SysAllocString(WszLoadIds(IDS_LOCAL_NETWORK));
if (bstrLocation)
{
V_VT(pv) = VT_BSTR;
V_BSTR(pv) = bstrLocation;
}
else
{
hr = E_OUTOFMEMORY;
TraceError("CUPnPDeviceFolder::GetDetailsEx: "
"SysAllocString", hr);
}
break;
case PID_COMPUTERNAME:
{
CUPnPDeviceFoldPidl udfp;
hr = udfp.HrInit(pupdfp);
if (SUCCEEDED(hr))
{
hr = HrVariantFromSz(udfp.PszGetNamePointer(), pv);
if (FAILED(hr))
{
goto Cleanup;
}
}
}
break;
default:
TraceTag(ttidShellFolderIface, "CUPnPDeviceFolder::GetDetailsEx: "
"Unknown column: %x", pscid->pid);
hr = E_FAIL;
goto Cleanup;
break;
}
}
else
{
// We have a guid we don't know about
//
TraceTag(ttidShellFolderIface, "CUPnPDeviceFolder::GetDetailsEx: "
"Unknown FMTID");
hr = E_FAIL;
goto Cleanup;
}
Assert(SUCCEEDED(hr));
Cleanup:
TraceError("CUPnPDeviceFolder::GetDetailsEx", hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::GetDetailsOf
//
// Purpose: Retrieves detailed information, identified by a column index,
// on an item in a shell folder.
//
// Arguments:
// pidl [in] PIDL of the item for which you are
// requesting information. This method
// accepts only single-level PIDLs. The
// structure must contain exactly one
// SHITEMID structure followed by a
// terminating zero. If this parameter is
// set to NULL, the title of the
// information field specified by iColumn
// is returned.
// iColumn [in] Zero-based index of the desired
// information field. It is identical to
// the column number of the information as
// it is displayed in a Details view.
// pDetails [out] Pointer to a SHELLDETAILS structure that
// contains the information.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::GetDetailsOf(LPCITEMIDLIST pidl,
UINT iColumn,
SHELLDETAILS * psd)
{
return E_NOTIMPL;
}
//+---------------------------------------------------------------------------
//
// Member: CUPnPDeviceFolder::MapColumnToSCID
//
// Purpose: Converts a column to the appropriate property set ID (FMTID)
// and property ID (PID).
//
// Arguments:
// iColumn [in] Integer that specifies the column
// number.
// pscid [out] Pointer to an SHCOLUMNID structure
// containing the FMTID and PID.
//
// Returns: Returns NOERROR if successful or an OLE-defined error
// value otherwise
//
// Notes:
//
STDMETHODIMP
CUPnPDeviceFolder::MapColumnToSCID(UINT iColumn,
SHCOLUMNID * pscid)
{
return E_NOTIMPL;
}