BsProjectLibraryEntriesRTTI.h 6.9 KB

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