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.
 
 
 
 
 
 

195 lines
3.8 KiB

//-----------------------------------------------------------------------------------------
#pragma once
#include <assert.h>
#include <shlwapi.h>
#include "strlist.h"
#define CA_PROPERTY_LEN 100
#define CA_VALUE_LEN 100
//-----------------------------------------------------------------------------------------
// define a list that will hold MSI property/value pairs
//
class CPropertyBag
{
private:
CStrList list;
public:
CPropertyBag( void )
{
}
//---------------------------------------------------------
void Add( LPCTSTR szProperty, LPCTSTR szValue )
{
list.AddValue ( szProperty, szValue );
}
//---------------------------------------------------------
void Add( LPCTSTR szProperty, DWORD dwValue )
{
TCHAR szValue[ 100 ];
_stprintf( szValue, TEXT( "%d" ), dwValue );
Add( szProperty, szValue );
}
//---------------------------------------------------------
void Delete( LPCTSTR szProperty )
{
list.RemoveByKey ( szProperty );
}
//---------------------------------------------------------
LPTSTR ConcatValuePairs (LPCTSTR separator, LPTSTR outBuf)
{
if (!outBuf)
return NULL;
list.ConcatKeyValues ( separator, outBuf );
return outBuf;
}
//---------------------------------------------------------
void Clear( void )
{
list.RemoveAll ();
}
//---------------------------------------------------------
LPCTSTR GetString( LPCTSTR szProperty, LPTSTR buf )
{
return list.Lookup (szProperty, buf);
}
//---------------------------------------------------------
DWORD GetValue( LPCTSTR szProperty )
{
TCHAR buf [256];
if ( list.Lookup (szProperty, buf) )
{
DWORD numRes = _ttoi( buf );
return numRes;
}
else
return (DWORD)-1;
}
//---------------------------------------------------------
bool Parse( LPTSTR szPropertyString, DWORD dwStrLen )
{
// property1=value1;property2=value2;
assert( szPropertyString );
assert( _tcslen(szPropertyString) > 0 );
if( NULL == szPropertyString || 0 == _tcslen( szPropertyString ) )
{
return false;
}
//
// trim space, commas and semicolons
//
StrTrim( szPropertyString, TEXT( " ;," ) );
//
// add a semicolon to the end
//
if( _tcslen( szPropertyString ) < dwStrLen - 1)
_tcscat( szPropertyString, TEXT( ";" ) );
else
{
assert( false );
return false;
}
// parse out the pairs
PTCHAR pProperty = szPropertyString;
PTCHAR pValue = NULL;
TCHAR szProperty[ 100 ];
TCHAR szValue[ 100 ];
while( *pProperty )
{
//
// the value starts 1 char after the next "="
//
pValue = _tcschr(pProperty, TEXT('='));
if( NULL == pValue )
{
assert( false );
return false;
}
//
// make sure the property value was not blank
//
if( pProperty == pValue )
{
assert( false );
return false;
}
//
// put a NULL there to mark the end of the Property
//
*pValue = NULL;
//
// the value starts after the "="
//
pValue++;
//
// capture the Property
//
_tcsncpy( szProperty, pProperty, sizeof( szProperty ) / sizeof( TCHAR ) );
//
// move the property pointer ahead to the next ";"
//
//
pProperty = _tcschr(pValue, TEXT(';'));
if( NULL == pProperty )
{
assert( false );
return false;
}
//
// null it out to mark the end of the previous value
//
*pProperty = NULL;
//
// set over the null to the start of the next property (or the end of the string)
//
pProperty++;
//
// capture the value
//
_tcsncpy( szValue, pValue, sizeof( szValue ) / sizeof( TCHAR ) );
Add( szProperty, szValue );
}
return true;
}
};