@ -15,7 +15,8 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
# if WEB_SUPPORT
namespace asyncwebprint_traits {
namespace asyncwebprint {
namespace traits {
template < typename T >
using print_callable_t = decltype ( std : : declval < T > ( ) ( std : : declval < Print & > ( ) ) ) ;
@ -23,17 +24,26 @@ using print_callable_t = decltype(std::declval<T>()(std::declval<Print&>()));
template < typename T >
using is_print_callable = is_detected < print_callable_t , T > ;
}
}
template < typename CallbackType >
void AsyncWebPrint : : scheduleFromRequest ( const AsyncWebPrintConfig & config , AsyncWebServerRequest * request , CallbackType callback ) {
static_assert ( asyncwebprint_ traits : : is_print_callable < CallbackType > : : value , " CallbackType needs to be a callable with void(Print&) " ) ;
static_assert ( asyncwebprint : : traits : : is_print_callable < CallbackType > : : value , " CallbackType needs to be a callable with void(Print&) " ) ;
/ / because of async nature of the server , we need to make sure we outlive ' request ' object
auto print = std : : shared_ptr < AsyncWebPrint > ( new AsyncWebPrint ( config , request ) ) ;
/ / attach one ptr to onDisconnect capture , so we can detect disconnection before scheduled function runs
request - > onDisconnect ( [ print ] ( ) {
request - > onDisconnect ( [ print , request ] ( ) {
# if API_SUPPORT
/ / TODO : in case this comes from ` apiRegister ` ' ed endpoint , there ' s still a lingering ApiRequestHelper that we must remove
if ( request - > _tempObject ) {
auto * ptr = reinterpret_cast < ApiRequestHelper * > ( request - > _tempObject ) ;
delete ptr ;
request - > _tempObject = nullptr ;
}
# endif
print - > setState ( AsyncWebPrint : : State : : Done ) ;
} ) ;