-fix local and global usage for DirAccess, fixes #791

please test anyway..
This commit is contained in:
Juan Linietsky 2015-04-18 20:11:33 -03:00
parent b66b86b05e
commit 1de1a04b78
5 changed files with 93 additions and 176 deletions

View File

@ -87,7 +87,7 @@ bool DirAccessUnix::dir_exists(String p_dir) {
if (p_dir.is_rel_path())
p_dir=current_dir+"/"+p_dir;
p_dir=get_current_dir().plus_file(p_dir);
else
p_dir=fix_path(p_dir);
@ -278,9 +278,16 @@ String DirAccessUnix::get_current_dir() {
Error DirAccessUnix::rename(String p_path,String p_new_path) {
p_path=fix_path(p_path);
p_new_path=fix_path(p_new_path);
if (p_path.is_rel_path())
p_path=get_current_dir().plus_file(p_path);
else
p_path=fix_path(p_path);
if (p_new_path.is_rel_path())
p_new_path=get_current_dir().plus_file(p_new_path);
else
p_new_path=fix_path(p_new_path);
return ::rename(p_path.utf8().get_data(),p_new_path.utf8().get_data())==0?OK:FAILED;
}
Error DirAccessUnix::remove(String p_path) {

View File

@ -70,21 +70,11 @@ bool DirAccessWindows::list_dir_begin() {
_cisdir=false;
_cishidden=false;
if (unicode) {
list_dir_end();
p->h = FindFirstFileExW((current_dir+"\\*").c_str(), FindExInfoStandard, &p->fu, FindExSearchNameMatch, NULL, 0);
list_dir_end();
p->h = FindFirstFileExW((current_dir+"\\*").c_str(), FindExInfoStandard, &p->fu, FindExSearchNameMatch, NULL, 0);
return (p->h==INVALID_HANDLE_VALUE);
} else {
return (p->h==INVALID_HANDLE_VALUE);
list_dir_end();
p->h = FindFirstFileExA((current_dir+"\\*").ascii().get_data(), FindExInfoStandard, &p->fu, FindExSearchNameMatch, NULL, 0);
return (p->h==INVALID_HANDLE_VALUE);
}
return false;
}
@ -93,38 +83,20 @@ String DirAccessWindows::get_next() {
if (p->h==INVALID_HANDLE_VALUE)
return "";
if (unicode) {
_cisdir=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
_cishidden=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
_cisdir=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
_cishidden=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
String name=p->fu.cFileName;
String name=p->fu.cFileName;
if (FindNextFileW(p->h, &p->fu) == 0) {
if (FindNextFileW(p->h, &p->fu) == 0) {
FindClose(p->h);
p->h=INVALID_HANDLE_VALUE;
}
return name;
} else {
#ifndef WINRT_ENABLED
_cisdir=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
_cishidden=(p->fu.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN);
String name=p->f.cFileName;
if (FindNextFileA(p->h, &p->f) == 0) {
FindClose(p->h);
p->h=INVALID_HANDLE_VALUE;
}
return name;
#endif
return "";
FindClose(p->h);
p->h=INVALID_HANDLE_VALUE;
}
return name;
}
bool DirAccessWindows::current_is_dir() const {
@ -174,63 +146,37 @@ Error DirAccessWindows::change_dir(String p_dir) {
p_dir=fix_path(p_dir);
if (unicode) {
wchar_t real_current_dir_name[2048];
wchar_t real_current_dir_name[2048];
GetCurrentDirectoryW(2048,real_current_dir_name);
String prev_dir=real_current_dir_name;
SetCurrentDirectoryW(current_dir.c_str());
bool worked=(SetCurrentDirectoryW(p_dir.c_str())!=0);
String base = _get_root_path();
if (base!="") {
GetCurrentDirectoryW(2048,real_current_dir_name);
String prev_dir=real_current_dir_name;
SetCurrentDirectoryW(current_dir.c_str());
bool worked=(SetCurrentDirectoryW(p_dir.c_str())!=0);
String base = _get_root_path();
if (base!="") {
GetCurrentDirectoryW(2048,real_current_dir_name);
String new_dir;
new_dir = String(real_current_dir_name).replace("\\","/");
if (!new_dir.begins_with(base)) {
worked=false;
}
String new_dir;
new_dir = String(real_current_dir_name).replace("\\","/");
if (!new_dir.begins_with(base)) {
worked=false;
}
if (worked) {
GetCurrentDirectoryW(2048,real_current_dir_name);
current_dir=real_current_dir_name; // TODO, utf8 parser
current_dir=current_dir.replace("\\","/");
} //else {
SetCurrentDirectoryW(prev_dir.c_str());
//}
return worked?OK:ERR_INVALID_PARAMETER;
} else {
char real_current_dir_name[2048];
GetCurrentDirectoryA(2048,real_current_dir_name);
String prev_dir=real_current_dir_name;
SetCurrentDirectoryA(current_dir.ascii().get_data());
bool worked=(SetCurrentDirectory(p_dir.ascii().get_data())!=0);
if (worked) {
GetCurrentDirectoryA(2048,real_current_dir_name);
current_dir=real_current_dir_name; // TODO, utf8 parser
current_dir=current_dir.replace("\\","/");
}// else {
SetCurrentDirectoryA(prev_dir.ascii().get_data());
//}
return worked?OK:ERR_INVALID_PARAMETER;
}
return OK;
if (worked) {
GetCurrentDirectoryW(2048,real_current_dir_name);
current_dir=real_current_dir_name; // TODO, utf8 parser
current_dir=current_dir.replace("\\","/");
} //else {
SetCurrentDirectoryW(prev_dir.c_str());
//}
return worked?OK:ERR_INVALID_PARAMETER;
#endif
}
@ -244,36 +190,22 @@ Error DirAccessWindows::make_dir(String p_dir) {
#else
p_dir=fix_path(p_dir);
//p_dir=fix_path(p_dir);
p_dir.replace("/","\\");
bool success;
int err;
if (unicode) {
wchar_t real_current_dir_name[2048];
GetCurrentDirectoryW(2048,real_current_dir_name);
wchar_t real_current_dir_name[2048];
GetCurrentDirectoryW(2048,real_current_dir_name);
SetCurrentDirectoryW(current_dir.c_str());
SetCurrentDirectoryW(current_dir.c_str());
success=CreateDirectoryW(p_dir.c_str(), NULL);
err = GetLastError();
success=CreateDirectoryW(p_dir.c_str(), NULL);
err = GetLastError();
SetCurrentDirectoryW(real_current_dir_name);
} else {
char real_current_dir_name[2048];
GetCurrentDirectoryA(2048,real_current_dir_name);
SetCurrentDirectoryA(current_dir.ascii().get_data());
success=CreateDirectoryA(p_dir.ascii().get_data(), NULL);
err = GetLastError();
SetCurrentDirectoryA(real_current_dir_name);
}
SetCurrentDirectoryW(real_current_dir_name);
if (success) {
return OK;
@ -313,7 +245,7 @@ bool DirAccessWindows::file_exists(String p_file) {
GLOBAL_LOCK_FUNCTION
if (!p_file.is_abs_path())
p_file=get_current_dir()+"/"+p_file;
p_file=get_current_dir().plus_file(p_file);
p_file=fix_path(p_file);
@ -321,73 +253,52 @@ bool DirAccessWindows::file_exists(String p_file) {
WIN32_FILE_ATTRIBUTE_DATA fileInfo;
if (unicode) {
DWORD fileAttr;
DWORD fileAttr;
fileAttr = GetFileAttributesExW(p_file.c_str(), GetFileExInfoStandard, &fileInfo);
if (0 == fileAttr)
return false;
fileAttr = GetFileAttributesExW(p_file.c_str(), GetFileExInfoStandard, &fileInfo);
if (0 == fileAttr)
return false;
return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
return !(fileAttr&FILE_ATTRIBUTE_DIRECTORY);
} else {
DWORD fileAttr;
fileAttr = GetFileAttributesExA(p_file.ascii().get_data(), GetFileExInfoStandard, &fileInfo);
if (0 == 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);
if (p_dir.is_rel_path())
p_dir=get_current_dir().plus_file(p_dir);
else
p_dir=fix_path(p_dir);
p_dir.replace("/","\\");
WIN32_FILE_ATTRIBUTE_DATA fileInfo;
if (unicode) {
DWORD fileAttr;
DWORD fileAttr;
fileAttr = GetFileAttributesExW(p_dir.c_str(), GetFileExInfoStandard, &fileInfo);
if (0 == fileAttr)
return false;
fileAttr = GetFileAttributesExW(p_dir.c_str(), GetFileExInfoStandard, &fileInfo);
if (0 == fileAttr)
return false;
return (fileAttr&FILE_ATTRIBUTE_DIRECTORY);
return (fileAttr&FILE_ATTRIBUTE_DIRECTORY);
} else {
#ifndef WINRT_ENABLED
DWORD fileAttr;
fileAttr = GetFileAttributesExA(p_dir.ascii().get_data(), GetFileExInfoStandard, &fileInfo);
if (0 == fileAttr)
return false;
return (fileAttr&FILE_ATTRIBUTE_DIRECTORY);
#endif
}
return false;
}
Error DirAccessWindows::rename(String p_path,String p_new_path) {
p_path=fix_path(p_path);
p_new_path=fix_path(p_new_path);
if (p_path.is_rel_path())
p_path=get_current_dir().plus_file(p_path);
else
p_path=fix_path(p_path);
if (p_new_path.is_rel_path())
p_new_path=get_current_dir().plus_file(p_new_path);
else
p_new_path=fix_path(p_new_path);
if (file_exists(p_new_path)) {
if (remove(p_new_path) != OK) {
return FAILED;
@ -471,13 +382,6 @@ 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;
change_dir(".");
#endif
}

View File

@ -56,7 +56,7 @@ class DirAccessWindows : public DirAccess {
String current_dir;
bool unicode;
bool _cisdir;
bool _cishidden;

View File

@ -176,7 +176,7 @@ bool DirAccessJAndroid::file_exists(String p_file){
if (current_dir=="")
sd=p_file;
else
sd=current_dir+"/"+p_file;
sd=current_dir.plus_file(p_file);
FileAccessJAndroid *f = memnew(FileAccessJAndroid);
bool exists = f->file_exists(sd);
@ -190,12 +190,19 @@ bool DirAccessJAndroid::dir_exists(String p_dir) {
JNIEnv *env = ThreadAndroid::get_env();
String sd;
if (current_dir=="")
sd=p_dir;
else
sd=current_dir+"/"+p_dir;
else {
if (p_dir.is_rel_path())
sd=current_dir.plus_file(p_dir);
else
sd=fix_path(p_dir);
}
String path=sd.simplify_path();
String path=fix_path(sd).simplify_path();
if (path.begins_with("/"))
path=path.substr(1,path.length());
else if (path.begins_with("res://"))

View File

@ -734,7 +734,6 @@ void EditorSceneImportDialog::_import(bool p_and_open) {
return;
}
print_line("PI REFERENCES "+itos(scr->reference_get_count()));
}