windows-nt/Source/XPSP1/NT/admin/snapin/filemgmt/cookie.cpp
2020-09-26 16:20:57 +08:00

480 lines
12 KiB
C++

// Cookie.cpp : Implementation of CFileMgmtCookie and related classes
#include "stdafx.h"
#include "cookie.h"
#include "stdutils.h" // g_aNodetypeGuids
#include "cmponent.h"
#include "atlimpl.cpp"
DECLARE_INFOLEVEL(FileMgmtSnapin)
#include "macros.h"
USE_HANDLE_MACROS("FILEMGMT(cookie.cpp)")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "stdcooki.cpp"
//
// This is used by the nodetype utility routines in stdutils.cpp
//
const struct NODETYPE_GUID_ARRAYSTRUCT g_NodetypeGuids[FILEMGMT_NUMTYPES] =
{
{ // FILEMGMT_ROOT
structuuidNodetypeRoot,
lstruuidNodetypeRoot },
{ // FILEMGMT_SHARES
structuuidNodetypeShares,
lstruuidNodetypeShares },
{ // FILEMGMT_SESSIONS
structuuidNodetypeSessions,
lstruuidNodetypeSessions },
{ // FILEMGMT_RESOURCES
structuuidNodetypeResources,
lstruuidNodetypeResources },
{ // FILEMGMT_SERVICES
structuuidNodetypeServices,
lstruuidNodetypeServices },
{ // FILEMGMT_SHARE
structuuidNodetypeShare,
lstruuidNodetypeShare },
{ // FILEMGMT_SESSION
structuuidNodetypeSession,
lstruuidNodetypeSession },
{ // FILEMGMT_RESOURCE
structuuidNodetypeResource,
lstruuidNodetypeResource },
{ // FILEMGMT_SERVICE
structuuidNodetypeService,
lstruuidNodetypeService }
};
const struct NODETYPE_GUID_ARRAYSTRUCT* g_aNodetypeGuids = g_NodetypeGuids;
const int g_cNumNodetypeGuids = FILEMGMT_NUMTYPES;
//
// CFileMgmtCookie
//
HRESULT CFileMgmtCookie::GetTransport( FILEMGMT_TRANSPORT* /*ptransport*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetShareName( OUT CString& /*strShareName*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetSharePIDList( OUT LPITEMIDLIST * /*ppidl*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetSessionClientName( OUT CString& /*strShareName*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetSessionUserName( OUT CString& /*strShareName*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetSessionID( DWORD* /*pdwFileID*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetFileID( DWORD* /*pdwFileID*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetServiceName( OUT CString& /*strServiceName*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetServiceDisplayName( OUT CString& /*strServiceDisplayName*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::GetExplorerViewDescription( OUT CString& /*strExplorerViewDescription*/ )
{
return DV_E_FORMATETC;
}
HRESULT CFileMgmtCookie::CompareSimilarCookies (
CCookie* pOtherCookie,
int* pnResult)
{
CFileMgmtCookie* pcookie = (CFileMgmtCookie*)pOtherCookie;
int iColumn = *pnResult;
HRESULT hr = CHasMachineName::CompareMachineNames( *pcookie, pnResult );
if (S_OK != hr || 0 != *pnResult)
return hr;
switch (QueryObjectType())
{
case FILEMGMT_SHARE:
{
switch (iColumn)
{
case COMPARESIMILARCOOKIE_FULL:
{
BSTR bstr1 = GetColumnText(COLNUM_SHARES_SHARED_FOLDER);
BSTR bstr2 = pcookie->GetColumnText(COLNUM_SHARES_SHARED_FOLDER);
*pnResult = lstrcmpi(bstr1, bstr2);
if (!*pnResult)
{
bstr1 = GetColumnText(COLNUM_SHARES_TRANSPORT);
bstr2 = pcookie->GetColumnText(COLNUM_SHARES_TRANSPORT);
*pnResult = lstrcmpi(bstr1, bstr2);
}
}
break;
case COLNUM_SHARES_SHARED_FOLDER:
case COLNUM_SHARES_SHARED_PATH:
case COLNUM_SHARES_TRANSPORT:
case COLNUM_SHARES_COMMENT:
{
BSTR bstr1 = GetColumnText(iColumn);
BSTR bstr2 = pcookie->GetColumnText(iColumn);
*pnResult = lstrcmpi(bstr1, bstr2);
}
break;
case COLNUM_SHARES_NUM_SESSIONS:
{
DWORD dw1 = GetNumOfCurrentUses();
DWORD dw2 = pcookie->GetNumOfCurrentUses();
*pnResult = (dw1 < dw2) ? -1 : ((dw1 == dw2) ? 0 : 1);
}
break;
default:
ASSERT(FALSE);
*pnResult = 0;
break;
}
}
break;
case FILEMGMT_SERVICE:
ASSERT (0); // comparison provided by CServiceCookie
break;
case FILEMGMT_SESSION:
{
switch (iColumn)
{
case COMPARESIMILARCOOKIE_FULL:
iColumn = COLNUM_SESSIONS_USERNAME; // fall through
case COLNUM_SESSIONS_USERNAME:
case COLNUM_SESSIONS_COMPUTERNAME:
case COLNUM_SESSIONS_TRANSPORT:
case COLNUM_SESSIONS_IS_GUEST:
{
BSTR bstr1 = GetColumnText(iColumn);
BSTR bstr2 = pcookie->GetColumnText(iColumn);
*pnResult = lstrcmpi(bstr1, bstr2);
}
break;
case COLNUM_SESSIONS_NUM_FILES:
{
DWORD dw1 = GetNumOfOpenFiles();
DWORD dw2 = pcookie->GetNumOfOpenFiles();
*pnResult = (dw1 < dw2) ? -1 : ((dw1 == dw2) ? 0 : 1);
}
break;
case COLNUM_SESSIONS_CONNECTED_TIME:
{
DWORD dw1 = GetConnectedTime();
DWORD dw2 = pcookie->GetConnectedTime();
*pnResult = (dw1 < dw2) ? -1 : ((dw1 == dw2) ? 0 : 1);
}
break;
case COLNUM_SESSIONS_IDLE_TIME:
{
DWORD dw1 = GetIdleTime();
DWORD dw2 = pcookie->GetIdleTime();
*pnResult = (dw1 < dw2) ? -1 : ((dw1 == dw2) ? 0 : 1);
}
break;
default:
ASSERT(FALSE);
*pnResult = 0;
break;
}
}
break;
case FILEMGMT_RESOURCE:
{
switch (iColumn)
{
case COMPARESIMILARCOOKIE_FULL:
iColumn = COLNUM_RESOURCES_FILENAME; // fall through
case COLNUM_RESOURCES_FILENAME:
case COLNUM_RESOURCES_USERNAME:
case COLNUM_RESOURCES_TRANSPORT:
case COLNUM_RESOURCES_OPEN_MODE:
{
BSTR bstr1 = GetColumnText(iColumn);
BSTR bstr2 = pcookie->GetColumnText(iColumn);
*pnResult = lstrcmpi(bstr1, bstr2);
}
break;
case COLNUM_RESOURCES_NUM_LOCKS:
{
DWORD dw1 = GetNumOfLocks();
DWORD dw2 = pcookie->GetNumOfLocks();
*pnResult = (dw1 < dw2) ? -1 : ((dw1 == dw2) ? 0 : 1);
}
break;
default:
ASSERT(FALSE);
*pnResult = 0;
break;
}
}
break;
case FILEMGMT_ROOT:
case FILEMGMT_SHARES:
case FILEMGMT_SESSIONS:
case FILEMGMT_RESOURCES:
#ifdef SNAPIN_PROTOTYPER
case FILEMGMT_PROTOTYPER:
*pnResult = 0;
break;
#endif
case FILEMGMT_SERVICES:
*pnResult = 0;
break;
default:
ASSERT(FALSE);
break;
}
return S_OK;
}
//
// CFileMgmtCookieBlock
//
DEFINE_COOKIE_BLOCK(CFileMgmtCookie)
//
// CFileMgmtScopeCookie
//
CFileMgmtScopeCookie::CFileMgmtScopeCookie(
LPCTSTR lpcszMachineName,
FileMgmtObjectType objecttype)
: CFileMgmtCookie( objecttype )
, m_hScManager( NULL )
, m_fQueryServiceConfig2( FALSE )
, m_hScopeItemParent( NULL )
, m_strMachineName( lpcszMachineName )
{
ASSERT( IsAutonomousObjectType( objecttype ) );
m_hScManager = NULL;
m_fQueryServiceConfig2 = TRUE; // Pretend the target machine does support QueryServiceConfig2() API
}
CFileMgmtScopeCookie::~CFileMgmtScopeCookie()
{
}
CCookie* CFileMgmtScopeCookie::QueryBaseCookie(int i)
{
UNREFERENCED_PARAMETER (i);
ASSERT(0 == i);
return (CCookie*)this;
}
int CFileMgmtScopeCookie::QueryNumCookies()
{
return 1;
}
void CFileMgmtCookie::GetDisplayName( CString& /*strref*/, BOOL /*fStaticNode*/ )
{
ASSERT(FALSE);
}
void CFileMgmtScopeCookie::GetDisplayName( CString& strref, BOOL fStaticNode )
{
if ( !IsAutonomousObjectType(QueryObjectType()) )
{
ASSERT(FALSE);
return;
}
int nStringId = IDS_DISPLAYNAME_ROOT;
if (fStaticNode)
{
if (NULL != QueryTargetServer())
nStringId = IDS_DISPLAYNAME_s_ROOT;
else
nStringId = IDS_DISPLAYNAME_ROOT_LOCAL;
}
nStringId += (QueryObjectType() - FILEMGMT_ROOT);
LoadStringPrintf(nStringId, OUT &strref, (LPCTSTR)QueryNonNULLMachineName());
}
void CFileMgmtScopeCookie::MarkResultChildren( CBITFLAG_FLAGWORD state )
{
ASSERT( FILEMGMT_SERVICES == QueryObjectType() ); // CODEWORK remove
POSITION pos = m_listResultCookieBlocks.GetHeadPosition();
while (NULL != pos)
{
CBaseCookieBlock* pblock = m_listResultCookieBlocks.GetNext( pos );
ASSERT( NULL != pblock && 1 == pblock->QueryNumCookies() );
CCookie* pbasecookie = pblock->QueryBaseCookie(0);
CNewResultCookie* pcookie = (CNewResultCookie*)pbasecookie;
pcookie->MarkState( state );
}
}
void CFileMgmtScopeCookie::RemoveMarkedChildren()
{
ASSERT( FILEMGMT_SERVICES == QueryObjectType() ); // CODEWORK remove
POSITION pos = m_listResultCookieBlocks.GetHeadPosition();
while (NULL != pos)
{
POSITION posCurr = pos;
CBaseCookieBlock* pblock = m_listResultCookieBlocks.GetNext( pos );
ASSERT( NULL != pblock && 1 == pblock->QueryNumCookies() );
CCookie* pbasecookie = pblock->QueryBaseCookie(0);
CNewResultCookie* pcookie = (CNewResultCookie*)pbasecookie;
if ( pcookie->IsMarkedForDeletion() )
{
m_listResultCookieBlocks.RemoveAt( posCurr );
pcookie->Release();
}
}
}
// CODEWORK This may be a O(N^^2) performance problem when the list is long
void CFileMgmtScopeCookie::ScanAndAddResultCookie( CNewResultCookie* pnewcookie )
{
ASSERT( FILEMGMT_SERVICES == QueryObjectType() ); // CODEWORK remove
POSITION pos = m_listResultCookieBlocks.GetHeadPosition();
while (NULL != pos)
{
CBaseCookieBlock* pblock = m_listResultCookieBlocks.GetNext( pos );
ASSERT( NULL != pblock && 1 == pblock->QueryNumCookies() );
CCookie* pbasecookie = pblock->QueryBaseCookie(0);
CNewResultCookie* pcookie = (CNewResultCookie*)pbasecookie;
if (!pcookie->IsMarkedForDeletion())
continue; // this is not an old-and-still-unmatched object
BOOL bSame = FALSE;
HRESULT hr = pcookie->SimilarCookieIsSameObject( pnewcookie, &bSame );
if ( !FAILED(hr) && bSame )
{
// this existing object is the same as our new object
if (pcookie->CopySimilarCookie( pnewcookie ) )
pcookie->MarkAsChanged();
else
pcookie->MarkAsOld();
delete pnewcookie;
return;
}
}
AddResultCookie( pnewcookie );
}
#ifdef SNAPIN_PROTOTYPER
//
// CPrototyperScopeCookie
//
DEFINE_COOKIE_BLOCK(CPrototyperScopeCookie)
//
// CPrototyperResultCookie
//
DEFINE_COOKIE_BLOCK(CPrototyperResultCookie)
#endif
//
// CNewResultCookie
//
CNewResultCookie::CNewResultCookie( PVOID pvCookieTypeMarker, FileMgmtObjectType objecttype )
: CFileMgmtCookie( objecttype )
, m_pvCookieTypeMarker( pvCookieTypeMarker )
{
}
CNewResultCookie::~CNewResultCookie()
{
}
// return TRUE iif object has changed
BOOL CNewResultCookie::CopySimilarCookie( CNewResultCookie* /*pcookie*/ )
{
return FALSE;
}
/*
class CNewShareCookie
: public CNewResultCookie
{
public:
CNewShareCookie( FILEMGMT_TRANSPORT transport )
: CNewResultCookie( FILEMGMT_SHARE )
, m_transport( transport )
{}
virtual ~CNewShareCookie();
virtual BSTR QueryResultColumnText( int nCol, CFileMgmtComponentData& refcdata );
public:
FILEMGMT_TRANSPORT m_transport;
CString m_strName;
CString m_strPath;
CString m_strComment;
DWORD m_dwSessions;
DWORD m_dwID;
}; // CNewShareCookie
CNewShareCookie::~CNewShareCookie() {}
BSTR CNewShareCookie::QueryResultColumnText(
int nCol,
CFileMgmtComponentData& refcdata )
{
switch (nCol)
{
case COLNUM_SHARES_SHARED_FOLDER:
return const_cast<BSTR>((LPCTSTR)m_strName);
case COLNUM_SHARES_SHARED_PATH:
return const_cast<BSTR>((LPCTSTR)m_strPath);
case COLNUM_SHARES_TRANSPORT:
return refcdata.MakeTransportResult(m_transport);
case COLNUM_SHARES_NUM_SESSIONS:
return refcdata.MakeDwordResult( m_dwSessions );
case COLNUM_SHARES_COMMENT:
return const_cast<BSTR>((LPCTSTR)m_strComment);
default:
ASSERT(FALSE);
break;
}
return L"";
}
*/