Merge "Fix a crash on Ubuntu" into devel/master
[platform/core/uifw/dali-adaptor.git] / third-party / windows-platform / Win32File / CustomFile.cpp
1 #include "CustomFile.h"
2
3 extern void* MemFOpen( uint8_t* buffer, size_t dataSize, const char * const mode );
4 extern void MemFClose( const void *fp );
5 extern int MemFRead( void* buf, int eleSize, int count, const void *fp );
6 extern void MemFWrite( void *buf, int size, const void *fp );
7 extern int MemFSeek( const void *fp, int offset, int origin );
8 extern int MemFTell( const void *fp );
9 extern bool MemFEof( const void *fp );
10
11 extern void* OriginalFOpen( const char *name, const char *mode );
12 extern int OriginalFClose( const void *fp );
13 extern int OriginalFRead( void* buf, int eleSize, int count, const void *fp );
14 extern void OriginalFWrite( void *buf, int size, const void *fp );
15 extern void OriginalFWrite( void *buf, int eleSize, int count, const void *fp );
16 extern int OriginalFSeek( const void *fp, int offset, int origin );
17 extern int OriginalFTell( const void *fp );
18 extern bool OriginalFEof( const void *fp );
19
20 namespace
21 {
22 std::string GetRealName(const char* name)
23 {
24   if (nullptr != name && '*' == name[0])
25   {
26     std::string envName;
27
28     const char *p = name + 1;
29
30     while (0 != *p && '*' != *p)
31     {
32       envName.push_back(*p);
33       p++;
34     }
35
36     p++;
37
38     char *envValue = std::getenv(envName.c_str());
39
40     std::string realName;
41     realName = "";
42     realName += envValue;
43     realName += p;
44
45     return realName;
46   }
47   else
48   {
49     return std::string(name);
50   }
51 }
52 } // namespace
53
54 namespace CustomFile
55 {
56 FILE* FOpen( const char *name, const char *mode )
57 {
58   if( NULL != name && '*' == name[0] )
59   {
60     std::string realName = GetRealName( name );
61     FILE* ret = (FILE*)OriginalFOpen( realName.c_str(), mode );
62     if (NULL == ret)
63     {
64       int temp = 0;
65     }
66     return ret;
67   }
68   else
69   {
70     return (FILE*)OriginalFOpen( name, mode );
71   }
72 }
73
74 int FClose( const void* fp )
75 {
76   if( -1 == *( (char*)fp + 4 ) )
77   {
78     MemFClose( fp );
79     return 0;
80   }
81   else
82   {
83     return OriginalFClose( fp );
84   }
85 }
86
87 FILE* FMemopen( void* buffer, size_t dataSize, const char * mode )
88 {
89   return (FILE*)MemFOpen( ( uint8_t*)buffer, dataSize, mode );
90 }
91
92 int FRead( void* buf, int eleSize, int count, const void *fp )
93 {
94   if( -1 == *( (char*)fp + 4 ) )
95   {
96     return MemFRead( buf, eleSize, count, fp );
97   }
98   else
99   {
100     return OriginalFRead( buf, eleSize, count, fp );
101   }
102 }
103
104 void FWrite( void *buf, int size, const void *fp )
105 {
106   if( -1 == *( (char*)fp + 4 ) )
107   {
108     MemFWrite( buf, size, fp );
109   }
110   else
111   {
112     OriginalFWrite( buf, size, fp );
113   }
114 }
115
116 unsigned int FWrite( const char  *buf, unsigned int eleSize, unsigned int count, void *fp )
117 {
118   if( -1 == *( (char*)fp + 4 ) )
119   {
120     MemFWrite( (void*)buf, eleSize * count, fp );
121   }
122   else
123   {
124     OriginalFWrite((void*)buf, eleSize, count, fp );
125   }
126
127   return eleSize * count;
128 }
129
130 int FSeek( const void *fp, int offset, int origin )
131 {
132   if( -1 == *( (char*)fp + 4 ) )
133   {
134     return MemFSeek( fp, offset, origin );
135   }
136   else
137   {
138     return OriginalFSeek( fp, offset, origin );
139   }
140 }
141
142 int FTell( const void *fp )
143 {
144   if( -1 == *( (char*)fp + 4 ) )
145   {
146     return MemFTell( fp );
147   }
148   else
149   {
150     return OriginalFTell( fp );
151   }
152 }
153
154 bool FEof( const void *fp )
155 {
156   if( -1 == *( (char*)fp + 4 ) )
157   {
158     return MemFEof( fp );
159   }
160   else
161   {
162     return OriginalFEof( fp );
163   }
164 }
165 }
166
167 extern "C"
168 {
169 size_t __cdecl fread_for_c( void*  _Buffer, size_t _ElementSize, size_t _ElementCount, void*  _Stream )
170 {
171   return CustomFile::FRead( _Buffer, _ElementSize, _ElementCount, _Stream );
172 }
173
174 void __cdecl fwrite_for_c( void *buf, int size, const void *fp )
175 {
176   CustomFile::FWrite( buf, size, fp );
177 }
178 }