TValue TypeRegistry::GetManagedValueGeneric()

in clicache/src/TypeRegistry.cpp [459:563]


      TValue TypeRegistry::GetManagedValueGeneric(std::shared_ptr<native::Serializable> val)
      {
        if (val == nullptr)
        {
          return TValue();
        }

        if (auto dataSerializablePrimitive = std::dynamic_pointer_cast<native::internal::DataSerializablePrimitive>(val))
        {
          switch (dataSerializablePrimitive->getDsCode())
          {
            case native::internal::DSCode::CacheableByte:
            {
              return safe_cast<TValue>(Serializable::getByte(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableBoolean:
            {
              return safe_cast<TValue>(Serializable::getBoolean(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableCharacter:
            {
              return safe_cast<TValue>(Serializable::getChar(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableDouble:
            {
              return safe_cast<TValue>(Serializable::getDouble(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableASCIIString:
            case native::internal::DSCode::CacheableASCIIStringHuge:
            case native::internal::DSCode::CacheableString:
            case native::internal::DSCode::CacheableStringHuge:
            {
              return safe_cast<TValue>(Serializable::getString(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableFloat:
            {
              return safe_cast<TValue>(Serializable::getFloat(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableInt16:
            {
              return safe_cast<TValue>(Serializable::getInt16(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableInt32:
            {
              return safe_cast<TValue>(Serializable::getInt32(dataSerializablePrimitive));
            }
            case native::internal::DSCode::CacheableInt64:
            {
              return safe_cast<TValue>(Serializable::getInt64(dataSerializablePrimitive));
            }
            default:
              return wrap<TValue>(dataSerializablePrimitive);
          }
        }
        else if (auto dataSerializableFixedId = std::dynamic_pointer_cast<native::DataSerializableFixedId>(val))
        {
          switch (dataSerializableFixedId->getDSFID())
          {
          case native::DSFid::Struct:
          {
            return safe_cast<TValue>(Struct::Create(val));
          }
          case native::DSFid::CacheableUndefined:
          {
            return safe_cast<TValue>(CacheableUndefined::Create());
          }
          default:
            break;
          }
        }
        else if (auto dataSerializable = std::dynamic_pointer_cast<native::DataSerializable>(val))
        {
          auto ret = SafeUMSerializableConvertGeneric(dataSerializable);
          return safe_cast<TValue>(ret);
        }
        else if (auto pdxSerializable = std::dynamic_pointer_cast<native::PdxSerializable>(val))
        {
          auto ret = SafeUMSerializablePDXConvert(pdxSerializable);
          if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(ret))
          {
            return safe_cast<TValue>(pdxWrapper->GetObject());
          }

          return safe_cast<TValue>(ret);
        }
				else if (auto userFunctionExecutionException = std::dynamic_pointer_cast<native::UserFunctionExecutionException>(val))
        {
          return safe_cast<TValue>(gcnew UserFunctionExecutionException(userFunctionExecutionException));
        }
        else if (auto pdxManagedCacheableKey = std::dynamic_pointer_cast<native::PdxManagedCacheableKey>(val))
        {
          auto pdx = pdxManagedCacheableKey->ptr();
          if (auto pdxWrapper = dynamic_cast<PdxWrapper^>(pdx))
          {
            return safe_cast<TValue>(pdxWrapper->GetObject());
          }
          return safe_cast<TValue>(pdx);
        }
        else
        {
          throw gcnew IllegalStateException("Unknown serialization type.");
        }

        throw gcnew System::Exception("not found typeid");
      }