1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
3 * ----------------------------------------
4 *
5 * Copyright 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 *//*!
20 * \file
21 * \brief Directory iterator.
22 *//*--------------------------------------------------------------------*/
23
24 #include "deDirectoryIterator.hpp"
25 #include "deString.h"
26
27 #if (DE_DIRITER == DE_DIRITER_WIN32)
28 # include <direct.h> /* _chdir() */
29 # include <io.h> /* _findfirst(), _findnext() */
30 #endif
31
32 namespace de
33 {
34
35 #if (DE_DIRITER == DE_DIRITER_WIN32)
36
DirectoryIterator(const FilePath & path)37 DirectoryIterator::DirectoryIterator (const FilePath& path)
38 : m_path(FilePath::normalize(path))
39 {
40 DE_CHECK_RUNTIME_ERR(m_path.exists());
41 DE_CHECK_RUNTIME_ERR(m_path.getType() == FilePath::TYPE_DIRECTORY);
42
43 m_handle = _findfirst32((std::string(m_path.getPath()) + "/*").c_str(), &m_fileInfo);
44 m_hasItem = m_handle != -1;
45
46 skipCurAndParent();
47 }
48
~DirectoryIterator(void)49 DirectoryIterator::~DirectoryIterator (void)
50 {
51 if (m_handle != -1)
52 _findclose(m_handle);
53 }
54
hasItem(void) const55 bool DirectoryIterator::hasItem (void) const
56 {
57 return m_hasItem;
58 }
59
getItem(void) const60 FilePath DirectoryIterator::getItem (void) const
61 {
62 DE_ASSERT(hasItem());
63 return FilePath::join(m_path, m_fileInfo.name);
64 }
65
next(void)66 void DirectoryIterator::next (void)
67 {
68 m_hasItem = (_findnext32(m_handle, &m_fileInfo) == 0);
69 skipCurAndParent();
70 }
71
skipCurAndParent(void)72 void DirectoryIterator::skipCurAndParent (void)
73 {
74 while (m_hasItem && (deStringEqual(m_fileInfo.name, "..") || deStringEqual(m_fileInfo.name, ".")))
75 m_hasItem = (_findnext32(m_handle, &m_fileInfo) == 0);
76 }
77
78 #elif (DE_DIRITER == DE_DIRITER_POSIX)
79
80 DirectoryIterator::DirectoryIterator (const FilePath& path)
81 : m_path (FilePath::normalize(path))
82 , m_handle (DE_NULL)
83 , m_curEntry(DE_NULL)
84 {
85 DE_CHECK_RUNTIME_ERR(m_path.exists());
86 DE_CHECK_RUNTIME_ERR(m_path.getType() == FilePath::TYPE_DIRECTORY);
87
88 m_handle = opendir(m_path.getPath());
89 DE_CHECK_RUNTIME_ERR(m_handle);
90
91 // Find first entry
92 next();
93 }
94
95 DirectoryIterator::~DirectoryIterator (void)
96 {
97 closedir(m_handle);
98 }
99
100 bool DirectoryIterator::hasItem (void) const
101 {
102 return (m_curEntry != DE_NULL);
103 }
104
105 FilePath DirectoryIterator::getItem (void) const
106 {
107 DE_ASSERT(hasItem());
108 return FilePath::join(m_path, m_curEntry->d_name);
109 }
110
111 void DirectoryIterator::next (void)
112 {
113 do
114 {
115 m_curEntry = readdir(m_handle);
116 } while (m_curEntry && (deStringEqual(m_curEntry->d_name, "..") || deStringEqual(m_curEntry->d_name, ".")));
117 }
118
119 #endif
120
121 } // de
122