| 1524 | // ============================================================================ |
| 1525 | |
| 1526 | ResourceAdvertisement::ResourceAdvertisement(const Resource& resource, const Bytes& request_id /*= {Bytes::NONE}*/, bool is_response /*= false*/) { |
| 1527 | if (!resource) return; |
| 1528 | |
| 1529 | _link = resource._object->_link; |
| 1530 | _t = resource._object->_size; |
| 1531 | _d = resource._object->_total_size; |
| 1532 | _n = static_cast<uint32_t>(resource._object->_parts.size()); |
| 1533 | _h = resource._object->_hash; |
| 1534 | _r = resource._object->_random_hash; |
| 1535 | _o = resource._object->_original_hash; |
| 1536 | _m = resource._object->_hashmap; |
| 1537 | _c = resource._object->_compressed; |
| 1538 | _e = resource._object->_encrypted; |
| 1539 | _s = resource._object->_split; |
| 1540 | _x = resource._object->_has_metadata; |
| 1541 | _i = resource._object->_segment_index; |
| 1542 | _l = resource._object->_total_segments; |
| 1543 | _q = resource._object->_request_id; |
| 1544 | _u = false; |
| 1545 | _p = false; |
| 1546 | |
| 1547 | if (_q.size() > 0) { |
| 1548 | if (!resource._object->_is_response) { |
| 1549 | _u = true; |
| 1550 | _p = false; |
| 1551 | } else { |
| 1552 | _u = false; |
| 1553 | _p = true; |
| 1554 | } |
| 1555 | } |
| 1556 | |
| 1557 | // Packed flag byte (mirror Python Resource.py:1307) |
| 1558 | _f = static_cast<uint8_t>( |
| 1559 | (_x ? 1u : 0u) << 5 |
| 1560 | | (_p ? 1u : 0u) << 4 |
| 1561 | | (_u ? 1u : 0u) << 3 |
| 1562 | | (_s ? 1u : 0u) << 2 |
| 1563 | | (_c ? 1u : 0u) << 1 |
| 1564 | | (_e ? 1u : 0u)); |
| 1565 | } |
| 1566 | |
| 1567 | bool ResourceAdvertisement::is_request(const Packet& advertisement_packet) { |
| 1568 | ResourceAdvertisement adv = ResourceAdvertisement::unpack(advertisement_packet.plaintext()); |