From 6dac1de6f707645b08957573abda2bdc2e39c470 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 7 Aug 2015 01:57:39 -0700 Subject: [PATCH 1/6] build system tuning --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f78a5a3..cc8fdb2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ *.pdb *.vcxproj *.rc +/install_manifest.txt From 83792bd02cc7982a7f3da76a2aee49423a1a053f Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 11 Aug 2015 01:43:13 -0700 Subject: [PATCH 2/6] added facility to build debug library --- SConscript | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SConscript b/SConscript index dd8863f..2728077 100644 --- a/SConscript +++ b/SConscript @@ -7,6 +7,10 @@ env = Environment( tools=['default', 'mb_install'], toolpath=['#/../mw-scons-tools', '#/Install/mw-scons-tools']) +debug = ARGUMENTS.get('debug', 0) +if int(debug): + env.Append(CCFLAGS = '-g') + env.MBAddStandardCompilerFlags() env.MBAddIncludePaths([ From 43c14d4f6843995bb68eb9593852972c58ceba6c Mon Sep 17 00:00:00 2001 From: GBDzhobava Date: Tue, 11 Aug 2015 15:26:06 +0300 Subject: [PATCH 3/6] added arguments for scons: sysroot, target, tcprefix, tcversion --- SConscript | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/SConscript b/SConscript index 2728077..f85acb9 100644 --- a/SConscript +++ b/SConscript @@ -2,15 +2,55 @@ import os +optCC = 'gcc' +optCXX = 'g++' +optAR = 'ar' +optSTRIP = 'strip' + env = Environment( ENV=os.environ, tools=['default', 'mb_install'], toolpath=['#/../mw-scons-tools', '#/Install/mw-scons-tools']) debug = ARGUMENTS.get('debug', 0) +target = ARGUMENTS.get('target', 0) +SYSROOT = ARGUMENTS.get('sysroot', 0) +TCPREFIX = ARGUMENTS.get('tcprefix', 0) +TCVERSION = ARGUMENTS.get('tcversion', 0) + +if SYSROOT!=0: + sysroot=SYSROOT + +if TCPREFIX!=0: + optCC=('%s-' % TCPREFIX) + optCC + optCXX=('%s-' % TCPREFIX) + optCXX + optAR=('%s-' % TCPREFIX) + optAR + optSTRIP=('%s-' % TCPREFIX) + optSTRIP + +if TCVERSION!=0: + optCC=optCC + ('-%s' % TCVERSION) + optCXX=optCXX + ('-%s' % TCVERSION) + optAR=optAR + ('-%s' % TCPREFIX) + +env_options = { + "CC" : optCC, + "CXX" : optCXX, + "LD" : optCXX, + "AR" : optAR, + "STRIP" : optSTRIP +} + if int(debug): env.Append(CCFLAGS = '-g') +if target == 'arm': + env.Replace(**env_options) + if SYSROOT!=0: + env.Append(CCFLAGS=['--sysroot=%s' % sysroot], + LINKFLAGS=['--sysroot=%s' % sysroot]) + env.Append(CCFLAGS=['-I%s/usr/include/arm-linux-gnueabihf/c++/4.9' % sysroot]) + env.Append(CCFLAGS=['-I%s/usr/include/c++/4.9' % sysroot]) + env.MBAddStandardCompilerFlags() env.MBAddIncludePaths([ From 46763e5292463ccd1782d276cbf047d147f34fbf Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 11 Aug 2015 06:43:09 -0700 Subject: [PATCH 4/6] library crash fix when recieving parseError string --- src/main/cpp/jsonrpcprivate.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/cpp/jsonrpcprivate.cpp b/src/main/cpp/jsonrpcprivate.cpp index f16a1d8..1b236b5 100644 --- a/src/main/cpp/jsonrpcprivate.cpp +++ b/src/main/cpp/jsonrpcprivate.cpp @@ -295,9 +295,9 @@ void JsonRpcPrivate::handleResponse( if (i != m_callbacks.end()) { // Get the shared pointer to the callback callback = i->second.lock(); + // Remove the weak pointer to the callback + m_callbacks.erase(i); } - // Remove the weak pointer to the callback - m_callbacks.erase(i); } // If the callback is still valid, send the response @@ -312,7 +312,7 @@ Json::Value JsonRpcPrivate::handleObject(Json::Value const & jsonObject) { Json::Value const null; response = invalidRequest(null); } else { - Json::Value const id(jsonObject["id"]); + Json::Value const id(jsonObject["id"]); //TODO: handle special responses (e.g. parse errors) if (isRequest(jsonObject)) { response = handleRequest(jsonObject, id); } else if (isResponse(jsonObject)) { From 6c3d14e9922c222c357a10954e07c94a99f805b2 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 11 Aug 2015 06:44:17 -0700 Subject: [PATCH 5/6] single \n doesn't produce parseError condition now --- src/main/cpp/jsonreader.cpp | 32 +++++++++++++++++++++++--------- src/main/cpp/jsonreader.h | 2 +- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/cpp/jsonreader.cpp b/src/main/cpp/jsonreader.cpp index 034af3b..99c8e9e 100644 --- a/src/main/cpp/jsonreader.cpp +++ b/src/main/cpp/jsonreader.cpp @@ -23,19 +23,32 @@ void JsonReader::reset() { void JsonReader::send() { std::string const jsonText(m_buffer.str()); reset(); - if (!jsonText.empty()) { - m_jsonRpcPrivate.jsonReaderCallback(jsonText); + + if (jsonText.empty()) + return; + + if(jsonText.size() == 1){ + if( jsonText.find(" ") == 0 + || jsonText.find("\t") == 0 + || jsonText.find("\n") == 0 + || jsonText.find("\r") == 0 + ) + return; } + if(jsonText.size() == 2 && jsonText.find("\r\n") == 0 ) + return; + + m_jsonRpcPrivate.jsonReaderCallback(jsonText); } -void JsonReader::transition(char const ch) { +bool JsonReader::transition(char const ch) { switch (m_state) { case S0: if ('{' == ch || '[' == ch) { m_state = S1; m_stack.push(ch); - } else if (' ' != ch || '\t' != ch || '\n' != ch || '\r' != ch) { - send(); + } else if (' ' == ch || '\t' == ch || '\n' == ch || '\r' == ch) { + return true; } break; @@ -59,9 +72,7 @@ void JsonReader::transition(char const ch) { } } - if (send) { - this->send(); - } + return send; } break; @@ -77,11 +88,14 @@ void JsonReader::transition(char const ch) { m_state = S2; break; } + + return false; } void JsonReader::feed(char ch) { m_buffer << ch; - transition(ch); + if(transition(ch)) + send(); } void JsonReader::feed(char const * const buffer, std::size_t const length) { diff --git a/src/main/cpp/jsonreader.h b/src/main/cpp/jsonreader.h index efaf477..0051ef4 100644 --- a/src/main/cpp/jsonreader.h +++ b/src/main/cpp/jsonreader.h @@ -24,7 +24,7 @@ class JsonReader : public JsonRpcStream { enum State { S0, S1, S2, S3 }; void reset(void); - void transition(char ch); + bool transition(char ch); void send(void); JsonRpcPrivate & m_jsonRpcPrivate; From 4e565ae0180724c452cabd4352d5741137c751a1 Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 11 Aug 2015 07:38:57 -0700 Subject: [PATCH 6/6] added sync sequence(\n) for jsonrpc --- src/main/cpp/jsonreader.cpp | 6 ++++++ src/main/cpp/jsonreader.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/main/cpp/jsonreader.cpp b/src/main/cpp/jsonreader.cpp index 99c8e9e..d85ed16 100644 --- a/src/main/cpp/jsonreader.cpp +++ b/src/main/cpp/jsonreader.cpp @@ -41,6 +41,10 @@ void JsonReader::send() { m_jsonRpcPrivate.jsonReaderCallback(jsonText); } +void JsonReader::setDelimiter(char ch){ + m_packetDelimiter = ch; +} + bool JsonReader::transition(char const ch) { switch (m_state) { case S0: @@ -96,6 +100,8 @@ void JsonReader::feed(char ch) { m_buffer << ch; if(transition(ch)) send(); + else if(m_packetDelimiter == ch) //use delimiter as sync sequence. we assume that json is passed as minified string + return send(); } void JsonReader::feed(char const * const buffer, std::size_t const length) { diff --git a/src/main/cpp/jsonreader.h b/src/main/cpp/jsonreader.h index 0051ef4..a3cd67f 100644 --- a/src/main/cpp/jsonreader.h +++ b/src/main/cpp/jsonreader.h @@ -19,6 +19,7 @@ class JsonReader : public JsonRpcStream { JSONRPC_API void feed(char const *, std::size_t); JSONRPC_API void feed(std::string const &); JSONRPC_API void feedeof(void); + JSONRPC_API void setDelimiter(char); private: enum State { S0, S1, S2, S3 }; @@ -31,6 +32,7 @@ class JsonReader : public JsonRpcStream { State m_state; std::stack m_stack; std::ostringstream m_buffer; + char m_packetDelimiter = '\n'; //by default use \n char as sync sequence // Disable copy constructor and assignment.