BsProjectLibraryEntriesRTTI.h 7.0 KB

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