Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
e80d3d7c
Commit
e80d3d7c
authored
Jul 10, 1999
by
Juergen Schmied
Committed by
Alexandre Julliard
Jul 10, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Some more pidl-types.
Implementation of ILIsParent.
parent
9aef586e
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
82 additions
and
17 deletions
+82
-17
pidl.c
dlls/shell32/pidl.c
+69
-10
pidl.h
dlls/shell32/pidl.h
+13
-7
No files found.
dlls/shell32/pidl.c
View file @
e80d3d7c
...
...
@@ -26,6 +26,7 @@ DECLARE_DEBUG_CHANNEL(pidl)
DECLARE_DEBUG_CHANNEL
(
shell
)
static
char
*
szMyComp
=
"My Computer"
;
/* for comparing */
static
char
*
szNetHood
=
"Network Neighbourhood"
;
/* for comparing */
void
pdump
(
LPCITEMIDLIST
pidl
)
{
DWORD
type
;
...
...
@@ -53,7 +54,6 @@ void pdump (LPCITEMIDLIST pidl)
else
TRACE_
(
pidl
)(
"empty pidl (Desktop)
\n
"
);
}
#define BYTES_PRINTED 32
BOOL
pcheck
(
LPCITEMIDLIST
pidl
)
{
DWORD
type
,
ret
=
TRUE
;
...
...
@@ -68,14 +68,17 @@ BOOL pcheck (LPCITEMIDLIST pidl)
case
PT_MYCOMP
:
case
PT_SPECIAL
:
case
PT_DRIVE
:
case
PT_DRIVE1
:
case
PT_DRIVE2
:
case
PT_DRIVE3
:
case
PT_FOLDER
:
case
PT_VALUE
:
case
PT_DRIVE1
:
case
PT_FOLDER1
:
case
PT_WORKGRP
:
case
PT_COMP
:
case
PT_NETWORK
:
case
PT_SHARE
:
case
PT_IESPECIAL
:
break
;
default:
{
...
...
@@ -349,6 +352,11 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
ppidldata
=
_ILGetDataPointer
(
pidltemp2
);
szData2
=
_ILGetTextPointer
(
ppidldata
->
type
,
ppidldata
);
if
(
!
szData1
||
!
szData2
)
{
FIXME_
(
pidl
)(
"Failure getting text pointer"
);
return
FALSE
;
}
if
(
strcmp
(
szData1
,
szData2
)
!=
0
)
return
FALSE
;
...
...
@@ -367,10 +375,50 @@ BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
/*************************************************************************
* ILIsParent [SHELL32.23]
*
* parent=a/b child=a/b/c -> true, c is in folder a/b
* child=a/b/c/d -> false if bImmediate is true, d is not in folder a/b
* child=a/b/c/d -> true if bImmediate is false, d is in a subfolder of a/b
*/
DWORD
WINAPI
ILIsParent
(
DWORD
x
,
DWORD
y
,
DWORD
z
)
{
FIXME_
(
pidl
)(
"0x%08lx 0x%08lx 0x%08lx stub
\n
"
,
x
,
y
,
z
);
return
0
;
BOOL
WINAPI
ILIsParent
(
LPCITEMIDLIST
pidlParent
,
LPCITEMIDLIST
pidlChild
,
BOOL
bImmediate
)
{
LPPIDLDATA
ppidldata
;
CHAR
*
szData1
;
CHAR
*
szData2
;
LPITEMIDLIST
pParent
=
pidlParent
;
LPITEMIDLIST
pChild
=
pidlChild
;
TRACE_
(
pidl
)(
"%p %p %x
\n
"
,
pidlParent
,
pidlChild
,
bImmediate
);
if
(
pParent
->
mkid
.
cb
&&
pChild
->
mkid
.
cb
)
{
do
{
ppidldata
=
_ILGetDataPointer
(
pParent
);
szData1
=
_ILGetTextPointer
(
ppidldata
->
type
,
ppidldata
);
ppidldata
=
_ILGetDataPointer
(
pChild
);
szData2
=
_ILGetTextPointer
(
ppidldata
->
type
,
ppidldata
);
if
(
!
szData1
||
!
szData2
)
{
FIXME_
(
pidl
)(
"Failure getting text pointer"
);
return
FALSE
;
}
if
(
strcmp
(
szData1
,
szData2
)
!=
0
)
return
FALSE
;
pParent
=
ILGetNext
(
pParent
);
pChild
=
ILGetNext
(
pChild
);
}
while
(
pParent
->
mkid
.
cb
&&
pChild
->
mkid
.
cb
);
}
if
(
pParent
->
mkid
.
cb
||
!
pChild
->
mkid
.
cb
)
/* child shorter or has equal length to parent */
return
FALSE
;
if
(
ILGetNext
(
pChild
)
->
mkid
.
cb
&&
bImmediate
)
/* not immediate descent */
return
FALSE
;
return
TRUE
;
}
/*************************************************************************
...
...
@@ -848,7 +896,10 @@ BOOL WINAPI _ILIsMyComputer(LPCITEMIDLIST pidl)
BOOL
WINAPI
_ILIsDrive
(
LPCITEMIDLIST
pidl
)
{
LPPIDLDATA
lpPData
=
_ILGetDataPointer
(
pidl
);
TRACE_
(
pidl
)(
"(%p)
\n
"
,
pidl
);
return
(
pidl
&&
lpPData
&&
(
PT_DRIVE
==
lpPData
->
type
||
PT_DRIVE1
==
lpPData
->
type
));
return
(
pidl
&&
lpPData
&&
(
PT_DRIVE
==
lpPData
->
type
||
PT_DRIVE1
==
lpPData
->
type
||
PT_DRIVE2
==
lpPData
->
type
||
PT_DRIVE3
==
lpPData
->
type
));
}
BOOL
WINAPI
_ILIsFolder
(
LPCITEMIDLIST
pidl
)
...
...
@@ -1128,14 +1179,20 @@ LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
switch
(
type
)
{
case
PT_DRIVE
:
case
PT_DRIVE1
:
case
PT_DRIVE2
:
case
PT_DRIVE3
:
return
(
LPSTR
)
&
(
pidldata
->
u
.
drive
.
szDriveName
);
case
PT_MYCOMP
:
return
szMyComp
;
case
PT_SPECIAL
:
return
szNetHood
;
case
PT_FOLDER
:
case
PT_FOLDER1
:
case
PT_VALUE
:
case
PT_IESPECIAL
:
return
(
LPSTR
)
&
(
pidldata
->
u
.
file
.
szNames
);
case
PT_WORKGRP
:
...
...
@@ -1159,6 +1216,7 @@ LPSTR WINAPI _ILGetSTextPointer(PIDLTYPE type, LPPIDLDATA pidldata)
switch
(
type
)
{
case
PT_FOLDER
:
case
PT_VALUE
:
case
PT_IESPECIAL
:
return
(
LPSTR
)(
pidldata
->
u
.
file
.
szNames
+
strlen
(
pidldata
->
u
.
file
.
szNames
)
+
1
);
case
PT_WORKGRP
:
return
(
LPSTR
)(
pidldata
->
u
.
network
.
szNames
+
strlen
(
pidldata
->
u
.
network
.
szNames
)
+
1
);
...
...
@@ -1200,7 +1258,7 @@ BOOL WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
BOOL
WINAPI
_ILGetExtension
(
LPCITEMIDLIST
pidl
,
LPSTR
pOut
,
UINT
uOutSize
)
{
char
pTemp
[
MAX_PATH
];
int
i
;
const
char
*
pPoint
;
TRACE_
(
pidl
)(
"pidl=%p
\n
"
,
pidl
);
...
...
@@ -1208,12 +1266,13 @@ BOOL WINAPI _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
{
return
FALSE
;
}
for
(
i
=
0
;
pTemp
[
i
]
!=
'.'
&&
pTemp
[
i
];
i
++
);
pPoint
=
PathFindExtensionA
(
pTemp
);
if
(
!
pTemp
[
i
]
)
if
(
!
*
pPoint
)
return
FALSE
;
strncpy
(
pOut
,
&
pTemp
[
i
],
uOutSize
);
pPoint
++
;
strncpy
(
pOut
,
pPoint
,
uOutSize
);
TRACE_
(
pidl
)(
"%s
\n
"
,
pOut
);
return
TRUE
;
...
...
dlls/shell32/pidl.h
View file @
e80d3d7c
...
...
@@ -25,10 +25,13 @@
* The structure of the pidl seems to be a union. The first byte of the
* PIDLDATA desribes the type of pidl.
*
* object ! first byte ! format ! living space
* object ! first byte / ! format ! living space
* ! size
* ----------------------------------------------------------------
* my computer 0x1F mycomp (2) (usual)
* drive 0x23 drive (usual)
* my computer 0x1F/20 mycomp (2) (usual)
* drive 0x23/25 drive (usual)
* drive 0x25/25 drive (lnk/persistant)
* drive 0x29/25 drive
* control/printer 0x2E
* drive 0x2F drive (lnk/persistant)
* folder/file 0x30 folder/file (1) (lnk/persistant)
...
...
@@ -37,6 +40,7 @@
* workgroup 0x41 network (3)
* computer 0x42 network (4)
* whole network 0x47 network (5)
* history/favorites 0xb1 file
* share 0xc3 metwork (6)
*
* guess: the persistant elements are non tracking
...
...
@@ -52,6 +56,8 @@
#define PT_DESKTOP 0x00
/* internal */
#define PT_MYCOMP 0x1F
#define PT_DRIVE 0x23
#define PT_DRIVE2 0x25
#define PT_DRIVE3 0x29
#define PT_SPECIAL 0x2E
#define PT_DRIVE1 0x2F
#define PT_FOLDER1 0x30
...
...
@@ -60,6 +66,7 @@
#define PT_WORKGRP 0x41
#define PT_COMP 0x42
#define PT_NETWORK 0x47
#define PT_IESPECIAL 0xb1
#define PT_SHARE 0xc3
#include "pshpack1.h"
...
...
@@ -73,10 +80,9 @@ typedef struct tagPIDLDATA
GUID
guid
;
}
mycomp
;
struct
{
CHAR
szDriveName
[
4
];
/*01*/
/* end of MS compatible*/
DWORD
dwSFGAO
;
/*05*/
/* the drive seems to be 19 bytes every time */
{
CHAR
szDriveName
[
20
];
/*01*/
DWORD
dwUnknown
;
/*21*/
/* the drive seems to be 25 bytes every time */
}
drive
;
struct
{
BYTE
dummy
;
/*01 is 0x00 for files or dirs */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment