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()
46 : mImpl{new BufferDefinition::Impl}
50 BufferDefinition::~BufferDefinition() = default;
52 BufferDefinition::BufferDefinition(BufferDefinition&& other)
53 : mResourcePath(std::move(other.mResourcePath)),
54 mUri(std::move(other.mUri)),
55 mByteLength(std::move(other.mByteLength)),
56 mName(std::move(other.mName)),
57 mImpl(std::move(other.mImpl))
61 std::iostream& BufferDefinition::GetBufferStream()
64 return mImpl.get()->stream.get()->GetStream();
67 std::string BufferDefinition::GetUri()
69 return mResourcePath + ((mIsEmbedded) ? std::string() : mUri);
72 bool BufferDefinition::IsAvailable()
75 return mImpl.get()->stream != nullptr;
78 void BufferDefinition::LoadBuffer()
80 if(mImpl.get()->stream == nullptr)
82 if(mUri.find(EMBEDDED_DATA_PREFIX.data()) == 0 && mUri.find(EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.data(), EMBEDDED_DATA_PREFIX.length()) == EMBEDDED_DATA_PREFIX.length())
84 uint32_t position = mUri.find(EMBEDDED_DATA_BASE64_ENCODING_TYPE.data(), EMBEDDED_DATA_PREFIX.length() + EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.length());
85 if(position != std::string::npos)
87 position += EMBEDDED_DATA_BASE64_ENCODING_TYPE.length();
88 std::string data = mUri.substr(position);
89 mImpl.get()->buffer.clear();
90 Dali::Toolkit::DecodeBase64PropertyData(data, mImpl.get()->buffer);
91 mImpl.get()->stream = std::make_shared<Dali::FileStream>(reinterpret_cast<uint8_t*>(mImpl.get()->buffer.data()), mByteLength, FileStream::READ | FileStream::BINARY);
97 mImpl.get()->stream = std::make_shared<Dali::FileStream>(mResourcePath + mUri, FileStream::READ | FileStream::BINARY);
98 if(mImpl.get()->stream == nullptr)
100 DALI_LOG_ERROR("Failed to load %s\n", (mResourcePath + mUri).c_str());
106 } // namespace Loader
107 } // namespace Scene3D