BsProjectLibraryEntriesRTTI.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. data.elementNameHash = bs_hash(UTF8::toLower(data.elementName));
  69. memory = rttiReadElem(data.lastUpdateTime, memory);
  70. return size;
  71. }
  72. static UINT32 getDynamicSize(const bs::ProjectLibrary::FileEntry& data)
  73. {
  74. WString elemName = UTF8::toWide(data.elementName);
  75. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) +
  76. rttiGetElemSize(elemName) + rttiGetElemSize(data.lastUpdateTime);
  77. #if BS_DEBUG_MODE
  78. if(dataSize > std::numeric_limits<UINT32>::max())
  79. {
  80. __string_throwDataOverflowException();
  81. }
  82. #endif
  83. return (UINT32)dataSize;
  84. }
  85. };
  86. template<> struct RTTIPlainType<bs::ProjectLibrary::DirectoryEntry>
  87. {
  88. enum { id = bs::TID_ProjectLibraryDirEntry }; enum { hasDynamicSize = 1 };
  89. static void toMemory(const bs::ProjectLibrary::DirectoryEntry& data, char* memory)
  90. {
  91. UINT32 size = 0;
  92. char* memoryStart = memory;
  93. memory += sizeof(UINT32);
  94. size += sizeof(UINT32);
  95. // For compatibility, encoding the name as a wide string
  96. WString elemName = UTF8::toWide(data.elementName);
  97. memory = rttiWriteElem(data.type, memory, size);
  98. memory = rttiWriteElem(data.path, memory, size);
  99. memory = rttiWriteElem(elemName, memory, size);
  100. UINT32 numChildren = (UINT32)data.mChildren.size();
  101. memory = rttiWriteElem(numChildren, memory, size);
  102. for(auto& child : data.mChildren)
  103. {
  104. if(child->type == bs::ProjectLibrary::LibraryEntryType::File)
  105. {
  106. bs::ProjectLibrary::FileEntry* childResEntry = static_cast<bs::ProjectLibrary::FileEntry*>(child);
  107. memory = rttiWriteElem(*childResEntry, memory, size);
  108. }
  109. else if(child->type == bs::ProjectLibrary::LibraryEntryType::Directory)
  110. {
  111. bs::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<bs::ProjectLibrary::DirectoryEntry*>(child);
  112. memory = rttiWriteElem(*childDirEntry, memory, size);
  113. }
  114. }
  115. memcpy(memoryStart, &size, sizeof(UINT32));
  116. }
  117. static UINT32 fromMemory(bs::ProjectLibrary::DirectoryEntry& data, char* memory)
  118. {
  119. UINT32 size = 0;
  120. memcpy(&size, memory, sizeof(UINT32));
  121. memory += sizeof(UINT32);
  122. memory = rttiReadElem(data.type, memory);
  123. memory = rttiReadElem(data.path, memory);
  124. WString elemName;
  125. memory = rttiReadElem(elemName, memory);
  126. data.elementName = UTF8::fromWide(elemName);
  127. data.elementNameHash = bs_hash(UTF8::toLower(data.elementName));
  128. UINT32 numChildren = 0;
  129. memory = rttiReadElem(numChildren, memory);
  130. for(UINT32 i = 0; i < numChildren; i++)
  131. {
  132. bs::ProjectLibrary::LibraryEntryType childType = bs::ProjectLibrary::LibraryEntryType::File;
  133. rttiReadElem(childType, memory + sizeof(UINT32)); // Skip ahead to get type
  134. if(childType == bs::ProjectLibrary::LibraryEntryType::File)
  135. {
  136. bs::ProjectLibrary::FileEntry* childResEntry = bs_new<bs::ProjectLibrary::FileEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  137. memory = rttiReadElem(*childResEntry, memory);
  138. childResEntry->parent = &data;
  139. data.mChildren.push_back(childResEntry);
  140. }
  141. else if(childType == bs::ProjectLibrary::LibraryEntryType::Directory)
  142. {
  143. bs::ProjectLibrary::DirectoryEntry* childDirEntry = bs_new<bs::ProjectLibrary::DirectoryEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  144. memory = rttiReadElem(*childDirEntry, memory);
  145. childDirEntry->parent = &data;
  146. data.mChildren.push_back(childDirEntry);
  147. }
  148. }
  149. return size;
  150. }
  151. static UINT32 getDynamicSize(const bs::ProjectLibrary::DirectoryEntry& data)
  152. {
  153. WString elemName = UTF8::toWide(data.elementName);
  154. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) +
  155. rttiGetElemSize(elemName);
  156. dataSize += sizeof(UINT32);
  157. for(auto& child : data.mChildren)
  158. {
  159. if(child->type == bs::ProjectLibrary::LibraryEntryType::File)
  160. {
  161. bs::ProjectLibrary::FileEntry* childResEntry = static_cast<bs::ProjectLibrary::FileEntry*>(child);
  162. dataSize += rttiGetElemSize(*childResEntry);
  163. }
  164. else if(child->type == bs::ProjectLibrary::LibraryEntryType::Directory)
  165. {
  166. bs::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<bs::ProjectLibrary::DirectoryEntry*>(child);
  167. dataSize += rttiGetElemSize(*childDirEntry);
  168. }
  169. }
  170. #if BS_DEBUG_MODE
  171. if(dataSize > std::numeric_limits<UINT32>::max())
  172. {
  173. __string_throwDataOverflowException();
  174. }
  175. #endif
  176. return (UINT32)dataSize;
  177. }
  178. };
  179. /** @} */
  180. /** @endcond */
  181. }