Audacity  3.0.3
Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
ProjectSerializer Class Referencefinal

a class used to (de)serialize the project catalog More...

#include <ProjectSerializer.h>

Inheritance diagram for ProjectSerializer:
[legend]
Collaboration diagram for ProjectSerializer:
[legend]

Public Member Functions

 ProjectSerializer (size_t allocSize=1024 *1024)
 
virtual ~ProjectSerializer ()
 
void StartTag (const wxString &name) override
 
void EndTag (const wxString &name) override
 
void WriteAttr (const wxString &name, const wxString &value) override
 
void WriteAttr (const wxString &name, const wxChar *value) override
 
void WriteAttr (const wxString &name, int value) override
 
void WriteAttr (const wxString &name, bool value) override
 
void WriteAttr (const wxString &name, long value) override
 
void WriteAttr (const wxString &name, long long value) override
 
void WriteAttr (const wxString &name, size_t value) override
 
void WriteAttr (const wxString &name, float value, int digits=-1) override
 
void WriteAttr (const wxString &name, double value, int digits=-1) override
 
void WriteData (const wxString &value) override
 
void Write (const wxString &data) override
 
void WriteSubTree (const ProjectSerializer &value)
 
const wxMemoryBuffer & GetDict () const
 
const wxMemoryBuffer & GetData () const
 
bool IsEmpty () const
 
bool DictChanged () const
 
- Public Member Functions inherited from XMLWriter
 XMLWriter ()
 
virtual ~XMLWriter ()
 
void WriteAttr (const wxString &name, const Identifier &value)
 
virtual void WriteSubTree (const wxString &value)
 
wxString XMLEsc (const wxString &s)
 

Static Public Member Functions

static TranslatableString FailureMessage (const FilePath &filePath)
 
static wxString Decode (const wxMemoryBuffer &buffer)
 

Private Member Functions

void WriteName (const wxString &name)
 

Private Attributes

wxMemoryBuffer mBuffer
 
bool mDictChanged
 

Static Private Attributes

static NameMap mNames
 
static wxMemoryBuffer mDict
 

Additional Inherited Members

- Protected Attributes inherited from XMLWriter
bool mInTag
 
int mDepth
 
wxArrayString mTagstack
 
std::vector< int > mHasKids
 

Detailed Description

a class used to (de)serialize the project catalog

Definition at line 33 of file ProjectSerializer.h.

Constructor & Destructor Documentation

◆ ProjectSerializer()

ProjectSerializer::ProjectSerializer ( size_t  allocSize = 1024 * 1024)

Definition at line 200 of file ProjectSerializer.cpp.

201 {
202  mDict.SetBufSize(allocSize);
203  mBuffer.SetBufSize(allocSize);
204 
205  static std::once_flag flag;
206  std::call_once(flag, []{
207  // Just once per run, store header information in the unique static
208  // dictionary that will be written into each project that is saved.
209  // Store the size of "wxStringCharType" so we can convert during recovery
210  // in case the file is used on a system with a different character size.
211  char size = sizeof(wxStringCharType);
212  mDict.AppendByte(FT_CharSize);
213  mDict.AppendData(&size, 1);
214  });
215 
216  mDictChanged = false;
217 }

References flag, FT_CharSize, mBuffer, mDict, mDictChanged, and size.

◆ ~ProjectSerializer()

ProjectSerializer::~ProjectSerializer ( )
virtual

Definition at line 219 of file ProjectSerializer.cpp.

220 {
221 }

Member Function Documentation

◆ Decode()

wxString ProjectSerializer::Decode ( const wxMemoryBuffer &  buffer)
static

Definition at line 386 of file ProjectSerializer.cpp.

387 {
388  wxMemoryInputStream in(buffer.GetData(), buffer.GetDataLen());
389 
390  XMLStringWriter out;
391 
392  std::vector<char> bytes;
393  IdMap mIds;
394  std::vector<IdMap> mIdStack;
395  char mCharSize = 0;
396 
397  mIds.clear();
398 
399  struct Error{}; // exception type for short-range try/catch
400  auto Lookup = [&mIds]( UShort id ) -> const wxString &
401  {
402  auto iter = mIds.find( id );
403  if (iter == mIds.end())
404  {
405  throw Error{};
406  }
407  return iter->second;
408  };
409 
410  auto ReadString = [&mCharSize, &in, &bytes](int len) -> wxString
411  {
412  bytes.reserve( len + 4 );
413  auto data = bytes.data();
414  in.Read( data, len );
415  // Make a null terminator of the widest type
416  memset( data + len, '\0', 4 );
417  wxUString str;
418 
419  switch (mCharSize)
420  {
421  case 1:
422  str.assignFromUTF8(data, len);
423  break;
424 
425  case 2:
426  str.assignFromUTF16((wxChar16 *) data, len / 2);
427  break;
428 
429  case 4:
430  str = wxU32CharBuffer::CreateNonOwned((wxChar32 *) data, len / 4);
431  break;
432 
433  default:
434  wxASSERT_MSG(false, wxT("Characters size not 1, 2, or 4"));
435  break;
436  }
437 
438  return str;
439  };
440 
441  try
442  {
443  while (!in.Eof())
444  {
445  UShort id;
446 
447  switch (in.GetC())
448  {
449  case FT_Push:
450  {
451  mIdStack.push_back(mIds);
452  mIds.clear();
453  }
454  break;
455 
456  case FT_Pop:
457  {
458  mIds = mIdStack.back();
459  mIdStack.pop_back();
460  }
461  break;
462 
463  case FT_Name:
464  {
465  id = ReadUShort( in );
466  auto len = ReadUShort( in );
467  mIds[id] = ReadString(len);
468  }
469  break;
470 
471  case FT_StartTag:
472  {
473  id = ReadUShort( in );
474 
475  out.StartTag(Lookup(id));
476  }
477  break;
478 
479  case FT_EndTag:
480  {
481  id = ReadUShort( in );
482 
483  out.EndTag(Lookup(id));
484  }
485  break;
486 
487  case FT_String:
488  {
489  id = ReadUShort( in );
490  int len = ReadLength( in );
491  out.WriteAttr(Lookup(id), ReadString(len));
492  }
493  break;
494 
495  case FT_Float:
496  {
497  float val;
498 
499  id = ReadUShort( in );
500  in.Read(&val, sizeof(val));
501  int dig = ReadDigits( in );
502 
503  out.WriteAttr(Lookup(id), val, dig);
504  }
505  break;
506 
507  case FT_Double:
508  {
509  double val;
510 
511  id = ReadUShort( in );
512  in.Read(&val, sizeof(val));
513  int dig = ReadDigits( in );
514 
515  out.WriteAttr(Lookup(id), val, dig);
516  }
517  break;
518 
519  case FT_Int:
520  {
521  id = ReadUShort( in );
522  int val = ReadInt( in );
523 
524  out.WriteAttr(Lookup(id), val);
525  }
526  break;
527 
528  case FT_Bool:
529  {
530  unsigned char val;
531 
532  id = ReadUShort( in );
533  in.Read(&val, 1);
534 
535  out.WriteAttr(Lookup(id), val);
536  }
537  break;
538 
539  case FT_Long:
540  {
541  id = ReadUShort( in );
542  long val = ReadLong( in );
543 
544  out.WriteAttr(Lookup(id), val);
545  }
546  break;
547 
548  case FT_LongLong:
549  {
550  id = ReadUShort( in );
551  long long val = ReadLongLong( in );
552  out.WriteAttr(Lookup(id), val);
553  }
554  break;
555 
556  case FT_SizeT:
557  {
558  id = ReadUShort( in );
559  size_t val = ReadULong( in );
560 
561  out.WriteAttr(Lookup(id), val);
562  }
563  break;
564 
565  case FT_Data:
566  {
567  int len = ReadLength( in );
568  out.WriteData(ReadString(len));
569  }
570  break;
571 
572  case FT_Raw:
573  {
574  int len = ReadLength( in );
575  out.Write(ReadString(len));
576  }
577  break;
578 
579  case FT_CharSize:
580  {
581  in.Read(&mCharSize, 1);
582  }
583  break;
584 
585  default:
586  wxASSERT(true);
587  break;
588  }
589  }
590  }
591  catch( const Error& )
592  {
593  // Document was corrupt, or platform differences in size or endianness
594  // were not well canonicalized
595  return {};
596  }
597 
598  return out;
599 }

References XMLWriter::EndTag(), FT_Bool, FT_CharSize, FT_Data, FT_Double, FT_EndTag, FT_Float, FT_Int, FT_Long, FT_LongLong, FT_Name, FT_Pop, FT_Push, FT_Raw, FT_SizeT, FT_StartTag, FT_String, id, anonymous_namespace{ProjectSerializer.cpp}::ReadDigits, anonymous_namespace{ProjectSerializer.cpp}::ReadInt, anonymous_namespace{ProjectSerializer.cpp}::ReadLength, anonymous_namespace{ProjectSerializer.cpp}::ReadLong, anonymous_namespace{ProjectSerializer.cpp}::ReadLongLong, anonymous_namespace{ProjectSerializer.cpp}::ReadULong, anonymous_namespace{ProjectSerializer.cpp}::ReadUShort, XMLWriter::StartTag(), XMLStringWriter::Write(), XMLWriter::WriteAttr(), and XMLWriter::WriteData().

Referenced by ProjectFileIO::LoadProject().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DictChanged()

bool ProjectSerializer::DictChanged ( ) const

Definition at line 380 of file ProjectSerializer.cpp.

381 {
382  return mDictChanged;
383 }

References mDictChanged.

◆ EndTag()

void ProjectSerializer::EndTag ( const wxString &  name)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 229 of file ProjectSerializer.cpp.

230 {
231  mBuffer.AppendByte(FT_EndTag);
232  WriteName(name);
233 }

References FT_EndTag, mBuffer, name, and WriteName().

Here is the call graph for this function:

◆ FailureMessage()

TranslatableString ProjectSerializer::FailureMessage ( const FilePath filePath)
static

Definition at line 83 of file ProjectSerializer.cpp.

84 {
85  return
86 XO("This recovery file was saved by Audacity 2.3.0 or before.\n"
87  "You need to run that version of Audacity to recover the project." );
88 }

References XO.

◆ GetData()

const wxMemoryBuffer & ProjectSerializer::GetData ( ) const

Definition at line 370 of file ProjectSerializer.cpp.

371 {
372  return mBuffer;
373 }

References mBuffer.

Referenced by ProjectFileIO::WriteDoc().

Here is the caller graph for this function:

◆ GetDict()

const wxMemoryBuffer & ProjectSerializer::GetDict ( ) const

Definition at line 365 of file ProjectSerializer.cpp.

366 {
367  return mDict;
368 }

References mDict.

Referenced by ProjectFileIO::WriteDoc().

Here is the caller graph for this function:

◆ IsEmpty()

bool ProjectSerializer::IsEmpty ( ) const

Definition at line 375 of file ProjectSerializer.cpp.

376 {
377  return mBuffer.GetDataLen() == 0;
378 }

References mBuffer.

◆ StartTag()

void ProjectSerializer::StartTag ( const wxString &  name)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 223 of file ProjectSerializer.cpp.

224 {
225  mBuffer.AppendByte(FT_StartTag);
226  WriteName(name);
227 }

References FT_StartTag, mBuffer, name, and WriteName().

Here is the call graph for this function:

◆ Write()

void ProjectSerializer::Write ( const wxString &  data)
overridevirtual

Implements XMLWriter.

Definition at line 317 of file ProjectSerializer.cpp.

318 {
319  mBuffer.AppendByte(FT_Raw);
320  Length len = value.length() * sizeof(wxStringCharType);
321  WriteLength( mBuffer, len );
322  mBuffer.AppendData(value.wx_str(), len);
323 }

References FT_Raw, mBuffer, and anonymous_namespace{ProjectSerializer.cpp}::WriteLength.

◆ WriteAttr() [1/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
bool  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 258 of file ProjectSerializer.cpp.

259 {
260  mBuffer.AppendByte(FT_Bool);
261  WriteName(name);
262 
263  mBuffer.AppendByte(value);
264 }

References FT_Bool, mBuffer, name, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [2/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
const wxChar *  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 235 of file ProjectSerializer.cpp.

236 {
237  WriteAttr(name, wxString(value));
238 }

References name, and WriteAttr().

Here is the call graph for this function:

◆ WriteAttr() [3/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
const wxString &  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 240 of file ProjectSerializer.cpp.

241 {
242  mBuffer.AppendByte(FT_String);
243  WriteName(name);
244 
245  const Length len = value.length() * sizeof(wxStringCharType);
246  WriteLength( mBuffer, len );
247  mBuffer.AppendData(value.wx_str(), len);
248 }

References FT_String, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteLength, and WriteName().

Referenced by WriteAttr().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ WriteAttr() [4/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
double  value,
int  digits = -1 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 299 of file ProjectSerializer.cpp.

300 {
301  mBuffer.AppendByte(FT_Double);
302  WriteName(name);
303 
304  mBuffer.AppendData(&value, sizeof(value));
305  WriteDigits( mBuffer, digits );
306 }

References FT_Double, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteDigits, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [5/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
float  value,
int  digits = -1 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 290 of file ProjectSerializer.cpp.

291 {
292  mBuffer.AppendByte(FT_Float);
293  WriteName(name);
294 
295  mBuffer.AppendData(&value, sizeof(value));
296  WriteDigits( mBuffer, digits );
297 }

References FT_Float, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteDigits, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [6/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
int  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 250 of file ProjectSerializer.cpp.

251 {
252  mBuffer.AppendByte(FT_Int);
253  WriteName(name);
254 
255  WriteInt( mBuffer, value );
256 }

References FT_Int, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteInt, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [7/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
long long  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 274 of file ProjectSerializer.cpp.

275 {
276  mBuffer.AppendByte(FT_LongLong);
277  WriteName(name);
278 
279  WriteLongLong( mBuffer, value );
280 }

References FT_LongLong, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteLongLong, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [8/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
long  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 266 of file ProjectSerializer.cpp.

267 {
268  mBuffer.AppendByte(FT_Long);
269  WriteName(name);
270 
271  WriteLong( mBuffer, value );
272 }

References FT_Long, mBuffer, name, anonymous_namespace{ProjectSerializer.cpp}::WriteLong, and WriteName().

Here is the call graph for this function:

◆ WriteAttr() [9/9]

void ProjectSerializer::WriteAttr ( const wxString &  name,
size_t  value 
)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 282 of file ProjectSerializer.cpp.

283 {
284  mBuffer.AppendByte(FT_SizeT);
285  WriteName(name);
286 
287  WriteULong( mBuffer, value );
288 }

References FT_SizeT, mBuffer, name, WriteName(), and anonymous_namespace{ProjectSerializer.cpp}::WriteULong.

Here is the call graph for this function:

◆ WriteData()

void ProjectSerializer::WriteData ( const wxString &  value)
overridevirtual

Reimplemented from XMLWriter.

Definition at line 308 of file ProjectSerializer.cpp.

309 {
310  mBuffer.AppendByte(FT_Data);
311 
312  Length len = value.length() * sizeof(wxStringCharType);
313  WriteLength( mBuffer, len );
314  mBuffer.AppendData(value.wx_str(), len);
315 }

References FT_Data, mBuffer, and anonymous_namespace{ProjectSerializer.cpp}::WriteLength.

◆ WriteName()

void ProjectSerializer::WriteName ( const wxString &  name)
private

Definition at line 335 of file ProjectSerializer.cpp.

336 {
337  wxASSERT(name.length() * sizeof(wxStringCharType) <= SHRT_MAX);
338  UShort id;
339 
340  auto nameiter = mNames.find(name);
341  if (nameiter != mNames.end())
342  {
343  id = nameiter->second;
344  }
345  else
346  {
347  // mNames is static. This appends each name to static mDict only once
348  // in each run.
349  UShort len = name.length() * sizeof(wxStringCharType);
350 
351  id = mNames.size();
352  mNames[name] = id;
353 
354  mDict.AppendByte(FT_Name);
355  WriteUShort( mDict, id );
356  WriteUShort( mDict, len );
357  mDict.AppendData(name.wx_str(), len);
358 
359  mDictChanged = true;
360  }
361 
362  WriteUShort( mBuffer, id );
363 }

References FT_Name, id, mBuffer, mDict, mDictChanged, mNames, name, and anonymous_namespace{ProjectSerializer.cpp}::WriteUShort.

Referenced by EndTag(), StartTag(), and WriteAttr().

Here is the caller graph for this function:

◆ WriteSubTree()

void ProjectSerializer::WriteSubTree ( const ProjectSerializer value)

Definition at line 325 of file ProjectSerializer.cpp.

326 {
327  mBuffer.AppendByte(FT_Push);
328 
329  mBuffer.AppendData(value.mDict.GetData(), value.mDict.GetDataLen());
330  mBuffer.AppendData(value.mBuffer.GetData(), value.mBuffer.GetDataLen());
331 
332  mBuffer.AppendByte(FT_Pop);
333 }

References FT_Pop, FT_Push, mBuffer, and mDict.

Member Data Documentation

◆ mBuffer

wxMemoryBuffer ProjectSerializer::mBuffer
private

◆ mDict

wxMemoryBuffer ProjectSerializer::mDict
staticprivate

Definition at line 79 of file ProjectSerializer.h.

Referenced by GetDict(), ProjectSerializer(), WriteName(), and WriteSubTree().

◆ mDictChanged

bool ProjectSerializer::mDictChanged
private

Definition at line 76 of file ProjectSerializer.h.

Referenced by DictChanged(), ProjectSerializer(), and WriteName().

◆ mNames

NameMap ProjectSerializer::mNames
staticprivate

Definition at line 78 of file ProjectSerializer.h.

Referenced by WriteName().


The documentation for this class was generated from the following files:
size
size_t size
Definition: ffmpeg-2.3.6-single-header.h:412
XMLWriter::EndTag
virtual void EndTag(const wxString &name)
Definition: XMLWriter.cpp:99
ProjectSerializer::mNames
static NameMap mNames
Definition: ProjectSerializer.h:78
anonymous_namespace{ProjectSerializer.cpp}::WriteLength
static const auto WriteLength
Definition: ProjectSerializer.cpp:192
anonymous_namespace{ProjectSerializer.cpp}::WriteULong
static const auto WriteULong
Definition: ProjectSerializer.cpp:172
ProjectSerializer::mDict
static wxMemoryBuffer mDict
Definition: ProjectSerializer.h:79
FT_Data
@ FT_Data
Definition: ProjectSerializer.cpp:67
anonymous_namespace{ProjectSerializer.cpp}::WriteUShort
static const auto WriteUShort
Definition: ProjectSerializer.cpp:166
flag
static std::once_flag flag
Definition: WaveformView.cpp:1124
anonymous_namespace{ProjectSerializer.cpp}::WriteDigits
static const auto WriteDigits
Definition: ProjectSerializer.cpp:196
anonymous_namespace{ProjectSerializer.cpp}::UShort
std::uint16_t UShort
Definition: ProjectSerializer.cpp:104
FT_SizeT
@ FT_SizeT
Definition: ProjectSerializer.cpp:64
XO
#define XO(s)
Definition: Internat.h:31
XMLStringWriter
Wrapper to output XML data to strings.
Definition: XMLWriter.h:136
FT_Bool
@ FT_Bool
Definition: ProjectSerializer.cpp:61
anonymous_namespace{ProjectSerializer.cpp}::ReadULong
static const auto ReadULong
Definition: ProjectSerializer.cpp:183
FT_StartTag
@ FT_StartTag
Definition: ProjectSerializer.cpp:57
anonymous_namespace{ProjectSerializer.cpp}::ReadLength
static const auto ReadLength
Definition: ProjectSerializer.cpp:193
anonymous_namespace{ProjectSerializer.cpp}::WriteLong
static const auto WriteLong
Definition: ProjectSerializer.cpp:170
FT_Float
@ FT_Float
Definition: ProjectSerializer.cpp:65
anonymous_namespace{ProjectSerializer.cpp}::ReadDigits
static const auto ReadDigits
Definition: ProjectSerializer.cpp:197
FT_Int
@ FT_Int
Definition: ProjectSerializer.cpp:60
XMLStringWriter::Write
void Write(const wxString &data) override
Definition: XMLWriter.cpp:427
IdMap
std::unordered_map< unsigned short, wxString > IdMap
Definition: ProjectSerializer.h:30
name
const TranslatableString name
Definition: Distortion.cpp:98
FT_EndTag
@ FT_EndTag
Definition: ProjectSerializer.cpp:58
ProjectSerializer::mDictChanged
bool mDictChanged
Definition: ProjectSerializer.h:76
anonymous_namespace{ProjectSerializer.cpp}::ReadUShort
static const auto ReadUShort
Definition: ProjectSerializer.cpp:177
FT_Pop
@ FT_Pop
Definition: ProjectSerializer.cpp:70
anonymous_namespace{ProjectSerializer.cpp}::WriteLongLong
static const auto WriteLongLong
Definition: ProjectSerializer.cpp:174
anonymous_namespace{ProjectSerializer.cpp}::ReadInt
static const auto ReadInt
Definition: ProjectSerializer.cpp:179
id
int id
Definition: WaveTrackControls.cpp:591
ProjectSerializer::WriteName
void WriteName(const wxString &name)
Definition: ProjectSerializer.cpp:335
anonymous_namespace{ProjectSerializer.cpp}::Length
Int Length
Definition: ProjectSerializer.cpp:191
anonymous_namespace{ProjectSerializer.cpp}::WriteInt
static const auto WriteInt
Definition: ProjectSerializer.cpp:168
FT_Double
@ FT_Double
Definition: ProjectSerializer.cpp:66
XMLWriter::WriteAttr
void WriteAttr(const wxString &name, const Identifier &value)
Definition: XMLWriter.h:34
FT_Long
@ FT_Long
Definition: ProjectSerializer.cpp:62
anonymous_namespace{ProjectSerializer.cpp}::ReadLongLong
static const auto ReadLongLong
Definition: ProjectSerializer.cpp:185
FT_String
@ FT_String
Definition: ProjectSerializer.cpp:59
BasicUI::Icon::Error
@ Error
ProjectSerializer::mBuffer
wxMemoryBuffer mBuffer
Definition: ProjectSerializer.h:75
FT_Name
@ FT_Name
Definition: ProjectSerializer.cpp:71
XMLWriter::WriteData
virtual void WriteData(const wxString &value)
Definition: XMLWriter.cpp:199
FT_Raw
@ FT_Raw
Definition: ProjectSerializer.cpp:68
FT_LongLong
@ FT_LongLong
Definition: ProjectSerializer.cpp:63
XMLWriter::StartTag
virtual void StartTag(const wxString &name)
Definition: XMLWriter.cpp:76
anonymous_namespace{ProjectSerializer.cpp}::ReadLong
static const auto ReadLong
Definition: ProjectSerializer.cpp:181
FT_CharSize
@ FT_CharSize
Definition: ProjectSerializer.cpp:56
FT_Push
@ FT_Push
Definition: ProjectSerializer.cpp:69
ProjectSerializer::WriteAttr
void WriteAttr(const wxString &name, const wxString &value) override
Definition: ProjectSerializer.cpp:240