windows-nt/Source/XPSP1/NT/net/ias/mmc/nap/iasmultivaluedattributeeditor.cpp
2020-09-26 16:20:57 +08:00

317 lines
6.5 KiB
C++

//////////////////////////////////////////////////////////////////////////////
/*++
Copyright (C) Microsoft Corporation, 1998 - 1999
Module Name:
IASMultivaluedAttributeEditor.cpp
Abstract:
Implementation file for the CIASMultivaluedAttributeEditor class.
Revision History:
mmaguire 06/25/98 - created
--*/
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// BEGIN INCLUDES
//
// standard includes:
//
#include "Precompiled.h"
//
// where we can find declaration for main class in this file:
//
#include "IASMultivaluedAttributeEditor.h"
//
// where we can find declarations needed in this file:
//
#include "IASMultivaluedEditorPage.h"
//
// END INCLUDES
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
/*++
CIASMultivaluedAttributeEditor::ShowEditor
IIASAttributeEditor interface implementation
--*/
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CIASMultivaluedAttributeEditor::ShowEditor( /*[in, out]*/ BSTR *pReserved )
{
TRACE(_T("CIASMultivaluedAttributeEditor::ShowEditor\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// Check for preconditions.
if( ! m_spIASAttributeInfo )
{
// We are not initialized properly.
return OLE_E_BLANK;
}
if( ! m_pvarValue )
{
// We are not initialized properly.
return OLE_E_BLANK;
}
HRESULT hr = S_OK;
try
{
// Load page title.
// ::CString strPageTitle;
// strPageTitle.LoadString(IDS_IAS_MULTIVALUED_EDITOR_TITLE);
//
// CPropertySheet propSheet( (LPCTSTR)strPageTitle );
//
// Multivalued Attribute Editor
//
CMultivaluedEditorPage cppPage;
// Initialize the page's data exchange fields with info from IAttributeInfo
CComBSTR bstrName;
CComBSTR bstrSyntax;
ATTRIBUTEID Id = ATTRIBUTE_UNDEFINED;
hr = m_spIASAttributeInfo->get_AttributeName( &bstrName );
if( FAILED(hr) ) throw hr;
hr = m_spIASAttributeInfo->get_SyntaxString( &bstrSyntax );
if( FAILED(hr) ) throw hr;
hr = m_spIASAttributeInfo->get_AttributeID( &Id );
if( FAILED(hr) ) throw hr;
cppPage.m_strAttrName = bstrName;
cppPage.m_strAttrFormat = bstrSyntax;
// Attribute type is actually attribute ID in string format
WCHAR szTempId[MAX_PATH];
wsprintf(szTempId, _T("%ld"), Id);
cppPage.m_strAttrType = szTempId;
// Initialize the page's data exchange fields with info from VARIANT value passed in.
cppPage.SetData( m_spIASAttributeInfo.p, m_pvarValue );
// propSheet.AddPage(&cppPage);
// int iResult = propSheet.DoModal();
int iResult = cppPage.DoModal();
if (IDOK == iResult)
{
// Tell the page to commit the changes made to the m_pvarValue
// pointer it was given. It will take care of
// packaging the array of variants back into a variant safearray.
cppPage.CommitArrayToVariant();
}
else
{
hr = S_FALSE;
}
//
// Remove Page pointer from propSheet
//
// propSheet.RemovePage(&cppPage);
}
catch( HRESULT & hr )
{
return hr;
}
catch(...)
{
return hr = E_FAIL;
}
return hr;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CIASMultivaluedAttributeEditor::SetAttributeValue
IIASAttributeEditor interface implementation
--*/
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CIASMultivaluedAttributeEditor::SetAttributeValue(VARIANT * pValue)
{
TRACE(_T("CIASMultivaluedAttributeEditor::SetAttributeValue\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// Check for preconditions.
if( pValue == NULL )
{
return E_INVALIDARG;
}
if( !(V_VT(pValue) & VT_ARRAY) && V_VT(pValue) != VT_EMPTY )
{
return E_INVALIDARG;
}
m_pvarValue = pValue;
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
/*++
CIASMultivaluedAttributeEditor::get_ValueAsString
IIASAttributeEditor interface implementation
--*/
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CIASMultivaluedAttributeEditor::get_ValueAsString(BSTR * pbstrDisplayText )
{
TRACE(_T("CIASMultivaluedAttributeEditor::get_ValueAsString\n"));
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// Check for preconditions.
if( pbstrDisplayText == NULL )
{
return E_INVALIDARG;
}
if( ! m_spIASAttributeInfo )
{
// We are not initialized properly.
return OLE_E_BLANK;
}
if( ! m_pvarValue )
{
// We are not initialized properly.
return OLE_E_BLANK;
}
if( V_VT( m_pvarValue ) != (VT_VARIANT | VT_ARRAY) && V_VT( m_pvarValue ) != VT_EMPTY )
{
return OLE_E_BLANK;
}
CComBSTR bstrDisplay;
HRESULT hr;
// If the variant we were passed is empty, display and empty string.
if( V_VT( m_pvarValue ) == VT_EMPTY )
{
*pbstrDisplayText = bstrDisplay.Copy();
return S_OK;
}
CComBSTR bstrQuote = "\"";
CComBSTR bstrComma = ", ";
try
{
CComPtr<IIASAttributeEditor> spIASAttributeEditor;
// Get attribute editor.
hr = SetUpAttributeEditor( m_spIASAttributeInfo.p, &spIASAttributeEditor );
if( FAILED( hr ) ) throw hr;
// This creates a new copy of the SAFEARRAY pointed to by m_pvarData
// wrapped by the standard COleSafeArray instance m_osaValueList.
COleSafeArray osaValueList = m_pvarValue;
// Note: GetOneDimSize returns a DWORD, but signed should be OK for few elements here.
long lSize = osaValueList.GetOneDimSize(); // number of multi-valued attrs.
// Lock the safearray. This wrapper class will unlock as soon as it goes out of scope.
CMyOleSafeArrayLock osaLock( osaValueList );
for (long lIndex = 0; lIndex < lSize; lIndex++)
{
VARIANT * pvar;
osaValueList.PtrOfIndex( &lIndex, (void**) &pvar );
// Not sure if I like these.
// bstrDisplay += bstrQuote;
// Get a string to display for the attribute value.
CComBSTR bstrVendor;
CComBSTR bstrValue;
CComBSTR bstrReserved;
hr = spIASAttributeEditor->GetDisplayInfo(m_spIASAttributeInfo.p, pvar, &bstrVendor, &bstrValue, &bstrReserved );
if( SUCCEEDED( hr ) )
{
bstrDisplay += bstrValue;
}
// Not sure if I like these.
// bstrDisplay += bstrQuote;
// Special -- for all but last item, add comma after entry.
if( lIndex < lSize - 1 )
{
bstrDisplay += bstrComma;
}
}
}
catch(...)
{
bstrDisplay = "@Error reading display value";
}
*pbstrDisplayText = bstrDisplay.Copy();
if( *pbstrDisplayText )
{
return S_OK;
}
else
{
return E_FAIL;
}
}