From a0f1e0e9db4b0edee45018c47a08761916af0ce6 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sat, 7 Jun 2008 20:40:48 +0200 Subject: Revised UTF-8 filenames support --- UEngines.pas | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'UEngines.pas') diff --git a/UEngines.pas b/UEngines.pas index 0541316..89fb4dd 100644 --- a/UEngines.pas +++ b/UEngines.pas @@ -37,10 +37,13 @@ const ERRException = -1; ConfDefaultDirCreationMask = 755; + type PDataItem = ^TDataItem; TDataItem = record - AName, LnkPointTo: PChar; + FName: PChar; // ANSI + FDisplayName: PChar; // always-valid UTF-8 + LnkPointTo: PChar; // ANSI ColumnData: array[0..9] of PChar; Size: Int64; UpDir: boolean; @@ -54,7 +57,10 @@ type PDataItemSL = ^TDataItemSL; TDataItemSL = record Stage1: boolean; - AName, LnkPointTo, ADestination: PChar; + FName: PChar; // ANSI + FDisplayName: PChar; // always-valid UTF-8 + LnkPointTo: PChar; // ANSI + ADestination: PChar; Size: Int64; Mode, UID, GID: Cardinal; IsDir, IsLnk, ForceMove, IsOnRO, IsExecutable: boolean; @@ -279,10 +285,13 @@ begin // DebugMsg(['x7']); with Item^ do begin // DebugMsg(['x8']); - AName := nil; + FName := nil; + FDisplayName := nil; LnkPointTo := nil; for i := 0 to Length(ColumnData) - 1 do ColumnData[i] := nil; - AName := strdup(Buf); + FName := strdup(Buf); + FDisplayName := StrToUTF8(Buf); +// FDisplayName := strdup(Buf); // DebugMsg(['x']); StatBuf := Libc.malloc(sizeof(TGlibc_stat64)); Libc.memset(StatBuf, 0, sizeof(TGlibc_stat64)); @@ -305,9 +314,9 @@ begin ModifyTime := UnixTimeToTDateTime(StatBuf^.st_mtim.tv_sec); {$ENDIF} if StatBuf^.st_uid = 4294967295 then UID := getuid - else UID := StatBuf^.st_uid; + else UID := StatBuf^.st_uid; if StatBuf^.st_gid = 4294967295 then GID := getgid - else GID := StatBuf^.st_gid; + else GID := StatBuf^.st_gid; UpDir := False; Selected := False; // DebugMsg(['(II) TLocalTreeEngine.GetListing(APath=', APath, '): freeing StatBuf...']); @@ -545,11 +554,13 @@ var Handle : PDirectoryStream; Item := Libc.malloc(SizeOf(TDataItemSL)); Libc.memset(Item, 0, SizeOf(TDataItemSL)); with Item^ do begin - AName := nil; + FName := nil; + FDisplayName := nil; LnkPointTo := nil; ADestination := nil; Stage1 := AStage1; - AName := strdup(PChar(FPath)); + FName := strdup(PChar(FPath)); + FDisplayName := StrToUTF8(PChar(FPath)); Size := StatBuf_local^.st_size; Mode := StatBuf_local^.st_mode; IsDir := __S_ISTYPE(StatBuf_local^.st_mode, __S_IFDIR); @@ -575,7 +586,7 @@ var Handle : PDirectoryStream; LnkBuf[i] := #0; LnkPointTo := Libc.malloc(i + 1); Libc.memset(LnkPointTo, 0, i + 1); - LnkPointTo := Libc.strncpy(LnkPointTo, @LnkBuf[0], i); + LnkPointTo := Libc.strncpy(LnkPointTo, @LnkBuf[0], i); // StrLCopy(LnkPointTo, @LnkBuf[0], i); end; end; @@ -644,12 +655,14 @@ begin Libc.memset(Result, 0, SizeOf(TDataItemSL)); // DebugMsg(['x1']); with Result^ do begin - AName := nil; + FName := nil; + FDisplayName := nil; LnkPointTo := nil; ADestination := nil; Stage1 := True; // DebugMsg(['x1']); - AName := strdup(PChar(APath)); + FName := strdup(PChar(APath)); + FDisplayName := StrToUTF8(PChar(APath)); Size := StatBuf^.st_size; Mode := StatBuf^.st_mode; IsDir := __S_ISTYPE(StatBuf^.st_mode, __S_IFDIR); @@ -786,7 +799,7 @@ var fsrc, fdest: PIOFile; try Res := True; repeat - DebugMsg(['Copy(sendfile): offset = ', offset, ', BytesDone = ', BytesDone, ', ftell(fsrc) = ', ftell(fsrc)]); + DebugMsg(['Copy(sendfile): offset = ', offset, ', BytesDone = ', BytesDone, ', ftell(fsrc) = ', ftell(fsrc)]); BytesRead := Libc.sendfile(glibc_fileno(fdest), glibc_fileno(fsrc), offset, FBlockSize); if BytesRead = -1 then begin if errno = EINVAL then begin @@ -908,7 +921,7 @@ end; function TLocalTreeEngine.IsOnSameFS(const Path1, Path2: string): boolean; var FStat1, FStat2: PGlibc_stat64; begin - DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '")']); +// DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '")']); Result := False; // Default fallback result (forces copy + delete) FStat1 := Libc.malloc(sizeof(TGlibc_stat64)); FStat2 := Libc.malloc(sizeof(TGlibc_stat64)); @@ -925,7 +938,7 @@ begin Result := FStat1^.st_dev = FStat2^.st_dev; Libc.free(FStat1); Libc.free(FStat2); - DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '") Result = ', Result]); +// DebugMsg(['** TLocalTreeEngine.IsOnSameFS("', Path1, '", "', Path2, '") Result = ', Result]); end; (********************************************************************************************************************************) @@ -1109,7 +1122,8 @@ begin try if Assigned(DataItem) then begin with DataItem^ do begin - if AName <> nil then Libc.free(AName); + if FName <> nil then Libc.free(FName); + if FDisplayName <> nil then Libc.free(FDisplayName); // if Assigned(ADestination) then Dispose(ADestination); if LnkPointTo <> nil then Libc.free(LnkPointTo); end; @@ -1125,7 +1139,8 @@ begin try if Assigned(DataItem) then begin with DataItem^ do begin - if AName <> nil then Libc.free(AName); + if FName <> nil then Libc.free(FName); + if FDisplayName <> nil then Libc.free(FDisplayName); if LnkPointTo <> nil then Libc.free(LnkPointTo); for i := 0 to Length(ColumnData) - 1 do if ColumnData[i] <> nil then Libc.free(ColumnData[i]); -- cgit v1.2.3