Shadowrun: Awakened 29 September 2011 - Build 871
Settings.hpp
Go to the documentation of this file.
00001 /*
00002     Copyright (c) 2009-2010 Christopher A. Taylor.  All rights reserved.
00003 
00004     Redistribution and use in source and binary forms, with or without
00005     modification, are permitted provided that the following conditions are met:
00006 
00007     * Redistributions of source code must retain the above copyright notice,
00008       this list of conditions and the following disclaimer.
00009     * Redistributions in binary form must reproduce the above copyright notice,
00010       this list of conditions and the following disclaimer in the documentation
00011       and/or other materials provided with the distribution.
00012     * Neither the name of LibCat nor the names of its contributors may be used
00013       to endorse or promote products derived from this software without
00014       specific prior written permission.
00015 
00016     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00017     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00018     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00019     ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00020     LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00021     CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00022     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00023     INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00024     CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00025     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00026     POSSIBILITY OF SUCH DAMAGE.
00027 */
00028 
00029 #ifndef CAT_SETTINGS_HPP
00030 #define CAT_SETTINGS_HPP
00031 
00032 #include <cat/Singleton.hpp>
00033 #include <cat/threads/Mutex.hpp>
00034 #include <fstream>
00035 
00036 namespace cat {
00037 
00038 
00039 enum SettingsValueFlags
00040 {
00041     CAT_SETTINGS_FILLED = 1, // s[] array has been set
00042     CAT_SETTINGS_INT = 2,    // value has been promoted to int 'i'
00043 };
00044 
00045 struct SettingsValue
00046 {
00047     u8 flags;    // sum of SettingsValueFlags
00048     char s[256]; // always nul-terminated
00049     int i;
00050 };
00051 
00052 
00053 class SettingsKey
00054 {
00055 public:
00056     SettingsKey(SettingsKey *lnode, SettingsKey *gnode, const char *name);
00057     ~SettingsKey();
00058 
00059 public:
00060     SettingsKey *lnode, *gnode;
00061 
00062     char name[64]; // not necessarily nul-terminated
00063 
00064     SettingsValue value;
00065 
00066 public:
00067     void write(std::ofstream &file);
00068 };
00069 
00070 
00071 // User settings manager
00072 class Settings : public Singleton<Settings>
00073 {
00074     CAT_SINGLETON(Settings);
00075 
00076     Mutex _lock;
00077 
00078 protected:
00079     static const u32 KEY_HASH_SALT = 0xbaddecaf;
00080     static const int SETTINGS_HASH_BINS = 256;
00081 
00082     SettingsKey *hbtrees[SETTINGS_HASH_BINS]; // hash table of binary trees
00083 
00084     bool readSettings; // Flag set when settings have been read from disk
00085     bool modified;     // Flag set when settings have been modified since last write
00086 
00087     std::string _settings_file;
00088 
00089 protected:
00090     SettingsKey *addKey(const char *name);
00091     SettingsKey *getKey(const char *name);
00092 
00093     SettingsKey *initInt(const char *name, int n, bool overwrite);
00094     SettingsKey *initStr(const char *name, const char *value, bool overwrite);
00095 
00096     void clear();
00097     
00098 public:
00099     void readSettingsFromFile(const char *file_path = "settings.txt", const char *override_file = "override.txt");
00100     void readSettingsFromBuffer(const char *data, int len);
00101     void write();
00102 
00103 public:
00104     int getInt(const char *name);
00105     const char *getStr(const char *name);
00106 
00107     int getInt(const char *name, int init);
00108     const char *getStr(const char *name, const char *init);
00109 
00110     void setInt(const char *name, int n);
00111     void setStr(const char *name, const char *value);
00112 };
00113 
00114 
00115 } // namespace cat
00116 
00117 #endif // CAT_SETTINGS_HPP

Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.

GNU Lesser General Public License 3 Sourceforge.net