git: ef66c204e928 - main - www/domoticz: Update to 2025.2
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 28 Oct 2025 07:24:17 UTC
The branch main has been updated by kiwi:
URL: https://cgit.FreeBSD.org/ports/commit/?id=ef66c204e928c62f3be42ccf771233e5bce2aca3
commit ef66c204e928c62f3be42ccf771233e5bce2aca3
Author: Xavier Beaudouin <kiwi@FreeBSD.org>
AuthorDate: 2025-10-28 07:19:59 +0000
Commit: Xavier Beaudouin <kiwi@FreeBSD.org>
CommitDate: 2025-10-28 07:22:34 +0000
www/domoticz: Update to 2025.2
This update domoticz to 2025.2.
Changelog:
Version 2025.2 (October 13th 2025)
- Implemented: EnergyDashboard, add option for (Outside) Temperature Sensor
- Implemented: Enever, Added Pure Energy, removed obsolete providers
- Implemented: Enphase, display a error is a IQ inverter has not been received for more then a day
- Implemented: Kodi, support for 'tvshow' type
- Implemented: MQTT-AD, added support for Climate action_template/state
- Implemented: MQTT-AD, added support for IR Blaster (Tuya iH-F8260)
- Implemented: MQTT-AD, support for disabling cover stop button
- Implemented: New Blinds type "Blinds + Stop"
- Implemented: MQTT-AD, handling battery low boolean sensors
- Implemented: MQTT-AD, allow publishing messages
- Implemented: P1 Chart, Report: Added Total Column (Usage-Return)
- Implemented: Rain Rate notification
- Implemented: Support for Humidity only graph
- Fixed: MQTT-AD, fix issue where brightness and RGB command topic are different
- Fixed: MQTT-AD, preserve select options when updating a device
- Fixed: Replace device now also copies 'Options' field
- Changed: Enphase query Token method
- Changed: mDNS, hostname now lowercase
- Changed: MQTT-AD, added support for color_temp_command_template
- Changed: TADO, Added fixed API endpoint
- Changed: TADO, Add poll interval option
- Changed: MQTT, not publishing devices that are not used
- Changed: Philips Hue now uses HTTPS to be compliant with new Hue Bridge
- Fixed: mDNS, possible crash when web server (non) SSL was disabled, or a invalid port was specified
- Fixed: Charts, after deleting a datapoint, the browser was not correctly refreshed
- Updated: Windows libraries
Version 2025.1 (May 5th 2025)
- Implemented: Battery level for Setpoint sensors
- Implemented: Charts, zoom option for 'Day' view
- Implemented: Data Pushers, added P1 actual value
- Implemented: EnOcean, now able to choose an optional base_id as sender_id instead of the chip_id (#6213)
- Implemented: Floorplan, Add support for stop button (Ventation blinds)
- Implemented: RFXCom, Updated SDK
- Implemented: Support for Honeywell Series 5/PIR
- Implemented: Text sensor, now posible to edit direct from the GUI
- Implemented: YouLess, added Water meter
- Implemented: More default icons
- Implemented: MQTT-AD, added support for Gas device class
- Implemented: MQTT-AD, added support for Text device class
- Implemented: MQTT-AD, better precision for kWh sensors
- Implemented: MQTT-AD, enabled 'device_automation' component to be compatible with upcoming (2025) Zigbee2MQTT version
- Implemented: MQTT-AD, handling single onoff color mode as a normal light/switch
- Implemented: MQTT-AD, power sensors for the Tuya SPM02
- Implemented: MQTT-AD, support sensors that report humidity but sends 'null' values
- Implemented: MQTT-AD, support for string field state objects
- Implemented: MQTT Push 'Retained' mode option
- Implemented: Rain devices can now be replacement with different types of rain devices
- Implemented: RFXCom, Falmec Support
- Implemented: RTL433, Support Generic Switch (Door) sensor
- Implemented: Tado, oauth2 support
- Changed: dzVents, possible to pass a Domoticz device ID in notify() through the extra parameter
- Changed: Energy Dashboard now also available for non-admin users
- Changed: Energy Dashboard, Text object clipping rectangle
- Changed: Google Firebase Cloud Messaging (FCM) alternative way to pass a Domoticz device ID through the extra field ('|Device=<devidx>')
- Changed: Internal webserver refactoring
- Changed: Netatmo Improved and automated login process for devices (to obtain client ID and Password with user selectable scopes)
- Changed: Removed Highcharts 'Download PNG/JPG/SVG' buttons until export server is fixed
- Changed: Using OpenStreetMap for Latitude/Longitude query in settings
- Changed: Hardware/User/Application/Variables setup page (update/delete/add buttons)
- Changed: Smoke Detectors are now able (internally) to use keep-alive timestamps
- Fixed: Application shutdown, solved possible crash (#6310)
- Fixed: AtagOne, fixed getting device_id and better debuginfo
- Fixed: Charts, dynamic title based on selected range
- Fixed: Computed Meter summation
- Fixed: Custom Icons, making sure they are valid and loaded OK
- Fixed: Floorplan, corrected open/close icon behaviour
- Fixed: Floorplan, now handles protected selectors
- Fixed: MQTT Push, making sure direct push is working
- Fixed: Possible mutex lock issue when logging
- Fixed: Pushers, corrected Gas value rounding
- Fixed: Python framework, invalid sValue when creating a General/kWh sensor
- Fixed: RFXCom 868 MHz Weather device
- Fixed: RFXCom, WS90 Weather device
- Removed: Thermosmart thermostat (Product no longer supported/available by the manufacturer)
- Removed: API: Old RType calls have been replaced
- Updated: HighCharts
- Updated: Self Signed Certificate (Valid till 2035)
- Updated: Translations
PR: 290321
Approved by: 0mp (mentor)
---
www/domoticz/Makefile | 13 +-
www/domoticz/distinfo | 6 +-
www/domoticz/files/patch-CMakeLists.txt | 54 +-
www/domoticz/files/patch-asio-deadline_timer | 20 -
www/domoticz/files/patch-pr6252 | 2178 --------------------------
www/domoticz/pkg-plist | 57 +-
6 files changed, 89 insertions(+), 2239 deletions(-)
diff --git a/www/domoticz/Makefile b/www/domoticz/Makefile
index bfc14a878c90..77660aa2a477 100644
--- a/www/domoticz/Makefile
+++ b/www/domoticz/Makefile
@@ -1,6 +1,5 @@
PORTNAME= domoticz
-DISTVERSION= 2024.7
-PORTREVISION= 4
+DISTVERSION= 2025.2
CATEGORIES= www
MAINTAINER= kiwi@FreeBSD.org
@@ -10,6 +9,8 @@ WWW= https://www.domoticz.com
LICENSE= GPLv3
LICENSE_FILE= ${WRKSRC}/License.txt
+BUILD_DEPENDS= ${LOCALBASE}/include/jwt-cpp/jwt.h:devel/jwt-cpp
+
LIB_DEPENDS= libcurl.so:ftp/curl \
libboost_thread.so:devel/boost-libs \
libjsoncpp.so:devel/jsoncpp \
@@ -27,7 +28,8 @@ CMAKE_OFF+= GIT_SUBMODULE \
USE_BUILTIN_MINIZIP \
USE_BUILTIN_JSONCPP \
USE_BUILTIN_MQTT \
- USE_STATIC_OPENZWAVE
+ USE_STATIC_OPENZWAVE \
+ USE_BUILTIN_JWTCPP
CMAKE_INSTALL_PREFIX= ${PREFIX}/domoticz
@@ -51,11 +53,6 @@ PRECOMP_CMAKE_BOOL= USE_PRECOMPILED_HEADER
PYTHON_USES= python:3.9+
PYTHON_CMAKE_BOOL= USE_PYTHON
-post-patch:
- @${REINPLACE_CMD} -e '/find_package/s| system||' \
- -e '/target_link_libraries/s| Boost::system||' \
- ${WRKSRC}/CMakeLists.txt
-
post-install:
${MKDIR} ${STAGEDIR}/var/db/domoticz ${STAGEDIR}/var/run/domoticz
diff --git a/www/domoticz/distinfo b/www/domoticz/distinfo
index 9df59baa0be1..a6ef79518ca2 100644
--- a/www/domoticz/distinfo
+++ b/www/domoticz/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1735584809
-SHA256 (domoticz-domoticz-2024.7_GH0.tar.gz) = 6ceabbfe36ada4b7c2ebb42c523d723c87e6444b87db6bbb1703d92f38ee754d
-SIZE (domoticz-domoticz-2024.7_GH0.tar.gz) = 13258596
+TIMESTAMP = 1761213053
+SHA256 (domoticz-domoticz-2025.2_GH0.tar.gz) = fd016f4ffe419e8d559bc0a7f9de5ec4fcaf485fc9d1464c8e8221102b13f589
+SIZE (domoticz-domoticz-2025.2_GH0.tar.gz) = 13418498
diff --git a/www/domoticz/files/patch-CMakeLists.txt b/www/domoticz/files/patch-CMakeLists.txt
index 7585d271c86d..09961f6df8c5 100644
--- a/www/domoticz/files/patch-CMakeLists.txt
+++ b/www/domoticz/files/patch-CMakeLists.txt
@@ -1,6 +1,6 @@
---- CMakeLists.txt.orig 2023-05-23 11:37:06.693431000 +0200
-+++ CMakeLists.txt 2023-05-23 11:37:14.422198000 +0200
-@@ -395,11 +395,9 @@
+--- CMakeLists.txt.orig 2025-10-13 11:42:57.000000000 +0200
++++ CMakeLists.txt 2025-10-23 12:10:14.143268000 +0200
+@@ -417,7 +417,6 @@
# Target
set(
@@ -8,11 +8,7 @@
main/stdafx.cpp
main/Helper.cpp
main/CmdLine.cpp
--main/domoticz_tester.cpp
- main/BaroForecastCalculator.cpp
- main/HTMLSanitizer.cpp
- main/localtime_r.cpp
-@@ -412,9 +410,6 @@
+@@ -434,9 +433,6 @@
#main/IFTTT.cpp
@@ -22,7 +18,7 @@
#
# LUA
#
-@@ -513,7 +508,6 @@
+@@ -535,7 +531,6 @@
# explicitly say that the executable depends on the revisiontag
add_dependencies(domoticz revisiontag)
@@ -30,7 +26,7 @@
TEST_BIG_ENDIAN(BIGENDIAN)
IF(${BIGENDIAN})
-@@ -533,7 +527,6 @@
+@@ -555,7 +550,6 @@
set(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "Enable jsoncpp pkgconfig support" FORCE)
add_subdirectory (extern/jsoncpp EXCLUDE_FROM_ALL)
target_link_libraries(domoticz jsoncpp_static)
@@ -38,7 +34,7 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extern/jsoncpp/include)
ELSE(USE_BUILTIN_JSONCPP)
find_package(PkgConfig)
-@@ -543,9 +536,6 @@
+@@ -565,9 +559,6 @@
target_include_directories(domoticz PRIVATE ${JSONCPP_INCLUDE_DIRS})
target_link_directories(domoticz PRIVATE ${JSONCPP_LIBRARY_DIRS})
target_link_libraries(domoticz ${JSONCPP_LIBRARIES})
@@ -48,7 +44,7 @@
ELSE(JSONCPP_FOUND)
MESSAGE(FATAL_ERROR "JSONCPP not found on your system! try 'sudo apt-get install jsoncpp-dev'")
ENDIF(JSONCPP_FOUND)
-@@ -558,7 +548,6 @@
+@@ -580,7 +571,6 @@
option(DOCUMENTATION "Build documentation?" OFF)
add_subdirectory (extern/mosquitto EXCLUDE_FROM_ALL)
target_link_libraries(domoticz libmosquitto_static)
@@ -56,7 +52,7 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extern/mosquitto/include)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extern/mosquitto/lib)
ELSE(USE_BUILTIN_MQTT)
-@@ -577,7 +566,6 @@
+@@ -599,7 +589,6 @@
MESSAGE(STATUS "Using builtin SQLite library")
add_subdirectory (extern/sqlite-amalgamation EXCLUDE_FROM_ALL)
target_link_libraries(domoticz SQLite3)
@@ -64,7 +60,7 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extern/sqlite-amalgamation)
ELSE(USE_BUILTIN_SQLITE)
find_package(SQLite3)
-@@ -586,7 +574,6 @@
+@@ -608,7 +597,6 @@
MESSAGE(STATUS "SQLite includes found at: ${SQLite3_INCLUDE_DIRS}")
INCLUDE_DIRECTORIES(${SQLite3_INCLUDE_DIRS})
target_link_libraries(domoticz ${SQLite3_LIBRARIES})
@@ -72,7 +68,7 @@
ELSE(SQLite3_FOUND)
MESSAGE(FATAL_ERROR "SQLite3 not found on your system! try 'sudo apt-get install libsqlite3-dev'")
ENDIF(SQLite3_FOUND)
-@@ -596,7 +583,6 @@
+@@ -618,7 +606,6 @@
IF(USE_BUILTIN_MINIZIP)
add_subdirectory (extern/minizip EXCLUDE_FROM_ALL)
target_link_libraries(domoticz minizip)
@@ -80,7 +76,7 @@
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extern/minizip)
ELSE(USE_BUILTIN_MINIZIP)
find_package(PkgConfig)
-@@ -606,9 +592,6 @@
+@@ -628,9 +615,6 @@
target_include_directories(domoticz PRIVATE ${MINIZIP_INCLUDE_DIRS})
target_link_directories(domoticz PRIVATE ${MINIZIP_LIBRARY_DIRS})
target_link_libraries(domoticz ${MINIZIP_LIBRARIES})
@@ -90,7 +86,7 @@
ELSE(MINIZIP_FOUND)
MESSAGE(FATAL_ERROR "MINIZIP not found on your system! try 'sudo apt-get install minizip-dev'")
ENDIF(MINIZIP_FOUND)
-@@ -630,7 +613,6 @@
+@@ -658,7 +642,6 @@
find_library(MD_LIBRARY NAMES md)
IF(MD_LIBRARY)
target_link_libraries(domoticz ${MD_LIBRARY})
@@ -98,7 +94,7 @@
ENDIF(MD_LIBRARY)
ELSE()
message(STATUS "OPENSSL library found at: ${OPENSSL_LIBRARIES}")
-@@ -638,7 +620,6 @@
+@@ -666,7 +649,6 @@
add_definitions(-DWITH_TLS)
include_directories(${OPENSSL_INCLUDE_DIR})
target_link_libraries(domoticz ${OPENSSL_LIBRARIES})
@@ -106,20 +102,20 @@
ENDIF()
#
-@@ -779,7 +760,6 @@
- ENDIF(TELLDUSCORE_INCLUDE)
+@@ -804,7 +786,6 @@
+ endif()
- target_link_libraries(domoticz ${Boost_LIBRARIES} ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES} ${CURL_LIBRARIES} pthread ${MQTT_LIBRARIES} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS} ${TELLDUS_LIBRARIES})
--target_link_libraries(domoticztester ${Boost_LIBRARIES} ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES} ${CURL_LIBRARIES} pthread ${MQTT_LIBRARIES} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS} ${TELLDUS_LIBRARIES})
+ target_link_libraries(domoticz ${Boost_LIBRARIES} ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES} ${RESOLV_LIBRARIES} ${CURL_LIBRARIES} pthread ${MQTT_LIBRARIES} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS} ${TELLDUS_LIBRARIES})
+-target_link_libraries(domoticztester ${Boost_LIBRARIES} ${ZLIB_LIBRARIES} ${MINIZIP_LIBRARIES} ${RESOLV_LIBRARIES} ${CURL_LIBRARIES} pthread ${MQTT_LIBRARIES} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS} ${TELLDUS_LIBRARIES})
- IF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- target_link_libraries(domoticz -lresolv)
-@@ -789,13 +769,11 @@
+ IF(EXECINFO_LIBRARIES)
target_link_libraries(domoticz ${EXECINFO_LIBRARIES})
- ELSE()
- target_link_libraries(domoticz -lrt -lresolv ${EXECINFO_LIBRARIES})
-- target_link_libraries(domoticztester -lrt -lresolv ${EXECINFO_LIBRARIES})
- ENDIF()
+@@ -813,13 +794,11 @@
+ find_library(LIBRT rt)
+ if(LIBRT)
+ target_link_libraries(domoticz -lrt)
+- target_link_libraries(domoticztester -lrt)
+ endif()
IF(USE_PRECOMPILED_HEADER)
message(STATUS "Using precompiled headers")
diff --git a/www/domoticz/files/patch-asio-deadline_timer b/www/domoticz/files/patch-asio-deadline_timer
deleted file mode 100644
index ffb192872cf7..000000000000
--- a/www/domoticz/files/patch-asio-deadline_timer
+++ /dev/null
@@ -1,20 +0,0 @@
---- webserver/cWebem.h.orig 2024-07-13 14:59:31 UTC
-+++ webserver/cWebem.h
-@@ -1,6 +1,7 @@
- #pragma once
-
- #include <boost/asio.hpp>
-+#include <boost/asio/deadline_timer.hpp>
- #include <boost/thread.hpp>
- #include "server.hpp"
- #include "session_store.hpp"
---- webserver/connection.hpp.orig 2024-07-13 14:59:31 UTC
-+++ webserver/connection.hpp
-@@ -12,6 +12,7 @@
- #define HTTP_CONNECTION_HPP
-
- #include <boost/asio.hpp>
-+#include <boost/asio/deadline_timer.hpp>
- #include <deque>
- #include <fstream>
- #include "reply.hpp"
diff --git a/www/domoticz/files/patch-pr6252 b/www/domoticz/files/patch-pr6252
deleted file mode 100644
index 34c4efd3f4e4..000000000000
--- a/www/domoticz/files/patch-pr6252
+++ /dev/null
@@ -1,2178 +0,0 @@
-Fix for boost 1.87
-
-Removed the diff for the msbuild project files, didn't apply cleanly and not relevant anyway.
-This will merged in the next stable of domoticz.
-
-Pullrequest: https://github.com/domoticz/domoticz/pull/6252
-Patch: https://patch-diff.githubusercontent.com/raw/domoticz/domoticz/pull/6252.patch-diff
-
-diff --git hardware/ASyncSerial.cpp hardware/ASyncSerial.cpp
-index 52c950d..6147cdb 100644
---- hardware/ASyncSerial.cpp
-+++ hardware/ASyncSerial.cpp
-@@ -54,7 +54,7 @@ public:
- {
- }
-
-- boost::asio::io_service io; ///< Io service object
-+ boost::asio::io_context io; ///< Io service object
- boost::asio::serial_port port; ///< Serial port object
- boost::thread backgroundThread; ///< Thread that runs read/write operations
- bool open{ false }; ///< True if port open
-@@ -117,10 +117,10 @@ void AsyncSerial::open(const std::string& devname, unsigned int baud_rate,
- throw;
- }
-
-- pimpl->io.reset();
-+ pimpl->io.restart();
-
-- // This gives some work to the io_service before it is started
-- pimpl->io.post([this] { return doRead(); });
-+ // This gives some work to the io_context before it is started
-+ boost::asio::post(pimpl->io, [this] { return doRead(); });
-
- boost::thread t([p = &pimpl->io] { p->run(); });
- pimpl->backgroundThread.swap(t);
-@@ -149,10 +149,10 @@ void AsyncSerial::openOnlyBaud(const std::string& devname, unsigned int baud_rat
- throw;
- }
-
-- pimpl->io.reset();
-+ pimpl->io.restart();
-
-- //This gives some work to the io_service before it is started
-- pimpl->io.post([this] { return doRead(); });
-+ //This gives some work to the io_context before it is started
-+ boost::asio::post(pimpl->io, [this] { return doRead(); });
-
- boost::thread t([p = &pimpl->io] { p->run(); });
- pimpl->backgroundThread.swap(t);
-@@ -176,9 +176,9 @@ void AsyncSerial::close()
- if(!isOpen()) return;
-
- pimpl->open = false;
-- pimpl->io.post([this] { doClose(); });
-+ boost::asio::post(pimpl->io, [this] { doClose(); });
- pimpl->backgroundThread.join();
-- pimpl->io.reset();
-+ pimpl->io.restart();
- if(errorStatus())
- {
- throw(boost::system::system_error(boost::system::error_code(),
-@@ -192,7 +192,7 @@ void AsyncSerial::write(const char *data, size_t size)
- std::lock_guard<std::mutex> l(pimpl->writeQueueMutex);
- pimpl->writeQueue.insert(pimpl->writeQueue.end(),data,data+size);
- }
-- pimpl->io.post([this] { doWrite(); });
-+ boost::asio::post(pimpl->io, [this] { doWrite(); });
- }
-
- void AsyncSerial::write(const std::string &data)
-@@ -201,7 +201,7 @@ void AsyncSerial::write(const std::string &data)
- std::lock_guard<std::mutex> l(pimpl->writeQueueMutex);
- pimpl->writeQueue.insert(pimpl->writeQueue.end(), data.c_str(), data.c_str()+data.size());
- }
-- pimpl->io.post([this] { doWrite(); });
-+ boost::asio::post(pimpl->io, [this] { doWrite(); });
- }
-
- void AsyncSerial::write(const std::vector<char>& data)
-@@ -211,7 +211,7 @@ void AsyncSerial::write(const std::vector<char>& data)
- pimpl->writeQueue.insert(pimpl->writeQueue.end(),data.begin(),
- data.end());
- }
-- pimpl->io.post([this] { doWrite(); });
-+ boost::asio::post(pimpl->io, [this] { doWrite(); });
- }
-
- void AsyncSerial::writeString(const std::string& s)
-@@ -220,7 +220,7 @@ void AsyncSerial::writeString(const std::string& s)
- std::lock_guard<std::mutex> l(pimpl->writeQueueMutex);
- pimpl->writeQueue.insert(pimpl->writeQueue.end(),s.begin(),s.end());
- }
-- pimpl->io.post([this] { doWrite(); });
-+ boost::asio::post(pimpl->io, [this] { doWrite(); });
- }
-
- void AsyncSerial::doRead()
-diff --git hardware/ASyncSerial.h hardware/ASyncSerial.h
-index 0a51ef0..de83f8a 100644
---- hardware/ASyncSerial.h
-+++ hardware/ASyncSerial.h
-@@ -123,27 +123,27 @@ class AsyncSerial : private domoticz::noncopyable
-
- /**
- * Callback called to start an asynchronous read operation.
-- * This callback is called by the io_service in the spawned thread.
-+ * This callback is called by the io_context in the spawned thread.
- */
- void doRead();
-
- /**
- * Callback called at the end of the asynchronous operation.
-- * This callback is called by the io_service in the spawned thread.
-+ * This callback is called by the io_context in the spawned thread.
- */
- void readEnd(const boost::system::error_code &error, size_t bytes_transferred);
-
- /**
- * Callback called to start an asynchronous write operation.
- * If it is already in progress, does nothing.
-- * This callback is called by the io_service in the spawned thread.
-+ * This callback is called by the io_context in the spawned thread.
- */
- void doWrite();
-
- /**
- * Callback called at the end of an asynchronuous write operation,
- * if there is more data to write, restarts a new write operation.
-- * This callback is called by the io_service in the spawned thread.
-+ * This callback is called by the io_context in the spawned thread.
- */
- void writeEnd(const boost::system::error_code &error);
-
-diff --git hardware/ASyncTCP.cpp hardware/ASyncTCP.cpp
-index a375561..7c3b536 100644
---- hardware/ASyncTCP.cpp
-+++ hardware/ASyncTCP.cpp
-@@ -4,213 +4,241 @@
- #include <boost/system/error_code.hpp> // for error_code
- #include "../main/Logger.h"
-
--struct hostent;
--
- #define MAX_TCP_BUFFER_SIZE 4096
-
--#ifndef WIN32
-- #include <unistd.h> //gethostbyname
--#endif
--
- #define STATUS_OK(err) !err
--
--ASyncTCP::ASyncTCP(const bool secure)
-+#define STATUS_ERR(err) err
-+
-+ASyncTCP::ASyncTCP(const bool secure) :
-+ m_Tcpwork(boost::asio::make_work_guard(m_io_context))
-+ , m_Socket(m_io_context)
-+ , m_Resolver(m_io_context)
-+ , m_ReconnectTimer(m_io_context)
-+ , m_TimeoutTimer(m_io_context)
-+ , m_SendStrand(m_io_context)
- #ifdef WWW_ENABLE_SSL
-- : mSecure(secure)
-+ , m_bSecure(secure)
- #endif
- {
- m_pRXBuffer = new uint8_t[MAX_TCP_BUFFER_SIZE];
- #ifdef WWW_ENABLE_SSL
- mContext.set_verify_mode(boost::asio::ssl::verify_none);
-- if (mSecure)
-+ if (m_bSecure)
- {
-- mSslSocket.reset(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(mIos, mContext));
-+ m_SslSocket.reset(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(m_io_context, mContext));
- }
- #endif
- }
-
- ASyncTCP::~ASyncTCP()
- {
-- assert(mTcpthread == nullptr);
-- mIsTerminating = true;
-- if (mTcpthread)
-+ assert(m_Tcpthread == nullptr);
-+ m_bIsTerminating = true;
-+ if (m_Tcpthread)
- {
- //This should never happen. terminate() never called!!
-- _log.Log(LOG_ERROR, "ASyncTCP: Workerthread not closed. terminate() never called!!!");
-- mIos.stop();
-- if (mTcpthread)
-+ _log.Log(LOG_ERROR, "ASyncTCP: Worker thread not closed. terminate() never called!!!");
-+ m_io_context.stop();
-+ if (m_Tcpthread)
- {
-- mTcpthread->join();
-- mTcpthread.reset();
-+ m_Tcpthread->join();
-+ m_Tcpthread.reset();
- }
- }
- if (m_pRXBuffer != nullptr)
- delete[] m_pRXBuffer;
- }
-
--void ASyncTCP::SetReconnectDelay(int32_t Delay)
-+void ASyncTCP::SetReconnectDelay(const int32_t Delay)
- {
-- mReconnectDelay = Delay;
-+ m_iReconnectDelay = Delay;
- }
-
- void ASyncTCP::connect(const std::string& ip, uint16_t port)
- {
-- assert(!mSocket.is_open());
-- if (mSocket.is_open())
-+ assert(!m_Socket.is_open());
-+ if (m_Socket.is_open())
- {
- _log.Log(LOG_ERROR, "ASyncTCP: connect called while socket is still open. !!!");
- terminate();
- }
-
-- // RK: We reset mIos here because it might have been stopped in terminate()
-- mIos.reset();
-- // RK: After the reset, we need to provide it work anew
-- mTcpwork = std::make_shared<boost::asio::io_service::work>(mIos);
-- if (!mTcpthread)
-- mTcpthread = std::make_shared<std::thread>([p = &mIos] { p->run(); });
--
-- mIp = ip;
-- mPort = port;
-+ m_IP = ip;
-+ m_Port = port;
- std::string port_str = std::to_string(port);
-- boost::asio::ip::tcp::resolver::query query(ip, port_str);
- timeout_start_timer();
-- mResolver.async_resolve(query, [this](auto &&err, auto &&iter) { cb_resolve_done(err, iter); });
-+
-+ m_Resolver.async_resolve(
-+ ip, port_str,
-+ [this](const boost::system::error_code& error, const boost::asio::ip::tcp::resolver::results_type& endpoints) {
-+ handle_resolve(error, endpoints);
-+ }
-+ );
-+
-+ // RK: We restart m_io_context here because it might have been stopped in terminate()
-+ m_io_context.restart();
-+ // RK: After the reset, we need to provide it work anew
-+ m_Tcpwork.reset();
-+ m_Tcpwork.emplace(boost::asio::make_work_guard(m_io_context));
-+ if (!m_Tcpthread)
-+ m_Tcpthread = std::make_shared<std::thread>([p = &m_io_context] { p->run(); });
- }
-
--void ASyncTCP::cb_resolve_done(const boost::system::error_code& error, boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
-+void ASyncTCP::handle_resolve(const boost::system::error_code& error, const boost::asio::ip::tcp::resolver::results_type &endpoints)
- {
-- if (mIsTerminating) return;
-+ if (m_bIsTerminating) return;
-
-- if (STATUS_OK(error))
-- {
-- connect_start(endpoint_iterator);
-- }
-- else
-+ if (STATUS_ERR(error))
- {
- process_error(error);
-+ return;
- }
--}
--
--void ASyncTCP::connect_start(boost::asio::ip::tcp::resolver::iterator& endpoint_iterator)
--{
-- if (mIsConnected) return;
--
-- mEndPoint = *endpoint_iterator++;
-+ if (m_bIsConnected) return;
-
- timeout_start_timer();
-+
- #ifdef WWW_ENABLE_SSL
-- if (mSecure)
-+ if (m_bSecure)
- {
- // we reset the ssl socket, because the ssl context needs to be reinitialized after a reconnect
-- mSslSocket.reset(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(mIos, mContext));
-- mSslSocket->lowest_layer().async_connect(mEndPoint, [this, endpoint_iterator](auto &&err) mutable { cb_connect_done(err, endpoint_iterator); });
-+ m_SslSocket.reset(new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(m_io_context, mContext));
-+ boost::asio::async_connect(m_SslSocket->lowest_layer(), endpoints,
-+ [this](const boost::system::error_code& error, const boost::asio::ip::tcp::endpoint& endpoint)
-+ {
-+ handle_connect(error, endpoint);
-+ }
-+ );
- }
- else
- #endif
- {
-- mSocket.async_connect(mEndPoint, [this, endpoint_iterator](auto &&err) mutable { cb_connect_done(err, endpoint_iterator); });
-+ boost::asio::async_connect(m_Socket, endpoints,
-+ [this](const boost::system::error_code& error, const boost::asio::ip::tcp::endpoint& endpoint)
-+ {
-+ handle_connect(error, endpoint);
-+ }
-+ );
- }
- }
-
--void ASyncTCP::cb_connect_done(const boost::system::error_code& error, boost::asio::ip::tcp::resolver::iterator &endpoint_iterator)
-+void ASyncTCP::handle_connect(const boost::system::error_code& error, const boost::asio::ip::tcp::endpoint& /*endpoint*/)
- {
-- if (mIsTerminating) return;
-+ if (m_bIsTerminating) return;
-
-- if (STATUS_OK(error))
-+ if (STATUS_ERR(error))
- {
-+ process_error(error);
-+ return;
-+ }
- #ifdef WWW_ENABLE_SSL
-- if (mSecure)
-- {
-- timeout_start_timer();
-- mSslSocket->async_handshake(boost::asio::ssl::stream_base::client, [this](auto &&err) { cb_handshake_done(err); });
-- }
-- else
--#endif
-- {
-- process_connection();
-- }
-+ if (m_bSecure)
-+ {
-+ timeout_start_timer();
-+ m_SslSocket->async_handshake(boost::asio::ssl::stream_base::client,
-+ [this](const boost::system::error_code& error) {
-+ cb_handshake_done(error);
-+ }
-+ );
- }
-- else
-+ else
-+#endif
- {
-- if (endpoint_iterator != boost::asio::ip::tcp::resolver::iterator())
-- {
-- // The connection failed. Try the next endpoint in the list.
-- connect_start(endpoint_iterator);
-- return;
-- }
-- process_error(error);
-+ process_connection();
- }
- }
-
- #ifdef WWW_ENABLE_SSL
- void ASyncTCP::cb_handshake_done(const boost::system::error_code& error)
- {
-- if (mIsTerminating) return;
-+ if (m_bIsTerminating) return;
-
-- if (STATUS_OK(error))
-- {
-- process_connection();
-- }
-- else
-+ if (STATUS_ERR(error))
- {
- process_error(error);
-+ return;
- }
-+ process_connection();
-+#endif
- }
-+
-+void ASyncTCP::process_connection()
-+{
-+ m_bIsConnected = true;
-+#ifdef WWW_ENABLE_SSL
-+
-+ if (!m_bSecure)
- #endif
-+ {
-+ // RK: only if non-secure
-+ boost::asio::socket_base::keep_alive option(true);
-+ m_Socket.set_option(option);
-+ }
-+ OnConnect();
-+ do_read_start();
-+ do_write_start();
-+}
-
- void ASyncTCP::reconnect_start_timer()
- {
-- if (mIsReconnecting) return;
-+ if (m_bIsReconnecting) return;
-
-- if (mReconnectDelay != 0)
-+ if (m_iReconnectDelay != 0)
- {
-- mIsReconnecting = true;
--
-- mReconnectTimer.expires_from_now(boost::posix_time::seconds(mReconnectDelay));
-- mReconnectTimer.async_wait([this](auto &&err) { cb_reconnect_start(err); });
-+ m_bIsReconnecting = true;
-+
-+ m_ReconnectTimer.expires_from_now(boost::posix_time::seconds(m_iReconnectDelay));
-+ m_ReconnectTimer.async_wait(
-+ [this](const boost::system::error_code& error) {
-+ cb_reconnect_start(error);
-+ }
-+ );
- }
- }
-
- void ASyncTCP::cb_reconnect_start(const boost::system::error_code& error)
- {
-- mIsReconnecting = false;
-- mReconnectTimer.cancel();
-- mTimeoutTimer.cancel();
-+ m_bIsReconnecting = false;
-+ m_ReconnectTimer.cancel();
-+ m_TimeoutTimer.cancel();
-
-- if (mIsConnected) return;
-+ if (m_bIsConnected) return;
- if (error) return; // timer was cancelled
-
- do_close();
-- connect(mIp, mPort);
-+ connect(m_IP, m_Port);
- }
-
-
- void ASyncTCP::terminate(const bool silent)
- {
-- mIsTerminating = true;
-+ m_bIsTerminating = true;
- disconnect(silent);
-- mTcpwork.reset();
-- mIos.stop();
-- if (mTcpthread)
-+ m_Tcpwork.reset();
-+ m_io_context.stop();
-+ if (m_Tcpthread)
- {
-- mTcpthread->join();
-- mTcpthread.reset();
-+ m_Tcpthread->join();
-+ m_Tcpthread.reset();
- }
-- mIsReconnecting = false;
-- mIsConnected = false;
-- mWriteQ.clear();
-- mIsTerminating = false;
-+ m_bIsReconnecting = false;
-+ m_bIsConnected = false;
-+ m_WriteQ.clear();
-+ m_bIsTerminating = false;
- }
-
- void ASyncTCP::disconnect(const bool silent)
- {
-- mReconnectTimer.cancel();
-- mTimeoutTimer.cancel();
-- if (!mTcpthread) return;
-+ m_ReconnectTimer.cancel();
-+ m_TimeoutTimer.cancel();
-+ if (!m_Tcpthread) return;
-
- try
- {
-- mIos.post([this] { do_close(); });
-+ boost::asio::post(m_io_context,
-+ [this] {
-+ do_close();
-+ }
-+ );
- }
- catch (...)
- {
-@@ -223,62 +251,68 @@ void ASyncTCP::disconnect(const bool silent)
-
- void ASyncTCP::do_close()
- {
-- if (mIsReconnecting) {
-+ if (m_bIsReconnecting) {
- return;
- }
-- mReconnectTimer.cancel();
-- mTimeoutTimer.cancel();
-+ m_ReconnectTimer.cancel();
-+ m_TimeoutTimer.cancel();
- boost::system::error_code ec;
- #ifdef WWW_ENABLE_SSL
-- if (mSecure)
-+ if (m_bSecure)
- {
-- if (mSslSocket->lowest_layer().is_open())
-+ if (m_SslSocket->lowest_layer().is_open())
- {
-- mSslSocket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
-- mSslSocket->lowest_layer().close(ec);
-+ m_SslSocket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
-+ m_SslSocket->lowest_layer().close(ec);
- }
- }
- else
- #endif
- {
-- if (mSocket.is_open())
-+ if (m_Socket.is_open())
- {
-- mSocket.close(ec);
-+ m_Socket.close(ec);
- }
- }
- }
-
- void ASyncTCP::do_read_start()
- {
-- if (mIsTerminating) return;
-- if (!mIsConnected) return;
-+ if (m_bIsTerminating) return;
-+ if (!m_bIsConnected) return;
-
- timeout_start_timer();
- #ifdef WWW_ENABLE_SSL
-- if (mSecure)
-+ if (m_bSecure)
- {
-- mSslSocket->async_read_some(boost::asio::buffer(m_pRXBuffer, MAX_TCP_BUFFER_SIZE), [this](auto &&err, auto bytes) { cb_read_done(err, bytes); });
-+ m_SslSocket->async_read_some(boost::asio::buffer(m_pRXBuffer, MAX_TCP_BUFFER_SIZE),
-+ [this](const boost::system::error_code& error, size_t bytes_transferred) {
-+ cb_read_done(error, bytes_transferred);
-+ }
-+ );
- }
- else
- #endif
- {
-- mSocket.async_read_some(boost::asio::buffer(m_pRXBuffer, MAX_TCP_BUFFER_SIZE), [this](auto &&err, auto bytes) { cb_read_done(err, bytes); });
-+ m_Socket.async_read_some(boost::asio::buffer(m_pRXBuffer, MAX_TCP_BUFFER_SIZE),
-+ [this](const boost::system::error_code& error, size_t bytes_transferred) {
-+ cb_read_done(error, bytes_transferred);
-+ }
-+ );
- }
- }
-
- void ASyncTCP::cb_read_done(const boost::system::error_code& error, size_t bytes_transferred)
- {
-- if (mIsTerminating) return;
-+ if (m_bIsTerminating) return;
-
-- if (STATUS_OK(error))
-- {
-- OnData(m_pRXBuffer, bytes_transferred);
-- do_read_start();
-- }
-- else
-+ if (STATUS_ERR(error))
- {
- process_error(error);
-+ return;
- }
-+ OnData(m_pRXBuffer, bytes_transferred);
-+ do_read_start();
- }
-
- void ASyncTCP::write(const uint8_t* pData, size_t length)
-@@ -288,77 +322,66 @@ void ASyncTCP::write(const uint8_t* pData, size_t length)
-
- void ASyncTCP::write(const std::string& msg)
- {
-- if (!mTcpthread) return;
-+ if (!m_Tcpthread) return;
-
-- mSendStrand.post([this, msg]() { cb_write_queue(msg); });
-+ boost::asio::post(m_SendStrand, [this, msg]() { cb_write_queue(msg); });
- }
-
- void ASyncTCP::cb_write_queue(const std::string& msg)
- {
-- mWriteQ.push_back(msg);
-+ m_WriteQ.push_back(msg);
-
-- if (mWriteQ.size() == 1)
-+ if (m_WriteQ.size() == 1)
- do_write_start();
- }
-
- void ASyncTCP::do_write_start()
- {
-- if (mIsTerminating) return;
-- if (!mIsConnected) return;
-- if (mWriteQ.empty())
-+ if (m_bIsTerminating) return;
-+ if (!m_bIsConnected) return;
-+ if (m_WriteQ.empty())
- return;
-
- timeout_start_timer();
- #ifdef WWW_ENABLE_SSL
-- if (mSecure)
-+ if (m_bSecure)
- {
-- boost::asio::async_write(*mSslSocket, boost::asio::buffer(mWriteQ.front()), [this](auto &&err, auto) { cb_write_done(err); });
-+ boost::asio::async_write(*m_SslSocket, boost::asio::buffer(m_WriteQ.front()),
-+ [this](const boost::system::error_code& error, std::size_t length) {
-+ cb_write_done(error, length);
-+ }
-+ );
- }
- else
- #endif
- {
-- boost::asio::async_write(mSocket, boost::asio::buffer(mWriteQ.front()), [this](auto &&err, auto) { cb_write_done(err); });
-+ boost::asio::async_write(m_Socket, boost::asio::buffer(m_WriteQ.front()),
-+ [this](const boost::system::error_code& error, std::size_t length) {
-+ cb_write_done(error, length);
-+ }
-+ );
- }
- }
-
--void ASyncTCP::cb_write_done(const boost::system::error_code& error)
-+void ASyncTCP::cb_write_done(const boost::system::error_code& error, std::size_t /*length*/)
- {
-- if (mIsTerminating) return;
-+ if (m_bIsTerminating) return;
-
-- if (STATUS_OK(error))
-- {
-- mWriteQ.pop_front();
-- do_write_start();
-- }
-- else
-+ if (STATUS_ERR(error))
- {
- process_error(error);
-+ return;
- }
*** 1718 LINES SKIPPED ***