📄 properties.cpp
字号:
//####COPYRIGHTBEGIN####
//
// ----------------------------------------------------------------------------
// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
//
// This program is part of the eCos host tools.
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
// more details.
//
// You should have received a copy of the GNU General Public License along with
// this program; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// ----------------------------------------------------------------------------
//
//####COPYRIGHTEND####
// Properties.cpp: implementation of the CProperties class.
//
//////////////////////////////////////////////////////////////////////
#include "Properties.h"
#include "eCosTrace.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CProperties::CProperties()
{
}
CProperties::~CProperties()
{
}
#ifdef _WIN32
bool CProperties::LoadFromRegistry(HKEY hTopKey,LPCTSTR szRegKey)
{
HKEY hKey;
LONG l=RegOpenKeyEx (hTopKey, szRegKey, 0L, KEY_QUERY_VALUE, &hKey);
bool rc=(ERROR_SUCCESS==l);
if(rc){
TCHAR szName[256];
DWORD dwSizeName=sizeof szName;
DWORD dwMaxDatalen;
DWORD dwType;
if(ERROR_SUCCESS==RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&dwMaxDatalen,NULL,NULL)){
char *Data=new char[dwMaxDatalen];
DWORD dwDatalen=dwMaxDatalen;
for(DWORD dwIndex=0;ERROR_SUCCESS==RegEnumValue(hKey, dwIndex, szName, &dwSizeName, NULL, &dwType, (LPBYTE)Data, &dwDatalen);dwIndex++){
CProperties::CProperty *p=Lookup(szName);
if(p){
switch(p->Type){
case CProperty::Integer:
if(REG_DWORD==dwType){
p->SetValue(*(int *)Data);
} else {
TRACE(_T("Type mismatch - %s: expected REG_DWORD, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
case CProperty::Bool:
if(REG_DWORD==dwType){
p->SetValue((bool)0!=*(int *)Data);
} else {
TRACE(_T("Type mismatch - %s: expected REG_DWORD, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
case CProperty::Char:
if(REG_DWORD==dwType){
p->SetValue(*(char *)Data);
} else {
TRACE(_T("Type mismatch - %s: expected REG_DWORD, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
case CProperty::Short:
if(REG_DWORD==dwType){
p->SetValue(*(short *)Data);
} else {
TRACE(_T("Type mismatch - %s: expected REG_DWORD, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
case CProperty::Float:
case CProperty::Double:
case CProperty::szString:
if(REG_SZ==dwType){
rc&=p->SetValue((LPCTSTR)Data);
} else {
TRACE(_T("Type mismatch - %s: expected REG_SZ, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
case CProperty::Void:
if(REG_BINARY==dwType){
memcpy(p->pData,Data,min(dwDatalen,p->nLength));
} else {
TRACE(_T("Type mismatch - %s: expected REG_BINARY, got %d\n"),(LPCTSTR)p->strName,dwType);
rc=false;
}
break;
}
} else {
TRACE(_T("CProperties::LoadFromRegistry - unrecognized value %s in key %s\n"),szName,szRegKey);
rc=false;
}
dwSizeName=sizeof szName;
dwDatalen=dwMaxDatalen;
}
delete [] Data;
dwSizeName=sizeof szName;
}
RegCloseKey(hKey);
} else {
TRACE(_T("Failed to open %s\n"),szRegKey);
}
return rc;
}
bool CProperties::SaveToRegistry(HKEY hTopKey,LPCTSTR szRegKey) const
{
HKEY hKey;
CreateKey(szRegKey);
bool rc=(ERROR_SUCCESS==RegOpenKeyEx (hTopKey, szRegKey, 0L, KEY_SET_VALUE, &hKey));
if(rc){
for(int i=ar.size()-1;i>=0;--i){
// Initializations are simply to avoid compiler warnings.
DWORD dwDatalen=0;
DWORD dwType=REG_DWORD;
BYTE *Data=0;
// strValue and dw *must* be in scope for RegSetValueEx below.
DWORD dw;
String strValue;
const CProperty &p=ar[i];
switch(p.Type){
case CProperties::CProperty::Integer:
case CProperties::CProperty::Bool:
case CProperties::CProperty::Char:
case CProperties::CProperty::Short:
dwType=REG_DWORD;
dwDatalen=sizeof(DWORD);
dw=p.GetValue();
Data=(BYTE *)&dw;
break;
case CProperties::CProperty::Float:
case CProperties::CProperty::Double:
case CProperties::CProperty::szString:
strValue=p.GetStringValue();
Data=(BYTE *)(LPCTSTR)strValue;
dwType=REG_SZ;
dwDatalen=(1+strValue.size())*sizeof(_TCHAR);
break;
case CProperties::CProperty::Void:
Data=(BYTE *)p.pData;
dwType=REG_BINARY;
dwDatalen=p.nLength;
break;
default:
assert(false);
break;
}
rc&=(ERROR_SUCCESS==RegSetValueEx(hKey,p.strName,0,dwType,Data,dwDatalen));
}
}
RegCloseKey(hKey);
return rc;
}
// Create all keys down to the one specified
bool CProperties::CreateKey(LPCTSTR pszKey,HKEY hKey/*=HKEY_CURRENT_USER*/)
{
bool rc=true;
LPCTSTR pcStart=pszKey;
LPCTSTR pcEnd;
do {
HKEY hKey2;
pcEnd=_tcschr(pcStart,_TCHAR('\\'));
if(NULL==pcEnd){
pcEnd=pcStart+_tcslen(pcStart);
}
String strKey(pcStart,pcEnd-pcStart);
if(ERROR_SUCCESS!=RegCreateKeyEx(hKey, // handle to an open key
strKey, // address of subkey name
0, // reserved
0, // address of class string
REG_OPTION_NON_VOLATILE, // special options flag
KEY_ALL_ACCESS, // desired security access
NULL,
// address of key security structure
&hKey2, // address of buffer for opened handle
NULL// address of disposition value buffer);
)){
rc=false;
break;
}
RegCloseKey(hKey);
hKey=hKey2;
pcStart=pcEnd+1;
} while (_TCHAR('\0')!=*pcEnd);
RegCloseKey(hKey);
return rc;
}
#endif
bool CProperties::LoadFromCommandString(LPCTSTR psz)
{
bool rc=true;
const TCHAR *cNext;
for(LPCTSTR c=_tcschr(psz,_TCHAR('-'));c;c=_tcschr(cNext,_TCHAR('-'))){
c++;
const TCHAR *pEq=_tcschr(c,_TCHAR('='));
if(NULL==pEq){
TRACE(_T("Failed to find '=' after %s\n"),c);
rc=false;
break;
}
String strName(c,pEq-c);
CProperties::CProperty *p=Lookup(strName);
c=pEq+1;
String str;
if(_TCHAR('"')==*c){
// Value is a quoted string
for(cNext=c+1;_TCHAR('"')!=*cNext;cNext++){
if(_TCHAR('\\')==*cNext){
cNext++;
}
str+=*cNext;
}
} else {
// Value is simply terminated by whitespace
for(cNext=c;_TCHAR('\0')!=*cNext && !_istspace(*cNext);cNext++);
str=String(c,cNext-c);
}
if(p){
rc&=p->SetValue(str);
} else {
TRACE(_T("Properties: unrecognized attribute %s in command string\n"),(LPCTSTR)strName);
rc=false;
}
c=cNext;
}
return rc;
}
CProperties::CProperty * CProperties::Lookup(LPCTSTR pszName)
{
for(int i=ar.size()-1;i>=0;--i){
CProperties::CProperty &p=ar[i];
if(0==_tcsicmp(p.strName,pszName)){
return &p;
}
}
return NULL;
}
String CProperties::MakeCommandString() const
{
String strResult;
bool bFirst=true;
for(int i=ar.size()-1;i>=0;--i){
String str;
const CProperty &p=ar[i];
switch(p.Type){
case CProperties::CProperty::Integer:
case CProperties::CProperty::Bool:
case CProperties::CProperty::Char:
case CProperties::CProperty::Short:
str.Format(_T("-%s=%u"),(LPCTSTR)p.strName,p.GetValue());
break;
case CProperties::CProperty::szString:
{
// Quote the string, escaping existing quotes as necessary
str.Format(_T("-%s=\""),(LPCTSTR)p.strName);
for(LPCTSTR c=p.GetStringValue();*c;c++){
if(_TCHAR('"')==*c){
str+=_TCHAR('\\');
}
str+=*c;
}
str+=_TCHAR('"');
}
break;
case CProperties::CProperty::Float:
case CProperties::CProperty::Double:
case CProperties::CProperty::Void:
str.Format(_T("-%s=%s"),(LPCTSTR)p.GetStringValue());
break;
}
if(!bFirst){
strResult+=_TCHAR(' ');
}
bFirst=false;
strResult+=str;
}
return strResult;
}
bool CProperties::CreatePathToFile(LPCTSTR pszDir)
{
// Create intermediate directories
#ifdef _WIN32
const TCHAR cSep='\\';
#else // UNIX
const TCHAR cSep='/';
#endif
for(LPCTSTR c=_tcschr(pszDir,cSep);c;c=_tcschr(c+1,cSep)){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -