2 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-scene3d/public-api/loader/buffer-definition.h>
22 #include <dali-toolkit/devel-api/builder/base64-encoding.h>
23 #include <dali/devel-api/adaptor-framework/file-stream.h>
24 #include <dali/integration-api/debug.h>
34 static constexpr std::string_view EMBEDDED_DATA_PREFIX = "data:";
35 static constexpr std::string_view EMBEDDED_DATA_APPLICATION_MEDIA_TYPE = "application/";
36 static constexpr std::string_view EMBEDDED_DATA_BASE64_ENCODING_TYPE = "base64,";
39 struct BufferDefinition::Impl
41 std::vector<uint8_t> buffer;
42 std::shared_ptr<Dali::FileStream> stream;
45 BufferDefinition::BufferDefinition(std::vector<uint8_t>& buffer)
46 : mImpl{new BufferDefinition::Impl}
48 mImpl.get()->buffer = std::move(buffer);
49 mImpl.get()->stream = std::make_shared<Dali::FileStream>(reinterpret_cast<uint8_t*>(mImpl.get()->buffer.data()), mImpl.get()->buffer.size(), FileStream::READ | FileStream::BINARY);
53 BufferDefinition::BufferDefinition()
54 : mImpl{new BufferDefinition::Impl}
58 BufferDefinition::~BufferDefinition() = default;
60 BufferDefinition::BufferDefinition(BufferDefinition&& other)
61 : mResourcePath(std::move(other.mResourcePath)),
62 mUri(std::move(other.mUri)),
63 mByteLength(std::move(other.mByteLength)),
64 mName(std::move(other.mName)),
65 mImpl(std::move(other.mImpl))
69 std::iostream& BufferDefinition::GetBufferStream()
72 return mImpl.get()->stream.get()->GetStream();
75 std::string BufferDefinition::GetUri()
77 return mResourcePath + ((mIsEmbedded) ? std::string() : mUri);
80 bool BufferDefinition::IsAvailable()
83 return mImpl.get()->stream != nullptr;
86 void BufferDefinition::LoadBuffer()
88 if(mImpl.get()->stream == nullptr)
90 if(mUri.find(EMBEDDED_DATA_PREFIX.data()) == 0 && mUri.find(EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.data(), EMBEDDED_DATA_PREFIX.length()) == EMBEDDED_DATA_PREFIX.length())
92 uint32_t position = mUri.find(EMBEDDED_DATA_BASE64_ENCODING_TYPE.data(), EMBEDDED_DATA_PREFIX.length() + EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.length());
93 if(position != std::string::npos)
95 position += EMBEDDED_DATA_BASE64_ENCODING_TYPE.length();
96 std::string_view data = std::string_view(mUri).substr(position);
97 mImpl.get()->buffer.clear();
98 Dali::Toolkit::DecodeBase64FromString(data, mImpl.get()->buffer);
99 mImpl.get()->stream = std::make_shared<Dali::FileStream>(reinterpret_cast<uint8_t*>(mImpl.get()->buffer.data()), mByteLength, FileStream::READ | FileStream::BINARY);
105 mImpl.get()->stream = std::make_shared<Dali::FileStream>(mResourcePath + mUri, FileStream::READ | FileStream::BINARY);
106 if(mImpl.get()->stream == nullptr)
108 DALI_LOG_ERROR("Failed to load %s\n", (mResourcePath + mUri).c_str());
114 } // namespace Loader
115 } // namespace Scene3D