summaryrefslogtreecommitdiff
path: root/drivers/windows/dir_access_windows.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/windows/dir_access_windows.cpp')
-rw-r--r--drivers/windows/dir_access_windows.cpp118
1 files changed, 99 insertions, 19 deletions
diff --git a/drivers/windows/dir_access_windows.cpp b/drivers/windows/dir_access_windows.cpp
index 30f6ff6d8c..cac04b68c3 100644
--- a/drivers/windows/dir_access_windows.cpp
+++ b/drivers/windows/dir_access_windows.cpp
@@ -26,7 +26,7 @@
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#ifdef WINDOWS_ENABLED
+#if defined(WINDOWS_ENABLED)
#include "dir_access_windows.h"
@@ -36,6 +36,13 @@
#include <wchar.h>
#include <stdio.h>
#include "print_string.h"
+
+#ifdef WINRT_ENABLED
+#include <Synchapi.h>
+#include <collection.h>
+#include <ppltasks.h>
+#endif
+
/*
[03:57] <reduz> yessopie, so i dont havemak to rely on unicows
@@ -56,6 +63,7 @@ struct DirAccessWindowsPrivate {
WIN32_FIND_DATAW fu; //unicode version
};
+// CreateFolderAsync
bool DirAccessWindows::list_dir_begin() {
@@ -63,13 +71,13 @@ bool DirAccessWindows::list_dir_begin() {
if (unicode) {
list_dir_end();
- p->h = FindFirstFileW((current_dir+"\\*").c_str(), &p->fu);
+ p->h = FindFirstFileExW((current_dir+"\\*").c_str(), FindExInfoStandard, &p->fu, FindExSearchNameMatch, NULL, 0);
return (p->h==INVALID_HANDLE_VALUE);
} else {
list_dir_end();
- p->h = FindFirstFileA((current_dir+"\\*").ascii().get_data(), &p->f);
+ p->h = FindFirstFileExA((current_dir+"\\*").ascii().get_data(), FindExInfoStandard, &p->fu, FindExSearchNameMatch, NULL, 0);
return (p->h==INVALID_HANDLE_VALUE);
@@ -144,6 +152,15 @@ Error DirAccessWindows::change_dir(String p_dir) {
GLOBAL_LOCK_FUNCTION
+#ifdef WINRT_ENABLED
+
+ p_dir = fix_path(p_dir);
+ current_dir = normalize_path(p_dir);
+
+ return OK;
+#else
+
+
p_dir=fix_path(p_dir);
if (unicode) {
@@ -172,9 +189,10 @@ Error DirAccessWindows::change_dir(String p_dir) {
current_dir=real_current_dir_name; // TODO, utf8 parser
current_dir=current_dir.replace("\\","/");
- }
+ } else {
- SetCurrentDirectoryW(prev_dir.c_str());
+ SetCurrentDirectoryW(prev_dir.c_str());
+ }
return worked?OK:ERR_INVALID_PARAMETER;
} else {
@@ -192,22 +210,29 @@ Error DirAccessWindows::change_dir(String p_dir) {
current_dir=real_current_dir_name; // TODO, utf8 parser
current_dir=current_dir.replace("\\","/");
- }
+ } else {
- SetCurrentDirectoryA(prev_dir.ascii().get_data());
+ SetCurrentDirectoryA(prev_dir.ascii().get_data());
+ }
return worked?OK:ERR_INVALID_PARAMETER;
}
return OK;
-
+#endif
}
Error DirAccessWindows::make_dir(String p_dir) {
GLOBAL_LOCK_FUNCTION
+#ifdef WINRT_ENABLED
+
+ return ERR_CANT_CREATE;
+
+#else
+
p_dir=fix_path(p_dir);
p_dir.replace("/","\\");
@@ -248,6 +273,8 @@ Error DirAccessWindows::make_dir(String p_dir) {
};
return ERR_CANT_CREATE;
+
+#endif
}
@@ -274,29 +301,70 @@ bool DirAccessWindows::file_exists(String p_file) {
GLOBAL_LOCK_FUNCTION
- if (!p_file.is_abs_path())
- p_file=get_current_dir()+"/"+p_file;
+ if (!p_file.is_abs_path())
+ p_file=get_current_dir()+"/"+p_file;
+
p_file=fix_path(p_file);
p_file.replace("/","\\");
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+
+ if (unicode) {
+
+ DWORD fileAttr;
+
+ fileAttr = GetFileAttributesExW(p_file.c_str(), GetFileExInfoStandard, &fileInfo);
+ if (0xFFFFFFFF == fileAttr)
+ return false;
+
+ return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
+
+ } else {
+ DWORD fileAttr;
+
+ fileAttr = GetFileAttributesExA(p_file.ascii().get_data(), GetFileExInfoStandard, &fileInfo);
+ if (0xFFFFFFFF == fileAttr)
+ return false;
+
+ return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
+
+ }
+
+ return false;
+}
+
+bool DirAccessWindows::dir_exists(String p_dir) {
+
+ GLOBAL_LOCK_FUNCTION
+
+ if (!p_dir.is_abs_path())
+ p_dir=get_current_dir()+"/"+p_dir;
+
+ p_dir=fix_path(p_dir);
+
+ p_dir.replace("/","\\");
+
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+
if (unicode) {
- DWORD fileAttr;
+ DWORD fileAttr;
- fileAttr = GetFileAttributesW(p_file.c_str());
+ fileAttr = GetFileAttributesExW(p_dir.c_str(), GetFileExInfoStandard, &fileInfo);
if (0xFFFFFFFF == fileAttr)
return false;
- return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
+ return (fileAttr&FILE_ATTRIBUTE_DIRECTORY);
} else {
- DWORD fileAttr;
+ DWORD fileAttr;
- fileAttr = GetFileAttributesA(p_file.ascii().get_data());
+ fileAttr = GetFileAttributesExA(p_dir.ascii().get_data(), GetFileExInfoStandard, &fileInfo);
if (0xFFFFFFFF == fileAttr)
return false;
- return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
+
+ return (fileAttr&FILE_ATTRIBUTE_DIRECTORY);
}
@@ -322,7 +390,8 @@ Error DirAccessWindows::remove(String p_path) {
p_path=fix_path(p_path);
printf("erasing %s\n",p_path.utf8().get_data());
- DWORD fileAttr = GetFileAttributesW(p_path.c_str());
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ DWORD fileAttr = GetFileAttributesExW(p_path.c_str(), GetFileExInfoStandard, &fileInfo);
if (fileAttr == INVALID_FILE_ATTRIBUTES)
return FAILED;
@@ -345,7 +414,8 @@ FileType DirAccessWindows::get_file_type(const String& p_file) const {
DWORD attr;
if (worked) {
- attr = GetFileAttributesW(p_file.c_str());
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ attr = GetFileAttributesExW(p_file.c_str(), GetFileExInfoStandard, &fileInfo);
}
@@ -366,9 +436,18 @@ size_t DirAccessWindows::get_space_left() {
DirAccessWindows::DirAccessWindows() {
p = memnew( DirAccessWindowsPrivate );
+ p->h=INVALID_HANDLE_VALUE;
current_dir=".";
drive_count=0;
+
+#ifdef WINRT_ENABLED
+ Windows::Storage::StorageFolder ^install_folder = Windows::ApplicationModel::Package::Current->InstalledLocation;
+ change_dir(install_folder->Path->Data());
+
+#else
+
+
DWORD mask=GetLogicalDrives();
for (int i=0;i<MAX_DRIVES;i++) {
@@ -382,12 +461,13 @@ DirAccessWindows::DirAccessWindows() {
unicode=true;
+
/* We are running Windows 95/98/ME, so no unicode allowed */
if ( SetCurrentDirectoryW ( L"." ) == FALSE && GetLastError () == ERROR_CALL_NOT_IMPLEMENTED )
unicode=false;
- p->h=INVALID_HANDLE_VALUE;
change_dir(".");
+#endif
}