瀏覽代碼

+ add Delphi-compatible FileGetSymLinkTarget functions to all platforms (currently returns False on all platforms); this also includes TSymLinkRec variants for both RawByteString and UnicodeString

git-svn-id: trunk@39669 -
svenbarth 7 年之前
父節點
當前提交
09e5f463dc

+ 6 - 0
rtl/amicommon/sysutils.pp

@@ -396,6 +396,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 var
   tmpLock: BPTR;

+ 6 - 0
rtl/atari/sysutils.pp

@@ -216,6 +216,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 var
   Attr: longint;

+ 6 - 0
rtl/embedded/sysutils.pp

@@ -135,6 +135,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 Begin
   result := false;

+ 6 - 0
rtl/emx/sysutils.pp

@@ -661,6 +661,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;

+ 6 - 0
rtl/gba/sysutils.pp

@@ -146,6 +146,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 Begin
   result := false;

+ 6 - 0
rtl/go32v2/sysutils.pp

@@ -298,6 +298,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;

+ 6 - 0
rtl/macos/sysutils.pp

@@ -210,6 +210,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 
   (*

+ 6 - 0
rtl/msdos/sysutils.pp

@@ -303,6 +303,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;

+ 6 - 0
rtl/nativent/sysutils.pp

@@ -320,6 +320,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists(const FileName: UnicodeString; FollowLink : Boolean): Boolean;
 var
   ntstr: UNICODE_STRING;

+ 6 - 0
rtl/nds/sysutils.pp

@@ -179,6 +179,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 var
   SystemFileName: RawByteString;

+ 6 - 0
rtl/netware/sysutils.pp

@@ -230,6 +230,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 VAR Info : NWStatBufT;
     SystemFileName: RawByteString;

+ 6 - 0
rtl/netwlibc/sysutils.pp

@@ -218,6 +218,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 VAR Info : TStat;
     SystemFileName: RawByteString;

+ 68 - 4
rtl/objpas/sysutils/filutil.inc

@@ -125,6 +125,21 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+var
+  sr: TRawbyteSymLinkRec;
+begin
+  Result := FileGetSymLinkTarget(ToSingleByteFileSystemEncodedFileName(FileName), sr);
+  if Result then
+    begin
+      SymLinkRec.TargetName := UnicodeString(sr.TargetName);
+{$ifdef SYMLINKREC_USEFINDDATA}
+      SymLinkRec.FindData := sr.FindData;
+{$endif}
+    end;
+end;
+
+
 Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
 begin
   Result:=UnicodeString(FileSearch(ToSingleByteFileSystemEncodedFileName(Name),
@@ -320,6 +335,21 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+var
+  sr: TUnicodeSymLinkRec;
+begin
+  Result := FileGetSymLinkTarget(UnicodeString(FileName), sr);
+  if Result then
+    begin
+      SymLinkRec.TargetName := ToSingleByteFileSystemEncodedFileName(sr.TargetName);
+{$ifdef SYMLINKREC_USEFINDDATA}
+      SymLinkRec.FindData := sr.FindData;
+{$endif}
+    end;
+end;
+
+
 Function FileSearch (Const Name, DirList : UnicodeString; Options : TFileSearchoptions = [sfoImplicitCurrentDir]) : UnicodeString;
 Var
   I : longint;
@@ -403,6 +433,26 @@ end;
 {$endif}
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean;
+var
+  sr: TUnicodeSymLinkRec;
+begin
+  Result := FileGetSymLinkTarget(FileName, sr);
+  if Result then
+    TargetName := sr.TargetName;
+end;
+
+
+function FileGetSymLinkTarget(const FileName: RawByteString; out TargetName: RawByteString): Boolean;
+var
+  sr: TRawbyteSymLinkRec;
+begin
+  Result := FileGetSymLinkTarget(FileName, sr);
+  if Result then
+    TargetName := sr.TargetName;
+end;
+
+
 Function GetFileHandle(var f : File):THandle;
 begin
   Result:=filerec(f).handle;
@@ -437,7 +487,7 @@ type
   {$ifdef unix}
     Mode : TMode;
   {$endif unix}
-  {$ifdef USEFINDDATA}
+  {$ifdef SEARCHREC_USEFINDDATA}
     FindData : TFindData;
   {$endif}
   end;
@@ -453,7 +503,7 @@ Function InternalFindFirst (Const Path : UnicodeString; Attr : Longint; out Rslt
 Function InternalFindNext (var Rslt : TAbstractSearchRec; var Name : UnicodeString) : Longint; forward;
 {$endif SYSUTILS_HAS_UNICODESTR_FILEUTIL_IMPL}
 
-procedure InternalFindClose(var Handle: {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif}{$ifdef USEFINDDATA};var FindData: TFindData{$endif}); forward;
+procedure InternalFindClose(var Handle: {$ifdef FINDHANDLE_IS_POINTER}Pointer{$else}THandle{$endif}{$ifdef SEARCHREC_USEFINDDATA};var FindData: TFindData{$endif}); forward;
 
 
 {$ifndef SYSUTILS_HAS_ANSISTR_FILEUTIL_IMPL}
@@ -533,13 +583,13 @@ end;
 
 Procedure FindClose(Var f: TRawByteSearchRec);
 begin
-  InternalFindClose(f.FindHandle{$ifdef USEFINDDATA},f.FindData{$endif});
+  InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
 end;
 
 
 Procedure FindClose(Var f: TUnicodeSearchRec);
 begin
-  InternalFindClose(f.FindHandle{$ifdef USEFINDDATA},f.FindData{$endif});
+  InternalFindClose(f.FindHandle{$ifdef SEARCHREC_USEFINDDATA},f.FindData{$endif});
 end;
 
 { TUnicodeSearchRec }
@@ -556,6 +606,20 @@ begin
   Result := FileDateToDateTime(Time);
 end;
 
+{ TUnicodeSymLinkRec }
+
+function TUnicodeSymLinkRec.GetTimeStamp: TDateTime;
+begin
+  Result := 0;
+end;
+
+{ TRawbyteSymLinkRec }
+
+function TRawbyteSymLinkRec.GetTimeStamp: TDateTime;
+begin
+  Result := 0;
+end;
+
 
 {$ifndef SYSUTILS_HAS_FILEFLUSH_IMPL}
 function FileFlush(Handle: THandle): Boolean;

+ 45 - 7
rtl/objpas/sysutils/filutilh.inc

@@ -23,24 +23,24 @@ Type
 
   // Some operating systems need extra find data.
 {$if defined(Win32) or defined(WinCE) or defined(Win64)}
-    {$define USEFINDDATA}
+    {$define SEARCHREC_USEFINDDATA}
     TFindData = TWin32FindDataW;
 {$endif}
 {$ifdef netware_clib}
     TFindData = TNetwareFindData;
-    {$define USEFINDDATA}
+    {$define SEARCHREC_USEFINDDATA}
 {$endif}
 {$ifdef netware_libc}
     TFindData = TNetwareLibcFindData;
-    {$define USEFINDDATA}
+    {$define SEARCHREC_USEFINDDATA}
 {$endif}
 {$ifdef MacOS}
     TFindData = TMacOSFindData;
-    {$define USEFINDDATA}
+    {$define SEARCHREC_USEFINDDATA}
 {$endif}
 {$ifdef nativent}
     TFindData = TNativeNTFindData;
-    {$define USEFINDDATA}
+    {$define SEARCHREC_USEFINDDATA}
 {$endif}
 
   // The actual unicode search record
@@ -54,7 +54,7 @@ Type
 {$ifdef unix}
     Mode : TMode;
 {$endif unix}
-{$ifdef USEFINDDATA}
+{$ifdef SEARCHREC_USEFINDDATA}
     FindData : TFindData;
 {$endif}
   private
@@ -73,7 +73,7 @@ Type
 {$ifdef unix}
     Mode : TMode;
 {$endif unix}
-{$IFDEF USEFINDDATA}
+{$IFDEF SEARCHREC_USEFINDDATA}
     FindData : TFindData;
 {$ENDIF}
   private
@@ -88,6 +88,40 @@ Type
   TSearchRec = TRawbyteSearchRec;
 {$ENDIF}
 
+  TUnicodeSymLinkRec = Record
+    TargetName : UnicodeString;
+    Attr : Longint;
+    Size : Int64;
+{$ifdef SYMLINKREC_USEFINDDATA}
+    FindData : TFindData;
+{$endif}
+  private
+    function GetTimeStamp: TDateTime;
+  public
+    property TimeStamp: TDateTime read GetTimeStamp;
+  end;
+
+  TRawbyteSymLinkRec = Record
+    TargetName : RawByteString;
+    Size : Int64;
+    Attr : Longint;
+    Name : RawByteString;
+{$IFDEF SYMLINKREC_USEFINDDATA}
+    FindData : TFindData;
+{$ENDIF}
+  private
+    function GetTimeStamp: TDateTime;
+  public
+    property TimeStamp: TDateTime read GetTimeStamp;
+  end;
+
+{$IFDEF FPC_UNICODE_RTL}
+  TSymLinkRec = TUnicodeSymLinkRec;
+{$ELSE}
+  TSymLinkRec = TRawbyteSymLinkRec;
+{$ENDIF}
+
+
 Const
   { File attributes }
   faReadOnly   = $00000001;
@@ -150,6 +184,8 @@ Function FileSearch (Const Name, DirList : UnicodeString; ImplicitCurrentDir : B
 Function ExeSearch  (Const Name : UnicodeString; Const DirList : UnicodeString = '') : UnicodeString;
 Function FileIsReadOnly(const FileName : UnicodeString): Boolean;
 function FileAge(const FileName: UnicodeString; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+function FileGetSymLinkTarget(const FileName: UnicodeString; out TargetName: UnicodeString): Boolean; inline;
 
 Function FileOpen (Const FileName : RawByteString; Mode : Integer) : THandle;
 Function FileCreate (Const FileName : RawByteString) : THandle;
@@ -171,6 +207,8 @@ function FileAge(const FileName: RawByteString; out FileDateTime: TDateTime; Fol
 {$ifndef FPUNONE}
 Function FileAge (Const FileName : RawByteString): Longint;
 {$endif}
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+function FileGetSymLinkTarget(const FileName: RawByteString; out TargetName: RawByteString): Boolean; inline;
 
 Function FileRead (Handle : THandle; out Buffer; Count : longint) : Longint;
 Function FileWrite (Handle : THandle; const Buffer; Count : Longint) : Longint;

+ 7 - 0
rtl/os2/sysutils.pp

@@ -228,6 +228,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;
@@ -349,6 +355,7 @@ begin
    OSErrorWatch (RC);
 end;
 
+
 function FileGetDate (Handle: THandle): longint;
 var
   FStat: TFileStatus3;

+ 6 - 0
rtl/symbian/sysutils.pp

@@ -135,6 +135,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 Begin
   result := false;

+ 6 - 0
rtl/unix/sysutils.pp

@@ -609,6 +609,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 var
   SystemFileName: RawByteString;

+ 6 - 0
rtl/watcom/sysutils.pp

@@ -295,6 +295,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;

+ 6 - 0
rtl/wii/sysutils.pp

@@ -144,6 +144,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : RawByteString; FollowLink : Boolean) : Boolean;
 Begin
   result := false;

+ 6 - 0
rtl/win/sysutils.pp

@@ -407,6 +407,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : UnicodeString; FollowLink : Boolean) : Boolean;
 var
   Attr:Dword;

+ 6 - 0
rtl/win16/sysutils.pp

@@ -329,6 +329,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: RawByteString; out SymLinkRec: TRawbyteSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 function FileExists (const FileName: RawByteString; FollowLink : Boolean): boolean;
 var
   L: longint;

+ 6 - 0
rtl/wince/sysutils.pp

@@ -267,6 +267,12 @@ begin
 end;
 
 
+function FileGetSymLinkTarget(const FileName: UnicodeString; out SymLinkRec: TUnicodeSymLinkRec): Boolean;
+begin
+  Result := False;
+end;
+
+
 Function FileExists (Const FileName : UnicodeString; FollowLink : Boolean) : Boolean;
 var
   Attr:Dword;