2356 lines
56 KiB
C++
2356 lines
56 KiB
C++
|
// schemavw.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "viewex.h"
|
||
|
#include "cacls.h"
|
||
|
#include "schemavw.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
extern IDispatch* pACEClipboard;
|
||
|
extern IDispatch* pACLClipboard;
|
||
|
extern IDispatch* pSDClipboard;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSchemaView
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CSchemaView, CFormView)
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
CSchemaView::CSchemaView()
|
||
|
: CFormView(CSchemaView::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CSchemaView)
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
int nIdx;
|
||
|
|
||
|
m_nProperty = -1;
|
||
|
m_bDirty = FALSE;
|
||
|
m_bInitialized = FALSE;
|
||
|
pSecurityDescriptor = NULL;
|
||
|
|
||
|
m_nLastSD = -1;
|
||
|
m_nLastSDValue = -1;
|
||
|
m_nLastACE = -1;
|
||
|
m_nLastACEValue = -1;
|
||
|
m_nLastACL = acl_Invalid;
|
||
|
m_bACLDisplayed = FALSE;
|
||
|
|
||
|
|
||
|
for( nIdx = 0; nIdx < 32 ; nIdx++ )
|
||
|
{
|
||
|
m_arrNormalControls[ 32 ] = -1;
|
||
|
m_arrSecurityControls[ 32 ] = -1;
|
||
|
}
|
||
|
|
||
|
nIdx = 0;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICCLASS;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICCLSID;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICPRIMARYINTERFACE;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICDERIVEDFROM;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICCONTAINMENT;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICCONTAINER;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICHELPFILENAME;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICSTATICHELPFILECONTEXT;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICOID;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_STATICABSTRACT;
|
||
|
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CLASSTYPE;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CLSID;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_PRIMARYINTERFACE;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_DERIVEDFROM;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CONTAINEMENT;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CONTAINER;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_HELPFILENAME;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_HELPFILECONTEXT;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CLASSOID;
|
||
|
m_arrNormalControls[ nIdx++ ] = IDC_CLASSABSTRACT;
|
||
|
|
||
|
nIdx = 0;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_GBSECURITYDESCRIPTORSTATIC;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_SECURITYDESCRIPTORPROPERTIES;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_SECURITYDESCRIPTORPROPERTYVALUE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_GBACCESSCONTROLENTRIES;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_DACLSACL_LIST;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_ACELIST;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_ACEPROPERTIESLIST;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_ACEPROPERTYVALUE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_COPYACE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_PASTEACE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_DELACE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_ADDACE;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_COPYACL;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_PASTEACL;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_COPYSD;
|
||
|
m_arrSecurityControls[ nIdx++ ] = IDC_PASTESD;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
CSchemaView::~CSchemaView()
|
||
|
{
|
||
|
if( NULL != pSecurityDescriptor )
|
||
|
{
|
||
|
m_pDescriptor->Release( );
|
||
|
delete pSecurityDescriptor;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CFormView::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CSchemaView)
|
||
|
DDX_Control(pDX, IDC_CLASSOID, m_ClassOID);
|
||
|
DDX_Control(pDX, IDC_CLASSABSTRACT, m_Abstract);
|
||
|
DDX_Control(pDX, IDC_MULTIVALUED, m_MultiValued);
|
||
|
DDX_Control(pDX, IDC_PROPDSNAMES, m_DsNames);
|
||
|
DDX_Control(pDX, IDC_PROPOID, m_PropOID);
|
||
|
DDX_Control(pDX, IDC_PROPERTYMANDATORY, m_Mandatory);
|
||
|
DDX_Control(pDX, IDC_CONTAINEMENT, m_Containment);
|
||
|
DDX_Control(pDX, IDC_ITEMOLEDSPATH, m_ItemOleDsPath);
|
||
|
DDX_Control(pDX, IDC_PROPERTYMINRANGE, m_PropertyMinRange);
|
||
|
DDX_Control(pDX, IDC_PROPERTYMAXRANGE, m_PropertyMaxRange);
|
||
|
DDX_Control(pDX, IDC_PROPERTYTYPE, m_PropertyType);
|
||
|
DDX_Control(pDX, IDC_PRIMARYINTERFACE, m_PrimaryInterface);
|
||
|
DDX_Control(pDX, IDC_HELPFILECONTEXT, m_HelpFileContext);
|
||
|
DDX_Control(pDX, IDC_DERIVEDFROM, m_DerivedFrom);
|
||
|
DDX_Control(pDX, IDC_HELPFILENAME, m_HelpFileName);
|
||
|
DDX_Control(pDX, IDC_CLSID, m_CLSID);
|
||
|
DDX_Control(pDX, IDC_CONTAINER, m_Container);
|
||
|
DDX_Control(pDX, IDC_CLASSTYPE, m_ClassType);
|
||
|
DDX_Control(pDX, IDC_PROPVALUE, m_PropValue);
|
||
|
DDX_Control(pDX, IDC_PROPLIST, m_PropList);
|
||
|
//DDX_Control(pDX, IDC_PROPERTIES, m_Schema);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CSchemaView, CFormView)
|
||
|
//{{AFX_MSG_MAP(CSchemaView)
|
||
|
ON_CBN_SELCHANGE(IDC_PROPLIST, OnSelchangeProplist)
|
||
|
ON_BN_CLICKED(IDRELOAD, OnReload)
|
||
|
ON_BN_CLICKED(IDAPPLY, OnApply)
|
||
|
ON_EN_SETFOCUS(IDC_PROPVALUE, OnSetfocusPropvalue)
|
||
|
ON_BN_CLICKED(IDC_METHOD1, OnMethod1)
|
||
|
ON_BN_CLICKED(IDC_METHOD2, OnMethod2)
|
||
|
ON_BN_CLICKED(IDC_METHOD3, OnMethod3)
|
||
|
ON_BN_CLICKED(IDC_METHOD4, OnMethod4)
|
||
|
ON_BN_CLICKED(IDC_METHOD5, OnMethod5)
|
||
|
ON_BN_CLICKED(IDC_METHOD6, OnMethod6)
|
||
|
ON_BN_CLICKED(IDC_METHOD7, OnMethod7)
|
||
|
ON_BN_CLICKED(IDC_METHOD8, OnMethod8)
|
||
|
ON_BN_CLICKED(IDC_APPEND, OnAppend)
|
||
|
ON_BN_CLICKED(IDC_DELETE, OnDelete)
|
||
|
ON_BN_CLICKED(IDC_CHANGE, OnChange)
|
||
|
ON_BN_CLICKED(IDC_CLEAR, OnClear)
|
||
|
ON_BN_CLICKED(IDC_GETPROPERTY, OnGetProperty)
|
||
|
ON_BN_CLICKED(IDC_PUTPROPERTY, OnPutProperty)
|
||
|
ON_CBN_SELCHANGE(IDC_ACELIST, OnACEChange)
|
||
|
ON_CBN_SELCHANGE(IDC_ACEPROPERTIESLIST, OnACEPropertyChange)
|
||
|
ON_CBN_SELCHANGE(IDC_DACLSACL_LIST, OnACLChange)
|
||
|
ON_CBN_SELCHANGE(IDC_SECURITYDESCRIPTORPROPERTIES, OnSDPropertyChange)
|
||
|
ON_BN_CLICKED(IDC_ADDACE, OnAddACE)
|
||
|
ON_BN_CLICKED(IDC_COPYACE, OnCopyACE)
|
||
|
ON_BN_CLICKED(IDC_PASTEACE, OnPasteACE)
|
||
|
ON_BN_CLICKED(IDC_DELACE, OnRemoveACE)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSchemaView diagnostics
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
void CSchemaView::AssertValid() const
|
||
|
{
|
||
|
CFormView::AssertValid();
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
CFormView::Dump(dc);
|
||
|
}
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSchemaView message handlers
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::ResetObjectView( )
|
||
|
{
|
||
|
COleDsObject* pObject;
|
||
|
int nIndex;
|
||
|
TC_ITEM tcItem;
|
||
|
CString strName;
|
||
|
CString strMethCount;
|
||
|
CString strMethName;
|
||
|
int nMethCount;
|
||
|
CHAR szText[ 128 ];
|
||
|
int nFirst = 0;
|
||
|
|
||
|
pObject = GetDocument( )->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
//m_Schema.DeleteAllItems( );
|
||
|
m_PropList.ResetContent( );
|
||
|
|
||
|
memset( &tcItem, 0, sizeof(tcItem) );
|
||
|
tcItem.mask = TCIF_TEXT;
|
||
|
tcItem.pszText = (LPTSTR)szText;
|
||
|
strName = _T("");
|
||
|
tcItem.pszText = strName.GetBuffer( 128 );
|
||
|
|
||
|
//bRez = m_Schema.InsertItem( nIndex, &tcItem );
|
||
|
|
||
|
// next, we'll get methods count/names
|
||
|
nIndex = 0;
|
||
|
|
||
|
strMethCount = pObject->GetAttribute( ca_MethodsCount );
|
||
|
nMethCount = _ttoi( strMethCount.GetBuffer( 128 ) );
|
||
|
for( nIndex = 0; nIndex < nMethCount && nIndex < 8; nIndex++ )
|
||
|
{
|
||
|
GetDlgItem( nIndex + IDC_METHOD1 )->ShowWindow( SW_SHOW );
|
||
|
GetDlgItem( nIndex + IDC_METHOD1 )->SetWindowText
|
||
|
( pObject->GetAttribute( nIndex, ma_Name ) );
|
||
|
}
|
||
|
|
||
|
for( ;nIndex < 8;nIndex++ )
|
||
|
{
|
||
|
GetDlgItem( nIndex + IDC_METHOD1 )->ShowWindow( SW_HIDE );
|
||
|
}
|
||
|
|
||
|
m_nProperty = -1;
|
||
|
|
||
|
m_ItemOleDsPath.SetWindowText ( pObject->GetOleDsPath( ) );
|
||
|
|
||
|
m_ClassType.SetWindowText ( pObject->GetAttribute( ca_Name ) );
|
||
|
m_CLSID.SetWindowText ( pObject->GetAttribute( ca_CLSID ) );
|
||
|
m_HelpFileName.SetWindowText ( pObject->GetAttribute( ca_HelpFileName ) );
|
||
|
m_HelpFileContext.SetWindowText ( pObject->GetAttribute( ca_HelpFileContext ) );
|
||
|
m_PrimaryInterface.SetWindowText( pObject->GetAttribute( ca_PrimaryInterface ) );
|
||
|
m_Containment.SetWindowText ( pObject->GetAttribute( ca_Containment ) );
|
||
|
m_Container.SetWindowText ( pObject->GetAttribute( ca_Container ) );
|
||
|
m_DerivedFrom.SetWindowText ( pObject->GetAttribute( ca_DerivedFrom ) );
|
||
|
m_ClassOID.SetWindowText ( pObject->GetAttribute( ca_OID ) );
|
||
|
m_Abstract.SetWindowText ( pObject->GetAttribute( ca_Abstract ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
|
||
|
{
|
||
|
if( !m_bInitialized )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
ResetObjectView( );
|
||
|
|
||
|
DisplayPropertiesList( );
|
||
|
m_PropList.SetCurSel( 0 );
|
||
|
DisplayCurrentPropertyText( );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::DisplayPropertiesList( )
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
int nItems, nIter;
|
||
|
COleDsObject* pObject;
|
||
|
CString strPropName;
|
||
|
CString strPropValue;
|
||
|
|
||
|
PutPropertyValue( );
|
||
|
|
||
|
pObject = GetDocument( )->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_PropList.ResetContent( );
|
||
|
|
||
|
nItems = pObject->GetPropertyCount( );
|
||
|
|
||
|
for( nIter = 0; nIter < nItems ; nIter++ )
|
||
|
{
|
||
|
int nIdx;
|
||
|
|
||
|
strPropName = pObject->GetAttribute( nIter, pa_DisplayName );
|
||
|
nIdx = m_PropList.AddString( strPropName );
|
||
|
m_PropList.SetItemData( nIdx, (DWORD)nIter );
|
||
|
}
|
||
|
|
||
|
m_PropValue.SetWindowText( _T("") );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::DisplayCurrentPropertyText()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
int nProp;
|
||
|
COleDsObject* pObject;
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue, strTemp;
|
||
|
CString strName;
|
||
|
BOOL bSecurityDescriptor = FALSE;
|
||
|
// BOOL bIsACL;
|
||
|
|
||
|
nProp = m_PropList.GetCurSel( );
|
||
|
if( CB_ERR == nProp )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_nProperty = nProp;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
hResult = pObject->GetProperty( nProp, strPropValue, &bSecurityDescriptor );
|
||
|
|
||
|
m_PropValue.SetWindowText( strPropValue );
|
||
|
|
||
|
//*************
|
||
|
|
||
|
strName = pObject->GetAttribute( nProp, pa_Name );
|
||
|
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_Type );
|
||
|
m_PropertyType.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_MinRange );
|
||
|
m_PropertyMinRange.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_MaxRange );
|
||
|
m_PropertyMaxRange.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_MultiValued );
|
||
|
m_MultiValued.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_OID );
|
||
|
m_PropOID.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_DsNames );
|
||
|
m_DsNames.SetWindowText( strTemp );
|
||
|
|
||
|
//*************
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_Mandatory );
|
||
|
m_Mandatory.SetWindowText( strTemp );
|
||
|
|
||
|
strTemp = pObject->GetAttribute( nProp, pa_Type );
|
||
|
if( bSecurityDescriptor )
|
||
|
{
|
||
|
// we need to display the security descriptor stuff...
|
||
|
if( !m_bACLDisplayed )
|
||
|
{
|
||
|
HideControls( TRUE );
|
||
|
ShowControls( FALSE );
|
||
|
}
|
||
|
if( NULL != pSecurityDescriptor )
|
||
|
{
|
||
|
delete pSecurityDescriptor;
|
||
|
}
|
||
|
if( NULL != m_pDescriptor )
|
||
|
{
|
||
|
m_pDescriptor->Release( );
|
||
|
}
|
||
|
m_bACLDisplayed = TRUE;
|
||
|
DisplayACL( pObject, strName );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( m_bACLDisplayed )
|
||
|
{
|
||
|
HideControls( FALSE );
|
||
|
ShowControls( TRUE );
|
||
|
delete pSecurityDescriptor;
|
||
|
m_pDescriptor->Release( );
|
||
|
}
|
||
|
m_bACLDisplayed = FALSE;
|
||
|
m_pDescriptor = NULL;
|
||
|
pSecurityDescriptor = NULL;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnSelchangeProplist()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutPropertyValue( );
|
||
|
DisplayCurrentPropertyText( );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnReload()
|
||
|
{
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
HCURSOR aCursor, oldCursor;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
if( NULL == pObject )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
aCursor = LoadCursor( NULL, IDC_WAIT );
|
||
|
oldCursor = SetCursor( aCursor );
|
||
|
|
||
|
hResult = pObject->GetInfo( );
|
||
|
|
||
|
DisplayPropertiesList( );
|
||
|
|
||
|
if( -1 != m_nProperty )
|
||
|
{
|
||
|
m_PropList.SetCurSel( m_nProperty );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_PropList.SetCurSel( 0 );
|
||
|
}
|
||
|
|
||
|
DisplayCurrentPropertyText( );
|
||
|
|
||
|
m_bDirty = FALSE;
|
||
|
|
||
|
SetCursor( oldCursor );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
HRESULT CSchemaView::PutPropertyValue()
|
||
|
{
|
||
|
COleDsObject* pObject;
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
|
||
|
// if we're displaying security descriptors, we'll force the dirty flag
|
||
|
m_bDirty = m_bDirty || (NULL != pSecurityDescriptor);
|
||
|
|
||
|
if( -1 == m_nProperty || !m_bDirty )
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return S_OK;
|
||
|
|
||
|
if( NULL != pSecurityDescriptor )
|
||
|
{
|
||
|
// OK, so we need to set the security descriptor
|
||
|
VARIANT var;
|
||
|
IUnknown* pUnk;
|
||
|
IADs* pADs;
|
||
|
CString strName;
|
||
|
BSTR bstrName;
|
||
|
|
||
|
strName = pObject->GetAttribute( m_nProperty, pa_Name );
|
||
|
bstrName = AllocBSTR( strName.GetBuffer( 128 ) );
|
||
|
|
||
|
VariantInit( &var );
|
||
|
V_VT( &var ) = VT_DISPATCH;
|
||
|
V_DISPATCH( &var ) = m_pDescriptor;
|
||
|
m_pDescriptor->AddRef( );
|
||
|
|
||
|
pObject->GetInterface( &pUnk );
|
||
|
pUnk->QueryInterface( IID_IADs, (void**)&pADs );
|
||
|
|
||
|
hResult = pADs->Put( bstrName, var );
|
||
|
|
||
|
SysFreeString( bstrName );
|
||
|
|
||
|
VariantClear( &var );
|
||
|
|
||
|
if( FAILED( hResult ) )
|
||
|
{
|
||
|
AfxMessageBox( OleDsGetErrorText( hResult ) );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
|
||
|
hResult = pObject->PutProperty( m_nProperty,
|
||
|
strPropValue );
|
||
|
}
|
||
|
|
||
|
m_bDirty = FALSE;
|
||
|
|
||
|
return hResult;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnApply()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
HCURSOR aCursor, oldCursor;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
if( NULL == pObject )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
aCursor = LoadCursor( NULL, IDC_WAIT );
|
||
|
oldCursor = SetCursor( aCursor );
|
||
|
|
||
|
hResult = PutPropertyValue( );
|
||
|
|
||
|
hResult = pObject->SetInfo( );
|
||
|
//hResult = pObject->GetInfo( );
|
||
|
|
||
|
m_bDirty = FALSE;
|
||
|
|
||
|
DisplayPropertiesList( );
|
||
|
|
||
|
if( -1 != m_nProperty )
|
||
|
{
|
||
|
m_PropList.SetCurSel( m_nProperty );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_PropList.SetCurSel( 0 );
|
||
|
}
|
||
|
|
||
|
DisplayCurrentPropertyText( );
|
||
|
|
||
|
SetCursor( oldCursor );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod1()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 0 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod2()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 1 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod3()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 2 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod4()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 3 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod5()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 4 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod6()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 5 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod7()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 6 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnMethod8()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
|
||
|
hResult = pObject->CallMethod( 7 );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnSetfocusPropvalue()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
m_bDirty = TRUE;
|
||
|
}
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnInitialUpdate()
|
||
|
{
|
||
|
m_bInitialized = TRUE;
|
||
|
|
||
|
CFormView::OnInitialUpdate();
|
||
|
// TODO: Add your specialized code here and/or call the base class
|
||
|
|
||
|
HideControls( FALSE );
|
||
|
ShowControls( TRUE );
|
||
|
m_bACLDisplayed = FALSE;
|
||
|
|
||
|
OnUpdate( NULL, 0L, NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function:
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::ShowControls( BOOL bNormal )
|
||
|
{
|
||
|
int* pControlArray;
|
||
|
int nIdx;
|
||
|
|
||
|
pControlArray = bNormal ? m_arrNormalControls : m_arrSecurityControls;
|
||
|
for( nIdx = 0; nIdx < 32 ; nIdx++ )
|
||
|
{
|
||
|
CWnd* pWnd;
|
||
|
|
||
|
if( pControlArray[ nIdx ] > 0 )
|
||
|
{
|
||
|
pWnd = GetDlgItem( pControlArray[ nIdx ] );
|
||
|
if( NULL != pWnd )
|
||
|
{
|
||
|
pWnd->ShowWindow( SW_SHOW );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function:
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::HideControls(BOOL bNormal)
|
||
|
{
|
||
|
int* pControlArray;
|
||
|
int nIdx;
|
||
|
|
||
|
pControlArray = bNormal ? m_arrNormalControls : m_arrSecurityControls;
|
||
|
for( nIdx = 0; nIdx < 32 ; nIdx++ )
|
||
|
{
|
||
|
CWnd* pWnd;
|
||
|
|
||
|
if( pControlArray[ nIdx ] > 0 )
|
||
|
{
|
||
|
pWnd = GetDlgItem( pControlArray[ nIdx ] );
|
||
|
if( NULL != pWnd )
|
||
|
{
|
||
|
pWnd->ShowWindow( SW_HIDE );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnAppend()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
if( -1 == m_nProperty )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
hResult = pObject->PutProperty(
|
||
|
(int)( m_PropList.GetItemData( m_nProperty ) ),
|
||
|
strPropValue,
|
||
|
ADS_ATTR_APPEND
|
||
|
);
|
||
|
m_bDirty = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnDelete()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
if( -1 == m_nProperty )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
hResult = pObject->PutProperty(
|
||
|
(int)( m_PropList.GetItemData( m_nProperty ) ),
|
||
|
strPropValue,
|
||
|
ADS_ATTR_DELETE
|
||
|
);
|
||
|
m_bDirty = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnChange()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
if( -1 == m_nProperty )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
hResult = pObject->PutProperty(
|
||
|
(int)( m_PropList.GetItemData( m_nProperty ) ),
|
||
|
strPropValue,
|
||
|
ADS_PROPERTY_UPDATE );
|
||
|
m_bDirty = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnClear()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
COleDsObject* pObject;
|
||
|
|
||
|
if( -1 == m_nProperty )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
hResult = pObject->PutProperty(
|
||
|
(int)( m_PropList.GetItemData( m_nProperty ) ),
|
||
|
strPropValue,
|
||
|
ADS_PROPERTY_CLEAR );
|
||
|
m_bDirty = FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnGetProperty()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
CPropertyDialog pPropDialog;
|
||
|
COleDsObject* pObject;
|
||
|
HRESULT hResult;
|
||
|
CString strValue;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
//pPropDialog.PutFlag( FALSE );
|
||
|
if( pPropDialog.DoModal( ) != IDOK )
|
||
|
return;
|
||
|
|
||
|
|
||
|
hResult = pObject->GetProperty( pPropDialog.m_PropertyName,
|
||
|
strValue,
|
||
|
TRUE,
|
||
|
ADsTypeFromString( pPropDialog.m_PropertyType ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSchemaView::OnPutProperty()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
// TODO: Add your control notification handler code here
|
||
|
CPropertyDialog pPropDialog;
|
||
|
COleDsObject* pObject;
|
||
|
HRESULT hResult;
|
||
|
CString strValue;
|
||
|
|
||
|
pObject = GetDocument()->GetCurrentObject( );
|
||
|
if( NULL == pObject )
|
||
|
return;
|
||
|
|
||
|
//pPropDialog.PutFlag( FALSE );
|
||
|
if( pPropDialog.DoModal( ) != IDOK )
|
||
|
return;
|
||
|
|
||
|
hResult = pObject->PutProperty( pPropDialog.m_PropertyName,
|
||
|
pPropDialog.m_PropertyValue,
|
||
|
TRUE,
|
||
|
ADsTypeFromString( pPropDialog.m_PropertyType ) );
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSetMandatoryProperties dialog
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
CSetMandatoryProperties::CSetMandatoryProperties(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CSetMandatoryProperties::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CSetMandatoryProperties)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
m_nFuncSet = -1;
|
||
|
m_nProperty = -1;
|
||
|
m_bDirty = FALSE;
|
||
|
m_bInitialized = FALSE;
|
||
|
m_pObject = NULL;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CSetMandatoryProperties)
|
||
|
DDX_Control(pDX, IDC_CONTAINEMENT, m_Containment);
|
||
|
DDX_Control(pDX, IDC_ITEMOLEDSPATH, m_ItemOleDsPath);
|
||
|
DDX_Control(pDX, IDC_PROPERTYOPTIONAL, m_PropertyOptional);
|
||
|
DDX_Control(pDX, IDC_PROPERTYNORMAL, m_PropertyNormal);
|
||
|
DDX_Control(pDX, IDC_PROPERTYMINRANGE, m_PropertyMinRange);
|
||
|
DDX_Control(pDX, IDC_PROPERTYMAXRANGE, m_PropertyMaxRange);
|
||
|
DDX_Control(pDX, IDC_PROPERTYTYPE, m_PropertyType);
|
||
|
DDX_Control(pDX, IDC_PRIMARYINTERFACE, m_PrimaryInterface);
|
||
|
DDX_Control(pDX, IDC_HELPFILECONTEXT, m_HelpFileContext);
|
||
|
DDX_Control(pDX, IDC_DERIVEDFROM, m_DerivedFrom);
|
||
|
DDX_Control(pDX, IDC_HELPFILENAME, m_HelpFileName);
|
||
|
DDX_Control(pDX, IDC_CLSID, m_CLSID);
|
||
|
DDX_Control(pDX, IDC_CONTAINER, m_Container);
|
||
|
DDX_Control(pDX, IDC_CLASSTYPE, m_ClassType);
|
||
|
DDX_Control(pDX, IDC_PROPVALUE, m_PropValue);
|
||
|
DDX_Control(pDX, IDC_PROPLIST, m_PropList);
|
||
|
DDX_Control(pDX, IDC_PROPERTIES, m_Schema);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CSetMandatoryProperties, CDialog)
|
||
|
//{{AFX_MSG_MAP(CSetMandatoryProperties)
|
||
|
ON_NOTIFY(TCN_SELCHANGE, IDC_PROPERTIES, OnSelchangeProperties)
|
||
|
ON_CBN_SELCHANGE(IDC_PROPLIST, OnSelchangeProplist)
|
||
|
ON_EN_SETFOCUS(IDC_PROPVALUE, OnSetfocusPropvalue)
|
||
|
ON_BN_CLICKED(IDOK, OnOK)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CSetMandatoryProperties message handlers
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::SetOleDsObject( COleDsObject* pObject )
|
||
|
{
|
||
|
m_pObject = pObject;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::OnSelchangeProperties(NMHDR* pNMHDR, LRESULT* pResult)
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
int nSel, nItems, nIter;
|
||
|
CString strPropName;
|
||
|
CString strPropValue;
|
||
|
CString strMandatory;
|
||
|
|
||
|
*pResult = 0;
|
||
|
|
||
|
PutPropertyValue( );
|
||
|
nSel = m_Schema.GetCurSel( );
|
||
|
if( nSel == LB_ERR )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
m_nFuncSet = nSel;
|
||
|
m_nProperty = -1;
|
||
|
|
||
|
m_PropList.ResetContent( );
|
||
|
|
||
|
nItems = m_pObject->GetPropertyCount( );
|
||
|
|
||
|
for( nIter = 0; nIter < nItems ; nIter++ )
|
||
|
{
|
||
|
int nIdx;
|
||
|
|
||
|
strMandatory = m_pObject->GetAttribute( nIter, pa_Mandatory );
|
||
|
if( strMandatory == _T("Yes") )
|
||
|
//if( TRUE )
|
||
|
{
|
||
|
strPropName = m_pObject->GetAttribute( nIter, pa_DisplayName );
|
||
|
nIdx = m_PropList.AddString( strPropName );
|
||
|
m_PropList.SetItemData( nIdx, nIter );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_PropList.SetCurSel( 0 );
|
||
|
|
||
|
OnSelchangeProplist( );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::OnSelchangeProplist()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
int nMandProp, nProp, nFuncSet;
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
CString strTemp;
|
||
|
|
||
|
|
||
|
PutPropertyValue( );
|
||
|
m_PropValue.SetWindowText( _T("") );
|
||
|
nProp = m_PropList.GetCurSel( );
|
||
|
nMandProp = (int)m_PropList.GetItemData( nProp );
|
||
|
nFuncSet = m_Schema.GetCurSel( );
|
||
|
|
||
|
if( CB_ERR == nProp || CB_ERR == nFuncSet )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_nProperty = nProp;
|
||
|
m_nFuncSet = nFuncSet;
|
||
|
|
||
|
hResult = m_pObject->GetProperty( nMandProp, strPropValue );
|
||
|
|
||
|
m_PropValue.SetWindowText( strPropValue );
|
||
|
|
||
|
//******************
|
||
|
strTemp = m_pObject->GetAttribute( nMandProp, pa_Type );
|
||
|
m_PropertyType.SetWindowText( strTemp );
|
||
|
|
||
|
//******************
|
||
|
strTemp = m_pObject->GetAttribute( nMandProp, pa_MinRange );
|
||
|
m_PropertyMinRange.SetWindowText( strTemp );
|
||
|
|
||
|
//******************
|
||
|
strTemp = m_pObject->GetAttribute( nMandProp, pa_MaxRange );
|
||
|
m_PropertyMaxRange.SetWindowText( strTemp );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::OnSetfocusPropvalue()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
m_bDirty = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CSetMandatoryProperties::OnOK()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutPropertyValue( );
|
||
|
CDialog::OnOK( );
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
HRESULT CSetMandatoryProperties::PutPropertyValue()
|
||
|
{
|
||
|
HRESULT hResult;
|
||
|
CString strPropValue;
|
||
|
|
||
|
if( -1 == m_nProperty || -1 == m_nFuncSet || !m_bDirty )
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
m_PropValue.GetWindowText( strPropValue );
|
||
|
hResult = m_pObject->PutProperty( (int)( m_PropList.GetItemData( m_nProperty ) ),
|
||
|
strPropValue );
|
||
|
m_bDirty = FALSE;
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
BOOL CSetMandatoryProperties::OnInitDialog()
|
||
|
{
|
||
|
int nIndex;
|
||
|
TC_ITEM tcItem;
|
||
|
CString strName;
|
||
|
CHAR szText[ 128 ];
|
||
|
BOOL bRez;
|
||
|
LRESULT lResult;
|
||
|
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
// TODO: Add extra initialization here
|
||
|
m_Schema.DeleteAllItems( );
|
||
|
|
||
|
memset( &tcItem, 0, sizeof(tcItem) );
|
||
|
tcItem.mask = TCIF_TEXT;
|
||
|
tcItem.pszText = (LPTSTR)szText;
|
||
|
|
||
|
|
||
|
nIndex = 0;
|
||
|
|
||
|
strName = _T("");
|
||
|
tcItem.pszText = strName.GetBuffer( 128 );
|
||
|
bRez = m_Schema.InsertItem( nIndex, &tcItem );
|
||
|
|
||
|
m_nFuncSet = -1;
|
||
|
m_nProperty = -1;
|
||
|
m_Schema.SetCurSel( 0 );
|
||
|
|
||
|
m_ItemOleDsPath.SetWindowText( m_pObject->GetOleDsPath( ) );
|
||
|
|
||
|
m_ClassType.SetWindowText( m_pObject->GetAttribute( ca_Name ) );
|
||
|
|
||
|
m_CLSID.SetWindowText( m_pObject->GetAttribute( ca_CLSID ) );
|
||
|
|
||
|
m_HelpFileName.SetWindowText( m_pObject->GetAttribute( ca_HelpFileName ) );
|
||
|
|
||
|
m_PrimaryInterface.SetWindowText( m_pObject->GetAttribute( ca_PrimaryInterface ) );
|
||
|
|
||
|
m_Containment.SetWindowText( m_pObject->GetAttribute( ca_Containment ) );
|
||
|
|
||
|
m_Container.SetWindowText ( m_pObject->GetAttribute( ca_Container ) );
|
||
|
|
||
|
m_DerivedFrom.SetWindowText( m_pObject->GetAttribute( ca_DerivedFrom ) );
|
||
|
|
||
|
OnSelchangeProperties( NULL, &lResult );
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPropertyDialog dialog
|
||
|
|
||
|
|
||
|
CPropertyDialog::CPropertyDialog(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CPropertyDialog::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CPropertyDialog)
|
||
|
m_PropertyName = _T("");
|
||
|
m_PropertyType = _T("");
|
||
|
m_PropertyValue = _T("");
|
||
|
//}}AFX_DATA_INIT
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CPropertyDialog::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CPropertyDialog)
|
||
|
DDX_CBString(pDX, IDC_NEWPROPERTYNAME, m_PropertyName);
|
||
|
DDX_CBString(pDX, IDC_NEWPROPERTYTYPE, m_PropertyType);
|
||
|
DDX_CBString(pDX, IDC_NEWPROPERTYVALUE, m_PropertyValue);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CPropertyDialog, CDialog)
|
||
|
//{{AFX_MSG_MAP(CPropertyDialog)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CPropertyDialog message handlers
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
BOOL CPropertyDialog::OnInitDialog()
|
||
|
{
|
||
|
|
||
|
CString strLastValue;
|
||
|
CComboBox* pCombo;
|
||
|
|
||
|
CDialog::OnInitDialog();
|
||
|
|
||
|
// TODO: Add extra initialization here
|
||
|
//*******************
|
||
|
|
||
|
GetLRUList( IDC_NEWPROPERTYNAME, _T("PropertyDialog_Name") );
|
||
|
|
||
|
// TODO: Add extra initialization here
|
||
|
//*******************
|
||
|
pCombo = (CComboBox*)GetDlgItem( IDC_NEWPROPERTYTYPE );
|
||
|
pCombo->AddString( _T("ADSTYPE_DN_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_CASE_EXACT_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_CASE_IGNORE_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_PRINTABLE_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_NUMERIC_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_BOOLEAN") );
|
||
|
pCombo->AddString( _T("ADSTYPE_INTEGER") );
|
||
|
pCombo->AddString( _T("ADSTYPE_OCTET_STRING") );
|
||
|
pCombo->AddString( _T("ADSTYPE_UTC_TIME") );
|
||
|
pCombo->AddString( _T("ADSTYPE_LARGE_INTEGER") );
|
||
|
pCombo->AddString( _T("ADSTYPE_PROV_SPECIFIC") );
|
||
|
|
||
|
|
||
|
// TODO: Add extra initialization here
|
||
|
//*******************
|
||
|
GetLRUList( IDC_NEWPROPERTYVALUE, _T("PropertyDialog_Value") );
|
||
|
|
||
|
//GetLastProfileString( _T("PropertyDialog_IsMultiValued"),
|
||
|
// strLastValue );
|
||
|
//if( strLastValue.CompareNoCase( _T("Yes") ) )
|
||
|
//{
|
||
|
//m_Secure.SetCheck( 0 );
|
||
|
//}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CPropertyDialog::OnOK()
|
||
|
{
|
||
|
// TODO: Add extra validation here
|
||
|
//*******************
|
||
|
GetDlgItemText( IDC_NEWPROPERTYNAME, m_PropertyName );
|
||
|
SaveLRUList( IDC_NEWPROPERTYNAME, _T("PropertyDialog_Name"), 20 );
|
||
|
|
||
|
//*******************
|
||
|
GetDlgItemText( IDC_NEWPROPERTYTYPE, m_PropertyType );
|
||
|
|
||
|
//*******************
|
||
|
GetDlgItemText( IDC_NEWPROPERTYVALUE, m_PropertyValue );
|
||
|
SaveLRUList( IDC_NEWPROPERTYVALUE, _T("PropertyDialog_Value"), 20 );
|
||
|
|
||
|
CDialog::OnOK();
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************
|
||
|
Function:
|
||
|
Arguments:
|
||
|
Return:
|
||
|
Purpose:
|
||
|
Author(s):
|
||
|
Revision:
|
||
|
Date:
|
||
|
***********************************************************/
|
||
|
void CPropertyDialog::SaveLRUList( int idCBox, TCHAR* pszSection, int nMax )
|
||
|
{
|
||
|
CComboBox* pCombo;
|
||
|
TCHAR szEntry[ MAX_PATH ];
|
||
|
TCHAR szIndex[ 8 ];
|
||
|
CString strText, strItem;
|
||
|
int nVal, nIdx, nItems;
|
||
|
|
||
|
pCombo = (CComboBox*)GetDlgItem( idCBox );
|
||
|
pCombo->GetWindowText( strText );
|
||
|
|
||
|
_tcscpy( szEntry, _T("Value_1") );
|
||
|
|
||
|
if( strText.GetLength( ) )
|
||
|
{
|
||
|
WritePrivateProfileString( pszSection, szEntry, (LPCTSTR)strText, ADSVW_INI_FILE );
|
||
|
}
|
||
|
|
||
|
nItems = pCombo->GetCount( );
|
||
|
nVal = 2;
|
||
|
|
||
|
for( nIdx = 0; nItems != CB_ERR && nIdx < nItems && nIdx < nMax ; nIdx ++ )
|
||
|
{
|
||
|
pCombo->GetLBText( nIdx, strItem );
|
||
|
|
||
|
if( strItem.CompareNoCase( strText ) )
|
||
|
{
|
||
|
_itot( nVal++, szIndex, 10 );
|
||
|
_tcscpy( szEntry, _T("Value_") );
|
||
|
_tcscat( szEntry, szIndex );
|
||
|
WritePrivateProfileString( pszSection, szEntry, (LPCTSTR)strItem, ADSVW_INI_FILE );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function:
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CPropertyDialog::GetLRUList( int idCBox, TCHAR* pszSection )
|
||
|
{
|
||
|
CComboBox* pCombo;
|
||
|
int nIter;
|
||
|
TCHAR szEntry[ MAX_PATH ];
|
||
|
TCHAR szIndex[ 8 ];
|
||
|
TCHAR szValue[ 1024 ];
|
||
|
|
||
|
pCombo = (CComboBox*)GetDlgItem( idCBox );
|
||
|
|
||
|
for( nIter = 0; nIter < 100 ; nIter++ )
|
||
|
{
|
||
|
_itot( nIter + 1, szIndex, 10 );
|
||
|
_tcscpy( szEntry, _T("Value_") );
|
||
|
_tcscat( szEntry, szIndex );
|
||
|
GetPrivateProfileString( pszSection, szEntry,
|
||
|
_T(""), szValue, 1023, ADSVW_INI_FILE );
|
||
|
if( _tcslen( szValue ) )
|
||
|
{
|
||
|
pCombo->AddString( szValue );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pCombo->SetCurSel( 0 );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function:
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplayACL(COleDsObject * pObject, CString strAttrName)
|
||
|
{
|
||
|
VARIANT var;
|
||
|
BSTR bstrName;
|
||
|
IADs* pIADs = NULL;
|
||
|
IUnknown* pIUnk = NULL;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
while( TRUE )
|
||
|
{
|
||
|
hResult = pObject->GetInterface( &pIUnk );
|
||
|
ASSERT( SUCCEEDED( hResult ) );
|
||
|
|
||
|
if( FAILED( hResult ) )
|
||
|
break;
|
||
|
|
||
|
hResult = pIUnk->QueryInterface( IID_IADs, (void**)&pIADs );
|
||
|
pIUnk->Release( );
|
||
|
|
||
|
ASSERT( SUCCEEDED( hResult ) );
|
||
|
if( FAILED( hResult ) )
|
||
|
break;
|
||
|
|
||
|
bstrName = AllocBSTR( strAttrName.GetBuffer( 128 ) );
|
||
|
hResult = pIADs->Get( bstrName, &var );
|
||
|
SysFreeString( bstrName );
|
||
|
pIADs->Release( );
|
||
|
|
||
|
ASSERT( SUCCEEDED( hResult ) );
|
||
|
if( FAILED( hResult ) )
|
||
|
break;
|
||
|
|
||
|
m_pDescriptor = CopySD( V_DISPATCH( &var ) );
|
||
|
VariantClear( &var );
|
||
|
{
|
||
|
IUnknown* pIUnk;
|
||
|
|
||
|
hResult = m_pDescriptor->QueryInterface( IID_IUnknown,
|
||
|
(void**)&pIUnk );
|
||
|
pSecurityDescriptor = new CADsSecurityDescriptor( pIUnk );
|
||
|
pIUnk->Release( );
|
||
|
pSecurityDescriptor->SetDocument( GetDocument( ) );
|
||
|
}
|
||
|
|
||
|
VariantClear( &var );
|
||
|
|
||
|
|
||
|
|
||
|
FillACLControls( );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::FillACLControls
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::FillACLControls()
|
||
|
{
|
||
|
DisplaySDPropertiesList( 0 );
|
||
|
|
||
|
DisplaySDPropertyValue( );
|
||
|
|
||
|
DisplayACLNames( 0 );
|
||
|
|
||
|
DisplayACENames( 0 );
|
||
|
|
||
|
DisplayACEPropertiesList( 0 );
|
||
|
|
||
|
DisplayACEPropertyValue( );
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplayACLNames
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplayACLNames( int nSelect )
|
||
|
{
|
||
|
CComboBox* pACLNames;
|
||
|
|
||
|
pACLNames = (CComboBox*)GetDlgItem( IDC_DACLSACL_LIST );
|
||
|
pACLNames->ResetContent( );
|
||
|
|
||
|
pACLNames->AddString( _T("DACL") );
|
||
|
pACLNames->AddString( _T("SACL") );
|
||
|
|
||
|
pACLNames->SetCurSel( nSelect );
|
||
|
|
||
|
m_nLastACL = GetCurrentACL( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplayACENames
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplayACENames( int nSelect )
|
||
|
{
|
||
|
ACLTYPE eType;
|
||
|
int nACECount, nIdx;
|
||
|
CComboBox* pACENames;
|
||
|
CString strACEName;
|
||
|
CADsAccessControlEntry* pACE;
|
||
|
CADsAccessControlList* pACL;
|
||
|
|
||
|
eType = GetCurrentACL( );
|
||
|
|
||
|
pACENames = (CComboBox*)GetDlgItem( IDC_ACELIST );
|
||
|
pACENames->ResetContent( );
|
||
|
|
||
|
pACL = pSecurityDescriptor->GetACLObject( eType );
|
||
|
if( NULL != pACL )
|
||
|
{
|
||
|
nACECount = pACL->GetACECount( );
|
||
|
|
||
|
for( nIdx = 0; nIdx < nACECount ; nIdx++ )
|
||
|
{
|
||
|
pACE = pACL->GetACEObject( nIdx );
|
||
|
if( NULL != pACE )
|
||
|
{
|
||
|
strACEName = pACE->GetItemName( );
|
||
|
pACENames->AddString( strACEName );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_nLastACE = nSelect;
|
||
|
|
||
|
pACENames->SetCurSel( nSelect );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplayACEPropertiesList
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplayACEPropertiesList( int nSelect )
|
||
|
{
|
||
|
ACLTYPE eType;
|
||
|
int nACE;
|
||
|
CComboBox* pACEPropList;
|
||
|
int nAttrCount, nIdx;
|
||
|
CString strPropName;
|
||
|
CADsAccessControlEntry* pACE;
|
||
|
CADsAccessControlList* pACL;
|
||
|
|
||
|
eType = GetCurrentACL( );
|
||
|
nACE = GetCurrentACE( );
|
||
|
if( -1 == nACE )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pACEPropList= (CComboBox*)GetDlgItem( IDC_ACEPROPERTIESLIST );
|
||
|
pACEPropList->ResetContent( );
|
||
|
|
||
|
pACL = pSecurityDescriptor->GetACLObject( eType );
|
||
|
if(NULL == pACL)
|
||
|
return;
|
||
|
|
||
|
pACE = pACL->GetACEObject( nACE );
|
||
|
if(NULL == pACE)
|
||
|
return;
|
||
|
|
||
|
nAttrCount = pACE->GetPropertyCount( );
|
||
|
for( nIdx = 0; nIdx < nAttrCount ; nIdx++ )
|
||
|
{
|
||
|
int nPos;
|
||
|
|
||
|
strPropName = pACE->GetAttribute( nIdx, pa_DisplayName );
|
||
|
nPos = pACEPropList->AddString( strPropName );
|
||
|
m_PropList.SetItemData( nPos, (DWORD)nIdx );
|
||
|
}
|
||
|
|
||
|
pACEPropList->SetCurSel( nSelect );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplaySDPropertiesList
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplaySDPropertiesList(int nSelect)
|
||
|
{
|
||
|
CComboBox* pSDPropList;
|
||
|
int nAttrCount, nIdx;
|
||
|
CString strPropName;
|
||
|
|
||
|
pSDPropList = (CComboBox*)GetDlgItem( IDC_SECURITYDESCRIPTORPROPERTIES );
|
||
|
pSDPropList->ResetContent( );
|
||
|
|
||
|
nAttrCount = pSecurityDescriptor->GetPropertyCount( );
|
||
|
|
||
|
for( nIdx = 0; nIdx < nAttrCount ; nIdx++ )
|
||
|
{
|
||
|
int nPos;
|
||
|
|
||
|
strPropName = pSecurityDescriptor->GetAttribute( nIdx, pa_DisplayName );
|
||
|
nPos = pSDPropList->AddString( strPropName );
|
||
|
m_PropList.SetItemData( nPos, (DWORD)nIdx );
|
||
|
}
|
||
|
|
||
|
pSDPropList->SetCurSel( nSelect );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplayACEPropertyValue
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplayACEPropertyValue( )
|
||
|
{
|
||
|
CString strPropValue;
|
||
|
HRESULT hResult;
|
||
|
CADsAccessControlEntry* pACE;
|
||
|
CADsAccessControlList* pACL;
|
||
|
LONG lValue;
|
||
|
TCHAR szHex[ 128 ];
|
||
|
|
||
|
m_nLastACEValue = GetCurrentACEProperty( );
|
||
|
|
||
|
if( -1 == m_nLastACEValue )
|
||
|
return;
|
||
|
|
||
|
if( acl_Invalid == m_nLastACL )
|
||
|
return;
|
||
|
|
||
|
if( -1 == m_nLastACE )
|
||
|
return;
|
||
|
|
||
|
pACL = pSecurityDescriptor->GetACLObject( m_nLastACL );
|
||
|
if( NULL == pACL )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
pACE = pACL->GetACEObject( m_nLastACE );
|
||
|
|
||
|
if( NULL == pACE )
|
||
|
return;
|
||
|
|
||
|
hResult = pACE->GetProperty( m_nLastACEValue, strPropValue );
|
||
|
|
||
|
switch( m_nLastACEValue )
|
||
|
{
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
case 4:
|
||
|
lValue = _ttol( strPropValue.GetBuffer( 128 ) );
|
||
|
_tcscpy( szHex, _T("0x" ) );
|
||
|
_ltot( lValue, szHex + _tcslen(szHex), 16 );
|
||
|
strPropValue = szHex;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
GetDlgItem( IDC_ACEPROPERTYVALUE )->SetWindowText(
|
||
|
strPropValue );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::DisplaySDPropertyValue
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::DisplaySDPropertyValue( )
|
||
|
{
|
||
|
CString strPropValue, strEditValue;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
m_nLastSDValue = GetCurrentSDProperty( );
|
||
|
|
||
|
hResult = pSecurityDescriptor->GetProperty( m_nLastSDValue,
|
||
|
strPropValue );
|
||
|
GetDlgItem( IDC_SECURITYDESCRIPTORPROPERTYVALUE )->SetWindowText(
|
||
|
strPropValue );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::PutACEPropertyValue
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::PutACEPropertyValue( )
|
||
|
{
|
||
|
ACLTYPE eType;
|
||
|
int nACE;
|
||
|
CString strPropValue, strEditValue;
|
||
|
CADsAccessControlEntry* pACE;
|
||
|
CADsAccessControlList* pACL;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
if( -1 == m_nLastACEValue )
|
||
|
return;
|
||
|
|
||
|
if( acl_Invalid == m_nLastACL )
|
||
|
return;
|
||
|
|
||
|
if( -1 == m_nLastACE )
|
||
|
return;
|
||
|
|
||
|
eType = m_nLastACL;
|
||
|
nACE = m_nLastACE;
|
||
|
|
||
|
pACL = pSecurityDescriptor->GetACLObject( eType );
|
||
|
if( NULL == pACL )
|
||
|
return;
|
||
|
|
||
|
pACE = pACL->GetACEObject( nACE );
|
||
|
|
||
|
GetDlgItem( IDC_ACEPROPERTYVALUE )->GetWindowText( strEditValue );
|
||
|
|
||
|
switch( m_nLastACEValue )
|
||
|
{
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
case 4:
|
||
|
{
|
||
|
LONG lValue = 0;
|
||
|
TCHAR szText[ 16 ];
|
||
|
|
||
|
_stscanf( strEditValue.GetBuffer( 128 ), _T("%lx"), &lValue );
|
||
|
_ltot( lValue, szText, 10 );
|
||
|
strEditValue = szText;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
hResult = pACE->GetProperty( m_nLastACEValue, strPropValue );
|
||
|
|
||
|
|
||
|
if( strEditValue.Compare( strPropValue ) )
|
||
|
{
|
||
|
hResult = pACE->PutProperty( m_nLastACEValue, strEditValue );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::PutSDPropertyValue
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::PutSDPropertyValue()
|
||
|
{
|
||
|
CString strPropValue, strEditValue;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
if( -1 == m_nLastSDValue )
|
||
|
return;
|
||
|
|
||
|
hResult = pSecurityDescriptor->GetProperty( m_nLastSDValue,
|
||
|
strPropValue );
|
||
|
|
||
|
GetDlgItem( IDC_SECURITYDESCRIPTORPROPERTYVALUE )->GetWindowText(
|
||
|
strEditValue );
|
||
|
|
||
|
if( strEditValue.Compare( strPropValue ) )
|
||
|
{
|
||
|
hResult = pSecurityDescriptor->PutProperty( m_nLastACEValue,
|
||
|
strEditValue );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::GetCurrentACL
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
ACLTYPE CSchemaView::GetCurrentACL()
|
||
|
{
|
||
|
CComboBox* pList;
|
||
|
|
||
|
pList = (CComboBox*) GetDlgItem( IDC_DACLSACL_LIST );
|
||
|
|
||
|
return (ACLTYPE) ( 1 + pList->GetCurSel( ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::GetCurrentACE
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
int CSchemaView::GetCurrentACE()
|
||
|
{
|
||
|
CComboBox* pList;
|
||
|
|
||
|
pList = (CComboBox*) GetDlgItem( IDC_ACELIST );
|
||
|
|
||
|
return pList->GetCurSel( );
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::GetCurrentSDProperty
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
int CSchemaView::GetCurrentSDProperty( )
|
||
|
{
|
||
|
CComboBox* pList;
|
||
|
|
||
|
pList = (CComboBox*) GetDlgItem( IDC_SECURITYDESCRIPTORPROPERTIES );
|
||
|
|
||
|
return pList->GetCurSel( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::GetCurrentACEProperty
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
int CSchemaView::GetCurrentACEProperty( )
|
||
|
{
|
||
|
CComboBox* pList;
|
||
|
|
||
|
pList = (CComboBox*) GetDlgItem( IDC_ACEPROPERTIESLIST );
|
||
|
|
||
|
return pList->GetCurSel( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnACEChange
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnACEChange( )
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutACEPropertyValue( );
|
||
|
|
||
|
m_nLastACE = GetCurrentACE( );
|
||
|
|
||
|
DisplayACEPropertiesList( 0 );
|
||
|
|
||
|
DisplayACEPropertyValue( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnACEPropertyChange
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnACEPropertyChange()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutACEPropertyValue( );
|
||
|
|
||
|
DisplayACEPropertyValue( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnACLChange
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnACLChange()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutACEPropertyValue( );
|
||
|
|
||
|
m_nLastACL = GetCurrentACL( );
|
||
|
|
||
|
DisplayACENames( 0 );
|
||
|
|
||
|
DisplayACEPropertiesList( 0 );
|
||
|
|
||
|
DisplayACEPropertyValue( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnSDPropertyChange
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnSDPropertyChange()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
PutSDPropertyValue( );
|
||
|
|
||
|
DisplaySDPropertyValue( );
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnAddACE
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnAddACE()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
ACLTYPE aclType;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
aclType = GetCurrentACL( );
|
||
|
|
||
|
if( acl_Invalid != aclType )
|
||
|
{
|
||
|
IDispatch* pACEDisp;
|
||
|
IUnknown* pACEUnk;
|
||
|
CADsAccessControlEntry* pACE = new CADsAccessControlEntry;
|
||
|
|
||
|
pACEDisp = pACE->CreateACE( );
|
||
|
|
||
|
delete pACE;
|
||
|
|
||
|
if( NULL != pACEDisp )
|
||
|
{
|
||
|
hResult = pACEDisp->QueryInterface( IID_IUnknown, (void**)&pACEUnk );
|
||
|
pACEDisp->Release( );
|
||
|
|
||
|
hResult = pSecurityDescriptor->AddACE( aclType, pACEUnk );
|
||
|
pACEUnk->Release( );
|
||
|
FillACLControls( );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnCopyACE
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnCopyACE()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
int nACE;
|
||
|
IDispatch* pDisp;
|
||
|
ACLTYPE aclType;
|
||
|
|
||
|
aclType = GetCurrentACL( );
|
||
|
nACE = GetCurrentACE( );
|
||
|
|
||
|
pDisp = CopyACE( pSecurityDescriptor->GetACLObject( aclType )->GetACEObject( nACE )->GetACE( ) );
|
||
|
|
||
|
if( NULL != pACEClipboard )
|
||
|
{
|
||
|
pACEClipboard->Release( );
|
||
|
}
|
||
|
|
||
|
pACEClipboard = pDisp;
|
||
|
}
|
||
|
|
||
|
|
||
|
//***********************************************************
|
||
|
// Function: CSchemaView::OnPasteACE
|
||
|
// Arguments:
|
||
|
// Return:
|
||
|
// Purpose:
|
||
|
// Author(s):
|
||
|
// Revision:
|
||
|
// Date:
|
||
|
//***********************************************************
|
||
|
void CSchemaView::OnPasteACE()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
IUnknown* pACEUnk;
|
||
|
ACLTYPE aclType;
|
||
|
HRESULT hResult;
|
||
|
|
||
|
aclType = GetCurrentACL( );
|
||
|
if( NULL != pACEClipboard )
|
||
|
{
|
||
|
hResult = pACEClipboard->QueryInterface( IID_IUnknown, (void**)&pACEUnk );
|
||
|
|
||
|
hResult = pSecurityDescriptor->AddACE( aclType, pACEUnk );
|
||
|
pACEUnk->Release( );
|
||
|
FillACLControls( );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CSchemaView::OnRemoveACE()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
// TODO: Add your control notification handler code here
|
||
|
ACLTYPE aclType;
|
||
|
HRESULT hResult;
|
||
|
int nCurrentACE;
|
||
|
|
||
|
aclType = GetCurrentACL( );
|
||
|
nCurrentACE = GetCurrentACE( );
|
||
|
|
||
|
if( acl_Invalid != aclType )
|
||
|
{
|
||
|
IDispatch* pACEDisp;
|
||
|
IUnknown* pACEUnk;
|
||
|
|
||
|
pACEDisp = pSecurityDescriptor->GetACLObject( aclType )->GetACEObject( nCurrentACE )->GetACE( );
|
||
|
|
||
|
if( NULL != pACEDisp )
|
||
|
{
|
||
|
hResult = pACEDisp->QueryInterface( IID_IUnknown, (void**)&pACEUnk );
|
||
|
pACEDisp->Release( );
|
||
|
|
||
|
hResult = pSecurityDescriptor->RemoveACE( aclType, pACEUnk );
|
||
|
pACEUnk->Release( );
|
||
|
FillACLControls( );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|