{
public:
virtual ~BASE_PROPERTY_PARSER() {}
- virtual bool Parse(const char ** attr, const std::string & attrName) = 0;
+ virtual bool Parse(const char ** attr, const std::string & attrName, const std::string & fromEncoding) = 0;
};
template <typename T>
public:
typedef bool (* FUNC)(const char **, T &, const std::string &);
PROPERTY_PARSER(T & v, FUNC f) : value(v), func(f) {}
- virtual bool Parse(const char ** attr, const std::string & attrName) { return func(attr, value, attrName); }
+ PROPERTY_PARSER(T & v, FUNC f, const std::string & e) : value(v), func(f), encoding(e) {}
+ virtual bool Parse(const char ** attr, const std::string & attrName, const std::string & /*fromEncoding*/) { return func(attr, value, attrName); }
private:
T & value;
FUNC func;
+ std::string encoding;
};
+template <>
+inline
+bool PROPERTY_PARSER<std::string>::Parse(const char ** attr, const std::string & attrName, const std::string & fromEncoding)
+{
+if (!encoding.empty() && !fromEncoding.empty())
+ {
+ std::string tmp;
+ if (!func(attr, value, attrName))
+ return false;
+ value = IconvString(tmp, fromEncoding, encoding);
+ return true;
+ }
+else
+ return func(attr, value, attrName);
+}
+
typedef std::map<std::string, BASE_PROPERTY_PARSER *> PROPERTY_PARSERS;
bool CheckValue(const char ** attr, const std::string & attrName);
bool GetIPValue(const char ** attr, uint32_t& value, const std::string & attrName);
template <typename T>
-void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func = GetValue<T>);
+inline
+void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func = GetValue<T>)
+{
+ parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER<T>(value, func)));
+}
template <typename T>
inline
-void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func)
+void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const std::string & toEncoding, const typename PROPERTY_PARSER<T>::FUNC & func = GetValue<T>)
{
- parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER<T>(value, func)));
+ parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER<T>(value, func, toEncoding)));
}
-bool TryParse(PROPERTY_PARSERS & parsers, const std::string & name, const char ** attr, const std::string & attrName = "value");
+bool TryParse(PROPERTY_PARSERS & parsers, const std::string & name, const char ** attr, const std::string & fromEncoding, const std::string & attrName = "value");
} // namespace STG
template <class P, typename C>
int Exec(const std::string & request, C callback, void * data)
{
- P cp(callback, data);
+ P cp(callback, data, encoding);
return ExecImpl(request, cp);
}
template <class P, typename C>
int Exec(const std::string & tag, const std::string & request, C callback, void * data)
{
- P cp(tag, callback, data);
+ P cp(tag, callback, data, encoding);
return ExecImpl(request, cp);
}
private:
NETTRANSACT nt;
+ std::string encoding;
std::string errorMsg;
XML_Parser parser;
int SERVCONF::ChgAdmin(const ADMIN_CONF_RES & conf, SIMPLE::CALLBACK f, void * data)
{
-return pImpl->Exec<SIMPLE::PARSER>("ChgAdmin", "<ChgAdmin" + CHG_ADMIN::Serialize(conf) + "/>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("ChgAdmin", "<ChgAdmin" + CHG_ADMIN::Serialize(conf, encoding) + "/>", f, data);
}
int SERVCONF::AddAdmin(const std::string & login,
int res = pImpl->Exec<SIMPLE::PARSER>("AddAdmin", "<AddAdmin login=\"" + login + "\"/>", f, data);
if (res != st_ok)
return res;
-return pImpl->Exec<SIMPLE::PARSER>("ChgAdmin", "<ChgAdmin" + CHG_ADMIN::Serialize(conf) + "/>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("ChgAdmin", "<ChgAdmin" + CHG_ADMIN::Serialize(conf, encoding) + "/>", f, data);
}
int SERVCONF::DelAdmin(const std::string & login, SIMPLE::CALLBACK f, void * data)
int SERVCONF::ChgTariff(const TARIFF_DATA_RES & tariffData, SIMPLE::CALLBACK f, void * data)
{
-return pImpl->Exec<SIMPLE::PARSER>("SetTariff", "<SetTariff name=\"" + tariffData.tariffConf.name.data() + "\">" + CHG_TARIFF::Serialize(tariffData) + "</SetTariff>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetTariff", "<SetTariff name=\"" + tariffData.tariffConf.name.data() + "\">" + CHG_TARIFF::Serialize(tariffData, encoding) + "</SetTariff>", f, data);
}
int SERVCONF::AddTariff(const std::string & name,
int res = pImpl->Exec<SIMPLE::PARSER>("AddTariff", "<AddTariff name=\"" + name + "\"/>", f, data);
if (res != st_ok)
return res;
-return pImpl->Exec<SIMPLE::PARSER>("SetTariff", "<SetTariff name=\"" + name + "\">" + CHG_TARIFF::Serialize(tariffData) + "</SetTariff>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetTariff", "<SetTariff name=\"" + name + "\">" + CHG_TARIFF::Serialize(tariffData, encoding) + "</SetTariff>", f, data);
}
int SERVCONF::DelTariff(const std::string & name, SIMPLE::CALLBACK f, void * data)
const USER_STAT_RES & stat,
SIMPLE::CALLBACK f, void * data)
{
-return pImpl->Exec<CHG_USER::PARSER>("<SetUser><Login value=\"" + login + "\"/>" + CHG_USER::Serialize(conf, stat) + "</SetUser>", f, data);
+return pImpl->Exec<CHG_USER::PARSER>("<SetUser><Login value=\"" + login + "\"/>" + CHG_USER::Serialize(conf, stat, encoding) + "</SetUser>", f, data);
}
int SERVCONF::DelUser(const std::string & login, SIMPLE::CALLBACK f, void * data)
int res = pImpl->Exec<SIMPLE::PARSER>("AddUser", "<AddUser><Login value=\"" + login + "\"/></AddUser>", f, data);
if (res != st_ok)
return res;
-return pImpl->Exec<CHG_USER::PARSER>("<SetUser><Login value=\"" + login + "\"/>" + CHG_USER::Serialize(conf, stat) + "</SetUser>", f, data);
+return pImpl->Exec<CHG_USER::PARSER>("<SetUser><Login value=\"" + login + "\"/>" + CHG_USER::Serialize(conf, stat, encoding) + "</SetUser>", f, data);
}
int SERVCONF::AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data)
int SERVCONF::ChgService(const SERVICE_CONF_RES & conf, SIMPLE::CALLBACK f, void * data)
{
-return pImpl->Exec<SIMPLE::PARSER>("SetService", "<SetService name=\"" + conf.name.data() + "\">" + CHG_SERVICE::Serialize(conf) + "</SetService>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetService", "<SetService name=\"" + conf.name.data() + "\">" + CHG_SERVICE::Serialize(conf, encoding) + "</SetService>", f, data);
}
int SERVCONF::AddService(const std::string & name,
int res = pImpl->Exec<SIMPLE::PARSER>("AddService", "<AddService name=\"" + name + "\"/>", f, data);
if (res != st_ok)
return res;
-return pImpl->Exec<SIMPLE::PARSER>("SetService", "<SetService name=\"" + name + "\">" + CHG_SERVICE::Serialize(conf) + "</SetService>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetService", "<SetService name=\"" + name + "\">" + CHG_SERVICE::Serialize(conf, encoding) + "</SetService>", f, data);
}
int SERVCONF::DelService(const std::string & name, SIMPLE::CALLBACK f, void * data)
int SERVCONF::ChgCorp(const CORP_CONF_RES & conf, SIMPLE::CALLBACK f, void * data)
{
-return pImpl->Exec<SIMPLE::PARSER>("SetCorp", "<SetCorp name=\"" + conf.name.data() + "\">" + CHG_CORP::Serialize(conf) + "</SetCorp>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetCorp", "<SetCorp name=\"" + conf.name.data() + "\">" + CHG_CORP::Serialize(conf, encoding) + "</SetCorp>", f, data);
}
int SERVCONF::AddCorp(const std::string & name,
int res = pImpl->Exec<SIMPLE::PARSER>("AddCorp", "<AddCorp name=\"" + name + "\"/>", f, data);
if (res != st_ok)
return res;
-return pImpl->Exec<SIMPLE::PARSER>("SetCorp", "<SetCorp name=\"" + name + "\">" + CHG_CORP::Serialize(conf) + "</SetCorp>", f, data);
+return pImpl->Exec<SIMPLE::PARSER>("SetCorp", "<SetCorp name=\"" + name + "\">" + CHG_CORP::Serialize(conf, encoding) + "</SetCorp>", f, data);
}
int SERVCONF::DelCorp(const std::string & name, SIMPLE::CALLBACK f, void * data)
const std::string & login, const std::string & password)
: nt(server, port, login, password)
{
+setlocale(LC_ALL, "");
+encoding = nl_langinfo(CODESET);
parser = XML_ParserCreate(NULL);
}
//-----------------------------------------------------------------------------
const std::string & login, const std::string & password)
: nt(server, port, localAddress, localPort, login, password)
{
+setlocale(LC_ALL, "");
+encoding = nl_langinfo(CODESET);
parser = XML_ParserCreate(NULL);
}
//-----------------------------------------------------------------------------