|
|
// 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""; } */
|