SyncClient::SyncClient(AsyncClient *client, size_t txBufLen) : _client(client) , _tx_buffer(new cbuf(txBufLen)) , _tx_buffer_size(txBufLen) , _rx_buffer(NULL) { _attachCallbacks(); }
AsyncPrinter::AsyncPrinter(AsyncClient *client, size_t txBufLen) : _client(client) , _data_cb(NULL) , _data_arg(NULL) , _close_cb(NULL) , _close_arg(NULL) , _tx_buffer(NULL) , _tx_buffer_size(txBufLen) , next(NULL) { _attachCallbacks(); _tx_buffer = new cbuf(_tx_buffer_size); }
AsyncPrinter & AsyncPrinter::operator=(const AsyncPrinter &other){ if(_client != NULL){ _client->abort(); _client->free(); _client = NULL; } _tx_buffer_size = other._tx_buffer_size; if(_tx_buffer != NULL){ cbuf *b = _tx_buffer; _tx_buffer = NULL; delete b; } _tx_buffer = new cbuf(other._tx_buffer_size); _client = other._client; _attachCallbacks(); return *this; }
int SyncClient::connect(IPAddress ip, uint16_t port, bool secure){ #else int SyncClient::connect(IPAddress ip, uint16_t port){ #endif if(_client != NULL && connected()) return 0; _client = new AsyncClient(); _client->onConnect([](void *obj, AsyncClient *c){ ((SyncClient*)(obj))->_onConnect(c); }, this); _attachCallbacks_Disconnect(); #if ASYNC_TCP_SSL_ENABLED if(_client->connect(ip, port, secure)){ #else if(_client->connect(ip, port)){ #endif while(_client != NULL && !_client->connected() && !_client->disconnecting()) delay(1); return connected(); } return 0; } #if ASYNC_TCP_SSL_ENABLED int SyncClient::connect(const char *host, uint16_t port, bool secure){ #else int SyncClient::connect(const char *host, uint16_t port){ #endif if(_client != NULL && connected()){ return 0; } _client = new AsyncClient(); _client->onConnect([](void *obj, AsyncClient *c){ ((SyncClient*)(obj))->_onConnect(c); }, this); _attachCallbacks_Disconnect(); #if ASYNC_TCP_SSL_ENABLED if(_client->connect(host, port, secure)){ #else if(_client->connect(host, port)){ #endif while(_client != NULL && !_client->connected() && !_client->disconnecting()) delay(1); return connected(); } return 0; } SyncClient & SyncClient::operator=(const SyncClient &other){ if(_client != NULL){ _client->abort(); _client->free(); _client = NULL; } _tx_buffer_size = other._tx_buffer_size; if(_tx_buffer != NULL){ cbuf *b = _tx_buffer; _tx_buffer = NULL; delete b; } while(_rx_buffer != NULL){ cbuf *b = _rx_buffer; _rx_buffer = b->next; delete b; } _tx_buffer = new cbuf(other._tx_buffer_size); _client = other._client; _attachCallbacks(); return *this; } void SyncClient::setTimeout(uint32_t seconds){ if(_client != NULL) _client->setRxTimeout(seconds); } uint8_t SyncClient::status(){ if(_client == NULL) return 0; return _client->state(); } uint8_t SyncClient::connected(){ return (_client != NULL && _client->connected()); } void SyncClient::stop(){ if(_client != NULL) _client->close(true); } size_t SyncClient::_sendBuffer(){ size_t available = _tx_buffer->available(); if(!connected() || !_client->canSend() || available == 0) return 0; size_t sendable = _client->space(); if(sendable < available) available= sendable; char *out = new char[available]; _tx_buffer->read(out, available); size_t sent = _client->write(out, available); delete[] out; return sent; } void SyncClient::_onData(void *data, size_t len){ _client->ackLater(); cbuf *b = new cbuf(len+1); if(b != NULL){ b->write((const char *)data, len); if(_rx_buffer == NULL) _rx_buffer = b; else { cbuf *p = _rx_buffer; while(p->next != NULL) p = p->next; p->next = b; } } } void SyncClient::_onDisconnect(){ if(_client != NULL){ _client = NULL; } if(_tx_buffer != NULL){ cbuf *b = _tx_buffer; _tx_buffer = NULL; delete b; } } void SyncClient::_onConnect(AsyncClient *c){ _client = c; if(_tx_buffer != NULL){ cbuf *b = _tx_buffer; _tx_buffer = NULL; delete b; } _tx_buffer = new cbuf(_tx_buffer_size); _attachCallbacks_AfterConnected(); } void SyncClient::_attachCallbacks(){ _attachCallbacks_Disconnect(); _attachCallbacks_AfterConnected(); }