2 * Copyright (c) 2022 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.
18 #include <dali/internal/adaptor-framework/common/file-loader-impl.h>
21 #include <dali/integration-api/debug.h>
27 #include <dali/integration-api/adaptor-framework/android/android-framework.h>
28 #include <dali/internal/adaptor/common/framework.h>
36 int ReadFile(const std::string& filename, Dali::Vector<char>& memblock, Dali::FileLoader::FileType fileType)
40 return Dali::Internal::Adaptor::ReadFile(filename, size, memblock, fileType);
43 int ReadFile(const std::string& filename, Dali::Vector<uint8_t>& memblock, Dali::FileLoader::FileType fileType)
47 return Dali::Internal::Adaptor::ReadFile(filename, size, memblock, fileType);
50 inline bool hasPrefix(const std::string& prefix, const std::string& path)
52 return std::mismatch(prefix.begin(), prefix.end(), path.begin()).first == prefix.end();
55 inline std::string ConvertToAssetsInternalPath(const std::string& path, int offset)
57 std::string internalPath = std::string(path.c_str() + offset);
60 while((i = internalPath.find("//", i)) != std::string::npos)
62 internalPath.replace(i, 2, "/");
69 int ReadFile(const std::string& filename, std::streampos& fileSize, Dali::Vector<T>& memblock, Dali::FileLoader::FileType fileType)
73 char mode[3] = {'r', 0, 0};
75 if(fileType == Dali::FileLoader::BINARY)
79 else if(fileType != Dali::FileLoader::TEXT)
84 const std::string assetsPrefix = "assets/";
85 if(hasPrefix(assetsPrefix, filename))
87 std::string internalPath = ConvertToAssetsInternalPath(filename, assetsPrefix.length());
88 AAssetManager* assetManager = Dali::Integration::AndroidFramework::Get().GetApplicationAssets();
89 AAsset* asset = AAssetManager_open(assetManager, internalPath.c_str(), AASSET_MODE_BUFFER);
92 length = AAsset_getLength(asset);
93 memblock.ResizeUninitialized(length + 1);
94 memblock[length] = 0; // 1 for extra zero at the end
96 char* buffer = reinterpret_cast<char*>(memblock.Begin());
97 errorCode = (AAsset_read(asset, buffer, length) != length) ? 0 : 1;
104 DALI_LOG_ERROR("Asset not found %s\n", internalPath.c_str());
109 FILE* file = fopen(filename.c_str(), mode);
112 fseek(file, 0, SEEK_END);
113 length = ftell(file);
114 memblock.ResizeUninitialized(length + 1);
115 //put last byte as 0, in case this is a text file without null-terminator
116 memblock[length] = 0;
118 char* buffer = reinterpret_cast<char*>(memblock.Begin());
119 fseek(file, 0, SEEK_SET);
120 errorCode = (fread(buffer, 1, length, file) != length) ? 0 : 1;
127 DALI_LOG_ERROR("File not found %s\n", filename.c_str());
134 std::streampos GetFileSize(const std::string& filename)
136 std::streampos size = 0;
138 const std::string assetsPrefix = "assets/";
139 if(hasPrefix(assetsPrefix, filename))
141 std::string internalPath = ConvertToAssetsInternalPath(filename, assetsPrefix.length());
142 AAssetManager* assetManager = Dali::Integration::AndroidFramework::Get().GetApplicationAssets();
143 AAsset* asset = AAssetManager_open(assetManager, internalPath.c_str(), AASSET_MODE_BUFFER);
146 size = AAsset_getLength(asset);
151 DALI_LOG_ERROR("Asset not found %s\n", internalPath.c_str());
156 FILE* file = fopen(filename.c_str(), "r");
159 fseek(file, 0, SEEK_END);
165 DALI_LOG_ERROR("File not found %s\n", filename.c_str());
172 } // namespace Adaptor
174 } // namespace Internal