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