summaryrefslogtreecommitdiff
path: root/lib/win32/emu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/win32/emu.cpp')
-rw-r--r--lib/win32/emu.cpp183
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 (...)
{