From ca40a630d14de5a2ad0b4471c8b10f177f39445e Mon Sep 17 00:00:00 2001 From: suwatchai Date: Thu, 25 Mar 2021 18:36:11 +0700 Subject: [PATCH] Fix the missing token generation error status report and MultiPathStream::get memory leaks. --- README.md | 2 +- library.json | 2 +- library.properties | 2 +- src/Firebase_ESP_Client.cpp | 8 +- src/Firebase_ESP_Client.h | 8 +- src/README.md | 2 +- src/firestore/FB_Firestore.cpp | 16 +- src/firestore/FB_Firestore.h | 8 +- src/functions/FB_Functions.cpp | 18 +- src/functions/FB_Functions.h | 6 +- src/functions/PocicyBuilder.cpp | 10 +- src/functions/PolicyBuilder.h | 8 +- src/gcs/GCS.cpp | 8 +- src/gcs/GCS.h | 6 +- src/json/FirebaseJson.cpp | 5772 ++++++++++++++++--------------- src/json/FirebaseJson.h | 1138 +++--- src/message/FCM.cpp | 18 +- src/message/FCM.h | 8 +- src/rtdb/FB_RTDB.cpp | 20 +- src/rtdb/FB_RTDB.h | 4 +- src/rtdb/QueryFilter.cpp | 4 +- src/rtdb/QueryFilter.h | 4 +- src/rtdb/QueueInfo.cpp | 4 +- src/rtdb/QueueInfo.h | 4 +- src/rtdb/QueueManager.cpp | 4 +- src/rtdb/QueueManager.h | 4 +- src/session/FB_Session.cpp | 44 +- src/session/FB_Session.h | 8 +- src/signer/Signer.cpp | 22 +- src/signer/Signer.h | 4 +- src/storage/FCS.cpp | 4 +- src/storage/FCS.h | 4 +- src/stream/FB_MP_Stream.cpp | 12 +- src/stream/FB_MP_Stream.h | 8 +- src/stream/FB_Stream.cpp | 43 +- src/stream/FB_Stream.h | 8 +- 36 files changed, 3727 insertions(+), 3518 deletions(-) diff --git a/README.md b/README.md index c48373465..d4bc6b301 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Firebase Arduino Client Library for ESP8266 and ESP32 -Google's Firebase Arduino Client Library for ESP8266 and ESP32 v 2.0.10 +Google's Firebase Arduino Client Library for ESP8266 and ESP32 v 2.0.11 This library supports ESP8266 and ESP32 MCU from Espressif. The following are platforms in which the libraries are also available (RTDB only). diff --git a/library.json b/library.json index afe7b4950..f022c0164 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "Firebase Arduino Client Library for ESP8266 and ESP32", - "version": "2.0.10", + "version": "2.0.11", "keywords": "communication, REST, esp32, esp8266, arduino", "description": "This client library provides the functions to work with Firebase Realtime database, Firestore, Storage and Cloud messaging.", "repository": { diff --git a/library.properties b/library.properties index 92917615e..2ad2c4aa4 100644 --- a/library.properties +++ b/library.properties @@ -1,6 +1,6 @@ name=Firebase Arduino Client Library for ESP8266 and ESP32 -version=2.0.10 +version=2.0.11 author=Mobizt diff --git a/src/Firebase_ESP_Client.cpp b/src/Firebase_ESP_Client.cpp index f55f6f06e..17b85e268 100644 --- a/src/Firebase_ESP_Client.cpp +++ b/src/Firebase_ESP_Client.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase ESP Client Main class, Firebase_ESP_Client.h version 2.0.10 + * Google's Firebase ESP Client Main class, Firebase_ESP_Client.h version 2.0.11 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/Firebase_ESP_Client.h b/src/Firebase_ESP_Client.h index f51770013..b3ea42d42 100644 --- a/src/Firebase_ESP_Client.h +++ b/src/Firebase_ESP_Client.h @@ -1,15 +1,15 @@ /** - * Google's Firebase ESP Client Main class, Firebase_ESP_Client.h version 2.0.10 + * Google's Firebase ESP Client Main class, Firebase_ESP_Client.h version 2.0.11 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/README.md b/src/README.md index a3c90f967..e85a2062f 100644 --- a/src/README.md +++ b/src/README.md @@ -1,7 +1,7 @@ # Firebase Arduino Client Library for ESP8266 and ESP32 -Google's Firebase Arduino Client Library for ESP8266 and ESP32 v 2.0.10 +Google's Firebase Arduino Client Library for ESP8266 and ESP32 v 2.0.11 The default filessystem used in the library is flash and SD. diff --git a/src/firestore/FB_Firestore.cpp b/src/firestore/FB_Firestore.cpp index 89aa4b768..036a3d390 100644 --- a/src/firestore/FB_Firestore.cpp +++ b/src/firestore/FB_Firestore.cpp @@ -1,15 +1,15 @@ /** - * Google's Cloud Firestore class, Forestore.cpp version 1.0.3 + * Google's Cloud Firestore class, Forestore.cpp version 1.0.5 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 21, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -76,7 +76,7 @@ bool FB_Firestore::exportDocuments(FirebaseData *fbdo, const char *projectId, co fbdo->_ss.json.add(tmp, fbdo->_ss.arr); ut->delS(tmp); - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); return sendRequest(fbdo, &req); } @@ -115,7 +115,7 @@ bool FB_Firestore::importDocuments(FirebaseData *fbdo, const char *projectId, co fbdo->_ss.json.add(tmp, fbdo->_ss.arr); ut->delS(tmp); - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); return sendRequest(fbdo, &req); } @@ -213,7 +213,7 @@ bool FB_Firestore::runQuery(FirebaseData *fbdo, const char *projectId, const cha } ut->delS(tmp); - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); fbdo->_ss.json.clear(); return sendRequest(fbdo, &req); @@ -262,7 +262,7 @@ bool FB_Firestore::listCollectionIds(FirebaseData *fbdo, const char *projectId, fbdo->_ss.json.add(tmp, pageToken); ut->delS(tmp); - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); return sendRequest(fbdo, &req); } diff --git a/src/firestore/FB_Firestore.h b/src/firestore/FB_Firestore.h index ae0d6e025..d4b656922 100644 --- a/src/firestore/FB_Firestore.h +++ b/src/firestore/FB_Firestore.h @@ -1,15 +1,15 @@ /** - * Google's Cloud Firestore class, Forestore.h version 1.0.3 + * Google's Cloud Firestore class, Forestore.h version 1.0.5 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 21, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/functions/FB_Functions.cpp b/src/functions/FB_Functions.cpp index 3a02ec306..c13756e31 100644 --- a/src/functions/FB_Functions.cpp +++ b/src/functions/FB_Functions.cpp @@ -3,13 +3,13 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -53,7 +53,7 @@ bool FB_Functions::callFunction(FirebaseData *fbdo, const char *projectId, const char *tmp = ut->strP(fb_esp_pgm_str_135); fbdo->_ss.json.clear(); fbdo->_ss.json.add(tmp, data); - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); fbdo->_ss.json.clear(); ut->delS(tmp); return sendRequest(fbdo, &req); @@ -230,7 +230,7 @@ bool FB_Functions::uploadSources(FirebaseData *fbdo, FunctionsConfig *config) struct fb_esp_functions_req_t req; req.requestType = fb_esp_functions_request_type_upload_bucket_sources; - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); fbdo->_ss.json.clear(); @@ -288,7 +288,7 @@ bool FB_Functions::deploy(FirebaseData *fbdo, const char *functionId, FunctionsC t.clear(); std::string str; - fbdo->_ss.json._tostr(str); + fbdo->_ss.json.int_tostr(str); fbdo->_ss.json.clear(); char *find = ut->strP(fb_esp_pgm_str_3); @@ -325,7 +325,7 @@ bool FB_Functions::deploy(FirebaseData *fbdo, const char *functionId, FunctionsC std::string().swap(t); } - config->_funcCfg._tostr(req.payload); + config->_funcCfg.int_tostr(req.payload); config->_funcCfg.clear(); return sendRequest(fbdo, &req); @@ -377,7 +377,7 @@ bool FB_Functions::setIamPolicy(FirebaseData *fbdo, const char *projectId, const ut->delS(tmp); } - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); fbdo->_ss.json.clear(); return sendRequest(fbdo, &req); @@ -497,7 +497,7 @@ bool FB_Functions::generateDownloadUrl(FirebaseData *fbdo, const char *projectId ut->delS(tmp); } - fbdo->_ss.json._tostr(req.payload); + fbdo->_ss.json.int_tostr(req.payload); fbdo->_ss.json.clear(); return sendRequest(fbdo, &req); diff --git a/src/functions/FB_Functions.h b/src/functions/FB_Functions.h index ab0b7c249..6f1e7ac5f 100644 --- a/src/functions/FB_Functions.h +++ b/src/functions/FB_Functions.h @@ -3,13 +3,13 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/functions/PocicyBuilder.cpp b/src/functions/PocicyBuilder.cpp index 84dee6814..9e13f0782 100644 --- a/src/functions/PocicyBuilder.cpp +++ b/src/functions/PocicyBuilder.cpp @@ -1,15 +1,15 @@ /** - * Google's IAM Policy Builder class, PolicyBuilder.cpp version 1.0.0 + * Google's IAM Policy Builder class, PolicyBuilder.cpp version 1.0.1 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 17, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -346,7 +346,7 @@ void PolicyBuilder::toString(String &s, bool prettify) void PolicyBuilder::_toString(std::string &s, bool prettify) { - json._tostr(s, prettify); + json.int_tostr(s, prettify); } #endif \ No newline at end of file diff --git a/src/functions/PolicyBuilder.h b/src/functions/PolicyBuilder.h index 3b4b598f5..15b8df623 100644 --- a/src/functions/PolicyBuilder.h +++ b/src/functions/PolicyBuilder.h @@ -1,15 +1,15 @@ /** - * Google's IAM Policy Builder class, PolicyBuilder.h version 1.0.0 + * Google's IAM Policy Builder class, PolicyBuilder.h version 1.0.1 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 17, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/gcs/GCS.cpp b/src/gcs/GCS.cpp index e4171ffaa..d09e90471 100644 --- a/src/gcs/GCS.cpp +++ b/src/gcs/GCS.cpp @@ -3,13 +3,13 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -554,7 +554,7 @@ bool GG_CloudStorage::gcs_sendRequest(FirebaseData *fbdo, struct fb_esp_gcs_req_ bool hasProps = false; setRequestproperties(req, &fbdo->_ss.json, hasProps); - fbdo->_ss.json._tostr(payload); + fbdo->_ss.json.int_tostr(payload); ut->appendP(header, fb_esp_pgm_str_12); diff --git a/src/gcs/GCS.h b/src/gcs/GCS.h index e2d1526af..05cc80e51 100644 --- a/src/gcs/GCS.h +++ b/src/gcs/GCS.h @@ -3,13 +3,13 @@ * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/json/FirebaseJson.cpp b/src/json/FirebaseJson.cpp index e760bb8ea..e984d0f30 100644 --- a/src/json/FirebaseJson.cpp +++ b/src/json/FirebaseJson.cpp @@ -1,9 +1,9 @@ /* - * FirebaseJson, version 2.3.10 + * FirebaseJson, version 2.3.11 * - * The Easiest ESP8266/ESP32 Arduino library for parse, create and edit JSON object using a relative path. + * The Easiest Arduino library to parse, create and edit JSON object using a relative path. * - * December 24, 2020 + * March 25, 2021 * * Features * - None recursive operations @@ -14,7 +14,7 @@ * The zserge's JSON object parser library used as part of this library * * The MIT License (MIT) - * Copyright (c) 2020 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * Copyright (c) 2012–2018, Serge Zaitsev, zaitsev.serge@gmail.com * * @@ -44,2235 +44,2291 @@ //Teensy 3.0, 3.2,3.5,3.6, 4.0 and 4.1 #if defined(__arm__) && defined(TEENSYDUINO) && (defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__)) -extern "C" { -int __exidx_start() { return -1; } -int __exidx_end() { return -1; } +extern "C" +{ + int __exidx_start() { return -1; } + int __exidx_end() { return -1; } } #endif FirebaseJson::FirebaseJson() { - _init(); + _init(); } FirebaseJson::FirebaseJson(std::string &data) { - _init(); - _setJsonData(data); + _init(); + _setJsonData(data); } FirebaseJson::~FirebaseJson() { - clear(); - _topLevelTkType = JSMN_OBJECT; - _parser.reset(); - _parser = nullptr; - _finalize(); + clear(); + _topLevelTkType = JSMN_OBJECT; + _parser.reset(); + _parser = nullptr; + _finalize(); } void FirebaseJson::_init() { - _finalize(); - _qt = _getPGMString(FirebaseJson_STR_2); - _tab = _getPGMString(FirebaseJson_STR_22); - _brk1 = _getPGMString(FirebaseJson_STR_8); - _brk2 = _getPGMString(FirebaseJson_STR_9); - _brk3 = _getPGMString(FirebaseJson_STR_10); - _brk4 = _getPGMString(FirebaseJson_STR_11); - _cm = _getPGMString(FirebaseJson_STR_1); - _pr2 = _getPGMString(FirebaseJson_STR_3); - _nl = _getPGMString(FirebaseJson_STR_24); - _nll = _getPGMString(FirebaseJson_STR_18); - _pr = _getPGMString(FirebaseJson_STR_25); - _pd = _getPGMString(FirebaseJson_STR_4); - _pf = _getPGMString(FirebaseJson_STR_5); - _fls = _getPGMString(FirebaseJson_STR_6); - _tr = _getPGMString(FirebaseJson_STR_7); - _string = _getPGMString(FirebaseJson_STR_12); - _int = _getPGMString(FirebaseJson_STR_13); - _dbl = _getPGMString(FirebaseJson_STR_14); - _bl = _getPGMString(FirebaseJson_STR_15); - _obj = _getPGMString(FirebaseJson_STR_16); - _arry = _getPGMString(FirebaseJson_STR_17); - _undef = _getPGMString(FirebaseJson_STR_19); - _dot = _getPGMString(FirebaseJson_STR_20); + _finalize(); + _qt = strP(FirebaseJson_STR_2); + _tab = strP(FirebaseJson_STR_22); + _brk1 = strP(FirebaseJson_STR_8); + _brk2 = strP(FirebaseJson_STR_9); + _brk3 = strP(FirebaseJson_STR_10); + _brk4 = strP(FirebaseJson_STR_11); + _cm = strP(FirebaseJson_STR_1); + _pr2 = strP(FirebaseJson_STR_3); + _nl = strP(FirebaseJson_STR_24); + _nll = strP(FirebaseJson_STR_18); + _pr = strP(FirebaseJson_STR_25); + _pd = strP(FirebaseJson_STR_4); + _pf = strP(FirebaseJson_STR_5); + _fls = strP(FirebaseJson_STR_6); + _tr = strP(FirebaseJson_STR_7); + _string = strP(FirebaseJson_STR_12); + _int = strP(FirebaseJson_STR_13); + _dbl = strP(FirebaseJson_STR_14); + _bl = strP(FirebaseJson_STR_15); + _obj = strP(FirebaseJson_STR_16); + _arry = strP(FirebaseJson_STR_17); + _undef = strP(FirebaseJson_STR_19); + _dot = strP(FirebaseJson_STR_20); } void FirebaseJson::_finalize() { - _delPtr(_qt); - _delPtr(_tab); - _delPtr(_brk1); - _delPtr(_brk2); - _delPtr(_brk3); - _delPtr(_brk4); - _delPtr(_cm); - _delPtr(_pr2); - _delPtr(_nl); - _delPtr(_nll); - _delPtr(_pr); - _delPtr(_pd); - _delPtr(_pf); - _delPtr(_fls); - _delPtr(_tr); - _delPtr(_string); - _delPtr(_int); - _delPtr(_dbl); - _delPtr(_bl); - _delPtr(_obj); - _delPtr(_arry); - _delPtr(_undef); - _delPtr(_dot); + delS(_qt); + delS(_tab); + delS(_brk1); + delS(_brk2); + delS(_brk3); + delS(_brk4); + delS(_cm); + delS(_pr2); + delS(_nl); + delS(_nll); + delS(_pr); + delS(_pd); + delS(_pf); + delS(_fls); + delS(_tr); + delS(_string); + delS(_int); + delS(_dbl); + delS(_bl); + delS(_obj); + delS(_arry); + delS(_undef); + delS(_dot); } FirebaseJson &FirebaseJson::_setJsonData(std::string &data) { - return setJsonData(data.c_str()); + return setJsonData(data.c_str()); } FirebaseJson &FirebaseJson::setJsonData(const String &data) { - _topLevelTkType = JSMN_OBJECT; - if (data.length() > 0) - { - int p1 = _strpos(data.c_str(), _brk1, 0); - int p2 = _rstrpos(data.c_str(), _brk2, data.length() - 1); - if (p1 != -1) - p1 += 1; - if (p1 != -1 && p2 != -1) - _rawbuf = data.substring(p1, p2).c_str(); - else - { - p1 = _strpos(data.c_str(), _brk3, 0); - p2 = _rstrpos(data.c_str(), _brk4, data.length() - 1); - if (p1 != -1) - p1 += 1; - if (p1 != -1 && p2 != -1) - { - char *_r = _getPGMString(FirebaseJson_STR_21); - _rawbuf = _r; - _rawbuf += data.c_str(); - _delPtr(_r); - _topLevelTkType = JSMN_ARRAY; - } - else - { - _rawbuf = data.c_str(); - _topLevelTkType = JSMN_PRIMITIVE; - } - } - } + _topLevelTkType = JSMN_OBJECT; + if (data.length() > 0) + { + int p1 = strpos(data.c_str(), _brk1, 0); + int p2 = rstrpos(data.c_str(), _brk2, data.length() - 1); + if (p1 != -1) + p1 += 1; + if (p1 != -1 && p2 != -1) + _rawbuf = data.substring(p1, p2).c_str(); else - _rawbuf.clear(); - - return *this; + { + p1 = strpos(data.c_str(), _brk3, 0); + p2 = rstrpos(data.c_str(), _brk4, data.length() - 1); + if (p1 != -1) + p1 += 1; + if (p1 != -1 && p2 != -1) + { + char *_r = strP(FirebaseJson_STR_21); + _rawbuf = _r; + _rawbuf += data.c_str(); + delS(_r); + _topLevelTkType = JSMN_ARRAY; + } + else + { + _rawbuf = data.c_str(); + _topLevelTkType = JSMN_PRIMITIVE; + } + } + } + else + _rawbuf.clear(); + + return *this; } FirebaseJson &FirebaseJson::clear() { - std::string().swap(_rawbuf); - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - clearPathTk(); - _tokens.reset(); - _tokens = nullptr; - _topLevelTkType = JSMN_OBJECT; - return *this; + std::string().swap(_rawbuf); + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + clearPathTk(); + _tokens.reset(); + _tokens = nullptr; + _topLevelTkType = JSMN_OBJECT; + return *this; } FirebaseJson &FirebaseJson::add(const String &key) { - _addNull(key.c_str()); - return *this; + _addNull(key.c_str()); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, const String &value) { - _addString(key.c_str(), value.c_str()); - return *this; + _addString(key.c_str(), value.c_str()); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, const char *value) { - _addString(key.c_str(), value); - return *this; + _addString(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, int value) { - _addInt(key.c_str(), value); - return *this; + _addInt(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, unsigned short value) { - _addInt(key.c_str(), value); - return *this; + _addInt(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, float value) { - _addFloat(key.c_str(), value); - return *this; + _addFloat(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, double value) { - _addDouble(key.c_str(), value); - return *this; + _addDouble(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, bool value) { - _addBool(key.c_str(), value); - return *this; + _addBool(key.c_str(), value); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, FirebaseJson &json) { - _addJson(key.c_str(), &json); - return *this; + _addJson(key.c_str(), &json); + return *this; } FirebaseJson &FirebaseJson::add(const String &key, FirebaseJsonArray &arr) { - _addArray(key.c_str(), &arr); - return *this; + _addArray(key.c_str(), &arr); + return *this; } template FirebaseJson &FirebaseJson::add(const String &key, T value) { - if (std::is_same::value) - _addInt(key, value); - else if (std::is_same::value) - _addFloat(key, value); - else if (std::is_same::value) - _addDouble(key, value); - else if (std::is_same::value) - _addBool(key, value); - else if (std::is_same::value) - _addString(key, value); - else if (std::is_same::value) - _addJson(key, &value); - else if (std::is_same::value) - _addArray(key, &value); - return *this; + if (std::is_same::value) + _addInt(key, value); + else if (std::is_same::value) + _addFloat(key, value); + else if (std::is_same::value) + _addDouble(key, value); + else if (std::is_same::value) + _addBool(key, value); + else if (std::is_same::value) + _addString(key, value); + else if (std::is_same::value) + _addJson(key, &value); + else if (std::is_same::value) + _addArray(key, &value); + return *this; } void FirebaseJson::_addString(const std::string &key, const std::string &value) { - _add(key.c_str(), value.c_str(), key.length(), value.length(), true, true); + _add(key.c_str(), value.c_str(), key.length(), value.length(), true, true); } void FirebaseJson::_addInt(const std::string &key, int value) { - char *buf = getIntString(value); - _add(key.c_str(), buf, key.length(), 60, false, true); - _delPtr(buf); + char *buf = intStr(value); + _add(key.c_str(), buf, key.length(), 60, false, true); + delS(buf); } void FirebaseJson::_addFloat(const std::string &key, float value) { - char *buf = getFloatString(value); - _trimDouble(buf); - _add(key.c_str(), buf, key.length(), 60, false, true); - _delPtr(buf); + char *buf = floatStr(value); + _trimDouble(buf); + _add(key.c_str(), buf, key.length(), 60, false, true); + delS(buf); } void FirebaseJson::_addDouble(const std::string &key, double value) { - char *buf = getDoubleString(value); - _trimDouble(buf); - _add(key.c_str(), buf, key.length(), 60, false, true); - _delPtr(buf); + char *buf = doubleStr(value); + _trimDouble(buf); + _add(key.c_str(), buf, key.length(), 60, false, true); + delS(buf); } void FirebaseJson::_addBool(const std::string &key, bool value) { - if (value) - _add(key.c_str(), _tr, key.length(), 6, false, true); - else - _add(key.c_str(), _fls, key.length(), 7, false, true); + if (value) + _add(key.c_str(), _tr, key.length(), 6, false, true); + else + _add(key.c_str(), _fls, key.length(), 7, false, true); } void FirebaseJson::_addNull(const std::string &key) { - _add(key.c_str(), _nll, key.length(), 6, false, true); + _add(key.c_str(), _nll, key.length(), 6, false, true); } void FirebaseJson::_addJson(const std::string &key, FirebaseJson *json) { - std::string s; - json->_toStdString(s); - _add(key.c_str(), s.c_str(), key.length(), s.length(), false, true); - std::string().swap(s); + std::string s; + json->_toStdString(s); + _add(key.c_str(), s.c_str(), key.length(), s.length(), false, true); + std::string().swap(s); } void FirebaseJson::_addArray(const std::string &key, FirebaseJsonArray *arr) { - String arrStr; - arr->toString(arrStr); - _add(key.c_str(), arrStr.c_str(), key.length(), arrStr.length(), false, true); + String arrStr; + arr->toString(arrStr); + _add(key.c_str(), arrStr.c_str(), key.length(), arrStr.length(), false, true); } -char *FirebaseJson::getFloatString(float value) +char *FirebaseJson::floatStr(float value) { - char *buf = _newPtr(36); - dtostrf(value, 7, 6, buf); - return buf; + char *buf = newS(36); + helper.dtostrf(value, 7, 6, buf); + return buf; } -char *FirebaseJson::getIntString(int value) +char *FirebaseJson::intStr(int value) { - char *buf = _newPtr(36); - sprintf(buf, "%d", value); - return buf; + char *buf = newS(36); + sprintf(buf, "%d", value); + return buf; } -char *FirebaseJson::getBoolString(bool value) +char *FirebaseJson::boolStr(bool value) { - char *buf = nullptr; - if (value) - buf = _getPGMString(FirebaseJson_STR_7); - else - buf = _getPGMString(FirebaseJson_STR_6); - return buf; + char *buf = nullptr; + if (value) + buf = strP(FirebaseJson_STR_7); + else + buf = strP(FirebaseJson_STR_6); + return buf; } -char *FirebaseJson::getDoubleString(double value) +char *FirebaseJson::doubleStr(double value) { - char *buf = _newPtr(36); - dtostrf(value, 12, 9, buf); - return buf; + char *buf = newS(36); + helper.dtostrf(value, 12, 9, buf); + return buf; } void FirebaseJson::_trimDouble(char *buf) { - size_t i = strlen(buf) - 1; - while (buf[i] == '0' && i > 0) + size_t i = strlen(buf) - 1; + while (buf[i] == '0' && i > 0) + { + if (buf[i - 1] == '.') { - if (buf[i - 1] == '.') - { - i--; - break; - } - if (buf[i - 1] != '0') - break; - i--; + i--; + break; } - if (i < strlen(buf) - 1) - buf[i] = '\0'; + if (buf[i - 1] != '0') + break; + i--; + } + if (i < strlen(buf) - 1) + buf[i] = '\0'; } void FirebaseJson::toString(String &buf, bool prettify) { - char *nbuf = _newPtr(2); - if (prettify) - _parse(nbuf, PRINT_MODE_PRETTY); - else - _parse(nbuf, PRINT_MODE_PLAIN); - buf = _jsonData._dbuf.c_str(); - std::string() - .swap(_jsonData._dbuf); - _delPtr(nbuf); + if (prettify) + _parse("", PRINT_MODE_PRETTY); + else + _parse("", PRINT_MODE_PLAIN); + buf = _jsonData._dbuf.c_str(); + std::string().swap(_jsonData._dbuf); +} + +void FirebaseJson::int_tostr(std::string &s, bool prettify) +{ + _tostr(s, prettify); } void FirebaseJson::_tostr(std::string &s, bool prettify) { - char *nbuf = _newPtr(2); - if (prettify) - _parse(nbuf, PRINT_MODE_PRETTY); - else - _parse(nbuf, PRINT_MODE_PLAIN); - s = _jsonData._dbuf; - std::string().swap(_jsonData._dbuf); - _delPtr(nbuf); + if (prettify) + _parse("", PRINT_MODE_PRETTY); + else + _parse("", PRINT_MODE_PLAIN); + s = _jsonData._dbuf; + std::string().swap(_jsonData._dbuf); } -void FirebaseJson::_toStdString(std::string &s, bool isJson) +void FirebaseJson::int_toStdString(std::string &s, bool isJson) { - s.clear(); - size_t bufSize = 10; - char *buf = _newPtr(bufSize); - if (_topLevelTkType != JSMN_PRIMITIVE) - { - if (isJson) - strcat(buf, _brk1); - else - strcat(buf, _brk3); - } + _toStdString(s, isJson); +} - s += buf; - s += _rawbuf; - buf = _newPtr(buf, bufSize); - if (_topLevelTkType != JSMN_PRIMITIVE) - { - if (isJson) - strcat(buf, _brk2); - else - strcat(buf, _brk4); - } - s += buf; - _delPtr(buf); +void FirebaseJson::_toStdString(std::string &s, bool isJson) +{ + s.clear(); + size_t bufSize = 20; + char *buf = newS(bufSize); + if (_topLevelTkType != JSMN_PRIMITIVE) + { + if (isJson) + strcat(buf, _brk1); + else + strcat(buf, _brk3); + } + + s += buf; + s += _rawbuf; + memset(buf, 0, bufSize); + if (_topLevelTkType != JSMN_PRIMITIVE) + { + if (isJson) + strcat(buf, _brk2); + else + strcat(buf, _brk4); + } + s += buf; + delS(buf); } FirebaseJson &FirebaseJson::_add(const char *key, const char *value, size_t klen, size_t vlen, bool isString, bool isJson) { - size_t bufSize = klen + vlen + 1024; - char *buf = _newPtr(bufSize); - if (_rawbuf.length() > 0) - strcpy_P(buf, FirebaseJson_STR_1); - if (isJson) - { - strcat(buf, _qt); - strcat(buf, key); - strcat(buf, _qt); - strcat_P(buf, _pr2); - } - if (isString) - strcat(buf, _qt); - strcat(buf, value); - if (isString) - strcat(buf, _qt); - _rawbuf += buf; - _delPtr(buf); - return *this; + size_t bufSize = klen + vlen + 1024; + char *buf = newS(bufSize); + if (_rawbuf.length() > 0) + strcpy_P(buf, FirebaseJson_STR_1); + if (isJson) + { + strcat(buf, _qt); + strcat(buf, key); + strcat(buf, _qt); + strcat_P(buf, _pr2); + } + if (isString) + strcat(buf, _qt); + strcat(buf, value); + if (isString) + strcat(buf, _qt); + _rawbuf += buf; + delS(buf); + return *this; } FirebaseJson &FirebaseJson::_addArrayStr(const char *value, size_t len, bool isString) { - char *nbuf = _newPtr(2); - _add(nbuf, value, 0, len, isString, false); - _delPtr(nbuf); - return *this; + _add("", value, 0, len, isString, false); + return *this; } bool FirebaseJson::get(FirebaseJsonData &jsonData, const String &path, bool prettify) { - clearPathTk(); - _strToTk(path.c_str(), _pathTk, '/'); - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - if (prettify) - _parse(path.c_str(), PRINT_MODE_PRETTY); + clearPathTk(); + _strToTk(path.c_str(), _pathTk, '/'); + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + if (prettify) + _parse(path.c_str(), PRINT_MODE_PRETTY); + else + _parse(path.c_str(), PRINT_MODE_PLAIN); + if (_jsonData.success) + { + if (_jsonData._type == FirebaseJson::JSMN_STRING && _jsonData._dbuf.c_str()[0] == '"' && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] == '"') + _jsonData.stringValue = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2).c_str(); else - _parse(path.c_str(), PRINT_MODE_PLAIN); - if (_jsonData.success) - { - if (_jsonData._type == FirebaseJson::JSMN_STRING && _jsonData._dbuf.c_str()[0] == '"' && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] == '"') - _jsonData.stringValue = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2).c_str(); - else - _jsonData.stringValue = _jsonData._dbuf.c_str(); - } - jsonData = _jsonData; - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - clearPathTk(); - _tokens.reset(); - _tokens = nullptr; - return _jsonData.success; + _jsonData.stringValue = _jsonData._dbuf.c_str(); + } + jsonData = _jsonData; + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + clearPathTk(); + _tokens.reset(); + _tokens = nullptr; + return _jsonData.success; } size_t FirebaseJson::iteratorBegin(const char *data) { - if (data) - setJsonData(data); - _fbjs_parse(true); - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - char *nbuf = _newPtr(2); - strcpy(buf, s.c_str()); - std::string().swap(s); - int depth = -1; - _collectTk = true; - _eltk.clear(); - for (uint16_t i = 0; i < _tokenCount; i++) - _parseToken(i, buf, depth, nbuf, -2, PRINT_MODE_NONE); - _el.clear(); - _delPtr(buf); - _delPtr(nbuf); - return _eltk.size(); + if (data) + setJsonData(data); + _fbjs_parse(true); + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + int depth = -1; + _collectTk = true; + _eltk.clear(); + for (uint16_t i = 0; i < _tokenCount; i++) + _parseToken(i, buf, depth, "", -2, PRINT_MODE_NONE); + _el.clear(); + delS(buf); + return _eltk.size(); } void FirebaseJson::iteratorEnd() { - _eltk.clear(); - clearPathTk(); - _jsonData.stringValue = ""; - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - clearPathTk(); - _tokens.reset(); - _tokens = nullptr; + _eltk.clear(); + clearPathTk(); + _jsonData.stringValue = ""; + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + clearPathTk(); + _tokens.reset(); + _tokens = nullptr; } void FirebaseJson::iteratorGet(size_t index, int &type, String &key, String &value) { - if (_eltk.size() < index + 1) - return; - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - if (_eltk[index].type == 0) - { - FirebaseJson::fbjs_tok_t *h = &_tokens.get()[_eltk[index].index]; - size_t len = h->end - h->start + 3; - char *k = _newPtr(len); - strncpy(k, buf + h->start, h->end - h->start); - FirebaseJson::fbjs_tok_t *g = &_tokens.get()[_eltk[index].index + 1]; - size_t len2 = g->end - g->start + 3; - char *v = _newPtr(len2); - strncpy(v, buf + g->start, g->end - g->start); - key = k; - value = v; - type = JSON_OBJECT; - _delPtr(k); - _delPtr(v); - } - else if (_eltk[index].type == 1) - { - FirebaseJson::fbjs_tok_t *g = &_tokens.get()[_eltk[index].index]; - size_t len2 = g->end - g->start + 3; - char *v = _newPtr(len2); - strncpy(v, buf + g->start, g->end - g->start); - value = v; - key = ""; - type = JSON_ARRAY; - _delPtr(v); - } - _delPtr(buf); + if (_eltk.size() < index + 1) + return; + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + if (_eltk[index].type == 0) + { + FirebaseJson::fbjs_tok_t *h = &_tokens.get()[_eltk[index].index]; + size_t len = h->end - h->start + 3; + char *k = newS(len); + strncpy(k, buf + h->start, h->end - h->start); + FirebaseJson::fbjs_tok_t *g = &_tokens.get()[_eltk[index].index + 1]; + size_t len2 = g->end - g->start + 3; + char *v = newS(len2); + strncpy(v, buf + g->start, g->end - g->start); + key = k; + value = v; + type = JSON_OBJECT; + delS(k); + delS(v); + } + else if (_eltk[index].type == 1) + { + FirebaseJson::fbjs_tok_t *g = &_tokens.get()[_eltk[index].index]; + size_t len2 = g->end - g->start + 3; + char *v = newS(len2); + strncpy(v, buf + g->start, g->end - g->start); + value = v; + key = ""; + type = JSON_ARRAY; + delS(v); + } + delS(buf); } void FirebaseJson::_fbjs_parse(bool collectTk) { - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - _tokens.reset(); - _collectTk = collectTk; - _eltk.clear(); - int cnt = fbjs_parse(_parser.get(), buf, bufLen, (FirebaseJson::fbjs_tok_t *)NULL, 0); - int cnt2 = 0; - int a = 0; - int b = 0; - for (int i = 0; i < bufLen; i++) - { - if (buf[i] == ',') - a++; - else if (buf[i] == '[' || buf[i] == '{') - b++; - } - cnt2 = 10 + (2 * (a + 1)) + b; - - if (cnt < cnt2) - cnt = cnt2; - - _tokens = std::shared_ptr(new FirebaseJson::fbjs_tok_t[cnt + 10]); - fbjs_init(_parser.get()); - _tokenCount = fbjs_parse(_parser.get(), buf, bufLen, _tokens.get(), cnt + 10); - _paresRes = true; - if (_tokenCount < 0) - _paresRes = false; - if (_tokenCount < 1 || _tokens.get()[0].type != FirebaseJson::JSMN_OBJECT) - _paresRes = false; - _jsonData.success = _paresRes; - _nextToken = 0; - _nextDepth = 0; - _tokenMatch = false; - _refToken = -1; - _resetParseResult(); - _setElementType(); - _delPtr(buf); + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + _tokens.reset(); + _collectTk = collectTk; + _eltk.clear(); + int cnt = fbjs_parse(_parser.get(), buf, bufLen, (FirebaseJson::fbjs_tok_t *)NULL, 0); + int cnt2 = 0; + int a = 0; + int b = 0; + for (int i = 0; i < bufLen; i++) + { + if (buf[i] == ',') + a++; + else if (buf[i] == '[' || buf[i] == '{') + b++; + } + cnt2 = 10 + (2 * (a + 1)) + b; + + if (cnt < cnt2) + cnt = cnt2; + + _tokens = std::shared_ptr(new FirebaseJson::fbjs_tok_t[cnt + 10]); + fbjs_init(_parser.get()); + _tokenCount = fbjs_parse(_parser.get(), buf, bufLen, _tokens.get(), cnt + 10); + _paresRes = true; + if (_tokenCount < 0) + _paresRes = false; + if (_tokenCount < 1 || _tokens.get()[0].type != FirebaseJson::JSMN_OBJECT) + _paresRes = false; + _jsonData.success = _paresRes; + _nextToken = 0; + _nextDepth = 0; + _tokenMatch = false; + _refToken = -1; + _resetParseResult(); + _setElementType(); + delS(buf); } void FirebaseJson::_setMark(int depth, bool mark) { - for (size_t i = 0; i < _el.size(); i++) + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) { - if (_el[i].depth == depth - 1) - { - _el[i].omark = mark; - break; - } + _el[i].omark = mark; + break; } + } } void FirebaseJson::_setSkip(int depth, bool skip) { - for (size_t i = 0; i < _el.size(); i++) + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) { - if (_el[i].depth == depth - 1) - { - _el[i].skip = skip; - break; - } + _el[i].skip = skip; + break; } + } } void FirebaseJson::_setRef(int depth, bool ref) { - for (size_t i = 0; i < _el.size(); i++) + for (size_t i = 0; i < _el.size(); i++) + { + if (ref) { - if (ref) - { - if (_el[i].depth == depth - 1) - { - _el[i].ref = ref; - break; - } - } - else - _el[i].ref = false; + if (_el[i].depth == depth - 1) + { + _el[i].ref = ref; + break; + } } + else + _el[i].ref = false; + } } void FirebaseJson::_getTkIndex(int depth, tk_index_t &tk) { - tk.oindex = 0; - tk.olen = 0; - tk.omark = false; - tk.type = FirebaseJson::JSMN_UNDEFINED; - tk.depth = -1; - tk.skip = false; - tk.ref = false; - tk.index = -1; - for (size_t i = 0; i < _el.size(); i++) - { - if (_el[i].depth == depth - 1) - { - tk.index = _el[i].index; - tk.omark = _el[i].omark; - tk.ref = _el[i].ref; - tk.type = _el[i].type; - tk.depth = _el[i].depth; - tk.oindex = _el[i].oindex; - tk.olen = _el[i].olen; - tk.skip = _el[i].skip; - break; - } - } -} - -bool FirebaseJson::_updateTkIndex(uint16_t index, int &depth, char *searchKey, int searchIndex, char *replace, PRINT_MODE printMode, bool advanceCount) -{ - int len = -1; - bool skip = false; - bool ref = false; - for (size_t i = 0; i < _el.size(); i++) - { - if (_el[i].depth == depth - 1) + tk.oindex = 0; + tk.olen = 0; + tk.omark = false; + tk.type = FirebaseJson::JSMN_UNDEFINED; + tk.depth = -1; + tk.skip = false; + tk.ref = false; + tk.index = -1; + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) + { + tk.index = _el[i].index; + tk.omark = _el[i].omark; + tk.ref = _el[i].ref; + tk.type = _el[i].type; + tk.depth = _el[i].depth; + tk.oindex = _el[i].oindex; + tk.olen = _el[i].olen; + tk.skip = _el[i].skip; + break; + } + } +} + +bool FirebaseJson::_updateTkIndex(uint16_t index, int &depth, const char *searchKey, int searchIndex, const char *replace, PRINT_MODE printMode, bool advanceCount) +{ + int len = -1; + bool skip = false; + bool ref = false; + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) + { + if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + { + _el[i].oindex++; + if (_el[i].oindex >= _el[i].olen) { - if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + depth = _el[i].depth; + len = _el[i].olen; + skip = _el[i].skip; + if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) + ref = _el[i].ref; + else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) + ref = _el[i].ref; + if (i > 0) + _el.erase(_el.begin() + i); + else + _el.erase(_el.begin()); + if (printMode != PRINT_MODE_NONE && !skip) + { + if (len > 0 && !_arrReplaced) + { + if (ref) + _jsonData._dbuf += _cm; + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + { + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && !ref) + { + for (int j = 0; j < depth + 1; j++) + _jsonData._dbuf += _tab; + } + } + } + if (ref) { - _el[i].oindex++; - if (_el[i].oindex >= _el[i].olen) + if (!advanceCount) + _parseCompleted++; + + if (!_arrReplaced) + { + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + { + if (printMode == PRINT_MODE_PRETTY) + { + for (int j = 0; j < depth + 2; j++) + _jsonData._dbuf += _tab; + } + _jsonData._dbuf += _qt; + _jsonData._dbuf += searchKey; + _jsonData._dbuf += _qt; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _pr; + else + _jsonData._dbuf += _pr2; + if (_parseCompleted == (int)_pathTk.size()) + _jsonData._dbuf += replace; + else + _insertChilds(replace, printMode); + _arrReplaced = true; + if (printMode == PRINT_MODE_PRETTY) + { + _jsonData._dbuf += _nl; + for (int j = 0; j < depth + 1; j++) + _jsonData._dbuf += _tab; + } + } + else { - depth = _el[i].depth; - len = _el[i].olen; - skip = _el[i].skip; - if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) - ref = _el[i].ref; - else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) - ref = _el[i].ref; - if (i > 0) - _el.erase(_el.begin() + i); + for (int k = _el[i].oindex - 1; k < searchIndex; k++) + { + if (printMode == PRINT_MODE_PRETTY) + { + _jsonData._dbuf += _nl; + for (int j = 0; j < depth + 2; j++) + _jsonData._dbuf += _tab; + } + if (k == searchIndex - 1) + { + if (_parseCompleted == (int)_pathTk.size()) + _jsonData._dbuf += replace; + else + _insertChilds(replace, printMode); + _arrReplaced = true; + } else - _el.erase(_el.begin()); - if (printMode != PRINT_MODE_NONE && !skip) { - if (len > 0 && !_arrReplaced) - { - if (ref) - _jsonData._dbuf += _cm; - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - { - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && !ref) - { - for (int j = 0; j < depth + 1; j++) - _jsonData._dbuf += _tab; - } - } - } - if (ref) - { - if (!advanceCount) - _parseCompleted++; - - if (!_arrReplaced) - { - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - { - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < depth + 2; j++) - _jsonData._dbuf += _tab; - } - _jsonData._dbuf += _qt; - _jsonData._dbuf += searchKey; - _jsonData._dbuf += _qt; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _pr; - else - _jsonData._dbuf += _pr2; - if (_parseCompleted == (int)_pathTk.size()) - _jsonData._dbuf += replace; - else - _insertChilds(replace, printMode); - _arrReplaced = true; - if (printMode == PRINT_MODE_PRETTY) - { - _jsonData._dbuf += _nl; - for (int j = 0; j < depth + 1; j++) - _jsonData._dbuf += _tab; - } - } - else - { - for (int k = _el[i].oindex - 1; k < searchIndex; k++) - { - if (printMode == PRINT_MODE_PRETTY) - { - _jsonData._dbuf += _nl; - for (int j = 0; j < depth + 2; j++) - _jsonData._dbuf += _tab; - } - if (k == searchIndex - 1) - { - if (_parseCompleted == (int)_pathTk.size()) - _jsonData._dbuf += replace; - else - _insertChilds(replace, printMode); - _arrReplaced = true; - } - else - { - _jsonData._dbuf += _nll; - _jsonData._dbuf += _cm; - } - } - } - } - _setRef(depth, false); - if (!advanceCount) - _parseCompleted = _pathTk.size(); - } - - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - _jsonData._dbuf += _brk2; - else - { - if (len > 0) - { - if (printMode == PRINT_MODE_PRETTY) - { - _jsonData._dbuf += _nl; - for (int j = 0; j < depth + 1; j++) - _jsonData._dbuf += _tab; - } - } - _jsonData._dbuf += _brk4; - } + _jsonData._dbuf += _nll; + _jsonData._dbuf += _cm; } - return true; + } } + } + _setRef(depth, false); + if (!advanceCount) + _parseCompleted = _pathTk.size(); } - break; - } - } - return false; -} -bool FirebaseJson::_updateTkIndex2(std::string &str, uint16_t index, int &depth, char *searchKey, int searchIndex, char *replace, PRINT_MODE printMode) -{ - int len = -1; - bool skip = false; - bool ref = false; - for (size_t i = 0; i < _el.size(); i++) - { - if (_el[i].depth == depth - 1) - { - if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + _jsonData._dbuf += _brk2; + else { - _el[i].oindex++; - if (_el[i].oindex >= _el[i].olen) + if (len > 0) + { + if (printMode == PRINT_MODE_PRETTY) { - depth = _el[i].depth; - len = _el[i].olen; - skip = _el[i].skip; - if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) - ref = _el[i].ref; - else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) - ref = _el[i].ref; - if (i > 0) - _el.erase(_el.begin() + i); - else - _el.erase(_el.begin()); - if (printMode != PRINT_MODE_NONE && !skip) - { - if (len > 0) - { - if (printMode == PRINT_MODE_PRETTY) - str += _nl; - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - { - if (printMode == PRINT_MODE_PRETTY && !ref) - { - for (int j = 0; j < depth + 1; j++) - str += _tab; - } - } - else - { - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < depth + 1; j++) - str += _tab; - } - } - } - if (ref) - _setRef(depth, false); - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - str += _brk2; - else - str += _brk4; - } - return true; + _jsonData._dbuf += _nl; + for (int j = 0; j < depth + 1; j++) + _jsonData._dbuf += _tab; } + } + _jsonData._dbuf += _brk4; } - break; + } + return true; } + } + break; } - return false; + } + return false; } -bool FirebaseJson::_updateTkIndex3(uint16_t index, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode) +bool FirebaseJson::_updateTkIndex2(std::string &str, uint16_t index, int &depth, const char *searchKey, int searchIndex, const char *replace, PRINT_MODE printMode) { - int len = -1; - bool skip = false; - bool ref = false; - for (size_t i = 0; i < _el.size(); i++) + int len = -1; + bool skip = false; + bool ref = false; + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) { - if (_el[i].depth == depth - 1) + if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + { + _el[i].oindex++; + if (_el[i].oindex >= _el[i].olen) { - if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + depth = _el[i].depth; + len = _el[i].olen; + skip = _el[i].skip; + if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) + ref = _el[i].ref; + else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) + ref = _el[i].ref; + if (i > 0) + _el.erase(_el.begin() + i); + else + _el.erase(_el.begin()); + if (printMode != PRINT_MODE_NONE && !skip) + { + if (len > 0) { - _el[i].oindex++; - if (_el[i].oindex >= _el[i].olen) + if (printMode == PRINT_MODE_PRETTY) + str += _nl; + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + { + if (printMode == PRINT_MODE_PRETTY && !ref) { - depth = _el[i].depth; - len = _el[i].olen; - skip = _el[i].skip; - if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) - ref = _el[i].ref; - else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) - ref = _el[i].ref; - if (i > 0) - _el.erase(_el.begin() + i); - else - _el.erase(_el.begin()); - if (depth < _skipDepth) - return false; - if (printMode != PRINT_MODE_NONE && skip) - { - if (len > 0) - { - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - { - if (printMode == PRINT_MODE_PRETTY && !ref) - { - for (int j = 0; j < depth + 1 - (_skipDepth + 1); j++) - _jsonData._dbuf += _tab; - } - } - else - { - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < depth + 1 - (_skipDepth + 1); j++) - _jsonData._dbuf += _tab; - } - } - } - if (ref) - _setRef(depth, false); - - if (_el[i].type == FirebaseJson::JSMN_OBJECT) - _jsonData._dbuf += _brk2; - else - _jsonData._dbuf += _brk4; - } - return true; + for (int j = 0; j < depth + 1; j++) + str += _tab; } + } + else + { + if (printMode == PRINT_MODE_PRETTY) + { + for (int j = 0; j < depth + 1; j++) + str += _tab; + } + } } - break; + if (ref) + _setRef(depth, false); + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + str += _brk2; + else + str += _brk4; + } + return true; } + } + break; } - return false; + } + return false; } -void FirebaseJson::_insertChilds(char *data, PRINT_MODE printMode) +bool FirebaseJson::_updateTkIndex3(uint16_t index, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode) { - std::string str = ""; - for (int i = _pathTk.size() - 1; i > _parseCompleted - 1; i--) + int len = -1; + bool skip = false; + bool ref = false; + for (size_t i = 0; i < _el.size(); i++) + { + if (_el[i].depth == depth - 1) { - if (_isArrTk(i)) - { - std::string _str; - _addArrNodes(_str, str, i, data, printMode); - str = _str; - std::string().swap(_str); - } - else + if (_el[i].type == FirebaseJson::JSMN_OBJECT || _el[i].type == FirebaseJson::JSMN_ARRAY) + { + _el[i].oindex++; + if (_el[i].oindex >= _el[i].olen) { - std::string _str; - _addObjNodes(_str, str, i, data, printMode); - str = _str; - std::string().swap(_str); + depth = _el[i].depth; + len = _el[i].olen; + skip = _el[i].skip; + if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_OBJECT) + ref = _el[i].ref; + else if (!_TkRefOk && _el[i].type == FirebaseJson::JSMN_ARRAY && searchIndex > -1) + ref = _el[i].ref; + if (i > 0) + _el.erase(_el.begin() + i); + else + _el.erase(_el.begin()); + if (depth < _skipDepth) + return false; + if (printMode != PRINT_MODE_NONE && skip) + { + if (len > 0) + { + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + { + if (printMode == PRINT_MODE_PRETTY && !ref) + { + for (int j = 0; j < depth + 1 - (_skipDepth + 1); j++) + _jsonData._dbuf += _tab; + } + } + else + { + if (printMode == PRINT_MODE_PRETTY) + { + for (int j = 0; j < depth + 1 - (_skipDepth + 1); j++) + _jsonData._dbuf += _tab; + } + } + } + if (ref) + _setRef(depth, false); + + if (_el[i].type == FirebaseJson::JSMN_OBJECT) + _jsonData._dbuf += _brk2; + else + _jsonData._dbuf += _brk4; + } + return true; } + } + break; } - if ((int)_pathTk.size() == _parseCompleted) - str = data; - _jsonData._dbuf += str; - std::string().swap(str); + } + return false; } -void FirebaseJson::_addArrNodes(std::string &str, std::string &str2, int index, char *data, PRINT_MODE printMode) +void FirebaseJson::_insertChilds(const char *data, PRINT_MODE printMode) { - - int i = _getArrIndex(index); - str += _brk3; - if (printMode == PRINT_MODE_PRETTY) - str += _nl; - for (int k = 0; k <= i; k++) + std::string str = ""; + for (int i = _pathTk.size() - 1; i > _parseCompleted - 1; i--) + { + if (_isArrTk(i)) { - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < index + 1; j++) - str += _tab; - } - if (k == i) - { - if (index == (int)_pathTk.size() - 1) - str += data; - else - str += str2; - } - else - { - str += _nll; - str += _cm; - } - - if (printMode == PRINT_MODE_PRETTY) - str += _nl; + std::string _str; + _addArrNodes(_str, str, i, data, printMode); + str = _str; + std::string().swap(_str); } - - if (printMode == PRINT_MODE_PRETTY) + else { - for (int j = 0; j < index; j++) - str += _tab; + std::string _str; + _addObjNodes(_str, str, i, data, printMode); + str = _str; + std::string().swap(_str); } - str += _brk4; + } + if ((int)_pathTk.size() == _parseCompleted) + str = data; + _jsonData._dbuf += str; + std::string().swap(str); } -void FirebaseJson::_addObjNodes(std::string &str, std::string &str2, int index, char *data, PRINT_MODE printMode) +void FirebaseJson::_addArrNodes(std::string &str, std::string &str2, int index, const char *data, PRINT_MODE printMode) { - str += _brk1; + + int i = _getArrIndex(index); + str += _brk3; + if (printMode == PRINT_MODE_PRETTY) + str += _nl; + for (int k = 0; k <= i; k++) + { if (printMode == PRINT_MODE_PRETTY) { - str += _nl; - for (int j = 0; j < index + 1; j++) - str += _tab; + for (int j = 0; j < index + 1; j++) + str += _tab; } - str += _qt; - str += _pathTk[index].tk.c_str(); - str += _qt; - if (printMode == PRINT_MODE_PRETTY) - str += _pr; - else - str += _pr2; - if (index == (int)_pathTk.size() - 1) + if (k == i) + { + if (index == (int)_pathTk.size() - 1) str += data; - else + else str += str2; - if (printMode == PRINT_MODE_PRETTY) + } + else { - str += _nl; - for (int j = 0; j < index; j++) - str += _tab; + str += _nll; + str += _cm; } - str += _brk2; -} -void FirebaseJson::_parseToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode) -{ - tk_index_t tk; - _getTkIndex(depth, tk); - FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; - bool oskip = false; - bool ex = false; - size_t resLen = _jsonData._dbuf.length(); - if (searchIndex == -2) - tk.skip = true; - delay(0); - if (searchIndex > -1) - { - tk_index_t tk2; - int depth2 = depth - 1; - _getTkIndex(depth2, tk2); - if (tk.type == FirebaseJson::JSMN_ARRAY && _parseDepth == depth && tk2.oindex == _parentIndex) + if (printMode == PRINT_MODE_PRETTY) + str += _nl; + } + + if (printMode == PRINT_MODE_PRETTY) + { + for (int j = 0; j < index; j++) + str += _tab; + } + str += _brk4; +} + +void FirebaseJson::_addObjNodes(std::string &str, std::string &str2, int index, const char *data, PRINT_MODE printMode) +{ + str += _brk1; + if (printMode == PRINT_MODE_PRETTY) + { + str += _nl; + for (int j = 0; j < index + 1; j++) + str += _tab; + } + str += _qt; + str += _pathTk[index].tk.c_str(); + str += _qt; + if (printMode == PRINT_MODE_PRETTY) + str += _pr; + else + str += _pr2; + if (index == (int)_pathTk.size() - 1) + str += data; + else + str += str2; + if (printMode == PRINT_MODE_PRETTY) + { + str += _nl; + for (int j = 0; j < index; j++) + str += _tab; + } + str += _brk2; +} + +void FirebaseJson::_parseToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode) +{ + tk_index_t tk; + _getTkIndex(depth, tk); + FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; + bool oskip = false; + bool ex = false; + size_t resLen = _jsonData._dbuf.length(); + if (searchIndex == -2) + tk.skip = true; + delay(0); + if (searchIndex > -1) + { + tk_index_t tk2; + int depth2 = depth - 1; + _getTkIndex(depth2, tk2); + if (tk.type == FirebaseJson::JSMN_ARRAY && _parseDepth == depth && tk2.oindex == _parentIndex) + { + if (tk.oindex == searchIndex) + { + _nextToken = i; + _nextDepth = depth; + _parentIndex = tk.oindex; + + if ((int)_pathTk.size() != _parseDepth + 1) { - if (tk.oindex == searchIndex) - { - _nextToken = i; - _nextDepth = depth; - _parentIndex = tk.oindex; - - if ((int)_pathTk.size() != _parseDepth + 1) - { - _tokenMatch = true; - _parseCompleted++; - } - else - { - if (!_TkRefOk) - { - _parseCompleted++; - _refTkIndex = i + 1; - _refToken = i + 1; - _TkRefOk = true; - char *dat1 = _newPtr(h->end - h->start + 10); - strncpy(dat1, buf + h->start, h->end - h->start); - _jsonData.stringValue = dat1; - _delPtr(dat1); - _jsonData._type = h->type; - _jsonData._k_start = h->start; - _jsonData._start = h->start; - _jsonData._end = h->end; - _jsonData._tokenIndex = i; - _jsonData._depth = depth; - _jsonData._len = h->size; - _jsonData.success = true; - _setElementType(); - if (printMode != PRINT_MODE_NONE) - _jsonData.stringValue = ""; - else - { - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - _tokenMatch = true; - ex = true; - } - } - } - } - else - { - if (tk.oindex + 1 == tk.olen) - { - _setRef(depth - 1, false); - _setRef(depth, true); - } - } + _tokenMatch = true; + _parseCompleted++; } - } - else - { - char *key = _newPtr(h->end - h->start + 10); - strncpy(key, buf + h->start, h->end - h->start); - if (tk.type != FirebaseJson::JSMN_UNDEFINED && _parseDepth == depth) + else { - if (strcmp(searchKey, key) == 0) - { - _nextToken = i + 1; - _nextDepth = depth; - _parentIndex = tk.oindex; - if ((int)_pathTk.size() != _parseDepth + 1) - { - _tokenMatch = true; - _parseCompleted++; - } - else - { - if (!_TkRefOk) - { - _parseCompleted++; - _refTkIndex = i + 1; - _refToken = i + 1; - _TkRefOk = true; - h = &_tokens.get()[i + 1]; - char *dat2 = _newPtr(h->end - h->start + 10); - strncpy(dat2, buf + h->start, h->end - h->start); - _jsonData.stringValue = dat2; - _delPtr(dat2); - _jsonData._type = h->type; - _jsonData._k_start = h->start; - _jsonData._start = h->start; - _jsonData._end = h->end; - _jsonData._tokenIndex = i; - _jsonData._depth = depth; - _jsonData._len = h->size; - _jsonData.success = true; - _setElementType(); - if (printMode != PRINT_MODE_NONE) - _jsonData.stringValue = ""; - else - { - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - _tokenMatch = true; - ex = true; - } - } - } - } + if (!_TkRefOk) + { + _parseCompleted++; + _refTkIndex = i + 1; + _refToken = i + 1; + _TkRefOk = true; + char *dat1 = newS(h->end - h->start + 10); + strncpy(dat1, buf + h->start, h->end - h->start); + _jsonData.stringValue = dat1; + delS(dat1); + _jsonData._type = h->type; + _jsonData._k_start = h->start; + _jsonData._start = h->start; + _jsonData._end = h->end; + _jsonData._tokenIndex = i; + _jsonData._depth = depth; + _jsonData._len = h->size; + _jsonData.success = true; + _setElementType(); + if (printMode != PRINT_MODE_NONE) + _jsonData.stringValue = ""; else { - if (tk.oindex + 1 == tk.olen) - { - _setRef(depth - 1, false); - _setRef(depth, true); - } + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + _tokenMatch = true; + ex = true; } + } } - _delPtr(key); - } - if (ex) - return; - if (_refTkIndex == i + 1) - { - if (tk.type == FirebaseJson::JSMN_OBJECT) - oskip = true; - tk.skip = true; - _skipDepth = depth; - } - h = &_tokens.get()[i]; - if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) - { - if (printMode != PRINT_MODE_NONE && (tk.skip || _refTkIndex == i + 1)) + } + else + { + if (tk.oindex + 1 == tk.olen) { - if (!tk.omark && i > 0 && resLen > 0) - { - if (tk.oindex > 0) - _jsonData._dbuf += _cm; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - { - for (int j = 0; j < depth - (_skipDepth + 1); j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } - } - if (h->type == FirebaseJson::JSMN_OBJECT) - _jsonData._dbuf += _brk1; - else - _jsonData._dbuf += _brk3; + _setRef(depth - 1, false); + _setRef(depth, true); + } + } + } + } + else + { + char *key = newS(h->end - h->start + 10); + strncpy(key, buf + h->start, h->end - h->start); + if (tk.type != FirebaseJson::JSMN_UNDEFINED && _parseDepth == depth) + { + if (strcmp(searchKey, key) == 0) + { + _nextToken = i + 1; + _nextDepth = depth; + _parentIndex = tk.oindex; + if ((int)_pathTk.size() != _parseDepth + 1) + { + _tokenMatch = true; + _parseCompleted++; } - el_t e; - e.index = i; - e.olen = h->size; - e.type = h->type; - e.oindex = 0; - e.depth = depth; - e.omark = false; - e.ref = false; - if (_refToken != -1) - e.skip = true; else - e.skip = tk.skip; - _el.push_back(e); - depth++; - if (h->size == 0) { - while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) + if (!_TkRefOk) + { + _parseCompleted++; + _refTkIndex = i + 1; + _refToken = i + 1; + _TkRefOk = true; + h = &_tokens.get()[i + 1]; + char *dat2 = newS(h->end - h->start + 10); + strncpy(dat2, buf + h->start, h->end - h->start); + _jsonData.stringValue = dat2; + delS(dat2); + _jsonData._type = h->type; + _jsonData._k_start = h->start; + _jsonData._start = h->start; + _jsonData._end = h->end; + _jsonData._tokenIndex = i; + _jsonData._depth = depth; + _jsonData._len = h->size; + _jsonData.success = true; + _setElementType(); + if (printMode != PRINT_MODE_NONE) + _jsonData.stringValue = ""; + else { - delay(0); + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + _tokenMatch = true; + ex = true; } + } } - } + } + else + { + if (tk.oindex + 1 == tk.olen) + { + _setRef(depth - 1, false); + _setRef(depth, true); + } + } + } + delS(key); + } + if (ex) + return; + if (_refTkIndex == i + 1) + { + if (tk.type == FirebaseJson::JSMN_OBJECT) + oskip = true; + tk.skip = true; + _skipDepth = depth; + } + h = &_tokens.get()[i]; + if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) + { + if (printMode != PRINT_MODE_NONE && (tk.skip || _refTkIndex == i + 1)) + { + if (!tk.omark && i > 0 && resLen > 0) + { + if (tk.oindex > 0) + _jsonData._dbuf += _cm; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) + { + for (int j = 0; j < depth - (_skipDepth + 1); j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; + } + } + if (h->type == FirebaseJson::JSMN_OBJECT) + _jsonData._dbuf += _brk1; + else + _jsonData._dbuf += _brk3; + } + el_t e; + e.index = i; + e.olen = h->size; + e.type = h->type; + e.oindex = 0; + e.depth = depth; + e.omark = false; + e.ref = false; + if (_refToken != -1) + e.skip = true; else + e.skip = tk.skip; + _el.push_back(e); + depth++; + if (h->size == 0) { - char *tmp = _newPtr(h->end - h->start + 10); - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); + while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) + { + delay(0); + } + } + } + else + { + char *tmp = newS(h->end - h->start + 10); + if (buf[h->start - 1] != '"') + strncpy(tmp, buf + h->start, h->end - h->start); + else + strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); + if (h->size > 0) + { + if (printMode != PRINT_MODE_NONE && tk.skip && !oskip) + { + if (tk.oindex > 0) + _jsonData._dbuf += _cm; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size > 0) + { + for (int j = 0; j < depth - (_skipDepth + 1); j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; + } + _jsonData._dbuf += tmp; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _pr; else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - if (h->size > 0) + _jsonData._dbuf += _pr2; + } + if (_collectTk) + { + eltk_t el; + el.index = i; + el.type = 0; + _eltk.push_back(el); + } + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); + h = &_tokens.get()[i + 1]; + delS(tmp2); + if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) + { + + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); + if (printMode != PRINT_MODE_NONE && tk.skip) { - if (printMode != PRINT_MODE_NONE && tk.skip && !oskip) - { - if (tk.oindex > 0) - _jsonData._dbuf += _cm; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size > 0) - { - for (int j = 0; j < depth - (_skipDepth + 1); j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } - _jsonData._dbuf += tmp; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _pr; - else - _jsonData._dbuf += _pr2; - } - if (_collectTk) - { - eltk_t el; - el.index = i; - el.type = 0; - _eltk.push_back(el); - } - tmp = _newPtr(tmp, h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); - h = &_tokens.get()[i + 1]; - if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) - { - _delPtr(tmp); - tmp = _newPtr(h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); - if (printMode != PRINT_MODE_NONE && tk.skip) - { - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); - else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - _jsonData._dbuf += tmp; - } - i++; - while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) - { - delay(0); - } - } - else - { - if (_refToken == i + 1) - { - _setSkip(depth, true); - } - _setMark(depth, true); - } + if (buf[h->start - 1] != '"') + strncpy(tmp2, buf + h->start, h->end - h->start); + else + strncpy(tmp2, buf + h->start - 1, h->end - h->start + 2); + _jsonData._dbuf += tmp2; } - else + delS(tmp2); + i++; + while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) { - if (printMode != PRINT_MODE_NONE && tk.skip) - { - if (tk.oindex > 0 && resLen > 0) - { - _jsonData._dbuf += _cm; - } - if (printMode == PRINT_MODE_PRETTY && resLen > 0) - _jsonData._dbuf += _nl; - - if (printMode == PRINT_MODE_PRETTY && tk.olen > 0 && resLen > 0) - { - for (int j = 0; j < depth - (_skipDepth + 1); j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } - _jsonData._dbuf += tmp; - } - while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) - { - delay(0); - } - if (_collectTk) - { - eltk_t el; - el.index = i; - el.type = 1; - _eltk.push_back(el); - } + delay(0); } - _delPtr(tmp); - - if (_refToken == -1 && _skipDepth == depth) - _setSkip(depth, false); - } - _nextToken = i + 1; - _refToken = -1; -} - -void FirebaseJson::_compileToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode, char *replace, int refTokenIndex, bool removeTk) -{ - if (_tokenMatch) - return; - tk_index_t tk; - _getTkIndex(depth, tk); - FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; - bool insertFlag = false; - bool ex = false; - delay(0); - if (searchIndex > -1) - { - tk_index_t tk2; - int depth2 = depth - 1; - _getTkIndex(depth2, tk2); - if (tk.type == FirebaseJson::JSMN_ARRAY && _parseDepth == depth && tk2.oindex == _parentIndex) + } + else + { + if (_refToken == i + 1) { - if (tk.oindex == searchIndex) - { - _nextToken = i; - _nextDepth = depth; - _parentIndex = tk.oindex; - if ((int)_pathTk.size() != _parseDepth + 1) - { - _tokenMatch = true; - _parseCompleted++; - _refTkIndex = i + 1; - } - else - { - if (!_TkRefOk) - { - _parseCompleted++; - _refTkIndex = i + 1; - _refToken = i + 1; - _TkRefOk = true; - single_child_parent_t p = _findSCParent(depth); - if (p.success) - { - _remTkIndex = p.index + 1; - _remFirstTk = p.firstTk; - _remLastTk = p.lastTk; - } - else - { - _remTkIndex = i + 1; - _remFirstTk = tk.oindex == 0; - _remLastTk = tk.oindex + 1 == tk.olen; - } - } - } - } - else - { - if (tk.oindex + 1 == tk.olen) - { - _setRef(depth - 1, false); - _setRef(depth, true); - } - } + _setSkip(depth, true); } + _setMark(depth, true); + } } else { - char *key = _newPtr(h->end - h->start + 10); - strncpy(key, buf + h->start, h->end - h->start); - if (tk.type != FirebaseJson::JSMN_UNDEFINED && _parseDepth == depth) + if (printMode != PRINT_MODE_NONE && tk.skip) + { + if (tk.oindex > 0 && resLen > 0) + { + _jsonData._dbuf += _cm; + } + if (printMode == PRINT_MODE_PRETTY && resLen > 0) + _jsonData._dbuf += _nl; + + if (printMode == PRINT_MODE_PRETTY && tk.olen > 0 && resLen > 0) + { + for (int j = 0; j < depth - (_skipDepth + 1); j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; + } + _jsonData._dbuf += tmp; + } + while (_updateTkIndex3(i, depth, searchKey, searchIndex, printMode)) + { + delay(0); + } + if (_collectTk) + { + eltk_t el; + el.index = i; + el.type = 1; + _eltk.push_back(el); + } + } + delS(tmp); + + if (_refToken == -1 && _skipDepth == depth) + _setSkip(depth, false); + } + _nextToken = i + 1; + _refToken = -1; +} + +void FirebaseJson::_compileToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode, const char *replace, int refTokenIndex, bool removeTk) +{ + if (_tokenMatch) + return; + tk_index_t tk; + _getTkIndex(depth, tk); + FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; + bool insertFlag = false; + bool ex = false; + delay(0); + if (searchIndex > -1) + { + tk_index_t tk2; + int depth2 = depth - 1; + _getTkIndex(depth2, tk2); + if (tk.type == FirebaseJson::JSMN_ARRAY && _parseDepth == depth && tk2.oindex == _parentIndex) + { + if (tk.oindex == searchIndex) + { + _nextToken = i; + _nextDepth = depth; + _parentIndex = tk.oindex; + if ((int)_pathTk.size() != _parseDepth + 1) + { + _tokenMatch = true; + _parseCompleted++; + _refTkIndex = i + 1; + } + else { - if (strcmp(searchKey, key) == 0) + if (!_TkRefOk) + { + _parseCompleted++; + _refTkIndex = i + 1; + _refToken = i + 1; + _TkRefOk = true; + single_child_parent_t p = _findSCParent(depth); + if (p.success) { - _nextToken = i + 1; - _nextDepth = depth; - _parentIndex = tk.oindex; - if ((int)_pathTk.size() != _parseDepth + 1) - { - _tokenMatch = true; - _parseCompleted++; - _refTkIndex = i + 1; - } - else - { - if (!_TkRefOk) - { - _parseCompleted++; - _refTkIndex = i + 1; - _refToken = i + 1; - _TkRefOk = true; - single_child_parent_t p = _findSCParent(depth); - if (p.success) - { - _remTkIndex = p.index + 1; - _remFirstTk = p.firstTk; - _remLastTk = p.lastTk; - } - else - { - _remTkIndex = i + 1; - _remFirstTk = tk.oindex == 0; - _remLastTk = tk.oindex + 1 == tk.olen; - } - } - } + _remTkIndex = p.index + 1; + _remFirstTk = p.firstTk; + _remLastTk = p.lastTk; } else { - if (tk.oindex + 1 == tk.olen) - { - _setRef(depth - 1, false); - _setRef(depth, true); - } + _remTkIndex = i + 1; + _remFirstTk = tk.oindex == 0; + _remLastTk = tk.oindex + 1 == tk.olen; } + } } - else + } + else + { + if (tk.oindex + 1 == tk.olen) { - if (_tokenCount == 1 && h->size == 0 && !removeTk) - { - _insertChilds(replace, printMode); - _nextToken = i + 1; - _nextDepth = 0; - _parseCompleted = _pathTk.size(); - _tokenMatch = true; - ex = true; - } + _setRef(depth - 1, false); + _setRef(depth, true); } - _delPtr(key); - } - if (ex) - return; - - h = &_tokens.get()[i]; - if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) - { - if (printMode != PRINT_MODE_NONE && !tk.skip) + } + } + } + else + { + char *key = newS(h->end - h->start + 10); + strncpy(key, buf + h->start, h->end - h->start); + if (tk.type != FirebaseJson::JSMN_UNDEFINED && _parseDepth == depth) + { + if (strcmp(searchKey, key) == 0) + { + _nextToken = i + 1; + _nextDepth = depth; + _parentIndex = tk.oindex; + if ((int)_pathTk.size() != _parseDepth + 1) + { + _tokenMatch = true; + _parseCompleted++; + _refTkIndex = i + 1; + } + else { - if (!tk.omark && i > 0) + if (!_TkRefOk) + { + _parseCompleted++; + _refTkIndex = i + 1; + _refToken = i + 1; + _TkRefOk = true; + single_child_parent_t p = _findSCParent(depth); + if (p.success) { - if (tk.oindex > 0) - _jsonData._dbuf += _cm; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - { - for (int j = 0; j < depth; j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } + _remTkIndex = p.index + 1; + _remFirstTk = p.firstTk; + _remLastTk = p.lastTk; } - if (_refToken == -1) + else { - if (h->type == FirebaseJson::JSMN_OBJECT) - _jsonData._dbuf += _brk1; - else - _jsonData._dbuf += _brk3; + _remTkIndex = i + 1; + _remFirstTk = tk.oindex == 0; + _remLastTk = tk.oindex + 1 == tk.olen; } - else if (_refToken != -1 && searchIndex > -1) - _jsonData._dbuf += replace; + } } - el_t e; - e.index = i; - e.olen = h->size; - e.type = h->type; - e.oindex = 0; - e.depth = depth; - e.omark = false; - e.ref = false; - if (_refToken != -1) - e.skip = true; - else - e.skip = tk.skip; - _el.push_back(e); - depth++; - if (h->size == 0) + } + else + { + if (tk.oindex + 1 == tk.olen) { - while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) - { - delay(0); - } + _setRef(depth - 1, false); + _setRef(depth, true); } + } } else { - if (_refTkIndex == refTokenIndex && refTokenIndex > -1) + if (_tokenCount == 1 && h->size == 0 && !removeTk) + { + _insertChilds(replace, printMode); + _nextToken = i + 1; + _nextDepth = 0; + _parseCompleted = _pathTk.size(); + _tokenMatch = true; + ex = true; + } + } + delS(key); + } + if (ex) + return; + + h = &_tokens.get()[i]; + if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) + { + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (!tk.omark && i > 0) + { + if (tk.oindex > 0) + _jsonData._dbuf += _cm; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) { - _refToken = refTokenIndex; - _refTkIndex = -1; - insertFlag = true; + for (int j = 0; j < depth; j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; } - char *tmp = _newPtr(h->end - h->start + 10); - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); + } + if (_refToken == -1) + { + if (h->type == FirebaseJson::JSMN_OBJECT) + _jsonData._dbuf += _brk1; else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - if (h->size > 0) + _jsonData._dbuf += _brk3; + } + else if (_refToken != -1 && searchIndex > -1) + _jsonData._dbuf += replace; + } + el_t e; + e.index = i; + e.olen = h->size; + e.type = h->type; + e.oindex = 0; + e.depth = depth; + e.omark = false; + e.ref = false; + if (_refToken != -1) + e.skip = true; + else + e.skip = tk.skip; + _el.push_back(e); + depth++; + if (h->size == 0) + { + while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) + { + delay(0); + } + } + } + else + { + if (_refTkIndex == refTokenIndex && refTokenIndex > -1) + { + _refToken = refTokenIndex; + _refTkIndex = -1; + insertFlag = true; + } + char *tmp = newS(h->end - h->start + 10); + if (buf[h->start - 1] != '"') + strncpy(tmp, buf + h->start, h->end - h->start); + else + strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); + if (h->size > 0) + { + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (tk.oindex > 0) + _jsonData._dbuf += _cm; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size > 0) { - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (tk.oindex > 0) - _jsonData._dbuf += _cm; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size > 0) - { - for (int j = 0; j < depth; j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } - _jsonData._dbuf += tmp; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _pr; - else - _jsonData._dbuf += _pr2; - } - tmp = _newPtr(tmp, h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); - h = &_tokens.get()[i + 1]; - if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) - { - tmp = _newPtr(tmp, h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); + for (int j = 0; j < depth; j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; + } + _jsonData._dbuf += tmp; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _pr; + else + _jsonData._dbuf += _pr2; + } + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); + h = &_tokens.get()[i + 1]; + delS(tmp2); + + if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) + { + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); - else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - if (_refToken == i + 1) - { - if (!insertFlag) - _jsonData._dbuf += replace; - else - _insertChilds(replace, printMode); - } - else - _jsonData._dbuf += tmp; - } - i++; - while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) - { - delay(0); - } - } + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (buf[h->start - 1] != '"') + strncpy(tmp2, buf + h->start, h->end - h->start); + else + strncpy(tmp2, buf + h->start - 1, h->end - h->start + 2); + if (_refToken == i + 1) + { + if (!insertFlag) + _jsonData._dbuf += replace; else - { - if (_refToken == i + 1) - { - _setSkip(depth, true); - _skipDepth = depth; - if (!insertFlag) - _jsonData._dbuf += replace; - else - _insertChilds(replace, printMode); - if (printMode != PRINT_MODE_NONE && (depth > 0 || tk.oindex == tk.olen - 1)) - { - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < depth; j++) - _jsonData._dbuf += _tab; - } - _jsonData._dbuf += _brk2; - } - } - _setMark(depth, true); - } + _insertChilds(replace, printMode); + } + else + _jsonData._dbuf += tmp2; } - else + delS(tmp2); + i++; + while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) { - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (tk.oindex > 0) - _jsonData._dbuf += _cm; - if (printMode == PRINT_MODE_PRETTY) - _jsonData._dbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && tk.olen > 0) - { - for (int j = 0; j < depth; j++) - _jsonData._dbuf += _tab; - _jsonData._dbuf += _tab; - } - - if (_refToken == i + 1 && !_arrInserted) - { - if (!insertFlag) - _jsonData._dbuf += replace; - else - _insertChilds(replace, printMode); - _arrInserted = true; - } - else - _jsonData._dbuf += tmp; - } - while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) + delay(0); + } + } + else + { + if (_refToken == i + 1) + { + _setSkip(depth, true); + _skipDepth = depth; + if (!insertFlag) + _jsonData._dbuf += replace; + else + _insertChilds(replace, printMode); + if (printMode != PRINT_MODE_NONE && (depth > 0 || tk.oindex == tk.olen - 1)) + { + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY) { - delay(0); + for (int j = 0; j < depth; j++) + _jsonData._dbuf += _tab; } + _jsonData._dbuf += _brk2; + } } - _delPtr(tmp); - - if (_refToken == -1 && _skipDepth == depth) - _setSkip(depth, false); + _setMark(depth, true); + } } - _nextToken = i + 1; - _refToken = -1; -} - -void FirebaseJson::_removeToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode, char *replace, int refTokenIndex, bool removeTk) -{ - bool ncm = false; - tk_index_t tk; - _getTkIndex(depth, tk); - FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; - delay(0); - if (refTokenIndex == i && refTokenIndex > -1) - ncm = _remFirstTk; - if (refTokenIndex != i || (refTokenIndex == i && _remLastTk)) - _jsonData._dbuf += _tbuf; - _tbuf.clear(); - bool flag = tk.oindex > 0 && !ncm && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] != '{' && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] != '['; - if (refTokenIndex == i + 1 && refTokenIndex > -1) - { - _refToken = refTokenIndex; - _refTkIndex = -1; - tk.skip = true; - } - h = &_tokens.get()[i]; - if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) + else { - if (printMode != PRINT_MODE_NONE && !tk.skip) + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (tk.oindex > 0) + _jsonData._dbuf += _cm; + if (printMode == PRINT_MODE_PRETTY) + _jsonData._dbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && tk.olen > 0) { - if (!tk.omark && i > 0) - { - if (flag) - _tbuf += _cm; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - _tbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size >= 0) - { - for (int j = 0; j < depth; j++) - _tbuf += _tab; - _tbuf += _tab; - } - } - if (_refToken == -1) - { - if (h->type == FirebaseJson::JSMN_OBJECT) - _tbuf += _brk1; - else - _tbuf += _brk3; - } - else if (_refToken != -1 && searchIndex > -1) - _tbuf += replace; + for (int j = 0; j < depth; j++) + _jsonData._dbuf += _tab; + _jsonData._dbuf += _tab; + } + + if (_refToken == i + 1 && !_arrInserted) + { + if (!insertFlag) + _jsonData._dbuf += replace; + else + _insertChilds(replace, printMode); + _arrInserted = true; } - el_t e; - e.index = i; - e.olen = h->size; - e.type = h->type; - e.oindex = 0; - e.depth = depth; - e.omark = false; - e.ref = false; - if (_refToken != -1) - e.skip = true; else - e.skip = tk.skip; - _el.push_back(e); - depth++; - if (h->size == 0) + _jsonData._dbuf += tmp; + } + while (_updateTkIndex(i, depth, searchKey, searchIndex, replace, printMode, removeTk)) + { + delay(0); + } + } + delS(tmp); + + if (_refToken == -1 && _skipDepth == depth) + _setSkip(depth, false); + } + _nextToken = i + 1; + _refToken = -1; +} + +void FirebaseJson::_removeToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode, const char *replace, int refTokenIndex, bool removeTk) +{ + bool ncm = false; + tk_index_t tk; + _getTkIndex(depth, tk); + FirebaseJson::fbjs_tok_t *h = &_tokens.get()[i]; + delay(0); + if (refTokenIndex == i && refTokenIndex > -1) + ncm = _remFirstTk; + if (refTokenIndex != i || (refTokenIndex == i && _remLastTk)) + _jsonData._dbuf += _tbuf; + _tbuf.clear(); + bool flag = tk.oindex > 0 && !ncm && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] != '{' && _jsonData._dbuf.c_str()[_jsonData._dbuf.length() - 1] != '['; + if (refTokenIndex == i + 1 && refTokenIndex > -1) + { + _refToken = refTokenIndex; + _refTkIndex = -1; + tk.skip = true; + } + h = &_tokens.get()[i]; + if (h->type == FirebaseJson::JSMN_OBJECT || h->type == FirebaseJson::JSMN_ARRAY) + { + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (!tk.omark && i > 0) + { + if (flag) + _tbuf += _cm; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) + _tbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size >= 0) { - while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) - { - delay(0); - } + for (int j = 0; j < depth; j++) + _tbuf += _tab; + _tbuf += _tab; } - } + } + if (_refToken == -1) + { + if (h->type == FirebaseJson::JSMN_OBJECT) + _tbuf += _brk1; + else + _tbuf += _brk3; + } + else if (_refToken != -1 && searchIndex > -1) + _tbuf += replace; + } + el_t e; + e.index = i; + e.olen = h->size; + e.type = h->type; + e.oindex = 0; + e.depth = depth; + e.omark = false; + e.ref = false; + if (_refToken != -1) + e.skip = true; else + e.skip = tk.skip; + _el.push_back(e); + depth++; + if (h->size == 0) { - char *tmp = _newPtr(h->end - h->start + 10); - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); - else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - if (h->size > 0) + while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) + { + delay(0); + } + } + } + else + { + char *tmp = newS(h->end - h->start + 10); + if (buf[h->start - 1] != '"') + strncpy(tmp, buf + h->start, h->end - h->start); + else + strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); + if (h->size > 0) + { + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (flag) + _tbuf += _cm; + if (printMode == PRINT_MODE_PRETTY) + _tbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && h->size > 0) { - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (flag) - _tbuf += _cm; - if (printMode == PRINT_MODE_PRETTY) - _tbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && h->size > 0) - { - for (int j = 0; j < depth; j++) - _tbuf += _tab; - _tbuf += _tab; - } - _tbuf += tmp; - if (printMode == PRINT_MODE_PRETTY) - _tbuf += _pr; - else - _tbuf += _pr2; - } - tmp = _newPtr(tmp, h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); - h = &_tokens.get()[i + 1]; - if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) - { - tmp = _newPtr(tmp, h->end - h->start + 10); - strncpy(tmp, buf + h->start, h->end - h->start); - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (buf[h->start - 1] != '"') - strncpy(tmp, buf + h->start, h->end - h->start); - else - strncpy(tmp, buf + h->start - 1, h->end - h->start + 2); - _tbuf += tmp; - } - i++; - while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) - { - delay(0); - } - } - else - { - if (_refToken == i + 1) - { - _setSkip(depth, true); - _skipDepth = depth; - _tbuf += replace; - if (printMode != PRINT_MODE_NONE && (depth > 0 || tk.oindex == tk.olen - 1)) - { - if (printMode == PRINT_MODE_PRETTY) - _tbuf += _nl; - if (printMode == PRINT_MODE_PRETTY) - { - for (int j = 0; j < depth; j++) - _tbuf += _tab; - } - _tbuf += _brk2; - } - } - _setMark(depth, true); - } + for (int j = 0; j < depth; j++) + _tbuf += _tab; + _tbuf += _tab; } + _tbuf += tmp; + if (printMode == PRINT_MODE_PRETTY) + _tbuf += _pr; else + _tbuf += _pr2; + } + + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); + h = &_tokens.get()[i + 1]; + delS(tmp2); + if (h->type != FirebaseJson::JSMN_OBJECT && h->type != FirebaseJson::JSMN_ARRAY) + { + char *tmp2 = newS(h->end - h->start + 10); + strncpy(tmp2, buf + h->start, h->end - h->start); + if (printMode != PRINT_MODE_NONE && !tk.skip) { - if (printMode != PRINT_MODE_NONE && !tk.skip) - { - if (flag) - _tbuf += _cm; - if (printMode == PRINT_MODE_PRETTY) - _tbuf += _nl; - if (printMode == PRINT_MODE_PRETTY && tk.olen > 0) - { - for (int j = 0; j < depth; j++) - _tbuf += _tab; - _tbuf += _tab; - } - _tbuf += tmp; - } - while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) + if (buf[h->start - 1] != '"') + strncpy(tmp2, buf + h->start, h->end - h->start); + else + strncpy(tmp2, buf + h->start - 1, h->end - h->start + 2); + _tbuf += tmp2; + } + delS(tmp2); + i++; + while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) + { + delay(0); + } + } + else + { + if (_refToken == i + 1) + { + _setSkip(depth, true); + _skipDepth = depth; + _tbuf += replace; + if (printMode != PRINT_MODE_NONE && (depth > 0 || tk.oindex == tk.olen - 1)) + { + if (printMode == PRINT_MODE_PRETTY) + _tbuf += _nl; + if (printMode == PRINT_MODE_PRETTY) { - delay(0); + for (int j = 0; j < depth; j++) + _tbuf += _tab; } + _tbuf += _brk2; + } } - _delPtr(tmp); - - if (_refToken == -1 && _skipDepth == depth) - _setSkip(depth, false); + _setMark(depth, true); + } } - _nextToken = i + 1; - _refToken = -1; - _lastTk.olen = tk.olen; - _lastTk.oindex = tk.oindex; - _lastTk.type = tk.type; - _lastTk.depth = tk.depth; - _lastTk.index = tk.index; - _lastTk.skip = tk.skip; -} - -FirebaseJson::single_child_parent_t FirebaseJson::_findSCParent(int depth) -{ - single_child_parent_t res; - res.index = -1; - res.firstTk = false; - res.lastTk = false; - res.success = false; - for (int i = depth; i >= 0; i--) + else { - bool match = false; - for (size_t j = 0; j < _el.size(); j++) + if (printMode != PRINT_MODE_NONE && !tk.skip) + { + if (flag) + _tbuf += _cm; + if (printMode == PRINT_MODE_PRETTY) + _tbuf += _nl; + if (printMode == PRINT_MODE_PRETTY && tk.olen > 0) { - if (_el[j].depth == i - 1 && _el[i].olen == 1) - { - match = true; - res.index = _el[i].index; - res.firstTk = _el[j].oindex == 0; - res.lastTk = _el[j].oindex + 1 == _el[j].olen; - res.success = true; - } + for (int j = 0; j < depth; j++) + _tbuf += _tab; + _tbuf += _tab; } - if (!match) - break; + _tbuf += tmp; + } + while (_updateTkIndex2(_tbuf, i, depth, searchKey, searchIndex, replace, printMode)) + { + delay(0); + } } - return res; + delS(tmp); + + if (_refToken == -1 && _skipDepth == depth) + _setSkip(depth, false); + } + _nextToken = i + 1; + _refToken = -1; + _lastTk.olen = tk.olen; + _lastTk.oindex = tk.oindex; + _lastTk.type = tk.type; + _lastTk.depth = tk.depth; + _lastTk.index = tk.index; + _lastTk.skip = tk.skip; +} + +FirebaseJson::single_child_parent_t FirebaseJson::_findSCParent(int depth) +{ + single_child_parent_t res; + res.index = -1; + res.firstTk = false; + res.lastTk = false; + res.success = false; + for (int i = depth; i >= 0; i--) + { + bool match = false; + for (size_t j = 0; j < _el.size(); j++) + { + if (_el[j].depth == i - 1 && _el[i].olen == 1) + { + match = true; + res.index = _el[i].index; + res.firstTk = _el[j].oindex == 0; + res.lastTk = _el[j].oindex + 1 == _el[j].olen; + res.success = true; + } + } + if (!match) + break; + } + return res; } void FirebaseJson::_get(const char *key, int depth, int index) { - _tokenMatch = false; - if (_paresRes) + _tokenMatch = false; + if (_paresRes) + { + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + + if (_jsonData.success) { - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - - if (_jsonData.success) - { - _jsonData._dbuf.clear(); - _parseDepth = depth; - if (_nextToken < 0) - _nextToken = 0; - for (uint16_t i = _nextToken; i < _tokenCount; i++) - { - _parseToken(i, buf, _nextDepth, (char *)key, index, PRINT_MODE_NONE); - if (_tokenMatch) - break; - } - } - _delPtr(buf); - if (!_tokenMatch) - { - _paresRes = false; - _jsonData.success = false; - _resetParseResult(); - } + _jsonData._dbuf.clear(); + _parseDepth = depth; + if (_nextToken < 0) + _nextToken = 0; + for (uint16_t i = _nextToken; i < _tokenCount; i++) + { + _parseToken(i, buf, _nextDepth, (char *)key, index, PRINT_MODE_NONE); + if (_tokenMatch) + break; + } + } + delS(buf); + if (!_tokenMatch) + { + _paresRes = false; + _jsonData.success = false; + _resetParseResult(); } + } } void FirebaseJson::_strToTk(const std::string &str, std::vector &tk, char delim) { - std::size_t current, previous = 0; - current = str.find(delim); - std::string s; - while (current != std::string::npos) - { - s = str.substr(previous, current - previous); - _trim(s); - if (s.length() > 0) - { - path_tk_t tk_t; - tk_t.tk = s; - tk.push_back(tk_t); - } - - previous = current + 1; - current = str.find(delim, previous); - delay(0); - } + std::size_t current, previous = 0; + current = str.find(delim); + std::string s; + while (current != std::string::npos) + { s = str.substr(previous, current - previous); _trim(s); if (s.length() > 0) { - path_tk_t tk_t; - tk_t.tk = s; - tk.push_back(tk_t); + path_tk_t tk_t; + tk_t.tk = s; + tk.push_back(tk_t); } - std::string().swap(s); + + previous = current + 1; + current = str.find(delim, previous); + delay(0); + } + s = str.substr(previous, current - previous); + _trim(s); + if (s.length() > 0) + { + path_tk_t tk_t; + tk_t.tk = s; + tk.push_back(tk_t); + } + std::string().swap(s); } void FirebaseJson::_ltrim(std::string &str, const std::string &chars) { - str.erase(0, str.find_first_not_of(chars)); + str.erase(0, str.find_first_not_of(chars)); } void FirebaseJson::_rtrim(std::string &str, const std::string &chars) { - str.erase(str.find_last_not_of(chars) + 1); + str.erase(str.find_last_not_of(chars) + 1); } void FirebaseJson::_trim(std::string &str, const std::string &chars) { - _ltrim(str, chars); - _rtrim(str, chars); + _ltrim(str, chars); + _rtrim(str, chars); +} +void FirebaseJson::int_parse(const char *path, PRINT_MODE printMode) +{ + _parse(path, printMode); } void FirebaseJson::_parse(const char *path, PRINT_MODE printMode) { - clearPathTk(); - std::string _path; - - if (_topLevelTkType == JSMN_ARRAY) - { - char *_root = _getPGMString(FirebaseJson_STR_26); - char *_slash = _getPGMString(FirebaseJson_STR_27); - _path = _root; - _path += _slash; - _path += path; - _delPtr(_root); - _delPtr(_slash); - } - else - _path = path; - - _strToTk(_path.c_str(), _pathTk, '/'); - _fbjs_parse(); - std::string().swap(_path); - if (!_jsonData.success) - return; - _jsonData.success = false; - char *nbuf = _newPtr(2); - int len = _pathTk.size(); - _nextDepth = -1; - _nextToken = 0; - _skipDepth = -1; - _parentIndex = -1; - _TkRefOk = false; - _parseCompleted = 0; - _arrReplaced = false; - _refTkIndex = -1; - _remTkIndex = -1; - _remFirstTk = false; - _remLastTk = false; - _el.clear(); - _eltk.clear(); - if (len == 0) - { - _parse(nbuf, 0, -2, printMode); - _jsonData.success = true; - } - else + clearPathTk(); + std::string _path; + + if (_topLevelTkType == JSMN_ARRAY) + { + char *_root = strP(FirebaseJson_STR_26); + char *_slash = strP(FirebaseJson_STR_27); + _path = _root; + _path += _slash; + _path += path; + delS(_root); + delS(_slash); + } + else + _path = path; + + _strToTk(_path.c_str(), _pathTk, '/'); + _fbjs_parse(); + std::string().swap(_path); + if (!_jsonData.success) + return; + _jsonData.success = false; + int len = _pathTk.size(); + _nextDepth = -1; + _nextToken = 0; + _skipDepth = -1; + _parentIndex = -1; + _TkRefOk = false; + _parseCompleted = 0; + _arrReplaced = false; + _refTkIndex = -1; + _remTkIndex = -1; + _remFirstTk = false; + _remLastTk = false; + _el.clear(); + _eltk.clear(); + if (len == 0) + { + _parse("", 0, -2, printMode); + _jsonData.success = true; + } + else + { + for (int i = 0; i < len; i++) { - for (int i = 0; i < len; i++) - { - if (_isStrTk(i)) - _parse(_pathTk[i].tk.c_str(), i, -1, printMode); - else if (_isArrTk(i)) - _parse(nbuf, i, _getArrIndex(i), printMode); - else - _parse(_pathTk[i].tk.c_str(), i, -1, printMode); - } - _jsonData.success = _parseCompleted == len; + if (_isStrTk(i)) + _parse(_pathTk[i].tk.c_str(), i, -1, printMode); + else if (_isArrTk(i)) + _parse("", i, _getArrIndex(i), printMode); + else + _parse(_pathTk[i].tk.c_str(), i, -1, printMode); } - _el.clear(); - _eltk.clear(); - _delPtr(nbuf); - clearPathTk(); - std::string().swap(_tbuf); - _tokens.reset(); - _tokens = nullptr; + _jsonData.success = _parseCompleted == len; + } + _el.clear(); + _eltk.clear(); + clearPathTk(); + std::string().swap(_tbuf); + _tokens.reset(); + _tokens = nullptr; +} +void FirebaseJson::int_clearPathTk() +{ + clearPathTk(); } void FirebaseJson::clearPathTk() { - size_t len = _pathTk.size(); - for (size_t i = 0; i < len; i++) - std::string().swap(_pathTk[i].tk); - for (size_t i = 0; i < len; i++) - _pathTk.erase(_pathTk.end()); - _pathTk.clear(); - std::vector().swap(_pathTk); + size_t len = _pathTk.size(); + for (size_t i = 0; i < len; i++) + std::string().swap(_pathTk[i].tk); + for (size_t i = 0; i < len; i++) + _pathTk.erase(_pathTk.end()); + _pathTk.clear(); + std::vector().swap(_pathTk); } -void FirebaseJson::_parse(const char *key, int depth, int index, PRINT_MODE printMode) +void FirebaseJson::int_clearTokens() { - _tokenMatch = false; - if (_paresRes) - { - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - _parseDepth = depth; - if (_nextToken < 0) - _nextToken = 0; - - for (uint16_t i = _nextToken; i < _tokenCount; i++) - { + _tokens.reset(); + _tokens = nullptr; +} - int oDepth = _nextDepth; +size_t FirebaseJson::int_get_jsondata_len() +{ + return _jsonData._len; +} - _parseToken(i, buf, _nextDepth, (char *)key, index, printMode); +void FirebaseJson::_parse(const char *key, int depth, int index, PRINT_MODE printMode) +{ + _tokenMatch = false; + if (_paresRes) + { + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + _parseDepth = depth; + if (_nextToken < 0) + _nextToken = 0; - if (index > -1 && oDepth == _nextDepth && _tokenMatch) - { - _tokenMatch = false; - break; - } + for (uint16_t i = _nextToken; i < _tokenCount; i++) + { - if (oDepth > _nextDepth && index == -1) - { - if (_nextDepth > -1 && _nextDepth < (int)_pathTk.size()) - { - if (_pathTk[_nextDepth].matched) - { - _tokenMatch = false; - break; - } - } - } + int oDepth = _nextDepth; - if (_tokenMatch) - { - _pathTk[depth].matched = true; - break; - } - } + _parseToken(i, buf, _nextDepth, (char *)key, index, printMode); - _delPtr(buf); - if (!_tokenMatch) + if (index > -1 && oDepth == _nextDepth && _tokenMatch) + { + _tokenMatch = false; + break; + } + + if (oDepth > _nextDepth && index == -1) + { + if (_nextDepth > -1 && _nextDepth < (int)_pathTk.size()) { - _paresRes = false; - _jsonData.success = false; + if (_pathTk[_nextDepth].matched) + { + _tokenMatch = false; + break; + } } + } + + if (_tokenMatch) + { + _pathTk[depth].matched = true; + break; + } + } + + delS(buf); + if (!_tokenMatch) + { + _paresRes = false; + _jsonData.success = false; } + } } void FirebaseJson::_compile(const char *key, int depth, int index, const char *replace, PRINT_MODE printMode, int refTokenIndex, bool removeTk) { - _tokenMatch = false; - if (_paresRes) + _tokenMatch = false; + if (_paresRes) + { + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + _parseDepth = depth; + if (_nextToken < 0) + _nextToken = 0; + for (uint16_t i = _nextToken; i < _tokenCount; i++) { - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - _parseDepth = depth; - if (_nextToken < 0) - _nextToken = 0; - for (uint16_t i = _nextToken; i < _tokenCount; i++) - { - _compileToken(i, buf, _nextDepth, (char *)key, index, printMode, (char *)replace, refTokenIndex, removeTk); - if (_tokenMatch) - break; - } - _delPtr(buf); - if (!_tokenMatch) - { - _paresRes = false; - _jsonData.success = false; - } + _compileToken(i, buf, _nextDepth, key, index, printMode, replace, refTokenIndex, removeTk); + if (_tokenMatch) + break; + } + delS(buf); + if (!_tokenMatch) + { + _paresRes = false; + _jsonData.success = false; } + } } void FirebaseJson::_remove(const char *key, int depth, int index, const char *replace, int refTokenIndex, bool removeTk) { - if (_paresRes) + if (_paresRes) + { + std::string s; + _toStdString(s); + int bufLen = s.length() + 1024; + char *buf = newS(bufLen); + strcpy(buf, s.c_str()); + std::string().swap(s); + _parseDepth = depth; + if (_nextToken < 0) + _nextToken = 0; + for (uint16_t i = _nextToken; i < _tokenCount; i++) { - std::string s; - _toStdString(s); - int bufLen = s.length() + 1024; - char *buf = _newPtr(bufLen); - strcpy(buf, s.c_str()); - std::string().swap(s); - _parseDepth = depth; - if (_nextToken < 0) - _nextToken = 0; - for (uint16_t i = _nextToken; i < _tokenCount; i++) - { - _removeToken(i, buf, _nextDepth, (char *)key, index, PRINT_MODE_PLAIN, (char *)replace, refTokenIndex, removeTk); - } - _delPtr(buf); + _removeToken(i, buf, _nextDepth, (char *)key, index, PRINT_MODE_PLAIN, (char *)replace, refTokenIndex, removeTk); } + delS(buf); + } } bool FirebaseJson::_isArrTk(int index) { - if (index < (int)_pathTk.size()) - return _pathTk[index].tk.c_str()[0] == '[' && _pathTk[index].tk.c_str()[_pathTk[index].tk.length() - 1] == ']'; - else - return false; + if (index < (int)_pathTk.size()) + return _pathTk[index].tk.c_str()[0] == '[' && _pathTk[index].tk.c_str()[_pathTk[index].tk.length() - 1] == ']'; + else + return false; } bool FirebaseJson::_isStrTk(int index) { - if (index < (int)_pathTk.size()) - return _pathTk[index].tk.c_str()[0] == '"' && _pathTk[index].tk.c_str()[_pathTk[index].tk.length() - 1] == '"'; - else - return false; + if (index < (int)_pathTk.size()) + return _pathTk[index].tk.c_str()[0] == '"' && _pathTk[index].tk.c_str()[_pathTk[index].tk.length() - 1] == '"'; + else + return false; } int FirebaseJson::_getArrIndex(int index) { - int res = -1; - if (index < (int)_pathTk.size()) - { - res = atoi(_pathTk[index].tk.substr(1, _pathTk[index].tk.length() - 2).c_str()); - if (res < 0) - res = 0; - } - return res; + int res = -1; + if (index < (int)_pathTk.size()) + { + res = atoi(_pathTk[index].tk.substr(1, _pathTk[index].tk.length() - 2).c_str()); + if (res < 0) + res = 0; + } + return res; } void FirebaseJson::set(const String &path) { - _setNull(path.c_str()); + _setNull(path.c_str()); } void FirebaseJson::set(const String &path, const String &value) { - _setString(path.c_str(), value.c_str()); + _setString(path.c_str(), value.c_str()); } void FirebaseJson::set(const String &path, const char *value) { - _setString(path.c_str(), value); + _setString(path.c_str(), value); } void FirebaseJson::set(const String &path, int value) { - _setInt(path.c_str(), value); + _setInt(path.c_str(), value); } void FirebaseJson::set(const String &path, unsigned short value) { - _setInt(path.c_str(), value); + _setInt(path.c_str(), value); } void FirebaseJson::set(const String &path, float value) { - _setFloat(path.c_str(), value); + _setFloat(path.c_str(), value); } void FirebaseJson::set(const String &path, double value) { - _setDouble(path.c_str(), value); + _setDouble(path.c_str(), value); } void FirebaseJson::set(const String &path, bool value) { - _setBool(path.c_str(), value); + _setBool(path.c_str(), value); } void FirebaseJson::set(const String &path, FirebaseJson &json) { - _setJson(path.c_str(), &json); + _setJson(path.c_str(), &json); } void FirebaseJson::set(const String &path, FirebaseJsonArray &arr) { - _setArray(path.c_str(), &arr); + _setArray(path.c_str(), &arr); } template bool FirebaseJson::set(const String &path, T value) { - if (std::is_same::value) - return _setInt(path, value); - else if (std::is_same::value) - return _setFloat(path, value); - else if (std::is_same::value) - return _setDouble(path, value); - else if (std::is_same::value) - return _setBool(path, value); - else if (std::is_same::value) - return _setString(path, value); - else if (std::is_same::value) - return _setJson(path, &value); - else if (std::is_same::value) - return _setArray(path, &value); + if (std::is_same::value) + return _setInt(path, value); + else if (std::is_same::value) + return _setFloat(path, value); + else if (std::is_same::value) + return _setDouble(path, value); + else if (std::is_same::value) + return _setBool(path, value); + else if (std::is_same::value) + return _setString(path, value); + else if (std::is_same::value) + return _setJson(path, &value); + else if (std::is_same::value) + return _setArray(path, &value); } void FirebaseJson::_setString(const std::string &path, const std::string &value) { - char *tmp = _newPtr(value.length() + 1024); - strcpy(tmp, _qt); - strcat(tmp, value.c_str()); - strcat(tmp, _qt); - _set(path.c_str(), tmp); - _delPtr(tmp); - std::string().swap(_jsonData._dbuf); + char *tmp = newS(value.length() + 1024); + strcpy(tmp, _qt); + strcat(tmp, value.c_str()); + strcat(tmp, _qt); + _set(path.c_str(), tmp); + delS(tmp); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setInt(const std::string &path, int value) { - char *tmp = getIntString(value); - _set(path.c_str(), tmp); - _delPtr(tmp); - std::string().swap(_jsonData._dbuf); + char *tmp = intStr(value); + _set(path.c_str(), tmp); + delS(tmp); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setFloat(const std::string &path, float value) { - char *tmp = getFloatString(value); - _trimDouble(tmp); - _set(path.c_str(), tmp); - _delPtr(tmp); - std::string().swap(_jsonData._dbuf); + char *tmp = floatStr(value); + _trimDouble(tmp); + _set(path.c_str(), tmp); + delS(tmp); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setDouble(const std::string &path, double value) { - char *tmp = getDoubleString(value); - _trimDouble(tmp); - _set(path.c_str(), tmp); - _delPtr(tmp); - std::string().swap(_jsonData._dbuf); + char *tmp = doubleStr(value); + _trimDouble(tmp); + _set(path.c_str(), tmp); + delS(tmp); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setBool(const std::string &path, bool value) { - if (value) - _set(path.c_str(), _tr); - else - _set(path.c_str(), _fls); - std::string().swap(_jsonData._dbuf); + if (value) + _set(path.c_str(), _tr); + else + _set(path.c_str(), _fls); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setNull(const std::string &path) { - _set(path.c_str(), _nll); - std::string().swap(_jsonData._dbuf); + _set(path.c_str(), _nll); + std::string().swap(_jsonData._dbuf); } void FirebaseJson::_setJson(const std::string &path, FirebaseJson *json) { - std::string s; - json->_toStdString(s); - _set(path.c_str(), s.c_str()); - std::string().swap(s); + std::string s; + json->_toStdString(s); + _set(path.c_str(), s.c_str()); + std::string().swap(s); } void FirebaseJson::_setArray(const std::string &path, FirebaseJsonArray *arr) { - std::string s; - arr->_toStdString(s); - _set(path.c_str(), s.c_str()); - std::string().swap(s); + std::string s; + arr->_toStdString(s); + _set(path.c_str(), s.c_str()); + std::string().swap(s); } void FirebaseJson::_set(const char *path, const char *data) { - clearPathTk(); - std::string _path; - - if (_topLevelTkType == JSMN_ARRAY) - { - char *_root = _getPGMString(FirebaseJson_STR_26); - char *_slash = _getPGMString(FirebaseJson_STR_27); - _path = _root; - _path += _slash; - _path += path; - _delPtr(_root); - _delPtr(_slash); - } + clearPathTk(); + std::string _path; + + if (_topLevelTkType == JSMN_ARRAY) + { + char *_root = strP(FirebaseJson_STR_26); + char *_slash = strP(FirebaseJson_STR_27); + _path = _root; + _path += _slash; + _path += path; + delS(_root); + delS(_slash); + } + else + _path = path; + + _strToTk(_path.c_str(), _pathTk, '/'); + _fbjs_parse(); + std::string().swap(_path); + if (!_jsonData.success) + return; + _jsonData.success = false; + int len = _pathTk.size(); + _nextDepth = -1; + _nextToken = 0; + _skipDepth = -1; + _parentIndex = -1; + _TkRefOk = false; + _parseCompleted = 0; + _arrReplaced = false; + _arrInserted = false; + _refTkIndex = -1; + _remTkIndex = -1; + _remFirstTk = false; + _remLastTk = false; + _el.clear(); + _eltk.clear(); + for (int i = 0; i < len; i++) + { + if (_isStrTk(i)) + _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN); + else if (_isArrTk(i)) + _compile("", i, _getArrIndex(i), data, PRINT_MODE_PLAIN); else - _path = path; - - _strToTk(_path.c_str(), _pathTk, '/'); - _fbjs_parse(); - std::string().swap(_path); - if (!_jsonData.success) - return; - _jsonData.success = false; - char *nbuf = _newPtr(2); - int len = _pathTk.size(); + _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN); + } + _el.clear(); + _eltk.clear(); + if (_parseCompleted != len) + { + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + int refTokenIndex = _refTkIndex; _nextDepth = -1; _nextToken = 0; _skipDepth = -1; @@ -2280,93 +2336,89 @@ void FirebaseJson::_set(const char *path, const char *data) _TkRefOk = false; _parseCompleted = 0; _arrReplaced = false; - _arrInserted = false; _refTkIndex = -1; - _remTkIndex = -1; - _remFirstTk = false; - _remLastTk = false; - _el.clear(); - _eltk.clear(); + _tokenMatch = false; + _paresRes = true; for (int i = 0; i < len; i++) { - if (_isStrTk(i)) - _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN); - else if (_isArrTk(i)) - _compile(nbuf, i, _getArrIndex(i), data, PRINT_MODE_PLAIN); - else - _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN); + if (_isStrTk(i)) + _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN, refTokenIndex); + else if (_isArrTk(i)) + _compile("", i, _getArrIndex(i), data, PRINT_MODE_PLAIN, refTokenIndex); + else + _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN, refTokenIndex); } _el.clear(); _eltk.clear(); - if (_parseCompleted != len) - { - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - int refTokenIndex = _refTkIndex; - _nextDepth = -1; - _nextToken = 0; - _skipDepth = -1; - _parentIndex = -1; - _TkRefOk = false; - _parseCompleted = 0; - _arrReplaced = false; - _refTkIndex = -1; - _tokenMatch = false; - _paresRes = true; - for (int i = 0; i < len; i++) - { - if (_isStrTk(i)) - _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN, refTokenIndex); - else if (_isArrTk(i)) - _compile(nbuf, i, _getArrIndex(i), data, PRINT_MODE_PLAIN, refTokenIndex); - else - _compile(_pathTk[i].tk.c_str(), i, -1, data, PRINT_MODE_PLAIN, refTokenIndex); - } - _el.clear(); - _eltk.clear(); - } - _delPtr(nbuf); - if (_jsonData._dbuf.length() >= 2) - { - _jsonData.success = true; - _rawbuf = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2); - } - else - _rawbuf.clear(); - clearPathTk(); - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - _tokens.reset(); - _tokens = nullptr; + } + if (_jsonData._dbuf.length() >= 2) + { + _jsonData.success = true; + _rawbuf = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2); + } + else + _rawbuf.clear(); + clearPathTk(); + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + _tokens.reset(); + _tokens = nullptr; } bool FirebaseJson::remove(const String &path) { - clearPathTk(); - std::string _path; + clearPathTk(); + std::string _path; + + if (_topLevelTkType == JSMN_ARRAY) + { + char *_root = strP(FirebaseJson_STR_26); + char *_slash = strP(FirebaseJson_STR_27); + _path = _root; + _path += _slash; + _path += path.c_str(); + delS(_root); + delS(_slash); + } + else + _path = path.c_str(); + + _strToTk(_path.c_str(), _pathTk, '/'); + _fbjs_parse(); + std::string().swap(_path); + if (!_jsonData.success) + return false; - if (_topLevelTkType == JSMN_ARRAY) - { - char *_root = _getPGMString(FirebaseJson_STR_26); - char *_slash = _getPGMString(FirebaseJson_STR_27); - _path = _root; - _path += _slash; - _path += path.c_str(); - _delPtr(_root); - _delPtr(_slash); - } + _jsonData.success = false; + int len = _pathTk.size(); + _nextDepth = -1; + _nextToken = 0; + _skipDepth = -1; + _parentIndex = -1; + _TkRefOk = false; + _parseCompleted = 0; + _arrReplaced = false; + _refTkIndex = -1; + _remTkIndex = -1; + _remFirstTk = false; + _remLastTk = false; + _el.clear(); + _eltk.clear(); + for (int i = 0; i < len; i++) + { + if (_isStrTk(i)) + _compile(_pathTk[i].tk.c_str(), i, -1, "", PRINT_MODE_NONE, -1, true); + else if (_isArrTk(i)) + _compile("", i, _getArrIndex(i), "", PRINT_MODE_NONE, -1, true); else - _path = path.c_str(); - - _strToTk(_path.c_str(), _pathTk, '/'); - _fbjs_parse(); - std::string().swap(_path); - if (!_jsonData.success) - return false; - - _jsonData.success = false; - char *nbuf = _newPtr(2); - int len = _pathTk.size(); + _compile(_pathTk[i].tk.c_str(), i, -1, "", PRINT_MODE_NONE, -1, true); + } + _el.clear(); + _eltk.clear(); + std::string().swap(_jsonData._dbuf); + int refTokenIndex = _remTkIndex; + if (_parseCompleted == len) + { _nextDepth = -1; _nextToken = 0; _skipDepth = -1; @@ -2375,270 +2427,240 @@ bool FirebaseJson::remove(const String &path) _parseCompleted = 0; _arrReplaced = false; _refTkIndex = -1; - _remTkIndex = -1; - _remFirstTk = false; - _remLastTk = false; - _el.clear(); - _eltk.clear(); - for (int i = 0; i < len; i++) - { - if (_isStrTk(i)) - _compile(_pathTk[i].tk.c_str(), i, -1, nbuf, PRINT_MODE_NONE, -1, true); - else if (_isArrTk(i)) - _compile(nbuf, i, _getArrIndex(i), nbuf, PRINT_MODE_NONE, -1, true); - else - _compile(_pathTk[i].tk.c_str(), i, -1, nbuf, PRINT_MODE_NONE, -1, true); - } + _tokenMatch = false; + _paresRes = true; + _jsonData.success = true; + _lastTk.skip = false; + _lastTk.olen = 0; + _lastTk.oindex = 0; + if (_isStrTk(len - 1)) + _remove(_pathTk[len - 1].tk.c_str(), -1, -1, "", refTokenIndex, true); + else + _remove("", -1, _getArrIndex(len - 1), "", refTokenIndex, true); + _jsonData._dbuf += _tbuf; _el.clear(); _eltk.clear(); - std::string().swap(_jsonData._dbuf); - int refTokenIndex = _remTkIndex; - if (_parseCompleted == len) - { - _nextDepth = -1; - _nextToken = 0; - _skipDepth = -1; - _parentIndex = -1; - _TkRefOk = false; - _parseCompleted = 0; - _arrReplaced = false; - _refTkIndex = -1; - _tokenMatch = false; - _paresRes = true; - _jsonData.success = true; - _lastTk.skip = false; - _lastTk.olen = 0; - _lastTk.oindex = 0; - if (_isStrTk(len - 1)) - _remove(_pathTk[len - 1].tk.c_str(), -1, -1, nbuf, refTokenIndex, true); - else - _remove(nbuf, -1, _getArrIndex(len - 1), nbuf, refTokenIndex, true); - _jsonData._dbuf += _tbuf; - _el.clear(); - _eltk.clear(); - } - - _delPtr(nbuf); - if (_jsonData._dbuf.length() >= 2) - _rawbuf = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2); - else - _rawbuf.clear(); - clearPathTk(); - std::string().swap(_jsonData._dbuf); - std::string().swap(_tbuf); - _tokens.reset(); - _tokens = nullptr; - return _jsonData.success; + } + if (_jsonData._dbuf.length() >= 2) + _rawbuf = _jsonData._dbuf.substr(1, _jsonData._dbuf.length() - 2); + else + _rawbuf.clear(); + clearPathTk(); + std::string().swap(_jsonData._dbuf); + std::string().swap(_tbuf); + _tokens.reset(); + _tokens = nullptr; + return _jsonData.success; } void FirebaseJson::_resetParseResult() { - _jsonData._type = 0; - _jsonData.type = ""; - _jsonData.typeNum = 0; - _jsonData.stringValue = ""; - _jsonData._dbuf = ""; - _jsonData.intValue = 0; - _jsonData.floatValue = 0; - _jsonData.doubleValue = 0; - _jsonData.boolValue = false; + _jsonData._type = 0; + _jsonData.type = ""; + _jsonData.typeNum = 0; + _jsonData.stringValue = ""; + _jsonData._dbuf = ""; + _jsonData.intValue = 0; + _jsonData.floatValue = 0; + _jsonData.doubleValue = 0; + _jsonData.boolValue = false; } void FirebaseJson::_setElementType() { - bool typeSet = false; - char *buf = _newPtr(1024); - char *tmp = _newPtr(1024); - char *tmp2 = nullptr; - if (_jsonData._type == FirebaseJson::JSMN_PRIMITIVE) - { - tmp2 = _newPtr(tmp2, _jsonData.stringValue.length() + 1); - strcpy(tmp2, _jsonData.stringValue.c_str()); + bool typeSet = false; + char *buf = newS(1024); + char *tmp = newS(1024); + char *tmp2 = nullptr; + if (_jsonData._type == FirebaseJson::JSMN_PRIMITIVE) + { + tmp2 = newS(_jsonData.stringValue.length() + 1); + strcpy(tmp2, _jsonData.stringValue.c_str()); + } + switch (_jsonData._type) + { + case FirebaseJson::JSMN_UNDEFINED: + strcpy(buf, _undef); + _jsonData.typeNum = JSON_UNDEFINED; + break; + case FirebaseJson::JSMN_OBJECT: + strcpy(buf, _obj); + _jsonData.typeNum = JSON_OBJECT; + break; + case FirebaseJson::JSMN_ARRAY: + strcpy(buf, _arry); + _jsonData.typeNum = JSON_ARRAY; + break; + case FirebaseJson::JSMN_STRING: + strcpy(buf, _string); + _jsonData.typeNum = JSON_STRING; + break; + case FirebaseJson::JSMN_PRIMITIVE: + if (!typeSet && strcmp(tmp2, _tr) == 0) + { + typeSet = true; + strcpy(buf, _bl); + _jsonData.typeNum = JSON_BOOL; + _jsonData.boolValue = true; + _jsonData.floatValue = 1.0f; + _jsonData.doubleValue = 1.0; + _jsonData.intValue = 1; } - switch (_jsonData._type) + else { - case FirebaseJson::JSMN_UNDEFINED: - strcpy(buf, _undef); - _jsonData.typeNum = JSON_UNDEFINED; - break; - case FirebaseJson::JSMN_OBJECT: - strcpy(buf, _obj); - _jsonData.typeNum = JSON_OBJECT; - break; - case FirebaseJson::JSMN_ARRAY: - strcpy(buf, _arry); - _jsonData.typeNum = JSON_ARRAY; - break; - case FirebaseJson::JSMN_STRING: - strcpy(buf, _string); - _jsonData.typeNum = JSON_STRING; - break; - case FirebaseJson::JSMN_PRIMITIVE: - if (!typeSet && strcmp(tmp2, _tr) == 0) + if (!typeSet && strcmp(tmp2, _fls) == 0) + { + typeSet = true; + strcpy(buf, _bl); + _jsonData.typeNum = JSON_BOOL; + _jsonData.boolValue = false; + _jsonData.floatValue = 0.0f; + _jsonData.doubleValue = 0.0; + _jsonData.intValue = 0; + } + } + + if (!typeSet && strcmp(tmp2, _nll) == 0) + { + typeSet = true; + strcpy(buf, _nll); + _jsonData.typeNum = JSON_NULL; + } + if (!typeSet) + { + typeSet = true; + strcpy(tmp, _dot); + double d = atof(tmp2); + if (d > 0x7fffffff) + { + strcpy(buf, _dbl); + _jsonData.floatValue = (float)d; + _jsonData.doubleValue = d; + _jsonData.intValue = atoi(tmp2); + _jsonData.boolValue = atof(tmp2) > 0 ? true : false; + _jsonData.typeNum = JSON_DOUBLE; + } + else + { + if (strpos(tmp2, tmp, 0) > -1) { - typeSet = true; - strcpy(buf, _bl); - _jsonData.typeNum = JSON_BOOL; - _jsonData.boolValue = true; - _jsonData.floatValue = 1.0f; - _jsonData.doubleValue = 1.0; - _jsonData.intValue = 1; + strcpy(buf, _dbl); + _jsonData.floatValue = (float)d; + _jsonData.doubleValue = d; + _jsonData.intValue = atoi(tmp2); + _jsonData.boolValue = atof(tmp2) > 0 ? true : false; + _jsonData.typeNum = JSON_FLOAT; } else { - if (!typeSet && strcmp(tmp2, _fls) == 0) - { - typeSet = true; - strcpy(buf, _bl); - _jsonData.typeNum = JSON_BOOL; - _jsonData.boolValue = false; - _jsonData.floatValue = 0.0f; - _jsonData.doubleValue = 0.0; - _jsonData.intValue = 0; - } - } - - if (!typeSet && strcmp(tmp2, _nll) == 0) - { - typeSet = true; - strcpy(buf, _nll); - _jsonData.typeNum = JSON_NULL; + _jsonData.intValue = atoi(tmp2); + _jsonData.floatValue = atof(tmp2); + _jsonData.doubleValue = atof(tmp2); + _jsonData.boolValue = atof(tmp2) > 0 ? true : false; + strcpy(buf, _int); + _jsonData.typeNum = JSON_INT; } - if (!typeSet) - { - typeSet = true; - strcpy(tmp, _dot); - double d = atof(tmp2); - if (d > 0x7fffffff) - { - strcpy(buf, _dbl); - _jsonData.floatValue = (float)d; - _jsonData.doubleValue = d; - _jsonData.intValue = atoi(tmp2); - _jsonData.boolValue = atof(tmp2) > 0 ? true : false; - _jsonData.typeNum = JSON_DOUBLE; - } - else - { - if (_strpos(tmp2, tmp, 0) > -1) - { - strcpy(buf, _dbl); - _jsonData.floatValue = (float)d; - _jsonData.doubleValue = d; - _jsonData.intValue = atoi(tmp2); - _jsonData.boolValue = atof(tmp2) > 0 ? true : false; - _jsonData.typeNum = JSON_FLOAT; - } - else - { - _jsonData.intValue = atoi(tmp2); - _jsonData.floatValue = atof(tmp2); - _jsonData.doubleValue = atof(tmp2); - _jsonData.boolValue = atof(tmp2) > 0 ? true : false; - strcpy(buf, _int); - _jsonData.typeNum = JSON_INT; - } - } - } - break; - default: - break; + } } - _jsonData.type = buf; - _delPtr(buf); - _delPtr(tmp); - if (tmp2) - _delPtr(tmp2); -} - -int FirebaseJson::_strpos(const char *haystack, const char *needle, int offset) -{ - size_t len = strlen(haystack); - size_t len2 = strlen(needle); - if (len == 0 || len < len2 || len2 == 0) - return -1; - char *_haystack = _newPtr(len - offset + 1); - _haystack[len - offset] = 0; - strncpy(_haystack, haystack + offset, len - offset); - char *p = strstr(_haystack, needle); - int r = -1; - if (p) - r = p - _haystack + offset; - _delPtr(_haystack); - return r; -} - -int FirebaseJson::_rstrpos(const char *haystack, const char *needle, int offset) -{ - size_t len = strlen(haystack); - size_t len2 = strlen(needle); - if (len == 0 || len < len2 || len2 == 0) - return -1; - char *_haystack = _newPtr(len - offset + 1); - _haystack[len - offset] = 0; - strncpy(_haystack, haystack + offset, len - offset); - char *p = _rstrstr(_haystack, needle); - int r = -1; - if (p) - r = p - _haystack + offset; - _delPtr(_haystack); - return r; -} - -char *FirebaseJson::_rstrstr(const char *haystack, const char *needle) -{ - size_t needle_length = strlen(needle); - const char *haystack_end = haystack + strlen(haystack) - needle_length; - const char *p; - size_t i; - for (p = haystack_end; p >= haystack; --p) + break; + default: + break; + } + _jsonData.type = buf; + delS(buf); + delS(tmp); + if (tmp2) + delS(tmp2); +} + +int FirebaseJson::strpos(const char *haystack, const char *needle, int offset) +{ + size_t len = strlen(haystack); + size_t len2 = strlen(needle); + if (len == 0 || len < len2 || len2 == 0) + return -1; + char *_haystack = newS(len - offset + 1); + _haystack[len - offset] = 0; + strncpy(_haystack, haystack + offset, len - offset); + char *p = strstr(_haystack, needle); + int r = -1; + if (p) + r = p - _haystack + offset; + delS(_haystack); + return r; +} + +int FirebaseJson::rstrpos(const char *haystack, const char *needle, int offset) +{ + size_t len = strlen(haystack); + size_t len2 = strlen(needle); + if (len == 0 || len < len2 || len2 == 0) + return -1; + char *_haystack = newS(len - offset + 1); + _haystack[len - offset] = 0; + strncpy(_haystack, haystack + offset, len - offset); + char *p = rstrstr(_haystack, needle); + int r = -1; + if (p) + r = p - _haystack + offset; + delS(_haystack); + return r; +} + +char *FirebaseJson::rstrstr(const char *haystack, const char *needle) +{ + size_t needle_length = strlen(needle); + const char *haystack_end = haystack + strlen(haystack) - needle_length; + const char *p; + size_t i; + for (p = haystack_end; p >= haystack; --p) + { + for (i = 0; i < needle_length; ++i) { - for (i = 0; i < needle_length; ++i) - { - if (p[i] != needle[i]) - goto next; - } - return (char *)p; - next:; + if (p[i] != needle[i]) + goto next; } - return 0; + return (char *)p; + next:; + } + return 0; } -void FirebaseJson::_delPtr(char *p) +void FirebaseJson::delS(char *p) { - if (p != nullptr) - delete[] p; + if (p != nullptr) + delete[] p; } -char *FirebaseJson::_newPtr(size_t len) +char *FirebaseJson::newS(size_t len) { - char *p = new char[len]; - memset(p, 0, len); - return p; + char *p = new char[len]; + memset(p, 0, len); + return p; } -char *FirebaseJson::_newPtr(char *p, size_t len) +char *FirebaseJson::newS(char *p, size_t len) { - _delPtr(p); - p = _newPtr(len); - return p; + delS(p); + p = newS(len); + return p; } -char *FirebaseJson::_newPtr(char *p, size_t len, char *d) +char *FirebaseJson::newS(char *p, size_t len, char *d) { - _delPtr(p); - p = _newPtr(len); - strcpy(p, d); - return p; + delS(p); + p = newS(len); + strcpy(p, d); + return p; } -char *FirebaseJson::_getPGMString(PGM_P pgm) +char *FirebaseJson::strP(PGM_P pgm) { - size_t len = strlen_P(pgm) + 1; - char *buf = _newPtr(len); - strcpy_P(buf, pgm); - buf[len - 1] = 0; - return buf; + size_t len = strlen_P(pgm) + 1; + char *buf = newS(len); + strcpy_P(buf, pgm); + buf[len - 1] = 0; + return buf; } /** @@ -2647,18 +2669,18 @@ char *FirebaseJson::_getPGMString(PGM_P pgm) FirebaseJson::fbjs_tok_t *FirebaseJson::fbjs_alloc_token(fbjs_parser *parser, FirebaseJson::fbjs_tok_t *tokens, size_t num_tokens) { - FirebaseJson::fbjs_tok_t *tok; - if (parser->toknext >= num_tokens) - { - return NULL; - } - tok = &tokens[parser->toknext++]; - tok->start = tok->end = -1; - tok->size = 0; + FirebaseJson::fbjs_tok_t *tok; + if (parser->toknext >= num_tokens) + { + return NULL; + } + tok = &tokens[parser->toknext++]; + tok->start = tok->end = -1; + tok->size = 0; #ifdef JSMN_PARENT_LINKS - tok->parent = -1; + tok->parent = -1; #endif - return tok; + return tok; } /** @@ -2667,10 +2689,10 @@ FirebaseJson::fbjs_tok_t *FirebaseJson::fbjs_alloc_token(fbjs_parser *parser, void FirebaseJson::fbjs_fill_token(fbjs_tok_t *token, fbjs_type_t type, int start, int end) { - token->type = type; - token->start = start; - token->end = end; - token->size = 0; + token->type = type; + token->start = start; + token->end = end; + token->size = 0; } /** @@ -2679,58 +2701,58 @@ void FirebaseJson::fbjs_fill_token(fbjs_tok_t *token, fbjs_type_t type, int FirebaseJson::fbjs_parse_primitive(fbjs_parser *parser, const char *js, size_t len, fbjs_tok_t *tokens, size_t num_tokens) { - fbjs_tok_t *token; - int start; + fbjs_tok_t *token; + int start; - start = parser->pos; + start = parser->pos; - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) + { + switch (js[parser->pos]) { - switch (js[parser->pos]) - { #ifndef JSMN_STRICT - /* In strict mode primitive must be followed by "," or "}" or "]" */ - case ':': + /* In strict mode primitive must be followed by "," or "}" or "]" */ + case ':': #endif - case '\t': - case '\r': - case '\n': - case ' ': - case ',': - case ']': - case '}': - goto found; - } - if (js[parser->pos] < 32 || js[parser->pos] >= 127) - { - parser->pos = start; - return JSMN_ERROR_INVAL; - } + case '\t': + case '\r': + case '\n': + case ' ': + case ',': + case ']': + case '}': + goto found; + } + if (js[parser->pos] < 32 || js[parser->pos] >= 127) + { + parser->pos = start; + return JSMN_ERROR_INVAL; } + } #ifdef JSMN_STRICT - /* In strict mode primitive must be followed by a comma/object/array */ - parser->pos = start; - return JSMN_ERROR_PART; + /* In strict mode primitive must be followed by a comma/object/array */ + parser->pos = start; + return JSMN_ERROR_PART; #endif found: - if (tokens == NULL) - { - parser->pos--; - return 0; - } - token = fbjs_alloc_token(parser, tokens, num_tokens); - if (token == NULL) - { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - fbjs_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); -#ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; -#endif + if (tokens == NULL) + { parser->pos--; return 0; + } + token = fbjs_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + fbjs_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); +#ifdef JSMN_PARENT_LINKS + token->parent = parser->toksuper; +#endif + parser->pos--; + return 0; } /** @@ -2739,80 +2761,80 @@ int FirebaseJson::fbjs_parse_primitive(fbjs_parser *parser, const char *js, int FirebaseJson::fbjs_parse_string(fbjs_parser *parser, const char *js, size_t len, fbjs_tok_t *tokens, size_t num_tokens) { - fbjs_tok_t *token; + fbjs_tok_t *token; - int start = parser->pos; + int start = parser->pos; - parser->pos++; + parser->pos++; - /* Skip starting quote */ - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) - { - char c = js[parser->pos]; + /* Skip starting quote */ + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) + { + char c = js[parser->pos]; - /* Quote: end of string */ - if (c == '\"') - { - if (tokens == NULL) - { - return 0; - } - token = fbjs_alloc_token(parser, tokens, num_tokens); - if (token == NULL) - { - parser->pos = start; - return JSMN_ERROR_NOMEM; - } - fbjs_fill_token(token, JSMN_STRING, start + 1, parser->pos); + /* Quote: end of string */ + if (c == '\"') + { + if (tokens == NULL) + { + return 0; + } + token = fbjs_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + { + parser->pos = start; + return JSMN_ERROR_NOMEM; + } + fbjs_fill_token(token, JSMN_STRING, start + 1, parser->pos); #ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; + token->parent = parser->toksuper; #endif - return 0; - } - - /* Backslash: Quoted symbol expected */ - if (c == '\\' && parser->pos + 1 < len) + return 0; + } + + /* Backslash: Quoted symbol expected */ + if (c == '\\' && parser->pos + 1 < len) + { + int i; + parser->pos++; + switch (js[parser->pos]) + { + /* Allowed escaped symbols */ + case '\"': + case '/': + case '\\': + case 'b': + case 'f': + case 'r': + case 'n': + case 't': + break; + /* Allows escaped symbol \uXXXX */ + case 'u': + parser->pos++; + for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { - int i; - parser->pos++; - switch (js[parser->pos]) - { - /* Allowed escaped symbols */ - case '\"': - case '/': - case '\\': - case 'b': - case 'f': - case 'r': - case 'n': - case 't': - break; - /* Allows escaped symbol \uXXXX */ - case 'u': - parser->pos++; - for (i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) - { - /* If it isn't a hex character we have an error */ - if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ - (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ - (js[parser->pos] >= 97 && js[parser->pos] <= 102))) - { /* a-f */ - parser->pos = start; - return JSMN_ERROR_INVAL; - } - parser->pos++; - } - parser->pos--; - break; - /* Unexpected symbol */ - default: - parser->pos = start; - return JSMN_ERROR_INVAL; - } + /* If it isn't a hex character we have an error */ + if (!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ + (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ + (js[parser->pos] >= 97 && js[parser->pos] <= 102))) + { /* a-f */ + parser->pos = start; + return JSMN_ERROR_INVAL; + } + parser->pos++; } + parser->pos--; + break; + /* Unexpected symbol */ + default: + parser->pos = start; + return JSMN_ERROR_INVAL; + } } - parser->pos = start; - return JSMN_ERROR_PART; + } + parser->pos = start; + return JSMN_ERROR_PART; } /** @@ -2821,204 +2843,204 @@ int FirebaseJson::fbjs_parse_string(fbjs_parser *parser, const char *js, int FirebaseJson::fbjs_parse(fbjs_parser *parser, const char *js, size_t len, fbjs_tok_t *tokens, unsigned int num_tokens) { - int r; - int i; - fbjs_tok_t *token; - int count = parser->toknext; + int r; + int i; + fbjs_tok_t *token; + int count = parser->toknext; - for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) - { - char c; - fbjs_type_t type; + for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) + { + char c; + fbjs_type_t type; - c = js[parser->pos]; - switch (c) - { - case '{': - case '[': - count++; - if (tokens == NULL) - { - break; - } - token = fbjs_alloc_token(parser, tokens, num_tokens); - if (token == NULL) - return JSMN_ERROR_NOMEM; - if (parser->toksuper != -1) - { - tokens[parser->toksuper].size++; + c = js[parser->pos]; + switch (c) + { + case '{': + case '[': + count++; + if (tokens == NULL) + { + break; + } + token = fbjs_alloc_token(parser, tokens, num_tokens); + if (token == NULL) + return JSMN_ERROR_NOMEM; + if (parser->toksuper != -1) + { + tokens[parser->toksuper].size++; #ifdef JSMN_PARENT_LINKS - token->parent = parser->toksuper; + token->parent = parser->toksuper; #endif - } - token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); - token->start = parser->pos; - parser->toksuper = parser->toknext - 1; - if (parser->pos > 0) - if (js[parser->pos - 1] == '{' && js[parser->pos] == '[') - return JSMN_ERROR_INVAL; - break; - case '}': - case ']': - if (tokens == NULL) - break; - type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); + } + token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); + token->start = parser->pos; + parser->toksuper = parser->toknext - 1; + if (parser->pos > 0) + if (js[parser->pos - 1] == '{' && js[parser->pos] == '[') + return JSMN_ERROR_INVAL; + break; + case '}': + case ']': + if (tokens == NULL) + break; + type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); #ifdef JSMN_PARENT_LINKS - if (parser->toknext < 1) - { - return JSMN_ERROR_INVAL; - } - token = &tokens[parser->toknext - 1]; - for (;;) - { - if (token->start != -1 && token->end == -1) - { - if (token->type != type) - { - return JSMN_ERROR_INVAL; - } - token->end = parser->pos + 1; - parser->toksuper = token->parent; - break; - } - if (token->parent == -1) - { - if (token->type != type || parser->toksuper == -1) - { - return JSMN_ERROR_INVAL; - } - break; - } - token = &tokens[token->parent]; - } + if (parser->toknext < 1) + { + return JSMN_ERROR_INVAL; + } + token = &tokens[parser->toknext - 1]; + for (;;) + { + if (token->start != -1 && token->end == -1) + { + if (token->type != type) + { + return JSMN_ERROR_INVAL; + } + token->end = parser->pos + 1; + parser->toksuper = token->parent; + break; + } + if (token->parent == -1) + { + if (token->type != type || parser->toksuper == -1) + { + return JSMN_ERROR_INVAL; + } + break; + } + token = &tokens[token->parent]; + } #else - for (i = parser->toknext - 1; i >= 0; i--) - { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) - { - if (token->type != type) - { - return JSMN_ERROR_INVAL; - } - parser->toksuper = -1; - token->end = parser->pos + 1; - break; - } - } - /* Error if unmatched closing bracket */ - if (i == -1) - return JSMN_ERROR_INVAL; - for (; i >= 0; i--) - { - token = &tokens[i]; - if (token->start != -1 && token->end == -1) - { - parser->toksuper = i; - break; - } - } + for (i = parser->toknext - 1; i >= 0; i--) + { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) + { + if (token->type != type) + { + return JSMN_ERROR_INVAL; + } + parser->toksuper = -1; + token->end = parser->pos + 1; + break; + } + } + /* Error if unmatched closing bracket */ + if (i == -1) + return JSMN_ERROR_INVAL; + for (; i >= 0; i--) + { + token = &tokens[i]; + if (token->start != -1 && token->end == -1) + { + parser->toksuper = i; + break; + } + } #endif - break; - case '\"': - r = fbjs_parse_string(parser, js, len, tokens, num_tokens); - if (r < 0) - return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; - case '\t': - case '\r': - case '\n': - case ' ': - break; - case ':': - parser->toksuper = parser->toknext - 1; - break; - case ',': - if (tokens != NULL && parser->toksuper != -1 && - tokens[parser->toksuper].type != JSMN_ARRAY && - tokens[parser->toksuper].type != JSMN_OBJECT) - { + break; + case '\"': + r = fbjs_parse_string(parser, js, len, tokens, num_tokens); + if (r < 0) + return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; + case '\t': + case '\r': + case '\n': + case ' ': + break; + case ':': + parser->toksuper = parser->toknext - 1; + break; + case ',': + if (tokens != NULL && parser->toksuper != -1 && + tokens[parser->toksuper].type != JSMN_ARRAY && + tokens[parser->toksuper].type != JSMN_OBJECT) + { #ifdef JSMN_PARENT_LINKS - parser->toksuper = tokens[parser->toksuper].parent; + parser->toksuper = tokens[parser->toksuper].parent; #else - for (i = parser->toknext - 1; i >= 0; i--) - { - if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) - { - if (tokens[i].start != -1 && tokens[i].end == -1) - { - parser->toksuper = i; - break; - } - } - } -#endif - } - break; -#ifdef JSMN_STRICT - /* In strict mode primitives are: numbers and booleans */ - case '-': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 't': - case 'f': - case 'n': - - /* And they must not be keys of the object */ - if (tokens != NULL && parser->toksuper != -1) + for (i = parser->toknext - 1; i >= 0; i--) + { + if (tokens[i].type == JSMN_ARRAY || tokens[i].type == JSMN_OBJECT) + { + if (tokens[i].start != -1 && tokens[i].end == -1) { - fbjs_tok_t *t = &tokens[parser->toksuper]; - if (t->type == JSMN_OBJECT || - (t->type == JSMN_STRING && t->size != 0)) - { - return JSMN_ERROR_INVAL; - } + parser->toksuper = i; + break; } + } + } +#endif + } + break; +#ifdef JSMN_STRICT + /* In strict mode primitives are: numbers and booleans */ + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 't': + case 'f': + case 'n': + + /* And they must not be keys of the object */ + if (tokens != NULL && parser->toksuper != -1) + { + fbjs_tok_t *t = &tokens[parser->toksuper]; + if (t->type == JSMN_OBJECT || + (t->type == JSMN_STRING && t->size != 0)) + { + return JSMN_ERROR_INVAL; + } + } #else - /* In non-strict mode every unquoted value is a primitive */ - default: + /* In non-strict mode every unquoted value is a primitive */ + default: #endif - r = fbjs_parse_primitive(parser, js, len, tokens, num_tokens); - if (r < 0) - return r; - count++; - if (parser->toksuper != -1 && tokens != NULL) - tokens[parser->toksuper].size++; - break; + r = fbjs_parse_primitive(parser, js, len, tokens, num_tokens); + if (r < 0) + return r; + count++; + if (parser->toksuper != -1 && tokens != NULL) + tokens[parser->toksuper].size++; + break; #ifdef JSMN_STRICT - /* Unexpected char in strict mode */ - default: - return JSMN_ERROR_INVAL; + /* Unexpected char in strict mode */ + default: + return JSMN_ERROR_INVAL; #endif - } } + } - if (tokens != NULL) + if (tokens != NULL) + { + for (i = parser->toknext - 1; i >= 0; i--) { - for (i = parser->toknext - 1; i >= 0; i--) - { - /* Unmatched opened object or array */ - if (tokens[i].start != -1 && tokens[i].end == -1) - { - return JSMN_ERROR_PART; - } - } + /* Unmatched opened object or array */ + if (tokens[i].start != -1 && tokens[i].end == -1) + { + return JSMN_ERROR_PART; + } } + } - return count; + return count; } /** @@ -3027,818 +3049,856 @@ int FirebaseJson::fbjs_parse(fbjs_parser *parser, const char *js, size_t len, */ void FirebaseJson::fbjs_init(fbjs_parser *parser) { - parser->pos = 0; - parser->toknext = 0; - parser->toksuper = -1; + parser->pos = 0; + parser->toknext = 0; + parser->toksuper = -1; } FirebaseJsonArray::FirebaseJsonArray() { - _init(); + _init(); } FirebaseJsonArray::~FirebaseJsonArray() { - _finalize(); - std::string().swap(_jbuf); + _finalize(); + std::string().swap(_jbuf); }; void FirebaseJsonArray::_init() { - _finalize(); - - _pd = _getPGMString(FirebaseJson_STR_4); - _pf = _getPGMString(FirebaseJson_STR_5); - _fls = _getPGMString(FirebaseJson_STR_6); - _tr = _getPGMString(FirebaseJson_STR_7); - _brk3 = _getPGMString(FirebaseJson_STR_10); - _brk4 = _getPGMString(FirebaseJson_STR_11); - _nll = _getPGMString(FirebaseJson_STR_18); - _root = _getPGMString(FirebaseJson_STR_21); - _root2 = _getPGMString(FirebaseJson_STR_26); - _qt = _getPGMString(FirebaseJson_STR_2); - _slash = _getPGMString(FirebaseJson_STR_27); -} - -int FirebaseJsonArray::_strpos(const char *haystack, const char *needle, int offset) -{ - size_t len = strlen(haystack); - size_t len2 = strlen(needle); - if (len == 0 || len < len2 || len2 == 0) - return -1; - char *_haystack = _newPtr(len - offset + 1); - _haystack[len - offset] = 0; - strncpy(_haystack, haystack + offset, len - offset); - char *p = strstr(_haystack, needle); - int r = -1; - if (p) - r = p - _haystack + offset; - _delPtr(_haystack); - return r; -} - -int FirebaseJsonArray::_rstrpos(const char *haystack, const char *needle, int offset) -{ - size_t len = strlen(haystack); - size_t len2 = strlen(needle); - if (len == 0 || len < len2 || len2 == 0) - return -1; - char *_haystack = _newPtr(len - offset + 1); - _haystack[len - offset] = 0; - strncpy(_haystack, haystack + offset, len - offset); - char *p = _rstrstr(_haystack, needle); - int r = -1; - if (p) - r = p - _haystack + offset; - _delPtr(_haystack); - return r; -} - -char *FirebaseJsonArray::_rstrstr(const char *haystack, const char *needle) -{ - size_t needle_length = strlen(needle); - const char *haystack_end = haystack + strlen(haystack) - needle_length; - const char *p; - size_t i; - for (p = haystack_end; p >= haystack; --p) + _finalize(); + + _pd = strP(FirebaseJson_STR_4); + _pf = strP(FirebaseJson_STR_5); + _fls = strP(FirebaseJson_STR_6); + _tr = strP(FirebaseJson_STR_7); + _brk3 = strP(FirebaseJson_STR_10); + _brk4 = strP(FirebaseJson_STR_11); + _nll = strP(FirebaseJson_STR_18); + _root = strP(FirebaseJson_STR_21); + _root2 = strP(FirebaseJson_STR_26); + _qt = strP(FirebaseJson_STR_2); + _slash = strP(FirebaseJson_STR_27); +} + +std::string *FirebaseJsonArray::int_dbuf() +{ + return &_json._jsonData._dbuf; +} + +std::string *FirebaseJsonArray::int_tbuf() +{ + return &_json._tbuf; +} + +std::string *FirebaseJsonArray::int_jbuf() +{ + return &_jbuf; +} +std::string *FirebaseJsonArray::int_rawbuf() +{ + return &_json._rawbuf; +} +FirebaseJson *FirebaseJsonArray::int_json() +{ + return &_json; +} +void FirebaseJsonArray::int_set_arr_len(size_t len) +{ + _arrLen = len; +} + +int FirebaseJsonArray::strpos(const char *haystack, const char *needle, int offset) +{ + size_t len = strlen(haystack); + size_t len2 = strlen(needle); + if (len == 0 || len < len2 || len2 == 0) + return -1; + char *_haystack = newS(len - offset + 1); + _haystack[len - offset] = 0; + strncpy(_haystack, haystack + offset, len - offset); + char *p = strstr(_haystack, needle); + int r = -1; + if (p) + r = p - _haystack + offset; + delS(_haystack); + return r; +} + +int FirebaseJsonArray::rstrpos(const char *haystack, const char *needle, int offset) +{ + size_t len = strlen(haystack); + size_t len2 = strlen(needle); + if (len == 0 || len < len2 || len2 == 0) + return -1; + char *_haystack = newS(len - offset + 1); + _haystack[len - offset] = 0; + strncpy(_haystack, haystack + offset, len - offset); + char *p = rstrstr(_haystack, needle); + int r = -1; + if (p) + r = p - _haystack + offset; + delS(_haystack); + return r; +} + +char *FirebaseJsonArray::rstrstr(const char *haystack, const char *needle) +{ + size_t needle_length = strlen(needle); + const char *haystack_end = haystack + strlen(haystack) - needle_length; + const char *p; + size_t i; + for (p = haystack_end; p >= haystack; --p) + { + for (i = 0; i < needle_length; ++i) { - for (i = 0; i < needle_length; ++i) - { - if (p[i] != needle[i]) - goto next; - } - return (char *)p; - next:; + if (p[i] != needle[i]) + goto next; } - return 0; + return (char *)p; + next:; + } + return 0; } -void FirebaseJsonArray::_delPtr(char *p) +void FirebaseJsonArray::delS(char *p) { - if (p != nullptr) - delete[] p; + if (p != nullptr) + delete[] p; } -char *FirebaseJsonArray::_newPtr(size_t len) +char *FirebaseJsonArray::newS(size_t len) { - char *p = new char[len]; - memset(p, 0, len); - return p; + char *p = new char[len]; + memset(p, 0, len); + return p; } -char *FirebaseJsonArray::_newPtr(char *p, size_t len) +char *FirebaseJsonArray::newS(char *p, size_t len) { - _delPtr(p); - p = _newPtr(len); - return p; + delS(p); + p = newS(len); + return p; } -char *FirebaseJsonArray::_newPtr(char *p, size_t len, char *d) +char *FirebaseJsonArray::newS(char *p, size_t len, char *d) { - _delPtr(p); - p = _newPtr(len); - strcpy(p, d); - return p; + delS(p); + p = newS(len); + strcpy(p, d); + return p; } -char *FirebaseJsonArray::_getPGMString(PGM_P pgm) +char *FirebaseJsonArray::strP(PGM_P pgm) { - size_t len = strlen_P(pgm) + 1; - char *buf = _newPtr(len); - strcpy_P(buf, pgm); - buf[len - 1] = 0; - return buf; + size_t len = strlen_P(pgm) + 1; + char *buf = newS(len); + strcpy_P(buf, pgm); + buf[len - 1] = 0; + return buf; } void FirebaseJsonArray::_finalize() { - _delPtr(_pd); - _delPtr(_pf); - _delPtr(_fls); - _delPtr(_tr); - _delPtr(_brk3); - _delPtr(_brk4); - _delPtr(_nll); - _delPtr(_root); - _delPtr(_root2); - _delPtr(_qt); - _delPtr(_slash); + delS(_pd); + delS(_pf); + delS(_fls); + delS(_tr); + delS(_brk3); + delS(_brk4); + delS(_nll); + delS(_root); + delS(_root2); + delS(_qt); + delS(_slash); } FirebaseJsonArray &FirebaseJsonArray::add() { - _addNull(); - return *this; + _addNull(); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(const String &value) { - _addString(value.c_str()); - return *this; + _addString(value.c_str()); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(const char *value) { - _addString(value); - return *this; + _addString(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(int value) { - _addInt(value); - return *this; + _addInt(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(unsigned short value) { - _addInt(value); - return *this; + _addInt(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(float value) { - _addFloat(value); - return *this; + _addFloat(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(double value) { - _addDouble(value); - return *this; + _addDouble(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(bool value) { - _addBool(value); - return *this; + _addBool(value); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(FirebaseJson &json) { - _addJson(&json); - return *this; + _addJson(&json); + return *this; } FirebaseJsonArray &FirebaseJsonArray::add(FirebaseJsonArray &arr) { - _addArray(&arr); - return *this; + _addArray(&arr); + return *this; } template FirebaseJsonArray &FirebaseJsonArray::add(T value) { - if (std::is_same::value) - _addInt(value); - else if (std::is_same::value) - _addFloat(value); - else if (std::is_same::value) - _addDouble(value); - else if (std::is_same::value) - _addBool(value); - else if (std::is_same::value) - _addString(value); - else if (std::is_same::value) - _addJson(&value); - else if (std::is_same::value) - _addArray(&value); - return *this; + if (std::is_same::value) + _addInt(value); + else if (std::is_same::value) + _addFloat(value); + else if (std::is_same::value) + _addDouble(value); + else if (std::is_same::value) + _addBool(value); + else if (std::is_same::value) + _addString(value); + else if (std::is_same::value) + _addJson(&value); + else if (std::is_same::value) + _addArray(&value); + return *this; } void FirebaseJsonArray::_addString(const std::string &value) { - _arrLen++; - _json._addArrayStr(value.c_str(), value.length(), true); + _arrLen++; + _json._addArrayStr(value.c_str(), value.length(), true); } void FirebaseJsonArray::_addInt(int value) { - _arrLen++; - char *buf = getIntString(value); - sprintf(buf, _pd, value); - _json._addArrayStr(buf, 60, false); - _delPtr(buf); + _arrLen++; + char *buf = intStr(value); + sprintf(buf, _pd, value); + _json._addArrayStr(buf, 60, false); + delS(buf); } void FirebaseJsonArray::_addFloat(float value) { - _arrLen++; - char *buf = getFloatString(value); - _trimDouble(buf); - _json._addArrayStr(buf, 60, false); - _delPtr(buf); + _arrLen++; + char *buf = floatStr(value); + _trimDouble(buf); + _json._addArrayStr(buf, 60, false); + delS(buf); } void FirebaseJsonArray::_addDouble(double value) { - _arrLen++; - char *buf = getDoubleString(value); - _trimDouble(buf); - _json._addArrayStr(buf, 60, false); - _delPtr(buf); + _arrLen++; + char *buf = doubleStr(value); + _trimDouble(buf); + _json._addArrayStr(buf, 60, false); + delS(buf); } void FirebaseJsonArray::_addBool(bool value) { - _arrLen++; - if (value) - _json._addArrayStr(_tr, 6, false); - else - _json._addArrayStr(_fls, 7, false); + _arrLen++; + if (value) + _json._addArrayStr(_tr, 6, false); + else + _json._addArrayStr(_fls, 7, false); } void FirebaseJsonArray::_addNull() { - _arrLen++; - _json._addArrayStr(_nll, 6, false); + _arrLen++; + _json._addArrayStr(_nll, 6, false); } void FirebaseJsonArray::_addJson(FirebaseJson *json) { - _arrLen++; - std::string s; - json->_toStdString(s); - _json._addArrayStr(s.c_str(), s.length(), false); - std::string().swap(s); + _arrLen++; + std::string s; + json->_toStdString(s); + _json._addArrayStr(s.c_str(), s.length(), false); + std::string().swap(s); } void FirebaseJsonArray::_addArray(FirebaseJsonArray *arr) { - _arrLen++; - String arrStr; - arr->toString(arrStr); - _json._addArrayStr(arrStr.c_str(), arrStr.length(), false); + _arrLen++; + String arrStr; + arr->toString(arrStr); + _json._addArrayStr(arrStr.c_str(), arrStr.length(), false); } FirebaseJsonArray &FirebaseJsonArray::setJsonArrayData(const String &data) { - int start_pos = data.indexOf('['); - int end_pos = data.indexOf(']'); - - if (start_pos != -1 && end_pos != -1 && start_pos != end_pos) - { - char *r = _getPGMString(FirebaseJson_STR_21); - _json._rawbuf = r; - _json._rawbuf += data.c_str(); - _delPtr(r); - r = _getPGMString(FirebaseJson_STR_26); - FirebaseJsonData data; - _json.get(data, r); - _delPtr(r); - data.getArray(*this); - data.stringValue.clear(); - } - return *this; + int start_pos = data.indexOf('['); + int end_pos = data.indexOf(']'); + + if (start_pos != -1 && end_pos != -1 && start_pos != end_pos) + { + char *r = strP(FirebaseJson_STR_21); + _json._rawbuf = r; + _json._rawbuf += data.c_str(); + delS(r); + r = strP(FirebaseJson_STR_26); + FirebaseJsonData data; + _json.get(data, r); + delS(r); + data.getArray(*this); + data.stringValue.clear(); + } + return *this; } bool FirebaseJsonArray::get(FirebaseJsonData &jsonData, const String &path) { - return _get(jsonData, path.c_str()); + return _get(jsonData, path.c_str()); } bool FirebaseJsonArray::get(FirebaseJsonData &jsonData, int index) { - char *tmp = getIntString(index); - std::string path = ""; - path += _brk3; - path += tmp; - path += _brk4; - bool ret = _get(jsonData, path.c_str()); - std::string().swap(path); - _delPtr(tmp); - return ret; + char *tmp = intStr(index); + std::string path = ""; + path += _brk3; + path += tmp; + path += _brk4; + bool ret = _get(jsonData, path.c_str()); + std::string().swap(path); + delS(tmp); + return ret; } bool FirebaseJsonArray::_get(FirebaseJsonData &jsonData, const char *path) { - _json._toStdString(_jbuf, false); - _json._rawbuf = _root; - _json._rawbuf += _jbuf; - std::string path2 = _root2; - path2 += _slash; - path2 += path; - _json.clearPathTk(); - _json._strToTk(path2.c_str(), _json._pathTk, '/'); - if (!_json._isArrTk(1)) - { - _json._jsonData.success = false; - goto ex_; - } - if (_json._getArrIndex(1) < 0) - { - _json._jsonData.success = false; - goto ex_; - } - _json._parse(path2.c_str(), FirebaseJson::PRINT_MODE_NONE); - if (_json._jsonData.success) - { - _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2).c_str(); - if (_json._jsonData._type == FirebaseJson::JSMN_STRING && _json._jsonData.stringValue.c_str()[0] == '"' && _json._jsonData.stringValue.c_str()[_json._jsonData.stringValue.length() - 1] == '"') - _json._jsonData.stringValue = _json._jsonData.stringValue.substring(1, _json._jsonData.stringValue.length() - 1).c_str(); - jsonData = _json._jsonData; - } + _json._toStdString(_jbuf, false); + _json._rawbuf = _root; + _json._rawbuf += _jbuf; + std::string path2 = _root2; + path2 += _slash; + path2 += path; + _json.clearPathTk(); + _json._strToTk(path2.c_str(), _json._pathTk, '/'); + if (!_json._isArrTk(1)) + { + _json._jsonData.success = false; + goto ex_; + } + if (_json._getArrIndex(1) < 0) + { + _json._jsonData.success = false; + goto ex_; + } + _json._parse(path2.c_str(), FirebaseJson::PRINT_MODE_NONE); + if (_json._jsonData.success) + { + _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2).c_str(); + if (_json._jsonData._type == FirebaseJson::JSMN_STRING && _json._jsonData.stringValue.c_str()[0] == '"' && _json._jsonData.stringValue.c_str()[_json._jsonData.stringValue.length() - 1] == '"') + _json._jsonData.stringValue = _json._jsonData.stringValue.substring(1, _json._jsonData.stringValue.length() - 1).c_str(); + jsonData = _json._jsonData; + } ex_: - _json.clearPathTk(); - _json._tokens.reset(); - _json._tokens = nullptr; - return _json._jsonData.success; + _json.clearPathTk(); + _json._tokens.reset(); + _json._tokens = nullptr; + return _json._jsonData.success; } size_t FirebaseJsonArray::size() { - return _arrLen; + return _arrLen; } -char *FirebaseJsonArray::getFloatString(float value) +char *FirebaseJsonArray::floatStr(float value) { - char *buf = _newPtr(36); - dtostrf(value, 7, 6, buf); - return buf; + char *buf = newS(36); + helper.dtostrf(value, 7, 6, buf); + return buf; } -char *FirebaseJsonArray::getIntString(int value) +char *FirebaseJsonArray::intStr(int value) { - char *buf = _newPtr(36); - sprintf(buf, "%d", value); - return buf; + char *buf = newS(36); + sprintf(buf, "%d", value); + return buf; } -char *FirebaseJsonArray::getBoolString(bool value) +char *FirebaseJsonArray::boolStr(bool value) { - char *buf = nullptr; - if (value) - buf = _getPGMString(FirebaseJson_STR_7); - else - buf = _getPGMString(FirebaseJson_STR_6); - return buf; + char *buf = nullptr; + if (value) + buf = strP(FirebaseJson_STR_7); + else + buf = strP(FirebaseJson_STR_6); + return buf; } -char *FirebaseJsonArray::getDoubleString(double value) +char *FirebaseJsonArray::doubleStr(double value) { - char *buf = _newPtr(36); - dtostrf(value, 12, 9, buf); - return buf; + char *buf = newS(36); + helper.dtostrf(value, 12, 9, buf); + return buf; } void FirebaseJsonArray::_trimDouble(char *buf) { - size_t i = strlen(buf) - 1; - while (buf[i] == '0' && i > 0) + size_t i = strlen(buf) - 1; + while (buf[i] == '0' && i > 0) + { + if (buf[i - 1] == '.') { - if (buf[i - 1] == '.') - { - i--; - break; - } - if (buf[i - 1] != '0') - break; - i--; + i--; + break; } - if (i < strlen(buf) - 1) - buf[i] = '\0'; + if (buf[i - 1] != '0') + break; + i--; + } + if (i < strlen(buf) - 1) + buf[i] = '\0'; } void FirebaseJsonArray::toString(String &buf, bool prettify) { - char *tmp = _newPtr(1024); - std::string().swap(_json._jsonData._dbuf); - std::string().swap(_json._tbuf); - _json._toStdString(_jbuf, false); - _json._rawbuf = _root; - _json._rawbuf += _jbuf; - if (prettify) - _json._parse(_root2, FirebaseJson::PRINT_MODE_PRETTY); - else - _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); - std::string().swap(_json._tbuf); - std::string().swap(_jbuf); - _json.clearPathTk(); - _json._tokens.reset(); - _json._tokens = nullptr; - _delPtr(tmp); - _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); - buf = _json._jsonData._dbuf.c_str(); - std::string().swap(_json._jsonData._dbuf); + char *tmp = newS(1024); + std::string().swap(_json._jsonData._dbuf); + std::string().swap(_json._tbuf); + _json._toStdString(_jbuf, false); + _json._rawbuf = _root; + _json._rawbuf += _jbuf; + if (prettify) + _json._parse(_root2, FirebaseJson::PRINT_MODE_PRETTY); + else + _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); + std::string().swap(_json._tbuf); + std::string().swap(_jbuf); + _json.clearPathTk(); + _json._tokens.reset(); + _json._tokens = nullptr; + delS(tmp); + _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); + buf = _json._jsonData._dbuf.c_str(); + std::string().swap(_json._jsonData._dbuf); } FirebaseJsonArray &FirebaseJsonArray::clear() { - _json.clear(); - std::string().swap(_jbuf); - _json._jsonData.success = false; - _json._jsonData.stringValue = ""; - _json._jsonData.boolValue = false; - _json._jsonData.doubleValue = 0; - _json._jsonData.intValue = 0; - _json._jsonData.floatValue = 0; - _json._jsonData._len = 0; - _arrLen = 0; - return *this; + _json.clear(); + std::string().swap(_jbuf); + _json._jsonData.success = false; + _json._jsonData.stringValue = ""; + _json._jsonData.boolValue = false; + _json._jsonData.doubleValue = 0; + _json._jsonData.intValue = 0; + _json._jsonData.floatValue = 0; + _json._jsonData._len = 0; + _arrLen = 0; + return *this; } void FirebaseJsonArray::_set2(int index, const char *value, bool isStr) { - char *tmp = _newPtr(50); - std::string path = _brk3; - sprintf(tmp, "%d", index); - path += tmp; - path += _brk4; - _set(path.c_str(), value, isStr); - std::string().swap(path); - _delPtr(tmp); + char *tmp = newS(50); + std::string path = _brk3; + sprintf(tmp, "%d", index); + path += tmp; + path += _brk4; + _set(path.c_str(), value, isStr); + std::string().swap(path); + delS(tmp); } void FirebaseJsonArray::_set(const char *path, const char *value, bool isStr) { - _json._jsonData.success = false; - _json._toStdString(_jbuf, false); - _json._rawbuf = _root; - _json._rawbuf += _jbuf; - char *tmp2 = _newPtr(strlen(value) + 10); - if (isStr) - strcpy_P(tmp2, _qt); - strcat(tmp2, value); - if (isStr) - strcat_P(tmp2, _qt); - std::string path2 = _root2; - path2 += _slash; - path2 += path; - _json.clearPathTk(); - _json._strToTk(path2, _json._pathTk, '/'); - if (!_json._isArrTk(1)) - goto ex_2; - if (_json._getArrIndex(1) < 0) - goto ex_2; - _json._set(path2.c_str(), tmp2); - _delPtr(tmp2); - std::string().swap(path2); + _json._jsonData.success = false; + _json._toStdString(_jbuf, false); + _json._rawbuf = _root; + _json._rawbuf += _jbuf; + char *tmp2 = newS(strlen(value) + 10); + if (isStr) + strcpy_P(tmp2, _qt); + strcat(tmp2, value); + if (isStr) + strcat_P(tmp2, _qt); + std::string path2 = _root2; + path2 += _slash; + path2 += path; + _json.clearPathTk(); + _json._strToTk(path2, _json._pathTk, '/'); + if (!_json._isArrTk(1)) + { + delS(tmp2); + goto ex_2; + } + + if (_json._getArrIndex(1) < 0) + { + delS(tmp2); + goto ex_2; + } + + _json._set(path2.c_str(), tmp2); + delS(tmp2); + std::string().swap(path2); + if (_json._jsonData.success) + { + std::string().swap(_json._jsonData._dbuf); + std::string().swap(_json._tbuf); + _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); if (_json._jsonData.success) { - std::string().swap(_json._jsonData._dbuf); - std::string().swap(_json._tbuf); - _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); - if (_json._jsonData.success) - { - _arrLen = _json._jsonData._len; - _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); - } + _arrLen = _json._jsonData._len; + _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); } - else - _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2); + } + else + _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2); ex_2: - std::string().swap(_json._jsonData._dbuf); - std::string().swap(_json._tbuf); - std::string().swap(_jbuf); - _json.clearPathTk(); - _json._tokens.reset(); - _json._tokens = nullptr; + std::string().swap(_json._jsonData._dbuf); + std::string().swap(_json._tbuf); + std::string().swap(_jbuf); + _json.clearPathTk(); + _json._tokens.reset(); + _json._tokens = nullptr; } void FirebaseJsonArray::set(int index) { - return _setNull(index); + return _setNull(index); } void FirebaseJsonArray::set(const String &path) { - _setNull(path); + _setNull(path); } void FirebaseJsonArray::set(int index, const String &value) { - _setString(index, value.c_str()); + _setString(index, value.c_str()); } void FirebaseJsonArray::set(const String &path, const String &value) { - _setString(path, value.c_str()); + _setString(path, value.c_str()); } void FirebaseJsonArray::set(int index, const char *value) { - _setString(index, value); + _setString(index, value); } void FirebaseJsonArray::set(const String &path, const char *value) { - _setString(path, value); + _setString(path, value); } void FirebaseJsonArray::set(int index, int value) { - _setInt(index, value); + _setInt(index, value); } void FirebaseJsonArray::set(int index, unsigned short value) { - _setInt(index, value); + _setInt(index, value); } void FirebaseJsonArray::set(const String &path, int value) { - _setInt(path, value); + _setInt(path, value); } void FirebaseJsonArray::set(const String &path, unsigned short value) { - _setInt(path, value); + _setInt(path, value); } void FirebaseJsonArray::set(int index, float value) { - _setFloat(index, value); + _setFloat(index, value); } void FirebaseJsonArray::set(const String &path, float value) { - _setFloat(path, value); + _setFloat(path, value); } void FirebaseJsonArray::set(int index, double value) { - _setDouble(index, value); + _setDouble(index, value); } void FirebaseJsonArray::set(const String &path, double value) { - _setDouble(path, value); + _setDouble(path, value); } void FirebaseJsonArray::set(int index, bool value) { - _setBool(index, value); + _setBool(index, value); } void FirebaseJsonArray::set(const String &path, bool value) { - _setBool(path, value); + _setBool(path, value); } void FirebaseJsonArray::set(int index, FirebaseJson &json) { - _setJson(index, &json); + _setJson(index, &json); } void FirebaseJsonArray::set(const String &path, FirebaseJson &json) { - _setJson(path, &json); + _setJson(path, &json); } void FirebaseJsonArray::set(int index, FirebaseJsonArray &arr) { - _setArray(index, &arr); + _setArray(index, &arr); } void FirebaseJsonArray::set(const String &path, FirebaseJsonArray &arr) { - _setArray(path, &arr); + _setArray(path, &arr); } template void FirebaseJsonArray::set(int index, T value) { - if (std::is_same::value) - _setInt(index, value); - else if (std::is_same::value) - _setFloat(index, value); - else if (std::is_same::value) - _setDouble(index, value); - else if (std::is_same::value) - _setBool(index, value); - else if (std::is_same::value) - _setString(index, value); - else if (std::is_same::value) - _setJson(index, &value); - else if (std::is_same::value) - _setArray(index, &value); + if (std::is_same::value) + _setInt(index, value); + else if (std::is_same::value) + _setFloat(index, value); + else if (std::is_same::value) + _setDouble(index, value); + else if (std::is_same::value) + _setBool(index, value); + else if (std::is_same::value) + _setString(index, value); + else if (std::is_same::value) + _setJson(index, &value); + else if (std::is_same::value) + _setArray(index, &value); } template void FirebaseJsonArray::set(const String &path, T value) { - if (std::is_same::value) - _setInt(path, value); - else if (std::is_same::value) - _setFloat(path, value); - else if (std::is_same::value) - _setDouble(path, value); - else if (std::is_same::value) - _setBool(path, value); - else if (std::is_same::value) - _setString(path, value); - else if (std::is_same::value) - _setJson(path, &value); - else if (std::is_same::value) - _setArray(path, &value); + if (std::is_same::value) + _setInt(path, value); + else if (std::is_same::value) + _setFloat(path, value); + else if (std::is_same::value) + _setDouble(path, value); + else if (std::is_same::value) + _setBool(path, value); + else if (std::is_same::value) + _setString(path, value); + else if (std::is_same::value) + _setJson(path, &value); + else if (std::is_same::value) + _setArray(path, &value); } void FirebaseJsonArray::_setString(int index, const std::string &value) { - _set2(index, value.c_str(), true); + _set2(index, value.c_str(), true); } void FirebaseJsonArray::_setString(const String &path, const std::string &value) { - _set(path.c_str(), value.c_str(), true); + _set(path.c_str(), value.c_str(), true); } void FirebaseJsonArray::_setInt(int index, int value) { - char *tmp = getIntString(value); - _set2(index, tmp, false); - _delPtr(tmp); + char *tmp = intStr(value); + _set2(index, tmp, false); + delS(tmp); } void FirebaseJsonArray::_setInt(const String &path, int value) { - char *tmp = getIntString(value); - _set(path.c_str(), tmp, false); - _delPtr(tmp); + char *tmp = intStr(value); + _set(path.c_str(), tmp, false); + delS(tmp); } void FirebaseJsonArray::_setFloat(int index, float value) { - char *tmp = getFloatString(value); - _trimDouble(tmp); - _set2(index, tmp, false); - _delPtr(tmp); + char *tmp = floatStr(value); + _trimDouble(tmp); + _set2(index, tmp, false); + delS(tmp); } void FirebaseJsonArray::_setFloat(const String &path, float value) { - char *tmp = getFloatString(value); - _trimDouble(tmp); - _set(path.c_str(), tmp, false); - _delPtr(tmp); + char *tmp = floatStr(value); + _trimDouble(tmp); + _set(path.c_str(), tmp, false); + delS(tmp); } void FirebaseJsonArray::_setDouble(int index, double value) { - char *tmp = getDoubleString(value); - _trimDouble(tmp); - _set2(index, tmp, false); - _delPtr(tmp); + char *tmp = doubleStr(value); + _trimDouble(tmp); + _set2(index, tmp, false); + delS(tmp); } void FirebaseJsonArray::_setDouble(const String &path, double value) { - char *tmp = getDoubleString(value); - _trimDouble(tmp); - _set(path.c_str(), tmp, false); - _delPtr(tmp); + char *tmp = doubleStr(value); + _trimDouble(tmp); + _set(path.c_str(), tmp, false); + delS(tmp); } void FirebaseJsonArray::_setBool(int index, bool value) { - if (value) - _set2(index, _tr, false); - else - _set2(index, _fls, false); + if (value) + _set2(index, _tr, false); + else + _set2(index, _fls, false); } void FirebaseJsonArray::_setBool(const String &path, bool value) { - if (value) - _set(path.c_str(), _tr, false); - else - _set(path.c_str(), _fls, false); + if (value) + _set(path.c_str(), _tr, false); + else + _set(path.c_str(), _fls, false); } void FirebaseJsonArray::_setNull(int index) { - _set2(index, _nll, false); + _set2(index, _nll, false); } void FirebaseJsonArray::_setNull(const String &path) { - _set(path.c_str(), _nll, false); + _set(path.c_str(), _nll, false); } void FirebaseJsonArray::_setJson(int index, FirebaseJson *json) { - std::string s; - json->_toStdString(s); - _set2(index, s.c_str(), false); - std::string().swap(s); + std::string s; + json->_toStdString(s); + _set2(index, s.c_str(), false); + std::string().swap(s); } void FirebaseJsonArray::_setJson(const String &path, FirebaseJson *json) { - std::string s; - json->_toStdString(s); - _set(path.c_str(), s.c_str(), false); - std::string().swap(s); + std::string s; + json->_toStdString(s); + _set(path.c_str(), s.c_str(), false); + std::string().swap(s); } void FirebaseJsonArray::_setArray(int index, FirebaseJsonArray *arr) { - std::string s; - arr->_toStdString(s); - _set2(index, s.c_str(), false); - std::string().swap(s); + std::string s; + arr->_toStdString(s); + _set2(index, s.c_str(), false); + std::string().swap(s); } void FirebaseJsonArray::_setArray(const String &path, FirebaseJsonArray *arr) { - std::string s; - arr->_toStdString(s); - _set(path.c_str(), s.c_str(), false); - std::string().swap(s); + std::string s; + arr->_toStdString(s); + _set(path.c_str(), s.c_str(), false); + std::string().swap(s); } bool FirebaseJsonArray::remove(int index) { - char *tmp = getIntString(index); - std::string path = ""; - path += _brk3; - path += tmp; - path += _brk4; - bool ret = _remove(path.c_str()); - std::string().swap(path); - _delPtr(tmp); - return ret; + char *tmp = intStr(index); + std::string path = ""; + path += _brk3; + path += tmp; + path += _brk4; + bool ret = _remove(path.c_str()); + std::string().swap(path); + delS(tmp); + return ret; } bool FirebaseJsonArray::remove(const String &path) { - return _remove(path.c_str()); + return _remove(path.c_str()); } bool FirebaseJsonArray::_remove(const char *path) { - _json._toStdString(_jbuf, false); - _json._rawbuf = _root; - _json._rawbuf += _jbuf; - char *tmp2 = _newPtr(2); - std::string path2 = _root2; - path2 += _slash; - path2 += path; - _json._jsonData.success = _json.remove(path2.c_str()); - _delPtr(tmp2); - std::string().swap(path2); - bool success = _json._jsonData.success; + _json._toStdString(_jbuf, false); + _json._rawbuf = _root; + _json._rawbuf += _jbuf; + std::string path2 = _root2; + path2 += _slash; + path2 += path; + _json._jsonData.success = _json.remove(path2.c_str()); + std::string().swap(path2); + bool success = _json._jsonData.success; + if (_json._jsonData.success) + { + std::string().swap(_json._jsonData._dbuf); + std::string().swap(_json._tbuf); + _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); if (_json._jsonData.success) { - std::string().swap(_json._jsonData._dbuf); - std::string().swap(_json._tbuf); - _json._parse(_root2, FirebaseJson::PRINT_MODE_PLAIN); - if (_json._jsonData.success) - { - _arrLen = _json._jsonData._len; - _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); - } + _arrLen = _json._jsonData._len; + _json._rawbuf = _json._jsonData._dbuf.substr(1, _json._jsonData._dbuf.length() - 2); } - else - _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2); + } + else + _json._rawbuf = _jbuf.substr(1, _jbuf.length() - 2); - if (_json._rawbuf.length() == 0) - { - _json._jsonData.success = success; - _arrLen = 0; - } + if (_json._rawbuf.length() == 0) + { + _json._jsonData.success = success; + _arrLen = 0; + } + + return _json._jsonData.success; +} - return _json._jsonData.success; +void FirebaseJsonArray::int_toStdString(std::string &s) +{ + _json._toStdString(s); } void FirebaseJsonArray::_toStdString(std::string &s) { - _json._toStdString(s, false); + _json._toStdString(s, false); } FirebaseJsonData::FirebaseJsonData() @@ -3847,40 +3907,40 @@ FirebaseJsonData::FirebaseJsonData() FirebaseJsonData::~FirebaseJsonData() { - std::string().swap(_dbuf); + std::string().swap(_dbuf); } bool FirebaseJsonData::getArray(FirebaseJsonArray &jsonArray) { - if (typeNum != FirebaseJson::JSON_ARRAY || !success) - return false; - char *tmp = new char[1024]; - memset(tmp, 0, 1024); - char *nbuf = new char[2]; - memset(nbuf, 0, 2); - strcpy_P(tmp, FirebaseJson_STR_21); - jsonArray._json._toStdString(jsonArray._jbuf, false); - jsonArray._json._rawbuf = tmp; - jsonArray._json._rawbuf += stringValue.c_str(); - memset(tmp, 0, 1024); - strcpy_P(tmp, FirebaseJson_STR_26); - std::string().swap(jsonArray._json._jsonData._dbuf); - std::string().swap(jsonArray._json._tbuf); - jsonArray._json._parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); - jsonArray._json._rawbuf = jsonArray._json._jsonData._dbuf.substr(1, jsonArray._json._jsonData._dbuf.length() - 2).c_str(); - jsonArray._arrLen = jsonArray._json._jsonData._len; - delete[] tmp; - delete[] nbuf; - return jsonArray._json._jsonData.success; + if (typeNum != FirebaseJson::JSON_ARRAY || !success) + return false; + char *tmp = new char[1024]; + memset(tmp, 0, 1024); + char *nbuf = new char[2]; + memset(nbuf, 0, 2); + strcpy_P(tmp, FirebaseJson_STR_21); + jsonArray._json._toStdString(jsonArray._jbuf, false); + jsonArray._json._rawbuf = tmp; + jsonArray._json._rawbuf += stringValue.c_str(); + memset(tmp, 0, 1024); + strcpy_P(tmp, FirebaseJson_STR_26); + std::string().swap(jsonArray._json._jsonData._dbuf); + std::string().swap(jsonArray._json._tbuf); + jsonArray._json._parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); + jsonArray._json._rawbuf = jsonArray._json._jsonData._dbuf.substr(1, jsonArray._json._jsonData._dbuf.length() - 2).c_str(); + jsonArray._arrLen = jsonArray._json._jsonData._len; + delete[] tmp; + delete[] nbuf; + return jsonArray._json._jsonData.success; } bool FirebaseJsonData::getJSON(FirebaseJson &json) { - if (typeNum != FirebaseJson::JSON_OBJECT || !success) - return false; - json.setJsonData(stringValue); - json._fbjs_parse(); - return json._jsonData.success; + if (typeNum != FirebaseJson::JSON_OBJECT || !success) + return false; + json.setJsonData(stringValue); + json._fbjs_parse(); + return json._jsonData.success; } #endif \ No newline at end of file diff --git a/src/json/FirebaseJson.h b/src/json/FirebaseJson.h index 7a457967d..3cb92371e 100644 --- a/src/json/FirebaseJson.h +++ b/src/json/FirebaseJson.h @@ -1,9 +1,9 @@ /* - * FirebaseJson, version 2.3.10 + * FirebaseJson, version 2.3.11 * - * The Easiest ESP8266/ESP32 Arduino library for parse, create and edit JSON object using a relative path. + * The Easiest Arduino library to parse, create and edit JSON object using a relative path. * - * December 24, 2020 + * March 25, 2021 * * Features * - None recursive operations @@ -14,7 +14,7 @@ * The zserge's JSON object parser library used as part of this library * * The MIT License (MIT) - * Copyright (c) 2019 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * Copyright (c) 2012–2018, Serge Zaitsev, zaitsev.serge@gmail.com * * @@ -42,6 +42,22 @@ #include #include #include +#include +#include +#include +#include + +#if defined __has_include +#if __has_include() +#include +#endif +#endif + +#if defined(__arm__) +#include +#elif defined(__AVR__) +#else +#endif static const char FirebaseJson_STR_1[] PROGMEM = ","; static const char FirebaseJson_STR_2[] PROGMEM = "\""; @@ -73,20 +89,144 @@ static const char FirebaseJson_STR_27[] PROGMEM = "/"; class FirebaseJson; class FirebaseJsonArray; +class FirebaseJsonHelper +{ +public: + FirebaseJsonHelper(){}; + ~FirebaseJsonHelper(){}; + + /** dtostrf function is taken from + * https://github.com/stm32duino/Arduino_Core_STM32/blob/master/cores/arduino/avr/dtostrf.c + */ + + /** + * dtostrf - Emulation for dtostrf function from avr-libc + * Copyright (c) 2013 Arduino. All rights reserved. + * Written by Cristian Maglie + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + char *dtostrf(double val, signed char width, unsigned char prec, char *sout) + { + //Commented code is the original version + /** + char fmt[20]; + sprintf(fmt, "%%%d.%df", width, prec); + sprintf(sout, fmt, val); + return sout; + */ + + // Handle negative numbers + uint8_t negative = 0; + if (val < 0.0) + { + negative = 1; + val = -val; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (int i = 0; i < prec; ++i) + { + rounding /= 10.0; + } + + val += rounding; + + // Extract the integer part of the number + unsigned long int_part = (unsigned long)val; + double remainder = val - (double)int_part; + + if (prec > 0) + { + // Extract digits from the remainder + unsigned long dec_part = 0; + double decade = 1.0; + for (int i = 0; i < prec; i++) + { + decade *= 10.0; + } + remainder *= decade; + dec_part = (int)remainder; + + if (negative) + { + sprintf(sout, "-%ld.%0*ld", int_part, prec, dec_part); + } + else + { + sprintf(sout, "%ld.%0*ld", int_part, prec, dec_part); + } + } + else + { + if (negative) + { + sprintf(sout, "-%ld", int_part); + } + else + { + sprintf(sout, "%ld", int_part); + } + } + // Handle minimum field width of the output string + // width is signed value, negative for left adjustment. + // Range -128,127 + char fmt[129] = ""; + unsigned int w = width; + if (width < 0) + { + negative = 1; + w = -width; + } + else + { + negative = 0; + } + + if (strlen(sout) < w) + { + memset(fmt, ' ', 128); + fmt[w - strlen(sout)] = '\0'; + if (negative == 0) + { + char *tmp = (char *)malloc(strlen(sout) + 1); + strcpy(tmp, sout); + strcpy(sout, fmt); + strcat(sout, tmp); + free(tmp); + } + else + { + // left adjustment + strcat(sout, fmt); + } + } + + return sout; + } +}; + class FirebaseJsonData { - friend class FirebaseJson; - friend class FirebaseJsonArray; - friend class FB_CM; - friend class FirebaseStream; - friend class FirebaseData; - friend class GG_CloudStorage; + friend class FirebaseJson; + friend class FirebaseJsonArray; public: - FirebaseJsonData(); - ~FirebaseJsonData(); + FirebaseJsonData(); + ~FirebaseJsonData(); - /* + /* Get array data as FirebaseJsonArray object from FirebaseJsonData object. @param jsonArray - The returning FirebaseJsonArray object. @@ -96,9 +236,9 @@ class FirebaseJsonData This should call after parse or get function. */ - bool getArray(FirebaseJsonArray &jsonArray); + bool getArray(FirebaseJsonArray &jsonArray); - /* + /* Get array data as FirebaseJson object from FirebaseJsonData object. @param jsonArray - The returning FirebaseJson object. @@ -108,204 +248,196 @@ class FirebaseJsonData This should call after parse or get function. */ - bool getJSON(FirebaseJson &json); + bool getJSON(FirebaseJson &json); - /* + /* The String value of parses data. */ - String stringValue = ""; + String stringValue = ""; - /* + /* The int value of parses data. */ - int intValue = 0; + int intValue = 0; - /* + /* The float value of parses data. */ - float floatValue = 0.0f; + float floatValue = 0.0f; - /* + /* The double value of parses data. */ - double doubleValue = 0.0; + double doubleValue = 0.0; - /* + /* The bool value of parses data. */ - bool boolValue = false; + bool boolValue = false; - /* + /* The type String of parses data. */ - String type = ""; + String type = ""; - /* + /* The type (number) of parses data. */ - uint8_t typeNum = 0; + uint8_t typeNum = 0; - /* + /* The success flag of parsing data. */ - bool success = false; + bool success = false; private: - int _type = 0; - int _k_start = 0; - int _start = 0; - int _end = 0; - int _tokenIndex = 0; - int _depth = 0; - int _len = 0; - std::string _dbuf = ""; + int _type = 0; + int _k_start = 0; + int _start = 0; + int _end = 0; + int _tokenIndex = 0; + int _depth = 0; + int _len = 0; + std::string _dbuf = ""; }; class FirebaseJson { - friend class FirebaseJsonArray; - friend class FirebaseJsonData; - friend class Firebase_ESP_Client; - friend class Firebase_Signer; - friend class FirebaseData; - friend class FirebaseStream; - friend class FB_RTDB; - friend class FB_CM; - friend class FB_Firestore; - friend class FB_Functions; - friend class PolicyBuilder; - friend class PolicyInfo; - friend class GG_CloudStorage; + friend class FirebaseJsonArray; + friend class FirebaseJsonData; public: - typedef enum { - JSON_UNDEFINED = 0, - JSON_OBJECT = 1, - JSON_ARRAY = 2, - JSON_STRING = 3, - JSON_INT = 4, - JSON_FLOAT = 5, - JSON_DOUBLE = 6, - JSON_BOOL = 7, - JSON_NULL = 8 - } jsonDataType; - - typedef enum { - PRINT_MODE_NONE = -1, - PRINT_MODE_PLAIN = 0, - PRINT_MODE_PRETTY = 1 - } PRINT_MODE; - - typedef struct - { - bool matched = false; - std::string tk = ""; - } path_tk_t; - - typedef struct - { - int index; - bool firstTk; - bool lastTk; - bool success; - } single_child_parent_t; - - typedef struct - { - uint16_t index; - uint8_t type; - } eltk_t; - - typedef struct - { - uint16_t index; - uint8_t type; - uint16_t olen; - uint16_t oindex; - int depth; - bool omark; - bool ref; - bool skip; - } el_t; - - typedef struct - { - int index; - uint16_t oindex; - uint16_t olen; - uint8_t type; - int depth; - bool omark; - bool ref; - bool skip; - } tk_index_t; - - /** + typedef enum + { + JSON_UNDEFINED = 0, + JSON_OBJECT = 1, + JSON_ARRAY = 2, + JSON_STRING = 3, + JSON_INT = 4, + JSON_FLOAT = 5, + JSON_DOUBLE = 6, + JSON_BOOL = 7, + JSON_NULL = 8 + } jsonDataType; + + typedef enum + { + PRINT_MODE_NONE = -1, + PRINT_MODE_PLAIN = 0, + PRINT_MODE_PRETTY = 1 + } PRINT_MODE; + + typedef struct + { + bool matched = false; + std::string tk = ""; + } path_tk_t; + + typedef struct + { + int index; + bool firstTk; + bool lastTk; + bool success; + } single_child_parent_t; + + typedef struct + { + uint16_t index; + uint8_t type; + } eltk_t; + + typedef struct + { + uint16_t index; + uint8_t type; + uint16_t olen; + uint16_t oindex; + int depth; + bool omark; + bool ref; + bool skip; + } el_t; + + typedef struct + { + int index; + uint16_t oindex; + uint16_t olen; + uint8_t type; + int depth; + bool omark; + bool ref; + bool skip; + } tk_index_t; + + /** * JSON type identifier. Basic types are: * o Object * o Array * o String * o Other primitive: number, boolean (true/false) or null */ - typedef enum { - JSMN_UNDEFINED = 0, - JSMN_OBJECT = 1, - JSMN_ARRAY = 2, - JSMN_STRING = 3, - JSMN_PRIMITIVE = 4 - } fbjs_type_t; - - enum fbjs_err - { - /* Not enough tokens were provided */ - JSMN_ERROR_NOMEM = -1, - /* Invalid character inside JSON string */ - JSMN_ERROR_INVAL = -2, - /* The string is not a full JSON packet, more bytes expected */ - JSMN_ERROR_PART = -3 - }; - - /** + typedef enum + { + JSMN_UNDEFINED = 0, + JSMN_OBJECT = 1, + JSMN_ARRAY = 2, + JSMN_STRING = 3, + JSMN_PRIMITIVE = 4 + } fbjs_type_t; + + enum fbjs_err + { + /* Not enough tokens were provided */ + JSMN_ERROR_NOMEM = -1, + /* Invalid character inside JSON string */ + JSMN_ERROR_INVAL = -2, + /* The string is not a full JSON packet, more bytes expected */ + JSMN_ERROR_PART = -3 + }; + + /** * JSON token description. * type type (object, array, string etc.) * start start position in JSON data string * end end position in JSON data string */ - typedef struct - { - fbjs_type_t type; - int start; - int end; - int size; + typedef struct + { + fbjs_type_t type; + int start; + int end; + int size; #ifdef JSMN_PARENT_LINKS - int parent; + int parent; #endif - } fbjs_tok_t; + } fbjs_tok_t; - /** + /** * JSON parser. Contains an array of token blocks available. Also stores * the string being parsed now and current position in that string */ - typedef struct - { - unsigned int pos; /* offset in the JSON string */ - unsigned int toknext; /* next token to allocate */ - int toksuper; /* superior token node, e.g parent object or array */ - } fbjs_parser; - - FirebaseJson(); - FirebaseJson(std::string &data); - ~FirebaseJson(); - - /* + typedef struct + { + unsigned int pos; /* offset in the JSON string */ + unsigned int toknext; /* next token to allocate */ + int toksuper; /* superior token node, e.g parent object or array */ + } fbjs_parser; + + FirebaseJson(); + FirebaseJson(std::string &data); + ~FirebaseJson(); + + /* Clear internal buffer of FirebaseJson object.z @return instance of an object. */ - FirebaseJson &clear(); + FirebaseJson &clear(); - /* + /* Set JSON data (JSON object string) to FirebaseJson object. @param data - The JSON object string. @@ -313,9 +445,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &setJsonData(const String &data); + FirebaseJson &setJsonData(const String &data); - /* + /* Add null to FirebaseJson object. @param key - The new key string that null to be added. @@ -323,9 +455,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key); + FirebaseJson &add(const String &key); - /* + /* Add string to FirebaseJson object. @param key - The new key string that string value to be added. @@ -335,9 +467,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, const String &value); + FirebaseJson &add(const String &key, const String &value); - /* + /* Add string (chars array) to FirebaseJson object. @param key - The new key string that string (chars array) value to be added. @@ -347,9 +479,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, const char *value); + FirebaseJson &add(const String &key, const char *value); - /* + /* Add integer/unsigned short to FirebaseJson object. @param key - The new key string in which value to be added. @@ -359,10 +491,10 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, int value); - FirebaseJson &add(const String &key, unsigned short value); + FirebaseJson &add(const String &key, int value); + FirebaseJson &add(const String &key, unsigned short value); - /* + /* Add float to FirebaseJson object. @param key - The new key string that double value to be added. @@ -373,9 +505,9 @@ class FirebaseJson */ - FirebaseJson &add(const String &key, float value); + FirebaseJson &add(const String &key, float value); - /* + /* Add double to FirebaseJson object. @param key - The new key string that double value to be added. @@ -385,9 +517,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, double value); + FirebaseJson &add(const String &key, double value); - /* + /* Add boolean to FirebaseJson object. @param key - The new key string that bool value to be added. @@ -397,9 +529,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, bool value); + FirebaseJson &add(const String &key, bool value); - /* + /* Add nested FirebaseJson object into FirebaseJson object. @param key - The new key string that FirebaseJson object to be added. @@ -409,9 +541,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, FirebaseJson &json); + FirebaseJson &add(const String &key, FirebaseJson &json); - /* + /* Add nested FirebaseJsonArray object into FirebaseJson object. @param key - The new key string that FirebaseJsonArray object to be added. @@ -421,9 +553,9 @@ class FirebaseJson @return instance of an object. */ - FirebaseJson &add(const String &key, FirebaseJsonArray &arr); + FirebaseJson &add(const String &key, FirebaseJsonArray &arr); - /* + /* Get the FirebaseJson object serialized string. @param buf - The returning String object. @@ -431,9 +563,9 @@ class FirebaseJson @param prettify - Boolean flag for return the pretty format string i.e. with text indentation and newline. */ - void toString(String &buf, bool prettify = false); + void toString(String &buf, bool prettify = false); - /* + /* Get the value from the specified node path in FirebaseJson object. @param jsonData - The returning FirebaseJsonData that holds the returned data. @@ -474,9 +606,9 @@ class FirebaseJson FirebaseJson::NULL = 8 */ - bool get(FirebaseJsonData &jsonData, const String &path, bool prettify = false); + bool get(FirebaseJsonData &jsonData, const String &path, bool prettify = false); - /* + /* Parse and collect all node/array elements in FirebaseJson object. @param data - The JSON data string to parse (optional to replace the internal buffer with new data). @@ -484,9 +616,9 @@ class FirebaseJson @return number of child/array elements in FirebaseJson object. */ - size_t iteratorBegin(const char *data = NULL); + size_t iteratorBegin(const char *data = NULL); - /* + /* Get child/array elements from FirebaseJson objects at specified index. @param index - The element index to get. @@ -498,15 +630,15 @@ class FirebaseJson @param value - The string which holds the value for the element key or array. */ - void iteratorGet(size_t index, int &type, String &key, String &value); + void iteratorGet(size_t index, int &type, String &key, String &value); - /* + /* Clear all iterator buffer (should be called since iteratorBegin was called). */ - void iteratorEnd(); + void iteratorEnd(); - /* + /* Set null to FirebaseJson object at the specified node path. @param path - The relative path that null to be set. @@ -515,9 +647,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path); + void set(const String &path); - /* + /* Set String value to FirebaseJson object at the specified node path. @param path - The relative path that string value to be set. @@ -528,9 +660,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, const String &value); + void set(const String &path, const String &value); - /* + /* Set string (chars array) value to FirebaseJson object at the specified node path. @param path - The relative path that string (chars array) to be set. @@ -541,9 +673,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, const char *value); + void set(const String &path, const char *value); - /* + /* Set integer/unsigned short value to FirebaseJson object at specified node path. @param path - The relative path that int value to be set. @@ -554,10 +686,10 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, int value); - void set(const String &path, unsigned short value); + void set(const String &path, int value); + void set(const String &path, unsigned short value); - /* + /* Set the float value to FirebaseJson object at the specified node path. @param path - The relative path that float value to be set. @@ -568,9 +700,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, float value); + void set(const String &path, float value); - /* + /* Set the double value to FirebaseJson object at the specified node path. @param path - The relative path that double value to be set. @@ -581,9 +713,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, double value); + void set(const String &path, double value); - /* + /* Set boolean value to FirebaseJson object at the specified node path. @param path - The relative path that bool value to be set. @@ -595,9 +727,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, bool value); + void set(const String &path, bool value); - /* + /* Set nested FirebaseJson object to FirebaseJson object at the specified node path. @param path - The relative path that nested FirebaseJson object to be set. @@ -608,9 +740,9 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, FirebaseJson &json); + void set(const String &path, FirebaseJson &json); - /* + /* Set nested FirebaseJsonAtrray object to FirebaseJson object at specified node path. @param path - The relative path that nested FirebaseJsonAtrray object to be set. @@ -622,187 +754,188 @@ class FirebaseJson e.g. /myRoot/[2]/Sensor1/myData/[3]. */ - void set(const String &path, FirebaseJsonArray &arr); + void set(const String &path, FirebaseJsonArray &arr); - /* + /* Remove the specified node and its content. @param path - The relative path to remove its contents/children. @return bool value represents the success operation. */ - bool remove(const String &path); + bool remove(const String &path); - template - FirebaseJson &add(const String &key, T value); - template - bool set(const String &path, T value); + template + FirebaseJson &add(const String &key, T value); + template + bool set(const String &path, T value); + + void int_parse(const char *path, PRINT_MODE printMode); + void int_clearPathTk(); + void int_clearTokens(); + size_t int_get_jsondata_len(); + void int_tostr(std::string &s, bool prettify = false); + void int_toStdString(std::string &s, bool isJson = true); private: - int _nextToken = 0; - int _refToken = -1; - int _nextDepth = 0; - int _parentIndex = -1; - int _parseDepth = 0; - int _skipDepth = -1; - int _parseCompleted = -1; - int _refTkIndex = -1; - int _remTkIndex = -1; - int _tokenCount = 0; - bool _TkRefOk = false; - bool _tokenMatch = false; - bool _remFirstTk = false; - bool _remLastTk = false; - bool _collectTk = false; - bool _paresRes = false; - bool _arrReplaced = false; - bool _arrInserted = false; - fbjs_type_t _topLevelTkType = JSMN_OBJECT; - - char *_qt = nullptr; - char *_tab = nullptr; - char *_brk1 = nullptr; - char *_brk2 = nullptr; - char *_brk3 = nullptr; - char *_brk4 = nullptr; - char *_cm = nullptr; - char *_nl = nullptr; - char *_nll = nullptr; - char *_pr = nullptr; - char *_pr2 = nullptr; - char *_pd = nullptr; - char *_pf = nullptr; - char *_fls = nullptr; - char *_tr = nullptr; - char *_string = nullptr; - char *_int = nullptr; - char *_dbl = nullptr; - char *_bl = nullptr; - char *_obj = nullptr; - char *_arry = nullptr; - char *_undef = nullptr; - char *_dot = nullptr; - - std::string _rawbuf = ""; - std::string _tbuf = ""; - tk_index_t _lastTk; - std::vector _pathTk = std::vector(); - std::vector _eltk = std::vector(); - std::vector _el = std::vector(); - FirebaseJsonData _jsonData; - - std::shared_ptr _parser = std::shared_ptr(new fbjs_parser()); - std::shared_ptr _tokens = nullptr; - - void _init(); - void _finalize(); - FirebaseJson &_setJsonData(std::string &data); - FirebaseJson &_add(const char *key, const char *value, size_t klen, size_t vlen, bool isString = true, bool isJson = true); - FirebaseJson &_addArrayStr(const char *value, size_t len, bool isString); - void _resetParseResult(); - void _setElementType(); - void _addString(const std::string &key, const std::string &value); - void _addArray(const std::string &key, FirebaseJsonArray *arr); - void _addInt(const std::string &key, int value); - void _addFloat(const std::string &key, float value); - void _addDouble(const std::string &key, double value); - void _addBool(const std::string &key, bool value); - void _addNull(const std::string &key); - void _addJson(const std::string &key, FirebaseJson *json); - void _setString(const std::string &path, const std::string &value); - void _setInt(const std::string &path, int value); - void _setFloat(const std::string &path, float value); - void _setDouble(const std::string &path, double value); - void _setBool(const std::string &path, bool value); - void _setNull(const std::string &path); - void _setJson(const std::string &path, FirebaseJson *json); - void _setArray(const std::string &path, FirebaseJsonArray *arr); - void _set(const char *path, const char *data); - void clearPathTk(); - void _parse(const char *path, PRINT_MODE printMode); - void _parse(const char *key, int depth, int index, PRINT_MODE printMode); - void _compile(const char *key, int depth, int index, const char *replace, PRINT_MODE printMode, int refTokenIndex = -1, bool removeTk = false); - void _remove(const char *key, int depth, int index, const char *replace, int refTokenIndex = -1, bool removeTk = false); - void _fbjs_parse(bool collectTk = false); - bool _updateTkIndex(uint16_t index, int &depth, char *searchKey, int searchIndex, char *replace, PRINT_MODE printMode, bool advanceCount); - bool _updateTkIndex2(std::string &str, uint16_t index, int &depth, char *searchKey, int searchIndex, char *replace, PRINT_MODE printMode); - bool _updateTkIndex3(uint16_t index, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode); - void _getTkIndex(int depth, tk_index_t &tk); - void _setMark(int depth, bool mark); - void _setSkip(int depth, bool skip); - void _setRef(int depth, bool ref); - void _insertChilds(char *data, PRINT_MODE printMode); - void _addObjNodes(std::string &str, std::string &str2, int index, char *data, PRINT_MODE printMode); - void _addArrNodes(std::string &str, std::string &str2, int index, char *data, PRINT_MODE printMode); - void _compileToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode, char *replace, int refTokenIndex = -1, bool removeTk = false); - void _parseToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode); - void _removeToken(uint16_t &i, char *buf, int &depth, char *searchKey, int searchIndex, PRINT_MODE printMode, char *replace, int refTokenIndex = -1, bool removeTk = false); - single_child_parent_t _findSCParent(int depth); - bool _isArrTk(int index); - bool _isStrTk(int index); - int _getArrIndex(int index); - char *getFloatString(float value); - char *getDoubleString(double value); - char *getIntString(int value); - char *getBoolString(bool value); - char *getPGMString(PGM_P pgm); - void _trimDouble(char *buf); - void _get(const char *key, int depth, int index = -1); - void _ltrim(std::string &str, const std::string &chars = " "); - void _rtrim(std::string &str, const std::string &chars = " "); - void _trim(std::string &str, const std::string &chars = " "); - void _toStdString(std::string &s, bool isJson = true); - void _tostr(std::string &s, bool prettify = false); - void _strToTk(const std::string &str, std::vector &tk, char delim); - int _strpos(const char *haystack, const char *needle, int offset); - int _rstrpos(const char *haystack, const char *needle, int offset); - char *_rstrstr(const char *haystack, const char *needle); - void _delPtr(char *p); - char *_newPtr(size_t len); - char *_newPtr(char *p, size_t len); - char *_newPtr(char *p, size_t len, char *d); - char *_getPGMString(PGM_P pgm); - - void fbjs_init(fbjs_parser *parser); - int fbjs_parse(fbjs_parser *parser, const char *js, size_t len, - fbjs_tok_t *tokens, unsigned int num_tokens); - int fbjs_parse_string(fbjs_parser *parser, const char *js, - size_t len, fbjs_tok_t *tokens, size_t num_tokens); - int fbjs_parse_primitive(fbjs_parser *parser, const char *js, - size_t len, fbjs_tok_t *tokens, size_t num_tokens); - void fbjs_fill_token(fbjs_tok_t *token, fbjs_type_t type, - int start, int end); - fbjs_tok_t *fbjs_alloc_token(fbjs_parser *parser, - fbjs_tok_t *tokens, size_t num_tokens); + FirebaseJsonHelper helper; + int _nextToken = 0; + int _refToken = -1; + int _nextDepth = 0; + int _parentIndex = -1; + int _parseDepth = 0; + int _skipDepth = -1; + int _parseCompleted = -1; + int _refTkIndex = -1; + int _remTkIndex = -1; + int _tokenCount = 0; + bool _TkRefOk = false; + bool _tokenMatch = false; + bool _remFirstTk = false; + bool _remLastTk = false; + bool _collectTk = false; + bool _paresRes = false; + bool _arrReplaced = false; + bool _arrInserted = false; + fbjs_type_t _topLevelTkType = JSMN_OBJECT; + + char *_qt = nullptr; + char *_tab = nullptr; + char *_brk1 = nullptr; + char *_brk2 = nullptr; + char *_brk3 = nullptr; + char *_brk4 = nullptr; + char *_cm = nullptr; + char *_nl = nullptr; + char *_nll = nullptr; + char *_pr = nullptr; + char *_pr2 = nullptr; + char *_pd = nullptr; + char *_pf = nullptr; + char *_fls = nullptr; + char *_tr = nullptr; + char *_string = nullptr; + char *_int = nullptr; + char *_dbl = nullptr; + char *_bl = nullptr; + char *_obj = nullptr; + char *_arry = nullptr; + char *_undef = nullptr; + char *_dot = nullptr; + + std::string _rawbuf = ""; + std::string _tbuf = ""; + tk_index_t _lastTk; + std::vector _pathTk = std::vector(); + std::vector _eltk = std::vector(); + std::vector _el = std::vector(); + FirebaseJsonData _jsonData; + + std::shared_ptr _parser = std::shared_ptr(new fbjs_parser()); + std::shared_ptr _tokens = nullptr; + + void _init(); + void _finalize(); + FirebaseJson &_setJsonData(std::string &data); + FirebaseJson &_add(const char *key, const char *value, size_t klen, size_t vlen, bool isString = true, bool isJson = true); + FirebaseJson &_addArrayStr(const char *value, size_t len, bool isString); + void _resetParseResult(); + void _setElementType(); + void _addString(const std::string &key, const std::string &value); + void _addArray(const std::string &key, FirebaseJsonArray *arr); + void _addInt(const std::string &key, int value); + void _addFloat(const std::string &key, float value); + void _addDouble(const std::string &key, double value); + void _addBool(const std::string &key, bool value); + void _addNull(const std::string &key); + void _addJson(const std::string &key, FirebaseJson *json); + void _setString(const std::string &path, const std::string &value); + void _setInt(const std::string &path, int value); + void _setFloat(const std::string &path, float value); + void _setDouble(const std::string &path, double value); + void _setBool(const std::string &path, bool value); + void _setNull(const std::string &path); + void _setJson(const std::string &path, FirebaseJson *json); + void _setArray(const std::string &path, FirebaseJsonArray *arr); + void _set(const char *path, const char *data); + void clearPathTk(); + void _parse(const char *path, PRINT_MODE printMode); + void _parse(const char *key, int depth, int index, PRINT_MODE printMode); + void _compile(const char *key, int depth, int index, const char *replace, PRINT_MODE printMode, int refTokenIndex = -1, bool removeTk = false); + void _remove(const char *key, int depth, int index, const char *replace, int refTokenIndex = -1, bool removeTk = false); + void _fbjs_parse(bool collectTk = false); + bool _updateTkIndex(uint16_t index, int &depth, const char *searchKey, int searchIndex, const char *replace, PRINT_MODE printMode, bool advanceCount); + bool _updateTkIndex2(std::string &str, uint16_t index, int &depth, const char *searchKey, int searchIndex, const char *replace, PRINT_MODE printMode); + bool _updateTkIndex3(uint16_t index, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode); + void _getTkIndex(int depth, tk_index_t &tk); + void _setMark(int depth, bool mark); + void _setSkip(int depth, bool skip); + void _setRef(int depth, bool ref); + void _insertChilds(const char *data, PRINT_MODE printMode); + void _addObjNodes(std::string &str, std::string &str2, int index, const char *data, PRINT_MODE printMode); + void _addArrNodes(std::string &str, std::string &str2, int index, const char *data, PRINT_MODE printMode); + void _compileToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode, const char *replace, int refTokenIndex = -1, bool removeTk = false); + void _parseToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode); + void _removeToken(uint16_t &i, char *buf, int &depth, const char *searchKey, int searchIndex, PRINT_MODE printMode, const char *replace, int refTokenIndex = -1, bool removeTk = false); + single_child_parent_t _findSCParent(int depth); + bool _isArrTk(int index); + bool _isStrTk(int index); + int _getArrIndex(int index); + char *floatStr(float value); + char *doubleStr(double value); + char *intStr(int value); + char *boolStr(bool value); + void _trimDouble(char *buf); + void _get(const char *key, int depth, int index = -1); + void _ltrim(std::string &str, const std::string &chars = " "); + void _rtrim(std::string &str, const std::string &chars = " "); + void _trim(std::string &str, const std::string &chars = " "); + void _toStdString(std::string &s, bool isJson = true); + void _tostr(std::string &s, bool prettify = false); + void _strToTk(const std::string &str, std::vector &tk, char delim); + int strpos(const char *haystack, const char *needle, int offset); + int rstrpos(const char *haystack, const char *needle, int offset); + char *rstrstr(const char *haystack, const char *needle); + void delS(char *p); + char *newS(size_t len); + char *newS(char *p, size_t len); + char *newS(char *p, size_t len, char *d); + char *strP(PGM_P pgm); + + void fbjs_init(fbjs_parser *parser); + int fbjs_parse(fbjs_parser *parser, const char *js, size_t len, + fbjs_tok_t *tokens, unsigned int num_tokens); + int fbjs_parse_string(fbjs_parser *parser, const char *js, + size_t len, fbjs_tok_t *tokens, size_t num_tokens); + int fbjs_parse_primitive(fbjs_parser *parser, const char *js, + size_t len, fbjs_tok_t *tokens, size_t num_tokens); + void fbjs_fill_token(fbjs_tok_t *token, fbjs_type_t type, + int start, int end); + fbjs_tok_t *fbjs_alloc_token(fbjs_parser *parser, + fbjs_tok_t *tokens, size_t num_tokens); }; class FirebaseJsonArray { - friend class FirebaseJson; - friend class FirebaseJsonData; - friend class Firebase_ESP_Client; - friend class Firebase_Signer; - friend class FirebaseData; - friend class FirebaseStream; - friend class FB_RTDB; - friend class FB_CM; + friend class FirebaseJson; + friend class FirebaseJsonData; public: - FirebaseJsonArray(); - ~FirebaseJsonArray(); - void _init(); - void _finalize(); + FirebaseJsonArray(); + ~FirebaseJsonArray(); + void _init(); + void _finalize(); - /* + /* Add null to FirebaseJsonArray object. @return instance of an object. */ - FirebaseJsonArray &add(); + FirebaseJsonArray &add(); - /* + /* Add string to FirebaseJsonArray object. @param value - The string value to add. @@ -810,9 +943,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(const String &value); + FirebaseJsonArray &add(const String &value); - /* + /* Add string (chars arrar) to FirebaseJsonArray object. @param value - The char array to add. @@ -820,9 +953,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(const char *value); + FirebaseJsonArray &add(const char *value); - /* + /* Add integer/unsigned short to FirebaseJsonArray object. @param value - The integer/unsigned short value to add. @@ -830,10 +963,10 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(int value); - FirebaseJsonArray &add(unsigned short value); + FirebaseJsonArray &add(int value); + FirebaseJsonArray &add(unsigned short value); - /* + /* Add float to FirebaseJsonArray object. @param value - The float value to add. @@ -841,9 +974,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(float value); + FirebaseJsonArray &add(float value); - /* + /* Add double to FirebaseJsonArray object. @param value - The double value to add. @@ -851,9 +984,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(double value); + FirebaseJsonArray &add(double value); - /* + /* Add boolean to FirebaseJsonArray object. @param value - The boolean value to add. @@ -861,9 +994,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(bool value); + FirebaseJsonArray &add(bool value); - /* + /* Add nested FirebaseJson object to FirebaseJsonArray object. @param json - The FirebaseJson object to add. @@ -871,9 +1004,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(FirebaseJson &json); + FirebaseJsonArray &add(FirebaseJson &json); - /* + /* Add nested FirebaseJsonArray object to FirebaseJsonArray object. @param arr - The FirebaseJsonArray object to add. @@ -881,9 +1014,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &add(FirebaseJsonArray &arr); + FirebaseJsonArray &add(FirebaseJsonArray &arr); - /* + /* Set JSON array data (JSON array string) to FirebaseJsonArray object. @param data - The JSON array string. @@ -891,9 +1024,9 @@ class FirebaseJsonArray @return instance of an object. */ - FirebaseJsonArray &setJsonArrayData(const String &data); + FirebaseJsonArray &setJsonArrayData(const String &data); - /* + /* Get the array value at the specified index from the FirebaseJsonArray object. @param jsonData - The returning FirebaseJsonData object that holds data at the specified index. @@ -903,10 +1036,10 @@ class FirebaseJsonArray @return boolean status of the operation. */ - bool get(FirebaseJsonData &jsonData, int index); - bool get(FirebaseJsonData *jsonData, int index); + bool get(FirebaseJsonData &jsonData, int index); + bool get(FirebaseJsonData *jsonData, int index); - /* + /* Get the array value at the specified path from FirebaseJsonArray object. @param jsonData - The returning FirebaseJsonData object that holds data at the specified path. @@ -919,17 +1052,17 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2 */ - bool get(FirebaseJsonData &jsonData, const String &path); + bool get(FirebaseJsonData &jsonData, const String &path); - /* + /* Get the length of the array in FirebaseJsonArray object. @return length of the array. */ - size_t size(); + size_t size(); - /* + /* Get the FirebaseJsonArray object serialized string. @param buf - The returning String object. @@ -937,25 +1070,25 @@ class FirebaseJsonArray @param prettify - Boolean flag for return the pretty format string i.e. with text indentation and newline. */ - void toString(String &buf, bool prettify = false); + void toString(String &buf, bool prettify = false); - /* + /* Clear all array in FirebaseJsonArray object. @return instance of an object. */ - FirebaseJsonArray &clear(); + FirebaseJsonArray &clear(); - /* + /* Set null to FirebaseJsonArray object at specified index. @param index - The array index that null to be set. */ - void set(int index); + void set(int index); - /* + /* Set String to FirebaseJsonArray object at the specified index. @param index - The array index that String value to be set. @@ -963,9 +1096,9 @@ class FirebaseJsonArray @param value - The String to set. */ - void set(int index, const String &value); + void set(int index, const String &value); - /* + /* Set string (chars array) to FirebaseJsonArray object at specified index. @param index - The array index that string (chars array) to be set. @@ -973,9 +1106,9 @@ class FirebaseJsonArray @param value - The char array to set. */ - void set(int index, const char *value); + void set(int index, const char *value); - /* + /* Set integer/unsigned short value to FirebaseJsonArray object at specified index. @param index - The array index that int/unsigned short to be set. @@ -983,10 +1116,10 @@ class FirebaseJsonArray @param value - The integer/unsigned short value to set. */ - void set(int index, int value); - void set(int index, unsigned short value); + void set(int index, int value); + void set(int index, unsigned short value); - /* + /* Set float value to FirebaseJsonArray object at specified index. @param index - The array index that float value to be set. @@ -994,9 +1127,9 @@ class FirebaseJsonArray @param value - The float value to set. */ - void set(int index, float value); + void set(int index, float value); - /* + /* Set double value to FirebaseJsonArray object at specified index. @param index - The array index that double value to be set. @@ -1004,9 +1137,9 @@ class FirebaseJsonArray @param value - The double value to set. */ - void set(int index, double value); + void set(int index, double value); - /* + /* Set boolean value to FirebaseJsonArray object at specified index. @param index - The array index that bool value to be set. @@ -1014,9 +1147,9 @@ class FirebaseJsonArray @param value - The boolean value to set. */ - void set(int index, bool value); + void set(int index, bool value); - /* + /* Set nested FirebaseJson object to FirebaseJsonArray object at specified index. @param index - The array index that nested FirebaseJson object to be set. @@ -1024,9 +1157,9 @@ class FirebaseJsonArray @param value - The FirebaseJson object to set. */ - void set(int index, FirebaseJson &json); + void set(int index, FirebaseJson &json); - /* + /* Set nested FirebaseJsonArray object to FirebaseJsonArray object at specified index. @param index - The array index that nested FirebaseJsonArray object to be set. @@ -1034,9 +1167,9 @@ class FirebaseJsonArray @param value - The FirebaseJsonArray object to set. */ - void set(int index, FirebaseJsonArray &arr); + void set(int index, FirebaseJsonArray &arr); - /* + /* Set null to FirebaseJson object at the specified path. @param path - The relative path that null to be set. @@ -1045,9 +1178,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path); + void set(const String &path); - /* + /* Set String to FirebaseJsonArray object at the specified path. @param path - The relative path that string value to be set. @@ -1058,9 +1191,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, const String &value); + void set(const String &path, const String &value); - /* + /* Set string (chars array) to FirebaseJsonArray object at the specified path. @param path - The relative path that string (chars array) value to be set. @@ -1071,9 +1204,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, const char *value); + void set(const String &path, const char *value); - /* + /* Set integer/unsigned short value to FirebaseJsonArray object at specified path. @param path - The relative path that integer/unsigned short value to be set. @@ -1084,10 +1217,10 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, int value); - void set(const String &path, unsigned short value); + void set(const String &path, int value); + void set(const String &path, unsigned short value); - /* + /* Set float value to FirebaseJsonArray object at specified path. @param path - The relative path that float value to be set. @@ -1098,9 +1231,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, float value); + void set(const String &path, float value); - /* + /* Set double value to FirebaseJsonArray object at specified path. @param path - The relative path that double value to be set. @@ -1111,9 +1244,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, double value); + void set(const String &path, double value); - /* + /* Set boolean value to FirebaseJsonArray object at specified path. @param path - The relative path that bool value to be set. @@ -1124,9 +1257,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, bool value); + void set(const String &path, bool value); - /* + /* Set the nested FirebaseJson object to FirebaseJsonArray object at the specified path. @param path - The relative path that nested FirebaseJson object to be set. @@ -1137,9 +1270,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, FirebaseJson &json); + void set(const String &path, FirebaseJson &json); - /* + /* Set the nested FirebaseJsonArray object to FirebaseJsonArray object at specified path. @param path - The relative path that nested FirebaseJsonArray object to be set. @@ -1150,9 +1283,9 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would get the data from myData key inside the array indexes 2. */ - void set(const String &path, FirebaseJsonArray &arr); + void set(const String &path, FirebaseJsonArray &arr); - /* + /* Remove the array value at the specified index from the FirebaseJsonArray object. @param index - The array index to be removed. @@ -1160,9 +1293,9 @@ class FirebaseJsonArray @return bool value represents the successful operation. */ - bool remove(int index); + bool remove(int index); - /* + /* Remove the array value at the specified path from FirebaseJsonArray object. @param path - The relative path to array in FirebaseJsonArray object to be removed. @@ -1173,73 +1306,82 @@ class FirebaseJsonArray other array indexes or node names e.g. /[2]/myData would remove the data of myData key inside the array indexes 2. */ - bool remove(const String &path); - - template - void set(int index, T value); - template - void set(const String &path, T value); - template - FirebaseJsonArray &add(T value); + bool remove(const String &path); + + template + void set(int index, T value); + template + void set(const String &path, T value); + template + FirebaseJsonArray &add(T value); + + std::string *int_dbuf(); + std::string *int_tbuf(); + std::string *int_jbuf(); + std::string *int_rawbuf(); + FirebaseJson *int_json(); + void int_set_arr_len(size_t len); + void int_toStdString(std::string &s); private: - std::string _jbuf = ""; - FirebaseJson _json; - size_t _arrLen = 0; - char *_pd = nullptr; - char *_pf = nullptr; - char *_fls = nullptr; - char *_tr = nullptr; - char *_brk3 = nullptr; - char *_brk4 = nullptr; - char *_nll = nullptr; - char *_root = nullptr; - char *_root2 = nullptr; - char *_qt = nullptr; - char *_slash = nullptr; - - void _addString(const std::string &value); - void _addInt(int value); - void _addFloat(float value); - void _addDouble(double value); - void _addBool(bool value); - void _addNull(); - void _addJson(FirebaseJson *json); - void _addArray(FirebaseJsonArray *arr); - void _setString(int index, const std::string &value); - void _setString(const String &path, const std::string &value); - void _setInt(int index, int value); - void _setInt(const String &path, int value); - void _setFloat(int index, float value); - void _setFloat(const String &path, float value); - void _setDouble(int index, double value); - void _setDouble(const String &path, double value); - void _setBool(int index, bool value); - void _setBool(const String &path, bool value); - void _setNull(int index); - void _setNull(const String &path); - void _setJson(int index, FirebaseJson *json); - void _setJson(const String &path, FirebaseJson *json); - void _setArray(int index, FirebaseJsonArray *arr); - void _setArray(const String &path, FirebaseJsonArray *arr); - void _toStdString(std::string &s); - void _set2(int index, const char *value, bool isStr = true); - void _set(const char *path, const char *value, bool isStr = true); - bool _get(FirebaseJsonData &jsonData, const char *path); - bool _remove(const char *path); - void _trimDouble(char *buf); - char *getFloatString(float value); - char *getDoubleString(double value); - char *getIntString(int value); - char *getBoolString(bool value); - char *_getPGMString(PGM_P pgm); - int _strpos(const char *haystack, const char *needle, int offset); - int _rstrpos(const char *haystack, const char *needle, int offset); - char *_rstrstr(const char *haystack, const char *needle); - void _delPtr(char *p); - char *_newPtr(size_t len); - char *_newPtr(char *p, size_t len); - char *_newPtr(char *p, size_t len, char *d); + FirebaseJsonHelper helper; + std::string _jbuf = ""; + FirebaseJson _json; + size_t _arrLen = 0; + char *_pd = nullptr; + char *_pf = nullptr; + char *_fls = nullptr; + char *_tr = nullptr; + char *_brk3 = nullptr; + char *_brk4 = nullptr; + char *_nll = nullptr; + char *_root = nullptr; + char *_root2 = nullptr; + char *_qt = nullptr; + char *_slash = nullptr; + + void _addString(const std::string &value); + void _addInt(int value); + void _addFloat(float value); + void _addDouble(double value); + void _addBool(bool value); + void _addNull(); + void _addJson(FirebaseJson *json); + void _addArray(FirebaseJsonArray *arr); + void _setString(int index, const std::string &value); + void _setString(const String &path, const std::string &value); + void _setInt(int index, int value); + void _setInt(const String &path, int value); + void _setFloat(int index, float value); + void _setFloat(const String &path, float value); + void _setDouble(int index, double value); + void _setDouble(const String &path, double value); + void _setBool(int index, bool value); + void _setBool(const String &path, bool value); + void _setNull(int index); + void _setNull(const String &path); + void _setJson(int index, FirebaseJson *json); + void _setJson(const String &path, FirebaseJson *json); + void _setArray(int index, FirebaseJsonArray *arr); + void _setArray(const String &path, FirebaseJsonArray *arr); + void _toStdString(std::string &s); + void _set2(int index, const char *value, bool isStr = true); + void _set(const char *path, const char *value, bool isStr = true); + bool _get(FirebaseJsonData &jsonData, const char *path); + bool _remove(const char *path); + void _trimDouble(char *buf); + char *floatStr(float value); + char *doubleStr(double value); + char *intStr(int value); + char *boolStr(bool value); + char *strP(PGM_P pgm); + int strpos(const char *haystack, const char *needle, int offset); + int rstrpos(const char *haystack, const char *needle, int offset); + char *rstrstr(const char *haystack, const char *needle); + void delS(char *p); + char *newS(size_t len); + char *newS(char *p, size_t len); + char *newS(char *p, size_t len, char *d); }; #endif \ No newline at end of file diff --git a/src/message/FCM.cpp b/src/message/FCM.cpp index 0c80c58b0..36fee74ce 100644 --- a/src/message/FCM.cpp +++ b/src/message/FCM.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase Cloud Messaging class, FCM.cpp version 1.0.3 + * Google's Firebase Cloud Messaging class, FCM.cpp version 1.0.4 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 21, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -390,7 +390,7 @@ void FB_CM::fcm_prepareLegacyPayload(std::string &buf, FCM_Legacy_HTTP_Message * ut->delS(tmp); } - _fcmPayload._tostr(buf); + _fcmPayload.int_tostr(buf); std::string s; @@ -522,7 +522,7 @@ void FB_CM::fcm_prepareLegacyPayload(std::string &buf, FCM_Legacy_HTTP_Message * _fcmPayload.add(s.c_str(), msg->payloads.notification.color); } - _fcmPayload._tostr(buf); + _fcmPayload.int_tostr(buf); _fcmPayload.clear(); } @@ -553,7 +553,7 @@ void FB_CM::fcm_preparSubscriptionPayload(std::string &buf, const char *topic, c _fcmPayload.add(tmp, arr); ut->delS(tmp); - _fcmPayload._tostr(buf); + _fcmPayload.int_tostr(buf); _fcmPayload.clear(); } @@ -585,7 +585,7 @@ void FB_CM::fcm_preparAPNsRegistPayload(std::string &buf, const char *applicatio _fcmPayload.add(tmp, arr); ut->delS(tmp); - _fcmPayload._tostr(buf); + _fcmPayload.int_tostr(buf); _fcmPayload.clear(); } @@ -1155,7 +1155,7 @@ void FB_CM::fcm_prepareV1Payload(std::string &buf, FCM_HTTPv1_JSON_Message *msg) _fcmPayload.set(s.c_str(), msg->apns.fcm_options.image); } - _fcmPayload._tostr(buf); + _fcmPayload.int_tostr(buf); _fcmPayload.clear(); } diff --git a/src/message/FCM.h b/src/message/FCM.h index 2d67ff3fd..a8f11c83f 100644 --- a/src/message/FCM.h +++ b/src/message/FCM.h @@ -1,15 +1,15 @@ /** - * Google's Firebase Cloud Messaging class, FCM.h version 1.0.3 + * Google's Firebase Cloud Messaging class, FCM.h version 1.0.4 * * This library supports Espressif ESP8266 and ESP32 * - * Created February 21, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/FB_RTDB.cpp b/src/rtdb/FB_RTDB.cpp index f717230de..b7d5a6350 100644 --- a/src/rtdb/FB_RTDB.cpp +++ b/src/rtdb/FB_RTDB.cpp @@ -1,9 +1,9 @@ /** - * Google's Firebase Realtime Database class, FB_RTDB.cpp version 1.0.6 + * Google's Firebase Realtime Database class, FB_RTDB.cpp version 1.0.7 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2021 K. Suwatchai (Mobizt) @@ -494,7 +494,7 @@ bool FB_RTDB::pushJSON(FirebaseData *fbdo, const char *path, FirebaseJson *json, bool FB_RTDB::pushJSON(FirebaseData *fbdo, const char *path, FirebaseJson *json, const char *priority) { std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_post; @@ -526,7 +526,7 @@ bool FB_RTDB::pushArray(FirebaseData *fbdo, const char *path, FirebaseJsonArray bool FB_RTDB::pushArray(FirebaseData *fbdo, const char *path, FirebaseJsonArray *arr, const char *priority) { std::string s; - arr->_toStdString(s); + arr->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_post; @@ -1220,7 +1220,7 @@ bool FB_RTDB::setJSON(FirebaseData *fbdo, const char *path, FirebaseJson *json, bool FB_RTDB::setJSON(FirebaseData *fbdo, const char *path, FirebaseJson *json, const char *priority, const char *etag) { std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_put; @@ -1271,7 +1271,7 @@ bool FB_RTDB::setArray(FirebaseData *fbdo, const char *path, FirebaseJsonArray * bool FB_RTDB::setArray(FirebaseData *fbdo, const char *path, FirebaseJsonArray *arr, const char *priority, const char *etag) { std::string s; - arr->_toStdString(s); + arr->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_put; @@ -1405,7 +1405,7 @@ bool FB_RTDB::setTimestamp(FirebaseData *fbdo, const char *path) bool FB_RTDB::updateNode(FirebaseData *fbdo, const char *path, FirebaseJson *json) { std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_patch; @@ -1422,7 +1422,7 @@ bool FB_RTDB::updateNode(FirebaseData *fbdo, const char *path, FirebaseJson *jso char *buf = ut->floatStr(priority); ut->trimDigits(buf); std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_patch; @@ -1439,7 +1439,7 @@ bool FB_RTDB::updateNode(FirebaseData *fbdo, const char *path, FirebaseJson *jso bool FB_RTDB::updateNodeSilent(FirebaseData *fbdo, const char *path, FirebaseJson *json) { std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_patch_nocontent; @@ -1456,7 +1456,7 @@ bool FB_RTDB::updateNodeSilent(FirebaseData *fbdo, const char *path, FirebaseJso char *buf = ut->floatStr(priority); ut->trimDigits(buf); std::string s; - json->_toStdString(s); + json->int_toStdString(s); struct fb_esp_rtdb_request_info_t req; req.path = path; req.method = m_patch_nocontent; diff --git a/src/rtdb/FB_RTDB.h b/src/rtdb/FB_RTDB.h index 086d4fa9c..3cd8749b7 100644 --- a/src/rtdb/FB_RTDB.h +++ b/src/rtdb/FB_RTDB.h @@ -1,9 +1,9 @@ /** - * Google's Firebase Realtime Database class, FB_RTDB.h version 1.0.6 + * Google's Firebase Realtime Database class, FB_RTDB.h version 1.0.7 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2021 K. Suwatchai (Mobizt) diff --git a/src/rtdb/QueryFilter.cpp b/src/rtdb/QueryFilter.cpp index 51b1df44d..cc6e5bf67 100644 --- a/src/rtdb/QueryFilter.cpp +++ b/src/rtdb/QueryFilter.cpp @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/QueryFilter.h b/src/rtdb/QueryFilter.h index 0c3d945a1..3128015d0 100644 --- a/src/rtdb/QueryFilter.h +++ b/src/rtdb/QueryFilter.h @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/QueueInfo.cpp b/src/rtdb/QueueInfo.cpp index d98769c83..b2ff34159 100644 --- a/src/rtdb/QueueInfo.cpp +++ b/src/rtdb/QueueInfo.cpp @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/QueueInfo.h b/src/rtdb/QueueInfo.h index 932e5af33..53cc692ac 100644 --- a/src/rtdb/QueueInfo.h +++ b/src/rtdb/QueueInfo.h @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/QueueManager.cpp b/src/rtdb/QueueManager.cpp index f52bc8639..99430dead 100644 --- a/src/rtdb/QueueManager.cpp +++ b/src/rtdb/QueueManager.cpp @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/rtdb/QueueManager.h b/src/rtdb/QueueManager.h index c5dc5411d..b7d042563 100644 --- a/src/rtdb/QueueManager.h +++ b/src/rtdb/QueueManager.h @@ -6,10 +6,10 @@ * Created January 12, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/session/FB_Session.cpp b/src/session/FB_Session.cpp index d73a69538..4cef6438e 100644 --- a/src/session/FB_Session.cpp +++ b/src/session/FB_Session.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase Data class, FB_Session.cpp version 1.0.4 + * Google's Firebase Data class, FB_Session.cpp version 1.0.5 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 11, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -336,30 +336,28 @@ FirebaseJsonArray *FirebaseData::jsonArrayPtr() if (_ss.rtdb.data.length() > 0 && _ss.rtdb.resp_data_type == fb_esp_data_type::d_array) { - char *tmp = ut->newS(20); - std::string().swap(_ss.arr._json._jsonData._dbuf); - std::string().swap(_ss.arr._json._tbuf); + std::string().swap(*_ss.arr.int_dbuf()); + std::string().swap(*_ss.arr.int_tbuf()); - strcpy_P(tmp, FirebaseJson_STR_21); - _ss.arr._json._toStdString(_ss.arr._jbuf, false); - _ss.arr._json._rawbuf = tmp; - _ss.arr._json._rawbuf += _ss.rtdb.data; + char *tmp = ut->strP(FirebaseJson_STR_21); + _ss.arr.int_json()->int_toStdString(*_ss.arr.int_jbuf()); + *_ss.arr.int_rawbuf() = tmp; + *_ss.arr.int_rawbuf() += _ss.rtdb.data; + ut->delS(tmp); - tmp = ut->newS(tmp, 20); - strcpy_P(tmp, FirebaseJson_STR_26); + tmp = ut->strP(FirebaseJson_STR_26); + _ss.arr.int_json()->int_parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); + ut->delS(tmp); - _ss.arr._json._parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); + std::string().swap(*_ss.arr.int_tbuf()); + std::string().swap(*_ss.arr.int_jbuf()); + _ss.arr.int_json()->int_clearPathTk(); + _ss.arr.int_json()->int_clearTokens(); - std::string().swap(_ss.arr._json._tbuf); - std::string().swap(_ss.arr._jbuf); - _ss.arr._json.clearPathTk(); - _ss.arr._json._tokens.reset(); - _ss.arr._json._tokens = nullptr; - ut->delS(tmp); - if (_ss.arr._json._jsonData._dbuf.length() > 2) - _ss.arr._json._rawbuf = _ss.arr._json._jsonData._dbuf.substr(1, _ss.arr._json._jsonData._dbuf.length() - 2); - _ss.arr._arrLen = _ss.arr._json._jsonData._len; + if (_ss.arr.int_dbuf()->length() > 2) + *_ss.arr.int_rawbuf() = _ss.arr.int_dbuf()->substr(1, _ss.arr.int_dbuf()->length() - 2); + _ss.arr.int_set_arr_len(_ss.arr.int_json()->int_get_jsondata_len()); } return &_ss.arr; } diff --git a/src/session/FB_Session.h b/src/session/FB_Session.h index 357020bf4..997d7bda6 100644 --- a/src/session/FB_Session.h +++ b/src/session/FB_Session.h @@ -1,15 +1,15 @@ /** - * Google's Firebase Data class, FB_Session.h version 1.0.4 + * Google's Firebase Data class, FB_Session.h version 1.0.5 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 11, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/signer/Signer.cpp b/src/signer/Signer.cpp index ebbfb02ad..7541f7591 100644 --- a/src/signer/Signer.cpp +++ b/src/signer/Signer.cpp @@ -1,9 +1,9 @@ /** - * Google's Firebase Token Generation class, Signer.cpp version 1.0.5 + * Google's Firebase Token Generation class, Signer.cpp version 1.0.6 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 24, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) @@ -580,6 +580,11 @@ bool Firebase_Signer::refreshToken() } config->signer.tokens.error = error; + tokenInfo.status = config->signer.tokens.status; + tokenInfo.type = config->signer.tokens.token_type; + tokenInfo.error = config->signer.tokens.error; + if (error.code != 0) + sendTokenStatusCB(); if (error.code == 0) { @@ -970,7 +975,7 @@ bool Firebase_Signer::createJWT() ut->delS(tmp); ut->delS(tmp2); - config->signer.json->_tostr(config->signer.header); + config->signer.json->int_tostr(config->signer.header); size_t len = ut->base64EncLen(config->signer.header.length()); char *buf = ut->newS(len); ut->encodeBase64Url(buf, (unsigned char *)config->signer.header.c_str(), config->signer.header.length()); @@ -1081,7 +1086,7 @@ bool Firebase_Signer::createJWT() ut->delS(tmp); std::string s; - auth->token.claims._tostr(s); + auth->token.claims.int_tostr(s); if (s.length() > 2) { tmp = ut->strP(fb_esp_pgm_str_255); @@ -1090,7 +1095,7 @@ bool Firebase_Signer::createJWT() } } - config->signer.json->_tostr(config->signer.payload); + config->signer.json->int_tostr(config->signer.payload); len = ut->base64EncLen(config->signer.payload.length()); buf = ut->newS(len); ut->encodeBase64Url(buf, (unsigned char *)config->signer.payload.c_str(), config->signer.payload.length()); @@ -1421,6 +1426,8 @@ bool Firebase_Signer::getIdToken(bool createUser, const char *email, const char tokenInfo.status = config->signer.tokens.status; tokenInfo.type = config->signer.tokens.token_type; tokenInfo.error = config->signer.tokens.error; + if (error.code != 0) + sendTokenStatusCB(); } if (error.code == 0) @@ -1598,6 +1605,11 @@ bool Firebase_Signer::requestTokens() } config->signer.tokens.error = error; + tokenInfo.status = config->signer.tokens.status; + tokenInfo.type = config->signer.tokens.token_type; + tokenInfo.error = config->signer.tokens.error; + if (error.code != 0) + sendTokenStatusCB(); if (error.code == 0) { diff --git a/src/signer/Signer.h b/src/signer/Signer.h index 71d75a701..8f1b6224b 100644 --- a/src/signer/Signer.h +++ b/src/signer/Signer.h @@ -1,9 +1,9 @@ /** - * Google's Firebase Token Generation class, Signer.h version 1.0.5 + * Google's Firebase Token Generation class, Signer.h version 1.0.6 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 23, 2021 + * Created March 24, 2021 * * This work is a part of Firebase ESP Client library * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) diff --git a/src/storage/FCS.cpp b/src/storage/FCS.cpp index c63e3e07f..eb4d7b399 100644 --- a/src/storage/FCS.cpp +++ b/src/storage/FCS.cpp @@ -6,10 +6,10 @@ * Created March 13, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/storage/FCS.h b/src/storage/FCS.h index ad46cb3c0..5bcc19413 100644 --- a/src/storage/FCS.h +++ b/src/storage/FCS.h @@ -6,10 +6,10 @@ * Created March 13, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/stream/FB_MP_Stream.cpp b/src/stream/FB_MP_Stream.cpp index 3d26df6e4..8f25c118c 100644 --- a/src/stream/FB_MP_Stream.cpp +++ b/src/stream/FB_MP_Stream.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase MultiPathStream class, FB_MP_Stream.cpp version 1.0.0 + * Google's Firebase MultiPathStream class, FB_MP_Stream.cpp version 1.0.1 * * This library supports Espressif ESP8266 and ESP32 * - * Created January 12, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -57,7 +57,9 @@ bool MultiPathStream::get(const String &path) if (sif->m_type == fb_esp_data_type::d_json) { char *tmp = ut->strP(fb_esp_pgm_str_1); - if (strcmp(sif->m_path.c_str(), tmp) == 0) + bool r = strcmp(sif->m_path.c_str(), tmp) == 0; + ut->delS(tmp); + if (r) { FirebaseJsonData data; sif->m_json->get(data, path); diff --git a/src/stream/FB_MP_Stream.h b/src/stream/FB_MP_Stream.h index 585de67dc..b0d65e4bf 100644 --- a/src/stream/FB_MP_Stream.h +++ b/src/stream/FB_MP_Stream.h @@ -1,15 +1,15 @@ /** - * Google's Firebase MultiPathStream class, FB_MP_Stream.h version 1.0.0 + * Google's Firebase MultiPathStream class, FB_MP_Stream.h version 1.0.1 * * This library supports Espressif ESP8266 and ESP32 * - * Created January 12, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of diff --git a/src/stream/FB_Stream.cpp b/src/stream/FB_Stream.cpp index 425a96e91..816858ea6 100644 --- a/src/stream/FB_Stream.cpp +++ b/src/stream/FB_Stream.cpp @@ -1,15 +1,15 @@ /** - * Google's Firebase Stream class, FB_Stream.cpp version 1.0.1 + * Google's Firebase Stream class, FB_Stream.cpp version 1.0.2 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 11, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of @@ -128,32 +128,27 @@ FirebaseJsonArray *FirebaseStream::jsonArrayPtr() if (sif->data.length() > 0 && sif->data_type == fb_esp_data_type::d_array) { - char *tmp = ut->newS(20); + std::string().swap(*_jsonArr->int_dbuf()); + std::string().swap(*_jsonArr->int_tbuf()); - std::string().swap(_jsonArr->_json._jsonData._dbuf); - std::string().swap(_jsonArr->_json._tbuf); - - strcpy_P(tmp, FirebaseJson_STR_21); - _jsonArr->_json._toStdString(_jsonArr->_jbuf, false); - _jsonArr->_json._rawbuf = tmp; - _jsonArr->_json._rawbuf += sif->data; + char *tmp = ut->strP(FirebaseJson_STR_21); + _jsonArr->int_json()->int_toStdString(*_jsonArr->int_jbuf()); + *_jsonArr->int_rawbuf() = tmp; + *_jsonArr->int_rawbuf() += sif->data; ut->delS(tmp); - tmp = ut->newS(tmp, 20); - strcpy_P(tmp, FirebaseJson_STR_26); - - _jsonArr->_json._parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); + tmp = ut->strP(FirebaseJson_STR_26); + _jsonArr->int_json()->int_parse(tmp, FirebaseJson::PRINT_MODE_PLAIN); ut->delS(tmp); - std::string().swap(_jsonArr->_json._tbuf); - std::string().swap(_jsonArr->_jbuf); - _jsonArr->_json.clearPathTk(); - _jsonArr->_json._tokens.reset(); - _jsonArr->_json._tokens = nullptr; + std::string().swap(*_jsonArr->int_tbuf()); + std::string().swap(*_jsonArr->int_jbuf()); + _jsonArr->int_json()->int_clearPathTk(); + _jsonArr->int_json()->int_clearTokens(); - if (_jsonArr->_json._jsonData._dbuf.length() > 2) - _jsonArr->_json._rawbuf = _jsonArr->_json._jsonData._dbuf.substr(1, _jsonArr->_json._jsonData._dbuf.length() - 2); - _jsonArr->_arrLen = _jsonArr->_json._jsonData._len; + if (_jsonArr->int_dbuf()->length() > 2) + *_jsonArr->int_rawbuf() = _jsonArr->int_dbuf()->substr(1, _jsonArr->int_dbuf()->length() - 2); + _jsonArr->int_set_arr_len(_jsonArr->int_json()->int_get_jsondata_len()); } return _jsonArr; } diff --git a/src/stream/FB_Stream.h b/src/stream/FB_Stream.h index 15f447ed3..5dd1d4640 100644 --- a/src/stream/FB_Stream.h +++ b/src/stream/FB_Stream.h @@ -1,15 +1,15 @@ /** - * Google's Firebase Stream class, FB_Stream.h version 1.0.1 + * Google's Firebase Stream class, FB_Stream.h version 1.0.2 * * This library supports Espressif ESP8266 and ESP32 * - * Created March 11, 2021 + * Created March 25, 2021 * * This work is a part of Firebase ESP Client library - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * The MIT License (MIT) - * Copyright (c) 2020, 2021 K. Suwatchai (Mobizt) + * Copyright (c) 2021 K. Suwatchai (Mobizt) * * * Permission is hereby granted, free of charge, to any person returning a copy of