| 146 | |
| 147 | template <typename Reader, typename Pack> |
| 148 | bool ReadTrackFromArchive(char const * data, size_t dataSize, Track & trackData) noexcept |
| 149 | { |
| 150 | try |
| 151 | { |
| 152 | coding::ZLib::Inflate inflate(coding::ZLib::Inflate::Format::ZLib); |
| 153 | vector<uint8_t> buffer; |
| 154 | inflate(data, dataSize, back_inserter(buffer)); |
| 155 | |
| 156 | ReaderSource<MemReaderWithExceptions> reader(MemReaderWithExceptions(buffer.data(), buffer.size())); |
| 157 | if (reader.Size() == 0) |
| 158 | return false; |
| 159 | |
| 160 | // Read first point. |
| 161 | Pack point = tracking::TraitsPacket<Pack>::Read(reader, false /* isDelta */); |
| 162 | trackData.emplace_back(point.m_timestamp, ms::LatLon(point.m_lat, point.m_lon), |
| 163 | static_cast<uint8_t>(tracking::TraitsPacket<Pack>::GetSpeedGroup(point))); |
| 164 | |
| 165 | // Read with delta. |
| 166 | while (reader.Size() > 0) |
| 167 | { |
| 168 | Pack const delta = tracking::TraitsPacket<Pack>::Read(reader, true /* isDelta */); |
| 169 | point = tracking::TraitsPacket<Pack>::Combine(point, delta); |
| 170 | |
| 171 | trackData.emplace_back(point.m_timestamp, ms::LatLon(point.m_lat, point.m_lon), |
| 172 | static_cast<uint8_t>(tracking::TraitsPacket<Pack>::GetSpeedGroup(point))); |
| 173 | } |
| 174 | return true; |
| 175 | } |
| 176 | catch (exception const & e) |
| 177 | { |
| 178 | LOG(LWARNING, ("Error reading track file:", e.what())); |
| 179 | } |
| 180 | return false; |
| 181 | } |
| 182 | |
| 183 | bool ParseTrackFile(unzip::File & zipReader, Track & trackData) noexcept |
| 184 | { |