2b8563171a4e6fc542fbc1c42c26d8eac6d7d0e3
[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 // INTERNAL INCLUDES
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
27 {
28 namespace Scene3D
29 {
30 namespace Loader
31 {
32 namespace
33 {
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,";
37 } // namespace
38
39 struct BufferDefinition::Impl
40 {
41   std::vector<uint8_t>              buffer;
42   std::shared_ptr<Dali::FileStream> stream;
43 };
44
45 BufferDefinition::BufferDefinition(std::vector<uint8_t>& buffer)
46 : mImpl{new BufferDefinition::Impl}
47 {
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);
50   mIsEmbedded         = true;
51 }
52
53 BufferDefinition::BufferDefinition()
54 : mImpl{new BufferDefinition::Impl}
55 {
56 }
57
58 BufferDefinition::~BufferDefinition() = default;
59
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))
66 {
67 }
68
69 std::iostream& BufferDefinition::GetBufferStream()
70 {
71   LoadBuffer();
72   return mImpl.get()->stream.get()->GetStream();
73 }
74
75 std::string BufferDefinition::GetUri()
76 {
77   return mResourcePath + ((mIsEmbedded) ? std::string() : mUri);
78 }
79
80 bool BufferDefinition::IsAvailable()
81 {
82   LoadBuffer();
83   return mImpl.get()->stream != nullptr;
84 }
85
86 void BufferDefinition::LoadBuffer()
87 {
88   if(mImpl.get()->stream == nullptr)
89   {
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())
91     {
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)
94       {
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);
100         mIsEmbedded         = true;
101       }
102     }
103     else
104     {
105       mImpl.get()->stream = std::make_shared<Dali::FileStream>(mResourcePath + mUri, FileStream::READ | FileStream::BINARY);
106       if(mImpl.get()->stream == nullptr)
107       {
108         DALI_LOG_ERROR("Failed to load %s\n", (mResourcePath + mUri).c_str());
109       }
110     }
111   }
112 }
113
114 } // namespace Loader
115 } // namespace Scene3D
116 } // namespace Dali