| 70 | } |
| 71 | |
| 72 | bool VerificationPacket::Load(DiskFile *diskfile, u64 offset, PACKET_HEADER &header) |
| 73 | { |
| 74 | // Is the packet large enough |
| 75 | if (header.length <= sizeof(FILEVERIFICATIONPACKET)) |
| 76 | { |
| 77 | return false; |
| 78 | } |
| 79 | |
| 80 | // Does the packet have a whole number of verification records |
| 81 | if (0 < ((header.length - sizeof(FILEVERIFICATIONPACKET)) % sizeof(FILEVERIFICATIONENTRY))) |
| 82 | { |
| 83 | return false; |
| 84 | } |
| 85 | |
| 86 | // Is the packet too large |
| 87 | if (header.length > sizeof(FILEVERIFICATIONPACKET) + 32768 * sizeof(FILEVERIFICATIONENTRY)) |
| 88 | { |
| 89 | return false; |
| 90 | } |
| 91 | |
| 92 | // Allocate the packet |
| 93 | FILEVERIFICATIONPACKET *packet = (FILEVERIFICATIONPACKET*)AllocatePacket((size_t)header.length); |
| 94 | packet->header = header; |
| 95 | |
| 96 | // How many blocks are there |
| 97 | blockcount = (u32)((((FILEVERIFICATIONPACKET*)packetdata)->header.length - sizeof(FILEVERIFICATIONPACKET)) / sizeof(FILEVERIFICATIONENTRY)); |
| 98 | |
| 99 | // Read the rest of the packet |
| 100 | return diskfile->Read(offset + sizeof(PACKET_HEADER), |
| 101 | &packet->fileid, |
| 102 | (size_t)packet->header.length - sizeof(PACKET_HEADER)); |
| 103 | } |