From e62c2177aadb891d7ef30d320ebcb9a32db6aba6 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 8 Aug 2018 15:11:52 +0200 Subject: [PATCH 01/16] Firebase.readEvent() returns "type" instead "put" while getting data from Firebase --- src/FirebaseArduino.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 0e7ae87d..b82de146 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().asObject()["type"] = type.c_str(); + obj.getJsonVariant().asObject()["type"] = type; return obj; } From b14884ad1e0540bae3f37623cb012bf3fc604769 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 10:10:54 +0200 Subject: [PATCH 02/16] Use proper API --- src/FirebaseArduino.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index b82de146..5d72a446 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().asObject()["type"] = type; + obj.getJsonVariant().asObject().set("type", type); return obj; } From 50a58656f4548b4eef3822f8053f02719df034c9 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 10:40:02 +0200 Subject: [PATCH 03/16] Use correct syntax and api --- src/FirebaseArduino.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 5d72a446..c957e6a0 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().asObject().set("type", type); + obj.getJsonVariant().as().set("type", type); return obj; } From 434df1c47eafb70f427ca37a8162e24a8d58e289 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 10:58:42 +0200 Subject: [PATCH 04/16] Try with explicit objects --- src/FirebaseArduino.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index c957e6a0..3168ed85 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,9 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().as().set("type", type); + JsonVariant v = obj.getJsonVariant(); + JsonObject& jsonObj = v.as(); + jsonObj.set("type", type); return obj; } From a2a9896b01953d9f0de1faa0953f493a6481ee01 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 11:11:11 +0200 Subject: [PATCH 05/16] Issue comes from the set during the tests... --- src/FirebaseArduino.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 3168ed85..5d72a446 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,9 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - JsonVariant v = obj.getJsonVariant(); - JsonObject& jsonObj = v.as(); - jsonObj.set("type", type); + obj.getJsonVariant().asObject().set("type", type); return obj; } From 5746cb5ef610d1426fa3ac4d4924385dd70bde6f Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 11:14:11 +0200 Subject: [PATCH 06/16] Checking tests with latest ArduinoJson lib version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7c9131df..3346864e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.13.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi From d330ced03cc4c59eeac5bf03a05750db6d0e64cb Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 11:31:06 +0200 Subject: [PATCH 07/16] Maybe... --- src/FirebaseArduino.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 5d72a446..9c917f24 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,9 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().asObject().set("type", type); + if (NULL != type) { + obj.getJsonVariant().as().set("type", type); + } return obj; } From e4713f7cc967a188095a3a1b9e8126145a8e32a9 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 11:56:23 +0200 Subject: [PATCH 08/16] Another test --- .travis.yml | 2 +- src/FirebaseArduino.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3346864e..7c9131df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.13.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 9c917f24..5e7a58c0 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - if (NULL != type) { + if (type.length() > 0) { obj.getJsonVariant().as().set("type", type); } return obj; From 2b475344c765b6c6f27fd6037cf5efcf1985d214 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 12:15:30 +0200 Subject: [PATCH 09/16] Another test... --- src/FirebaseArduino.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 5e7a58c0..b8fd6416 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,9 +179,9 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - if (type.length() > 0) { - obj.getJsonVariant().as().set("type", type); - } + JsonObject& jsonObject = obj.getJsonVariant().as(); + jsonObject.set("type", ""); + jsonObject.set("type", type); return obj; } From f1c940d97ffdeded6c749b539a0c90af34d635ee Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 12:20:46 +0200 Subject: [PATCH 10/16] Give up... --- src/FirebaseArduino.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index b8fd6416..c957e6a0 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,9 +179,7 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - JsonObject& jsonObject = obj.getJsonVariant().as(); - jsonObject.set("type", ""); - jsonObject.set("type", type); + obj.getJsonVariant().as().set("type", type); return obj; } From 728dd9d57ae6e714b36c5b0e015ac0879c7e4a84 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 12:32:13 +0200 Subject: [PATCH 11/16] Test with ESP8266 2.4.1 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7c9131df..71d0c968 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.4.1 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi From 74f63e29064139f2c6d8d26199ff1fb02704795d Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 12:38:43 +0200 Subject: [PATCH 12/16] Revert "Test with ESP8266 2.4.1" This reverts commit 728dd9d57ae6e714b36c5b0e015ac0879c7e4a84. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 71d0c968..7c9131df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.4.1 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi From db8456913a645b8f8ca37dcf6be9ab141d207ebd Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 14:49:54 +0200 Subject: [PATCH 13/16] Quick final test --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7c9131df..96b1f854 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.8.5 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi From f08825d525c7bc5a0ce2fb764f482081dee017b0 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 14:58:13 +0200 Subject: [PATCH 14/16] Revert "Quick final test" This reverts commit db8456913a645b8f8ca37dcf6be9ab141d207ebd. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 96b1f854..7c9131df 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ addons: packages: - g++-4.8 env: -- ARDUINO_VERSION=1.8.5 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino +- ARDUINO_VERSION=1.6.9 ARDUINO_ESP8266_VERSION=2.3.0 LIB_NEOPIXEL_VERSION=v1.0.5 LIB_GFX_VERSION=v1.1.5 LIB_SSD1306_VERSION=1.1.0 LIB_JSON_VERSION=v5.11.2 ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino - ARDUINO_VERSION=nightly ARDUINO_ESP8266_VERSION=master LIB_NEOPIXEL_VERSION=master LIB_GFX_VERSION=master LIB_SSD1306_VERSION=master LIB_JSON_VERSION=master ARDUINO_ROOT=${HOME}/arduino-${ARDUINO_VERSION} ARDUINO_ESP8266_ROOT=${ARDUINO_ROOT}/hardware/esp8266com/esp8266 ARDUINO_HOME=${HOME}/Arduino install: - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi From 3af3a1a9b3357cf2ce8d0ed93365ca01d138044d Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 16:07:49 +0200 Subject: [PATCH 15/16] Fixed! --- src/FirebaseArduino.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index c957e6a0..2cc631ef 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -179,7 +179,12 @@ FirebaseObject FirebaseArduino::readEvent() { String event = client->readStringUntil('\n').substring(6); client->readStringUntil('\n'); // consume separator FirebaseObject obj = FirebaseObject(event.c_str()); - obj.getJsonVariant().as().set("type", type); + + // required to have a copy of the string but use a char[] format which is + // the only supported format for JsonObject#set (it does not like the std::string of the test env) + char *cstr = new char[type.length() + 1]; + strcpy(cstr, type.c_str()); + obj.getJsonVariant().as().set("type", cstr); return obj; } From 3195d232e685522565f23edc429db481eb9ce773 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 15 Aug 2018 18:21:13 +0200 Subject: [PATCH 16/16] Integrated feedback --- src/FirebaseArduino.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/FirebaseArduino.cpp b/src/FirebaseArduino.cpp index 2cc631ef..bae29595 100644 --- a/src/FirebaseArduino.cpp +++ b/src/FirebaseArduino.cpp @@ -183,8 +183,9 @@ FirebaseObject FirebaseArduino::readEvent() { // required to have a copy of the string but use a char[] format which is // the only supported format for JsonObject#set (it does not like the std::string of the test env) char *cstr = new char[type.length() + 1]; - strcpy(cstr, type.c_str()); + strncpy(cstr, type.c_str(), type.length() + 1); obj.getJsonVariant().as().set("type", cstr); + delete[] cstr; return obj; }