]> git.stg.codes - stg.git/commitdiff
Simplified parser interfaces.
authorMaxim Mamontov <faust.madf@gmail.com>
Mon, 7 Oct 2013 21:21:37 +0000 (00:21 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Mon, 7 Oct 2013 21:21:37 +0000 (00:21 +0300)
18 files changed:
include/stg/admin_conf.h
stglibs/srvconf.lib/include/stg/servconf.h
stglibs/srvconf.lib/include/stg/servconf_types.h
stglibs/srvconf.lib/parsers/auth_by.cpp
stglibs/srvconf.lib/parsers/auth_by.h
stglibs/srvconf.lib/parsers/check_user.cpp
stglibs/srvconf.lib/parsers/check_user.h
stglibs/srvconf.lib/parsers/chg_user.cpp
stglibs/srvconf.lib/parsers/chg_user.h
stglibs/srvconf.lib/parsers/get_user.cpp
stglibs/srvconf.lib/parsers/get_user.h
stglibs/srvconf.lib/parsers/get_users.cpp
stglibs/srvconf.lib/parsers/get_users.h
stglibs/srvconf.lib/parsers/send_message.cpp
stglibs/srvconf.lib/parsers/send_message.h
stglibs/srvconf.lib/parsers/server_info.cpp
stglibs/srvconf.lib/parsers/server_info.h
stglibs/srvconf.lib/servconf.cpp

index df6d9e22456f0f633a804c1311cf25fa7d7dff90..d906a6540217acd1de25397596bd45c2d0cc9f21 100644 (file)
@@ -7,9 +7,10 @@
 #ifndef ADMIN_CONF_H
 #define ADMIN_CONF_H
 
 #ifndef ADMIN_CONF_H
 #define ADMIN_CONF_H
 
-#include <string>
-
 #include "os_int.h"
 #include "os_int.h"
+#include "resetable.h"
+
+#include <string>
 
 #define ADM_LOGIN_LEN   (32)
 #define ADM_PASSWD_LEN  (32)
 
 #define ADM_LOGIN_LEN   (32)
 #define ADM_PASSWD_LEN  (32)
@@ -75,6 +76,25 @@ struct ADMIN_CONF
     std::string   password;
 };
 //-----------------------------------------------------------------------------
     std::string   password;
 };
 //-----------------------------------------------------------------------------
+struct ADMIN_CONF_RES
+{
+    ADMIN_CONF_RES()
+    {}
+    ADMIN_CONF_RES(const ADMIN_CONF_RES & rhs)
+        : priv(rhs.priv),
+          login(rhs.login),
+          password(rhs.password)
+    {}
+    ADMIN_CONF_RES & operator=(const ADMIN_CONF_RES & rhs)
+    {
+        priv = rhs.priv;
+        login = rhs.login;
+        password = rhs.password;
+    }
+    RESETABLE<PRIV> priv;
+    RESETABLE<std::string> login;
+    RESETABLE<std::string> password;
+};
 
 #include "admin_conf.inc.h"
 
 
 #include "admin_conf.inc.h"
 
index e1bb9fb1e1f6162e0df18f7fc6c44923115a296b..0f5292d92d0fe129cef3bbc61200f87c4408a7b6 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "stg/servconf_types.h"
 
 
 #include "stg/servconf_types.h"
 
+#include "stg/admin_conf.h"
 #include "stg/os_int.h"
 
 #include <string>
 #include "stg/os_int.h"
 
 #include <string>
@@ -45,9 +46,11 @@ public:
 
     int ServerInfo(SERVER_INFO::CALLBACK f, void * data);
 
 
     int ServerInfo(SERVER_INFO::CALLBACK f, void * data);
 
-    /*int GetAdmins(GET_ADMINS::CALLBACK f, void * data);
+    int GetAdmins(GET_ADMINS::CALLBACK f, void * data);
     int GetAdmin(const std::string & login, GET_ADMIN::CALLBACK f, void * data);
     int GetAdmin(const std::string & login, GET_ADMIN::CALLBACK f, void * data);
-    int ChgAdmin(const std::string & request, CHG_ADMIN::CALLBACK f, void * data);*/
+    int ChgAdmin(const std::string & login, const ADMIN_CONF_RES & conf, CHG_ADMIN::CALLBACK f, void * data);
+    int AddAdmin(const std::string & login, const ADMIN_CONF & conf, GET_ADMIN::CALLBACK f, void * data);
+    int DelAdmin(const std::string & login, DEL_ADMIN::CALLBACK f, void * data);
 
     int GetUsers(GET_USERS::CALLBACK f, void * data);
     int GetUser(const std::string & login, GET_USER::CALLBACK f, void * data);
 
     int GetUsers(GET_USERS::CALLBACK f, void * data);
     int GetUser(const std::string & login, GET_USER::CALLBACK f, void * data);
index 1af9d5abf1d27a60722844b4a9d3e0c3b828155e..09f9b9702eb6419441114e49deb411ab0fcef8c8 100644 (file)
@@ -38,6 +38,8 @@
 
 #define  ENC_MSG_LEN    (8)
 
 
 #define  ENC_MSG_LEN    (8)
 
+struct ADMIN_CONF;
+
 namespace STG
 {
 
 namespace STG
 {
 
@@ -65,6 +67,8 @@ confLoginCipher,
 confData
 };
 
 confData
 };
 
+typedef void (* SIMPLE_CALLBACK)(bool result, const std::string & reason, void * data);
+
 namespace AUTH_BY
 {
 
 namespace AUTH_BY
 {
 
@@ -93,7 +97,7 @@ typedef void (* CALLBACK)(bool result, const std::string & reason, const INFO &
 namespace CHECK_USER
 {
 
 namespace CHECK_USER
 {
 
-typedef int (* CALLBACK)(bool result, const std::string & reason, void * data);
+typedef SIMPLE_CALLBACK CALLBACK;
 
 } // namespace CHECK_USER
 
 
 } // namespace CHECK_USER
 
@@ -151,14 +155,51 @@ typedef void (* CALLBACK)(bool result, const std::string & reason, const INFO &
 namespace CHG_USER
 {
 
 namespace CHG_USER
 {
 
-typedef void (* CALLBACK)(bool result, const std::string & reason, void * data);
+typedef SIMPLE_CALLBACK CALLBACK;
 
 }
 
 namespace SEND_MESSAGE
 {
 
 
 }
 
 namespace SEND_MESSAGE
 {
 
-typedef void (* CALLBACK)(bool result, const std::string & reason, void * data);
+typedef SIMPLE_CALLBACK CALLBACK;
+
+}
+
+namespace GET_ADMIN
+{
+
+typedef ADMIN_CONF INFO;
+typedef void (* CALLBACK)(bool result, const std::string & reason, const INFO & info, void * data);
+
+}
+
+namespace GET_ADMINS
+{
+
+typedef std::vector<GET_ADMIN::INFO> INFO;
+typedef void (* CALLBACK)(bool result, const std::string & reason, const INFO & info, void * data);
+
+}
+
+namespace ADD_ADMIN
+{
+
+typedef SIMPLE_CALLBACK CALLBACK;
+
+}
+
+namespace DEL_ADMIN
+{
+
+typedef SIMPLE_CALLBACK CALLBACK;
+
+}
+
+namespace CHG_ADMIN
+{
+
+typedef SIMPLE_CALLBACK CALLBACK;
 
 }
 
 
 }
 
index 99e3c0214c522e09d3a36806ab958823f5145168..61f590bfcc927d3deb62534ee5908161753b17bd 100644 (file)
 
 #include "auth_by.h"
 
 
 #include "auth_by.h"
 
-#include <cstddef>
-
 #include <strings.h> // strcasecmp
 
 using namespace STG;
 
 #include <strings.h> // strcasecmp
 
 using namespace STG;
 
-AUTH_BY::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+AUTH_BY::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0),
       parsingAnswer(false)
 {
       depth(0),
       parsingAnswer(false)
 {
@@ -79,9 +77,3 @@ if (depth == 0)
     error.clear();
     }
 }
     error.clear();
     }
 }
-//-----------------------------------------------------------------------------
-void AUTH_BY::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index a4bab9dd508999ba369689d8df9675fb8dcf965e..f285d2bfb1039f5c11bd5c4b849bbf8c2bbd19ae 100644 (file)
@@ -35,10 +35,9 @@ namespace AUTH_BY
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     CALLBACK callback;
 
 private:
     CALLBACK callback;
index 8bf81e242d93d2aba6656a0706043650400c1696..5f1312924c4c025c25e50fd30148e9ff94fa0558 100644 (file)
 
 #include "check_user.h"
 
 
 #include "check_user.h"
 
-#include <cstddef>
-
 #include <strings.h>
 
 using namespace STG;
 
 #include <strings.h>
 
 using namespace STG;
 
-CHECK_USER::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+CHECK_USER::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0)
 {
 }
       depth(0)
 {
 }
@@ -57,9 +55,3 @@ if (attr && attr[0] && attr[1] && strcasecmp(attr[0], "value") == 0)
 else
     callback(false, "Invalid response.", data);
 }
 else
     callback(false, "Invalid response.", data);
 }
-//-----------------------------------------------------------------------------
-void CHECK_USER::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index 25740f02abee301f00842944d30a4e7ddda72cff..71dfec134088c5f462e1dc5ce07f86153953c77f 100644 (file)
@@ -34,10 +34,9 @@ namespace CHECK_USER
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     CALLBACK callback;
 
 private:
     CALLBACK callback;
index a7d3592556f197de0c0967ee97d5582ee4dddcb9..f05c21fdb385d59407f4ce428f439ccdd728f2c0 100644 (file)
 
 #include "chg_user.h"
 
 
 #include "chg_user.h"
 
-#include <cstddef>
-
 #include <strings.h>
 
 using namespace STG;
 
 #include <strings.h>
 
 using namespace STG;
 
-CHG_USER::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+CHG_USER::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0)
 {
 }
       depth(0)
 {
 }
@@ -63,9 +61,3 @@ if (attr && attr[0] && attr[1])
 else
     callback(false, "Invalid response.", data);
 }
 else
     callback(false, "Invalid response.", data);
 }
-//-----------------------------------------------------------------------------
-void CHG_USER::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index 424866bcf06354740a024aec1a3ee4a0019d16c4..c3ec1888118f9f5ffb62a90adebb4fb0e99d3bed 100644 (file)
@@ -34,10 +34,9 @@ namespace CHG_USER
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     CALLBACK callback;
 
 private:
     CALLBACK callback;
index 71e6cba6850a1f7e1dd000825dd740611c872931..e1f06e8b378a40d714e5b7beac638d628618032e 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <map>
 #include <utility>
 
 #include <map>
 #include <utility>
-#include <cstddef>
 
 #include <strings.h>
 
 
 #include <strings.h>
 
@@ -61,9 +60,9 @@ return true;
 
 }
 
 
 }
 
-GET_USER::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+GET_USER::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0),
       parsingAnswer(false)
 {
       depth(0),
       parsingAnswer(false)
 {
@@ -149,9 +148,3 @@ void GET_USER::PARSER::ParseUserParams(const char * el, const char ** attr)
 if (!TryParse(propertyParsers, ToLower(el), attr))
     error = "Invalid parameter.";
 }
 if (!TryParse(propertyParsers, ToLower(el), attr))
     error = "Invalid parameter.";
 }
-//-----------------------------------------------------------------------------
-void GET_USER::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index 190b5784146a5cbd76cff2c2707ba4808d15715f..12050752d403a4673c9a8d534189f53e12b33366 100644 (file)
@@ -37,11 +37,10 @@ namespace GET_USER
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     virtual ~PARSER();
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     virtual ~PARSER();
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     PROPERTY_PARSERS propertyParsers;
 
 private:
     PROPERTY_PARSERS propertyParsers;
index cf62f3579c4b531ef95722c6370f0aa02c8dc84e..6c385b0c5babfbb9463e3a0826ca18f91bd957bc 100644 (file)
 
 #include "get_users.h"
 
 
 #include "get_users.h"
 
-#include <cstddef>
-
 #include <strings.h>
 
 using namespace STG;
 
 #include <strings.h>
 
 using namespace STG;
 
-GET_USERS::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+GET_USERS::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
+      userParser(&GET_USERS::PARSER::UserCallback, this),
       depth(0),
       parsingAnswer(false)
 {
       depth(0),
       parsingAnswer(false)
 {
-    userParser.SetCallback(&GET_USERS::PARSER::UserCallback, this);
 }
 //-----------------------------------------------------------------------------
 int GET_USERS::PARSER::ParseStart(const char * el, const char ** attr)
 }
 //-----------------------------------------------------------------------------
 int GET_USERS::PARSER::ParseStart(const char * el, const char ** attr)
@@ -69,12 +67,6 @@ void GET_USERS::PARSER::AddUser(const GET_USER::INFO & userInfo)
 info.push_back(userInfo);
 }
 //-----------------------------------------------------------------------------
 info.push_back(userInfo);
 }
 //-----------------------------------------------------------------------------
-void GET_USERS::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
-//-----------------------------------------------------------------------------
 void GET_USERS::PARSER::UserCallback(bool result, const std::string & error, const GET_USER::INFO & info, void * data)
 {
     GET_USERS::PARSER * parser = static_cast<GET_USERS::PARSER *>(data);
 void GET_USERS::PARSER::UserCallback(bool result, const std::string & error, const GET_USER::INFO & info, void * data)
 {
     GET_USERS::PARSER * parser = static_cast<GET_USERS::PARSER *>(data);
index ac648a270aa86c2e0ef4f091598f4fca0d645eac..c2b8622165a29a3e7d83dd00bec21dcb6d90c1ee 100644 (file)
@@ -38,10 +38,9 @@ namespace GET_USERS
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     CALLBACK callback;
 
 private:
     CALLBACK callback;
index c3a91789058ffcd4a9ddae2bd6b08ba37b1215c4..053583f4cc3fb9205b01c54b8983f8921ec4eccf 100644 (file)
 
 #include "send_message.h"
 
 
 #include "send_message.h"
 
-#include <cstddef>
-
 #include <strings.h>
 
 using namespace STG;
 
 #include <strings.h>
 
 using namespace STG;
 
-SEND_MESSAGE::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+SEND_MESSAGE::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0)
 {
 }
       depth(0)
 {
 }
@@ -57,9 +55,3 @@ if (attr && attr[0] && attr[1])
 else
     callback(false, "Invalid response.", data);
 }
 else
     callback(false, "Invalid response.", data);
 }
-//-----------------------------------------------------------------------------
-void SEND_MESSAGE::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index 7e4ded2205a5e3b09e86745a74945b9bc1be9fd0..13132a0d3fc6e914c0e379efe43765af783a34a0 100644 (file)
@@ -34,10 +34,9 @@ namespace SEND_MESSAGE
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     CALLBACK callback;
 
 private:
     CALLBACK callback;
index 1b63785817e1dde8081ec06059c6f6aeadda218e..da6b85e0c0521614c39836b80749523e7d6a9955 100644 (file)
@@ -24,7 +24,6 @@
 #include "stg/common.h"
 
 #include <cstdio> // sprintf
 #include "stg/common.h"
 
 #include <cstdio> // sprintf
-#include <cstddef>
 
 #include <strings.h>
 
 
 #include <strings.h>
 
@@ -39,9 +38,9 @@ const size_t DIRNAME_LEN  = 16;
 
 }
 
 
 }
 
-SERVER_INFO::PARSER::PARSER()
-    : callback(NULL),
-      data(NULL),
+SERVER_INFO::PARSER::PARSER(CALLBACK f, void * d)
+    : callback(f),
+      data(d),
       depth(0),
       parsingAnswer(false)
 {
       depth(0),
       parsingAnswer(false)
 {
@@ -80,9 +79,3 @@ if (depth == 0 && parsingAnswer)
     parsingAnswer = false;
     }
 }
     parsingAnswer = false;
     }
 }
-//-----------------------------------------------------------------------------
-void SERVER_INFO::PARSER::SetCallback(CALLBACK f, void * d)
-{
-callback = f;
-data = d;
-}
index 7bcbbba471042e62ade5381c9673691cbc8ede26..7f5b8e9b978e6b9584630f41e90541ad48ed3ed9 100644 (file)
@@ -37,10 +37,9 @@ namespace SERVER_INFO
 class PARSER: public STG::PARSER
 {
 public:
 class PARSER: public STG::PARSER
 {
 public:
-    PARSER();
+    PARSER(CALLBACK f, void * data);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
     int  ParseStart(const char * el, const char ** attr);
     void ParseEnd(const char * el);
-    void SetCallback(CALLBACK f, void * data);
 
 private:
     PROPERTY_PARSERS propertyParsers;
 
 private:
     PROPERTY_PARSERS propertyParsers;
index 325ee5f2a106b43870db21c62c346ae5cad11b05..8b4e259b9d096c3fa745db0710e1c0ecbfb691e2 100644 (file)
@@ -45,12 +45,19 @@ public:
     IMPL(const std::string & server, uint16_t port,
          const std::string & login, const std::string & password);
 
     IMPL(const std::string & server, uint16_t port,
          const std::string & login, const std::string & password);
 
+    int ServerInfo(SERVER_INFO::CALLBACK f, void * data);
+
+    int GetAdmins(GET_ADMINS::CALLBACK f, void * data);
+    int GetAdmin(const std::string & login, GET_ADMIN::CALLBACK f, void * data);
+    int ChgAdmin(const std::string & login, const ADMIN_CONF_RES & conf, CHG_ADMIN::CALLBACK f, void * data);
+    int AddAdmin(const std::string & login, const ADMIN_CONF & conf, GET_ADMIN::CALLBACK f, void * data);
+    int DelAdmin(const std::string & login, DEL_ADMIN::CALLBACK f, void * data);
+
     int GetUsers(GET_USERS::CALLBACK f, void * data);
     int GetUser(const std::string & login, GET_USER::CALLBACK f, void * data);
     int ChgUser(const std::string & request, CHG_USER::CALLBACK f, void * data);
     int AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data);
     int SendMessage(const std::string & request, SEND_MESSAGE::CALLBACK f, void * data);
     int GetUsers(GET_USERS::CALLBACK f, void * data);
     int GetUser(const std::string & login, GET_USER::CALLBACK f, void * data);
     int ChgUser(const std::string & request, CHG_USER::CALLBACK f, void * data);
     int AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data);
     int SendMessage(const std::string & request, SEND_MESSAGE::CALLBACK f, void * data);
-    int ServerInfo(SERVER_INFO::CALLBACK f, void * data);
     int CheckUser(const std::string & login, const std::string & password, CHECK_USER::CALLBACK f, void * data);
 
     const std::string & GetStrError() const;
     int CheckUser(const std::string & login, const std::string & password, CHECK_USER::CALLBACK f, void * data);
 
     const std::string & GetStrError() const;
@@ -58,14 +65,6 @@ public:
     static void End(void * data, const char * el);
 
 private:
     static void End(void * data, const char * el);
 
 private:
-    GET_USERS::PARSER parserGetUsers;
-    GET_USER::PARSER parserGetUser;
-    AUTH_BY::PARSER parserAuthBy;
-    SERVER_INFO::PARSER  parserServerInfo;
-    CHG_USER::PARSER parserChgUser;
-    CHECK_USER::PARSER parserCheckUser;
-    SEND_MESSAGE::PARSER parserSendMessage;
-
     NETTRANSACT nt;
 
     std::string errorMsg;
     NETTRANSACT nt;
 
     std::string errorMsg;
@@ -154,44 +153,44 @@ nt.SetRxCallback(this, AnsRecv);
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::GetUser(const std::string & login, GET_USER::CALLBACK f, void * data)
 {
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::GetUser(const std::string & login, GET_USER::CALLBACK f, void * data)
 {
-parserGetUser.SetCallback(f, data);
-return Exec("<GetUser login=\"" + login + "\"/>", parserGetUser);
+GET_USER::PARSER parser(f, data);
+return Exec("<GetUser login=\"" + login + "\"/>", parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data)
 {
-parserAuthBy.SetCallback(f, data);
-return Exec("<GetUserAuthBy login=\"" + login + "\"/>", parserAuthBy);
+AUTH_BY::PARSER parser(f, data);
+return Exec("<GetUserAuthBy login=\"" + login + "\"/>", parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::GetUsers(GET_USERS::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::GetUsers(GET_USERS::CALLBACK f, void * data)
 {
-parserGetUsers.SetCallback(f, data);
-return Exec("<GetUsers/>", parserGetUsers);
+GET_USERS::PARSER parser(f, data);
+return Exec("<GetUsers/>", parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::ServerInfo(SERVER_INFO::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::ServerInfo(SERVER_INFO::CALLBACK f, void * data)
 {
-parserServerInfo.SetCallback(f, data);
-return Exec("<GetServerInfo/>", parserServerInfo);
+SERVER_INFO::PARSER parser(f, data);
+return Exec("<GetServerInfo/>", parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::ChgUser(const std::string & request, CHG_USER::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::ChgUser(const std::string & request, CHG_USER::CALLBACK f, void * data)
 {
-parserChgUser.SetCallback(f, data);
-return Exec(request, parserChgUser);
+CHG_USER::PARSER parser(f, data);
+return Exec(request, parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::SendMessage(const std::string & request, SEND_MESSAGE::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::SendMessage(const std::string & request, SEND_MESSAGE::CALLBACK f, void * data)
 {
-parserSendMessage.SetCallback(f, data);
-return Exec(request, parserSendMessage);
+SEND_MESSAGE::PARSER parser(f, data);
+return Exec(request, parser);
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::CheckUser(const std::string & login, const std::string & password, CHECK_USER::CALLBACK f, void * data)
 {
 }
 //-----------------------------------------------------------------------------
 int SERVCONF::IMPL::CheckUser(const std::string & login, const std::string & password, CHECK_USER::CALLBACK f, void * data)
 {
-parserCheckUser.SetCallback(f, data);
-return Exec("<CheckUser login=\"" + login + "\" password=\"" + password + "\"/>", parserCheckUser);
+CHECK_USER::PARSER parser(f, data);
+return Exec("<CheckUser login=\"" + login + "\" password=\"" + password + "\"/>", parser);
 }
 //-----------------------------------------------------------------------------
 void SERVCONF::IMPL::Start(void * data, const char * el, const char ** attr)
 }
 //-----------------------------------------------------------------------------
 void SERVCONF::IMPL::Start(void * data, const char * el, const char ** attr)