]> git.stg.codes - stg.git/commitdiff
Improved handling errors got from server.
authorMaxim Mamontov <faust.madf@gmail.com>
Fri, 23 Aug 2013 15:59:53 +0000 (18:59 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Fri, 23 Aug 2013 15:59:53 +0000 (18:59 +0300)
17 files changed:
projects/sgconf/common_sg.cpp
projects/sgconf/common_sg.h
projects/sgconf/main.cpp
stglibs/srvconf.lib/include/stg/parser_auth_by.h
stglibs/srvconf.lib/include/stg/parser_chg_user.h
stglibs/srvconf.lib/include/stg/parser_get_user.h
stglibs/srvconf.lib/include/stg/parser_get_users.h
stglibs/srvconf.lib/include/stg/parser_send_message.h
stglibs/srvconf.lib/include/stg/parser_server_info.h
stglibs/srvconf.lib/include/stg/property_parsers.h
stglibs/srvconf.lib/parser_auth_by.cpp
stglibs/srvconf.lib/parser_check_user.cpp
stglibs/srvconf.lib/parser_get_user.cpp
stglibs/srvconf.lib/parser_get_users.cpp
stglibs/srvconf.lib/parser_send_message.cpp
stglibs/srvconf.lib/parser_server_info.cpp
stglibs/srvconf.lib/property_parsers.cpp

index 898c334f471c6d2bfb0275607c3c2709a9bafbf1..a54826dfb7dad95bb8ecb476c2714bdf118e027b 100644 (file)
@@ -49,11 +49,18 @@ const int usageInfo = 1;
 const int TO_KOI8 = 0;
 const int FROM_KOI8 = 1;
 //-----------------------------------------------------------------------------
 const int TO_KOI8 = 0;
 const int FROM_KOI8 = 1;
 //-----------------------------------------------------------------------------
+struct ResultData
+{
+    bool result;
+    std::string reason;
+};
+//-----------------------------------------------------------------------------
 struct GetUserData
 {
     GetUserData(REQUEST & req, bool res) : request(req), result(res) {}
     REQUEST & request;
     bool result;
 struct GetUserData
 {
     GetUserData(REQUEST & req, bool res) : request(req), result(res) {}
     REQUEST & request;
     bool result;
+    std::string reason;
 };
 //---------------------------------------------------------------------------
 struct HelpParams
 };
 //---------------------------------------------------------------------------
 struct HelpParams
@@ -287,15 +294,34 @@ void ConvertFromKOI8(const std::string & src, std::string * dst)
 ConvertKOI8(src, dst, FROM_KOI8);
 }
 //-----------------------------------------------------------------------------
 ConvertKOI8(src, dst, FROM_KOI8);
 }
 //-----------------------------------------------------------------------------
-int RecvSetUserAnswer(const char * ans, void * d)
+void SendMessageCallback(bool result, const std::string & reason, void * d)
 {
 {
-GetUserData * data = static_cast<GetUserData *>(d);
+ResultData * data = static_cast<ResultData *>(d);
+data->result = result;
+data->reason = reason;
+}
+//-----------------------------------------------------------------------------
+void RecvSetUserAnswer(bool result, const std::string & reason, void * d)
+{
+ResultData * data = static_cast<ResultData *>(d);
+data->result = result;
+data->reason = reason;
+}
+//-----------------------------------------------------------------------------
+void RecvAuthByData(bool result, const std::string & reason,
+                    const PARSER_AUTH_BY::INFO & list, void * d)
+{
+ResultData * data = static_cast<ResultData *>(d);
+data->result = result;
+data->reason = reason;
 
 
-std::cout << ans << std::endl;
+if (!result)
+    return;
 
 
-data->result = (strcasecmp("Ok", ans) == 0);
+for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
+    std::cout << *it << "\n";
 
 
-return 0;
+std::cout << std::endl;
 }
 //-----------------------------------------------------------------------------
 struct StringReqParams
 }
 //-----------------------------------------------------------------------------
 struct StringReqParams
@@ -305,13 +331,19 @@ struct StringReqParams
     const std::string * value;
 };
 //-----------------------------------------------------------------------------
     const std::string * value;
 };
 //-----------------------------------------------------------------------------
-void GetUserCallback(const PARSER_GET_USER::INFO & info, void * d)
+void GetUserCallback(bool result, const std::string& reason, const PARSER_GET_USER::INFO & info, void * d)
 {
 GetUserData * data = static_cast<GetUserData *>(d);
 {
 GetUserData * data = static_cast<GetUserData *>(d);
+data->result = false;
+data->reason = reason;
+
+if (!result)
+    return;
 
 if (info.login == "")
     {
     data->result = false;
 
 if (info.login == "")
     {
     data->result = false;
+    data->reason = "Invalid login.";
     return;
     }
 
     return;
     }
 
@@ -406,19 +438,11 @@ for (unsigned i = 0; i < sizeof(strReqParams) / sizeof(StringReqParams); i++)
 data->result = true;
 }
 //-----------------------------------------------------------------------------
 data->result = true;
 }
 //-----------------------------------------------------------------------------
-void RecvAuthByData(const PARSER_AUTH_BY::INFO & list, void *)
-{
-for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
-    cout << *it << "\n";
-cout << endl;
-}
-//-----------------------------------------------------------------------------
-int ProcessSetUser(const std::string &server,
-                   int port,
-                   const std::string &admLogin,
-                   const std::string &admPasswd,
-                   const std::string &str,
-                   bool isMessage)
+bool ProcessSetUser(const std::string & server,
+                    int port,
+                    const std::string & admLogin,
+                    const std::string & admPasswd,
+                    const std::string & str)
 {
 SERVCONF sc;
 
 {
 SERVCONF sc;
 
@@ -427,43 +451,59 @@ sc.SetPort(port);
 sc.SetAdmLogin(admLogin.c_str());
 sc.SetAdmPassword(admPasswd.c_str());
 
 sc.SetAdmLogin(admLogin.c_str());
 sc.SetAdmPassword(admPasswd.c_str());
 
-REQUEST request;
-GetUserData cbdata(request, false);
+ResultData data;
+sc.SetChgUserCallback(RecvSetUserAnswer, &data);
+int res = sc.ChgUser(str.c_str());
 
 
-int res = 0;
-if (isMessage)
+if (res == st_ok && data.result)
     {
     {
-    sc.SetSendMessageCallback(RecvSetUserAnswer, &cbdata);
-    res = sc.SendMessage(str.c_str());
+    printf("Ok\n");
+    return false;
     }
     }
+
+printf("Error\n");
+if (res != st_ok)
+    printf("%s\n", sc.GetStrError().c_str());
 else
 else
-    {
-    sc.SetChgUserCallback(RecvSetUserAnswer, &cbdata);
-    res = sc.ChgUser(str.c_str());
-    }
+    printf("%s\n", data.reason.c_str());
+return true;
+}
+//-----------------------------------------------------------------------------
+bool ProcessSendMessage(const std::string & server, uint16_t port,
+                        const std::string & login, const std::string & password,
+                        const std::string & requestString)
+{
+SERVCONF sc;
+
+sc.SetServer(server.c_str());
+sc.SetPort(port);
+sc.SetAdmLogin(login.c_str());
+sc.SetAdmPassword(password.c_str());
+
+ResultData data;
+sc.SetSendMessageCallback(SendMessageCallback, &data);
+int res = sc.SendMessage(requestString.c_str());
 
 
-if (res == st_ok && cbdata.result)
+if (res == st_ok && data.result)
     {
     printf("Ok\n");
     {
     printf("Ok\n");
-    return 0;
-    }
-else
-    {
-    printf("Error\n");
-    if (res != st_ok)
-        printf("%s\n", sc.GetStrError().c_str());
-    return -1;
+    return true;
     }
 
     }
 
-return 0;
+printf("Error\n");
+if (res != st_ok)
+    printf("%s\n", sc.GetStrError().c_str());
+else
+    printf("%s\n", data.reason.c_str());
+return false;
 }
 //-----------------------------------------------------------------------------
 }
 //-----------------------------------------------------------------------------
-int ProcessGetUser(const std::string &server,
-                   int port,
-                   const std::string &admLogin,
-                   const std::string &admPasswd,
-                   const std::string &login,
-                   REQUEST & request)
+bool ProcessGetUser(const std::string &server,
+                    int port,
+                    const std::string &admLogin,
+                    const std::string &admPasswd,
+                    const std::string &login,
+                    REQUEST & request)
 {
 SERVCONF sc;
 
 {
 SERVCONF sc;
 
@@ -480,22 +520,22 @@ bool res = (sc.GetUser(login.c_str()) == st_ok);
 if (res && data.result)
     {
     printf("Ok\n");
 if (res && data.result)
     {
     printf("Ok\n");
-    return 0;
-    }
-else
-    {
-    printf("Error\n");
-    return -1;
+    return true;
     }
 
     }
 
-return 0;
+printf("Error\n");
+if (!res)
+    printf("%s\n", sc.GetStrError().c_str());
+else
+    printf("%s\n", data.reason.c_str());
+return false;
 }
 //-----------------------------------------------------------------------------
 }
 //-----------------------------------------------------------------------------
-int ProcessAuthBy(const std::string &server,
-                  int port,
-                  const std::string &admLogin,
-                  const std::string &admPasswd,
-                  const std::string &login)
+bool ProcessAuthBy(const std::string &server,
+                   int port,
+                   const std::string &admLogin,
+                   const std::string &admPasswd,
+                   const std::string &login)
 {
 SERVCONF sc;
 
 {
 SERVCONF sc;
 
@@ -504,16 +544,21 @@ sc.SetPort(port);
 sc.SetAdmLogin(admLogin.c_str());
 sc.SetAdmPassword(admPasswd.c_str());
 
 sc.SetAdmLogin(admLogin.c_str());
 sc.SetAdmPassword(admPasswd.c_str());
 
-sc.SetAuthByCallback(RecvAuthByData, NULL);
+ResultData data;
+sc.SetAuthByCallback(RecvAuthByData, &data);
 bool res = (sc.AuthBy(login.c_str()) == st_ok);
 
 bool res = (sc.AuthBy(login.c_str()) == st_ok);
 
-if (!res)
+if (res && data.result)
     {
     {
-    printf("Error\n");
-    return -1;
+    printf("Ok\n");
+    return true;
     }
 
     }
 
-printf("Ok\n");
-return 0;
+printf("Error\n");
+if (!res)
+    printf("%s\n", sc.GetStrError().c_str());
+else
+    printf("%s\n", data.reason.c_str());
+return false;
 }
 //-----------------------------------------------------------------------------
 }
 //-----------------------------------------------------------------------------
index 03090a7628fb71fa47db5cea37d5e65bcb8981e1..4bff0aa7ae2f74a5216faa9d03dcb2e0277147f1 100644 (file)
@@ -45,24 +45,27 @@ int CheckLogin(const char * login);
 void ConvertFromKOI8(const std::string & src, std::string * dst);
 void ConvertToKOI8(const std::string & src, std::string * dst);
 
 void ConvertFromKOI8(const std::string & src, std::string * dst);
 void ConvertToKOI8(const std::string & src, std::string * dst);
 
-int ProcessGetUser(const std::string &server,
+bool ProcessGetUser(const std::string & server,
+                    int port,
+                    const std::string & admLogin,
+                    const std::string & admPasswd,
+                    const std::string & login,
+                    REQUEST & request);
+
+bool ProcessAuthBy(const std::string & server,
                    int port,
                    int port,
-                   const std::string &admLogin,
-                   const std::string &admPasswd,
-                   const std::string &login,
-                   REQUEST & request);
+                   const std::string & admLogin,
+                   const std::string & admPasswd,
+                   const std::string & login);
 
 
-int ProcessAuthBy(const std::string &server,
-                  int port,
-                  const std::string &admLogin,
-                  const std::string &admPasswd,
-                  const std::string &login);
+bool ProcessSetUser(const std::string & server,
+                    int port,
+                    const std::string & admLogin,
+                    const std::string & admPasswd,
+                    const std::string & str);
 
 
-int ProcessSetUser(const std::string &server,
-                   int port,
-                   const std::string &admLogin,
-                   const std::string &admPasswd,
-                   const std::string &str,
-                   bool isMessage = false);
+bool ProcessSendMessage(const std::string & server, uint16_t port,
+                        const std::string & login, const std::string & password,
+                        const std::string & requestString);
 
 #endif
 
 #endif
index f8a394d41b591f3526a8292b056ede5660642c48..66f580f611aa8ff43ab117339d9e1eb0ac933d34 100644 (file)
@@ -724,7 +724,7 @@ int CheckParametersSet(REQUEST * req)
 return CheckParameters(req);
 }
 //-----------------------------------------------------------------------------
 return CheckParameters(req);
 }
 //-----------------------------------------------------------------------------
-int mainGet(int argc, char **argv)
+bool mainGet(int argc, char **argv)
 {
 int c;
 REQUEST req;
 {
 int c;
 REQUEST req;
@@ -890,7 +890,7 @@ else
     return ProcessGetUser(req.server, req.port, req.admLogin, req.admPasswd, req.login, req);
 }
 //-----------------------------------------------------------------------------
     return ProcessGetUser(req.server, req.port, req.admLogin, req.admPasswd, req.login, req);
 }
 //-----------------------------------------------------------------------------
-int mainSet(int argc, char **argv)
+bool mainSet(int argc, char **argv)
 {
 string str;
 
 {
 string str;
 
@@ -1087,7 +1087,10 @@ char rstr[rLen];
 memset(rstr, 0, rLen);
 
 CreateRequestSet(&req, rstr);
 memset(rstr, 0, rLen);
 
 CreateRequestSet(&req, rstr);
-return ProcessSetUser(req.server, req.port, req.admLogin, req.admPasswd, rstr, isMessage);
+if (isMessage)
+    return ProcessSendMessage(req.server, req.port, req.admLogin, req.admPasswd, rstr);
+
+return ProcessSetUser(req.server, req.port, req.admLogin, req.admPasswd, rstr);
 }
 //-----------------------------------------------------------------------------
 int main(int argc, char **argv)
 }
 //-----------------------------------------------------------------------------
 int main(int argc, char **argv)
@@ -1106,7 +1109,9 @@ if (strcmp(argv[1], "get") == 0)
 else if (strcmp(argv[1], "set") == 0)
     {
     //printf("set\n");
 else if (strcmp(argv[1], "set") == 0)
     {
     //printf("set\n");
-    return mainSet(argc - 1, argv + 1);
+    if (mainSet(argc - 1, argv + 1) )
+        return 0;
+    return -1;
     }
 else
     {
     }
 else
     {
index aa3ea7bcd3a02c7e736fa52d119c9029ecd94fc6..00c997d56be2534bbe8b94e72a2edf6cac7bf67c 100644 (file)
@@ -30,7 +30,7 @@ class PARSER_AUTH_BY: public PARSER
 {
 public:
     typedef std::vector<std::string> INFO;
 {
 public:
     typedef std::vector<std::string> INFO;
-    typedef void (* CALLBACK)(const INFO & info, void * data);
+    typedef void (* CALLBACK)(bool result, const std::string & reason, const INFO & info, void * data);
 
     PARSER_AUTH_BY();
     int  ParseStart(const char *el, const char **attr);
 
     PARSER_AUTH_BY();
     int  ParseStart(const char *el, const char **attr);
@@ -40,7 +40,9 @@ private:
     CALLBACK callback;
     void * data;
     int depth;
     CALLBACK callback;
     void * data;
     int depth;
+    bool parsingAnswer;
     INFO info;
     INFO info;
+    std::string error;
 };
 
 #endif
 };
 
 #endif
index db54026a99ae5877e253cd06f061c7bcd78735e9..cc6e9f18bd466445d3b87abbbd947a1fd21b5d64 100644 (file)
@@ -29,7 +29,7 @@
 class PARSER_CHG_USER: public PARSER
 {
 public:
 class PARSER_CHG_USER: public PARSER
 {
 public:
-    typedef int (* CALLBACK)(bool result, const std::string& reason, void * data);
+    typedef void (* CALLBACK)(bool result, const std::string& reason, void * data);
 
     PARSER_CHG_USER();
     int  ParseStart(const char * el, const char ** attr);
 
     PARSER_CHG_USER();
     int  ParseStart(const char * el, const char ** attr);
index a8700ad02653e5e1e6009f2db936cf2cb34f0482..7f6faaad062749a1a67bde20571ace6f6769f5d9 100644 (file)
@@ -85,6 +85,7 @@ private:
     void * data;
     INFO info;
     int depth;
     void * data;
     INFO info;
     int depth;
+    bool parsingAnswer;
     std::string error;
 
     void ParseUser(const char *el, const char **attr);
     std::string error;
 
     void ParseUser(const char *el, const char **attr);
index 57907026376133807c04f855663814a5b1ad7b03..35fcd126a607cac96913042afb2997ad636667d4 100644 (file)
@@ -45,13 +45,13 @@ private:
     PARSER_GET_USER userParser;
     INFO info;
     int depth;
     PARSER_GET_USER userParser;
     INFO info;
     int depth;
+    bool parsingAnswer;
     std::string error;
 
     void AddUser(const PARSER_GET_USER::INFO & userInfo);
     void SetError(const std::string & e) { error = e; }
     std::string error;
 
     void AddUser(const PARSER_GET_USER::INFO & userInfo);
     void SetError(const std::string & e) { error = e; }
-    void ParseUsers(const char * el, const char ** attr);
 
 
-    static void UserCallback(const PARSER_GET_USER::INFO & info, void * data);
+    static void UserCallback(bool result, const std::string& reason, const PARSER_GET_USER::INFO & info, void * data);
 };
 
 #endif
 };
 
 #endif
index 9d1f33dc92364016a8ae5fb173afd4e6adadf4f8..9b3ca5efe2ffb8824b8215373a8e05ad3cf62bbe 100644 (file)
@@ -29,7 +29,7 @@
 class PARSER_SEND_MESSAGE: public PARSER
 {
 public:
 class PARSER_SEND_MESSAGE: public PARSER
 {
 public:
-    typedef int (* CALLBACK)(bool result, const std::string& reason, void * data);
+    typedef void (* CALLBACK)(bool result, const std::string& reason, void * data);
 
     PARSER_SEND_MESSAGE();
     int  ParseStart(const char * el, const char ** attr);
 
     PARSER_SEND_MESSAGE();
     int  ParseStart(const char * el, const char ** attr);
index 33ff5b66c955dcae955242c285db72d582fc052b..ff31ae715ce01a30fe2d13cddeeb468a6b9e0560 100644 (file)
@@ -53,6 +53,7 @@ private:
     CALLBACK callback;
     void * data;
     int depth;
     CALLBACK callback;
     void * data;
     int depth;
+    bool parsingAnswer;
     INFO info;
     std::string error;
 };
     INFO info;
     std::string error;
 };
index cb3943dbd7bf44326cc2038c473979a09b946722..d1e6a893b28922c341159c8525d936cc145eedff 100644 (file)
@@ -50,6 +50,7 @@ typedef std::map<std::string, BASE_PROPERTY_PARSER *> PROPERTY_PARSERS;
 bool CheckValue(const char ** attr);
 
 template <typename T>
 bool CheckValue(const char ** attr);
 
 template <typename T>
+inline
 bool GetValue(const char ** attr, T & value)
 {
 if (CheckValue(attr))
 bool GetValue(const char ** attr, T & value)
 {
 if (CheckValue(attr))
@@ -59,6 +60,7 @@ return true;
 }
 
 template <>
 }
 
 template <>
+inline
 bool GetValue<std::string>(const char ** attr, std::string & value)
 {
 if (!CheckValue(attr))
 bool GetValue<std::string>(const char ** attr, std::string & value)
 {
 if (!CheckValue(attr))
@@ -68,6 +70,7 @@ return true;
 }
 
 template <>
 }
 
 template <>
+inline
 bool GetValue<double>(const char ** attr, double & value)
 {
 if (CheckValue(attr))
 bool GetValue<double>(const char ** attr, double & value)
 {
 if (CheckValue(attr))
@@ -84,6 +87,7 @@ template <typename T>
 void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func = GetValue<T>);
 
 template <typename T>
 void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func = GetValue<T>);
 
 template <typename T>
+inline
 void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func)
 {
     parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER<T>(value, func)));
 void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER<T>::FUNC & func)
 {
     parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER<T>(value, func)));
index 877ca3e4e083fff7a03a2fce2aed43552b4b4891..06981aae9a6787023bf66a9e8f91edd5a15e26a3 100644 (file)
@@ -27,7 +27,8 @@
 PARSER_AUTH_BY::PARSER_AUTH_BY()
     : callback(NULL),
       data(NULL),
 PARSER_AUTH_BY::PARSER_AUTH_BY()
     : callback(NULL),
       data(NULL),
-      depth(0)
+      depth(0),
+      parsingAnswer(false)
 {
 }
 //-----------------------------------------------------------------------------
 {
 }
 //-----------------------------------------------------------------------------
@@ -36,14 +37,25 @@ int PARSER_AUTH_BY::ParseStart(const char *el, const char **attr)
 depth++;
 if (depth == 1)
     {
 depth++;
 if (depth == 1)
     {
-    if (strcasecmp(el, "AuthorizedBy") != 0)
-        info.clear();
+    if (strcasecmp(el, "AuthorizedBy") == 0)
+        if (attr && attr[0] && attr[1])
+            {
+            if (strcasecmp(attr[1], "error") == 0)
+                {
+                if (attr[2] && attr[3])
+                    error = attr[3];
+                else
+                    error = "User not found.";
+                }
+            else
+                parsingAnswer = true;
+            }
     }
 else
     {
     if (depth == 2)
         {
     }
 else
     {
     if (depth == 2)
         {
-        if (strcasecmp(el, "Auth") == 0)
+        if (parsingAnswer && strcasecmp(el, "Auth") == 0)
             {
             if (attr && attr[0] && attr[1] && strcasecmp(attr[0], "name") == 0)
                 info.push_back(attr[1]);
             {
             if (attr && attr[0] && attr[1] && strcasecmp(attr[0], "name") == 0)
                 info.push_back(attr[1]);
@@ -57,8 +69,13 @@ return 0;
 void PARSER_AUTH_BY::ParseEnd(const char * /*el*/)
 {
 depth--;
 void PARSER_AUTH_BY::ParseEnd(const char * /*el*/)
 {
 depth--;
-if (depth == 0 && callback)
-    callback(info, data);
+if (depth == 0)
+    {
+    if (callback)
+        callback(error.empty(), error, info, data);
+    info.clear();
+    error.clear();
+    }
 }
 //-----------------------------------------------------------------------------
 void PARSER_AUTH_BY::SetCallback(CALLBACK f, void * d)
 }
 //-----------------------------------------------------------------------------
 void PARSER_AUTH_BY::SetCallback(CALLBACK f, void * d)
index b99a43904368d6be96d1afe215fb89771b48a1d5..eed03f30c18d318b2c563023ee044138dd183bf2 100644 (file)
@@ -32,7 +32,7 @@ PARSER_CHECK_USER::PARSER_CHECK_USER()
 {
 }
 //-----------------------------------------------------------------------------
 {
 }
 //-----------------------------------------------------------------------------
-int PARSER_CHECK_USER::ParseStart(const char *el, const char **attr)
+int PARSER_CHECK_USER::ParseStart(const char * el, const char ** attr)
 {
 depth++;
 if (depth == 1)
 {
 depth++;
 if (depth == 1)
index 258d531d3bde32c220d4ffc338bb6aca0de1f365..a684a3f7909a9e4e5ac7f2d067b7f7c5384a831b 100644 (file)
@@ -57,7 +57,8 @@ return true;
 PARSER_GET_USER::PARSER_GET_USER()
     : callback(NULL),
       data(NULL),
 PARSER_GET_USER::PARSER_GET_USER()
     : callback(NULL),
       data(NULL),
-      depth(0)
+      depth(0),
+      parsingAnswer(false)
 {
     AddParser(propertyParsers, "login", info.login);
     AddParser(propertyParsers, "password", info.password);
 {
     AddParser(propertyParsers, "login", info.login);
     AddParser(propertyParsers, "password", info.password);
@@ -99,7 +100,7 @@ depth++;
 if (depth == 1)
     ParseUser(el, attr);
 
 if (depth == 1)
     ParseUser(el, attr);
 
-if (depth == 2)
+if (depth == 2 && parsingAnswer)
     ParseUserParams(el, attr);
 
 return 0;
     ParseUserParams(el, attr);
 
 return 0;
@@ -108,19 +109,32 @@ return 0;
 void PARSER_GET_USER::ParseEnd(const char * /*el*/)
 {
 depth--;
 void PARSER_GET_USER::ParseEnd(const char * /*el*/)
 {
 depth--;
-if (depth == 0)
+if (depth == 0 && parsingAnswer)
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
+    parsingAnswer = false;
     }
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USER::ParseUser(const char * el, const char ** attr)
 {
 if (strcasecmp(el, "user") == 0)
     }
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USER::ParseUser(const char * el, const char ** attr)
 {
 if (strcasecmp(el, "user") == 0)
-    if (strcasecmp(attr[1], "error") == 0)
-        error = "User not found.";
+    if (attr && attr[0] && attr[1])
+        {
+        if (strcasecmp(attr[1], "error") == 0)
+            {
+            if (attr[2] && attr[3])
+                error = attr[3];
+            else
+                error = "User not found.";
+            }
+        else
+            parsingAnswer = true;
+        }
+    else
+        parsingAnswer = true;
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USER::ParseUserParams(const char * el, const char ** attr)
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USER::ParseUserParams(const char * el, const char ** attr)
index 26ffc15705b8a6df0362d07606746cf7270a99fe..2f380c821279dce946b36972e40c8c94efdb993a 100644 (file)
@@ -28,7 +28,8 @@
 PARSER_GET_USERS::PARSER_GET_USERS()
     : callback(NULL),
       data(NULL),
 PARSER_GET_USERS::PARSER_GET_USERS()
     : callback(NULL),
       data(NULL),
-      depth(0)
+      depth(0),
+      parsingAnswer(false)
 {
     userParser.SetCallback(&PARSER_GET_USERS::UserCallback, this);
 }
 {
     userParser.SetCallback(&PARSER_GET_USERS::UserCallback, this);
 }
@@ -36,10 +37,10 @@ PARSER_GET_USERS::PARSER_GET_USERS()
 int PARSER_GET_USERS::ParseStart(const char * el, const char ** attr)
 {
 depth++;
 int PARSER_GET_USERS::ParseStart(const char * el, const char ** attr)
 {
 depth++;
-if (depth == 1)
-    ParseUsers(el, attr);
+if (depth == 1 && strcasecmp(el, "users") == 0)
+    parsingAnswer = true;
 
 
-if (depth > 1)
+if (depth > 1 && parsingAnswer)
     userParser.ParseStart(el, attr);
 
 return 0;
     userParser.ParseStart(el, attr);
 
 return 0;
@@ -48,21 +49,17 @@ return 0;
 void PARSER_GET_USERS::ParseEnd(const char * el)
 {
 depth--;
 void PARSER_GET_USERS::ParseEnd(const char * el)
 {
 depth--;
-if (depth > 0)
+if (depth > 0 && parsingAnswer)
     userParser.ParseEnd(el);
 
     userParser.ParseEnd(el);
 
-if (depth == 0)
+if (depth == 0 && parsingAnswer)
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
-    }
-}
-//-----------------------------------------------------------------------------
-void PARSER_GET_USERS::ParseUsers(const char * el, const char ** /*attr*/)
-{
-if (strcasecmp(el, "users") == 0)
     info.clear();
     info.clear();
+    parsingAnswer = false;
+    }
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USERS::AddUser(const PARSER_GET_USER::INFO & userInfo)
 }
 //-----------------------------------------------------------------------------
 void PARSER_GET_USERS::AddUser(const PARSER_GET_USER::INFO & userInfo)
index 2e2f785a77d690d00edab0ae96e5928dd194e466..c1955fce9f5301ee863215e399dd1c66e664866b 100644 (file)
@@ -32,7 +32,7 @@ PARSER_SEND_MESSAGE::PARSER_SEND_MESSAGE()
 {
 }
 //-----------------------------------------------------------------------------
 {
 }
 //-----------------------------------------------------------------------------
-int  PARSER_SEND_MESSAGE::ParseStart(const char * el, const char ** attr)
+int PARSER_SEND_MESSAGE::ParseStart(const char * el, const char ** attr)
 {
 depth++;
 if (depth == 1)
 {
 depth++;
 if (depth == 1)
index c8b1abfcfeea13f90fcc9639d6a1cfb4b25f48d3..645f6099f2f8adde7e96363b70618a04fc56fbc7 100644 (file)
@@ -40,7 +40,8 @@ const size_t DIRNAME_LEN  = 16;
 PARSER_SERVER_INFO::PARSER_SERVER_INFO()
     : callback(NULL),
       data(NULL),
 PARSER_SERVER_INFO::PARSER_SERVER_INFO()
     : callback(NULL),
       data(NULL),
-      depth(0)
+      depth(0),
+      parsingAnswer(false)
 {
     AddParser(propertyParsers, "uname", info.uname);
     AddParser(propertyParsers, "version", info.version);
 {
     AddParser(propertyParsers, "uname", info.uname);
     AddParser(propertyParsers, "version", info.version);
@@ -57,10 +58,10 @@ int PARSER_SERVER_INFO::ParseStart(const char *el, const char **attr)
 {
 depth++;
 if (depth == 1)
 {
 depth++;
 if (depth == 1)
-    if (strcasecmp(el, "ServerInfo") != 0)
-        error = "Invalid response.";
+    if (strcasecmp(el, "ServerInfo") == 0)
+        parsingAnswer = true;
 else
 else
-    if (depth == 2)
+    if (depth == 2 && parsingAnswer)
         if (!TryParse(propertyParsers, ToLower(el), attr))
             error = "Invalid parameter.";
 return 0;
         if (!TryParse(propertyParsers, ToLower(el), attr))
             error = "Invalid parameter.";
 return 0;
@@ -69,11 +70,12 @@ return 0;
 void PARSER_SERVER_INFO::ParseEnd(const char * /*el*/)
 {
 depth--;
 void PARSER_SERVER_INFO::ParseEnd(const char * /*el*/)
 {
 depth--;
-if (depth == 0)
+if (depth == 0 && parsingAnswer)
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
     {
     if (callback)
         callback(error.empty(), error, info, data);
     error.clear();
+    parsingAnswer = false;
     }
 }
 //-----------------------------------------------------------------------------
     }
 }
 //-----------------------------------------------------------------------------
index 4c5fcd6d7d9ae8809a14ee059d92fef09b3b3d03..fcb9020aa9bc6ddfd0708af3909ec82a0e5dc05b 100644 (file)
@@ -35,7 +35,7 @@ Decode21str(value, attr[1]);
 return true;
 }
 
 return true;
 }
 
-bool GetIPValue(const char ** attr, uint32_t value)
+bool GetIPValue(const char ** attr, uint32_t value)
 {
 if (!CheckValue(attr))
     return false;
 {
 if (!CheckValue(attr))
     return false;