11#include < desktop.hpp>
22
3+ class response_body_writer : public wxWebViewHandlerResponseData
4+ {
5+ public:
6+ response_body_writer () = default ;
7+ ~response_body_writer () = default ;
8+
9+ wxInputStream *GetStream () override
10+ {
11+ if (!_stream)
12+ {
13+ _stream = std::make_unique<wxMemoryInputStream>(_buffer.data (), _buffer.size ());
14+ }
15+ return _stream.get ();
16+ }
17+
18+ void write (const uint8_t *data, size_t size)
19+ {
20+ _buffer.insert (_buffer.end (), data, data + size);
21+ }
22+
23+ private:
24+ std::vector<uint8_t > _buffer;
25+ std::unique_ptr<wxMemoryInputStream> _stream;
26+ };
27+
28+
329namespace webframe
430{
531 namespace desktop
@@ -20,27 +46,27 @@ namespace webframe
2046
2147 void response::set_body (const uint8_t *data, size_t size)
2248 {
23- _response->Finish (std::string (reinterpret_cast <const char *>(data), size));
49+ std::unique_ptr<response_body_writer> body_writer = std::make_unique<response_body_writer>();
50+ body_writer->write (data, size);
51+ _response->Finish (wxSharedPtr<wxWebViewHandlerResponseData>(body_writer.release ()));
2452 _sent = true ;
2553 }
2654
2755 void response::write_body (const std::function<bool (std::pair<const uint8_t *, size_t > &)> &callback)
2856 {
29- std::vector< uint8_t > buffer ;
30- bool has_more_data = true ;
31- while (has_more_data )
57+ std::unique_ptr<response_body_writer> body_writer = std::make_unique<response_body_writer>() ;
58+ bool has_more ( true ) ;
59+ while (has_more )
3260 {
3361 std::pair<const uint8_t *, size_t > data;
34- if (callback (data))
35- {
36- buffer.insert (buffer.end (), data.first , data.first + data.second );
37- }
38- else
62+ has_more = callback (data);
63+ if (data.first && data.second )
3964 {
40- has_more_data = false ;
65+ body_writer-> write (data. first , data. second ) ;
4166 }
4267 }
43- set_body (buffer.data (), buffer.size ());
68+ _response->Finish (wxSharedPtr<wxWebViewHandlerResponseData>(body_writer.release ()));
69+ _sent = true ;
4470 }
4571 }
4672}
0 commit comments