[dali_2.3.21] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / public-api / loader / buffer-definition.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-scene3d/public-api/loader/buffer-definition.h>
20
21 // EXTERNAL INCLUDES
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>
25
26 namespace Dali::Scene3D::Loader
27 {
28 namespace
29 {
30 static constexpr std::string_view EMBEDDED_DATA_PREFIX                 = "data:";
31 static constexpr std::string_view EMBEDDED_DATA_APPLICATION_MEDIA_TYPE = "application/";
32 static constexpr std::string_view EMBEDDED_DATA_BASE64_ENCODING_TYPE   = "base64,";
33 } // namespace
34
35 struct BufferDefinition::Impl
36 {
37   std::vector<uint8_t>              buffer;
38   std::shared_ptr<Dali::FileStream> stream;
39 };
40
41 BufferDefinition::BufferDefinition(std::vector<uint8_t>& buffer)
42 : mImpl{new BufferDefinition::Impl}
43 {
44   mImpl.get()->buffer = std::move(buffer);
45   mImpl.get()->stream = std::make_shared<Dali::FileStream>(reinterpret_cast<uint8_t*>(mImpl.get()->buffer.data()), mImpl.get()->buffer.size(), FileStream::READ | FileStream::BINARY);
46   mIsEmbedded         = true;
47 }
48
49 BufferDefinition::BufferDefinition()
50 : mImpl{new BufferDefinition::Impl}
51 {
52 }
53
54 BufferDefinition::~BufferDefinition() = default;
55
56 BufferDefinition::BufferDefinition(BufferDefinition&& other)
57 : mResourcePath(std::move(other.mResourcePath)),
58   mUri(std::move(other.mUri)),
59   mByteLength(std::move(other.mByteLength)),
60   mName(std::move(other.mName)),
61   mImpl(std::move(other.mImpl))
62 {
63 }
64
65 std::iostream& BufferDefinition::GetBufferStream()
66 {
67   LoadBuffer();
68   return mImpl.get()->stream.get()->GetStream();
69 }
70
71 std::string BufferDefinition::GetUri()
72 {
73   return mResourcePath + ((mIsEmbedded) ? std::string() : mUri);
74 }
75
76 bool BufferDefinition::IsAvailable()
77 {
78   LoadBuffer();
79   return mImpl.get()->stream != nullptr;
80 }
81
82 void BufferDefinition::LoadBuffer()
83 {
84   if(mImpl.get()->stream == nullptr)
85   {
86     if(mUri.find(EMBEDDED_DATA_PREFIX.data()) == 0 && mUri.find(EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.data(), EMBEDDED_DATA_PREFIX.length()) == EMBEDDED_DATA_PREFIX.length())
87     {
88       uint32_t position = mUri.find(EMBEDDED_DATA_BASE64_ENCODING_TYPE.data(), EMBEDDED_DATA_PREFIX.length() + EMBEDDED_DATA_APPLICATION_MEDIA_TYPE.length());
89       if(position != std::string::npos)
90       {
91         position += EMBEDDED_DATA_BASE64_ENCODING_TYPE.length();
92         std::string_view data = std::string_view(mUri).substr(position);
93         mImpl.get()->buffer.clear();
94         Dali::Toolkit::DecodeBase64FromString(data, mImpl.get()->buffer);
95         mImpl.get()->stream = std::make_shared<Dali::FileStream>(reinterpret_cast<uint8_t*>(mImpl.get()->buffer.data()), mByteLength, FileStream::READ | FileStream::BINARY);
96         mIsEmbedded         = true;
97       }
98     }
99     else
100     {
101       mImpl.get()->stream = std::make_shared<Dali::FileStream>(mResourcePath + mUri, FileStream::READ | FileStream::BINARY);
102       if(mImpl.get()->stream == nullptr)
103       {
104         DALI_LOG_ERROR("Failed to load %s\n", (mResourcePath + mUri).c_str());
105       }
106     }
107   }
108 }
109
110 } // namespace Dali::Scene3D::Loader