398 lines
12 KiB
C++
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;
|
|
}
|