From 5d72cb458406fc42f7ee68d8f8dbdf99d6f9a192 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Fri, 18 Jan 2002 00:47:33 +0000 Subject: added Resource.cc/.hh --- src/Resource.cc | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/Resource.hh | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 src/Resource.cc create mode 100644 src/Resource.hh diff --git a/src/Resource.cc b/src/Resource.cc new file mode 100644 index 0000000..c53e301 --- /dev/null +++ b/src/Resource.cc @@ -0,0 +1,116 @@ +// Resource.cc +// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#include "Resource.hh" +#include "XrmDatabaseHelper.hh" + +#include +#include + +using namespace std; + +bool ResourceManager::m_init = false; + +//-------- load ----------- +// loads a resourcefile +// returns true on success +// else false +//------------------------- +bool ResourceManager::load(const char *filename) { + assert(filename); + + ensureXrmIsInitialize(); + + XrmDatabaseHelper database; + database = XrmGetFileDatabase(filename); + if (database==0) + return false; + + XrmValue value; + char *value_type; + + //get list and go throu all the resources and load them + ResourceList::iterator i = m_resourcelist.begin(); + ResourceList::iterator i_end = m_resourcelist.end(); + for (; i != i_end; ++i) { + + Resource_base *resource = *i; + if (XrmGetResource(*database, resource->getName().c_str(), + resource->getAltName().c_str(), &value_type, &value)) + resource->setFromString(value.addr); + else { + cerr<<"Faild to read: "<getName()<setDefaultValue(); + } + } + + return true; +} + +//-------------- save ----------------- +// Saves all the resource to a file +// returns 0 on success +// else negative value representing +// the error +//------------------------------------- +bool ResourceManager::save(const char *filename, const char *mergefilename) { + assert(filename); + + ensureXrmIsInitialize(); + + XrmDatabaseHelper database; + + string rc_string; + ResourceList::iterator i = m_resourcelist.begin(); + ResourceList::iterator i_end = m_resourcelist.end(); + //write all resources to database + for (; i != i_end; ++i) { + Resource_base *resource = *i; + rc_string = resource->getName() + string(": ") + resource->getString(); + XrmPutLineResource(&*database, rc_string.c_str()); + } + + if (database==0) + return false; + + //check if we want to merge a database + if (mergefilename) { + XrmDatabaseHelper olddatabase(mergefilename); + if (olddatabase == 0) + return false; + + XrmMergeDatabases(*database, &*olddatabase); + XrmPutFileDatabase(*olddatabase, filename); //save database to file + *database=0; //don't try to destroy the database + } else //save database to file + XrmPutFileDatabase(*database, filename); + + return true; +} + +void ResourceManager::ensureXrmIsInitialize() { + if (!m_init) { + XrmInitialize(); + m_init = true; + } +} + diff --git a/src/Resource.hh b/src/Resource.hh new file mode 100644 index 0000000..38bea30 --- /dev/null +++ b/src/Resource.hh @@ -0,0 +1,107 @@ +// Resource.hh +// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef _RESOURCE_HH_ +#define _RESOURCE_HH_ + +#include "NotCopyable.hh" +#include +#include + +class Resource_base:private NotCopyable +{ +public: + + virtual void setFromString(char const *strval)=0; + virtual void setDefaultValue()=0; + + virtual std::string getString()=0; + inline std::string& getAltName() { return m_altname; } + inline std::string& getName() { return m_name; } + +protected: + Resource_base(const std::string &name, const std::string &altname): + m_name(name), m_altname(altname) + { + + } + virtual ~Resource_base(){ }; +private: + std::string m_name, m_altname; +}; + +class ResourceManager; + +template +class Resource:public Resource_base +{ +public: + Resource(ResourceManager &rm, T val, + const std::string &name, const std::string &altname): + Resource_base(name, altname), + m_value(val), m_defaultval(val), + m_rm(rm) + { + m_rm.addResource(*this); + } + ~Resource() { + m_rm.removeResource(*this); + } + + inline void setDefaultValue() { m_value = m_defaultval; } + void setFromString(const char *strval); + inline Resource& operator = (const T& newvalue) { m_value = newvalue; return *this;} + + std::string getString(); + inline T& operator*(void) { return m_value; } + inline T *operator->(void) { return &m_value; } +private: + T m_value, m_defaultval; + ResourceManager &m_rm; +}; + +class ResourceManager +{ +public: + typedef std::list ResourceList; + + ResourceManager(){ } + + bool load(const char *filename); + bool save(const char *filename, const char *mergefilename=0); + template + void addResource(Resource &r) { + m_resourcelist.push_back(&r); + m_resourcelist.unique(); + } + template + void removeResource(Resource &r) { + m_resourcelist.remove(&r); + } +private: + static inline void ensureXrmIsInitialize(); + static bool m_init; + ResourceList m_resourcelist; + +}; + + +#endif //_RESOURCE_HH_ -- cgit v0.11.2