--- mp4v2.orig\mp4file.cpp 2005-03-30 21:41:58.000000000 +0200 +++ mp4v2\mp4file.cpp 2006-01-20 22:33:28.687500000 +0100 @@ -29,6 +29,44 @@ */ #include "mp4common.h" +#include + +#ifdef _WIN32 + +LPSTR toANSI(const char *file) +{ + int size = strlen(file) + 1; + LPWSTR lpWideCharStr = new WCHAR[size]; + if(lpWideCharStr) { + if(MultiByteToWideChar(CP_UTF8, 0, file, -1, lpWideCharStr, size) > 0) { + LPSTR lpAnsiCharStr = new CHAR[size]; + if(lpAnsiCharStr) { + if(WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, -1, lpAnsiCharStr, size, NULL, NULL) > 0) { + delete [] lpWideCharStr; + return lpAnsiCharStr; + } + delete [] lpAnsiCharStr; + } + } + } + return NULL; +} + +LPWSTR toUTF16(const char *file) +{ + int size = strlen(file) + 5; + LPWSTR lpWideCharStr = new WCHAR[size]; + if (lpWideCharStr) { + wcscpy(lpWideCharStr, L"\\\\?\\"); + if (MultiByteToWideChar(CP_UTF8, 0, file, -1, lpWideCharStr + 4, size) > 0) { + return lpWideCharStr; + } + delete [] lpWideCharStr; + } + return NULL; +} + +#endif MP4File::MP4File(u_int32_t verbosity) { @@ -362,7 +400,7 @@ #ifdef O_LARGEFILE // UGH! fopen doesn't open a file in 64-bit mode, period. // So we need to use open() and then fdopen() - int fd; + int fd; int flags = O_LARGEFILE; if (strchr(fmode, '+')) { @@ -377,14 +415,51 @@ flags |= O_RDONLY; } } - fd = open(m_fileName, flags, 0666); + +#ifdef _WIN32 + if(GetVersion() < 0x80000000) { + LPWSTR nfile = toUTF16(m_fileName); + if(nfile) { + fd = _wopen(nfile, flags, 0666); + delete [] nfile; + } + } + else { + LPSTR nfile = toANSI(m_fileName); + if(nfile) { + fd = open(nfile, flags, 0666); + delete [] nfile; + } + } +#else + fd = open(m_fileName, flags, 0666); +#endif if (fd >= 0) { m_pFile = fdopen(fd, fmode); } -#else +#else +#ifdef _WIN32 + if(GetVersion() < 0x80000000) { + LPWSTR nfile = toUTF16(m_fileName); + if(nfile) { + WCHAR nmode[8]; + MultiByteToWideChar(CP_UTF8, 0, fmode, -1, nmode, 8); + m_pFile = _wfopen(nfile, nmode); + delete [] nfile; + } + } + else { + LPSTR nfile = toANSI(m_fileName); + if(nfile) { + m_pFile = fopen(nfile, fmode); + delete [] nfile; + } + } +#else m_pFile = fopen(m_fileName, fmode); #endif +#endif if (m_pFile == NULL) { throw new MP4Error(errno, "failed", "MP4Open"); } @@ -592,10 +667,34 @@ int rc; #ifdef _WIN32 - rc = remove(newFileName); - if (rc == 0) { - rc = rename(oldFileName, newFileName); - } + if(GetVersion() < 0x80000000) { + LPWSTR nfile1 = toUTF16(oldFileName); + if(nfile1) { + LPWSTR nfile2 = toUTF16(newFileName); + if(nfile2) { + rc = _wremove(nfile2); + if (rc == 0) { + rc = _wrename(nfile1, nfile2); + } + delete [] nfile2; + } + delete [] nfile1; + } + } + else { + LPSTR nfile1 = toANSI(oldFileName); + if(nfile1) { + LPSTR nfile2 = toANSI(newFileName); + if(nfile2) { + rc = remove(nfile2); + if (rc == 0) { + rc = rename(nfile1, nfile2); + } + delete [] nfile2; + } + delete [] nfile1; + } + } #else rc = rename(oldFileName, newFileName); #endif