diff options
Diffstat (limited to 'lib/win32/emu.cpp')
-rw-r--r-- | lib/win32/emu.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/lib/win32/emu.cpp b/lib/win32/emu.cpp index db9974d2..9b5159cf 100644 --- a/lib/win32/emu.cpp +++ b/lib/win32/emu.cpp @@ -1,8 +1,11 @@ // Box Backup Win32 native port by Nick Knight +<<<<<<< HEAD // Need at least 0x0500 to use GetFileSizeEx on Cygwin/MinGW #define WINVER 0x0500 +======= +>>>>>>> 0.12 #include "emu.h" #ifdef WIN32 @@ -82,9 +85,12 @@ bool EnableBackupRights() return true; } +<<<<<<< HEAD // forward declaration char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage); +======= +>>>>>>> 0.12 // -------------------------------------------------------------------------- // // Function @@ -246,7 +252,11 @@ char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage) { ::syslog(LOG_WARNING, "Failed to convert wide string to narrow: " +<<<<<<< HEAD "error %d", GetLastError()); +======= + "%s", GetErrorMessage(GetLastError()).c_str()); +>>>>>>> 0.12 errno = EINVAL; return NULL; } @@ -278,7 +288,11 @@ char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage) { ::syslog(LOG_WARNING, "Failed to convert wide string to narrow: " +<<<<<<< HEAD "error %i", GetLastError()); +======= + "%s", GetErrorMessage(GetLastError()).c_str()); +>>>>>>> 0.12 errno = EACCES; delete [] buffer; return NULL; @@ -287,6 +301,72 @@ char* ConvertFromWideString(const WCHAR* pString, unsigned int codepage) return buffer; } +<<<<<<< HEAD +======= +bool ConvertFromWideString(const std::wstring& rInput, + std::string* pOutput, unsigned int codepage) +{ + int len = WideCharToMultiByte + ( + codepage, // destination code page + 0, // character-type options + rInput.c_str(), // string to map + rInput.size(), // number of bytes in string - auto detect + NULL, // output buffer + 0, // size of buffer - work out + // how much space we need + NULL, // replace unknown chars with system default + NULL // don't tell us when that happened + ); + + if (len == 0) + { + ::syslog(LOG_WARNING, + "Failed to convert wide string to narrow: " + "%s", GetErrorMessage(GetLastError()).c_str()); + errno = EINVAL; + return false; + } + + char* buffer = new char[len]; + + if (buffer == NULL) + { + ::syslog(LOG_WARNING, + "Failed to convert wide string to narrow: " + "out of memory"); + errno = ENOMEM; + return false; + } + + len = WideCharToMultiByte + ( + codepage, // source code page + 0, // character-type options + rInput.c_str(), // string to map + rInput.size(), // number of bytes in string - auto detect + buffer, // output buffer + len, // size of buffer + NULL, // replace unknown chars with system default + NULL // don't tell us when that happened + ); + + if (len == 0) + { + ::syslog(LOG_WARNING, + "Failed to convert wide string to narrow: " + "%s", GetErrorMessage(GetLastError()).c_str()); + errno = EACCES; + delete [] buffer; + return false; + } + + *pOutput = std::string(buffer, len); + delete [] buffer; + return true; +} + +>>>>>>> 0.12 // -------------------------------------------------------------------------- // // Function @@ -391,7 +471,19 @@ std::string ConvertPathToAbsoluteUnicode(const char *pFileName) return tmpStr; } +<<<<<<< HEAD if (filename.length() > 2 && filename[0] == '\\' && +======= + if (filename.length() > 4 && filename[0] == '\\' && + filename[1] == '\\' && filename[2] == '?' && + filename[3] == '\\') + { + // File is already in absolute utf-8 format, e.g. + // \\?\GLOBALROOT\... + tmpStr = ""; + } + else if (filename.length() > 2 && filename[0] == '\\' && +>>>>>>> 0.12 filename[1] == '\\') { tmpStr += "UNC\\"; @@ -401,16 +493,27 @@ std::string ConvertPathToAbsoluteUnicode(const char *pFileName) } else if (filename.length() >= 1 && filename[0] == '\\') { +<<<<<<< HEAD // root directory of current drive. +======= + // starts with \, i.e. root directory of current drive. +>>>>>>> 0.12 tmpStr = wd; tmpStr.resize(2); // drive letter and colon } else if (filename.length() >= 2 && filename[1] != ':') { +<<<<<<< HEAD // Must be relative. We need to get the // current directory to make it absolute. tmpStr += wd; if (tmpStr[tmpStr.length()] != '\\') +======= + // Must be a relative path. We need to get the + // current directory to make it absolute. + tmpStr += wd; + if (tmpStr[tmpStr.length()-1] != '\\') +>>>>>>> 0.12 { tmpStr += '\\'; } @@ -439,7 +542,11 @@ std::string ConvertPathToAbsoluteUnicode(const char *pFileName) ""); } +<<<<<<< HEAD i = lastSlash; +======= + i = lastSlash - 1; +>>>>>>> 0.12 } } @@ -654,7 +761,11 @@ int emu_fstat(HANDLE hdir, struct emu_stat * st) { conv.HighPart = fi.nFileSizeHigh; conv.LowPart = fi.nFileSizeLow; +<<<<<<< HEAD st->st_size = (_off_t)conv.QuadPart; +======= + st->st_size = conv.QuadPart; +>>>>>>> 0.12 } // at the mo @@ -988,7 +1099,11 @@ DIR *opendir(const char *name) std::string dirName(name); //append a '\' win32 findfirst is sensitive to this +<<<<<<< HEAD if ( dirName[dirName.size()] != '\\' || dirName[dirName.size()] != '/' ) +======= + if (dirName[dirName.size()-1] != '\\' || dirName[dirName.size()-1] != '/') +>>>>>>> 0.12 { dirName += '\\'; } @@ -1012,15 +1127,26 @@ DIR *opendir(const char *name) return NULL; } +<<<<<<< HEAD pDir->fd = _wfindfirst((const wchar_t*)pDir->name, &(pDir->info)); if (pDir->fd == -1) +======= + pDir->fd = FindFirstFileW(pDir->name, &pDir->info); + DWORD tmp = GetLastError(); + + if (pDir->fd == INVALID_HANDLE_VALUE) +>>>>>>> 0.12 { delete [] pDir->name; delete pDir; return NULL; } +<<<<<<< HEAD +======= + +>>>>>>> 0.12 pDir->result.d_name = 0; return pDir; } @@ -1043,6 +1169,7 @@ struct dirent *readdir(DIR *dp) { struct dirent *den = NULL; +<<<<<<< HEAD if (dp && dp->fd != -1) { if (!dp->result.d_name || @@ -1052,10 +1179,25 @@ struct dirent *readdir(DIR *dp) std::wstring input(dp->info.name); memset(tempbuff, 0, sizeof(tempbuff)); WideCharToMultiByte(CP_UTF8, 0, dp->info.name, +======= + if (dp && dp->fd != INVALID_HANDLE_VALUE) + { + // first time around, when dp->result.d_name == NULL, use + // the values returned by FindFirstFile. After that, call + // FindNextFileW to return new ones. + if (!dp->result.d_name || + FindNextFileW(dp->fd, &dp->info) != 0) + { + den = &dp->result; + std::wstring input(dp->info.cFileName); + memset(tempbuff, 0, sizeof(tempbuff)); + WideCharToMultiByte(CP_UTF8, 0, dp->info.cFileName, +>>>>>>> 0.12 -1, &tempbuff[0], sizeof (tempbuff), NULL, NULL); //den->d_name = (char *)dp->info.name; den->d_name = &tempbuff[0]; +<<<<<<< HEAD if (dp->info.attrib & FILE_ATTRIBUTE_DIRECTORY) { den->d_type = S_IFDIR; @@ -1063,6 +1205,23 @@ struct dirent *readdir(DIR *dp) else { den->d_type = S_IFREG; +======= + den->d_type = dp->info.dwFileAttributes; + } + else // FindNextFileW failed + { + // Why did it fail? No more files? + winerrno = GetLastError(); + den = NULL; + + if (winerrno == ERROR_NO_MORE_FILES) + { + errno = 0; // no more files + } + else + { + errno = ENOSYS; +>>>>>>> 0.12 } } } @@ -1070,6 +1229,10 @@ struct dirent *readdir(DIR *dp) { errno = EBADF; } +<<<<<<< HEAD +======= + +>>>>>>> 0.12 return den; } catch (...) @@ -1091,24 +1254,44 @@ int closedir(DIR *dp) { try { +<<<<<<< HEAD int finres = -1; if (dp) { if(dp->fd != -1) { finres = _findclose(dp->fd); +======= + BOOL finres = false; + + if (dp) + { + if(dp->fd != INVALID_HANDLE_VALUE) + { + finres = FindClose(dp->fd); +>>>>>>> 0.12 } delete [] dp->name; delete dp; } +<<<<<<< HEAD if (finres == -1) // errors go to EBADF { errno = EBADF; } return finres; +======= + if (finres == FALSE) // errors go to EBADF + { + winerrno = GetLastError(); + errno = EBADF; + } + + return (finres == TRUE) ? 0 : -1; +>>>>>>> 0.12 } catch (...) { |