1045 lines
24 KiB
C++
1045 lines
24 KiB
C++
// cacls.cpp: implementation of the CADsAccessControlEntry class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "stdafx.h"
|
||
#include "objects.h"
|
||
#include "maindoc.h"
|
||
#include "cacls.h"
|
||
#include "newquery.h"
|
||
|
||
#ifdef _DEBUG
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[]=__FILE__;
|
||
#define new DEBUG_NEW
|
||
#endif
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlEntry::CADsAccessControlEntry()
|
||
{
|
||
InitializeMembers( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlEntry::CADsAccessControlEntry( IUnknown* pIUnk)
|
||
:COleDsObject( pIUnk )
|
||
{
|
||
InitializeMembers( );
|
||
}
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlEntry::~CADsAccessControlEntry( )
|
||
{
|
||
}
|
||
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlEntry::PutProperty
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlEntry::PutProperty ( int nProp,
|
||
CString& rValue,
|
||
long lCode )
|
||
{
|
||
BOOL bOldUseGeneric;
|
||
HRESULT hResult;
|
||
|
||
bOldUseGeneric = m_pDoc->GetUseGeneric( );
|
||
|
||
m_pDoc->SetUseGeneric( FALSE );
|
||
|
||
hResult = COleDsObject::PutProperty( nProp, rValue, lCode );
|
||
|
||
m_pDoc->SetUseGeneric( bOldUseGeneric );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlEntry::GetProperty ( int nProp,
|
||
CString& rValue )
|
||
{
|
||
BOOL bOldUseGeneric;
|
||
HRESULT hResult;
|
||
|
||
bOldUseGeneric = m_pDoc->GetUseGeneric( );
|
||
|
||
m_pDoc->SetUseGeneric( FALSE );
|
||
|
||
hResult = COleDsObject::GetProperty( nProp, rValue );
|
||
|
||
m_pDoc->SetUseGeneric( bOldUseGeneric );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
IDispatch* CADsAccessControlEntry::GetACE( )
|
||
{
|
||
IDispatch* pDispatch = NULL;
|
||
|
||
if( NULL != m_pIUnk )
|
||
{
|
||
m_pIUnk->QueryInterface( IID_IDispatch, (void**)&pDispatch );
|
||
}
|
||
|
||
return pDispatch;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
IDispatch* CADsAccessControlEntry::CreateACE( )
|
||
{
|
||
IDispatch* pDispatch = NULL;
|
||
IADsAccessControlEntry* pNewACE = NULL;
|
||
HRESULT hResult = NULL;
|
||
DWORD dwAceType = 0;
|
||
CACEDialog aDialog;
|
||
BSTR bstrTrustee;
|
||
|
||
|
||
if( IDOK != aDialog.DoModal( ) )
|
||
return NULL;
|
||
|
||
hResult = CoCreateInstance(
|
||
CLSID_AccessControlEntry,
|
||
NULL,
|
||
CLSCTX_INPROC_SERVER,
|
||
IID_IADsAccessControlEntry,
|
||
(void **)&pNewACE
|
||
);
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
bstrTrustee = AllocBSTR( aDialog.m_strTrustee.GetBuffer( 128 ) );
|
||
|
||
pNewACE->put_Trustee( bstrTrustee );
|
||
hResult = pNewACE->QueryInterface( IID_IDispatch,
|
||
(void**)&pDispatch );
|
||
SysFreeString( bstrTrustee );
|
||
pNewACE->Release( );
|
||
}
|
||
|
||
return pDispatch;
|
||
return NULL;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsAccessControlEntry::InitializeMembers ( )
|
||
{
|
||
IADsAccessControlEntry* pEntry;
|
||
HRESULT hResult;
|
||
|
||
if( NULL != m_pIUnk )
|
||
{
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlEntry,
|
||
(void**)&pEntry );
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
BSTR bstrTrustee = NULL;
|
||
TCHAR szTrustee[ 256 ];
|
||
|
||
pEntry->get_Trustee( &bstrTrustee );
|
||
if( NULL != bstrTrustee )
|
||
{
|
||
Convert( szTrustee, bstrTrustee );
|
||
m_strItemName = szTrustee;
|
||
}
|
||
SysFreeString( bstrTrustee );
|
||
pEntry->Release( );
|
||
}
|
||
}
|
||
m_strSchemaPath = _T("ACE");
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsSecurityDescriptor::CADsSecurityDescriptor()
|
||
{
|
||
InitializeMembers( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsSecurityDescriptor::CADsSecurityDescriptor( IUnknown* pIUnk )
|
||
:COleDsObject( pIUnk )
|
||
{
|
||
/*IADsSecurityDescriptor* pSecD;
|
||
IDispatch* pCopy;
|
||
HRESULT hResult;
|
||
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor,
|
||
(void**)&pSecD );
|
||
|
||
hResult = pSecD->CopySecurityDescriptor( &pCopy );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
m_pIUnk->Release( );
|
||
hResult = pCopy->QueryInterface( IID_IUnknown,(void**)&m_pIUnk );
|
||
pCopy->Release( );
|
||
}
|
||
|
||
pSecD->Release( );*/
|
||
|
||
InitializeMembers( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsSecurityDescriptor::~CADsSecurityDescriptor()
|
||
{
|
||
for( int nIdx = 0; nIdx < (int) acl_Limit ; nIdx++ )
|
||
{
|
||
if( NULL != pACLObj[ nIdx ] )
|
||
delete pACLObj[ nIdx ];
|
||
}
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsSecurityDescriptor::PutProperty ( int nProp,
|
||
CString& rValue,
|
||
long lCode )
|
||
{
|
||
BOOL bOldUseGeneric;
|
||
HRESULT hResult;
|
||
|
||
bOldUseGeneric = m_pDoc->GetUseGeneric( );
|
||
|
||
m_pDoc->SetUseGeneric( FALSE );
|
||
|
||
hResult = COleDsObject::PutProperty( nProp, rValue, lCode );
|
||
|
||
m_pDoc->SetUseGeneric( bOldUseGeneric );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsSecurityDescriptor::GetProperty ( int nProp,
|
||
CString& rValue )
|
||
{
|
||
BOOL bOldUseGeneric;
|
||
HRESULT hResult;
|
||
|
||
bOldUseGeneric = m_pDoc->GetUseGeneric( );
|
||
|
||
m_pDoc->SetUseGeneric( FALSE );
|
||
|
||
hResult = COleDsObject::GetProperty( nProp, rValue );
|
||
|
||
m_pDoc->SetUseGeneric( bOldUseGeneric );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsSecurityDescriptor::InitializeMembers ( )
|
||
{
|
||
HRESULT hResult;
|
||
IADsSecurityDescriptor* pDescriptor = NULL;
|
||
IDispatch* pDispACL;
|
||
|
||
m_strSchemaPath = _T("SecurityDescriptor");
|
||
|
||
pACLObj[ acl_SACL ] = NULL;
|
||
pACLObj[ acl_DACL ] = NULL;
|
||
pACLObj[ acl_Invalid ] = NULL;
|
||
|
||
if( NULL == m_pIUnk )
|
||
return;
|
||
|
||
while( TRUE )
|
||
{
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor,
|
||
(void**)&pDescriptor );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
pDispACL = GetACL( acl_DACL );
|
||
ASSERT( NULL != pDispACL );
|
||
|
||
if( NULL != pDispACL )
|
||
{
|
||
pACLObj[ acl_DACL ] = new CADsAccessControlList( pDispACL );
|
||
pDispACL->Release( );
|
||
}
|
||
|
||
pDispACL = GetACL( acl_SACL );
|
||
ASSERT( NULL != pDispACL );
|
||
|
||
if( NULL != pDispACL )
|
||
{
|
||
pACLObj[ acl_SACL ] = new CADsAccessControlList( pDispACL );
|
||
pDispACL->Release( );
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
if( NULL != pDescriptor )
|
||
{
|
||
pDescriptor->Release( );
|
||
}
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
IDispatch* CADsSecurityDescriptor::GetACL( ACLTYPE eType )
|
||
{
|
||
HRESULT hResult;
|
||
IDispatch* pACL = NULL;
|
||
IDispatch* pCopyACL = NULL;
|
||
IADsSecurityDescriptor* pSecDescr = NULL;
|
||
|
||
while( TRUE )
|
||
{
|
||
if( NULL == m_pIUnk )
|
||
break;
|
||
|
||
//QI for IID_IADsSecurityDescriptor interface
|
||
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor,
|
||
(void**)&pSecDescr );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
hResult = E_FAIL;
|
||
|
||
if( acl_DACL == eType )
|
||
{
|
||
hResult = pSecDescr->get_DiscretionaryAcl( &pACL );
|
||
}
|
||
if( acl_SACL == eType )
|
||
{
|
||
hResult = pSecDescr->get_SystemAcl( &pACL );
|
||
}
|
||
pSecDescr->Release( );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
break;
|
||
}
|
||
|
||
if( NULL != pACL )
|
||
{
|
||
//pCopyACL = CopyACL( pACL );
|
||
//pACL->Release( );
|
||
|
||
pACL->QueryInterface( IID_IDispatch, (void**)&pCopyACL );
|
||
pACL->Release( );
|
||
}
|
||
|
||
return pCopyACL;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsSecurityDescriptor::PutACL( IDispatch * pACL,
|
||
ACLTYPE eACL )
|
||
{
|
||
HRESULT hResult;
|
||
IADsSecurityDescriptor* pSecDescr = NULL;
|
||
|
||
while( TRUE )
|
||
{
|
||
if( NULL == m_pIUnk )
|
||
break;
|
||
|
||
//QI for IID_IADsSecurityDescriptor interface
|
||
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor,
|
||
(void**)&pSecDescr );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
{
|
||
break;
|
||
}
|
||
|
||
hResult = E_FAIL;
|
||
|
||
if( acl_DACL == eACL )
|
||
{
|
||
hResult = pSecDescr->put_DiscretionaryAcl( pACL );
|
||
}
|
||
if( acl_SACL == eACL )
|
||
{
|
||
hResult = pSecDescr->put_SystemAcl( pACL );
|
||
}
|
||
|
||
pSecDescr->Release( );
|
||
break;
|
||
}
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsSecurityDescriptor::AddACE( ACLTYPE eACL, IUnknown* pNewACE )
|
||
{
|
||
ASSERT( acl_DACL == eACL || acl_SACL == eACL );
|
||
|
||
if( acl_DACL != eACL && acl_SACL != eACL )
|
||
return -1;
|
||
|
||
if( NULL == pACLObj[ (int)eACL ] )
|
||
return -1;
|
||
|
||
return ((CADsAccessControlList*)(pACLObj[ (int)eACL ]))->AddACE( pNewACE );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsSecurityDescriptor::RemoveACE( ACLTYPE eACL, IUnknown* pRemoveACE )
|
||
{
|
||
ASSERT( acl_DACL == eACL || acl_SACL == eACL );
|
||
|
||
if( acl_DACL != eACL && acl_SACL != eACL )
|
||
return -1;
|
||
|
||
if( NULL == pACLObj[ (int)eACL ] )
|
||
return -1;
|
||
|
||
return ((CADsAccessControlList*)(pACLObj[ (int)eACL ]))->RemoveACE( pRemoveACE );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsSecurityDescriptor::SetDocument( CMainDoc* pDoc )
|
||
{
|
||
int nIdx;
|
||
|
||
COleDsObject::SetDocument ( pDoc );
|
||
|
||
for( nIdx = 0 ; nIdx < (int)acl_Limit ; nIdx++ )
|
||
{
|
||
if( NULL != pACLObj[ nIdx ] )
|
||
pACLObj[ nIdx ]->SetDocument( pDoc );
|
||
}
|
||
}
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsSecurityDescriptor::RemoveAllACE( ACLTYPE eACL )
|
||
{
|
||
ASSERT( acl_DACL == eACL || acl_SACL == eACL );
|
||
|
||
if( acl_DACL != eACL && acl_SACL != eACL )
|
||
return;
|
||
|
||
if( NULL == pACLObj[ (int)eACL ] )
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlList* CADsSecurityDescriptor::GetACLObject( ACLTYPE eACL )
|
||
{
|
||
CADsAccessControlList* pACL;
|
||
|
||
ASSERT( acl_DACL == eACL || acl_SACL == eACL );
|
||
|
||
if( acl_DACL != eACL && acl_SACL != eACL )
|
||
return NULL;
|
||
|
||
pACL = (CADsAccessControlList*) (pACLObj[ (int)eACL ]);
|
||
|
||
return pACL;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlList::CADsAccessControlList()
|
||
{
|
||
InitializeMembers( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlList::CADsAccessControlList( IUnknown* pUnk ):
|
||
COleDsObject( pUnk )
|
||
{
|
||
InitializeMembers( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::AddACE
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlList::AddACE( IUnknown* pNewACE )
|
||
{
|
||
IDispatch* pDisp = NULL;
|
||
HRESULT hResult;
|
||
IADsAccessControlList* pACL = NULL;
|
||
|
||
if( NULL == m_pIUnk )
|
||
{
|
||
return E_FAIL;
|
||
}
|
||
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList,
|
||
(void**)&pACL );
|
||
|
||
if( FAILED( hResult ) )
|
||
return hResult;
|
||
|
||
hResult = pNewACE->QueryInterface( IID_IDispatch, (void**)&pDisp );
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
hResult = pACL->AddAce( pDisp );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
InitializeMembers( );
|
||
|
||
pDisp->Release( );
|
||
}
|
||
|
||
pACL->Release( );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::AddACE
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlList::RemoveACE( IUnknown* pRemoveACE )
|
||
{
|
||
IDispatch* pDisp = NULL;
|
||
HRESULT hResult;
|
||
IADsAccessControlList* pACL = NULL;
|
||
|
||
if( NULL == m_pIUnk )
|
||
{
|
||
return E_FAIL;
|
||
}
|
||
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList,
|
||
(void**)&pACL );
|
||
|
||
if( FAILED( hResult ) )
|
||
return hResult;
|
||
|
||
hResult = pRemoveACE->QueryInterface( IID_IDispatch, (void**)&pDisp );
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
hResult = pACL->RemoveAce( pDisp );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
InitializeMembers( );
|
||
|
||
pDisp->Release( );
|
||
}
|
||
|
||
pACL->Release( );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::~CADsAccessControlList
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlList::~CADsAccessControlList()
|
||
{
|
||
for( int nIdx = 0 ; nIdx < m_arrACE.GetSize( ) ; nIdx++ )
|
||
{
|
||
delete m_arrACE.GetAt( nIdx );
|
||
}
|
||
|
||
m_arrACE.RemoveAll( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::GetACL
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
IDispatch* CADsAccessControlList::GetACL( )
|
||
{
|
||
IDispatch* pDispatch = NULL;
|
||
|
||
if( NULL != m_pIUnk )
|
||
{
|
||
m_pIUnk->QueryInterface( IID_IDispatch, (void**)&pDispatch );
|
||
}
|
||
|
||
return pDispatch;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
IDispatch* CADsAccessControlList::CreateACL( )
|
||
{
|
||
IDispatch* pDispatch = NULL;
|
||
IADsAccessControlList* pNewACL = NULL;
|
||
HRESULT hResult = NULL;
|
||
DWORD dwAceType = 0;
|
||
|
||
hResult = CoCreateInstance(
|
||
CLSID_AccessControlList,
|
||
NULL,
|
||
CLSCTX_INPROC_SERVER,
|
||
IID_IADsAccessControlList,
|
||
(void **)&pNewACL
|
||
);
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
hResult = pNewACL->QueryInterface( IID_IDispatch,
|
||
(void**)&pDispatch );
|
||
pNewACL->Release( );
|
||
}
|
||
|
||
return pDispatch;
|
||
}
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::PutProperty
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlList::PutProperty ( int nACE,
|
||
int nProp,
|
||
CString& rVal,
|
||
long lCode )
|
||
{
|
||
HRESULT hResult;
|
||
COleDsObject* pACE;
|
||
|
||
ASSERT( nACE < m_arrACE.GetSize( ) );
|
||
|
||
if( nACE < m_arrACE.GetSize( ) )
|
||
{
|
||
pACE = (COleDsObject*) m_arrACE.GetAt( nACE );
|
||
|
||
hResult = pACE->PutProperty ( nProp, rVal, lCode );
|
||
}
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::GetProperty
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
HRESULT CADsAccessControlList::GetProperty ( int nACE,
|
||
int nProp,
|
||
CString& rVal )
|
||
{
|
||
HRESULT hResult;
|
||
COleDsObject* pACE;
|
||
|
||
ASSERT( nACE < m_arrACE.GetSize( ) );
|
||
|
||
if( nACE < m_arrACE.GetSize( ) )
|
||
{
|
||
pACE = (COleDsObject*) m_arrACE.GetAt( nACE );
|
||
|
||
hResult = pACE->GetProperty ( nProp, rVal );
|
||
}
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::InitializeMembers
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsAccessControlList::InitializeMembers( )
|
||
{
|
||
IADsAccessControlList* pACList = NULL;
|
||
IUnknown* pIUnk;
|
||
HRESULT hResult;
|
||
IEnumVARIANT* pEnum = NULL;
|
||
VARIANT aVariant;
|
||
IUnknown* pACE;
|
||
ULONG ulGet;
|
||
|
||
if( !m_pIUnk )
|
||
return;
|
||
|
||
for( int nIdx = 0 ; nIdx < m_arrACE.GetSize( ) ; nIdx++ )
|
||
{
|
||
delete m_arrACE.GetAt( nIdx );
|
||
}
|
||
|
||
m_arrACE.RemoveAll( );
|
||
|
||
|
||
while( TRUE )
|
||
{
|
||
//hResult = m_pIUnk->QueryInterface( IID_IEnumVARIANT,
|
||
// (void**)&pEnum );
|
||
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList,
|
||
(void**)&pACList );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = pACList->get__NewEnum( &pIUnk );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = pIUnk->QueryInterface( IID_IEnumVARIANT,
|
||
(void**)&pEnum );
|
||
|
||
pIUnk->Release( );
|
||
pACList->Release( );
|
||
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
while( TRUE )
|
||
{
|
||
CADsAccessControlEntry* pNewACE;
|
||
|
||
ulGet = 0L;
|
||
hResult = pEnum->Next( 1, &aVariant, &ulGet );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
if( 0 == ulGet )
|
||
break;
|
||
|
||
hResult = V_DISPATCH( &aVariant )->QueryInterface( IID_IUnknown,
|
||
(void**)&pACE );
|
||
VariantClear( &aVariant );
|
||
pNewACE = new CADsAccessControlEntry( pACE );
|
||
|
||
if( NULL != m_pDoc )
|
||
{
|
||
pNewACE->SetDocument( m_pDoc );
|
||
}
|
||
|
||
m_arrACE.Add( pNewACE );
|
||
|
||
pACE->Release( );
|
||
}
|
||
pEnum->Release( );
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function:
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
void CADsAccessControlList::SetDocument ( CMainDoc* pDoc )
|
||
{
|
||
COleDsObject* pObject;
|
||
int nSize, nIdx;
|
||
|
||
COleDsObject::SetDocument ( pDoc );
|
||
|
||
nSize = (int)m_arrACE.GetSize( );
|
||
for( nIdx = 0; nIdx < nSize ; nIdx++ )
|
||
{
|
||
pObject = (COleDsObject*)m_arrACE.GetAt( nIdx );
|
||
pObject->SetDocument( pDoc );
|
||
}
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::GetACECount
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
int CADsAccessControlList::GetACECount ( void )
|
||
{
|
||
return (int)m_arrACE.GetSize( );
|
||
}
|
||
|
||
|
||
//***********************************************************
|
||
// Function: CADsAccessControlList::GetACEObject
|
||
// Arguments:
|
||
// Return:
|
||
// Purpose:
|
||
// Author(s):
|
||
// Revision:
|
||
// Date:
|
||
//***********************************************************
|
||
CADsAccessControlEntry* CADsAccessControlList::GetACEObject ( int nACE )
|
||
{
|
||
CADsAccessControlEntry* pACE;
|
||
|
||
//ASSERT( nACE < GetACECount( ) );
|
||
if( nACE >= GetACECount( ) )
|
||
return NULL;
|
||
|
||
pACE = (CADsAccessControlEntry*) (m_arrACE.GetAt( nACE ) );
|
||
|
||
return pACE;
|
||
}
|
||
|
||
|