Merge pull request #2887 from ilya-lavrenov:ipp_morph_fix
[platform/upstream/opencv.git] / modules / contrib / src / inputoutput.cpp
1 #include "opencv2/contrib.hpp"
2 #include "cvconfig.h"
3
4 #if defined(WIN32) || defined(_WIN32)
5     #include <windows.h>
6     #include <tchar.h>
7 #else
8     #include <dirent.h>
9 #endif
10
11 namespace cv
12 {
13     std::vector<String> Directory::GetListFiles( const String& path, const String & exten, bool addPath )
14     {
15         std::vector<String> list;
16         list.clear();
17         String path_f = path + "/" + exten;
18         #ifdef WIN32
19         #ifdef HAVE_WINRT
20             WIN32_FIND_DATAW FindFileData;
21         #else
22             WIN32_FIND_DATAA FindFileData;
23         #endif
24         HANDLE hFind;
25
26         #ifdef HAVE_WINRT
27             wchar_t wpath[MAX_PATH];
28             size_t copied = mbstowcs(wpath, path_f.c_str(), MAX_PATH);
29             CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
30             hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
31         #else
32             hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
33         #endif
34             if (hFind == INVALID_HANDLE_VALUE)
35             {
36                 return list;
37             }
38             else
39             {
40                 do
41                 {
42                     if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_NORMAL  ||
43                         FindFileData.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE ||
44                         FindFileData.dwFileAttributes == FILE_ATTRIBUTE_HIDDEN  ||
45                         FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM  ||
46                         FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY)
47                     {
48                         char* fname;
49                     #ifdef HAVE_WINRT
50                         char fname_tmp[MAX_PATH] = {0};
51                         size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
52                         CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
53                         fname = fname_tmp;
54                     #else
55                         fname = FindFileData.cFileName;
56                     #endif
57                         if (addPath)
58                             list.push_back(path + "/" + String(fname));
59                         else
60                             list.push_back(String(fname));
61                     }
62                 }
63             #ifdef HAVE_WINRT
64                 while(FindNextFileW(hFind, &FindFileData));
65             #else
66                 while(FindNextFileA(hFind, &FindFileData));
67             #endif
68                 FindClose(hFind);
69             }
70         #else
71             (void)addPath;
72             DIR *dp;
73             struct dirent *dirp;
74             if((dp = opendir(path.c_str())) == NULL)
75             {
76                 return list;
77             }
78
79             while ((dirp = readdir(dp)) != NULL)
80             {
81                 if (dirp->d_type == DT_REG)
82                 {
83                     if (exten.compare("*") == 0)
84                         list.push_back(static_cast<String>(dirp->d_name));
85                     else
86                         if (String(dirp->d_name).find(exten) != String::npos)
87                             list.push_back(static_cast<String>(dirp->d_name));
88                 }
89             }
90             closedir(dp);
91         #endif
92
93         return list;
94     }
95
96     std::vector<String> Directory::GetListFolders( const String& path, const String & exten, bool addPath )
97     {
98         std::vector<String> list;
99         String path_f = path + "/" + exten;
100         list.clear();
101         #ifdef WIN32
102         #ifdef HAVE_WINRT
103             WIN32_FIND_DATAW FindFileData;
104         #else
105             WIN32_FIND_DATAA FindFileData;
106         #endif
107             HANDLE hFind;
108
109         #ifdef HAVE_WINRT
110             wchar_t wpath [MAX_PATH];
111             size_t copied = mbstowcs(wpath, path_f.c_str(), path_f.size());
112             CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
113
114             hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
115         #else
116             hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
117         #endif
118             if (hFind == INVALID_HANDLE_VALUE)
119             {
120                 return list;
121             }
122             else
123             {
124                 do
125                 {
126 #ifdef HAVE_WINRT
127                     if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
128                         wcscmp(FindFileData.cFileName, L".") != 0 &&
129                         wcscmp(FindFileData.cFileName, L"..") != 0)
130 #else
131                     if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
132                         strcmp(FindFileData.cFileName, ".") != 0 &&
133                         strcmp(FindFileData.cFileName, "..") != 0)
134 #endif
135                     {
136                         char* fname;
137                     #ifdef HAVE_WINRT
138                         char fname_tmp[MAX_PATH];
139                         size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
140                         CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
141                         fname = fname_tmp;
142                     #else
143                         fname = FindFileData.cFileName;
144                     #endif
145
146                         if (addPath)
147                             list.push_back(path + "/" + String(fname));
148                         else
149                             list.push_back(String(fname));
150                     }
151                 }
152             #ifdef HAVE_WINRT
153                 while(FindNextFileW(hFind, &FindFileData));
154             #else
155                 while(FindNextFileA(hFind, &FindFileData));
156             #endif
157                 FindClose(hFind);
158             }
159
160         #else
161             (void)addPath;
162             DIR *dp;
163             struct dirent *dirp;
164             if((dp = opendir(path_f.c_str())) == NULL)
165             {
166                 return list;
167             }
168
169             while ((dirp = readdir(dp)) != NULL)
170             {
171                 if (dirp->d_type == DT_DIR &&
172                     strcmp(dirp->d_name, ".") != 0 &&
173                     strcmp(dirp->d_name, "..") != 0 )
174                 {
175                     if (exten.compare("*") == 0)
176                         list.push_back(static_cast<String>(dirp->d_name));
177                     else
178                         if (String(dirp->d_name).find(exten) != String::npos)
179                             list.push_back(static_cast<String>(dirp->d_name));
180                 }
181             }
182             closedir(dp);
183         #endif
184
185         return list;
186     }
187
188     std::vector<String> Directory::GetListFilesR ( const String& path, const String & exten, bool addPath )
189     {
190         std::vector<String> list = Directory::GetListFiles(path, exten, addPath);
191
192         std::vector<String> dirs = Directory::GetListFolders(path, exten, addPath);
193
194         std::vector<String>::const_iterator it;
195         for (it = dirs.begin(); it != dirs.end(); ++it)
196         {
197             std::vector<String> cl = Directory::GetListFiles(*it, exten, addPath);
198             list.insert(list.end(), cl.begin(), cl.end());
199         }
200
201         return list;
202     }
203
204 }