Cycles: svn merge -r39870:r40266 https://svn.blender.org/svnroot/bf-blender/trunk...
[blender-staging.git] / intern / cycles / util / util_path.cpp
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #include "util_debug.h"
20 #include "util_md5.h"
21 #include "util_path.h"
22 #include "util_string.h"
23
24 #include <OpenImageIO/sysutil.h>
25 OIIO_NAMESPACE_USING
26
27 #include <stdio.h>
28
29 #define BOOST_FILESYSTEM_VERSION 2
30
31 #include <boost/filesystem.hpp> 
32 #include <boost/algorithm/string.hpp>
33
34 CCL_NAMESPACE_BEGIN
35
36 static string cached_path = "";
37 static string cached_user_path = "";
38
39 void path_init(const string& path, const string& user_path)
40 {
41         cached_path = path;
42         cached_user_path = user_path;
43 }
44
45 string path_get(const string& sub)
46 {
47         if(cached_path == "")
48                 cached_path = path_dirname(Sysutil::this_program_path());
49
50         return path_join(cached_path, sub);
51 }
52
53 string path_user_get(const string& sub)
54 {
55         if(cached_user_path == "")
56                 cached_user_path = path_dirname(Sysutil::this_program_path());
57
58         return path_join(cached_user_path, sub);
59 }
60
61 string path_filename(const string& path)
62 {
63         return boost::filesystem::path(path).filename();
64 }
65
66 string path_dirname(const string& path)
67 {
68         return boost::filesystem::path(path).parent_path().string();
69 }
70
71 string path_join(const string& dir, const string& file)
72 {
73         return (boost::filesystem::path(dir) / boost::filesystem::path(file)).string();
74 }
75
76 string path_escape(const string& path)
77 {
78         string result = path;
79         boost::replace_all(result, " ", "\\ ");
80         return result;
81 }
82
83 bool path_exists(const string& path)
84 {
85         return boost::filesystem::exists(path);
86 }
87
88 string path_files_md5_hash(const string& dir)
89 {
90         /* computes md5 hash of all files in the directory */
91         MD5Hash hash;
92
93         if(boost::filesystem::exists(dir)) {
94                 boost::filesystem::directory_iterator it(dir), it_end;
95
96                 for(; it != it_end; it++) {
97                         if(boost::filesystem::is_directory(it->status())) {
98                                 path_files_md5_hash(it->path().string());
99                         }
100                         else {
101                                 string filepath = it->path().string();
102
103                                 hash.append((const uint8_t*)filepath.c_str(), filepath.size());
104                                 hash.append_file(filepath);
105                         }
106                 }
107         }
108
109         return hash.get_hex();
110 }
111
112 void path_create_directories(const string& path)
113 {
114         boost::filesystem::create_directories(path_dirname(path));
115 }
116
117 bool path_write_binary(const string& path, const vector<uint8_t>& binary)
118 {
119         path_create_directories(path);
120
121         /* write binary file from memory */
122         FILE *f = fopen(path.c_str(), "wb");
123
124         if(!f)
125                 return false;
126
127         if(binary.size() > 0)
128                 fwrite(&binary[0], sizeof(uint8_t), binary.size(), f);
129
130         fclose(f);
131
132         return true;
133 }
134
135 bool path_read_binary(const string& path, vector<uint8_t>& binary)
136 {
137         binary.resize(boost::filesystem::file_size(path));
138
139         /* read binary file into memory */
140         FILE *f = fopen(path.c_str(), "rb");
141
142         if(!f)
143                 return false;
144
145         if(binary.size() == 0) {
146                 fclose(f);
147                 return false;
148         }
149
150         if(fread(&binary[0], sizeof(uint8_t), binary.size(), f) != binary.size()) {
151                 fclose(f);
152                 return false;
153         }
154
155         fclose(f);
156
157         return true;
158 }
159
160 CCL_NAMESPACE_END
161