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
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;
|
|
}
|
|
};
|