MCPcopy Create free account
hub / github.com/Serial-Studio/Serial-Studio / WriteSignalData

Method WriteSignalData

lib/mdflib/mdflib/src/cn4block.cpp:1187–1256  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1185}
1186
1187uint64_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

Callers

nothing calls this directly

Calls 11

TypeEnum · 0.85
emptyMethod · 0.80
OrigBlockTypeMethod · 0.80
EqualLengthMethod · 0.80
sizeMethod · 0.45
DataMethod · 0.45
WriteMethod · 0.45
FilePositionMethod · 0.45
TypeMethod · 0.45
FlagsMethod · 0.45
clearMethod · 0.45

Tested by

no test coverage detected