151 lines
3.4 KiB
C++
151 lines
3.4 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
||
|
//
|
||
|
// File: copyhook.cxx
|
||
|
//
|
||
|
// Contents: CShareCopyHook implementation
|
||
|
//
|
||
|
// History: 21-Apr-95 BruceFo Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "headers.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "copyhook.hxx"
|
||
|
#include "cache.hxx"
|
||
|
#include "shrinfo.hxx"
|
||
|
#include "util.hxx"
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CShareCopyHook::CShareCopyHook
|
||
|
//
|
||
|
// Synopsis: Constructor
|
||
|
//
|
||
|
// History: 21-Apr-95 BruceFo Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CShareCopyHook::CShareCopyHook(
|
||
|
VOID
|
||
|
)
|
||
|
:
|
||
|
_uRefs(0)
|
||
|
{
|
||
|
INIT_SIG(CShareCopyHook);
|
||
|
|
||
|
AddRef(); // give it the correct initial reference count. add to the DLL reference count
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CShareCopyHook::~CShareCopyHook
|
||
|
//
|
||
|
// Synopsis: Destructor
|
||
|
//
|
||
|
// History: 21-Apr-95 BruceFo Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
CShareCopyHook::~CShareCopyHook()
|
||
|
{
|
||
|
CHECK_SIG(CShareCopyHook);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CShareCopyHook::CopyCallback
|
||
|
//
|
||
|
// Derivation: ICopyHook
|
||
|
//
|
||
|
// Synopsis: Called when the shell is copying an object
|
||
|
//
|
||
|
// History: 21-Apr-95 BruceFo Created
|
||
|
//
|
||
|
// FEATURE: instead of deleting a share on a directory move, how about
|
||
|
// moving the share?
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP_(UINT)
|
||
|
CShareCopyHook::CopyCallback(
|
||
|
HWND hwnd,
|
||
|
UINT wFunc,
|
||
|
UINT fFlags,
|
||
|
LPCWSTR pszSrcFile,
|
||
|
DWORD dwSrcAttribs,
|
||
|
LPCWSTR pszDestFile,
|
||
|
DWORD dwDestAttribs
|
||
|
)
|
||
|
{
|
||
|
appDebugOut((DEB_TRACE,
|
||
|
"CShareCopyHook::CopyCallback. %ws -> %ws\n",
|
||
|
pszSrcFile, pszDestFile));
|
||
|
|
||
|
UINT idMsg;
|
||
|
|
||
|
if (!(dwSrcAttribs & FILE_ATTRIBUTE_DIRECTORY))
|
||
|
{
|
||
|
return IDYES; //We're only worried about directories
|
||
|
}
|
||
|
|
||
|
if (!g_fSharingEnabled)
|
||
|
{
|
||
|
return IDYES;
|
||
|
}
|
||
|
|
||
|
switch (wFunc)
|
||
|
{
|
||
|
case FO_DELETE:
|
||
|
idMsg = MSG_RMDIRCONFIRM;
|
||
|
break;
|
||
|
|
||
|
case FO_RENAME:
|
||
|
case FO_MOVE:
|
||
|
idMsg = MSG_MVDIRCONFIRM;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return IDYES;
|
||
|
}
|
||
|
|
||
|
BOOL fChange = FALSE;
|
||
|
UINT wnErr = IDYES; /* by default, shell should go ahead and do it */
|
||
|
CShareInfo* pWarnList = NULL;
|
||
|
HRESULT hr = g_ShareCache.ConstructParentWarnList(pszSrcFile, &pWarnList);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
if (NULL != pWarnList)
|
||
|
{
|
||
|
for (CShareInfo* p = (CShareInfo*) pWarnList->Next();
|
||
|
p != pWarnList;
|
||
|
p = (CShareInfo*) p->Next())
|
||
|
{
|
||
|
wnErr = WarnDelShare(hwnd, idMsg, p->GetNetname(), p->GetPath());
|
||
|
if (wnErr != IDYES)
|
||
|
{
|
||
|
// IDYES: obviously, continue
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
fChange = TRUE;
|
||
|
}
|
||
|
|
||
|
// get rid of the temporary list
|
||
|
DeleteShareInfoList(pWarnList, TRUE);
|
||
|
|
||
|
if (fChange)
|
||
|
{
|
||
|
g_ShareCache.Refresh();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return wnErr;
|
||
|
}
|