From: Christian P. <cp...@us...> - 2005-06-29 00:08:56
|
Update of /cvsroot/pclasses/pclasses2/plugins/ConfigStore/ini In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32139/plugins/ConfigStore/ini Modified Files: ConfigStore_ini.cpp Makefile.am Log Message: - Implemented ConfigStore_ini::load() Index: Makefile.am =================================================================== RCS file: /cvsroot/pclasses/pclasses2/plugins/ConfigStore/ini/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Makefile.am 22 Jun 2005 11:37:58 -0000 1.1 +++ Makefile.am 29 Jun 2005 00:08:47 -0000 1.2 @@ -2,10 +2,15 @@ METASOURCES = AUTO pkglib_LTLIBRARIES = ConfigStore_ini.la +noinst_PROGRAMS = lextest ConfigStore_ini_la_SOURCES = ConfigStore_ini.cpp ConfigStore_ini_la_LDFLAGS = -module -avoid-version +AM_YFLAGS = -d + +lextest_SOURCES = ini_lex.l ini_yacc.y + ConfigStore_ini_la_LIBADD = $(top_builddir)/src/libpclasses.la \ $(top_builddir)/src/Unicode/libpclasses_unicode.la \ $(top_builddir)/src/IO/libpclasses_io.la \ Index: ConfigStore_ini.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/plugins/ConfigStore/ini/ConfigStore_ini.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ConfigStore_ini.cpp 22 Jun 2005 11:37:58 -0000 1.1 +++ ConfigStore_ini.cpp 29 Jun 2005 00:08:47 -0000 1.2 @@ -18,12 +18,14 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "pclasses/StringList.h" #include "pclasses/IO/IOStream.h" #include "pclasses/IO/IORequest.h" #include "pclasses/IO/IOManager.h" #include "pclasses/System/Plugin.h" #include "pclasses/App/Config.h" #include "pclasses/App/ConfigStore.h" +#include "pclasses/Util/StringTool.h" #include <list> using namespace P; @@ -42,6 +44,16 @@ void load() throw(IO::IOError) { + IOManager& ioMgr = IOManager::instance(); + + IORequest_Get* getReq = ioMgr.get(url()); + getReq->connect(); + + IOStream strm(*getReq); + loadConfig(strm); + + getReq->close(); + ioMgr.finish(getReq); } void save() throw(IO::IOError) @@ -63,13 +75,91 @@ private: typedef std::list<const ConfigSection*> section_list; + void loadConfig(IOStream& strm) + { + ConfigSection* currentSection = &config()->root(); + std::string line; + + while(!strm.eof()) + { + getline(strm, line); + + std::cout << line << std::endl; + + StringTool::trim(line); + + size_t lineLen = line.size(); + + // win32 uses '\r\n' for newline ... + if(lineLen > 0 && line.at(lineLen - 1) == '\r') + { + line.erase(lineLen - 1); + --lineLen; + } + + if(!lineLen) + continue; + + // comments ... + if(lineLen >= 1 && (line.at(0) == '#' || line.at(0) == ';')) + continue; + + // a new section begins ... + if(lineLen >= 2 && line.at(0) == '[' && line.at(lineLen - 1) == ']') + { + StringList<std::string> sectionNameList(line.substr(1, lineLen - 2), "\\"); + StringList<std::string>::const_iterator sni = sectionNameList.begin(); + currentSection = &config()->root(); + + while(sni != sectionNameList.end()) + { + currentSection = ¤tSection->section(*sni, true); + ++sni; + } + + continue; + } + + size_t equalPos = line.find('='); + + // invalid line, skip it + if(equalPos == std::string::npos || equalPos == 0) + continue; + + std::string valueName = line.substr(0, equalPos - 1); + StringTool::trim(valueName); + + std::string valueStr = line.substr(equalPos + 1); + StringTool::trim(valueStr); + + // remove quotes ... + size_t valueStrLen = valueStr.size(); + if(valueStrLen >= 2 && valueStr.at(0) == '\"' && valueStr.at(valueStrLen - 1) == '\"') + valueStr = valueStr.substr(1, valueStrLen - 2); + + currentSection->setValue(valueName, valueStr); + } + } + void saveSection(IOStream& strm, section_list& sectionContext, const ConfigSection& section) { ConfigSection::value_const_iterator vi = section.valuesBegin(); while(vi != section.valuesEnd()) { - strm << vi->first << " = " << vi->second.value().utf8() << std::endl; + std::string valueStr = vi->second.toString().utf8(); + size_t valueStrLen = valueStr.size(); + + strm << vi->first << " = "; + + // quote values with spaces at front or back ... + if(valueStrLen >= 1 && (valueStr.at(0) == ' ' || valueStr.at(valueStrLen - 1) == ' ')) + strm << '\"' << valueStr << '\"'; + else + strm << valueStr; + + strm << std::endl; + ++vi; } @@ -87,6 +177,7 @@ void saveSectionName(IOStream& strm, section_list& sectionContext) { + strm << std::endl; strm << '['; section_list::const_iterator i = sectionContext.begin(); while(i != sectionContext.end()) |