[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor-framework / generic / file-loader-impl-generic.cpp
1 /*
2  * Copyright (c) 2022 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 // CLASS HEADER
18 #include <dali/internal/adaptor-framework/common/file-loader-impl.h>
19
20 // EXTERNAL INCLUDES
21 #include <cstring>
22 #include <fstream>
23
24 #include <dali/integration-api/debug.h>
25
26 namespace Dali
27 {
28 namespace Internal
29 {
30 namespace Adaptor
31 {
32 int ReadFile(const std::string& filename, Dali::Vector<char>& memblock, Dali::FileLoader::FileType fileType)
33 {
34   std::streampos size;
35
36   return Dali::Internal::Adaptor::ReadFile(filename, size, memblock, fileType);
37 }
38
39 int ReadFile(const std::string& filename, Dali::Vector<uint8_t>& memblock, Dali::FileLoader::FileType fileType)
40 {
41   std::streampos size;
42
43   return Dali::Internal::Adaptor::ReadFile(filename, size, memblock, fileType);
44 }
45
46 template<typename T>
47 int ReadFile(const std::string& filename, std::streampos& fileSize, Dali::Vector<T>& memblock, Dali::FileLoader::FileType fileType)
48 {
49   int            errorCode = 0;
50   std::ifstream* file;
51
52   if(fileType == Dali::FileLoader::BINARY)
53   {
54     file = new std::ifstream(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
55   }
56   else if(fileType == Dali::FileLoader::TEXT)
57   {
58     file = new std::ifstream(filename.c_str(), std::ios::in | std::ios::ate);
59   }
60   else
61   {
62     return errorCode;
63   }
64
65   if(file->is_open())
66   {
67     fileSize = file->tellg();
68
69     memblock.ResizeUninitialized(fileSize);
70
71     file->seekg(0, std::ios::beg);
72     file->read(reinterpret_cast<char*>(memblock.Begin()), fileSize);
73     file->close();
74
75     delete file;
76
77     errorCode = 1;
78   }
79   else
80   {
81     char buf[512];
82     DALI_LOG_ERROR("file open failed for: \"%s\", error : %s\n", filename.c_str(), strerror_r(errno, buf, 512));
83   }
84
85   return errorCode;
86 }
87
88 std::streampos GetFileSize(const std::string& filename)
89 {
90   std::streampos size = 0;
91
92   std::ifstream file(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
93   if(file.is_open())
94   {
95     size = file.tellg();
96     file.close();
97   }
98
99   return size;
100 }
101
102 } // namespace Adaptor
103
104 } // namespace Internal
105
106 } // namespace Dali