diff options
| author | Carl Hetherington <cth@carlh.net> | 2012-12-01 18:51:07 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2012-12-01 18:51:07 +0000 |
| commit | 5edd130eafacda6233df537a76a3c1fe69c7e660 (patch) | |
| tree | 10cce1b97051fff356977a19285d00a3c8642e0a /asdcplib/src/KM_fileio.cpp | |
| parent | 56f27201d8d882a4064a69314c78e1fcf1b0bb77 (diff) | |
Reimplement Kumu::DirScanner using boost to avoid dependency on msvcr100 on Windows.
Diffstat (limited to 'asdcplib/src/KM_fileio.cpp')
| -rw-r--r-- | asdcplib/src/KM_fileio.cpp | 184 |
1 files changed, 18 insertions, 166 deletions
diff --git a/asdcplib/src/KM_fileio.cpp b/asdcplib/src/KM_fileio.cpp index 4bc92af7..b13d8ba2 100644 --- a/asdcplib/src/KM_fileio.cpp +++ b/asdcplib/src/KM_fileio.cpp @@ -1211,186 +1211,38 @@ Kumu::WriteBufferIntoFile(const Kumu::ByteString& Buffer, const std::string& Fil //------------------------------------------------------------------------------------------ // - -// Win32 directory scanner -// -#ifdef KM_WIN32 - -// -Kumu::DirScanner::DirScanner(void) : m_Handle(-1) {} - -// -// -Result_t -Kumu::DirScanner::Open(const char* filename) -{ - KM_TEST_NULL_STR_L(filename); - - // we need to append a '*' to read the entire directory - ui32_t fn_len = strlen(filename); - char* tmp_file = (char*)malloc(fn_len + 8); - - if ( tmp_file == 0 ) - return RESULT_ALLOC; - - strcpy(tmp_file, filename); - char* p = &tmp_file[fn_len] - 1; - - if ( *p != '/' && *p != '\\' ) - { - p++; - *p++ = '/'; - } - - *p++ = '*'; - *p = 0; - // whew... - - m_Handle = _findfirsti64(tmp_file, &m_FileInfo); - Result_t result = RESULT_OK; - - if ( m_Handle == -1 ) - result = RESULT_NOT_FOUND; - - return result; -} - - -// -// -Result_t -Kumu::DirScanner::Close() +Kumu::DirScanner::DirScanner() { - if ( m_Handle == -1 ) - return RESULT_FILEOPEN; - - if ( _findclose((long)m_Handle) == -1 ) - return RESULT_FAIL; - - m_Handle = -1; - return RESULT_OK; -} - - -// This sets filename param to the same per-instance buffer every time, so -// the value will change on the next call -Result_t -Kumu::DirScanner::GetNext(char* filename) -{ - KM_TEST_NULL_L(filename); - - if ( m_Handle == -1 ) - return RESULT_FILEOPEN; - - if ( m_FileInfo.name[0] == '\0' ) - return RESULT_ENDOFFILE; - - strncpy(filename, m_FileInfo.name, MaxFilePath); - Result_t result = RESULT_OK; - - if ( _findnexti64((long)m_Handle, &m_FileInfo) == -1 ) - { - m_FileInfo.name[0] = '\0'; - - if ( errno != ENOENT ) - result = RESULT_FAIL; - } - return result; } - -#else // KM_WIN32 - -// POSIX directory scanner - -// -Kumu::DirScanner::DirScanner(void) : m_Handle(NULL) {} - -// Result_t -Kumu::DirScanner::Open(const char* filename) +Kumu::DirScanner::Open (const char* filename) { - KM_TEST_NULL_STR_L(filename); - - Result_t result = RESULT_OK; + KM_TEST_NULL_L (filename); - if ( ( m_Handle = opendir(filename) ) == NULL ) - { - switch ( errno ) - { - case ENOENT: - case ENOTDIR: - result = RESULT_NOTAFILE; - case EACCES: - result = RESULT_NO_PERM; - case ELOOP: - case ENAMETOOLONG: - result = RESULT_PARAM; - case EMFILE: - case ENFILE: - result = RESULT_STATE; - default: - DefaultLogSink().Error("DirScanner::Open(%s): %s\n", filename, strerror(errno)); - result = RESULT_FAIL; + if (!boost::filesystem::is_directory(filename)) { + return RESULT_NOT_FOUND; } - } - - return result; -} - - -// -Result_t -Kumu::DirScanner::Close() -{ - if ( m_Handle == NULL ) - return RESULT_FILEOPEN; - - if ( closedir(m_Handle) == -1 ) { - switch ( errno ) - { - case EBADF: - case EINTR: - return RESULT_STATE; - default: - DefaultLogSink().Error("DirScanner::Close(): %s\n", strerror(errno)); - return RESULT_FAIL; - } - } - - m_Handle = NULL; - return RESULT_OK; + + _iterator = boost::filesystem::directory_iterator (filename); + return RESULT_OK; } - -// Result_t -Kumu::DirScanner::GetNext(char* filename) +Kumu::DirScanner::GetNext (char* filename) { - KM_TEST_NULL_L(filename); - - if ( m_Handle == NULL ) - return RESULT_FILEOPEN; - - struct dirent* entry; - - for (;;) - { - if ( ( entry = readdir(m_Handle)) == NULL ) - return RESULT_ENDOFFILE; - - break; - } - - strncpy(filename, entry->d_name, MaxFilePath); - return RESULT_OK; + KM_TEST_NULL_L (filename); + + if (_iterator == boost::filesystem::directory_iterator()) { + return RESULT_ENDOFFILE; + } + + strncpy (filename, boost::filesystem::path(*_iterator).filename().generic_string().c_str(), MaxFilePath); + ++_iterator; + return RESULT_OK; } - -#endif // KM_WIN32 - - //------------------------------------------------------------------------------------------ // |
