204 lines
6 KiB
C++
204 lines
6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: U P D P I D L . H
|
|
//
|
|
// Contents: UP Device Folder structures, classes, and prototypes
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: jeffspr 11 Nov 1997
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
#ifndef _UPDPIDL_H_
|
|
#define _UPDPIDL_H_
|
|
|
|
// Max sizes of our pidl fields
|
|
//
|
|
// $$REVIEW:
|
|
//
|
|
#define MAX_UPnPDeviceName MAX_PATH
|
|
#define MAX_UPnPURL MAX_PATH
|
|
#define MAX_UPnPUDN MAX_PATH
|
|
#define MAX_UPnPType MAX_PATH
|
|
#define MAX_UPnPDescription MAX_PATH
|
|
|
|
|
|
typedef LPITEMIDLIST PUPNPDEVICEFOLDPIDL;
|
|
|
|
// Pidl Version Definition
|
|
//
|
|
// This defines the version number of the ConFoldPidl structure. When this
|
|
// changes, we'll need to invalidate the entries.
|
|
// This has the following format:
|
|
// +-----------+-----------+
|
|
// | HIGH WORD | LOW WORD |
|
|
// +-----------+-----------+
|
|
// current lowest
|
|
// version version
|
|
// "current version" : the version of the shell code which
|
|
// created the PIDL
|
|
// "lowest version": the lowest version of the shell code
|
|
// which can read the PIDL
|
|
// example: shell code version "1" can read a PIDL marked
|
|
// as "0x00030001" but not one marked as "0x00050003".
|
|
// shell code version "3" can read a PIDL marked
|
|
// as "0x00030001" and get more information from it
|
|
// than a version "1" client.
|
|
//
|
|
#define UP_DEVICE_FOLDER_IDL_VERSION 0x00010001
|
|
|
|
class CUPnPDeviceFoldPidl
|
|
{
|
|
public:
|
|
CUPnPDeviceFoldPidl();
|
|
~CUPnPDeviceFoldPidl();
|
|
|
|
HRESULT HrInit(FolderDeviceNode * pDeviceNode);
|
|
|
|
HRESULT HrInit(PUPNPDEVICEFOLDPIDL pPidl);
|
|
|
|
HRESULT HrPersist(IMalloc * pMalloc, LPITEMIDLIST * ppidl);
|
|
|
|
PCWSTR PszGetNamePointer() const;
|
|
PCWSTR PszGetURLPointer() const;
|
|
PCWSTR PszGetUDNPointer() const;
|
|
PCWSTR PszGetTypePointer() const;
|
|
PCWSTR PszGetDescriptionPointer() const;
|
|
|
|
HRESULT HrSetName(PCWSTR szName);
|
|
|
|
private:
|
|
/* this is the structure of our PIDLs, in byte-order. All
|
|
numbers are saved as big-endian unsigned integers.
|
|
|
|
0 1 2 3 4 5 6 7 <- byte
|
|
| | | | | | | | |
|
|
+===============================+
|
|
| iCB |uLeadId| dwVersion |
|
|
+-------------------------------+
|
|
|uTrlId | VOID | dwUnusedFlags |
|
|
+-------------------------------+
|
|
| ulNameOffset | cbName |
|
|
+-------------------------------+
|
|
| ulUrlOffset | cbUrl |
|
|
+-------------------------------+
|
|
| ulUdnOffset | cbUdn |
|
|
+-------------------------------+
|
|
| ulTypeOffset | cbType |
|
|
+-------------------------------+
|
|
| ulDescOffset | cbDesc |
|
|
+-------------------------------+
|
|
| set of NULL-terminated |
|
|
| unicode strings, byte-packed. |
|
|
| The offset and length of a |
|
|
| given string is specified by |
|
|
| the headers above... |
|
|
/ /
|
|
+-------------------------------+
|
|
| 0 |
|
|
+-------+
|
|
|
|
the names in the table above represent
|
|
the following:
|
|
|
|
iCB: Total size of the structure
|
|
(including iCB itself).
|
|
[note: Milennium seems to
|
|
miscalculate this field, always
|
|
storing a value two greater than
|
|
what it really is. Oops.
|
|
If the "highest version" is
|
|
specified as 1, this bug should
|
|
be assumed.]
|
|
|
|
ulLeadId: Always UPNPDEVICEFOLDPIDL_LEADID
|
|
|
|
dwVersion: the min/max versions of the PIDL,
|
|
as described in "Pidl Version Definition"
|
|
above.
|
|
uTrlId: Always UPNPDEVICEFOLDPIDL_TRAILID
|
|
VOID: Not usable - these bytes are garbage
|
|
and can never be used
|
|
dwUnusedFlags: Flags for future use. These
|
|
are currently always set to zero.
|
|
|
|
ulNameOffset,
|
|
ulUrlOffset,
|
|
etc.: Offset of the string fields stored
|
|
in the variable-length section. The
|
|
offset given is relative to the start
|
|
of the variable-length section, not
|
|
from the start of the entire structure.
|
|
|
|
cbName, cbUrl,
|
|
etc.: Length, in bytes, of each string in
|
|
the variable-length section.
|
|
|
|
*/
|
|
|
|
LPWSTR m_pszName;
|
|
LPWSTR m_pszUrl;
|
|
LPWSTR m_pszUdn;
|
|
LPWSTR m_pszType;
|
|
LPWSTR m_pszDesc;
|
|
};
|
|
|
|
// IMPORTANT: you MUST declare pointers to this structure
|
|
// as UNALIGNED, or using it will break on win64, and
|
|
// cause performance degredation on axp
|
|
//
|
|
# pragma pack (1)
|
|
struct UPNPUI_PIDL_HEADER
|
|
{
|
|
WORD iCB; // 2 bytes
|
|
USHORT uLeadId; // 2 bytes
|
|
DWORD dwVersion; // 4 bytes
|
|
USHORT uTrailId; // 2 bytes
|
|
USHORT uVOID; // 2 bytes
|
|
DWORD dwCharacteristics; // 4 bytes
|
|
|
|
ULONG ulNameOffset; // 4 bytes
|
|
ULONG cbName; // etc...
|
|
ULONG ulUrlOffset;
|
|
ULONG cbUrl;
|
|
ULONG ulUdnOffset;
|
|
ULONG cbUdn;
|
|
ULONG ulTypeOffset;
|
|
ULONG cbType;
|
|
ULONG ulDescOffset;
|
|
ULONG cbDesc;
|
|
};
|
|
# pragma pack ()
|
|
|
|
|
|
// One of our pidls must be at least this size, it will likely be bigger.
|
|
//
|
|
#define CBUPNPDEVICEFOLDPIDL_MIN sizeof(UPNPUI_PIDL_HEADER)
|
|
|
|
// More versioning info. This will help me identify PIDLs as being mine
|
|
//
|
|
#define UPNPDEVICEFOLDPIDL_LEADID 0x6EFF
|
|
#define UPNPDEVICEFOLDPIDL_TRAILID 0x7EFF
|
|
|
|
#define UPNPDEVICEFOLDPIDL_MINVER(x) (LOWORD(x))
|
|
#define UPNPDEVICEFOLDPIDL_MAXVER(x) (HIWORD(x))
|
|
|
|
PUPNPDEVICEFOLDPIDL ConvertToUPnPDevicePIDL(LPCITEMIDLIST pidl);
|
|
BOOL FIsUPnPDeviceFoldPidl(LPCITEMIDLIST pidl);
|
|
|
|
HRESULT HrMakeUPnPDevicePidl(
|
|
LPWSTR pszName,
|
|
LPWSTR pszURL,
|
|
LPWSTR pszUDN,
|
|
LPWSTR pszType,
|
|
LPWSTR pszDescription,
|
|
LPITEMIDLIST * ppidl);
|
|
|
|
#endif // _UPDPIDL_H_
|
|
|