-
Notifications
You must be signed in to change notification settings - Fork 136
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
1,726 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
#include "src/impl.h" | ||
#include "libplatform/impl.h" /* for platform_win32_impl.h which declares Utf8ToFilename */ | ||
#include <windows.h> | ||
|
||
namespace mp4v2 { | ||
using namespace impl; | ||
} | ||
|
||
namespace mp4v2 { namespace platform { namespace io { | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
static DWORD getAttributes ( string path_ ); | ||
|
||
/** | ||
* Call GetFileAttributesW throw exceptions for errors | ||
* | ||
* @param path_ the path to get attributes for | ||
* | ||
* @retval INVALID_FILE_ATTRIBUTES @p path_ doesn't exist | ||
* @retval anything else the attributes of @p path_ | ||
*/ | ||
static DWORD | ||
getAttributes ( string path_ ) | ||
{ | ||
win32::Utf8ToFilename filename(path_); | ||
|
||
if (!filename.IsUTF16Valid()) | ||
{ | ||
// throw an exception to avoid changing the | ||
// signature of this function and dealing with all | ||
// the places it's called. | ||
ostringstream msg; | ||
msg << "can't convert file to UTF-16(" << filename.utf8 << ")"; | ||
throw new Exception(msg.str(),__FILE__,__LINE__,__FUNCTION__); | ||
} | ||
|
||
DWORD attributes = ::GetFileAttributesW(filename); | ||
if( attributes == INVALID_FILE_ATTRIBUTES ) | ||
{ | ||
DWORD last_err = GetLastError(); | ||
|
||
// Distinguish between an error and the path not existing | ||
if ((last_err == ERROR_FILE_NOT_FOUND) || (last_err == ERROR_PATH_NOT_FOUND)) | ||
{ | ||
return attributes; | ||
} | ||
|
||
// Anything else is an error | ||
ostringstream msg; | ||
msg << "GetFileAttributes(" << filename.utf8 << ") failed (" << last_err << ")"; | ||
throw new Exception(msg.str(),__FILE__,__LINE__,__FUNCTION__); | ||
} | ||
|
||
// path exists so return its attributes | ||
return attributes; | ||
} | ||
|
||
bool | ||
FileSystem::exists( string path_ ) | ||
{ | ||
return( getAttributes(path_) != INVALID_FILE_ATTRIBUTES ); | ||
} | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
bool | ||
FileSystem::isDirectory( string path_ ) | ||
{ | ||
DWORD attributes = getAttributes( path_ ); | ||
if( attributes == INVALID_FILE_ATTRIBUTES ) | ||
return false; | ||
|
||
return ( ( attributes & FILE_ATTRIBUTE_DIRECTORY ) == FILE_ATTRIBUTE_DIRECTORY ); | ||
} | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
bool | ||
FileSystem::isFile( string path_ ) | ||
{ | ||
DWORD attributes = getAttributes( path_ ); | ||
if( attributes == INVALID_FILE_ATTRIBUTES ) | ||
return false; | ||
|
||
return ( ( attributes & FILE_ATTRIBUTE_DIRECTORY ) != FILE_ATTRIBUTE_DIRECTORY ); | ||
} | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
bool | ||
FileSystem::getFileSize( string path_, File::Size& size_ ) | ||
{ | ||
win32::Utf8ToFilename filename(path_); | ||
|
||
if (!filename.IsUTF16Valid()) | ||
{ | ||
// The logging is done | ||
return true; | ||
} | ||
|
||
size_ = 0; | ||
WIN32_FILE_ATTRIBUTE_DATA data = {0}; | ||
if( !GetFileAttributesExW( filename, GetFileExInfoStandard, (LPVOID)&data ) ) | ||
{ | ||
log.errorf("%s: GetFileAttributesExW(%s) failed (%d)",__FUNCTION__,filename.utf8.c_str(), | ||
GetLastError()); | ||
return true; | ||
} | ||
|
||
size_ = ( (File::Size)data.nFileSizeHigh << 32 ) | data.nFileSizeLow; | ||
return false; | ||
} | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
bool | ||
FileSystem::rename( string from, string to ) | ||
{ | ||
win32::Utf8ToFilename from_file(from); | ||
win32::Utf8ToFilename to_file(to); | ||
|
||
if (!from_file.IsUTF16Valid() || !to_file.IsUTF16Valid()) | ||
{ | ||
return true; | ||
} | ||
|
||
if (!::MoveFileExW( from_file, to_file, | ||
MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH ) ) | ||
{ | ||
log.errorf("%s: MoveFileExW(%s,%s) failed (%d)",__FUNCTION__,from_file.utf8.c_str(),to_file.utf8.c_str(), | ||
GetLastError()); | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
string FileSystem::DIR_SEPARATOR = "\\"; | ||
string FileSystem::PATH_SEPARATOR = ";"; | ||
|
||
/////////////////////////////////////////////////////////////////////////////// | ||
|
||
}}} // namespace mp4v2::platform::io |
Oops, something went wrong.