| 1185 | } |
| 1186 | |
| 1187 | uint64_t Cn4Block::WriteSignalData(std::streambuf& buffer, bool compress) { |
| 1188 | uint64_t bytes = 0; |
| 1189 | |
| 1190 | if (Type() == ChannelType::MaxLength || |
| 1191 | (Type() == ChannelType::VariableLength && VlsdRecordId() > 0) ) { |
| 1192 | // Signal data is updated elsewhere |
| 1193 | return 0; |
| 1194 | } |
| 1195 | |
| 1196 | if (data_list_.empty()) { |
| 1197 | UpdateLink(buffer, kIndexData, 0); // No data link |
| 1198 | } else if (!compress || data_list_.size() <= 100 ){ |
| 1199 | // Store as SD block |
| 1200 | auto sd4 = std::make_unique<Sd4Block>(); |
| 1201 | sd4->Data(data_list_); |
| 1202 | bytes = sd4->Write(buffer); |
| 1203 | UpdateLink(buffer, kIndexData,sd4->FilePosition()); |
| 1204 | } else if (data_list_.size() <= kMaxDataSize) { // Compress data |
| 1205 | // Store DZ (SD) block |
| 1206 | auto dz4 = std::make_unique<Dz4Block>(); |
| 1207 | dz4->OrigBlockType("SD"); |
| 1208 | dz4->Type(Dz4ZipType::Deflate); |
| 1209 | dz4->Data(data_list_); // Compress and set up the sizes |
| 1210 | bytes = dz4->Write(buffer); |
| 1211 | UpdateLink(buffer, kIndexData,dz4->FilePosition()); |
| 1212 | } else { |
| 1213 | // Store HL + DL + DZ blocks |
| 1214 | auto hl4 = std::make_unique<Hl4Block>(); |
| 1215 | hl4->Flags(Hl4Flags::EqualLength); |
| 1216 | hl4->Type(Hl4ZipType::Deflate); |
| 1217 | |
| 1218 | auto dl4 = std::make_unique<Dl4Block>(); |
| 1219 | std::vector<uint8_t> data; |
| 1220 | data.reserve(kMaxDataSize); |
| 1221 | dl4->Flags(Dl4Flags::EqualLength); |
| 1222 | dl4->EqualLength(kMaxDataSize); |
| 1223 | |
| 1224 | for (const auto in_byte : data_list_) { |
| 1225 | data.push_back(in_byte); |
| 1226 | if (data.size() + 1 > kMaxDataSize) { |
| 1227 | auto dz4 = std::make_unique<Dz4Block>(); |
| 1228 | dz4->OrigBlockType("SD"); |
| 1229 | dz4->Type(Dz4ZipType::Deflate); |
| 1230 | dz4->Data(data); // Compress and set up the sizes |
| 1231 | |
| 1232 | auto& block_list = dl4->DataBlockList(); |
| 1233 | block_list.push_back(std::move(dz4)); |
| 1234 | |
| 1235 | data.clear(); |
| 1236 | data.shrink_to_fit(); |
| 1237 | data.reserve(kMaxDataSize); |
| 1238 | } |
| 1239 | } |
| 1240 | if (!data.empty()) { |
| 1241 | auto dz4 = std::make_unique<Dz4Block>(); |
| 1242 | dz4->OrigBlockType("SD"); |
| 1243 | dz4->Type(Dz4ZipType::Deflate); |
| 1244 | dz4->Data(data); // Compress and set up the sizes |
nothing calls this directly
no test coverage detected