Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
wine
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jason Beetham
wine
Commits
3539693b
Commit
3539693b
authored
25 years ago
by
Juergen Schmied
Committed by
Alexandre Julliard
25 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Better DropTarget.
parent
e2051cd0
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dlls/shell32/shlfolder.c
+372
-251
372 additions, 251 deletions
dlls/shell32/shlfolder.c
with
372 additions
and
251 deletions
dlls/shell32/shlfolder.c
+
372
−
251
View file @
3539693b
...
...
@@ -2,7 +2,7 @@
* Shell Folder stuff
*
* Copyright 1997 Marcus Meissner
* Copyright 1998 Juergen Schmied
* Copyright 1998
, 1999
Juergen Schmied
*
* IShellFolder with IDropTarget, IPersistFolder
*
...
...
@@ -26,159 +26,7 @@
DEFAULT_DEBUG_CHANNEL
(
shell
)
/***************************************************************************
* IDropTarget interface definition for the ShellFolder
*/
typedef
struct
{
ICOM_VTABLE
(
IDropTarget
)
*
lpvtbl
;
ULONG
ref
;
}
ISFDropTarget
;
static
struct
ICOM_VTABLE
(
IDropTarget
)
dtvt
;
/****************************************************************************
* ISFDropTarget implementation
*/
static
IDropTarget
*
WINAPI
ISFDropTarget_Constructor
(
void
)
{
ISFDropTarget
*
sf
;
sf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
ISFDropTarget
));
if
(
sf
)
{
sf
->
lpvtbl
=
&
dtvt
;
sf
->
ref
=
1
;
}
return
(
IDropTarget
*
)
sf
;
}
static
HRESULT
WINAPI
ISFDropTarget_QueryInterface
(
IDropTarget
*
iface
,
REFIID
riid
,
LPVOID
*
ppvObj
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
char
xriid
[
50
];
WINE_StringFromCLSID
((
LPCLSID
)
riid
,
xriid
);
TRACE
(
"(%p)->(
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
xriid
,
ppvObj
);
if
(
!
This
||
!
ppvObj
)
return
E_INVALIDARG
;
*
ppvObj
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IUnknown
))
/*IUnknown*/
{
*
ppvObj
=
This
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
/*IShellFolder*/
{
*
ppvObj
=
(
ISFDropTarget
*
)
This
;
}
if
(
*
ppvObj
)
{
IDropTarget_AddRef
((
IDropTarget
*
)
*
ppvObj
);
TRACE
(
"-- Interface: (%p)->(%p)
\n
"
,
ppvObj
,
*
ppvObj
);
return
S_OK
;
}
TRACE
(
"-- Interface: E_NOINTERFACE
\n
"
);
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
ISFDropTarget_AddRef
(
IDropTarget
*
iface
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
TRACE
(
"(%p)->(count=%lu)
\n
"
,
This
,
This
->
ref
);
shell32_ObjCount
++
;
return
++
(
This
->
ref
);
}
static
ULONG
WINAPI
ISFDropTarget_Release
(
IDropTarget
*
iface
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
shell32_ObjCount
--
;
if
(
!--
(
This
->
ref
))
{
TRACE
(
"-- destroying ISFDropTarget (%p)
\n
"
,
This
);
HeapFree
(
GetProcessHeap
(),
0
,
This
);
return
0
;
}
return
This
->
ref
;
}
static
HRESULT
WINAPI
ISFDropTarget_DragEnter
(
IDropTarget
*
iface
,
IDataObject
*
pDataObject
,
DWORD
grfKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
FIXME
(
"Stub: This=%p, DataObject=%p
\n
"
,
This
,
pDataObject
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
ISFDropTarget_DragOver
(
IDropTarget
*
iface
,
DWORD
grfKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
FIXME
(
"Stub: This=%p
\n
"
,
This
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
ISFDropTarget_DragLeave
(
IDropTarget
*
iface
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
FIXME
(
"Stub: This=%p
\n
"
,
This
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
ISFDropTarget_Drop
(
IDropTarget
*
iface
,
IDataObject
*
pDataObject
,
DWORD
grfKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
ICOM_THIS
(
ISFDropTarget
,
iface
);
FIXME
(
"Stub: This=%p
\n
"
,
This
);
return
E_NOTIMPL
;
}
static
struct
ICOM_VTABLE
(
IDropTarget
)
dtvt
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
ISFDropTarget_QueryInterface
,
ISFDropTarget_AddRef
,
ISFDropTarget_Release
,
ISFDropTarget_DragEnter
,
ISFDropTarget_DragOver
,
ISFDropTarget_DragLeave
,
ISFDropTarget_Drop
};
#define MEM_DEBUG 1
/***************************************************************************
* GetNextElement (internal function)
...
...
@@ -276,10 +124,11 @@ static HRESULT SHELL32_CoCreateInitSF (
*
ppvOut
=
NULL
;
hr
=
SHCoCreateInstance
(
NULL
,
clsid
,
NULL
,
iid
,
(
LPVOID
*
)
&
pShellFolder
);
/* we have to ask first for IPersistFolder, some special folders are expecting this */
hr
=
SHCoCreateInstance
(
NULL
,
clsid
,
NULL
,
&
IID_IPersistFolder
,
(
LPVOID
*
)
&
pPersistFolder
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
I
Shell
Folder_QueryInterface
(
p
ShellFolder
,
&
IID_I
PersistFolder
,
(
LPVOID
*
)
&
p
Persist
Folder
);
hr
=
I
Persist
Folder_QueryInterface
(
pPersistFolder
,
iid
,
(
LPVOID
*
)
&
p
Shell
Folder
);
if
(
SUCCEEDED
(
hr
))
{
absPidl
=
ILCombine
(
pidlRoot
,
pidlChild
);
...
...
@@ -319,14 +168,7 @@ static HRESULT SHELL32_GetDisplayNameOfChild(
hr
=
IShellFolder_GetDisplayNameOf
(
psfChild
,
pidlNext
,
dwFlags
|
SHGDN_INFOLDER
,
&
strTemp
);
if
(
SUCCEEDED
(
hr
))
{
if
(
strTemp
.
uType
==
STRRET_CSTRA
)
{
lstrcpynA
(
szOut
,
strTemp
.
u
.
cStr
,
dwOutLen
);
}
else
{
FIXME
(
"wrong return type"
);
}
hr
=
StrRetToStrNA
(
szOut
,
dwOutLen
,
&
strTemp
,
pidlNext
);
}
IShellFolder_Release
(
psfChild
);
...
...
@@ -349,20 +191,44 @@ typedef struct
DWORD
ref
;
ICOM_VTABLE
(
IPersistFolder
)
*
lpvtblPersistFolder
;
ICOM_VTABLE
(
IDropTarget
)
*
lpvtblDropTarget
;
CLSID
*
pclsid
;
LPSTR
sMyPath
;
LPITEMIDLIST
absPidl
;
/* complete pidl */
UINT
cfShellIDList
;
/* clipboardformat for IDropTarget */
BOOL
fAcceptFmt
;
/* flag for pending Drop */
}
IGenericSFImpl
;
static
struct
ICOM_VTABLE
(
IShellFolder
)
sfvt
;
static
struct
ICOM_VTABLE
(
IPersistFolder
)
psfvt
;
static
struct
ICOM_VTABLE
(
IDropTarget
)
dtvt
;
static
IShellFolder
*
ISF_MyComputer_Constructor
(
void
);
#define _IPersistFolder_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblPersistFolder)))
#define _ICOM_THIS_From_IPersistFolder(class, name) class* This = (class*)(((char*)name)-_IPersistFolder_Offset);
static
struct
ICOM_VTABLE
(
IDropTarget
)
dtvt
;
#define _IDropTarget_Offset ((int)(&(((IGenericSFImpl*)0)->lpvtblDropTarget)))
#define _ICOM_THIS_From_IDropTarget(class, name) class* This = (class*)(((char*)name)-_IDropTarget_Offset);
/**************************************************************************
* registers clipboardformat once
*/
static
void
SF_RegisterClipFmt
(
IShellFolder
*
iface
)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
if
(
!
This
->
cfShellIDList
)
{
This
->
cfShellIDList
=
RegisterClipboardFormatA
(
CFSTR_SHELLIDLIST
);
}
}
/**************************************************************************
* IShellFolder_Constructor
...
...
@@ -382,8 +248,11 @@ static IShellFolder * IShellFolder_Constructor(
sf
->
lpvtbl
=&
sfvt
;
sf
->
lpvtblPersistFolder
=&
psfvt
;
sf
->
lpvtblDropTarget
=&
dtvt
;
sf
->
pclsid
=
(
CLSID
*
)
&
CLSID_SFFile
;
sf
->
cfShellIDList
=
0
;
sf
->
fAcceptFmt
=
FALSE
;
TRACE
(
"(%p)->(parent=%p, pidl=%p)
\n
"
,
sf
,
sfParent
,
pidl
);
pdump
(
pidl
);
...
...
@@ -449,19 +318,27 @@ static HRESULT WINAPI IShellFolder_fnQueryInterface(
{
*
ppvObj
=
This
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellFolder
))
{
*
ppvObj
=
(
IShellFolder
*
)
This
;
}
{
*
ppvObj
=
(
IShellFolder
*
)
This
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IPersist
))
{
*
ppvObj
=
(
IPersistFolder
*
)
&
(
This
->
lpvtblPersistFolder
);
}
{
*
ppvObj
=
(
IPersistFolder
*
)
&
(
This
->
lpvtblPersistFolder
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IPersistFolder
))
{
*
ppvObj
=
(
IPersistFolder
*
)
&
(
This
->
lpvtblPersistFolder
);
}
{
*
ppvObj
=
(
IPersistFolder
*
)
&
(
This
->
lpvtblPersistFolder
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
{
*
ppvObj
=
(
IDropTarget
*
)
&
(
This
->
lpvtblDropTarget
);
SF_RegisterClipFmt
((
IShellFolder
*
)
This
);
}
if
(
*
ppvObj
)
{
IUnknown_AddRef
((
IUnknown
*
)(
*
ppvObj
));
TRACE
(
"-- Interface
: (%p)->(
%p
)
\n
"
,
ppvObj
,
*
ppvObj
);
TRACE
(
"-- Interface
=
%p
\n
"
,
*
ppvObj
);
return
S_OK
;
}
TRACE
(
"-- Interface: E_NOINTERFACE
\n
"
);
...
...
@@ -476,6 +353,9 @@ static ULONG WINAPI IShellFolder_fnAddRef(IShellFolder * iface)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
#ifdef MEM_DEBUG
TRACE
(
"called from: 0x%08x
\n
"
,
*
(
((
UINT
*
)
&
iface
)
-
1
));
#endif
TRACE
(
"(%p)->(count=%lu)
\n
"
,
This
,
This
->
ref
);
shell32_ObjCount
++
;
...
...
@@ -489,6 +369,9 @@ static ULONG WINAPI IShellFolder_fnRelease(IShellFolder * iface)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
#ifdef MEM_DEBUG
TRACE
(
"called from: 0x%08x
\n
"
,
*
(
((
UINT
*
)
&
iface
)
-
1
));
#endif
TRACE
(
"(%p)->(count=%lu)
\n
"
,
This
,
This
->
ref
);
shell32_ObjCount
--
;
...
...
@@ -643,7 +526,7 @@ static HRESULT WINAPI IShellFolder_fnBindToObject( IShellFolder * iface, LPCITEM
*
ppvOut
=
NULL
;
if
((
iid
=
_ILGetGUIDPointer
(
pidl
))
&&
!
IsEqualIID
(
iid
,
&
IID_MyComputer
)
)
if
((
iid
=
_ILGetGUIDPointer
(
pidl
)))
{
/* we have to create a alien folder */
if
(
SUCCEEDED
(
SHCoCreateInstance
(
NULL
,
iid
,
NULL
,
riid
,
(
LPVOID
*
)
&
pShellFolder
))
...
...
@@ -811,39 +694,43 @@ static HRESULT WINAPI IShellFolder_fnCompareIDs(
}
/**************************************************************************
* IShellFolder_fnCreateViewObject
* Creates an View Object representing the ShellFolder
* IShellView / IShellBrowser / IContextMenu
*
* PARAMETERS
* HWND hwndOwner, // Handle of owner window
* REFIID riid, // Requested initial interface
* LPVOID* ppvObject) // Resultant interface*
*
* NOTES
* the same as SHCreateShellFolderViewEx ???
* IShellFolder_fnCreateViewObject
*/
static
HRESULT
WINAPI
IShellFolder_fnCreateViewObject
(
IShellFolder
*
iface
,
HWND
hwndOwner
,
REFIID
riid
,
LPVOID
*
ppvOut
)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
LPSHELLVIEW
pShellView
;
char
xriid
[
50
];
HRESULT
hr
;
LPSHELLVIEW
pShellView
;
char
xriid
[
50
];
HRESULT
hr
=
E_INVALIDARG
;
WINE_StringFromCLSID
(
riid
,
xriid
);
TRACE
(
"(%p)->(hwnd=0x%x,
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
hwndOwner
,
xriid
,
ppvOut
);
*
ppvOut
=
NULL
;
pShellView
=
IShellView_Constructor
((
IShellFolder
*
)
This
)
;
if
(
ppvOut
)
{
*
ppvOut
=
NULL
;
if
(
!
pShellView
)
return
E_OUTOFMEMORY
;
hr
=
pShellView
->
lpvtbl
->
fnQueryInterface
(
pShellView
,
riid
,
ppvOut
);
pShellView
->
lpvtbl
->
fnRelease
(
pShellView
);
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
{
hr
=
IShellFolder_QueryInterface
((
IShellFolder
*
)
This
,
&
IID_IDropTarget
,
ppvOut
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
))
{
FIXME
(
"IContextMenu not implemented
\n
"
);
hr
=
E_NOTIMPL
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellView
))
{
pShellView
=
IShellView_Constructor
((
IShellFolder
*
)
This
);
if
(
pShellView
)
{
hr
=
IShellView_QueryInterface
(
pShellView
,
riid
,
ppvOut
);
IShellView_Release
(
pShellView
);
}
}
}
TRACE
(
"-- (%p)->(interface=%p)
\n
"
,
This
,
ppvOut
);
return
hr
;
}
...
...
@@ -925,59 +812,50 @@ static HRESULT WINAPI IShellFolder_fnGetUIObjectOf(
char
xclsid
[
50
];
LPITEMIDLIST
pidl
;
LPUNKNOWN
pObj
=
NULL
;
IUnknown
*
pObj
=
NULL
;
HRESULT
hr
=
E_INVALIDARG
;
WINE_StringFromCLSID
(
riid
,
xclsid
);
TRACE
(
"(%p)->(%u,%u,apidl=%p,
\n\t
IID:%s,%p,%p)
\n
"
,
This
,
hwndOwner
,
cidl
,
apidl
,
xclsid
,
prgfInOut
,
ppvOut
);
if
(
!
ppvOut
)
return
E_INVALIDARG
;
*
ppvOut
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
))
{
if
(
cidl
<
1
)
return
E_INVALIDARG
;
pObj
=
(
LPUNKNOWN
)
IContextMenu_Constructor
((
IShellFolder
*
)
This
,
This
->
absPidl
,
apidl
,
cidl
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
))
{
if
(
cidl
<
1
)
return
E_INVALIDARG
;
if
(
ppvOut
)
{
*
ppvOut
=
NULL
;
pObj
=
(
LPUNKNOWN
)
IDataObject_Constructor
(
hwndOwner
,
This
->
absPidl
,
apidl
,
cidl
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IExtractIconA
))
{
if
(
cidl
!=
1
)
return
E_INVALIDARG
;
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
IContextMenu_Constructor
((
IShellFolder
*
)
This
,
This
->
absPidl
,
apidl
,
cidl
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
IDataObject_Constructor
(
hwndOwner
,
This
->
absPidl
,
apidl
,
cidl
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IExtractIconA
)
&&
(
cidl
==
1
))
{
pidl
=
ILCombine
(
This
->
absPidl
,
apidl
[
0
]);
pObj
=
(
LPUNKNOWN
)
IExtractIconA_Constructor
(
pidl
);
SHFree
(
pidl
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
)
&&
(
cidl
>=
1
))
{
hr
=
IShellFolder_QueryInterface
((
IShellFolder
*
)
This
,
&
IID_IDropTarget
,
(
LPVOID
*
)
&
pObj
);
}
else
{
hr
=
E_NOINTERFACE
;
}
pidl
=
ILCombine
(
This
->
absPidl
,
apidl
[
0
]);
pObj
=
(
LPUNKNOWN
)
IExtractIconA_Constructor
(
pidl
);
SHFree
(
pidl
);
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
{
if
(
cidl
<
1
)
return
E_INVALIDARG
;
if
(
!
pObj
)
hr
=
E_OUTOFMEMORY
;
pObj
=
(
LPUNKNOWN
)
ISFDropTarget_Constructor
();
}
else
{
ERR
(
"(%p)->E_NOINTERFACE
\n
"
,
This
);
return
E_NOINTERFACE
;
*
ppvOut
=
pObj
;
}
if
(
!
pObj
)
return
E_OUTOFMEMORY
;
*
ppvOut
=
pObj
;
return
S_OK
;
TRACE
(
"(%p)->hr=0x%08lx
\n
"
,
This
,
hr
);
return
hr
;
}
/**************************************************************************
...
...
@@ -1264,18 +1142,27 @@ static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder * iface, LPCITEMI
*
ppvOut
=
NULL
;
if
(
!
(
clsid
=
_ILGetGUIDPointer
(
pidl
)))
return
E_INVALIDARG
;
if
(
IsEqualIID
(
clsid
,
&
IID_MyComputer
))
if
((
clsid
=
_ILGetGUIDPointer
(
pidl
)))
{
pShellFolder
=
ISF_MyComputer_Constructor
();
}
if
(
IsEqualIID
(
clsid
,
&
IID_MyComputer
))
{
pShellFolder
=
ISF_MyComputer_Constructor
();
}
else
{
/* shell extension */
if
(
!
SUCCEEDED
(
SHELL32_CoCreateInitSF
(
This
->
absPidl
,
pidl
,
clsid
,
riid
,
(
LPVOID
*
)
&
pShellFolder
)))
{
return
E_INVALIDARG
;
}
}
}
else
{
if
(
!
SUCCEEDED
(
SHELL32_CoCreateInitSF
(
This
->
absPidl
,
pidl
,
clsid
,
riid
,
(
LPVOID
*
)
&
pShellFolder
)))
{
return
E_INVALIDARG
;
}
/* file system folder on the desktop */
LPITEMIDLIST
pidltemp
=
ILCloneFirst
(
pidl
);
pShellFolder
=
IShellFolder_Constructor
((
IShellFolder
*
)
This
,
pidltemp
)
;
ILFree
(
pidltemp
);
}
if
(
_ILIsPidlSimple
(
pidl
))
/* no sub folders */
...
...
@@ -1294,6 +1181,49 @@ static HRESULT WINAPI ISF_Desktop_fnBindToObject( IShellFolder * iface, LPCITEMI
return
S_OK
;
}
/**************************************************************************
* ISF_Desktop_fnCreateViewObject
*/
static
HRESULT
WINAPI
ISF_Desktop_fnCreateViewObject
(
IShellFolder
*
iface
,
HWND
hwndOwner
,
REFIID
riid
,
LPVOID
*
ppvOut
)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
LPSHELLVIEW
pShellView
;
char
xriid
[
50
];
HRESULT
hr
=
E_INVALIDARG
;
WINE_StringFromCLSID
(
riid
,
xriid
);
TRACE
(
"(%p)->(hwnd=0x%x,
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
hwndOwner
,
xriid
,
ppvOut
);
if
(
ppvOut
)
{
*
ppvOut
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
{
FIXME
(
"IDropTarget not implemented
\n
"
);
hr
=
E_NOTIMPL
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
))
{
FIXME
(
"IContextMenu not implemented
\n
"
);
hr
=
E_NOTIMPL
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellView
))
{
pShellView
=
IShellView_Constructor
((
IShellFolder
*
)
This
);
if
(
pShellView
)
{
hr
=
IShellView_QueryInterface
(
pShellView
,
riid
,
ppvOut
);
IShellView_Release
(
pShellView
);
}
}
}
TRACE
(
"-- (%p)->(interface=%p)
\n
"
,
This
,
ppvOut
);
return
hr
;
}
/**************************************************************************
* ISF_Desktop_fnGetAttributesOf
*/
...
...
@@ -1326,6 +1256,10 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf(IShellFolder * iface,UINT ci
*
rgfInOut
&=
attributes
;
goto
next
;
}
else
{
/* some shell-extension */
*
rgfInOut
&=
0xb0000154
;
}
}
else
if
(
_ILIsFolder
(
*
apidl
))
{
...
...
@@ -1401,7 +1335,7 @@ static ICOM_VTABLE(IShellFolder) sfdvt =
ISF_Desktop_fnBindToObject
,
IShellFolder_fnBindToStorage
,
IShellFolder_fnCompareIDs
,
IS
hellFolder
_fnCreateViewObject
,
IS
F_Desktop
_fnCreateViewObject
,
ISF_Desktop_fnGetAttributesOf
,
IShellFolder_fnGetUIObjectOf
,
ISF_Desktop_fnGetDisplayNameOf
,
...
...
@@ -1559,6 +1493,49 @@ static HRESULT WINAPI ISF_MyComputer_fnBindToObject( IShellFolder * iface, LPCIT
return
S_OK
;
}
/**************************************************************************
* ISF_MyComputer_fnCreateViewObject
*/
static
HRESULT
WINAPI
ISF_MyComputer_fnCreateViewObject
(
IShellFolder
*
iface
,
HWND
hwndOwner
,
REFIID
riid
,
LPVOID
*
ppvOut
)
{
ICOM_THIS
(
IGenericSFImpl
,
iface
);
LPSHELLVIEW
pShellView
;
char
xriid
[
50
];
HRESULT
hr
=
E_INVALIDARG
;
WINE_StringFromCLSID
(
riid
,
xriid
);
TRACE
(
"(%p)->(hwnd=0x%x,
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
hwndOwner
,
xriid
,
ppvOut
);
if
(
ppvOut
)
{
*
ppvOut
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IDropTarget
))
{
FIXME
(
"IDropTarget not implemented
\n
"
);
hr
=
E_NOTIMPL
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
))
{
FIXME
(
"IContextMenu not implemented
\n
"
);
hr
=
E_NOTIMPL
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellView
))
{
pShellView
=
IShellView_Constructor
((
IShellFolder
*
)
This
);
if
(
pShellView
)
{
hr
=
IShellView_QueryInterface
(
pShellView
,
riid
,
ppvOut
);
IShellView_Release
(
pShellView
);
}
}
}
TRACE
(
"-- (%p)->(interface=%p)
\n
"
,
This
,
ppvOut
);
return
hr
;
}
/**************************************************************************
* ISF_MyComputer_fnGetAttributesOf
*/
...
...
@@ -1691,7 +1668,7 @@ static ICOM_VTABLE(IShellFolder) sfmcvt =
ISF_MyComputer_fnBindToObject
,
IShellFolder_fnBindToStorage
,
IShellFolder_fnCompareIDs
,
IS
hellFold
er_fnCreateViewObject
,
IS
F_MyComput
er_fnCreateViewObject
,
ISF_MyComputer_fnGetAttributesOf
,
IShellFolder_fnGetUIObjectOf
,
ISF_MyComputer_fnGetDisplayNameOf
,
...
...
@@ -1711,6 +1688,8 @@ static HRESULT WINAPI ISFPersistFolder_QueryInterface(
{
_ICOM_THIS_From_IPersistFolder
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_QueryInterface
((
IShellFolder
*
)
This
,
iid
,
ppvObj
);
}
...
...
@@ -1723,6 +1702,8 @@ static ULONG WINAPI ISFPersistFolder_AddRef(
{
_ICOM_THIS_From_IPersistFolder
(
IShellFolder
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_AddRef
((
IShellFolder
*
)
This
);
}
...
...
@@ -1735,6 +1716,8 @@ static ULONG WINAPI ISFPersistFolder_Release(
{
_ICOM_THIS_From_IPersistFolder
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_Release
((
IShellFolder
*
)
This
);
}
...
...
@@ -1747,6 +1730,8 @@ static HRESULT WINAPI ISFPersistFolder_GetClassID(
{
_ICOM_THIS_From_IPersistFolder
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
if
(
!
lpClassId
)
return
E_POINTER
;
*
lpClassId
=
*
This
->
pclsid
;
...
...
@@ -1765,6 +1750,8 @@ static HRESULT WINAPI ISFPersistFolder_Initialize(
{
_ICOM_THIS_From_IPersistFolder
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
if
(
This
->
absPidl
)
{
SHFree
(
This
->
absPidl
);
...
...
@@ -1784,3 +1771,137 @@ static ICOM_VTABLE(IPersistFolder) psfvt =
ISFPersistFolder_Initialize
};
/****************************************************************************
* ISFDropTarget implementation
*/
static
BOOL
ISFDropTarget_QueryDrop
(
IDropTarget
*
iface
,
DWORD
dwKeyState
,
LPDWORD
pdwEffect
)
{
DWORD
dwEffect
=
*
pdwEffect
;
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
*
pdwEffect
=
DROPEFFECT_NONE
;
if
(
This
->
fAcceptFmt
)
{
/* Does our interpretation of the keystate ... */
*
pdwEffect
=
KeyStateToDropEffect
(
dwKeyState
);
/* ... matches the desired effect ? */
if
(
dwEffect
&
*
pdwEffect
)
{
return
TRUE
;
}
}
return
FALSE
;
}
static
HRESULT
WINAPI
ISFDropTarget_QueryInterface
(
IDropTarget
*
iface
,
REFIID
riid
,
LPVOID
*
ppvObj
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_QueryInterface
((
IShellFolder
*
)
This
,
riid
,
ppvObj
);
}
static
ULONG
WINAPI
ISFDropTarget_AddRef
(
IDropTarget
*
iface
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_AddRef
((
IShellFolder
*
)
This
);
}
static
ULONG
WINAPI
ISFDropTarget_Release
(
IDropTarget
*
iface
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
return
IShellFolder_Release
((
IShellFolder
*
)
This
);
}
static
HRESULT
WINAPI
ISFDropTarget_DragEnter
(
IDropTarget
*
iface
,
IDataObject
*
pDataObject
,
DWORD
dwKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
FORMATETC
fmt
;
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)->(DataObject=%p)
\n
"
,
This
,
pDataObject
);
InitFormatEtc
(
fmt
,
This
->
cfShellIDList
,
TYMED_HGLOBAL
);
This
->
fAcceptFmt
=
(
S_OK
==
IDataObject_QueryGetData
(
pDataObject
,
&
fmt
))
?
TRUE
:
FALSE
;
ISFDropTarget_QueryDrop
(
iface
,
dwKeyState
,
pdwEffect
);
return
S_OK
;
}
static
HRESULT
WINAPI
ISFDropTarget_DragOver
(
IDropTarget
*
iface
,
DWORD
dwKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
if
(
!
pdwEffect
)
return
E_INVALIDARG
;
ISFDropTarget_QueryDrop
(
iface
,
dwKeyState
,
pdwEffect
);
return
S_OK
;
}
static
HRESULT
WINAPI
ISFDropTarget_DragLeave
(
IDropTarget
*
iface
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
TRACE
(
"(%p)
\n
"
,
This
);
This
->
fAcceptFmt
=
FALSE
;
return
S_OK
;
}
static
HRESULT
WINAPI
ISFDropTarget_Drop
(
IDropTarget
*
iface
,
IDataObject
*
pDataObject
,
DWORD
dwKeyState
,
POINTL
pt
,
DWORD
*
pdwEffect
)
{
_ICOM_THIS_From_IDropTarget
(
IGenericSFImpl
,
iface
);
FIXME
(
"(%p) object dropped
\n
"
,
This
);
return
E_NOTIMPL
;
}
static
struct
ICOM_VTABLE
(
IDropTarget
)
dtvt
=
{
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
ISFDropTarget_QueryInterface
,
ISFDropTarget_AddRef
,
ISFDropTarget_Release
,
ISFDropTarget_DragEnter
,
ISFDropTarget_DragOver
,
ISFDropTarget_DragLeave
,
ISFDropTarget_Drop
};
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment