Revert "[Tizen] Add codes for Dali Windows Backend"
[platform/core/uifw/dali-adaptor.git] / dali / internal / system / common / file-closer.h
1 #ifndef _DALI_INTERNAL_PLATFORM_FILECLOSER_H__
2 #define _DALI_INTERNAL_PLATFORM_FILECLOSER_H__
3 /*
4  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 // INTERNAL INCLUDES
21
22 // EXTERNAL INCLUDES
23 #include <cstdio>
24
25 namespace Dali
26 {
27 namespace Internal
28 {
29 namespace Platform
30 {
31
32 /**
33  * Opens files and closes them later even if an exception is thrown.
34  */
35 class FileCloser
36 {
37 protected: // prevent this class being directly instantiated
38
39   /**
40    * @brief Construct a FileCloser guarding a new FILE* for accessing the path passed in.
41    */
42   FileCloser( const char * const filename, const char * const mode )
43   : mFile(fopen(filename, mode))
44   {
45     DALI_ASSERT_DEBUG( filename != 0 && "Cant open a null filename." );
46     DALI_ASSERT_DEBUG( mode != 0 && "Null mode is undefined behaviour in spec." );
47
48     if( mFile == 0 )
49     {
50       DALI_LOG_WARNING( "File open failed for: \"%s\" in mode: \"%s\".\n", filename, mode );
51     }
52   }
53
54   /**
55    * @brief Construct a FileCloser guarding a FILE* for reading out of the memory buffer passed in.
56    */
57   FileCloser( uint8_t* buffer, size_t dataSize, const char * const mode )
58   : mFile( fmemopen( buffer, dataSize, mode) )
59   {
60   }
61
62   FileCloser( Dali::Vector<uint8_t>& vector, size_t dataSize, const char * const mode )
63   {
64     // Resize the buffer to ensure any null that gets written by
65     // fmemopen is written past the end of any data that is written to the buffer.
66     // (Workaround for a bug in Ubuntu that overwrites null to the last byte of the
67     // data block regardless of whether binary mode was specified. Tizen doesn't write
68     // null if binary mode is specified).
69     size_t bufferSize = dataSize;
70     ++bufferSize;
71     vector.Resize( bufferSize );
72
73     void * const buffer = &vector[0];
74     mFile = fmemopen( buffer, bufferSize, mode );
75
76     DALI_ASSERT_DEBUG( buffer != 0 && "Cant open file on null buffer." );
77     DALI_ASSERT_DEBUG( dataSize > 0 && "Pointless to open file on empty buffer." );
78     DALI_ASSERT_DEBUG( mode != 0 && "Null mode is undefined behaviour in spec." );
79
80     if( mFile == 0 )
81     {
82       DALI_LOG_WARNING( "File open failed for memory buffer at location: \"%p\", of size: \"%u\", in mode: \"%s\".\n", static_cast<void*>(buffer), static_cast<unsigned>(dataSize), mode );
83     }
84   }
85
86    /**
87     * @brief Destroy the FileCloser and clean up its FILE*.
88     */
89   ~FileCloser()
90   {
91     if( mFile != 0 )
92     {
93       const int closeFailed = fclose( mFile );
94
95       if ( closeFailed )
96       {
97         DALI_LOG_WARNING( "File close failed for FILE: \"%p\".\n", static_cast<void*>(mFile) );
98       }
99       mFile = 0;
100     }
101   }
102
103 public:
104   /**
105    * @return The FILE* guarded by this object.
106    */
107   FILE* GetFile()
108   {
109     return mFile;
110   }
111
112 private:
113
114   // Undefined
115   FileCloser( const FileCloser& fileCloser );
116
117   // Undefined
118   FileCloser& operator=( const FileCloser& fileCloser );
119
120 private:
121   FILE* mFile;
122 };
123
124 } /* namespace Platform */
125 } /* namespace Internal */
126 } /* namespace Dali */
127
128 #endif /* _DALI_INTERNAL_PLATFORM_FILECLOSER_H__ */