1221 | | // TODO: Copying the whole buffer becomes less and less efficient with |
1222 | | // greater size - offset differences. What we actually want is a method |
1223 | | // to copy data from one buffer to another. Then the following should be: |
1224 | | // create buffer, resize, copy data. An additional append_data_from_buffer() |
1225 | | // method would be even better. |
1226 | | net_buffer *buffer = duplicate_buffer(from); |
| 1222 | net_buffer *buffer = create_buffer(DATA_NODE_SIZE); |
| 1649 | static status_t |
| 1650 | append_data_from_buffer(net_buffer *from, net_buffer *to, size_t size) |
| 1651 | { |
| 1652 | net_buffer_private *source = (net_buffer_private *)from; |
| 1653 | net_buffer_private *dest = (net_buffer_private *)to; |
| 1654 | |
| 1655 | if (size > from->size) |
| 1656 | return B_BAD_VALUE; |
| 1657 | if (size == 0) |
| 1658 | return B_OK; |
| 1659 | |
| 1660 | data_node *nodeTo = get_node_at_offset(source, size); |
| 1661 | if (nodeTo == NULL) { |
| 1662 | return B_BAD_VALUE; |
| 1663 | } |
| 1664 | |
| 1665 | data_node *node = (data_node *)list_get_first_item(&source->buffers); |
| 1666 | if (node == NULL) { |
| 1667 | CHECK_BUFFER(source); |
| 1668 | return B_ERROR; |
| 1669 | } |
| 1670 | |
| 1671 | while (node != nodeTo) { |
| 1672 | if (append_data(dest, node->start, node->used) < B_OK) { |
| 1673 | CHECK_BUFFER(dest); |
| 1674 | return B_ERROR; |
| 1675 | } |
| 1676 | |
| 1677 | node = (data_node *)list_get_next_item(&source->buffers, node); |
| 1678 | } |
| 1679 | |
| 1680 | int32 diff = node->offset + node->used - size; |
| 1681 | if (append_data(dest, node->start, node->used - diff) < B_OK) { |
| 1682 | CHECK_BUFFER(dest); |
| 1683 | return B_ERROR; |
| 1684 | } |
| 1685 | |
| 1686 | CHECK_BUFFER(dest); |
| 1687 | |
| 1688 | return B_OK; |
| 1689 | } |
| 1690 | |
| 1691 | |