Adaptor refactor
[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
31 #include <cstring>
32
33
34 namespace Dali
35 {
36 namespace Internal
37 {
38 namespace Adaptor
39 {
40
41 SharedFile* SharedFile::New(const char* filename, int size, bool isSystem)
42 {
43   SharedFile *sf = NULL;
44
45   sf = new SharedFile;
46
47   bool opened = sf->OpenFile( filename, size, isSystem );
48   if( !opened )
49   {
50     delete sf;
51     sf = NULL;
52   }
53   return sf;
54 }
55
56 SharedFile::SharedFile()
57 : mFileDescriptor(-1),
58   mSize(0),
59   mAddress(NULL),
60   mFilename()
61 {
62 }
63
64 SharedFile::~SharedFile()
65 {
66   Close();
67 }
68
69 void SharedFile::Close()
70 {
71   if( mAddress != NULL )
72   {
73     munmap( mAddress, mSize );
74     mAddress = NULL;
75   }
76
77   if( mFileDescriptor >= 0 )
78   {
79     close( mFileDescriptor );
80     mFileDescriptor = -1;
81   }
82 }
83
84 unsigned char* SharedFile::GetAddress()
85 {
86   return static_cast<unsigned char *>( mAddress );
87 }
88
89 bool SharedFile::OpenFile(const char* filename, int size, bool isSystem)
90 {
91   bool opened = false;
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 = shm_open( filename, 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