Add support of writing DALi cache file for Android.
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / common / shared-file.cpp
1 /*
2  * Copyright (c) 2014 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/internal/system/common/shared-file.h>
20
21 // EXTERNAL INCLUDES
22 #include <sys/types.h>
23 #include <unistd.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <sys/stat.h>
27 #include <fcntl.h>
28 #include <sys/file.h>
29 #include <sys/mman.h>
30 #include <cstring>
31
32
33 namespace Dali
34 {
35 namespace Internal
36 {
37 namespace Adaptor
38 {
39
40 SharedFile* SharedFile::New(const char* filename, int size, bool isSystem)
41 {
42   SharedFile *sf = NULL;
43
44   sf = new SharedFile;
45
46   bool opened = sf->OpenFile( filename, size, isSystem );
47   if( !opened )
48   {
49     delete sf;
50     sf = NULL;
51   }
52   return sf;
53 }
54
55 SharedFile::SharedFile()
56 : mFileDescriptor(-1),
57   mSize(0),
58   mAddress(NULL),
59   mFilename()
60 {
61 }
62
63 SharedFile::~SharedFile()
64 {
65   Close();
66 }
67
68 void SharedFile::Close()
69 {
70   if( mAddress != NULL )
71   {
72     munmap( mAddress, mSize );
73     mAddress = NULL;
74   }
75
76   if( mFileDescriptor >= 0 )
77   {
78     close( mFileDescriptor );
79     mFileDescriptor = -1;
80   }
81 }
82
83 unsigned char* SharedFile::GetAddress()
84 {
85   return static_cast<unsigned char *>( mAddress );
86 }
87
88 bool SharedFile::OpenFile(const char* filename, int size, bool isSystem)
89 {
90   bool opened = false;
91
92   mode_t mode;
93
94   mode = S_IRUSR | S_IWUSR;
95   if( isSystem )
96   {
97     mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
98   }
99
100   mFileDescriptor = Open( filename, size, O_RDONLY, mode );
101
102   if( mFileDescriptor >= 0 )
103   {
104     mFilename = filename;
105
106     mSize = size;
107     mAddress = mmap( NULL, mSize, PROT_READ, MAP_SHARED, mFileDescriptor, 0 );
108
109 // MAP_FAILED is a macro with C cast
110 #pragma GCC diagnostic push
111 #pragma GCC diagnostic ignored "-Wold-style-cast"
112     if( mAddress != MAP_FAILED )
113     {
114       opened = true;
115     }
116 #pragma GCC diagnostic pop
117   }
118   return opened;
119 }
120
121 } // Adaptor
122 } // Internal
123 } // Dali