21#include <wx/ustring.h>
92XO(
"This recovery file was saved by Audacity 2.3.0 or before.\n"
93 "You need to run that version of Audacity to recover the project." );
122 const std::uint32_t x = 1u;
123 return static_cast<const unsigned char*
>(
static_cast<const void*
>(&x))[0];
136template <
typename Number>
145 auto begin =
static_cast<unsigned char*
>(
static_cast<void*
>(&value));
154 in.ReadValue(result);
162 in.ReadValue(result);
163 auto begin =
static_cast<unsigned char*
>(
static_cast<void*
>(&result));
170 IsLittleEndian() ? &WriteLittleEndian<UShort> : &WriteBigEndian<UShort>;
172 IsLittleEndian() ? &WriteLittleEndian<Int> : &WriteBigEndian<Int>;
174 IsLittleEndian() ? &WriteLittleEndian<Long> : &WriteBigEndian<Long>;
176 IsLittleEndian() ? &WriteLittleEndian<ULong> : &WriteBigEndian<ULong>;
178 IsLittleEndian() ? &WriteLittleEndian<LongLong> : &WriteBigEndian<LongLong>;
181 IsLittleEndian() ? &ReadLittleEndian<UShort> : &ReadBigEndian<UShort>;
185 IsLittleEndian() ? &ReadLittleEndian<Long> : &ReadBigEndian<Long>;
187 IsLittleEndian() ? &ReadLittleEndian<ULong> : &ReadBigEndian<ULong>;
189 IsLittleEndian() ? &ReadLittleEndian<LongLong> : &ReadBigEndian<LongLong>;
215 mCurrentTagName =
name;
227 mHandlers.pop_back();
237 mAttributes.emplace_back(
name, CacheString(std::move(value)));
256 handler->HandleXMLContent(CacheString(std::move(value)));
272 EndTag(mCurrentTagName);
275 return mBaseHandler !=
nullptr;
281 if (mHandlers.empty())
283 mHandlers.push_back(mBaseHandler);
288 mHandlers.push_back(
handler->HandleXMLChild(mCurrentTagName));
290 mHandlers.push_back(NULL);
295 if (!
handler->HandleXMLTag(mCurrentTagName, mAttributes))
299 if (mHandlers.size() == 1)
300 mBaseHandler =
nullptr;
304 mStringsCache.clear();
311 mStringsCache.emplace_back(std::move(
string));
312 return mStringsCache.back();
324 bool mInTag {
false };
333template<
typename BaseCharType>
336 constexpr int charSize =
sizeof(BaseCharType);
338 assert(bytesCount % charSize == 0);
340 const auto begin =
static_cast<const BaseCharType*
>(bytes);
341 const auto end =
begin + bytesCount / charSize;
343 const bool isAscii = std::all_of(
346 {
return static_cast<std::make_unsigned_t<BaseCharType>
>(c) < 0x7f; });
351 return std::wstring_convert<std::codecvt_utf8<BaseCharType>, BaseCharType>()
358 static std::once_flag
flag;
359 std::call_once(
flag, []{
364 char size =
sizeof(wxStringCharType);
398 const Length len = value.length() *
sizeof(wxStringCharType);
465 Length len = value.length() *
sizeof(wxStringCharType);
473 Length len = value.length() *
sizeof(wxStringCharType);
480 wxASSERT(
name.length() *
sizeof(wxStringCharType) <= SHRT_MAX);
484 if (nameiter !=
mNames.end())
486 id = nameiter->second;
492 UShort len =
name.length() *
sizeof(wxStringCharType);
534 XMLTagHandlerAdapter adapter(
handler);
536 std::vector<char> bytes;
538 std::vector<IdMap> mIdStack;
546 auto iter = mIds.find(
id );
547 if (iter == mIds.end())
555 int64_t stringsCount = 0;
556 int64_t stringsLength = 0;
558 auto ReadString = [&mCharSize, &in, &bytes, &stringsCount, &stringsLength](
int len) -> std::string
560 bytes.reserve( len );
561 auto data = bytes.data();
562 in.
Read( data, len );
565 stringsLength += len;
570 return std::string(bytes.data(), len);
573 return FastStringConvert<char16_t>(bytes.data(), len);
576 return FastStringConvert<char32_t>(bytes.data(), len);
579 wxASSERT_MSG(
false,
wxT(
"Characters size not 1, 2, or 4"));
596 mIdStack.push_back(mIds);
603 mIds = mIdStack.back();
612 mIds[
id] = ReadString(len);
620 adapter.EmitStartTag(
Lookup(
id));
628 adapter.EndTag(
Lookup(
id));
637 adapter.WriteAttr(
Lookup(
id), ReadString(len));
646 in.
Read(&val,
sizeof(val));
649 adapter.WriteAttr(
Lookup(
id), val);
658 in.
Read(&val,
sizeof(val));
661 adapter.WriteAttr(
Lookup(
id), val);
670 adapter.WriteAttr(
Lookup(
id), val);
681 adapter.WriteAttr(
Lookup(
id), val);
690 adapter.WriteAttr(
Lookup(
id), val);
698 adapter.WriteAttr(
Lookup(
id), val);
707 adapter.WriteAttr(
Lookup(
id), val);
714 adapter.WriteData(ReadString(len));
721 adapter.WriteRaw(ReadString(len));
727 in.
Read(&mCharSize, 1);
737 catch(
const Error& )
745 "Loaded %lld string %f Kb in size", stringsCount, stringsLength / 1024.0);
747 return adapter.Finalize();
const TranslatableString name
std::unordered_map< unsigned short, std::string > IdMap
std::unordered_map< wxString, unsigned short > NameMap
std::vector< Attribute > AttributesList
A facade-like class, that implements buffered reading from the underlying data stream.
size_t Read(void *buffer, size_t maxBytes)
Read up to maxBytes into the buffer. Returns the number of bytes read.
A low overhead memory stream with O(1) append, low heap fragmentation and a linear memory view.
const size_t GetSize() const noexcept
void AppendData(const void *data, const size_t length)
void AppendByte(char data)
void StartTag(const wxString &name) override
void EndTag(const wxString &name) override
static bool Decode(BufferedStreamReader &in, XMLTagHandler *handler)
static MemoryStream mDict
static TranslatableString FailureMessage(const FilePath &filePath)
const MemoryStream & GetData() const
void WriteName(const wxString &name)
virtual ~ProjectSerializer()
void WriteAttr(const wxString &name, const wxString &value) override
const MemoryStream & GetDict() const
void WriteData(const wxString &value) override
void Write(const wxString &data) override
ProjectSerializer(size_t allocSize=1024 *1024)
Holds a msgid for the translation catalog; may also bind format arguments.
A view into an attribute value. The class does not take the ownership of the data.
This class is an interface which should be implemented by classes which wish to be able to load and s...
std::deque< std::string > mStringsCache
void WriteAttr(const std::string_view &name, std::string value)
std::string_view CacheString(std::string string)
void EndTag(const std::string_view &name)
XMLTagHandler * mBaseHandler
XMLTagHandlerAdapter(XMLTagHandler *handler) noexcept
void WriteRaw(std::string)
void EmitStartTag(const std::string_view &name)
std::vector< XMLTagHandler * > mHandlers
AttributesList mAttributes
std::string_view mCurrentTagName
void WriteAttr(const std::string_view &name, T value)
void WriteData(std::string value)
auto end(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
auto begin(const Ptr< Type, BaseDeleter > &p)
Enables range-for.
static const auto WriteLongLong
static const auto ReadDigits
static const auto ReadUShort
static const auto ReadLong
static const auto WriteDigits
Number ReadLittleEndian(BufferedStreamReader &in)
static const auto WriteUShort
static const auto WriteInt
static const auto WriteLength
std::string FastStringConvert(const void *bytes, int bytesCount)
static const auto ReadLongLong
static const auto WriteLong
static const auto ReadULong
static const auto ReadInt
static const auto ReadLength
void WriteLittleEndian(MemoryStream &out, Number value)
static const auto WriteULong
Number ReadBigEndian(BufferedStreamReader &in)
void WriteBigEndian(MemoryStream &out, Number value)
AuthorizationHandler handler