summaryrefslogtreecommitdiff
path: root/UEngines.pas
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2008-06-07 20:40:48 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2008-06-07 20:40:48 +0200
commita0f1e0e9db4b0edee45018c47a08761916af0ce6 (patch)
treedc9d05f5772442f61ec913631540b24cf67d5e8a /UEngines.pas
parentecde167da74c86bc047aaf84c5e548cf65a5da98 (diff)
downloadtuxcmd-a0f1e0e9db4b0edee45018c47a08761916af0ce6.tar.xz
Revised UTF-8 filenames supportv0.6.38
Diffstat (limited to 'UEngines.pas')
-rw-r--r--UEngines.pas47
1 files changed, 31 insertions, 16 deletions
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]);