BsProjectLibraryEntriesRTTI.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #pragma once
  4. #include "BsEditorPrerequisites.h"
  5. #include "Reflection/BsRTTIType.h"
  6. #include "Library/BsProjectLibraryEntries.h"
  7. #include "String/BsUnicode.h"
  8. namespace bs
  9. {
  10. /** @cond RTTI */
  11. /** @addtogroup RTTI-Impl-Editor
  12. * @{
  13. */
  14. class ProjectLibraryEntriesRTTI : public RTTIType<ProjectLibraryEntries, IReflectable, ProjectLibraryEntriesRTTI>
  15. {
  16. private:
  17. ProjectLibrary::DirectoryEntry& getRootElement(ProjectLibraryEntries* obj) { return obj->mRootEntry; }
  18. void setRootElement(ProjectLibraryEntries* obj, ProjectLibrary::DirectoryEntry& val) { obj->mRootEntry = val; }
  19. public:
  20. ProjectLibraryEntriesRTTI()
  21. {
  22. addPlainField("mRootElement", 0, &ProjectLibraryEntriesRTTI::getRootElement, &ProjectLibraryEntriesRTTI::setRootElement);
  23. }
  24. virtual const String& getRTTIName()
  25. {
  26. static String name = "ProjectLibraryEntries";
  27. return name;
  28. }
  29. virtual UINT32 getRTTIId()
  30. {
  31. return TID_ProjectLibraryEntries;
  32. }
  33. virtual SPtr<IReflectable> newRTTIObject()
  34. {
  35. return ProjectLibraryEntries::createEmpty();
  36. }
  37. };
  38. template<> struct RTTIPlainType<bs::ProjectLibrary::FileEntry>
  39. {
  40. enum { id = bs::TID_ProjectLibraryResEntry }; enum { hasDynamicSize = 1 };
  41. static void toMemory(const bs::ProjectLibrary::FileEntry& data, char* memory)
  42. {
  43. UINT32 size = 0;
  44. char* memoryStart = memory;
  45. memory += sizeof(UINT32);
  46. size += sizeof(UINT32);
  47. // For compatibility, encoding the name as a wide string
  48. WString elemName = UTF8::toWide(data.elementName);
  49. UINT32 type = (UINT32)data.type;
  50. memory = rttiWriteElem(type, memory, size);
  51. memory = rttiWriteElem(data.path, memory, size);
  52. memory = rttiWriteElem(elemName, memory, size);
  53. memory = rttiWriteElem(data.lastUpdateTime, memory, size);
  54. memcpy(memoryStart, &size, sizeof(UINT32));
  55. }
  56. static UINT32 fromMemory(bs::ProjectLibrary::FileEntry& data, char* memory)
  57. {
  58. UINT32 size = 0;
  59. memcpy(&size, memory, sizeof(UINT32));
  60. memory += sizeof(UINT32);
  61. UINT32 type;
  62. memory = rttiReadElem(type, memory);
  63. data.type = (bs::ProjectLibrary::LibraryEntryType)type;
  64. memory = rttiReadElem(data.path, memory);
  65. WString elemName;
  66. memory = rttiReadElem(elemName, memory);
  67. data.elementName = UTF8::fromWide(elemName);
  68. memory = rttiReadElem(data.lastUpdateTime, memory);
  69. return size;
  70. }
  71. static UINT32 getDynamicSize(const bs::ProjectLibrary::FileEntry& data)
  72. {
  73. WString elemName = UTF8::toWide(data.elementName);
  74. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) +
  75. rttiGetElemSize(elemName) + rttiGetElemSize(data.lastUpdateTime);
  76. #if BS_DEBUG_MODE
  77. if(dataSize > std::numeric_limits<UINT32>::max())
  78. {
  79. __string_throwDataOverflowException();
  80. }
  81. #endif
  82. return (UINT32)dataSize;
  83. }
  84. };
  85. template<> struct RTTIPlainType<bs::ProjectLibrary::DirectoryEntry>
  86. {
  87. enum { id = bs::TID_ProjectLibraryDirEntry }; enum { hasDynamicSize = 1 };
  88. static void toMemory(const bs::ProjectLibrary::DirectoryEntry& data, char* memory)
  89. {
  90. UINT32 size = 0;
  91. char* memoryStart = memory;
  92. memory += sizeof(UINT32);
  93. size += sizeof(UINT32);
  94. // For compatibility, encoding the name as a wide string
  95. WString elemName = UTF8::toWide(data.elementName);
  96. memory = rttiWriteElem(data.type, memory, size);
  97. memory = rttiWriteElem(data.path, memory, size);
  98. memory = rttiWriteElem(elemName, memory, size);
  99. UINT32 numChildren = (UINT32)data.mChildren.size();
  100. memory = rttiWriteElem(numChildren, memory, size);
  101. for(auto& child : data.mChildren)
  102. {
  103. if(child->type == bs::ProjectLibrary::LibraryEntryType::File)
  104. {
  105. bs::ProjectLibrary::FileEntry* childResEntry = static_cast<bs::ProjectLibrary::FileEntry*>(child);
  106. memory = rttiWriteElem(*childResEntry, memory, size);
  107. }
  108. else if(child->type == bs::ProjectLibrary::LibraryEntryType::Directory)
  109. {
  110. bs::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<bs::ProjectLibrary::DirectoryEntry*>(child);
  111. memory = rttiWriteElem(*childDirEntry, memory, size);
  112. }
  113. }
  114. memcpy(memoryStart, &size, sizeof(UINT32));
  115. }
  116. static UINT32 fromMemory(bs::ProjectLibrary::DirectoryEntry& data, char* memory)
  117. {
  118. UINT32 size = 0;
  119. memcpy(&size, memory, sizeof(UINT32));
  120. memory += sizeof(UINT32);
  121. memory = rttiReadElem(data.type, memory);
  122. memory = rttiReadElem(data.path, memory);
  123. WString elemName;
  124. memory = rttiReadElem(elemName, memory);
  125. data.elementName = UTF8::fromWide(elemName);
  126. UINT32 numChildren = 0;
  127. memory = rttiReadElem(numChildren, memory);
  128. for(UINT32 i = 0; i < numChildren; i++)
  129. {
  130. bs::ProjectLibrary::LibraryEntryType childType = bs::ProjectLibrary::LibraryEntryType::File;
  131. rttiReadElem(childType, memory + sizeof(UINT32)); // Skip ahead to get type
  132. if(childType == bs::ProjectLibrary::LibraryEntryType::File)
  133. {
  134. bs::ProjectLibrary::FileEntry* childResEntry = bs_new<bs::ProjectLibrary::FileEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  135. memory = rttiReadElem(*childResEntry, memory);
  136. childResEntry->parent = &data;
  137. data.mChildren.push_back(childResEntry);
  138. }
  139. else if(childType == bs::ProjectLibrary::LibraryEntryType::Directory)
  140. {
  141. bs::ProjectLibrary::DirectoryEntry* childDirEntry = bs_new<bs::ProjectLibrary::DirectoryEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  142. memory = rttiReadElem(*childDirEntry, memory);
  143. childDirEntry->parent = &data;
  144. data.mChildren.push_back(childDirEntry);
  145. }
  146. }
  147. return size;
  148. }
  149. static UINT32 getDynamicSize(const bs::ProjectLibrary::DirectoryEntry& data)
  150. {
  151. WString elemName = UTF8::toWide(data.elementName);
  152. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) +
  153. rttiGetElemSize(elemName);
  154. dataSize += sizeof(UINT32);
  155. for(auto& child : data.mChildren)
  156. {
  157. if(child->type == bs::ProjectLibrary::LibraryEntryType::File)
  158. {
  159. bs::ProjectLibrary::FileEntry* childResEntry = static_cast<bs::ProjectLibrary::FileEntry*>(child);
  160. dataSize += rttiGetElemSize(*childResEntry);
  161. }
  162. else if(child->type == bs::ProjectLibrary::LibraryEntryType::Directory)
  163. {
  164. bs::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<bs::ProjectLibrary::DirectoryEntry*>(child);
  165. dataSize += rttiGetElemSize(*childDirEntry);
  166. }
  167. }
  168. #if BS_DEBUG_MODE
  169. if(dataSize > std::numeric_limits<UINT32>::max())
  170. {
  171. __string_throwDataOverflowException();
  172. }
  173. #endif
  174. return (UINT32)dataSize;
  175. }
  176. };
  177. /** @} */
  178. /** @endcond */
  179. }