2
0

BsManagedSerializableList.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "BsManagedSerializableList.h"
  2. #include "BsManagedSerializableListRTTI.h"
  3. #include "BsMonoManager.h"
  4. #include "BsScriptAssemblyManager.h"
  5. #include "BsManagedSerializableField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoMethod.h"
  8. #include "BsMonoProperty.h"
  9. #include "BsMonoUtil.h"
  10. namespace BansheeEngine
  11. {
  12. ManagedSerializableList::ManagedSerializableList(const ConstructPrivately& dummy)
  13. :mManagedInstance(nullptr), mNumElements(0), mItemProp(nullptr), mCountProp(nullptr), mAddMethod(nullptr)
  14. {
  15. }
  16. ManagedSerializableList::ManagedSerializableList(const ConstructPrivately& dummy, const ManagedSerializableTypeInfoListPtr& typeInfo, MonoObject* managedInstance)
  17. :mListTypeInfo(typeInfo), mManagedInstance(managedInstance), mNumElements(0), mItemProp(nullptr),
  18. mCountProp(nullptr), mAddMethod(nullptr)
  19. {
  20. MonoClass* listClass = MonoManager::instance().findClass(mono_object_get_class(managedInstance));
  21. if(listClass == nullptr)
  22. return;
  23. initMonoObjects(listClass);
  24. mNumElements = getLength();
  25. }
  26. ManagedSerializableListPtr ManagedSerializableList::createFromExisting(MonoObject* managedInstance, const ManagedSerializableTypeInfoListPtr& typeInfo)
  27. {
  28. if(managedInstance == nullptr)
  29. return nullptr;
  30. String elementNs;
  31. String elementTypeName;
  32. MonoUtil::getClassName(managedInstance, elementNs, elementTypeName);
  33. String fullName = elementNs + "." + elementTypeName;
  34. if(ScriptAssemblyManager::instance().getSystemGenericListClass()->getFullName() != fullName)
  35. return nullptr;
  36. return bs_shared_ptr<ManagedSerializableList>(ConstructPrivately(), typeInfo, managedInstance);
  37. }
  38. ManagedSerializableListPtr ManagedSerializableList::createFromNew(const ManagedSerializableTypeInfoListPtr& typeInfo, UINT32 size)
  39. {
  40. return bs_shared_ptr<ManagedSerializableList>(ConstructPrivately(), typeInfo, createManagedInstance(typeInfo, size));
  41. }
  42. MonoObject* ManagedSerializableList::createManagedInstance(const ManagedSerializableTypeInfoListPtr& typeInfo, UINT32 size)
  43. {
  44. if (!typeInfo->isTypeLoaded())
  45. return nullptr;
  46. ::MonoClass* listMonoClass = typeInfo->getMonoClass();
  47. MonoClass* listClass = MonoManager::instance().findClass(listMonoClass);
  48. if (listClass == nullptr)
  49. return nullptr;
  50. void* params[1] = { &size };
  51. return listClass->createInstance("int", params);
  52. }
  53. ManagedSerializableListPtr ManagedSerializableList::createEmpty()
  54. {
  55. return bs_shared_ptr<ManagedSerializableList>(ConstructPrivately());
  56. }
  57. void ManagedSerializableList::deserializeManagedInstance(const Vector<ManagedSerializableFieldDataPtr>& entries)
  58. {
  59. mManagedInstance = createManagedInstance(mListTypeInfo, mNumElements);
  60. if (mManagedInstance == nullptr)
  61. return;
  62. MonoClass* listClass = MonoManager::instance().findClass(mListTypeInfo->getMonoClass());
  63. initMonoObjects(listClass);
  64. for(auto& arrayEntry : entries)
  65. {
  66. addFieldData(arrayEntry);
  67. }
  68. }
  69. void ManagedSerializableList::setFieldData(UINT32 arrayIdx, const ManagedSerializableFieldDataPtr& val)
  70. {
  71. mItemProp->setIndexed(mManagedInstance, arrayIdx, val->getValue(mListTypeInfo->mElementType));
  72. }
  73. void ManagedSerializableList::addFieldData(const ManagedSerializableFieldDataPtr& val)
  74. {
  75. void* params[1];
  76. params[0] = val->getValue(mListTypeInfo->mElementType);
  77. mAddMethod->invoke(mManagedInstance, params);
  78. }
  79. ManagedSerializableFieldDataPtr ManagedSerializableList::getFieldData(UINT32 arrayIdx)
  80. {
  81. MonoObject* obj = mItemProp->getIndexed(mManagedInstance, arrayIdx);
  82. return ManagedSerializableFieldData::create(mListTypeInfo->mElementType, obj);
  83. }
  84. UINT32 ManagedSerializableList::getLength() const
  85. {
  86. MonoObject* length = mCountProp->get(mManagedInstance);
  87. if(length == nullptr)
  88. return 0;
  89. return *(UINT32*)mono_object_unbox(length);
  90. }
  91. void ManagedSerializableList::initMonoObjects(MonoClass* listClass)
  92. {
  93. mItemProp = &listClass->getProperty("Item");
  94. mCountProp = &listClass->getProperty("Count");
  95. mAddMethod = listClass->getMethod("Add", 1);
  96. }
  97. RTTITypeBase* ManagedSerializableList::getRTTIStatic()
  98. {
  99. return ManagedSerializableListRTTI::instance();
  100. }
  101. RTTITypeBase* ManagedSerializableList::getRTTI() const
  102. {
  103. return ManagedSerializableList::getRTTIStatic();
  104. }
  105. }