WindowsXP-SP1/ds/adsi/oledsvw/colldlg.cpp
2020-09-30 16:53:49 +02:00

458 lines
10 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// colldlg.cpp : implementation file
//
#include "stdafx.h"
#include "viewex.h"
#include "colldlg.h"
#include "delgrpit.h"
#include "grpcrtit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCollectionDialog dialog
CCollectionDialog::CCollectionDialog(CWnd* pParent /*=NULL*/)
: CDialog(CCollectionDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CCollectionDialog)
//}}AFX_DATA_INIT
m_pCollection = NULL;
m_pMembers = NULL;
m_pGroup = NULL;
m_nSelectedItem = -1;
}
CCollectionDialog::~CCollectionDialog( )
{
m_Paths.RemoveAll( );
m_Types.RemoveAll( );
m_Names.RemoveAll( );
if( NULL != m_pGroup && NULL != m_pMembers )
{
m_pMembers->Release( );
}
}
void CCollectionDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCollectionDialog)
DDX_Control(pDX, IDC_ITEMTYPE, m_strItemType);
DDX_Control(pDX, IDC_ITEMOLEDSPATH, m_strItemOleDsPath);
DDX_Control(pDX, IDC_COLLECTONITEMSLIST, m_ItemsList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCollectionDialog, CDialog)
//{{AFX_MSG_MAP(CCollectionDialog)
ON_LBN_SELCHANGE(IDC_COLLECTONITEMSLIST, OnSelchangeItemCollection)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
ON_BN_CLICKED(IDC_REMOVE, OnRemove)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCollectionDialog message handlers
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::SetCollectionInterface( IADsCollection* pICollection )
{
m_pCollection = pICollection;
BuildStrings( );
}
/***********************************************************
Function: CCollectionDialog::SetGroup
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::SetGroup( IADsGroup* pGroup )
{
HRESULT hResult;
ASSERT( NULL == m_pMembers );
hResult = pGroup->Members( &m_pMembers );
BuildStrings( );
m_pGroup = pGroup;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::SetMembersInterface( IADsMembers* pIMembers )
{
m_pMembers = pIMembers;
BuildStrings( );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::DisplayActiveItemData( )
{
if( m_Types.GetSize( ) )
{
m_strItemType.SetWindowText( m_Types[ m_nSelectedItem ] );
m_strItemOleDsPath.SetWindowText( m_Paths[ m_nSelectedItem ] );
}
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::BuildStrings( )
{
IUnknown* pIEnum = NULL;
IEnumVARIANT* pIEnumVar = NULL;
HRESULT hResult;
VARIANT var;
IADs* pIOleDs = NULL;
BSTR bstrPath;
BSTR bstrName;
BSTR bstrClass;
ULONG ulFetch;
TCHAR szTemp[ 1024 ];
m_Paths.RemoveAll( );
m_Names.RemoveAll( );
m_Types.RemoveAll( );
while( TRUE )
{
if( NULL != m_pCollection )
{
hResult = m_pCollection->get__NewEnum( &pIEnum );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
}
else
{
hResult = m_pMembers->get__NewEnum( &pIEnum );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
}
hResult = pIEnum->QueryInterface( IID_IEnumVARIANT,
(void**)&pIEnumVar );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
VariantInit( &var );
hResult = pIEnumVar->Next( 1, &var, &ulFetch );
while( ulFetch )
{
hResult = V_DISPATCH( &var )->QueryInterface( IID_IADs,
(void**)&pIOleDs );
VariantClear( &var );
ASSERT( SUCCEEDED( hResult ) );
bstrPath = NULL;
bstrName = NULL;
bstrClass = NULL;
hResult = pIOleDs->get_ADsPath( &bstrPath );
ASSERT( SUCCEEDED( hResult ) );
hResult = pIOleDs->get_Name( &bstrName );
ASSERT( SUCCEEDED( hResult ) );
hResult = pIOleDs->get_Class( &bstrClass );
ASSERT( SUCCEEDED( hResult ) );
_tcscpy( szTemp, _T("NA") );
if( bstrName )
{
_tcscpy( szTemp, _T("") );
StringCat( szTemp, bstrName );
}
m_Names.Add( szTemp );
_tcscpy( szTemp, _T("NA") );
if( bstrClass )
{
_tcscpy( szTemp, _T("") );
StringCat( szTemp, bstrClass );
}
m_Types.Add( szTemp );
_tcscpy( szTemp, _T("NA") );
if( bstrPath )
{
_tcscpy( szTemp, _T("") );
StringCat( szTemp, bstrPath );
}
m_Paths.Add( szTemp );
pIOleDs->Release( );
SysFreeString( bstrPath );
bstrPath = NULL;
SysFreeString( bstrName );
bstrName = NULL;
SysFreeString( bstrClass );
bstrClass = NULL;
hResult = pIEnumVar->Next( 1, &var, &ulFetch );
}
pIEnumVar->Release( );
pIEnum->Release( );
break;
}
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL CCollectionDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if( NULL == m_pGroup && NULL == m_pCollection )
{
GetDlgItem( IDC_ADD )->EnableWindow( FALSE );
GetDlgItem( IDC_REMOVE )->EnableWindow( FALSE );
}
if( m_pCollection != NULL || m_pMembers != NULL )
{
int nItems, nIdx;
nItems = (int)m_Paths.GetSize( );
for( nIdx = 0; nIdx < nItems ; nIdx++ )
{
m_ItemsList.AddString( m_Names[ nIdx ] );
}
m_nSelectedItem = 0;
m_ItemsList.SetCurSel( 0 );
DisplayActiveItemData( );
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::OnSelchangeItemCollection()
{
// TODO: Add your control notification handler code here
int nSelected;
nSelected = m_ItemsList.GetCurSel( );
if( nSelected != m_nSelectedItem )
{
m_nSelectedItem = nSelected;
DisplayActiveItemData( );
}
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::OnAdd()
{
// TODO: Add your control notification handler code here
CGroupCreateItem* m_pAddItem;
if( NULL == m_pGroup )
return;
m_pAddItem = new CGroupCreateItem;
if( IDOK == m_pAddItem->DoModal( ) )
{
BSTR bstrName;
HRESULT hResult;
bstrName = AllocBSTR( m_pAddItem->m_strNewItemName.GetBuffer( 512 ) );
hResult = m_pGroup->Add( bstrName );
SysFreeString( bstrName );
MessageBox( (LPCTSTR)OleDsGetErrorText( hResult ), _T("Add") );
OnRefresh( );
if( SUCCEEDED( hResult ) )
{
m_ItemsList.SelectString( 0, m_pAddItem->m_strNewItemName );
}
}
delete m_pAddItem;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::OnRefresh()
{
// TODO: Add your control notification handler code here
int nItems, nIdx;
if( NULL == m_pGroup )
return;
if( NULL != m_pMembers )
{
m_pMembers->Release( );
m_pMembers = NULL;
}
m_pGroup->GetInfo( );
SetGroup( m_pGroup );
nItems = (int)m_Paths.GetSize( );
m_ItemsList.ResetContent( );
for( nIdx = 0; nIdx < nItems ; nIdx++ )
{
m_ItemsList.AddString( m_Names[ nIdx ] );
}
m_nSelectedItem = 0;
m_ItemsList.SetCurSel( 0 );
DisplayActiveItemData( );
}
/***********************************************************
Function: CCollectionDialog::OnRemove
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void CCollectionDialog::OnRemove()
{
// TODO: Add your control notification handler code here
int nSelect;
CDeleteGroupItem* m_pDeleteItem;
if( NULL == m_pGroup )
return;
nSelect = m_ItemsList.GetCurSel( );
if( LB_ERR == nSelect )
return;
m_pDeleteItem = new CDeleteGroupItem;
m_pDeleteItem->m_strItemName = m_Paths[ nSelect ];
//CString m_strParent;
m_pDeleteItem->m_strItemType = m_Types[ nSelect ];
if( IDOK == m_pDeleteItem->DoModal( ) )
{
BSTR bstrName;
HRESULT hResult;
bstrName = AllocBSTR( m_pDeleteItem->m_strItemName.GetBuffer( 512 ) );
hResult = m_pGroup->Remove( bstrName );
SysFreeString( bstrName );
MessageBox( (LPCTSTR)OleDsGetErrorText( hResult ), _T("Remove") );
OnRefresh( );
}
delete m_pDeleteItem;
}