static ssize_t data_feed_recv_callback(spdylay_session *session, uint8_t* data, size_t len, int flags, void *user_data) { data_feed *df = ((my_user_data*)user_data)->df; size_t avail = df->datalimit - df->datamark; size_t wlen = spdylay_min(avail, len); memcpy(data, df->datamark, wlen); df->datamark += wlen; return wlen; }
void spdylay_buffer_reader_advance(spdylay_buffer_reader *reader, size_t amount) { while(amount) { size_t remlen, skiplen; remlen = reader->buffer->capacity - reader->offset; skiplen = spdylay_min(remlen, amount); amount -= skiplen; reader->offset += skiplen; if(reader->buffer->capacity == reader->offset) { reader->current = reader->current->next; reader->offset = 0; } } }
int spdylay_submit_window_update(spdylay_session *session, int32_t stream_id, int32_t delta_window_size) { spdylay_stream *stream; if(delta_window_size <= 0) { return SPDYLAY_ERR_INVALID_ARGUMENT; } stream = spdylay_session_get_stream(session, stream_id); if(stream) { stream->recv_window_size -= spdylay_min(delta_window_size, stream->recv_window_size); return spdylay_session_add_window_update(session, stream_id, delta_window_size); } else { return SPDYLAY_ERR_STREAM_CLOSED; } }
void spdylay_buffer_reader_data(spdylay_buffer_reader *reader, uint8_t *out, size_t len) { while(len) { size_t remlen, readlen; remlen = reader->buffer->capacity - reader->offset; readlen = spdylay_min(remlen, len); memcpy(out, reader->current->data + reader->offset, readlen); out += readlen; len -= readlen; reader->offset += readlen; if(reader->buffer->capacity == reader->offset) { reader->current = reader->current->next; reader->offset = 0; } } }
int spdylay_buffer_write(spdylay_buffer *buffer, const uint8_t *data, size_t len) { int rv; while(len) { size_t writelen; if(spdylay_buffer_avail(buffer) == 0) { if((rv = spdylay_buffer_alloc(buffer)) != 0) { return rv; } } writelen = spdylay_min(spdylay_buffer_avail(buffer), len); memcpy(spdylay_buffer_get(buffer), data, writelen); data += writelen; len -= writelen; spdylay_buffer_advance(buffer, writelen); } return 0; }
int spdylay_buffer_reader_count(spdylay_buffer_reader *reader, size_t len, uint8_t c) { int res = 0; while(len) { size_t remlen, readlen, i; uint8_t *p; remlen = reader->buffer->capacity - reader->offset; readlen = spdylay_min(remlen, len); p = reader->current->data + reader->offset; for(i = 0; i < readlen; ++i) { if(p[i] == c) { ++res; } } len -= readlen; reader->offset += readlen; if(reader->buffer->capacity == reader->offset) { reader->current = reader->current->next; reader->offset = 0; } } return res; }