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.
 
 
 
 
 
 

101 lines
2.2 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1998, Microsoft Corp. All rights reserved.
//
// FILE
//
// propbag.cpp
//
// SYNOPSIS
//
// This file defines the class PropertyBag.
//
// MODIFICATION HISTORY
//
// 02/20/1998 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#include <ias.h>
#include <propbag.h>
#include <varvec.h>
PropertyValue::PropertyValue(const VARIANT* v)
{
// Is this a single-valued property?
if (V_VT(v) != (VT_VARIANT | VT_ARRAY))
{
push_back(v);
}
else
{
// Multi-valued, so get the array ...
CVariantVector<VARIANT> array(const_cast<VARIANT*>(v));
resize(array.size());
// ... and assign each element separately.
for (size_t i = 0; i < array.size(); ++i)
{
operator[](i) = array[i];
}
}
}
void PropertyValue::append(const VARIANT* v)
{
// Copy the supplied VARIANT.
_variant_t tmp(v);
// Make room in the vector.
resize(size() + 1);
// Assign the copy.
back().Attach(tmp.Detach());
}
void PropertyValue::get(VARIANT* v) const
{
VariantInit(v);
if (size() == 1)
{
// Single-valued so just copy the front element.
_com_util::CheckError(VariantCopy(v, const_cast<_variant_t*>(&front())));
}
else if (!empty())
{
// Copy all the values.
PropertyValue tmp(*this);
// Create an array of VARIANT's to hold the returned copies.
CVariantVector<VARIANT> array(v, size());
// Assign the copies.
for (size_t i = 0; i < size(); ++i)
{
array[i] = tmp[i].Detach();
}
}
}
void PropertyBag::appendValue(const _bstr_t& name, const VARIANT* value)
{
iterator i = find(name);
(i != end()) ? i->second.append(value) : updateValue(name, value);
}
bool PropertyBag::getValue(const _bstr_t& name, VARIANT* value) const
{
const_iterator i = find(name);
return (i != end()) ? i->second.get(value), true : false;
}
void PropertyBag::updateValue(const _bstr_t& name, const VARIANT* value)
{
PropertyValue tmp(value);
operator[](name).swap(tmp);
}