mirror of https://github.com/arendst/Tasmota.git
Add wcclient.get_bytes() to Berry (#18829)
(cherry picked from commit 5903b21448a3f088b12bd47a04996ff84e467a3a)
This commit is contained in:
parent
138b119c6d
commit
fc92dc0995
|
@ -30,6 +30,7 @@ extern int wc_getstring(bvm *vm);
|
||||||
extern int wc_writefile(bvm *vm);
|
extern int wc_writefile(bvm *vm);
|
||||||
extern int wc_writeflash(bvm *vm);
|
extern int wc_writeflash(bvm *vm);
|
||||||
extern int wc_getsize(bvm *vm);
|
extern int wc_getsize(bvm *vm);
|
||||||
|
extern int wc_getbytes(bvm *vm);
|
||||||
|
|
||||||
#include "be_fixed_be_class_webclient.h"
|
#include "be_fixed_be_class_webclient.h"
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ class be_class_webclient (scope: global, name: webclient) {
|
||||||
write_file, func(wc_writefile)
|
write_file, func(wc_writefile)
|
||||||
write_flash, func(wc_writeflash)
|
write_flash, func(wc_writeflash)
|
||||||
get_size, func(wc_getsize)
|
get_size, func(wc_getsize)
|
||||||
|
get_bytes, func(wc_getbytes)
|
||||||
}
|
}
|
||||||
@const_object_info_end */
|
@const_object_info_end */
|
||||||
|
|
||||||
|
|
|
@ -654,5 +654,57 @@ extern "C" {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class StreamBytes: public Stream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StreamBytes(uint8_t * buf_in, int len_in) : buf(buf_in), offset(0), len(len_in) {};
|
||||||
|
|
||||||
|
size_t write(const uint8_t *buffer, size_t size) override {
|
||||||
|
// AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size);
|
||||||
|
if (size > 0) {
|
||||||
|
if (offset + size > len){
|
||||||
|
AddLog(LOG_LEVEL_ERROR, "BERRYWC: bufer overrun");
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
memcpy(buf+offset, buffer, size);
|
||||||
|
offset += size;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
size_t write(uint8_t data) override {
|
||||||
|
write(&data, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int available() override { return 0; }
|
||||||
|
int read() override { return -1; }
|
||||||
|
int peek() override { return -1; }
|
||||||
|
void flush() override { }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint8_t *buf; // start address
|
||||||
|
uint32_t offset; // how many bytes have already been written
|
||||||
|
uint32_t len; // allocated len
|
||||||
|
};
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
int32_t wc_getbytes(struct bvm *vm);
|
||||||
|
int32_t wc_getbytes(struct bvm *vm) {
|
||||||
|
HTTPClientLight * cl = wc_getclient(vm);
|
||||||
|
int32_t sz = cl->getSize();
|
||||||
|
// abort if we exceed 32KB size, things will not go well otherwise
|
||||||
|
if (sz >= 32767 || sz < 0) {
|
||||||
|
be_raise(vm, "value_error", "response size -1 or too big (>32KB)");
|
||||||
|
}
|
||||||
|
uint8_t * buf = (uint8_t*) be_pushbuffer(vm, sz);
|
||||||
|
StreamBytes memory_writer(buf, sz);
|
||||||
|
int32_t written = cl->writeToStream(&memory_writer);
|
||||||
|
|
||||||
|
be_pushbytes(vm, buf, sz);
|
||||||
|
cl->end(); // free allocated memory ~16KB
|
||||||
|
be_return(vm); /* return code */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // USE_WEBCLIENT
|
#endif // USE_WEBCLIENT
|
||||||
#endif // USE_BERRY
|
#endif // USE_BERRY
|
||||||
|
|
Loading…
Reference in New Issue