annotate common/directory.cpp @ 23:03068f5ed79d

Misc: various style issues, #419
author David Demelier <markand@malikania.fr>
date Sun, 14 Feb 2016 16:15:48 +0100
parents 1158cffe5a5e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * directory.cpp -- open and read directories
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <sstream>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include "directory.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #if defined(_WIN32)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 # include <Windows.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 # include <cstring>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 # include <cerrno>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 # include <dirent.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 namespace irccd {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #if defined(_WIN32)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 namespace {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 std::string systemError()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 LPSTR error = nullptr;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 std::string errmsg = "Unknown error";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 FormatMessageA(
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 NULL,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 GetLastError(),
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 (LPSTR)&error, 0, NULL);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 if (error) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 errmsg = std::string(error);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 LocalFree(error);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 return errmsg;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
60 } // !namespace
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 void Directory::systemLoad(const std::string &path, int flags)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 std::ostringstream oss;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 HANDLE handle;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 WIN32_FIND_DATA fdata;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 oss << path << "\\*";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 handle = FindFirstFile(oss.str().c_str(), &fdata);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 if (handle == nullptr)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 throw std::runtime_error(systemError());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 do {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 DirectoryEntry entry;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 entry.name = fdata.cFileName;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 if (entry.name == "." && !(flags & Directory::Dot))
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 continue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 if (entry.name == ".." && !(flags & Directory::DotDot))
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 continue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 switch (fdata.dwFileAttributes) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 case FILE_ATTRIBUTE_DIRECTORY:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 entry.type = DirectoryEntry::Dir;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 case FILE_ATTRIBUTE_NORMAL:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 entry.type = DirectoryEntry::File;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 case FILE_ATTRIBUTE_REPARSE_POINT:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 entry.type = DirectoryEntry::Link;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 m_list.push_back(entry);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 } while (FindNextFile(handle, &fdata) != 0);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 FindClose(handle);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 void Directory::systemLoad(const std::string &path, int flags)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 DIR *dp;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 struct dirent *ent;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 if ((dp = opendir(path.c_str())) == nullptr)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
111 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 while ((ent = readdir(dp)) != nullptr) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 DirectoryEntry entry;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 entry.name = ent->d_name;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 if (entry.name == "." && !(flags & Directory::Dot))
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 continue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 if (entry.name == ".." && !(flags & Directory::DotDot))
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 continue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 switch (ent->d_type) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 case DT_DIR:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 entry.type = DirectoryEntry::Dir;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 case DT_REG:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 entry.type = DirectoryEntry::File;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 case DT_LNK:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 entry.type = DirectoryEntry::Link;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 m_list.push_back(entry);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 closedir(dp);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 bool operator==(const DirectoryEntry &e1, const DirectoryEntry &e2)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 return e1.name == e2.name && e1.type == e2.type;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 Directory::Directory()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 Directory::Directory(const std::string &path, int flags)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 systemLoad(path, flags);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 Directory::List::iterator Directory::begin()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 return m_list.begin();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 Directory::List::const_iterator Directory::cbegin() const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 return m_list.cbegin();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 Directory::List::iterator Directory::end()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 return m_list.end();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 Directory::List::const_iterator Directory::cend() const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 return m_list.cend();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 int Directory::count() const
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 return m_list.size();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 bool operator==(const Directory &d1, const Directory &d2)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 return d1.m_list == d2.m_list;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 } // !irccd