| 172 | |
| 173 | |
| 174 | int |
| 175 | SDL_WriteToDataQueue(SDL_DataQueue *queue, const void *_data, const size_t _len) |
| 176 | { |
| 177 | size_t len = _len; |
| 178 | const Uint8 *data = (const Uint8 *) _data; |
| 179 | const size_t packet_size = queue ? queue->packet_size : 0; |
| 180 | SDL_DataQueuePacket *orighead; |
| 181 | SDL_DataQueuePacket *origtail; |
| 182 | size_t origlen; |
| 183 | size_t datalen; |
| 184 | |
| 185 | if (!queue) { |
| 186 | return SDL_InvalidParamError("queue"); |
| 187 | } |
| 188 | |
| 189 | orighead = queue->head; |
| 190 | origtail = queue->tail; |
| 191 | origlen = origtail ? origtail->datalen : 0; |
| 192 | |
| 193 | while (len > 0) { |
| 194 | SDL_DataQueuePacket *packet = queue->tail; |
| 195 | SDL_assert(!packet || (packet->datalen <= packet_size)); |
| 196 | if (!packet || (packet->datalen >= packet_size)) { |
| 197 | /* tail packet missing or completely full; we need a new packet. */ |
| 198 | packet = AllocateDataQueuePacket(queue); |
| 199 | if (!packet) { |
| 200 | /* uhoh, reset so we've queued nothing new, free what we can. */ |
| 201 | if (!origtail) { |
| 202 | packet = queue->head; /* whole queue. */ |
| 203 | } else { |
| 204 | packet = origtail->next; /* what we added to existing queue. */ |
| 205 | origtail->next = NULL; |
| 206 | origtail->datalen = origlen; |
| 207 | } |
| 208 | queue->head = orighead; |
| 209 | queue->tail = origtail; |
| 210 | queue->pool = NULL; |
| 211 | |
| 212 | SDL_FreeDataQueueList(packet); /* give back what we can. */ |
| 213 | return SDL_OutOfMemory(); |
| 214 | } |
| 215 | } |
| 216 | |
| 217 | datalen = SDL_min(len, packet_size - packet->datalen); |
| 218 | SDL_memcpy(packet->data + packet->datalen, data, datalen); |
| 219 | data += datalen; |
| 220 | len -= datalen; |
| 221 | packet->datalen += datalen; |
| 222 | queue->queued_bytes += datalen; |
| 223 | } |
| 224 | |
| 225 | return 0; |
| 226 | } |
| 227 | |
| 228 | size_t |
| 229 | SDL_PeekIntoDataQueue(SDL_DataQueue *queue, void *_buf, const size_t _len) |
no test coverage detected