22#include <wx/ustring.h>
93XO(
"This recovery file was saved by Audacity 2.3.0 or before.\n"
94 "You need to run that version of Audacity to recover the project." );
123 const std::uint32_t x = 1u;
124 return static_cast<const unsigned char*
>(
static_cast<const void*
>(&x))[0];
137template <
typename Number>
146 auto begin =
static_cast<unsigned char*
>(
static_cast<void*
>(&value));
155 in.ReadValue(result);
163 in.ReadValue(result);
164 auto begin =
static_cast<unsigned char*
>(
static_cast<void*
>(&result));
171 IsLittleEndian() ? &WriteLittleEndian<UShort> : &WriteBigEndian<UShort>;
173 IsLittleEndian() ? &WriteLittleEndian<Int> : &WriteBigEndian<Int>;
175 IsLittleEndian() ? &WriteLittleEndian<Long> : &WriteBigEndian<Long>;
177 IsLittleEndian() ? &WriteLittleEndian<ULong> : &WriteBigEndian<ULong>;
179 IsLittleEndian() ? &WriteLittleEndian<LongLong> : &WriteBigEndian<LongLong>;
182 IsLittleEndian() ? &ReadLittleEndian<UShort> : &ReadBigEndian<UShort>;
186 IsLittleEndian() ? &ReadLittleEndian<Long> : &ReadBigEndian<Long>;
188 IsLittleEndian() ? &ReadLittleEndian<ULong> : &ReadBigEndian<ULong>;
190 IsLittleEndian() ? &ReadLittleEndian<LongLong> : &ReadBigEndian<LongLong>;
216 mCurrentTagName =
name;
228 mHandlers.pop_back();
238 mAttributes.emplace_back(
name, CacheString(std::move(value)));
257 handler->HandleXMLContent(CacheString(std::move(value)));
273 EndTag(mCurrentTagName);
276 return mBaseHandler !=
nullptr;
282 if (mHandlers.empty())
284 mHandlers.push_back(mBaseHandler);
289 mHandlers.push_back(
handler->HandleXMLChild(mCurrentTagName));
291 mHandlers.push_back(NULL);
296 if (!
handler->HandleXMLTag(mCurrentTagName, mAttributes))
300 if (mHandlers.size() == 1)
301 mBaseHandler =
nullptr;
305 mStringsCache.clear();
312 mStringsCache.emplace_back(std::move(
string));
313 return mStringsCache.back();
325 bool mInTag {
false };
334template<
typename BaseCharType>
337 constexpr int charSize =
sizeof(BaseCharType);
339 assert(bytesCount % charSize == 0);
341 const auto begin =
static_cast<const BaseCharType*
>(bytes);
342 const auto end =
begin + bytesCount / charSize;
344 const bool isAscii = std::all_of(
347 {
return static_cast<std::make_unsigned_t<BaseCharType>
>(c) < 0x7f; });
352 return std::wstring_convert<std::codecvt_utf8<BaseCharType>, BaseCharType>()
359 static std::once_flag
flag;
360 std::call_once(
flag, []{
365 char size =
sizeof(wxStringCharType);
399 const Length len = value.length() *
sizeof(wxStringCharType);
466 Length len = value.length() *
sizeof(wxStringCharType);
474 Length len = value.length() *
sizeof(wxStringCharType);
481 wxASSERT(
name.length() *
sizeof(wxStringCharType) <= SHRT_MAX);
485 if (nameiter !=
mNames.end())
487 id = nameiter->second;
493 UShort len =
name.length() *
sizeof(wxStringCharType);
535 XMLTagHandlerAdapter adapter(
handler);
537 std::vector<char> bytes;
539 std::vector<IdMap> mIdStack;
545 auto Lookup = [&mIds](
UShort id ) -> std::string_view
547 auto iter = mIds.find(
id );
548 if (iter == mIds.end())
556 int64_t stringsCount = 0;
557 int64_t stringsLength = 0;
559 auto ReadString = [&mCharSize, &in, &bytes, &stringsCount, &stringsLength](
int len) -> std::string
561 bytes.reserve( len );
562 auto data = bytes.data();
563 in.
Read( data, len );
566 stringsLength += len;
571 return std::string(bytes.data(), len);
574 return FastStringConvert<char16_t>(bytes.data(), len);
577 return FastStringConvert<char32_t>(bytes.data(), len);
580 wxASSERT_MSG(
false,
wxT(
"Characters size not 1, 2, or 4"));
597 mIdStack.push_back(mIds);
604 mIds = mIdStack.back();
613 mIds[
id] = ReadString(len);
621 adapter.EmitStartTag(Lookup(
id));
629 adapter.EndTag(Lookup(
id));
638 adapter.WriteAttr(Lookup(
id), ReadString(len));
647 in.
Read(&val,
sizeof(val));
650 adapter.WriteAttr(Lookup(
id), val);
659 in.
Read(&val,
sizeof(val));
662 adapter.WriteAttr(Lookup(
id), val);
671 adapter.WriteAttr(Lookup(
id), val);
682 adapter.WriteAttr(Lookup(
id), val);
691 adapter.WriteAttr(Lookup(
id), val);
699 adapter.WriteAttr(Lookup(
id), val);
708 adapter.WriteAttr(Lookup(
id), val);
715 adapter.WriteData(ReadString(len));
722 adapter.WriteRaw(ReadString(len));
728 in.
Read(&mCharSize, 1);
738 catch(
const Error& )
746 "Loaded %lld string %f Kb in size", stringsCount, stringsLength / 1024.0);
748 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