]> git.cworth.org Git - vogl/blob - src/voglcore/vogl_find_files.h
Initial vogl checkin
[vogl] / src / voglcore / vogl_find_files.h
1 /**************************************************************************
2  *
3  * Copyright 2013-2014 RAD Game Tools and Valve Software
4  * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  *
25  **************************************************************************/
26
27 // File: vogl_win32_find_files.h
28 #pragma once
29
30 #include "vogl_core.h"
31
32 namespace vogl
33 {
34     class find_files
35     {
36     public:
37         struct file_desc
38         {
39             inline file_desc()
40                 : m_is_dir(false)
41             {
42             }
43
44             dynamic_string m_fullname; // full filename
45             dynamic_string m_base;     // base path only
46             dynamic_string m_rel;      // relative filename
47             dynamic_string m_name;     // filename only
48             bool m_is_dir;
49
50             inline bool operator==(const file_desc &other) const
51             {
52                 return m_fullname == other.m_fullname;
53             }
54             inline bool operator<(const file_desc &other) const
55             {
56                 return m_fullname < other.m_fullname;
57             }
58
59             inline operator size_t() const
60             {
61                 return m_fullname.get_hash();
62             }
63         };
64
65         typedef vogl::vector<file_desc> file_desc_vec;
66
67         inline find_files()
68         {
69             m_last_error = 0; // S_OK;
70         }
71
72         enum flags
73         {
74             cFlagRecursive = 1,
75             cFlagAllowDirs = 2,
76             cFlagAllowFiles = 4,
77             cFlagAllowHidden = 8
78         };
79
80         bool find(const char *pBasepath, const char *pFilespec, uint flags = cFlagAllowFiles);
81
82         bool find(const char *pSpec, uint flags = cFlagAllowFiles);
83
84         // An HRESULT under Win32. FIXME: Abstract this better?
85         inline int64_t get_last_error() const
86         {
87             return m_last_error;
88         }
89
90         const file_desc_vec &get_files() const
91         {
92             return m_files;
93         }
94
95     private:
96         file_desc_vec m_files;
97
98         // A HRESULT under Win32
99         int64_t m_last_error;
100
101         bool find_internal(const char *pBasepath, const char *pRelpath, const char *pFilespec, uint flags, int level);
102
103     }; // class find_files
104
105 } // namespace vogl