556 lines
14 KiB
C
556 lines
14 KiB
C
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1999.
|
||
|
//
|
||
|
// File: U P N P F O L D . H
|
||
|
//
|
||
|
// Contents: CUPnPDeviceFolder object definition.
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: jeffspr 03 Sep 1999
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifndef _UPNPFOLD_H_
|
||
|
#define _UPNPFOLD_H_
|
||
|
|
||
|
#include <upnpshell.h>
|
||
|
#include <upclsid.h>
|
||
|
#include <shlguid.h>
|
||
|
#include <shlobj.h>
|
||
|
#include <shlobjp.h>
|
||
|
#include "pidlutil.h"
|
||
|
#include "nsbase.h"
|
||
|
#include "upsres.h"
|
||
|
#include "tfind.h"
|
||
|
#include "updpidl.h"
|
||
|
#include "clistndn.h"
|
||
|
|
||
|
//---[ Connection Folder Types ]----------------------------------------------
|
||
|
|
||
|
// The details list view columns. These are used by the view and
|
||
|
// context menus
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
ICOL_NAME = 0,
|
||
|
ICOL_URL, // 1
|
||
|
ICOL_UDN, // 2
|
||
|
ICOL_TYPE, // 3
|
||
|
ICOL_MAX // End of list.
|
||
|
};
|
||
|
|
||
|
|
||
|
// The details list view columns. These are used by the view and
|
||
|
// context menus
|
||
|
|
||
|
typedef struct tagCOLS
|
||
|
{
|
||
|
short int iColumn;
|
||
|
short int iStringRes;
|
||
|
short int iColumnSize;
|
||
|
short int iFormat;
|
||
|
} COLS;
|
||
|
|
||
|
|
||
|
DEFINE_GUID(IID_IExplorerToolbar, 0x8455F0C1L, 0x158F, 0x11D0, 0x89, 0xAE, 0x00, 0xA0, 0xC9, 0x0A, 0x90, 0xAC);
|
||
|
#define SID_SExplorerToolbar IID_IExplorerToolbar
|
||
|
|
||
|
struct __declspec(uuid("ADD8BA80-002B-11D0-8F0F-00C04FD7D062")) IDelegateFolder;
|
||
|
|
||
|
//---[ Connection Folder Classes ]--------------------------------------------
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolder :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolder, &CLSID_UPnPDeviceFolder>,
|
||
|
public IPersistFolder2,
|
||
|
public IShellExtInit,
|
||
|
public IShellFolder2, // includes IShellFolder
|
||
|
public IDelegateFolder,
|
||
|
public IOleCommandTarget
|
||
|
{
|
||
|
private:
|
||
|
LPITEMIDLIST m_pidlFolderRoot;
|
||
|
|
||
|
IMalloc * m_pMalloc;
|
||
|
IMalloc * m_pDelegateMalloc;
|
||
|
UINT m_cbDelegate; /* Size of delegate header (0 if not delegating) */
|
||
|
|
||
|
HRESULT HrMakeUPnPDevicePidl(IUPnPDevice * pdev,
|
||
|
LPITEMIDLIST * ppidl);
|
||
|
|
||
|
public:
|
||
|
|
||
|
CUPnPDeviceFolder();
|
||
|
~CUPnPDeviceFolder();
|
||
|
|
||
|
static HRESULT WINAPI UpdateRegistry(BOOL fRegister);
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolder)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolder)
|
||
|
COM_INTERFACE_ENTRY(IPersist)
|
||
|
COM_INTERFACE_ENTRY(IPersistFolder)
|
||
|
COM_INTERFACE_ENTRY(IPersistFolder2)
|
||
|
COM_INTERFACE_ENTRY(IShellExtInit)
|
||
|
COM_INTERFACE_ENTRY(IShellFolder)
|
||
|
// There's no __declspec(uuid(... entry for IShellFolder2, so we need
|
||
|
// to do this. See: "COM_INTERFACE_ENTRY Macros" in MSDN for more info
|
||
|
COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
|
||
|
COM_INTERFACE_ENTRY(IDelegateFolder)
|
||
|
COM_INTERFACE_ENTRY(IOleCommandTarget)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IPersist methods ***
|
||
|
STDMETHOD(GetClassID) (
|
||
|
LPCLSID lpClassID);
|
||
|
|
||
|
// *** IPersistFolder methods ***
|
||
|
STDMETHOD(Initialize) (
|
||
|
LPCITEMIDLIST pidl);
|
||
|
|
||
|
// *** IPersistFolder2 methods ***
|
||
|
STDMETHOD(GetCurFolder) (
|
||
|
LPITEMIDLIST *ppidl);
|
||
|
|
||
|
// *** IShellFolder methods ***
|
||
|
STDMETHOD(ParseDisplayName) (
|
||
|
HWND hwndOwner,
|
||
|
LPBC pbcReserved,
|
||
|
LPOLESTR lpszDisplayName,
|
||
|
ULONG * pchEaten,
|
||
|
LPITEMIDLIST * ppidl,
|
||
|
ULONG * pdwAttributes);
|
||
|
|
||
|
STDMETHOD(EnumObjects) (
|
||
|
HWND hwndOwner,
|
||
|
DWORD grfFlags,
|
||
|
LPENUMIDLIST * ppenumIDList);
|
||
|
|
||
|
STDMETHOD(BindToObject) (
|
||
|
LPCITEMIDLIST pidl,
|
||
|
LPBC pbcReserved,
|
||
|
REFIID riid,
|
||
|
LPVOID * ppvOut);
|
||
|
|
||
|
STDMETHOD(BindToStorage) (
|
||
|
LPCITEMIDLIST pidl,
|
||
|
LPBC pbcReserved,
|
||
|
REFIID riid,
|
||
|
LPVOID * ppvObj);
|
||
|
|
||
|
STDMETHOD(CompareIDs) (
|
||
|
LPARAM lParam,
|
||
|
LPCITEMIDLIST pidl1,
|
||
|
LPCITEMIDLIST pidl2);
|
||
|
|
||
|
STDMETHOD(CreateViewObject) (
|
||
|
HWND hwndOwner,
|
||
|
REFIID riid,
|
||
|
LPVOID * ppvOut);
|
||
|
|
||
|
STDMETHOD(GetAttributesOf) (
|
||
|
UINT cidl,
|
||
|
LPCITEMIDLIST * apidl,
|
||
|
ULONG * rgfInOut);
|
||
|
|
||
|
STDMETHOD(GetUIObjectOf) (
|
||
|
HWND hwndOwner,
|
||
|
UINT cidl,
|
||
|
LPCITEMIDLIST * apidl,
|
||
|
REFIID riid,
|
||
|
UINT * prgfInOut,
|
||
|
LPVOID * ppvOut);
|
||
|
|
||
|
STDMETHOD(GetDisplayNameOf) (
|
||
|
LPCITEMIDLIST pidl,
|
||
|
DWORD uFlags,
|
||
|
LPSTRRET lpName);
|
||
|
|
||
|
STDMETHOD(SetNameOf) (
|
||
|
HWND hwndOwner,
|
||
|
LPCITEMIDLIST pidl,
|
||
|
LPCOLESTR lpszName,
|
||
|
DWORD uFlags,
|
||
|
LPITEMIDLIST * ppidlOut);
|
||
|
|
||
|
// *** IShellFolder2 methods ***
|
||
|
STDMETHOD(GetDefaultSearchGUID) (
|
||
|
GUID * pguid);
|
||
|
|
||
|
STDMETHOD(EnumSearches) (
|
||
|
IEnumExtraSearch ** ppenum);
|
||
|
|
||
|
STDMETHOD(GetDefaultColumn) (
|
||
|
DWORD dwRes,
|
||
|
ULONG * pSort,
|
||
|
ULONG * pDisplay);
|
||
|
|
||
|
STDMETHOD(GetDefaultColumnState) (
|
||
|
UINT iColumn,
|
||
|
DWORD * pcsFlags);
|
||
|
|
||
|
STDMETHOD(GetDetailsEx) (
|
||
|
LPCITEMIDLIST pidl,
|
||
|
const SHCOLUMNID * pscid,
|
||
|
VARIANT * pv);
|
||
|
|
||
|
STDMETHOD(GetDetailsOf) (
|
||
|
LPCITEMIDLIST pidl,
|
||
|
UINT iColumn,
|
||
|
SHELLDETAILS * psd);
|
||
|
|
||
|
STDMETHOD(MapColumnToSCID) (
|
||
|
UINT iColumn,
|
||
|
SHCOLUMNID * pscid);
|
||
|
|
||
|
// *** IOleWindow methods ***
|
||
|
STDMETHOD(GetWindow) (
|
||
|
HWND * lphwnd);
|
||
|
|
||
|
STDMETHOD(ContextSensitiveHelp) (
|
||
|
BOOL fEnterMode);
|
||
|
|
||
|
// *** IShellExtInit methods ***
|
||
|
STDMETHOD(Initialize) (
|
||
|
LPCITEMIDLIST pidlFolder,
|
||
|
LPDATAOBJECT lpdobj,
|
||
|
HKEY hkeyProgID);
|
||
|
|
||
|
// IOleCommandTarget members
|
||
|
STDMETHODIMP QueryStatus(
|
||
|
const GUID * pguidCmdGroup,
|
||
|
ULONG cCmds,
|
||
|
OLECMD prgCmds[],
|
||
|
OLECMDTEXT * pCmdText);
|
||
|
|
||
|
STDMETHODIMP Exec(
|
||
|
const GUID * pguidCmdGroup,
|
||
|
DWORD nCmdID,
|
||
|
DWORD nCmdexecopt,
|
||
|
VARIANTARG * pvaIn,
|
||
|
VARIANTARG * pvaOut);
|
||
|
|
||
|
// *** IDelegateFolder members ***
|
||
|
STDMETHOD(SetItemAlloc)(
|
||
|
IMalloc *pmalloc);
|
||
|
|
||
|
// Other interfaces
|
||
|
LPITEMIDLIST PidlGetFolderRoot();
|
||
|
|
||
|
HRESULT HrMakeUPnPDevicePidl(FolderDeviceNode * pDeviceNode,
|
||
|
LPITEMIDLIST * ppidl);
|
||
|
};
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolderEnum :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolderEnum, &CLSID_UPnPDeviceEnum>,
|
||
|
public IEnumIDList
|
||
|
{
|
||
|
private:
|
||
|
LPITEMIDLIST m_pidlFolder;
|
||
|
|
||
|
CListFolderDeviceNode m_CListDevices;
|
||
|
DWORD m_cDevices;
|
||
|
|
||
|
DWORD m_dwFlags;
|
||
|
CUPnPDeviceFolder * m_psf;
|
||
|
|
||
|
BOOL m_fFirstEnumeration;
|
||
|
|
||
|
public:
|
||
|
|
||
|
CUPnPDeviceFolderEnum();
|
||
|
~CUPnPDeviceFolderEnum();
|
||
|
|
||
|
VOID Initialize(
|
||
|
LPITEMIDLIST pidlFolder,
|
||
|
CUPnPDeviceFolder * psf
|
||
|
);
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolderEnum)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolderEnum)
|
||
|
COM_INTERFACE_ENTRY(IEnumIDList)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IEnumIDList methods ***
|
||
|
STDMETHOD(Next) (
|
||
|
ULONG celt,
|
||
|
LPITEMIDLIST * rgelt,
|
||
|
ULONG * pceltFetched);
|
||
|
|
||
|
STDMETHOD(Skip) (
|
||
|
ULONG celt);
|
||
|
|
||
|
STDMETHOD(Reset) ();
|
||
|
|
||
|
STDMETHOD(Clone) (
|
||
|
IEnumIDList ** ppenum);
|
||
|
|
||
|
public:
|
||
|
static HRESULT CreateInstance (
|
||
|
REFIID riid,
|
||
|
void** ppv);
|
||
|
|
||
|
private:
|
||
|
VOID BuildCurrentDeviceList();
|
||
|
};
|
||
|
|
||
|
struct __declspec(uuid("000214ec-0000-0000-c000-000000000046")) IShellDetails;
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolderDetails :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolderDetails, &CLSID_UPnPDeviceDetails>,
|
||
|
public IShellDetails
|
||
|
{
|
||
|
private:
|
||
|
HWND m_hwndOwner;
|
||
|
|
||
|
public:
|
||
|
CUPnPDeviceFolderDetails();
|
||
|
~CUPnPDeviceFolderDetails();
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolderDetails)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolderDetails)
|
||
|
COM_INTERFACE_ENTRY(IShellDetails)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IShellDetails methods ***
|
||
|
STDMETHOD(GetDetailsOf)(
|
||
|
LPCITEMIDLIST pidl,
|
||
|
UINT iColumn,
|
||
|
LPSHELLDETAILS pDetails);
|
||
|
|
||
|
STDMETHOD(ColumnClick)(
|
||
|
UINT iColumn);
|
||
|
|
||
|
HRESULT HrInitialize(HWND hwndOwner);
|
||
|
|
||
|
public:
|
||
|
static HRESULT CreateInstance (
|
||
|
REFIID riid,
|
||
|
void** ppv);
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
typedef enum CMENU_TYPE
|
||
|
{
|
||
|
CMT_OBJECT = 1,
|
||
|
CMT_BACKGROUND = 2
|
||
|
};
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolderContextMenu :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolderContextMenu, &CLSID_UPnPDeviceContextMenu>,
|
||
|
public IContextMenu
|
||
|
{
|
||
|
private:
|
||
|
HWND m_hwndOwner;
|
||
|
LPITEMIDLIST * m_apidl;
|
||
|
ULONG m_cidl;
|
||
|
LPSHELLFOLDER m_psf;
|
||
|
CMENU_TYPE m_cmt;
|
||
|
|
||
|
public:
|
||
|
CUPnPDeviceFolderContextMenu();
|
||
|
~CUPnPDeviceFolderContextMenu();
|
||
|
|
||
|
// DECLARE_REGISTRY_RESOURCEID(IDR_UPNPFOLDCONTEXTMENU)
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolderContextMenu)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolderContextMenu)
|
||
|
COM_INTERFACE_ENTRY(IContextMenu)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IContextMenu methods ***
|
||
|
|
||
|
STDMETHOD(QueryContextMenu) (
|
||
|
HMENU hmenu,
|
||
|
UINT indexMenu,
|
||
|
UINT idCmdFirst,
|
||
|
UINT idCmdLast,
|
||
|
UINT uFlags);
|
||
|
|
||
|
STDMETHOD(InvokeCommand) (
|
||
|
LPCMINVOKECOMMANDINFO lpici);
|
||
|
|
||
|
STDMETHOD(GetCommandString) (
|
||
|
UINT_PTR idCmd,
|
||
|
UINT uType,
|
||
|
UINT * pwReserved,
|
||
|
PSTR pszName,
|
||
|
UINT cchMax);
|
||
|
|
||
|
public:
|
||
|
static HRESULT CreateInstance (
|
||
|
REFIID riid,
|
||
|
void** ppv,
|
||
|
CMENU_TYPE cmt,
|
||
|
HWND hwndOwner,
|
||
|
UINT cidl,
|
||
|
LPCITEMIDLIST * apidl,
|
||
|
LPSHELLFOLDER psf);
|
||
|
|
||
|
private:
|
||
|
HRESULT HrInitialize(
|
||
|
CMENU_TYPE cmt,
|
||
|
HWND hwndOwner,
|
||
|
UINT cidl,
|
||
|
LPCITEMIDLIST * apidl,
|
||
|
LPSHELLFOLDER psf);
|
||
|
};
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolderExtractIcon :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolderExtractIcon, &CLSID_UPnPDeviceExtractIcon>,
|
||
|
public IExtractIconW,
|
||
|
public IExtractIconA
|
||
|
{
|
||
|
private:
|
||
|
BSTR m_DeviceType;
|
||
|
BSTR m_DeviceUDN; // Not used currently. Needed for downloading device specific icon
|
||
|
|
||
|
HRESULT HrLoadIcons(
|
||
|
PCWSTR pszFile,
|
||
|
UINT nIconIndex,
|
||
|
int nSizeLarge,
|
||
|
int nSizeSmall,
|
||
|
HICON * phiconLarge,
|
||
|
HICON * phiconSmall);
|
||
|
public:
|
||
|
CUPnPDeviceFolderExtractIcon();
|
||
|
~CUPnPDeviceFolderExtractIcon();
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolderExtractIcon)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolderExtractIcon)
|
||
|
COM_INTERFACE_ENTRY(IExtractIconW)
|
||
|
COM_INTERFACE_ENTRY(IExtractIconA)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IExtractIconW methods ***
|
||
|
STDMETHOD(GetIconLocation) (
|
||
|
UINT uFlags,
|
||
|
PWSTR szIconFile,
|
||
|
UINT cchMax,
|
||
|
int * piIndex,
|
||
|
UINT * pwFlags);
|
||
|
|
||
|
STDMETHOD(Extract) (
|
||
|
PCWSTR pszFile,
|
||
|
UINT nIconIndex,
|
||
|
HICON * phiconLarge,
|
||
|
HICON * phiconSmall,
|
||
|
UINT nIconSize);
|
||
|
|
||
|
// *** IExtractIcon methods ***
|
||
|
STDMETHOD(GetIconLocation) (
|
||
|
UINT uFlags,
|
||
|
PSTR szIconFile,
|
||
|
UINT cchMax,
|
||
|
int * piIndex,
|
||
|
UINT * pwFlags);
|
||
|
|
||
|
STDMETHOD(Extract) (
|
||
|
PCSTR pszFile,
|
||
|
UINT nIconIndex,
|
||
|
HICON * phiconLarge,
|
||
|
HICON * phiconSmall,
|
||
|
UINT nIconSize);
|
||
|
|
||
|
public:
|
||
|
static HRESULT CreateInstance (
|
||
|
LPCITEMIDLIST apidl,
|
||
|
REFIID riid,
|
||
|
void** ppv);
|
||
|
|
||
|
HRESULT Initialize(
|
||
|
LPCITEMIDLIST apidl);
|
||
|
|
||
|
};
|
||
|
|
||
|
class ATL_NO_VTABLE CUPnPDeviceFolderQueryInfo :
|
||
|
public CComObjectRootEx <CComMultiThreadModel>,
|
||
|
public CComCoClass <CUPnPDeviceFolderQueryInfo, &CLSID_UPnPDeviceQueryInfo>,
|
||
|
public IQueryInfo
|
||
|
{
|
||
|
private:
|
||
|
LPITEMIDLIST m_pidl;
|
||
|
|
||
|
public:
|
||
|
CUPnPDeviceFolderQueryInfo();
|
||
|
~CUPnPDeviceFolderQueryInfo();
|
||
|
|
||
|
VOID PidlInitialize(LPITEMIDLIST pidl)
|
||
|
{
|
||
|
m_pidl = (pidl) ? CloneIDL (pidl) : NULL;
|
||
|
}
|
||
|
|
||
|
DECLARE_NOT_AGGREGATABLE(CUPnPDeviceFolderQueryInfo)
|
||
|
|
||
|
BEGIN_COM_MAP(CUPnPDeviceFolderQueryInfo)
|
||
|
COM_INTERFACE_ENTRY(IQueryInfo)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
// *** IQueryInfo methods ***
|
||
|
STDMETHOD(GetInfoTip) (
|
||
|
DWORD dwFlags,
|
||
|
WCHAR **ppwszTip);
|
||
|
|
||
|
STDMETHOD(GetInfoFlags) (
|
||
|
DWORD *pdwFlags);
|
||
|
|
||
|
public:
|
||
|
static HRESULT CreateInstance (
|
||
|
REFIID riid,
|
||
|
void** ppv);
|
||
|
};
|
||
|
|
||
|
//---[ Helper Functions ]------------------------------------------------------
|
||
|
|
||
|
HRESULT HrRegisterFolderClass(VOID);
|
||
|
HRESULT HrUnRegisterDelegateFolderKey(VOID);
|
||
|
HRESULT HrUnRegisterUPnPUIKey(VOID);
|
||
|
|
||
|
HRESULT CALLBACK HrShellViewCallback(
|
||
|
IShellView * psvOuter,
|
||
|
IShellFolder * psf,
|
||
|
HWND hwnd,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam);
|
||
|
|
||
|
HRESULT CALLBACK HrShellContextMenuCallback(
|
||
|
LPSHELLFOLDER psf,
|
||
|
HWND hwndView,
|
||
|
LPDATAOBJECT pdtobj,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam);
|
||
|
|
||
|
HRESULT HrDataObjGetHIDA(
|
||
|
IDataObject * pdtobj,
|
||
|
STGMEDIUM * pmedium,
|
||
|
LPIDA * ppida);
|
||
|
|
||
|
VOID HIDAReleaseStgMedium(
|
||
|
LPIDA pida,
|
||
|
STGMEDIUM * pmedium);
|
||
|
|
||
|
HRESULT HrSHReleaseStgMedium(
|
||
|
LPSTGMEDIUM pmedium);
|
||
|
|
||
|
LPITEMIDLIST ILFromHIDA(
|
||
|
LPIDA pida,
|
||
|
UINT iPidaIndex);
|
||
|
|
||
|
#endif // _UPNPFOLD_H_
|