1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-07 16:23:38 +03:00

add function peekBytes to WiFiClient/WiFiClientSecure to allow to peek multiple bytes if possible

This commit is contained in:
Markus Sattler 2015-12-19 14:37:36 +01:00
parent 898737422e
commit 5333ebfed7
5 changed files with 72 additions and 0 deletions

View File

@ -239,6 +239,27 @@ int WiFiClient::peek()
return _client->peek(); return _client->peek();
} }
size_t WiFiClient::peekBytes(uint8_t *buffer, size_t length) {
size_t count = 0;
if(!_client) {
return 0;
}
_startMillis = millis();
while((available() < (int) length) && ((millis() - _startMillis) < _timeout)) {
yield();
}
if(available() < (int) length) {
count = available();
} else {
count = length;
}
return _client->peekBytes((char *)buffer, count);
}
void WiFiClient::flush() void WiFiClient::flush()
{ {
if (_client) if (_client)

View File

@ -56,6 +56,10 @@ public:
virtual int read(); virtual int read();
virtual int read(uint8_t *buf, size_t size); virtual int read(uint8_t *buf, size_t size);
virtual int peek(); virtual int peek();
virtual size_t peekBytes(uint8_t *buffer, size_t length);
size_t peekBytes(char *buffer, size_t length) {
return peekBytes((uint8_t *) buffer, length);
}
virtual void flush(); virtual void flush();
virtual void stop(); virtual void stop();
virtual uint8_t connected(); virtual uint8_t connected();

View File

@ -133,6 +133,17 @@ public:
return _read_ptr[0]; return _read_ptr[0];
} }
size_t peekBytes(char *dst, size_t size) {
if(!_available) {
if(!_readAll())
return -1;
}
size_t will_copy = (_available < size) ? _available : size;
memcpy(dst, _read_ptr, will_copy);
return will_copy;
}
int available() { int available() {
auto cb = _available; auto cb = _available;
if (cb == 0) { if (cb == 0) {
@ -278,6 +289,27 @@ int WiFiClientSecure::peek() {
return _ssl->peek(); return _ssl->peek();
} }
size_t WiFiClientSecure::peekBytes(uint8_t *buffer, size_t length) {
size_t count = 0;
if(!_ssl) {
return 0;
}
_startMillis = millis();
while((available() < (int) length) && ((millis() - _startMillis) < _timeout)) {
yield();
}
if(available() < (int) length) {
count = available();
} else {
count = length;
}
return _ssl->peekBytes((char *)buffer, count);
}
int WiFiClientSecure::available() { int WiFiClientSecure::available() {
if (!_ssl) if (!_ssl)
return 0; return 0;

View File

@ -46,6 +46,7 @@ public:
int available() override; int available() override;
int read() override; int read() override;
int peek() override; int peek() override;
size_t peekBytes(uint8_t *buffer, size_t length) override;
void stop() override; void stop() override;
void setCertificate(const uint8_t* cert_data, size_t size); void setCertificate(const uint8_t* cert_data, size_t size);

View File

@ -179,6 +179,20 @@ class ClientContext {
return reinterpret_cast<char*>(_rx_buf->payload)[_rx_buf_offset]; return reinterpret_cast<char*>(_rx_buf->payload)[_rx_buf_offset];
} }
size_t peekBytes(char *dst, size_t size) {
if(!_rx_buf) return 0;
size_t max_size = _rx_buf->tot_len - _rx_buf_offset;
size = (size < max_size) ? size : max_size;
DEBUGV(":pd %d, %d, %d\r\n", size, _rx_buf->tot_len, _rx_buf_offset);
size_t buf_size = _rx_buf->len - _rx_buf_offset;
size_t copy_size = (size < buf_size) ? size : buf_size;
DEBUGV(":rpi %d, %d\r\n", buf_size, copy_size);
os_memcpy(dst, reinterpret_cast<char*>(_rx_buf->payload) + _rx_buf_offset, copy_size);
return copy_size;
}
void flush() { void flush() {
if(!_rx_buf) { if(!_rx_buf) {
return; return;