Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1029 lines
27 KiB

//+------------------------------------------------------------
//
// Copyright (C) 1998, Microsoft Corporation
//
// File: icatitemattr.cpp
//
// Contents: Implementation of CICategorizerItemAttributesIMP
//
// Classes:
// CLdapResultWrap
// CICategorizerItemAttributesIMP
//
// Functions:
//
// History:
// jstamerj 1998/07/01 13:48:15: Created.
//
//-------------------------------------------------------------
#include "precomp.h"
#include "icatitemattr.h"
//+------------------------------------------------------------
//
// Function: CLdapResultWrap::CLdapResultWrap
//
// Synopsis: Refcount an LDAP Message, call ldap_msg_free when all
// references have been released
//
// Arguments:
// pCPLDAPWrap: PLDAP to refcount
// pMessage: the LDAPMessage to refcount
//
// Returns: NOTHING
//
// History:
// jstamerj 1998/10/05 13:12:15: Created.
//
//-------------------------------------------------------------
CLdapResultWrap::CLdapResultWrap(
ISMTPServerEx *pISMTPServerEx,
CPLDAPWrap *pCPLDAPWrap,
PLDAPMessage pMessage)
{
_ASSERT(pCPLDAPWrap);
_ASSERT(pMessage);
m_pCPLDAPWrap = pCPLDAPWrap;
m_pCPLDAPWrap->AddRef();
m_pLDAPMessage = pMessage;
m_lRefCount = 0;
m_pISMTPServerEx = pISMTPServerEx;
if(m_pISMTPServerEx)
m_pISMTPServerEx->AddRef();
}
//+------------------------------------------------------------
//
// Function: CLdapResultWrap::AddRef
//
// Synopsis: Increment the ref count of this object
//
// Arguments: NONE
//
// Returns: new refcount
//
// History:
// jstamerj 1998/10/05 13:14:59: Created.
//
//-------------------------------------------------------------
LONG CLdapResultWrap::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
//+------------------------------------------------------------
//
// Function: CLdapResultWrap::Release
//
// Synopsis: Decrement the ref count. Free the object when the
// refcount hits zero
//
// Arguments: NONE
//
// Returns: New refcount
//
// History:
// jstamerj 1998/10/05 13:26:47: Created.
//
//-------------------------------------------------------------
LONG CLdapResultWrap::Release()
{
LONG lNewRefCount;
lNewRefCount = InterlockedDecrement(&m_lRefCount);
if(lNewRefCount == 0) {
//
// Release this ldapmessage
//
delete this;
return 0;
} else {
return lNewRefCount;
}
}
//+------------------------------------------------------------
//
// Function: CLdapResultWrap::~CLdapResultWrap
//
// Synopsis: Release the ldap message result
//
// Arguments: NONE
//
// Returns: NOTHING
//
// History:
// jstamerj 1998/10/05 13:31:39: Created.
//
//-------------------------------------------------------------
CLdapResultWrap::~CLdapResultWrap()
{
m_pCPLDAPWrap->Release();
ldap_msgfree(m_pLDAPMessage);
if(m_pISMTPServerEx)
m_pISMTPServerEx->Release();
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::CICategorizerItemAttributesIMP
//
// Synopsis: Initializes member data
//
// Arguments:
// pldap: PLDAP to use
// pldapmessage: PLDAPMessage to serve out
//
// Returns: NOTHING
//
// History:
// jstamerj 1998/07/02 12:35:15: Created.
//
//-------------------------------------------------------------
CICategorizerItemAttributesIMP::CICategorizerItemAttributesIMP(
PLDAP pldap,
PLDAPMessage pldapmessage,
CLdapResultWrap *pResultWrap)
{
m_dwSignature = CICATEGORIZERITEMATTRIBUTESIMP_SIGNATURE;
_ASSERT(pldap);
_ASSERT(pldapmessage);
_ASSERT(pResultWrap);
m_pldap = pldap;
m_pldapmessage = pldapmessage;
m_cRef = 0;
m_pResultWrap = pResultWrap;
m_pResultWrap->AddRef();
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::~CICategorizerItemAttributesIMP
//
// Synopsis: Checks to make sure signature is valid and then resets signature
//
// Arguments: NONE
//
// Returns: NOTHING
//
// History:
// jstamerj 1998/07/02 12:39:45: Created.
//
//-------------------------------------------------------------
CICategorizerItemAttributesIMP::~CICategorizerItemAttributesIMP()
{
m_pResultWrap->Release();
_ASSERT(m_dwSignature == CICATEGORIZERITEMATTRIBUTESIMP_SIGNATURE);
m_dwSignature = CICATEGORIZERITEMATTRIBUTESIMP_SIGNATURE_INVALID;
}
//+------------------------------------------------------------
//
// Function: QueryInterface
//
// Synopsis: Returns pointer to this object for IUnknown and ICategorizerItemAttributes
//
// Arguments:
// iid -- interface ID
// ppv -- pvoid* to fill in with pointer to interface
//
// Returns:
// S_OK: Success
// E_NOINTERFACE: Don't support that interface
//
// History:
// jstamerj 980612 14:07:57: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::QueryInterface(
REFIID iid,
LPVOID *ppv)
{
*ppv = NULL;
if(iid == IID_IUnknown) {
*ppv = (LPVOID) this;
} else if (iid == IID_ICategorizerItemAttributes) {
*ppv = (LPVOID) ((ICategorizerItemAttributes *) this);
} else if (iid == IID_ICategorizerItemRawAttributes) {
*ppv = (LPVOID) ((ICategorizerItemRawAttributes *) this);
} else if (iid == IID_ICategorizerUTF8Attributes) {
*ppv = (LPVOID) ((ICategorizerUTF8Attributes *) this);
} else {
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
//+------------------------------------------------------------
//
// Function: AddRef
//
// Synopsis: adds a reference to this object
//
// Arguments: NONE
//
// Returns: New reference count
//
// History:
// jstamerj 980611 20:07:14: Created.
//
//-------------------------------------------------------------
ULONG CICategorizerItemAttributesIMP::AddRef()
{
return InterlockedIncrement((PLONG)&m_cRef);
}
//+------------------------------------------------------------
//
// Function: Release
//
// Synopsis: releases a reference, deletes this object when the
// refcount hits zero.
//
// Arguments: NONE
//
// Returns: New reference count
//
// History:
// jstamerj 980611 20:07:33: Created.
//
//-------------------------------------------------------------
ULONG CICategorizerItemAttributesIMP::Release()
{
LONG lNewRefCount;
lNewRefCount = InterlockedDecrement((PLONG)&m_cRef);
if(lNewRefCount == 0) {
delete this;
return 0;
} else {
return lNewRefCount;
}
}
//+------------------------------------------------------------
//
// Function: BeginAttributeEnumeration
//
// Synopsis: Prepare to enumerate through attribute values for a specific attribute
//
// Arguments:
// pszAttributeName: Name of attribute to enumerate through
// penumerator: Uninitialized Enumerator structure to use
//
// Returns:
// S_OK: Success
// CAT_E_PROPNOTFOUND: No attributes values exist
//
// History:
// jstamerj 1998/07/02 10:54:00: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::BeginAttributeEnumeration(
IN LPCSTR pszAttributeName,
IN PATTRIBUTE_ENUMERATOR penumerator)
{
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::BeginAttributeEnumeration");
_ASSERT(pszAttributeName);
_ASSERT(penumerator);
penumerator->pvBase =
penumerator->pvCurrent = ldap_get_values(
m_pldap,
m_pldapmessage,
(LPSTR)pszAttributeName);
if(penumerator->pvBase == NULL) {
ErrorTrace((LPARAM)this, "Requested attribute %s not found", pszAttributeName);
CatFunctLeaveEx((LPARAM)this);
return CAT_E_PROPNOTFOUND;
}
CatFunctLeaveEx((LPARAM)this);
return S_OK;
}
//+------------------------------------------------------------
//
// Function: GetNextAttributeValue
//
// Synopsis: Get the next attribute in an enumeration
//
// Arguments:
// penumerator: enumerator sturcture initialized in BeginAttributeEnumeration
// ppszAttributeValue: Ptr to Ptr to recieve Ptr to string of attribute value
//
// Returns:
// S_OK: Success
// HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)
//
// History:
// jstamerj 1998/07/02 11:14:54: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::GetNextAttributeValue(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT LPSTR *ppszAttributeValue)
{
_ASSERT(penumerator);
_ASSERT(ppszAttributeValue);
*ppszAttributeValue = *((LPSTR *)penumerator->pvCurrent);
if(*ppszAttributeValue) {
//
// Advance enumerator to next value
//
penumerator->pvCurrent = (PVOID) (((LPSTR *)penumerator->pvCurrent)+1);
return S_OK;
} else {
//
// This is the last value
//
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
}
//+------------------------------------------------------------
//
// Function: RewindAttributeEnumeration
//
// Synopsis: Rewind enumerator to beginning of attribute value list
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/07/06 11:22:23: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::RewindAttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
penumerator->pvCurrent = penumerator->pvBase;
return S_OK;
}
//+------------------------------------------------------------
//
// Function: EndAttributeEnumeration
//
// Synopsis: Free memory associated with an attribute enumeration
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/07/02 12:24:44: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::EndAttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
_ASSERT(penumerator);
ldap_value_free((LPSTR *)penumerator->pvBase);
return S_OK;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::BeginAttributeNameEnumeration
//
// Synopsis: Enumerate through the attributes returned from LDAP
//
// Arguments:
// penumerator: Caller allocated enumerator structure to be
// initialized by this call
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/09/18 10:49:56: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::BeginAttributeNameEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
_ASSERT(penumerator);
penumerator->pvBase =
penumerator->pvCurrent = NULL;
return S_OK;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::GetNextAttributeName
//
// Synopsis: enumerate through the attribute names returned
//
// Arguments:
// penumerator: enumerator strucutre initialized in BeginAttributeNameEnumeration
// ppszAttributeValue: out parameter for an attribute name
//
// Returns:
// S_OK: Success
// HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)
//
// History:
// jstamerj 1998/09/18 10:53:15: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::GetNextAttributeName(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT LPSTR *ppszAttributeName)
{
_ASSERT(penumerator);
_ASSERT(ppszAttributeName);
if(penumerator->pvCurrent == NULL) {
*ppszAttributeName = ldap_first_attribute(
m_pldap,
m_pldapmessage,
(BerElement **) &(penumerator->pvCurrent));
} else {
*ppszAttributeName = ldap_next_attribute(
m_pldap,
m_pldapmessage,
(BerElement *) (penumerator->pvCurrent));
}
if(*ppszAttributeName == NULL) {
//
// Assume we've reached the end of the attribute name
// enumeration
//
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
} else {
return S_OK;
}
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributeIMP::EndAttributeNameEnumeration
//
// Synopsis: Free all data held for this enumeration
//
// Arguments:
// penumerator: enumerator strucutre initialized in BeginAttributeNameEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/09/18 11:04:37: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::EndAttributeNameEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
//
// Ldap uses only buffers in the connection block for this, so we
// don't need to explicitly free anything
//
return S_OK;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::AggregateAttributes
//
// Synopsis: Normally, accept and ICategorizerItemAttributes for aggregation
//
// Arguments:
// pICatItemAttributes: attributes to aggregate
//
// Returns:
// E_NOTIMPL
//
// History:
// jstamerj 1998/07/16 14:42:16: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::AggregateAttributes(
IN ICategorizerItemAttributes *pICatItemAttributes)
{
return E_NOTIMPL;
}
//+------------------------------------------------------------
//
// Function: BeginRawAttributeEnumeration
//
// Synopsis: Prepare to enumerate through attribute values for a specific attribute
//
// Arguments:
// pszAttributeName: Name of attribute to enumerate through
// penumerator: Uninitialized Enumerator structure to use
//
// Returns:
// S_OK: Success
// CAT_E_PROPNOTFOUND: No attributes values exist
//
// History:
// jstamerj 1998/12/09 12:44:15: Created
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::BeginRawAttributeEnumeration(
IN LPCSTR pszAttributeName,
IN PATTRIBUTE_ENUMERATOR penumerator)
{
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::BeginRawAttributeEnumeration");
_ASSERT(pszAttributeName);
_ASSERT(penumerator);
penumerator->pvBase =
penumerator->pvCurrent = ldap_get_values_len(
m_pldap,
m_pldapmessage,
(LPSTR)pszAttributeName);
if(penumerator->pvBase == NULL) {
ErrorTrace((LPARAM)this, "Requested attribute %s not found", pszAttributeName);
CatFunctLeaveEx((LPARAM)this);
return CAT_E_PROPNOTFOUND;
}
CatFunctLeaveEx((LPARAM)this);
return S_OK;
}
//+------------------------------------------------------------
//
// Function: GetNextRawAttributeValue
//
// Synopsis: Get the next attribute in an enumeration
//
// Arguments:
// penumerator: enumerator sturcture initialized in BeginAttributeEnumeration
// pdwcb: dword to set to the # of bytes in the pvValue buffer
// pvValue: Ptr to recieve Ptr to raw attribute value
//
// Returns:
// S_OK: Success
// HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)
//
// History:
// jstamerj 1998/12/09 12:49:27: Created
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::GetNextRawAttributeValue(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT PDWORD pdwcb,
OUT LPVOID *pvValue)
{
_ASSERT(penumerator);
_ASSERT(pdwcb);
_ASSERT(pvValue);
if( (*((PLDAP_BERVAL *)penumerator->pvCurrent)) != NULL) {
*pdwcb = (* ((PLDAP_BERVAL *)penumerator->pvCurrent))->bv_len;
*pvValue = (* ((PLDAP_BERVAL *)penumerator->pvCurrent))->bv_val;
//
// Advance enumerator to next value
//
penumerator->pvCurrent = (PVOID)
(((PLDAP_BERVAL *)penumerator->pvCurrent)+1);
return S_OK;
} else {
//
// This is the last value
//
*pdwcb = 0;
*pvValue = NULL;
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
}
//+------------------------------------------------------------
//
// Function: RewindRawAttributeEnumeration
//
// Synopsis: Rewind enumerator to beginning of attribute value list
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/12/09 12:49:23: Created
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::RewindRawAttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
return RewindAttributeEnumeration(penumerator);
}
//+------------------------------------------------------------
//
// Function: EndRawAttributeEnumeration
//
// Synopsis: Free memory associated with an attribute enumeration
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/12/09 12:50:02: Created
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::EndRawAttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
_ASSERT(penumerator);
ldap_value_free_len((struct berval **)penumerator->pvBase);
return S_OK;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::GetAllAttributeValues
//
// Synopsis: Retrieve all values for a particular attribute at once.
// This may not be optimal for attributes with a large number of
// values (enumerating through the values may be better performace wise).
//
// Arguments:
// pszAttributeName: The name of the attribute you want
// penumerator: A user allocated ATTRIBUTE_ENUMERATOR structure for
// use by the ICategorizerItemAttributes implementor
// prgpszAttributeValues: Where to return the pointer to the
// attribute string array. This will be a NULL terminated array of
// pointers to strings.
//
// Returns:
// S_OK: Success
// CAT_E_PROPNOTFOUND: None of those attributes exist
//
// History:
// jstamerj 1998/12/10 18:55:38: Created.
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::GetAllAttributeValues(
LPCSTR pszAttributeName,
PATTRIBUTE_ENUMERATOR penumerator,
LPSTR **prgpszAttributeValues)
{
HRESULT hr;
CatFunctEnter("CICategorizerItemAttributesIMP::GetAllAttributeValues");
//
// piggy back on BeginAttributeEnumeration
//
hr = BeginAttributeEnumeration(
pszAttributeName,
penumerator);
if(SUCCEEDED(hr)) {
//
// return the array
//
*prgpszAttributeValues = (LPSTR *) penumerator->pvBase;
}
DebugTrace(NULL, "returning hr %08lx", hr);
CatFunctLeave();
return hr;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::ReleaseAllAttributes
//
// Synopsis: Release the attributes allocated from GetAllAttributeValues
//
// Arguments:
// penumerator: the enumerator passed into GetAllAttributeValues
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/12/10 19:38:57: Created.
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::ReleaseAllAttributeValues(
PATTRIBUTE_ENUMERATOR penumerator)
{
HRESULT hr;
CatFunctEnter("CICategorizerItemAttributesIMP::ReleaseAllAttributes");
//
// piggy back off of endattributeenumeration
//
hr = EndAttributeEnumeration(
penumerator);
DebugTrace(NULL, "returning hr %08lx", hr);
CatFunctLeave();
return hr;
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::CountAttributeValues
//
// Synopsis: Return a count of the number of attribute values associated
// with this enumerator
//
// Arguments:
// penumerator: describes the attribute in question
// pdwCount: Out parameter for the count
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1999/03/25 14:36:58: Created.
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::CountAttributeValues(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT DWORD *pdwCount)
{
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::CountAttributeValues");
_ASSERT(pdwCount);
*pdwCount = ldap_count_values((PCHAR *) penumerator->pvBase);
CatFunctLeaveEx((LPARAM)this);
return S_OK;
} // CICategorizerItemAttributesIMP::CountAttributeValues
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::CountRawAttributeValues
//
// Synopsis: Return a count of the number of attribute values associated
// with this enumerator
//
// Arguments:
// penumerator: describes the attribute in question
// pdwCount: Out parameter for the count
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1999/03/25 14:39:54: Created
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::CountRawAttributeValues(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT DWORD *pdwCount)
{
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::CountRawAttributeValues");
_ASSERT(pdwCount);
*pdwCount = ldap_count_values_len((struct berval **) penumerator->pvBase);
CatFunctLeaveEx((LPARAM)this);
return S_OK;
} // CICategorizerItemAttributesIMP::CountRawAttributeValues
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::BeginUTF8AttributeEnumeration
//
// Synopsis: Begin UTF8 attribute enumeration
//
// Arguments:
// pszAttributeName: Name of attribute to enumerate through
// penumerator: Uninitialized Enumerator structure to use
//
// Returns:
// S_OK: Success
// CAT_E_PROPNOTFOUND: No attributes values exist
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1999/12/10 11:14:35: Created.
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::BeginUTF8AttributeEnumeration(
IN LPCSTR pszAttributeName,
IN PATTRIBUTE_ENUMERATOR penumerator)
{
HRESULT hr;
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::BeginUTF8AttributeEnumeration");
//
// Piggy back raw attribute enumeration and use the pvContext
// member of penumerator.
//
hr = BeginRawAttributeEnumeration(
pszAttributeName,
penumerator);
penumerator->pvContext = NULL;
DebugTrace((LPARAM)this, "returning hr %08lx", hr);
CatFunctLeaveEx((LPARAM)this);
return hr;
}
//+------------------------------------------------------------
//
// Function: GetNextAttributeValue
//
// Synopsis: Get the next attribute in an enumeration
//
// Arguments:
// penumerator: enumerator sturcture initialized in BeginAttributeEnumeration
// ppszAttributeValue: Ptr to Ptr to recieve Ptr to string of attribute value
//
// Returns:
// S_OK: Success
// HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS)
//
// History:
// jstamerj 1998/07/02 11:14:54: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::GetNextUTF8AttributeValue(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT LPSTR *ppszAttributeValue)
{
HRESULT hr = S_OK;
DWORD dwcb = 0;
LPVOID pvAttributeValue = NULL;
LPSTR psz = NULL;
CatFunctEnterEx((LPARAM)this, "CICategorizerItemAttributesIMP::GetNextUTF8AttributeValue");
if(penumerator->pvContext) {
delete [] (LPSTR) penumerator->pvContext;
penumerator->pvContext = NULL;
}
hr = GetNextRawAttributeValue(
penumerator,
&dwcb,
&pvAttributeValue);
if(FAILED(hr))
return hr;
//
// Convert to termianted UTF8 string
//
psz = new CHAR[dwcb + 1];
if(psz == NULL)
{
ERROR_LOG("new CHAR[]");
return E_OUTOFMEMORY;
}
CopyMemory(psz, pvAttributeValue, dwcb);
psz[dwcb] = '\0';
*ppszAttributeValue = psz;
penumerator->pvContext = psz;
CatFunctLeaveEx((LPARAM)this);
return hr;
}
//+------------------------------------------------------------
//
// Function: RewindAttributeEnumeration
//
// Synopsis: Rewind enumerator to beginning of attribute value list
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/07/06 11:22:23: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::RewindUTF8AttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
return RewindRawAttributeEnumeration(
penumerator);
}
//+------------------------------------------------------------
//
// Function: EndAttributeEnumeration
//
// Synopsis: Free memory associated with an attribute enumeration
//
// Arguments:
// penumerator: attribute enumerator initialized by BeginAttributeEnumeration
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1998/07/02 12:24:44: Created.
//
//-------------------------------------------------------------
STDMETHODIMP CICategorizerItemAttributesIMP::EndUTF8AttributeEnumeration(
IN PATTRIBUTE_ENUMERATOR penumerator)
{
if(penumerator->pvContext) {
delete [] (LPSTR) penumerator->pvContext;
penumerator->pvContext = NULL;
}
return EndRawAttributeEnumeration(penumerator);
}
//+------------------------------------------------------------
//
// Function: CICategorizerItemAttributesIMP::CountUTF8AttributeValues
//
// Synopsis: Return a count of the number of attribute values associated
// with this enumerator
//
// Arguments:
// penumerator: describes the attribute in question
// pdwCount: Out parameter for the count
//
// Returns:
// S_OK: Success
//
// History:
// jstamerj 1999/03/25 14:39:54: Created
//
//-------------------------------------------------------------
HRESULT CICategorizerItemAttributesIMP::CountUTF8AttributeValues(
IN PATTRIBUTE_ENUMERATOR penumerator,
OUT DWORD *pdwCount)
{
return CountRawAttributeValues(
penumerator,
pdwCount);
} // CICategorizerItemAttributesIMP::CountRawAttributeValues