text: //////////////////////////////////////////////////////////////////////////////
  /*++
  
  Copyright (C) Microsoft Corporation, 1998 - 1999
  
  Module Name:
  
      IASAttributeEditor.cpp
  
  Abstract:
  
  	Implementation file for the CIASAttributeEditor 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 "IASAttributeEditor.h"
  //
  // where we can find declarations needed in this file:
  //
  //
  // END INCLUDES
  //////////////////////////////////////////////////////////////////////////////
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::ShowEditor
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::ShowEditor( /*[in, out]*/ BSTR *pReserved )
  {
  	TRACE_FUNCTION("CIASAttributeEditor::ShowEditor");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  
  	return E_NOTIMPL;
  
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::SetAttributeSchema
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::SetAttributeSchema(IIASAttributeInfo * pIASAttributeInfo)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::SetAttributeSchema");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	// Check for preconditions.
  	if( ! pIASAttributeInfo )
  	{
  		return E_INVALIDARG;
  	}
  
  	m_spIASAttributeInfo = pIASAttributeInfo;
  
  	return S_OK;
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::SetAttributeValue
  
  	Most of the time, before you can use an editor's functionality,
  	you need to pass it a pointer to the value the editor's methods
  	e.g. will modify.
  
  	Note that this is not always the case, for example, to gather information
  	about the attribute's vendor, you need not always specify a value.
  
  	Pass a NULL pointer to SetAttributeValue to disassociate the
  	editor from any value.
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::SetAttributeValue(VARIANT * pValue)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::SetAttributeValue");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  
  	// Check for preconditions.
  	// None -- passing in a NULL pointer means we are "clearing" the
  	// editor.
  	ErrorTrace(0, "CIASAttributeEditor::SetAttributeValue pointer value %ld\n", pValue);
  
  	m_pvarValue = pValue;
  
  	return S_OK;
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::get_ValueAsString
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::get_ValueAsString(BSTR * pbstrDisplayText )
  {
  	TRACE_FUNCTION("CIASAttributeEditor::get_ValueAsString");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	// Check for preconditions.
  	if( ! pbstrDisplayText )
  	{
  		return E_INVALIDARG;
  	}
  
  	CComBSTR bstrDisplay;
  
  	// This method will be overriden.
  
  	// We could do our best here to give back a default string,
  	// but for now, just return an empty string.
  
  	*pbstrDisplayText = bstrDisplay.Copy();
  
  	return S_OK;
  
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::put_ValueAsString
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::put_ValueAsString(BSTR newVal)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::put_ValueAsString");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	// TODO: Add your implementation code here
  
  	return E_NOTIMPL;
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::get_VendorName
  
  	For most attributes, vendor information is stored in the AttributeInfo.
  	However, for some attributes, e.g. the RADIUS vendor specific 
  	attribute (ID == 26), vendor information is stored in the value of the
  	editor itself.
  	
  	For this reason, UI clients should always query an IASAttributeEditor for vendor 
  	information rather than the AttributeInfo itself.
  
  	In the default implementation here, we will query the AttributeInfo 
  	for this information.  Some derived implementations of IASAttributeEditor
  	(e.g. IASVendorSpecificAttributeEditor) will parse the value of the
  	attribute itself to procide this info.
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::get_VendorName(BSTR * pVal)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::get_VendorName");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	// Check for preconditions.
  	if( ! pVal )
  	{
  		return E_INVALIDARG;
  	}
  	if( ! m_spIASAttributeInfo )
  	{
  		// We are not initialized properly.
  		return OLE_E_BLANK;
  	}
  
  
  	HRESULT hr;
  	
  	hr = m_spIASAttributeInfo->get_VendorName( pVal );
  	
  	return hr;
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::put_VendorName
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::put_VendorName(BSTR newVal)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::put_VendorName");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	return E_NOTIMPL;
  
  	// Check for preconditions.
  //	if( ! m_spIASAttributeInfo )
  //	{
  //		// We are not initialized properly.
  //		return OLE_E_BLANK;
  //	}
  
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::Edit
  
  We had a design change about the interface we want an editor to expose.
  
  For now, this interface method just calls our old interface methods.
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::Edit(IIASAttributeInfo * pIASAttributeInfo,  /*[in]*/ VARIANT *pAttributeValue, /*[in, out]*/ BSTR *pReserved )
  {
  	TRACE_FUNCTION("CIASAttributeEditor::Edit");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	HRESULT hr;
  
  	hr = SetAttributeSchema( pIASAttributeInfo );
  	if( FAILED( hr ) )
  	{
  		return hr;
  	}
  	
  //	CComVariant varValue;
  //
  //	hr = pIASAttributeInfo->get_Value( &varValue );
  	// We are ignoring return value here because if we can't get it, we'll just edit a new one.
  //
  //	hr = SetAttributeValue( &varValue );
  
  	hr = SetAttributeValue( pAttributeValue );
  	if( FAILED(hr ) )
  	{
  		return hr;
  	}
  
  	hr = ShowEditor( pReserved );
  //	if( S_OK == hr )
  //	{
  //		hr = pIASAttributeInfo->put_Value( varValue );
  //		if( FAILED(hr ) )
  //		{
  //			return hr;
  //		}
  //	}
  
  	return hr;
  }
  
  
  
  //////////////////////////////////////////////////////////////////////////////
  /*++
  
  CIASAttributeEditor::GetDisplayInfo
  
  We had a design change about the interface we want an editor to expose.
  
  For now, this interface method just calls our old interface methods.
  
  --*/
  //////////////////////////////////////////////////////////////////////////////
  STDMETHODIMP CIASAttributeEditor::GetDisplayInfo(IIASAttributeInfo * pIASAttributeInfo,  /*[in]*/ VARIANT *pAttributeValue, BSTR * pVendorName, BSTR * pValueAsString, /*[in, out]*/ BSTR *pReserved)
  {
  	TRACE_FUNCTION("CIASAttributeEditor::GetDisplayInfo");
  
  	AFX_MANAGE_STATE(AfxGetStaticModuleState())
  
  	HRESULT hr;
  
  	hr = SetAttributeSchema( pIASAttributeInfo );
  	if( FAILED( hr ) )
  	{
  		return hr;
  	}
  	
  	CComVariant varValue;
  
  //	hr = pIASAttributeInfo->get_Value( &varValue );
  //	if( FAILED(hr ) )
  //	{
  //		return hr;
  //	}
  //
  //	hr = SetAttributeValue( &varValue );
  
  	
  	hr = SetAttributeValue( pAttributeValue );
  	if( FAILED(hr ) )
  	{
  		return hr;
  	}
  
  	
  	CComBSTR bstrVendorName;
  	CComBSTR bstrValueAsString;
  
  	hr = get_VendorName( &bstrVendorName );
  	// Don't care if this failed -- we'll return empty string.
  
  	hr = get_ValueAsString( &bstrValueAsString );
  	// Don't care if this failed -- we'll return empty string.
  
  	*pVendorName = bstrVendorName.Copy();
  	*pValueAsString = bstrValueAsString.Copy();
  
  
  	return S_OK;
  }
  
  