И так, борьба продолжается.
1. Сделал через -d UNICODE в проекте. Код при дефайнах меняется, значит параметр отрабатывает, но не компилируется из-за других ошибок в Инди.
2. Начал разбирать код. Увидел, что в IdStackWindows в коде
- Код: Выделить всё
function ServeFile(ASocket: TIdStackSocketHandle; const AFileName: string): Int64;
var
LFileHandle: THandle;
LSize: LARGE_INTEGER;
{$IFDEF STRING_UNICODE_MISMATCH}
LTemp: TIdPlatformString;
{$ENDIF}
begin
Result := 0;
{$IFDEF STRING_UNICODE_MISMATCH}
LTemp := TIdPlatformString(AFileName); // explicit convert to Ansi/Unicode
{$ENDIF}
LFileHandle := CreateFile(
{$IFDEF STRING_UNICODE_MISMATCH}PIdPlatformChar(LTemp){$ELSE}PChar(UTF8toWinCP(AFileName)){$ENDIF}, <--- здесь
GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
если имя файла преобразовать через UTF8toWinCP(), то файл находит.
В своем коде конвертировать имя файла нельзя, так как по пути отработки в модуле iDIOHundlerSocket
- Код: Выделить всё
function TIdIOHandlerSocket.WriteFile(const AFile: String;
AEnableTransferFile: Boolean): Int64;
//TODO: There is a way in linux to dump a file to a socket as well. use it.
{$IFDEF WIN32_OR_WIN64}
var
LOldErrorMode : Integer;
{$ENDIF}
begin
Result := 0;
{$IFDEF WIN32_OR_WIN64}
LOldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
{$ENDIF}
if FileExists(AFile) then begin <---- здесь
if Assigned(GServeFileProc) and (not WriteBufferingActive)
{and (Intercept = nil)} and AEnableTransferFile
FileExists(AFile) после преобразования не находит.
Но проблема еще не решена, так как коряво подставляеться общая информация в заголовок ответа сервера. Разбираюсь дальше.
Или у кого-то есть заведомо-рабочий код без изменений кода Инди?
Добавлено спустя 2 часа 17 минут 50 секунд:Решил проблему по другому.
Так как проблема с уникодом єто не так проблема Инди, как проблема стандартов веба, то решил работать с файлами в виде Percent-encoding. На диске храню в таком виде, и пересылаю в таком виде. А саму информацию о файле отдаю уже в юникоде.