Mirror of espurna firmware for wireless switches and more
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
2.2 KiB

/*
Part of WEBSERVER MODULE
Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
*/
#pragma once
#include "espurna.h"
#include <ESPAsyncWebServer.h>
#include <functional>
#include <list>
#include <vector>
namespace espurna {
namespace web {
namespace print {
struct Config {
struct Backlog {
size_t count;
size_t size;
duration::Seconds timeout;
};
const char* const mimeType;
Backlog backlog;
};
class RequestPrint : public Print {
public:
enum class State {
None,
Sending,
Done,
Error
};
using BufferType = std::vector<uint8_t>;
using TimeSource = espurna::time::CoreClock;
// To be able to safely output data right from the request callback,
// we schedule a 'printer' task that will print into the request response buffer via AsyncChunkedResponse
// Note: implementation must be included in the header
template <typename CallbackType>
static void scheduleFromRequest(Config config, AsyncWebServerRequest*, CallbackType);
template <typename CallbackType>
static void scheduleFromRequest(AsyncWebServerRequest*, CallbackType);
void flush() final override;
size_t write(uint8_t) final override;
size_t write(const uint8_t *buffer, size_t size) final override;
State state() const {
return _state;
}
void state(State state) {
_state = state;
}
AsyncWebServerRequest* request() const {
return _request;
}
private:
Config _config;
std::list<BufferType> _buffers;
AsyncWebServerRequest* const _request;
State _state;
RequestPrint(Config config, AsyncWebServerRequest* request) :
_config(config),
_request(request),
_state(State::None)
{}
bool _addBuffer();
bool _exhaustBuffers();
void _prepareRequest();
size_t _handleRequest(uint8_t* data, size_t maxLen);
void _onDisconnect();
template <typename CallbackType>
void _callback(CallbackType&&);
};
template <typename T>
void scheduleFromRequest(AsyncWebServerRequest* request, T&& callback) {
RequestPrint::scheduleFromRequest(request, std::forward<T>(callback));
}
} // namespace print
} // namespace web
} // namespace espurna