]> git.stg.codes - stg.git/commitdiff
Split SETTINGS to interface and implementation
authorMaxim Mamontov <faust.madf@gmail.com>
Tue, 22 Mar 2011 11:55:39 +0000 (13:55 +0200)
committerMaxim Mamontov <faust.madf@gmail.com>
Tue, 22 Mar 2011 11:55:39 +0000 (13:55 +0200)
projects/stargazer/settings.cpp [deleted file]
projects/stargazer/settings.h [deleted file]
projects/stargazer/settings_impl.cpp [new file with mode: 0644]
projects/stargazer/settings_impl.h [new file with mode: 0644]

diff --git a/projects/stargazer/settings.cpp b/projects/stargazer/settings.cpp
deleted file mode 100644 (file)
index 8af7f7a..0000000
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- *    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
- */
-
-/*
- *    Date: 27.10.2002
- */
-
-/*
- *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
- */
-
-/*
-$Revision: 1.45 $
-$Date: 2010/08/19 13:42:30 $
-$Author: faust $
-*/
-
-#include <cstring>
-#include <cerrno>
-#include <string>
-
-#include "settings.h"
-#include "stg_logger.h"
-#include "dotconfpp.h"
-
-using namespace std;
-
-//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS()
-    : confDir("/etc/stargazer"),
-      scriptsDir("/etc/stargazer"),
-      pidFile("/var/run/stargazer.pid"),
-      monitoring(false),
-      detailStatWritePeriod(dsPeriod_1_6),
-      statWritePeriod(10),
-      stgExecMsgKey(5555),
-      executersNum(1),
-      fullFee(false),
-      dayFee(0),
-      dayResetTraff(0),
-      spreadFee(false),
-      freeMbAllowInet(false),
-      dayFeeIsLastDay(false),
-      writeFreeMbTraffCost(false),
-      showFeeInCash(true),
-      messageTimeout(0),
-      logger(GetStgLogger())
-{
-}
-//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS(const std::string & cd)
-    : confDir(cd),
-      scriptsDir(cd),
-      monitoring(false),
-      detailStatWritePeriod(dsPeriod_1_6),
-      statWritePeriod(10),
-      stgExecMsgKey(5555),
-      executersNum(1),
-      fullFee(false),
-      dayFee(0),
-      dayResetTraff(0),
-      spreadFee(false),
-      freeMbAllowInet(false),
-      dayFeeIsLastDay(false),
-      writeFreeMbTraffCost(false),
-      showFeeInCash(true),
-      messageTimeout(0),
-      logger(GetStgLogger())
-{
-}
-//-----------------------------------------------------------------------------
-SETTINGS::SETTINGS(const SETTINGS & rval)
-    : confDir(rval.confDir),
-      scriptsDir(rval.scriptsDir),
-      pidFile(rval.pidFile),
-      monitoring(rval.monitoring),
-      detailStatWritePeriod(dsPeriod_1_6),
-      statWritePeriod(10),
-      stgExecMsgKey(rval.stgExecMsgKey),
-      executersNum(rval.executersNum),
-      fullFee(rval.fullFee),
-      dayFee(0),
-      dayResetTraff(0),
-      spreadFee(rval.spreadFee),
-      freeMbAllowInet(false),
-      dayFeeIsLastDay(false),
-      writeFreeMbTraffCost(false),
-      showFeeInCash(rval.showFeeInCash),
-      messageTimeout(rval.messageTimeout),
-      logger(GetStgLogger())
-{
-}
-//-----------------------------------------------------------------------------
-SETTINGS::~SETTINGS()
-{
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseYesNo(const string & value, bool * val)
-{
-if (0 == strcasecmp(value.c_str(), "yes"))
-    {
-    *val = true;
-    return 0;
-    }
-if (0 == strcasecmp(value.c_str(), "no"))
-    {
-    *val = false;
-    return 0;
-    }
-
-strError = "Incorrect value \'" + value + "\'.";
-return -1;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseInt(const string & value, int * val)
-{
-if (str2x<int>(value, *val))
-    {
-    strError = "Cannot convert \'" + value + "\' to integer.";
-    return -1;
-    }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseUnsigned(const string & value, unsigned * val)
-{
-if (str2x<unsigned>(value, *val))
-    {
-    strError = "Cannot convert \'" + value + "\' to unsigned integer.";
-    return -1;
-    }
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseIntInRange(const string & value, int min, int max, int * val)
-{
-if (ParseInt(value, val) != 0)
-    return -1;
-
-if (*val < min || *val > max)
-    {
-    strError = "Value \'" + value + "\' out of range.";
-    return -1;
-    }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseUnsignedInRange(const string & value, unsigned min, unsigned max, unsigned * val)
-{
-if (ParseUnsigned(value, val) != 0)
-    return -1;
-
-if (*val < min || *val > max)
-    {
-    strError = "Value \'" + value + "\' out of range.";
-    return -1;
-    }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseModuleSettings(const DOTCONFDocumentNode * node, vector<PARAM_VALUE> * params)
-{
-const DOTCONFDocumentNode * childNode;
-PARAM_VALUE pv;
-const char * value;
-
-pv.param = node->getName();
-
-if (node->getValue(1))
-    {
-    strError = "Unexpected value \'" + string(node->getValue(1)) + "\'.";
-    return -1;
-    }
-
-value = node->getValue(0);
-
-if (!value)
-    {
-    strError = "Module name expected.";
-    return -1;
-    }
-
-childNode = node->getChildNode();
-while (childNode)
-    {
-    pv.param = childNode->getName();
-    int i = 0;
-    while ((value = childNode->getValue(i++)) != NULL)
-        {
-        pv.value.push_back(value);
-        }
-    params->push_back(pv);
-    pv.value.clear();
-    childNode = childNode->getNextNode();
-    }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-void SETTINGS::ErrorCallback(void * data, const char * buf)
-{
-    printfd(__FILE__, buf);
-    SETTINGS * settings = static_cast<SETTINGS *>(data);
-    settings->logger(buf);
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ReadSettings()
-{
-const char * requiredOptions[] = {
-    "ModulesPath",
-    "Modules",
-    "StoreModule",
-    "Rules",
-    "LogFile",
-    "DetailStatWritePeriod",
-    "DayFee",
-    "DayResetTraff",
-    "SpreadFee",
-    "FreeMbAllowInet",
-    "DayFeeIsLastDay",
-    "WriteFreeMbTraffCost",
-    NULL
-    };
-int storeModulesCount = 0;
-modulesSettings.clear();
-
-DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE);
-conf.setErrorCallback(SETTINGS::ErrorCallback, this);
-conf.setRequiredOptionNames(requiredOptions);
-string confFile = confDir + "/stargazer.conf";
-
-if(conf.setContent(confFile.c_str()) != 0)
-    {
-    strError = "Cannot read file " + confFile;
-    return -1;
-    }
-
-const DOTCONFDocumentNode * node = conf.getFirstNode();
-
-while (node)
-    {
-    if (strcasecmp(node->getName(), "ScriptDir") == 0)
-        {
-        scriptsDir = node->getValue(0);
-        }
-
-    if (strcasecmp(node->getName(), "LogFile") == 0)
-        {
-        logFile = node->getValue(0);
-        }
-
-    if (strcasecmp(node->getName(), "PIDFile") == 0)
-        {
-        pidFile = node->getValue(0);
-        }
-
-    if (strcasecmp(node->getName(), "ModulesPath") == 0)
-        {
-        modulesPath = node->getValue(0);
-        }
-
-    if (strcasecmp(node->getName(), "Rules") == 0)
-        {
-        rules = node->getValue(0);
-        }
-
-    if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
-        {
-        if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
-            {
-            strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
-        {
-        if (ParseUnsignedInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
-            {
-            strError = "Incorrect StatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "ExecMsgKey") == 0)
-        {
-        if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0)
-            {
-            strError = "Incorrect ExecMsgKey value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "ExecutersNum") == 0)
-        {
-        if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
-            {
-            strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "DayFee") == 0)
-        {
-        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0)
-            {
-            strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "FullFee") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &fullFee) != 0)
-            {
-            strError = "Incorrect FullFee value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "DayResetTraff") == 0)
-        {
-        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
-            {
-            strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "SpreadFee") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &spreadFee) != 0)
-            {
-            strError = "Incorrect SpreadFee value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "FreeMbAllowInet") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0)
-            {
-            strError = "Incorrect FreeMbAllowInet value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "DayFeeIsLastDay") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0)
-            {
-            strError = "Incorrect DayFeeIsLastDay value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0)
-            {
-            strError = "Incorrect WriteFreeMbTraffCost value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "ShowFeeInCash") == 0)
-        {
-        if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0)
-            {
-            strError = "Incorrect ShowFeeInCash value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "MonitorDir") == 0)
-        {
-        monitorDir = node->getValue(0);
-        struct stat stat;
-        monitoring = false;
-
-        if (!lstat(monitorDir.c_str(), &stat) && S_ISDIR(stat.st_mode))
-            {
-            monitoring = true;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "MessageTimeout") == 0)
-        {
-        if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0)
-            {
-            strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'";
-            return -1;
-            }
-        }
-
-    if (strcasecmp(node->getName(), "DirNames") == 0)
-        {
-        const DOTCONFDocumentNode * child = node->getChildNode();
-        if (child)
-            {
-            const DOTCONFDocumentNode * dirNameNode;
-            for (int i = 0; i < DIR_NUM; i++)
-                {
-                char strDirName[12];
-                sprintf(strDirName, "DirName%d", i);
-                dirNameNode = conf.findNode(strDirName, node);
-                if (dirNameNode && dirNameNode->getValue(0))
-                    {
-                    dirName[i] = dirNameNode->getValue(0);
-                    }
-                }
-            }
-        }
-
-    if (strcasecmp(node->getName(), "StoreModule") == 0)
-        {
-        if (node->getValue(1))
-            {
-            strError = "Unexpected \'" + string(node->getValue(1)) + "\'.";
-            return -1;
-            }
-
-        if (storeModulesCount)
-            {
-            strError = "Should be only one StoreModule.";
-            return -1;
-            }
-        storeModulesCount++;
-
-        storeModuleSettings.moduleName = node->getValue(0);
-        ParseModuleSettings(node, &storeModuleSettings.moduleParams);
-        }
-
-    if (strcasecmp(node->getName(), "Modules") == 0)
-        {
-        if (node->getValue(0))
-            {
-            strError = "Unexpected \'" + string(node->getValue(0)) + "\'.";
-            return -1;
-            }
-        const DOTCONFDocumentNode * child = node->getChildNode();
-        while (child)
-            {
-            if (strcasecmp(child->getName(), "Module") != 0)
-                {
-                child = child->getNextNode();
-                continue;
-                }
-            MODULE_SETTINGS modSettings;
-            modSettings.moduleParams.clear();
-            modSettings.moduleName = child->getValue();
-
-            ParseModuleSettings(child, &modSettings.moduleParams);
-
-            modulesSettings.push_back(modSettings);
-
-            child = child->getNextNode();
-            }
-        }
-
-    node = node->getNextNode();
-    }
-
-return 0;
-}
-//-----------------------------------------------------------------------------
-int SETTINGS::ParseDetailStatWritePeriod(const string & detailStatPeriodStr)
-{
-if (detailStatPeriodStr == "1")
-    {
-    detailStatWritePeriod = dsPeriod_1;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/2")
-    {
-    detailStatWritePeriod = dsPeriod_1_2;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/4")
-    {
-    detailStatWritePeriod = dsPeriod_1_4;
-    return 0;
-    }
-else if (detailStatPeriodStr == "1/6")
-    {
-    detailStatWritePeriod = dsPeriod_1_6;
-    return 0;
-    }
-
-return -1;
-}
-//-----------------------------------------------------------------------------
diff --git a/projects/stargazer/settings.h b/projects/stargazer/settings.h
deleted file mode 100644 (file)
index 8626280..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
- /*
- $Revision: 1.27 $
- $Date: 2010/08/19 13:42:30 $
- $Author: faust $
- */
-
-/*
- *    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
- */
-
-/*
- *    Date: 27.10.2002
- */
-
-/*
- *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
- */
-
- /*
- $Revision: 1.27 $
- $Date: 2010/08/19 13:42:30 $
- */
-
-
-#ifndef SETTINGS_H
-#define SETTINGS_H
-
-#include <string>
-#include <vector>
-
-#include "common.h"
-#include "stg_logger.h"
-#include "module_settings.h"
-
-//-----------------------------------------------------------------------------
-enum DETAIL_STAT_PERIOD {
-dsPeriod_1,
-dsPeriod_1_2,
-dsPeriod_1_4,
-dsPeriod_1_6,
-};
-//-----------------------------------------------------------------------------
-class STG_LOGGER;
-class DOTCONFDocumentNode;
-//-----------------------------------------------------------------------------
-class SETTINGS {
-public:
-    SETTINGS();
-    SETTINGS(const std::string &);
-    SETTINGS(const SETTINGS &);
-    virtual ~SETTINGS();
-    int Reload() { return ReadSettings(); }
-    int ReadSettings();
-
-    std::string GetStrError() const { return strError; }
-
-    int                 GetExecMsgKey() const { return stgExecMsgKey; }
-    unsigned            GetExecutersNum() const { return executersNum; }
-    const std::string & GetDirName(int num) const { return dirName[num]; };
-    const std::string & GetConfDir() const { return confDir; }
-    const std::string & GetScriptsDir() const { return scriptsDir; }
-    const std::string & GetRulesFileName() const { return rules; }
-    const std::string & GetLogFileName() const { return logFile; }
-    const std::string & GetPIDFileName() const { return pidFile; }
-    unsigned            GetDetailStatWritePeriod() const 
-        { return detailStatWritePeriod; };
-    unsigned            GetStatWritePeriod() const { return statWritePeriod * 60; }
-    unsigned            GetDayFee() const { return dayFee; }
-    bool                GetFullFee() const { return fullFee; }
-    unsigned            GetDayResetTraff() const { return dayResetTraff; }
-    bool                GetSpreadFee() const { return spreadFee; }
-    bool                GetFreeMbAllowInet() const { return freeMbAllowInet; }
-    bool                GetDayFeeIsLastDay() const { return dayFeeIsLastDay; }
-    bool                GetWriteFreeMbTraffCost() const
-        { return writeFreeMbTraffCost; };
-    bool                GetShowFeeInCash() const { return showFeeInCash; }
-    const std::string & GetMonitorDir() const { return monitorDir; }
-    bool                GetMonitoring() const { return monitoring; }
-    unsigned            GetMessageTimeout() const { return messageTimeout * 3600 * 24; }
-
-    const std::string & GetModulesPath() const { return modulesPath; }
-    const MODULE_SETTINGS & GetStoreModuleSettings() const
-        { return storeModuleSettings; }
-    const std::vector<MODULE_SETTINGS> & GetModulesSettings() const
-        { return modulesSettings; }
-
-private:
-
-    int ParseInt(const std::string & value, int * val);
-    int ParseUnsigned(const std::string & value, unsigned * val);
-    int ParseIntInRange(const std::string & value, int min, int max, int * val);
-    int ParseUnsignedInRange(const std::string & value, unsigned min, unsigned max, unsigned * val);
-    int ParseYesNo(const std::string & value, bool * val);
-    int ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr);
-
-    int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector<PARAM_VALUE> * params);
-
-    static void ErrorCallback(void * data, const char * buf);
-
-    std::string strError;
-
-    //////////settings
-    std::string modulesPath;
-    std::string dirName[DIR_NUM];
-    std::string confDir;
-    std::string        scriptsDir;
-    std::string rules;
-    std::string logFile;
-    std::string pidFile;
-    std::string monitorDir;
-    bool        monitoring;
-    unsigned    detailStatWritePeriod;
-    unsigned    statWritePeriod;
-    int         stgExecMsgKey;
-    unsigned    executersNum;
-    bool        fullFee;
-    unsigned    dayFee;
-    unsigned    dayResetTraff;
-    bool        spreadFee;
-    bool        freeMbAllowInet;
-    bool        dayFeeIsLastDay;
-    bool        writeFreeMbTraffCost;
-    bool        showFeeInCash;
-    unsigned    messageTimeout;
-
-    std::vector<MODULE_SETTINGS> modulesSettings;
-    MODULE_SETTINGS storeModuleSettings;
-
-    STG_LOGGER & logger;
-};
-//-----------------------------------------------------------------------------
-
-#endif
diff --git a/projects/stargazer/settings_impl.cpp b/projects/stargazer/settings_impl.cpp
new file mode 100644 (file)
index 0000000..8af7f7a
--- /dev/null
@@ -0,0 +1,507 @@
+/*
+ *    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
+ */
+
+/*
+ *    Date: 27.10.2002
+ */
+
+/*
+ *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
+ */
+
+/*
+$Revision: 1.45 $
+$Date: 2010/08/19 13:42:30 $
+$Author: faust $
+*/
+
+#include <cstring>
+#include <cerrno>
+#include <string>
+
+#include "settings.h"
+#include "stg_logger.h"
+#include "dotconfpp.h"
+
+using namespace std;
+
+//-----------------------------------------------------------------------------
+SETTINGS::SETTINGS()
+    : confDir("/etc/stargazer"),
+      scriptsDir("/etc/stargazer"),
+      pidFile("/var/run/stargazer.pid"),
+      monitoring(false),
+      detailStatWritePeriod(dsPeriod_1_6),
+      statWritePeriod(10),
+      stgExecMsgKey(5555),
+      executersNum(1),
+      fullFee(false),
+      dayFee(0),
+      dayResetTraff(0),
+      spreadFee(false),
+      freeMbAllowInet(false),
+      dayFeeIsLastDay(false),
+      writeFreeMbTraffCost(false),
+      showFeeInCash(true),
+      messageTimeout(0),
+      logger(GetStgLogger())
+{
+}
+//-----------------------------------------------------------------------------
+SETTINGS::SETTINGS(const std::string & cd)
+    : confDir(cd),
+      scriptsDir(cd),
+      monitoring(false),
+      detailStatWritePeriod(dsPeriod_1_6),
+      statWritePeriod(10),
+      stgExecMsgKey(5555),
+      executersNum(1),
+      fullFee(false),
+      dayFee(0),
+      dayResetTraff(0),
+      spreadFee(false),
+      freeMbAllowInet(false),
+      dayFeeIsLastDay(false),
+      writeFreeMbTraffCost(false),
+      showFeeInCash(true),
+      messageTimeout(0),
+      logger(GetStgLogger())
+{
+}
+//-----------------------------------------------------------------------------
+SETTINGS::SETTINGS(const SETTINGS & rval)
+    : confDir(rval.confDir),
+      scriptsDir(rval.scriptsDir),
+      pidFile(rval.pidFile),
+      monitoring(rval.monitoring),
+      detailStatWritePeriod(dsPeriod_1_6),
+      statWritePeriod(10),
+      stgExecMsgKey(rval.stgExecMsgKey),
+      executersNum(rval.executersNum),
+      fullFee(rval.fullFee),
+      dayFee(0),
+      dayResetTraff(0),
+      spreadFee(rval.spreadFee),
+      freeMbAllowInet(false),
+      dayFeeIsLastDay(false),
+      writeFreeMbTraffCost(false),
+      showFeeInCash(rval.showFeeInCash),
+      messageTimeout(rval.messageTimeout),
+      logger(GetStgLogger())
+{
+}
+//-----------------------------------------------------------------------------
+SETTINGS::~SETTINGS()
+{
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseYesNo(const string & value, bool * val)
+{
+if (0 == strcasecmp(value.c_str(), "yes"))
+    {
+    *val = true;
+    return 0;
+    }
+if (0 == strcasecmp(value.c_str(), "no"))
+    {
+    *val = false;
+    return 0;
+    }
+
+strError = "Incorrect value \'" + value + "\'.";
+return -1;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseInt(const string & value, int * val)
+{
+if (str2x<int>(value, *val))
+    {
+    strError = "Cannot convert \'" + value + "\' to integer.";
+    return -1;
+    }
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseUnsigned(const string & value, unsigned * val)
+{
+if (str2x<unsigned>(value, *val))
+    {
+    strError = "Cannot convert \'" + value + "\' to unsigned integer.";
+    return -1;
+    }
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseIntInRange(const string & value, int min, int max, int * val)
+{
+if (ParseInt(value, val) != 0)
+    return -1;
+
+if (*val < min || *val > max)
+    {
+    strError = "Value \'" + value + "\' out of range.";
+    return -1;
+    }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseUnsignedInRange(const string & value, unsigned min, unsigned max, unsigned * val)
+{
+if (ParseUnsigned(value, val) != 0)
+    return -1;
+
+if (*val < min || *val > max)
+    {
+    strError = "Value \'" + value + "\' out of range.";
+    return -1;
+    }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseModuleSettings(const DOTCONFDocumentNode * node, vector<PARAM_VALUE> * params)
+{
+const DOTCONFDocumentNode * childNode;
+PARAM_VALUE pv;
+const char * value;
+
+pv.param = node->getName();
+
+if (node->getValue(1))
+    {
+    strError = "Unexpected value \'" + string(node->getValue(1)) + "\'.";
+    return -1;
+    }
+
+value = node->getValue(0);
+
+if (!value)
+    {
+    strError = "Module name expected.";
+    return -1;
+    }
+
+childNode = node->getChildNode();
+while (childNode)
+    {
+    pv.param = childNode->getName();
+    int i = 0;
+    while ((value = childNode->getValue(i++)) != NULL)
+        {
+        pv.value.push_back(value);
+        }
+    params->push_back(pv);
+    pv.value.clear();
+    childNode = childNode->getNextNode();
+    }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
+void SETTINGS::ErrorCallback(void * data, const char * buf)
+{
+    printfd(__FILE__, buf);
+    SETTINGS * settings = static_cast<SETTINGS *>(data);
+    settings->logger(buf);
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ReadSettings()
+{
+const char * requiredOptions[] = {
+    "ModulesPath",
+    "Modules",
+    "StoreModule",
+    "Rules",
+    "LogFile",
+    "DetailStatWritePeriod",
+    "DayFee",
+    "DayResetTraff",
+    "SpreadFee",
+    "FreeMbAllowInet",
+    "DayFeeIsLastDay",
+    "WriteFreeMbTraffCost",
+    NULL
+    };
+int storeModulesCount = 0;
+modulesSettings.clear();
+
+DOTCONFDocument conf(DOTCONFDocument::CASEINSENSITIVE);
+conf.setErrorCallback(SETTINGS::ErrorCallback, this);
+conf.setRequiredOptionNames(requiredOptions);
+string confFile = confDir + "/stargazer.conf";
+
+if(conf.setContent(confFile.c_str()) != 0)
+    {
+    strError = "Cannot read file " + confFile;
+    return -1;
+    }
+
+const DOTCONFDocumentNode * node = conf.getFirstNode();
+
+while (node)
+    {
+    if (strcasecmp(node->getName(), "ScriptDir") == 0)
+        {
+        scriptsDir = node->getValue(0);
+        }
+
+    if (strcasecmp(node->getName(), "LogFile") == 0)
+        {
+        logFile = node->getValue(0);
+        }
+
+    if (strcasecmp(node->getName(), "PIDFile") == 0)
+        {
+        pidFile = node->getValue(0);
+        }
+
+    if (strcasecmp(node->getName(), "ModulesPath") == 0)
+        {
+        modulesPath = node->getValue(0);
+        }
+
+    if (strcasecmp(node->getName(), "Rules") == 0)
+        {
+        rules = node->getValue(0);
+        }
+
+    if (strcasecmp(node->getName(), "DetailStatWritePeriod") == 0)
+        {
+        if (ParseDetailStatWritePeriod(node->getValue(0)) != 0)
+            {
+            strError = "Incorrect DetailStatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "StatWritePeriod") == 0)
+        {
+        if (ParseUnsignedInRange(node->getValue(0), 1, 1440, &statWritePeriod) != 0)
+            {
+            strError = "Incorrect StatWritePeriod value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "ExecMsgKey") == 0)
+        {
+        if (ParseInt(node->getValue(0), &stgExecMsgKey) != 0)
+            {
+            strError = "Incorrect ExecMsgKey value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "ExecutersNum") == 0)
+        {
+        if (ParseUnsignedInRange(node->getValue(0), 1, 1024, &executersNum) != 0)
+            {
+            strError = "Incorrect ExecutersNum value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "DayFee") == 0)
+        {
+        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayFee) != 0)
+            {
+            strError = "Incorrect DayFee value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "FullFee") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &fullFee) != 0)
+            {
+            strError = "Incorrect FullFee value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "DayResetTraff") == 0)
+        {
+        if (ParseUnsignedInRange(node->getValue(0), 0, 31, &dayResetTraff) != 0)
+            {
+            strError = "Incorrect DayResetTraff value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "SpreadFee") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &spreadFee) != 0)
+            {
+            strError = "Incorrect SpreadFee value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "FreeMbAllowInet") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &freeMbAllowInet) != 0)
+            {
+            strError = "Incorrect FreeMbAllowInet value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "DayFeeIsLastDay") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &dayFeeIsLastDay) != 0)
+            {
+            strError = "Incorrect DayFeeIsLastDay value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "WriteFreeMbTraffCost") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &writeFreeMbTraffCost) != 0)
+            {
+            strError = "Incorrect WriteFreeMbTraffCost value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "ShowFeeInCash") == 0)
+        {
+        if (ParseYesNo(node->getValue(0), &showFeeInCash) != 0)
+            {
+            strError = "Incorrect ShowFeeInCash value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "MonitorDir") == 0)
+        {
+        monitorDir = node->getValue(0);
+        struct stat stat;
+        monitoring = false;
+
+        if (!lstat(monitorDir.c_str(), &stat) && S_ISDIR(stat.st_mode))
+            {
+            monitoring = true;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "MessageTimeout") == 0)
+        {
+        if (ParseUnsigned(node->getValue(0), &messageTimeout) != 0)
+            {
+            strError = "Incorrect MessageTimeout value: \'" + string(node->getValue(0)) + "\'";
+            return -1;
+            }
+        }
+
+    if (strcasecmp(node->getName(), "DirNames") == 0)
+        {
+        const DOTCONFDocumentNode * child = node->getChildNode();
+        if (child)
+            {
+            const DOTCONFDocumentNode * dirNameNode;
+            for (int i = 0; i < DIR_NUM; i++)
+                {
+                char strDirName[12];
+                sprintf(strDirName, "DirName%d", i);
+                dirNameNode = conf.findNode(strDirName, node);
+                if (dirNameNode && dirNameNode->getValue(0))
+                    {
+                    dirName[i] = dirNameNode->getValue(0);
+                    }
+                }
+            }
+        }
+
+    if (strcasecmp(node->getName(), "StoreModule") == 0)
+        {
+        if (node->getValue(1))
+            {
+            strError = "Unexpected \'" + string(node->getValue(1)) + "\'.";
+            return -1;
+            }
+
+        if (storeModulesCount)
+            {
+            strError = "Should be only one StoreModule.";
+            return -1;
+            }
+        storeModulesCount++;
+
+        storeModuleSettings.moduleName = node->getValue(0);
+        ParseModuleSettings(node, &storeModuleSettings.moduleParams);
+        }
+
+    if (strcasecmp(node->getName(), "Modules") == 0)
+        {
+        if (node->getValue(0))
+            {
+            strError = "Unexpected \'" + string(node->getValue(0)) + "\'.";
+            return -1;
+            }
+        const DOTCONFDocumentNode * child = node->getChildNode();
+        while (child)
+            {
+            if (strcasecmp(child->getName(), "Module") != 0)
+                {
+                child = child->getNextNode();
+                continue;
+                }
+            MODULE_SETTINGS modSettings;
+            modSettings.moduleParams.clear();
+            modSettings.moduleName = child->getValue();
+
+            ParseModuleSettings(child, &modSettings.moduleParams);
+
+            modulesSettings.push_back(modSettings);
+
+            child = child->getNextNode();
+            }
+        }
+
+    node = node->getNextNode();
+    }
+
+return 0;
+}
+//-----------------------------------------------------------------------------
+int SETTINGS::ParseDetailStatWritePeriod(const string & detailStatPeriodStr)
+{
+if (detailStatPeriodStr == "1")
+    {
+    detailStatWritePeriod = dsPeriod_1;
+    return 0;
+    }
+else if (detailStatPeriodStr == "1/2")
+    {
+    detailStatWritePeriod = dsPeriod_1_2;
+    return 0;
+    }
+else if (detailStatPeriodStr == "1/4")
+    {
+    detailStatWritePeriod = dsPeriod_1_4;
+    return 0;
+    }
+else if (detailStatPeriodStr == "1/6")
+    {
+    detailStatWritePeriod = dsPeriod_1_6;
+    return 0;
+    }
+
+return -1;
+}
+//-----------------------------------------------------------------------------
diff --git a/projects/stargazer/settings_impl.h b/projects/stargazer/settings_impl.h
new file mode 100644 (file)
index 0000000..8626280
--- /dev/null
@@ -0,0 +1,145 @@
+ /*
+ $Revision: 1.27 $
+ $Date: 2010/08/19 13:42:30 $
+ $Author: faust $
+ */
+
+/*
+ *    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
+ */
+
+/*
+ *    Date: 27.10.2002
+ */
+
+/*
+ *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
+ */
+
+ /*
+ $Revision: 1.27 $
+ $Date: 2010/08/19 13:42:30 $
+ */
+
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <string>
+#include <vector>
+
+#include "common.h"
+#include "stg_logger.h"
+#include "module_settings.h"
+
+//-----------------------------------------------------------------------------
+enum DETAIL_STAT_PERIOD {
+dsPeriod_1,
+dsPeriod_1_2,
+dsPeriod_1_4,
+dsPeriod_1_6,
+};
+//-----------------------------------------------------------------------------
+class STG_LOGGER;
+class DOTCONFDocumentNode;
+//-----------------------------------------------------------------------------
+class SETTINGS {
+public:
+    SETTINGS();
+    SETTINGS(const std::string &);
+    SETTINGS(const SETTINGS &);
+    virtual ~SETTINGS();
+    int Reload() { return ReadSettings(); }
+    int ReadSettings();
+
+    std::string GetStrError() const { return strError; }
+
+    int                 GetExecMsgKey() const { return stgExecMsgKey; }
+    unsigned            GetExecutersNum() const { return executersNum; }
+    const std::string & GetDirName(int num) const { return dirName[num]; };
+    const std::string & GetConfDir() const { return confDir; }
+    const std::string & GetScriptsDir() const { return scriptsDir; }
+    const std::string & GetRulesFileName() const { return rules; }
+    const std::string & GetLogFileName() const { return logFile; }
+    const std::string & GetPIDFileName() const { return pidFile; }
+    unsigned            GetDetailStatWritePeriod() const 
+        { return detailStatWritePeriod; };
+    unsigned            GetStatWritePeriod() const { return statWritePeriod * 60; }
+    unsigned            GetDayFee() const { return dayFee; }
+    bool                GetFullFee() const { return fullFee; }
+    unsigned            GetDayResetTraff() const { return dayResetTraff; }
+    bool                GetSpreadFee() const { return spreadFee; }
+    bool                GetFreeMbAllowInet() const { return freeMbAllowInet; }
+    bool                GetDayFeeIsLastDay() const { return dayFeeIsLastDay; }
+    bool                GetWriteFreeMbTraffCost() const
+        { return writeFreeMbTraffCost; };
+    bool                GetShowFeeInCash() const { return showFeeInCash; }
+    const std::string & GetMonitorDir() const { return monitorDir; }
+    bool                GetMonitoring() const { return monitoring; }
+    unsigned            GetMessageTimeout() const { return messageTimeout * 3600 * 24; }
+
+    const std::string & GetModulesPath() const { return modulesPath; }
+    const MODULE_SETTINGS & GetStoreModuleSettings() const
+        { return storeModuleSettings; }
+    const std::vector<MODULE_SETTINGS> & GetModulesSettings() const
+        { return modulesSettings; }
+
+private:
+
+    int ParseInt(const std::string & value, int * val);
+    int ParseUnsigned(const std::string & value, unsigned * val);
+    int ParseIntInRange(const std::string & value, int min, int max, int * val);
+    int ParseUnsignedInRange(const std::string & value, unsigned min, unsigned max, unsigned * val);
+    int ParseYesNo(const std::string & value, bool * val);
+    int ParseDetailStatWritePeriod(const std::string & detailStatPeriodStr);
+
+    int ParseModuleSettings(const DOTCONFDocumentNode * dirNameNode, std::vector<PARAM_VALUE> * params);
+
+    static void ErrorCallback(void * data, const char * buf);
+
+    std::string strError;
+
+    //////////settings
+    std::string modulesPath;
+    std::string dirName[DIR_NUM];
+    std::string confDir;
+    std::string        scriptsDir;
+    std::string rules;
+    std::string logFile;
+    std::string pidFile;
+    std::string monitorDir;
+    bool        monitoring;
+    unsigned    detailStatWritePeriod;
+    unsigned    statWritePeriod;
+    int         stgExecMsgKey;
+    unsigned    executersNum;
+    bool        fullFee;
+    unsigned    dayFee;
+    unsigned    dayResetTraff;
+    bool        spreadFee;
+    bool        freeMbAllowInet;
+    bool        dayFeeIsLastDay;
+    bool        writeFreeMbTraffCost;
+    bool        showFeeInCash;
+    unsigned    messageTimeout;
+
+    std::vector<MODULE_SETTINGS> modulesSettings;
+    MODULE_SETTINGS storeModuleSettings;
+
+    STG_LOGGER & logger;
+};
+//-----------------------------------------------------------------------------
+
+#endif