📄 idftpcommon.pas
字号:
'D', {do not localize} // Process the job and delete it after processing. Default disposition.
'H', {do not localize} // Hold in queue until released.
'K', {do not localize} // Process the job and keep it in the queue after processing. (Default disposition for time event scheduling jobs that have to be processed more than once.)
'L', {do not localize} // Leave in queue until released.
'X', {do not localize} // (Local only) Hold until disposition is changed to D or K. Temporarily assigned by VSE/POWER when processing fails.
'Y', {do not localize} {
(Local only) Hold until the disposition is changed to D or K. Applies only to
output being retrieved via the GET service of the spool-access support.
Assigned by VSE/POWER either on request by the retrieving program or, to
certain queue entries, when processing fails.
Output queue entries may have also been set to a disposition of Y when
ignored records were found and SET IGNREC=DISPY was specified in the
VSE/POWER autostart procedure.
}
'*', {do not localize} // Indicates that a queue entry is being processed.
{
The following local disposition codes may be specified for an output entry,
but they are effective only while the entry is being created.
}
'I', {do not localize} //Spool this output to the input (reader) queue with disposition D. Applies to punch output.
'N', {do not localize} //Suppress the spooling of the referenced output when the job entry is being processed.
'T' {do not localize} //Spool the referenced output to tape. Applies to output.
{
If a queue entry has a temporary local disposition of A, or X, or Y, VSE/POWER
present the original disposition in the ORGDP=field of a PDISPLAY...,FULL=YES
request.
}
);
{TODO: Add method to TIdFTP to set dispositions for VSE Power Queue jobs if possible.
I think it is done with a PALTER DISP=[disposition code] command but I'm not sure.
}
const UnitreeStoreTypes : array [0..1] of string =
('AR', 'DK'); {do not localize}
const
UNIX_LINKTO_SYM = ' -> '; {do not localize} //indicates where a symbolic link points to
{***
Path conversions
***}
function UnixPathToDOSPath(const APath : String):String;
function DOSPathToUnixPath(const APath : String):String;
{***
Indy path utility functions
***}
//works like ExtractFilePath except that it will use both "/" and "\" and the last path spec is dropped
function IndyGetFilePath(const AFileName : String):String;
function IndyGetFileName(const AFileName : String):String;
function IndyIsRelativePath(const APathName : String): Boolean;
function IndyGetFileExt(const AFileName : String) : String;
function StripInitPathDelin(const AStr : String): String;
function IsNavPath(const APath : String): Boolean;
function RemoveDuplicatePathSyms(APath : String): String;
{***
EPLF time stamp processing
***}
function EPLFDateToLocalDateTime(const AData: String): TDateTIme;
function EPLFDateToGMTDateTime(const AData: String): TDateTime;
function GMTDateTimeToEPLFDate(const ADateTime : TDateTime) : String;
function LocalDateTimeToEPLFDate(const ADateTime : TDateTime) : String;
{***
Misc parsing
***}
function BubbleSortStringChars(const AStr : String): String;
function PatternsInStr(const ASearchPattern, AString : String): Integer;
function StripSpaces(const AString : String; const ASpaces : Cardinal): String;
function StripPath(const AFileName : String; const PathDelin : String = '/'): String;
function CharsInStr(const ASearchChar : Char; const AString : String) : Integer;
function UnfoldLines(const AData : String; ALine : Integer; AStrings : TIdStrings): String;
function StrPart(var AInput: string; const AMaxLength : Integer; const ADelete: Boolean = IdFetchDeleteDefault) : String;
function FetchLength(var AInput: string;
const AMaxLength : Integer;
const ADelim: string = IdFetchDelimDefault;
const ADelete: Boolean = IdFetchDeleteDefault;
const ACaseSensitive: Boolean = IdFetchCaseSensitiveDefault): String;
function IsLineStr(const AData : String): Boolean;
function PadSpaces(const AString : String; const ALen : Integer):String;
{FTP Pattern recognition}
function IsTotalLine(const AData: String): Boolean;
function IsSubDirContentsBanner(const AData: String): Boolean;
{***
Quoted strings
***}
function UnquotedStr(const AStr : String): String;
procedure ParseQuotedArgs(const AParams : String; AStrings : TIdStrings);
{**
Number extraction
**}
function FindDelimInNumbers(const AData : String) : String;
function ExtractNumber(const AData : String; const ARetZero : Boolean = True): Integer;
function StripNo(const AData : String): String;
{**
Date parsing and processing
**}
function IsMDTMDate(const ADate : String) : Boolean;
function IsMMDDYY(const AData : String; const ADelin : String) : Boolean;
function IsYYYYMMDD(const AData : String) : Boolean;
function Y2Year(const AYear : Integer): Integer;
function DateYYMMDD(const AData: String): TDateTime;
function DateYYStrMonthDD(const AData: String; const ADelin : String='-'): TDateTime;
function DateStrMonthDDYY(const AData:String; const ADelin : String = '-'; const AAddMissingYear : Boolean=False): TDateTime;
function DateDDStrMonthYY(const AData: String; const ADelin : String='-'): TDateTime;
function DateMMDDYY(const AData: String): TDateTime;
function TimeHHMMSS(const AData : String):TDateTime;
function IsIn6MonthWindow(const AMDate : TDateTime):Boolean;
function AddMissingYear(const ADay, AMonth : Cardinal): Cardinal;
function IsHHMMSS(const AData : String; const ADelin : String) : Boolean;
//This assumes hours in the form 0-23 instead of the 12 AM/PM hour system used in the US.
function MVSDate(const AData: String): TDateTime;
function AS400Date(const AData: String): TDateTime;
//MDTM Set filedate support and SITE ZONE support
function MinutesFromGMT : Integer;
function MDTMOffset(const AOffs : String) : TDateTime;
function FTPDateTimeToMDTMD(const ATimeStamp : TDateTime; const AIncludeMSecs : Boolean=True; const AIncludeGMTOffset : Boolean=True ): String;
function FTPMDTMToGMTDateTime(const ATimeStamp : String):TDateTime;
{***
platform specific parsing and testing
***}
{Unix}
function IsValidUnixPerms(AData : String; const AStrict : Boolean = False) : Boolean;
function IsUnixLsErr(const AData: String): Boolean;
function IsUnixExec(const LUPer, LGPer, LOPer : String): Boolean;
function IsUnixHiddenFile(const AFileName : String): Boolean;
//Chmod converstion routines
procedure ChmodNoToPerms(const AChmodNo : Integer; var VUser, VGroup, VOther : String); overload;
procedure ChmodNoToPerms(const AChmodNo : Integer; var VPermissions : String); overload;
function PermsToChmodNo(const AUser, AGroup, AOther : String): Integer;
function ChmodNoToModeBits(const AModVal : Cardinal): Cardinal;
function ModeBitsToChmodNo(const AMode : Cardinal):Integer;
function ModeBitsToPermString(const AMode : Cardinal) : String;
function PermStringToModeBits(const APerms : String): Cardinal;
{Novell Netware}
function IsNovelPSPattern(const AStr : String): Boolean;
function IsValidNovellPermissionStr(const AStr : String): Boolean;
function ExtractNovellPerms(const AData : String) : String;
{QVT/NET}
function ExcludeQVNET(const AData : String) : Boolean;
function ExtractQVNETFileName(const AData : String): String;
{Mainframe support}
function ExtractRecFormat(const ARecFM : String): String;
//Determines if the line is part of a VM/BFS list - also used by WindowsNT parser
//because two columns are shared
function IsVMBFS(AData : String) : Boolean;
{IBM VSE}
function DispositionCodeToTIdVSEPQDisposition(const ADisp : Char) : TIdVSEPQDisposition;
function TIdVSEPQDispositionDispositionCode(const ADisp : TIdVSEPQDisposition) : Char;
{EPLF and MLST/MLSD support}
function ParseFacts(AData : String; AResults : TIdStrings;
const AFactDelin : String = ';'; const ANameDelin : String=' '): String;
{Sterling Commerce support routines}
function IsValidSterCommFlags(const AString : String) : Boolean;
function IsValidSterCommProt(const AString : String) : Boolean;
function IsValidSterCommData(const AString : String) : Boolean;
//These are from Borland's LIBC.pas header file
//We rename the constants to prevent any conflicts in Kylix and C++
const
Id__S_ISUID = $800; { Set user ID on execution. }
Id__S_ISGID = $400; { Set group ID on execution. }
Id__S_ISVTX = $200; { Save swapped text after use (sticky). }
Id__S_IREAD = $100; { Read by owner. }
Id__S_IWRITE = $80; { Write by owner. }
Id__S_IEXEC = $40; { Execute by owner. }
{ Protection bits. }
IdS_ISUID = Id__S_ISUID; { Set user ID on execution. }
IdS_ISGID = Id__S_ISGID; { Set group ID on execution. }
{ Save swapped text after use (sticky bit). This is pretty well obsolete. }
IdS_ISVTX = Id__S_ISVTX;
IdS_IRUSR = Id__S_IREAD; { Read by owner. }
IdS_IWUSR = Id__S_IWRITE; { Write by owner. }
IdS_IXUSR = Id__S_IEXEC; { Execute by owner. }
{ Read, write, and execute by owner. }
IdS_IRWXU = Id__S_IREAD or Id__S_IWRITE or Id__S_IEXEC;
IdS_IREAD = IdS_IRUSR;
IdS_IWRITE = IdS_IWUSR;
IdS_IEXEC = IdS_IXUSR;
IdS_IRGRP = IdS_IRUSR shr 3; { Read by group. }
IdS_IWGRP = IdS_IWUSR shr 3; { Write by group. }
IdS_IXGRP = IdS_IXUSR shr 3; { Execute by group. }
{ Read, write, and execute by group. }
IdS_IRWXG = IdS_IRWXU shr 3;
IdS_IROTH = IdS_IRGRP shr 3; { Read by others. }
IdS_IWOTH = IdS_IWGRP shr 3; { Write by others. }
IdS_IXOTH = IdS_IXGRP shr 3; { Execute by others. }
{ Read, write, and execute by others. }
IdS_IRWXO = IdS_IRWXG shr 3;
implementation
uses SysUtils;
{Misc Parsing}
function BubbleSortStringChars(const AStr : String): String;
var i, j : Integer;
LTemp : Char;
begin
Result := AStr;
for i := Length(Result) downto 1 do
begin
for j := 1 to Length(Result) -1 do
begin
if Result[J] > Result[J + 1] then begin
begin
LTemp := Result[j];
Result[j] := Result[j+1];
Result[j+1] := LTemp;
end;
end;
end;
end;
end;
function StripSpaces(const AString : String; const ASpaces : Cardinal): String;
var i : Integer;
begin
Result := AString;
for i := 1 to ASpaces do
begin
if (Result <> '') and (Result[1]=' ') then
begin
Delete(Result,1,1);
end
else
begin
Break;
end;
end;
end;
function StripPath(const AFileName : String; const PathDelin : String = '/'): String;
var LBuf : String;
begin
LBuf := AFileName;
repeat
Result := Fetch(LBuf,PathDelin);
if (LBuf = '') then
begin
break;
end;
until False;
end;
function CharsInStr(const ASearchChar : Char; const AString : String) : Integer;
var i : Integer;
begin
Result := 0;
for i := 1 to Length(AString) do
begin
if AString[i] = ASearchChar then
begin
Inc(Result);
end;
end;
end;
function PatternsInStr(const ASearchPattern, AString : String): Integer;
var LBuf : String;
begin
Result := 0;
LBuf := AString;
repeat
Fetch(LBuf,ASearchPattern);
if LBuf = '' then
begin
Break;
end
else
begin
Inc(Result);
end;
until False;
end;
function UnfoldLines(const AData : String; ALine : Integer; AStrings : TIdStrings): String;
var LFoldedLine : String;
begin
Result := AData;
while True do begin
Inc(ALine);
if ALine = AStrings.Count then begin
Break;
end;
LFoldedLine := AStrings[ALine];
if LFoldedLine = '' then
begin
Exit;
end;
if not (CharIsInSet(LFoldedLine, 1, LWS)) then begin
Break;
end;
Result := Trim(Result) + ' ' + Trim(LFoldedLine); {Do not Localize}
end;
end;
function StrPart(var AInput: string; const AMaxLength : Integer; const ADelete: Boolean = IdFetchDeleteDefault) : String;
begin
Result := Copy(AInput,1,AMaxLength);
if ADelete then
begin
Delete(AInput,1,AMaxLength);
end;
end;
function FetchLength(var AInput: string;
const AMaxLength : Integer;
const ADelim: string = IdFetchDelimDefault;
const ADelete: Boolean = IdFetchDeleteDefault;
const ACaseSensitive: Boolean = IdFetchCaseSensitiveDefault): String;
var i : Integer;
begin
if ADelim = #0 then begin
// AnsiPos does not work with #0
i := Pos(ADelim, AInput);
end else begin
i := IndyPos(ADelim, AInput);
end;
if (i > AMaxLength) or (i=0) then
begin
Result := Copy(AInput, 1, AMaxLength);
if ADelete then
begin
Delete(AInput,1,AMaxLength);
end;
end
else
begin
Result := Fetch(AInput, ADelim, ADelete, ACaseSensitive);
end;
end;
function IsLineStr(const AData : String): Boolean;
//see if this is just a line with spaces, '-', or tabs so we
//can skip it in the parser
const
//Note that there are two separate char codes are rended as '-' in the line below.
//Be careful when editing because the codes are different.
// LineSet = [' ','-','
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -