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.
 
 
 
 
 
 

67 lines
1.9 KiB

// rowitem.cpp CRowItem implementation
#include "stdafx.h"
#include "rowitem.h"
CRowItem::CRowItem(int cAttributes)
{
ASSERT(cAttributes > 0);
// Actual attr count is user count plus internal
int cActual = cAttributes + INTERNAL_ATTR_COUNT;
// allocate space for offsets and default parameter storage
int bcInitial = sizeof(BufferHdr) + cActual * (sizeof(int) + DEFAULT_ATTR_SIZE);
m_pBuff = (BufferHdr*)malloc(bcInitial);
if (m_pBuff == NULL)
THROW_ERROR(E_OUTOFMEMORY)
// Set all offsets to -1
memset(m_pBuff->aiOffset, 0xff, cActual * sizeof(int));
m_pBuff->nRefCnt = 1;
m_pBuff->nAttrCnt = cAttributes;
m_pBuff->bcSize = bcInitial;
m_pBuff->bcFree = cActual * DEFAULT_ATTR_SIZE;
}
HRESULT
CRowItem::SetAttributePriv(int iAttr, LPCWSTR pszAttr)
{
ASSERT(m_pBuff != NULL);
ASSERT(pszAttr != NULL);
iAttr += INTERNAL_ATTR_COUNT;
// For the current implementaion a given attribute can only be set once.
// There is no facility for freeing the previous value.
ASSERT(m_pBuff->aiOffset[iAttr] == -1);
int bcAttrSize = (wcslen(pszAttr) + 1) * sizeof(WCHAR);
// if no room, realocate buffer
if (bcAttrSize > m_pBuff->bcFree)
{
BufferHdr* pBuffNew = (BufferHdr*)realloc(m_pBuff, m_pBuff->bcSize + bcAttrSize + EXTENSION_SIZE);
if (pBuffNew == NULL)
return E_OUTOFMEMORY;
m_pBuff = pBuffNew;
m_pBuff->bcSize += (bcAttrSize + EXTENSION_SIZE);
m_pBuff->bcFree += (bcAttrSize + EXTENSION_SIZE);
}
// Append new attribute to end of memory block
m_pBuff->aiOffset[iAttr] = m_pBuff->bcSize - m_pBuff->bcFree;
memcpy(reinterpret_cast<BYTE*>(m_pBuff) + m_pBuff->aiOffset[iAttr], pszAttr, bcAttrSize);
// adjust free space
m_pBuff->bcFree -= bcAttrSize;
return S_OK;
}