📄 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 _WIN32bool 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 specifiedbool 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;}#endifbool 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 + -