📄 shfldr_fs.c
字号:
if (_ILIsFolder (apidl[i])) {
LPITEMIDLIST pidl;
TRACE ("delete %s\n", szPath);
if (!SHELL_DeleteDirectoryA (szPath, bConfirm)) {
TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm);
return E_FAIL;
}
pidl = ILCombine (This->pidlRoot, apidl[i]);
SHChangeNotify (SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
SHFree (pidl);
} else if (_ILIsValue (apidl[i])) {
LPITEMIDLIST pidl;
TRACE ("delete %s\n", szPath);
if (!SHELL_DeleteFileA (szPath, bConfirm)) {
TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm);
return E_FAIL;
}
pidl = ILCombine (This->pidlRoot, apidl[i]);
SHChangeNotify (SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL);
SHFree (pidl);
}
}
return S_OK;
}
/****************************************************************************
* ISFHelper_fnCopyItems
*
* copies items to this folder
*/
static HRESULT WINAPI
ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl,
LPCITEMIDLIST * apidl)
{
UINT i;
IPersistFolder2 *ppf2 = NULL;
char szSrcPath[MAX_PATH],
szDstPath[MAX_PATH];
IGenericSFImpl *This = impl_from_ISFHelper(iface);
TRACE ("(%p)->(%p,%u,%p)\n", This, pSFFrom, cidl, apidl);
IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2,
(LPVOID *) & ppf2);
if (ppf2) {
LPITEMIDLIST pidl;
if (SUCCEEDED (IPersistFolder2_GetCurFolder (ppf2, &pidl))) {
for (i = 0; i < cidl; i++) {
SHGetPathFromIDListA (pidl, szSrcPath);
PathAddBackslashA (szSrcPath);
_ILSimpleGetText (apidl[i], szSrcPath + strlen (szSrcPath),
MAX_PATH);
strcpy (szDstPath, This->sPathTarget);
PathAddBackslashA (szDstPath);
_ILSimpleGetText (apidl[i], szDstPath + strlen (szDstPath),
MAX_PATH);
MESSAGE ("would copy %s to %s\n", szSrcPath, szDstPath);
}
SHFree (pidl);
}
IPersistFolder2_Release (ppf2);
}
return S_OK;
}
static const ISFHelperVtbl shvt =
{
ISFHelper_fnQueryInterface,
ISFHelper_fnAddRef,
ISFHelper_fnRelease,
ISFHelper_fnGetUniqueName,
ISFHelper_fnAddFolder,
ISFHelper_fnDeleteItems,
ISFHelper_fnCopyItems
};
/************************************************************************
* IFSFldr_PersistFolder3_QueryInterface
*
*/
static HRESULT WINAPI
IFSFldr_PersistFolder3_QueryInterface (IPersistFolder3 * iface, REFIID iid,
LPVOID * ppvObj)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)\n", This);
return IUnknown_QueryInterface (This->pUnkOuter, iid, ppvObj);
}
/************************************************************************
* IFSFldr_PersistFolder3_AddRef
*
*/
static ULONG WINAPI
IFSFldr_PersistFolder3_AddRef (IPersistFolder3 * iface)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_AddRef (This->pUnkOuter);
}
/************************************************************************
* IFSFldr_PersistFolder3_Release
*
*/
static ULONG WINAPI
IFSFldr_PersistFolder3_Release (IPersistFolder3 * iface)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)->(count=%lu)\n", This, This->ref);
return IUnknown_Release (This->pUnkOuter);
}
/************************************************************************
* IFSFldr_PersistFolder3_GetClassID
*/
static HRESULT WINAPI
IFSFldr_PersistFolder3_GetClassID (IPersistFolder3 * iface, CLSID * lpClassId)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)\n", This);
if (!lpClassId)
return E_POINTER;
*lpClassId = *This->pclsid;
return S_OK;
}
/************************************************************************
* IFSFldr_PersistFolder3_Initialize
*
* NOTES
* sPathTarget is not set. Don't know how to handle in a non rooted environment.
*/
static HRESULT WINAPI
IFSFldr_PersistFolder3_Initialize (IPersistFolder3 * iface, LPCITEMIDLIST pidl)
{
char sTemp[MAX_PATH];
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)->(%p)\n", This, pidl);
if (This->pidlRoot)
SHFree (This->pidlRoot); /* free the old pidl */
This->pidlRoot = ILClone (pidl); /* set my pidl */
if (This->sPathTarget)
SHFree (This->sPathTarget);
/* set my path */
if (SHGetPathFromIDListA (pidl, sTemp)) {
This->sPathTarget = SHAlloc (strlen (sTemp) + 1);
strcpy (This->sPathTarget, sTemp);
}
TRACE ("--(%p)->(%s)\n", This, This->sPathTarget);
return S_OK;
}
/**************************************************************************
* IFSFldr_PersistFolder3_GetCurFolder
*/
static HRESULT WINAPI
IFSFldr_PersistFolder3_fnGetCurFolder (IPersistFolder3 * iface,
LPITEMIDLIST * pidl)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)->(%p)\n", This, pidl);
if (!pidl) return E_POINTER;
*pidl = ILClone (This->pidlRoot);
return S_OK;
}
/**************************************************************************
* IFSFldr_PersistFolder3_InitializeEx
*
* FIXME: error handling
*/
static HRESULT WINAPI
IFSFldr_PersistFolder3_InitializeEx (IPersistFolder3 * iface,
IBindCtx * pbc, LPCITEMIDLIST pidlRoot,
const PERSIST_FOLDER_TARGET_INFO * ppfti)
{
char sTemp[MAX_PATH];
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
TRACE ("(%p)->(%p,%p,%p)\n", This, pbc, pidlRoot, ppfti);
if (ppfti)
TRACE ("--%p %s %s 0x%08lx 0x%08x\n",
ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName),
debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes,
ppfti->csidl);
pdump (pidlRoot);
if (ppfti && ppfti->pidlTargetFolder)
pdump (ppfti->pidlTargetFolder);
if (This->pidlRoot)
__SHFreeAndNil (&This->pidlRoot); /* free the old */
if (This->sPathTarget)
__SHFreeAndNil (&This->sPathTarget);
/*
* Root path and pidl
*/
This->pidlRoot = ILClone (pidlRoot);
/*
* the target folder is spezified in csidl OR pidlTargetFolder OR
* szTargetParsingName
*/
if (ppfti) {
if (ppfti->csidl != -1) {
if (SHGetSpecialFolderPathA (0, sTemp, ppfti->csidl,
ppfti->csidl & CSIDL_FLAG_CREATE)) {
__SHCloneStrA (&This->sPathTarget, sTemp);
}
} else if (ppfti->szTargetParsingName[0]) {
__SHCloneStrWtoA (&This->sPathTarget, ppfti->szTargetParsingName);
} else if (ppfti->pidlTargetFolder) {
if (SHGetPathFromIDListA (ppfti->pidlTargetFolder, sTemp)) {
__SHCloneStrA (&This->sPathTarget, sTemp);
}
}
}
TRACE ("--(%p)->(target=%s)\n", This, debugstr_a (This->sPathTarget));
pdump (This->pidlRoot);
return (This->sPathTarget) ? S_OK : E_FAIL;
}
static HRESULT WINAPI
IFSFldr_PersistFolder3_GetFolderTargetInfo (IPersistFolder3 * iface,
PERSIST_FOLDER_TARGET_INFO * ppfti)
{
IGenericSFImpl *This = impl_from_IPersistFolder3(iface);
FIXME ("(%p)->(%p)\n", This, ppfti);
ZeroMemory (ppfti, sizeof (ppfti));
return E_NOTIMPL;
}
static const IPersistFolder3Vtbl vt_FSFldr_PersistFolder3 =
{
IFSFldr_PersistFolder3_QueryInterface,
IFSFldr_PersistFolder3_AddRef,
IFSFldr_PersistFolder3_Release,
IFSFldr_PersistFolder3_GetClassID,
IFSFldr_PersistFolder3_Initialize,
IFSFldr_PersistFolder3_fnGetCurFolder,
IFSFldr_PersistFolder3_InitializeEx,
IFSFldr_PersistFolder3_GetFolderTargetInfo
};
/****************************************************************************
* ISFDropTarget implementation
*/
static BOOL
ISFDropTarget_QueryDrop (IDropTarget * iface, DWORD dwKeyState,
LPDWORD pdwEffect)
{
DWORD dwEffect = *pdwEffect;
IGenericSFImpl *This = impl_from_IDropTarget(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)
{
IGenericSFImpl *This = impl_from_IDropTarget(iface);
TRACE ("(%p)\n", This);
return IUnknown_QueryInterface (This->pUnkOuter, riid, ppvObj);
}
static ULONG WINAPI ISFDropTarget_AddRef (IDropTarget * iface)
{
IGenericSFImpl *This = impl_from_IDropTarget(iface);
TRACE ("(%p)\n", This);
return IUnknown_AddRef (This->pUnkOuter);
}
static ULONG WINAPI ISFDropTarget_Release (IDropTarget * iface)
{
IGenericSFImpl *This = impl_from_IDropTarget(iface);
TRACE ("(%p)\n", This);
return IUnknown_Release (This->pUnkOuter);
}
static HRESULT WINAPI
ISFDropTarget_DragEnter (IDropTarget * iface, IDataObject * pDataObject,
DWORD dwKeyState, POINTL pt, DWORD * pdwEffect)
{
FORMATETC fmt;
IGenericSFImpl *This = impl_from_IDropTarget(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)
{
IGenericSFImpl *This = impl_from_IDropTarget(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)
{
IGenericSFImpl *This = impl_from_IDropTarget(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)
{
IGenericSFImpl *This = impl_from_IDropTarget(iface);
FIXME ("(%p) object dropped\n", This);
return E_NOTIMPL;
}
static const IDropTargetVtbl dtvt = {
ISFDropTarget_QueryInterface,
ISFDropTarget_AddRef,
ISFDropTarget_Release,
ISFDropTarget_DragEnter,
ISFDropTarget_DragOver,
ISFDropTarget_DragLeave,
ISFDropTarget_Drop
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -