00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00044
00045
00046
00047
00048
00049 #include <recls/recls.h>
00050 #include "recls_string.h"
00051 #include "recls_util.h"
00052
00053
00054 #include <platformstl/platformstl.h>
00055 #include <platformstl/filesystem/filesystem_traits.hpp>
00056 #include <platformstl/filesystem/file_path_buffer.hpp>
00057
00058 #if defined(RECLS_PLATFORM_IS_UNIX)
00059
00060 # include <unixstl/filesystem/glob_sequence.hpp>
00061 # include <unixstl/filesystem/readdir_sequence.hpp>
00062
00063 #elif defined(RECLS_PLATFORM_IS_WIN32)
00064
00065 # include <winstl/filesystem/findfile_sequence.hpp>
00066
00067 #else
00068
00069 # error The platform is not recognised. Only RECLS_PLATFORM_IS_UNIX or RECLS_PLATFORM_IS_WIN32 currently supported
00070
00071 #endif
00072
00073
00074 #ifdef _RECLS_SUPPORTS_MULTIPATTERN
00075 # if !defined(RECLS_PLATFORM_IS_WIN32) || \
00076 !defined(WINSTL_VER_WINSTL_HPP_FINDFILE_SEQUENCE_MAJOR) || \
00077 WINSTL_VER_WINSTL_HPP_FINDFILE_SEQUENCE_MAJOR < 3
00078 # define _RECLS_USING_STLSOFT_SEARCHSPEC_SEQUENCE
00079 # include <stlsoft/filesystem/searchspec_sequence.hpp>
00080 # endif
00081 #endif
00082
00083 #include "ReclsSearch.hpp"
00084
00085
00086
00087
00088
00089 #if !defined(RECLS_NO_NAMESPACE)
00090 namespace recls
00091 {
00092 #endif
00093
00094
00095
00096
00097
00098 class ReclsFileSearchDirectoryNode
00099 : public ReclsSearchDirectoryNode
00100 {
00101 public:
00102 typedef ReclsFileSearchDirectoryNode class_type;
00103 typedef ::platformstl::filesystem_traits<recls_char_t> traits_type;
00104 typedef ::platformstl::basic_file_path_buffer<recls_char_t> file_path_buffer_type;
00105 private:
00107 typedef RECLS_STRING_TEMPLATE_1(recls_char_t) string_type;
00108
00110 #if defined(RECLS_PLATFORM_IS_UNIX)
00111 typedef unixstl_ns_qual(glob_sequence) file_find_sequence_type;
00112 #elif defined(RECLS_PLATFORM_IS_WIN32)
00113 typedef winstl_ns_qual(basic_findfile_sequence)<recls_char_t, traits_type> file_find_sequence_type;
00114 #endif
00115
00117 #if defined(RECLS_PLATFORM_IS_UNIX)
00118 typedef unixstl_ns_qual(readdir_sequence) directory_sequence_type;
00119 #elif defined(RECLS_PLATFORM_IS_WIN32)
00120 typedef file_find_sequence_type directory_sequence_type;
00121 #endif
00122
00124 #ifdef _RECLS_USING_STLSOFT_SEARCHSPEC_SEQUENCE
00125 typedef stlsoft_ns_qual(searchspec_sequence)<file_find_sequence_type> entry_sequence_type;
00126 #else
00127 typedef file_find_sequence_type entry_sequence_type;
00128 #endif
00129
00130
00131 protected:
00132 ReclsFileSearchDirectoryNode( recls_uint32_t flags
00133 , size_t rootDirLen
00134 , recls_char_t const *searchDir
00135 , recls_char_t const *pattern
00136 , hrecls_progress_fn_t pfn
00137 , recls_process_fn_param_t param);
00138 public:
00139 virtual ~ReclsFileSearchDirectoryNode();
00140
00141 static class_type *FindAndCreate(recls_uint32_t flags
00142 , size_t rootDirLen
00143 , recls_char_t const *searchDir
00144 , recls_char_t const *pattern
00145 , hrecls_progress_fn_t pfn
00146 , recls_process_fn_param_t param);
00147
00148 static recls_rc_t Stat( recls_char_t const *path
00149 , recls_uint32_t flags
00150 , recls_info_t *phEntry);
00151
00152
00153 private:
00154 recls_rc_t GetNext();
00155 recls_rc_t GetDetails(recls_info_t *pinfo);
00156 recls_rc_t GetNextDetails(recls_info_t *pinfo);
00157
00158
00159 private:
00160 recls_rc_t Initialise();
00161
00162 #ifdef RECLS_ENFORCING_CONTRACTS
00163 recls_bool_t is_valid() const;
00164 #endif
00165
00167 static int essFlags_from_reclsFlags_(recls_uint32_t flags);
00169 static int dssFlags_from_reclsFlags_(recls_uint32_t flags);
00174 static directory_sequence_type::const_iterator select_iter_if_( unsigned long b
00175 , directory_sequence_type::const_iterator trueVal
00176 , directory_sequence_type::const_iterator falseVal);
00177
00180 static size_t prepare_searchDir_(file_path_buffer_type &buff, recls_char_t const *searchDir);
00181
00182 static recls_info_t CreateEntryInfo(size_t rootDirLen
00183 , recls_char_t const *searchDir
00184 , size_t searchDirLen
00185 , recls_uint32_t flags
00186 , entry_sequence_type::const_iterator it);
00187
00188
00189 private:
00190 recls_info_t m_current;
00191 class_type *m_dnode;
00192 const recls_uint32_t m_flags;
00193 const size_t m_rootDirLen;
00194 file_path_buffer_type m_searchDir;
00195 const size_t m_searchDirLen;
00196 const string_type m_pattern;
00197 directory_sequence_type m_directories;
00198 directory_sequence_type::const_iterator m_directoriesBegin;
00199 entry_sequence_type m_entries;
00200 entry_sequence_type::const_iterator m_entriesBegin;
00201 const hrecls_progress_fn_t m_pfn;
00202 const recls_process_fn_param_t m_param;
00203
00204
00205 private:
00206 ReclsFileSearchDirectoryNode(class_type const &);
00207 class_type &operator =(class_type const &);
00208 };
00209
00210
00211
00212
00213
00214 #if !defined(RECLS_NO_NAMESPACE)
00215 }
00216 #endif
00217
00218