]> git.sesse.net Git - casparcg/blob - common/os/linux/filesystem.cpp
[scene] Fixed element name in XML Schema
[casparcg] / common / os / linux / filesystem.cpp
1 /*
2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
3 *
4 * This file is part of CasparCG (www.casparcg.com).
5 *
6 * CasparCG is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * CasparCG is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * Author: Helge Norberg, helge.norberg@svt.se
20 */
21
22 #include "../../stdafx.h"
23
24 #include "../filesystem.h"
25
26 #include <list>
27
28 #include <boost/filesystem.hpp>
29 #include <boost/algorithm/string.hpp>
30
31 using namespace boost::filesystem;
32
33 namespace caspar {
34
35 boost::optional<std::wstring> find_case_insensitive(const std::wstring& case_insensitive)
36 {
37         path p(case_insensitive);
38
39         if (exists(p))
40                 return case_insensitive;
41
42         p = absolute(p);
43         path result;
44
45         for (auto part : p)
46         {
47                 auto concatenated = result / part;
48
49                 if (exists(concatenated))
50                 {
51                         result = concatenated;
52                 }
53                 else
54                 {
55                         bool found = false;
56
57                         for (auto it = directory_iterator(absolute(result)); it != directory_iterator(); ++it)
58                         {
59                                 auto leaf = it->path().leaf();
60
61                                 if (boost::algorithm::iequals(part.wstring(), leaf.wstring()))
62                                 {
63                                         result = result / leaf;
64                                         found = true;
65                                         break;
66                                 }
67                         }
68
69                         if (!found)
70                                 return boost::none;
71                 }
72         }
73
74         return result.wstring();
75 }
76
77 }