rev |
line source |
nuclear@0
|
1 /*
|
nuclear@0
|
2 ---------------------------------------------------------------------------
|
nuclear@0
|
3 Open Asset Import Library (assimp)
|
nuclear@0
|
4 ---------------------------------------------------------------------------
|
nuclear@0
|
5
|
nuclear@0
|
6 Copyright (c) 2006-2012, assimp team
|
nuclear@0
|
7
|
nuclear@0
|
8 All rights reserved.
|
nuclear@0
|
9
|
nuclear@0
|
10 Redistribution and use of this software in source and binary forms,
|
nuclear@0
|
11 with or without modification, are permitted provided that the following
|
nuclear@0
|
12 conditions are met:
|
nuclear@0
|
13
|
nuclear@0
|
14 * Redistributions of source code must retain the above
|
nuclear@0
|
15 copyright notice, this list of conditions and the
|
nuclear@0
|
16 following disclaimer.
|
nuclear@0
|
17
|
nuclear@0
|
18 * Redistributions in binary form must reproduce the above
|
nuclear@0
|
19 copyright notice, this list of conditions and the
|
nuclear@0
|
20 following disclaimer in the documentation and/or other
|
nuclear@0
|
21 materials provided with the distribution.
|
nuclear@0
|
22
|
nuclear@0
|
23 * Neither the name of the assimp team, nor the names of its
|
nuclear@0
|
24 contributors may be used to endorse or promote products
|
nuclear@0
|
25 derived from this software without specific prior
|
nuclear@0
|
26 written permission of the assimp team.
|
nuclear@0
|
27
|
nuclear@0
|
28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
nuclear@0
|
29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
nuclear@0
|
30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
nuclear@0
|
31 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
nuclear@0
|
32 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
nuclear@0
|
33 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
nuclear@0
|
34 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
nuclear@0
|
35 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
nuclear@0
|
36 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
nuclear@0
|
37 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
nuclear@0
|
38 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
nuclear@0
|
39 ---------------------------------------------------------------------------
|
nuclear@0
|
40 */
|
nuclear@0
|
41 /** @file Default implementation of IOSystem using the standard C file functions */
|
nuclear@0
|
42
|
nuclear@0
|
43 #include "AssimpPCH.h"
|
nuclear@0
|
44
|
nuclear@0
|
45 #include <stdlib.h>
|
nuclear@0
|
46 #include "DefaultIOSystem.h"
|
nuclear@0
|
47 #include "DefaultIOStream.h"
|
nuclear@0
|
48
|
nuclear@0
|
49 #ifdef __unix__
|
nuclear@0
|
50 #include <sys/param.h>
|
nuclear@0
|
51 #include <stdlib.h>
|
nuclear@0
|
52 #endif
|
nuclear@0
|
53
|
nuclear@0
|
54 using namespace Assimp;
|
nuclear@0
|
55
|
nuclear@0
|
56 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
57 // Constructor.
|
nuclear@0
|
58 DefaultIOSystem::DefaultIOSystem()
|
nuclear@0
|
59 {
|
nuclear@0
|
60 // nothing to do here
|
nuclear@0
|
61 }
|
nuclear@0
|
62
|
nuclear@0
|
63 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
64 // Destructor.
|
nuclear@0
|
65 DefaultIOSystem::~DefaultIOSystem()
|
nuclear@0
|
66 {
|
nuclear@0
|
67 // nothing to do here
|
nuclear@0
|
68 }
|
nuclear@0
|
69
|
nuclear@0
|
70 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
71 // Tests for the existence of a file at the given path.
|
nuclear@0
|
72 bool DefaultIOSystem::Exists( const char* pFile) const
|
nuclear@0
|
73 {
|
nuclear@0
|
74 FILE* file = ::fopen( pFile, "rb");
|
nuclear@0
|
75 if( !file)
|
nuclear@0
|
76 return false;
|
nuclear@0
|
77
|
nuclear@0
|
78 ::fclose( file);
|
nuclear@0
|
79 return true;
|
nuclear@0
|
80 }
|
nuclear@0
|
81
|
nuclear@0
|
82 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
83 // Open a new file with a given path.
|
nuclear@0
|
84 IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode)
|
nuclear@0
|
85 {
|
nuclear@0
|
86 ai_assert(NULL != strFile);
|
nuclear@0
|
87 ai_assert(NULL != strMode);
|
nuclear@0
|
88
|
nuclear@0
|
89 FILE* file = ::fopen( strFile, strMode);
|
nuclear@0
|
90 if( NULL == file)
|
nuclear@0
|
91 return NULL;
|
nuclear@0
|
92
|
nuclear@0
|
93 return new DefaultIOStream(file, (std::string) strFile);
|
nuclear@0
|
94 }
|
nuclear@0
|
95
|
nuclear@0
|
96 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
97 // Closes the given file and releases all resources associated with it.
|
nuclear@0
|
98 void DefaultIOSystem::Close( IOStream* pFile)
|
nuclear@0
|
99 {
|
nuclear@0
|
100 delete pFile;
|
nuclear@0
|
101 }
|
nuclear@0
|
102
|
nuclear@0
|
103 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
104 // Returns the operation specific directory separator
|
nuclear@0
|
105 char DefaultIOSystem::getOsSeparator() const
|
nuclear@0
|
106 {
|
nuclear@0
|
107 #ifndef _WIN32
|
nuclear@0
|
108 return '/';
|
nuclear@0
|
109 #else
|
nuclear@0
|
110 return '\\';
|
nuclear@0
|
111 #endif
|
nuclear@0
|
112 }
|
nuclear@0
|
113
|
nuclear@0
|
114 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
115 // IOSystem default implementation (ComparePaths isn't a pure virtual function)
|
nuclear@0
|
116 bool IOSystem::ComparePaths (const char* one, const char* second) const
|
nuclear@0
|
117 {
|
nuclear@0
|
118 return !ASSIMP_stricmp(one,second);
|
nuclear@0
|
119 }
|
nuclear@0
|
120
|
nuclear@0
|
121 // maximum path length
|
nuclear@0
|
122 // XXX http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
|
nuclear@0
|
123 #ifdef PATH_MAX
|
nuclear@0
|
124 # define PATHLIMIT PATH_MAX
|
nuclear@0
|
125 #else
|
nuclear@0
|
126 # define PATHLIMIT 4096
|
nuclear@0
|
127 #endif
|
nuclear@0
|
128
|
nuclear@0
|
129 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
130 // Convert a relative path into an absolute path
|
nuclear@0
|
131 inline void MakeAbsolutePath (const char* in, char* _out)
|
nuclear@0
|
132 {
|
nuclear@0
|
133 ai_assert(in && _out);
|
nuclear@0
|
134 char* ret;
|
nuclear@0
|
135 #ifdef _WIN32
|
nuclear@0
|
136 ret = ::_fullpath(_out, in,PATHLIMIT);
|
nuclear@0
|
137 #else
|
nuclear@0
|
138 // use realpath
|
nuclear@0
|
139 ret = realpath(in, _out);
|
nuclear@0
|
140 #endif
|
nuclear@0
|
141 if(!ret) {
|
nuclear@0
|
142 // preserve the input path, maybe someone else is able to fix
|
nuclear@0
|
143 // the path before it is accessed (e.g. our file system filter)
|
nuclear@0
|
144 DefaultLogger::get()->warn("Invalid path: "+std::string(in));
|
nuclear@0
|
145 strcpy(_out,in);
|
nuclear@0
|
146 }
|
nuclear@0
|
147 }
|
nuclear@0
|
148
|
nuclear@0
|
149 // ------------------------------------------------------------------------------------------------
|
nuclear@0
|
150 // DefaultIOSystem's more specialized implementation
|
nuclear@0
|
151 bool DefaultIOSystem::ComparePaths (const char* one, const char* second) const
|
nuclear@0
|
152 {
|
nuclear@0
|
153 // chances are quite good both paths are formatted identically,
|
nuclear@0
|
154 // so we can hopefully return here already
|
nuclear@0
|
155 if( !ASSIMP_stricmp(one,second) )
|
nuclear@0
|
156 return true;
|
nuclear@0
|
157
|
nuclear@0
|
158 char temp1[PATHLIMIT];
|
nuclear@0
|
159 char temp2[PATHLIMIT];
|
nuclear@0
|
160
|
nuclear@0
|
161 MakeAbsolutePath (one, temp1);
|
nuclear@0
|
162 MakeAbsolutePath (second, temp2);
|
nuclear@0
|
163
|
nuclear@0
|
164 return !ASSIMP_stricmp(temp1,temp2);
|
nuclear@0
|
165 }
|
nuclear@0
|
166
|
nuclear@0
|
167 #undef PATHLIMIT
|