Subversion Repositories HomeAutomation

Rev

Rev 1620 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  *
  3.  *  Copyright (C) 2010  Mattias Runge
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License along
  16.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  17.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18.  *
  19.  */
  20.  
  21. #include "Store.h"
  22.  
  23. #include <fstream>
  24. #include <stdexcept>
  25.  
  26. #include <boost/algorithm/string.hpp>
  27.  
  28. #include "type/common.h"
  29.  
  30. namespace atom {
  31. namespace storage {
  32.  
  33. Store::Store(std::string filename)
  34. {
  35.     this->filename_ = filename;
  36.     this->modified_ = false;
  37.     this->flush_policy = FLUSH_INSTANT;
  38.    
  39.     std::ifstream file(filename.data());
  40.    
  41.     if (!file.is_open())
  42.     {
  43.         file.close();
  44.         return;
  45.     }
  46.    
  47.     std::string line;
  48.     size_t pos;
  49.    
  50.     while (!file.eof())
  51.     {
  52.         std::getline(file, line);
  53.        
  54.         if (file.eof())
  55.         {
  56.             break;
  57.         }
  58.        
  59.         pos = line.find_first_of("=");
  60.  
  61.         if (pos == std::string::npos)
  62.         {
  63.             continue;
  64.         }
  65.        
  66.         this->parameters_[line.substr(0, pos)] = line.substr(pos + 1);
  67.     }
  68.    
  69.     file.close();
  70. }
  71.  
  72. Store::~Store()
  73. {
  74.    
  75. }
  76.  
  77. void Store::SetFlushPolicy(Store::FlushPolicy flush_policy)
  78. {
  79.     this->flush_policy = flush_policy;
  80. }
  81.  
  82. void Store::Flush()
  83. {
  84.     if (this->modified_)
  85.     {
  86.         std::ofstream file(this->filename_.data());
  87.  
  88.         if (!file.is_open())
  89.         {
  90.             throw std::runtime_error("Could not open " + this->filename_);
  91.         }
  92.        
  93.         for (ParameterList::iterator it = this->parameters_.begin(); it != this->parameters_.end(); it++)
  94.         {
  95.             file << it->first << "=" << it->second << "\n";
  96.         }
  97.        
  98.         file.close();
  99.         this->modified_ = false;
  100.     }
  101. }
  102.  
  103. Store::ParameterList& Store::GetParameters()
  104. {
  105.     return this->parameters_;
  106. }
  107.  
  108. std::string Store::GetParameter(std::string name)
  109. {
  110.     ParameterList::iterator it = this->parameters_.find(name);
  111.    
  112.     if (it == this->parameters_.end())
  113.     {
  114.         throw std::runtime_error("No such parameter");
  115.     }
  116.    
  117.     return it->second;
  118. }
  119.  
  120. void Store::SetParameter(std::string name, std::string value)
  121. {
  122.     if (this->parameters_[name] != value)
  123.     {
  124.         if (value == "")
  125.         {
  126.             this->parameters_.erase(name);
  127.         }
  128.         else
  129.         {
  130.             this->parameters_[name] = value;
  131.         }  
  132.            
  133.         this->modified_ = true;
  134.        
  135.         if (this->flush_policy == FLUSH_INSTANT)
  136.         {
  137.             this->Flush();
  138.         }
  139.     }
  140. }
  141.    
  142. }; // namespace storage
  143. }; // namespace atom
  144.