--- flac-1.1.2\src\libFLAC\metadata_iterators.c 2005-01-25 05:14:50.000000000 +0100 +++ flac\src\libFLAC\metadata_iterators.c 2006-01-22 15:21:12.421875000 +0100 @@ -34,6 +34,10 @@ #include #include +#ifdef WIN32 +#include +#endif + #if defined _MSC_VER || defined __MINGW32__ #include /* for utime() */ #include /* for chmod() */ @@ -396,12 +400,106 @@ return status; } +#ifdef _WIN32 + +LPSTR toANSI(const char *file) +{ + int size = strlen(file) + 1; + LPWSTR lpWideCharStr = (LPWSTR)malloc(sizeof(WCHAR) * size); + if(lpWideCharStr) { + if(MultiByteToWideChar(CP_UTF8, 0, file, -1, lpWideCharStr, size) > 0) { + LPSTR lpAnsiCharStr = (LPSTR)malloc(sizeof(CHAR) * size); + if(lpAnsiCharStr) { + if(WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, -1, lpAnsiCharStr, size, NULL, NULL) > 0) { + free(lpWideCharStr); + return lpAnsiCharStr; + } + free(lpAnsiCharStr); + } + } + free(lpWideCharStr); + } + return NULL; +} + +LPWSTR toUTF16(const char *file) +{ + int size = strlen(file) + 5; + LPWSTR lpWideCharStr = (LPWSTR)malloc(sizeof(WCHAR) * size); + if (lpWideCharStr) { + wcscpy(lpWideCharStr, L"\\\\?\\"); + if (MultiByteToWideChar(CP_UTF8, 0, file, -1, lpWideCharStr + 4, size) > 0) { + return lpWideCharStr; + } + free(lpWideCharStr); + } + return NULL; +} + +#endif + +#include + static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only) { unsigned ret; FLAC__ASSERT(0 != iterator); +#ifdef _WIN32 + if (GetVersion() < 0x80000000) { + LPWSTR lpWideCharStr = toUTF16(iterator->filename); + if(!lpWideCharStr) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + if(read_only || 0 == (iterator->file = _wfopen(lpWideCharStr, L"r+b"))) { + iterator->is_writable = false; + if(read_only || errno == EACCES) { + if(0 == (iterator->file = _wfopen(lpWideCharStr, L"rb"))) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + free(lpWideCharStr); + return false; + } + } + else { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + free(lpWideCharStr); + return false; + } + } + else { + iterator->is_writable = true; + } + free(lpWideCharStr); + } + else { + LPSTR lpAnsiCharStr = toANSI(iterator->filename); + if(!lpAnsiCharStr) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + if(read_only || 0 == (iterator->file = fopen(lpAnsiCharStr, "r+b"))) { + iterator->is_writable = false; + if(read_only || errno == EACCES) { + if(0 == (iterator->file = fopen(lpAnsiCharStr, "rb"))) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + free(lpAnsiCharStr); + return false; + } + } + else { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + free(lpAnsiCharStr); + return false; + } + } + else { + iterator->is_writable = true; + } + free(lpAnsiCharStr); + } +#else if(read_only || 0 == (iterator->file = fopen(iterator->filename, "r+b"))) { iterator->is_writable = false; if(read_only || errno == EACCES) { @@ -418,6 +516,7 @@ else { iterator->is_writable = true; } +#endif ret = seek_to_first_metadata_block_(iterator->file); switch(ret) { @@ -2835,11 +2934,43 @@ strcat(*tempfilename, p); strcat(*tempfilename, tempfile_suffix); } + +#ifdef _WIN32 + if (GetVersion() < 0x80000000) { + LPWSTR lpWideCharStr = toUTF16(*tempfilename); + if (lpWideCharStr) { + free(*tempfilename); + *tempfilename = (char *)lpWideCharStr; + } + } + else { + LPSTR lpAnsiCharStr = toANSI(*tempfilename); + if (lpAnsiCharStr) { + free(*tempfilename); + *tempfilename = (char *)lpAnsiCharStr; + } + } +#endif +#ifdef _WIN32 + if (GetVersion() < 0x80000000) { + if(0 == (*tempfile = _wfopen((LPWSTR)*tempfilename, L"w+b"))) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + } + else { + if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) { + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; + return false; + } + } +#else if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) { *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE; return false; } +#endif return true; } @@ -2857,12 +2988,49 @@ *tempfile = 0; #if defined _MSC_VER || defined __MINGW32__ - if(unlink(filename) < 0) { - cleanup_tempfile_(tempfile, tempfilename); - *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; - return false; - } -#endif + if (GetVersion() < 0x80000000) { + LPWSTR lpWideCharStr = toUTF16(filename); + if (lpWideCharStr) { + if(_wunlink(lpWideCharStr) < 0) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; + return false; + } + if(0 != _wrename((LPWSTR)*tempfilename, lpWideCharStr)) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; + return false; + } + free(lpWideCharStr); + } + else { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + } + else { + LPSTR lpAnsiCharStr = toANSI(filename); + if (lpAnsiCharStr) { + if(unlink(lpAnsiCharStr) < 0) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR; + return false; + } + if(0 != rename(*tempfilename, lpAnsiCharStr)) { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; + return false; + } + free(lpAnsiCharStr); + } + else { + cleanup_tempfile_(tempfile, tempfilename); + *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR; + return false; + } + } +#else /*@@@ to fully support the tempfile_path_prefix we need to update this piece to actually copy across filesystems instead of just rename(): */ if(0 != rename(*tempfilename, filename)) { @@ -2870,6 +3038,7 @@ *status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR; return false; } +#endif cleanup_tempfile_(tempfile, tempfilename); @@ -2884,7 +3053,16 @@ } if(0 != *tempfilename) { +#ifdef _WIN32 + if(GetVersion() < 0x80000000) { + (void)_wunlink((LPWSTR)*tempfilename); + } + else { + (void)unlink(*tempfilename); + } +#else (void)unlink(*tempfilename); +#endif free(*tempfilename); *tempfilename = 0; }