⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 properties.cpp

📁 移植到WLIT项目的redboot源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//####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 + -