Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
IdFTP.Quit deprecated?
#2
(10-25-2018, 11:03 AM)BosseB Wrote: When I build my project in Lazarus 1.8.4 (FPC 3.0.4) I always get warnings from IdFTP.Quit calls being deprecated.

That means your code is outdated and needs to be updated.

In Indy 9 and earlier, the QUIT command is sent to the FTP server only if the TIdFTP.Quit() method is called.  If you call Disconnect() without calling Quit() first, no QUIT command is sent.  TIdFTP.Quit() sends the QUIT command and then calls Disconnect():

Code:
procedure TIdFTP.Quit;
begin
 if Connected then begin
   WriteLn('QUIT');      {Do not translate}
 end;
 Disconnect;
end;

In Indy 10, the QUIT command is now handled by DisconnectNotifyPeer() instead, which Disconnect() calls when its optional ANotifyPeer parameter is True. TIdFTP.Quit() simply calls Disconnect(True), which is why Quit() is deprecated:

Code:
procedure TIdTCPConnection.Disconnect(ANotifyPeer: Boolean);
var
 ...
begin
 try
   ...
   if ANotifyPeer then begin
     ...
     try
       if Connected then begin
         DisconnectNotifyPeer;
       end;
     except
       // TODO: maybe allow only EIdConnClosedGracefully and EIdSocketError?
     end;
   end;
 ...
end;

procedure TIdTCPConnection.Disconnect;
begin
 // The default should be to tell the other side we are disconnecting
 Disconnect(True);
end;

Code:
procedure TIdFTP.DisconnectNotifyPeer;
begin
 inherited DisconnectNotifyPeer;
 IOHandler.WriteLn('QUIT');      {do not localize}
 IOHandler.CheckForDataOnSource(100);
 if not IOHandler.InputBufferIsEmpty then begin
   GetInternalResponse;
 end;
end;

procedure TIdFTP.Quit;
begin
 Disconnect;
end;

(10-25-2018, 11:03 AM)BosseB Wrote: This is the first warning location:

Code:
    if IdFTPtfr.Connected then
    begin
      IdFTPtfr.Quit; // <== Warning here
    end;

When using Indy 10, simply replace Quit() with Disconnect():

Code:
if IdFTPtfr.Connected then
begin
 IdFTPtfr.Disconnect;
end;

FYI, you can call Disconnect() without checking with Connected() first.

(10-25-2018, 11:03 AM)BosseB Wrote: But I have looked at the on-line documentation where there is no sign of any deprecation...

The documentation is out of date, it hasn't been updated in years.

(10-25-2018, 11:03 AM)BosseB Wrote: What gives? Is the IndyLaz package installed via OnLinePackageManager somehow broken?

No.  Your code is simply old, it was written for Indy 9 and not updated for Indy 10.

(10-25-2018, 11:03 AM)BosseB Wrote: The further effect of this problem is that there are no tool-tips for the IdFTP component, when I press period after the IdFTP variable Lazarus just displays this in the message box:

Code:
Codetools, Errors: 1
IdGlobal.pas(1889,105) Error: expected ;, but deprecated found

Oh no, not THAT old issue again  Angry  Sad <sigh>

The offending line in IdGlobal.pas is this:

Code:
 // For linux the user needs to set this variable to be accurate where used (mail, etc)
 GOffsetFromUTC: TDateTime = 0{$IFDEF HAS_DEPRECATED}{$IFDEF USE_SEMICOLON_BEFORE_DEPRECATED};{$ENDIF} deprecated{$ENDIF};

(there is a similar declaration in IdWship6.pas on line 432 for a global boolean variable named GIdIPv6FuncsAvailable).

USE_SEMICOLON_BEFORE_DEPRECATED is defined only for FPC 2.4.4 - 2.6.1.  I've gone back and forth on this issue several times in the FreePascal/Lazarus forum about whether the semicolon is necessary or not (see this topic, and also the end of this message).  Delphi and FreePascal 2.6.2+ do not need the semicolon:

Code:
 GOffsetFromUTC: TDateTime = 0 deprecated;

But older versions of FreePascal do:

Code:
 GOffsetFromUTC: TDateTime = 0; deprecated;

Hence why USE_SEMICOLON_BEFORE_DEPRECATED exists.

You are using FreePascal 3.0.4, so the semicolon should not be needed.

Since the popup error is related to code completion, which is an IDE feature, not a compiler feature, this makes me think that you found a Lazarus IDE bug that doesn't handle the newer code syntax that omits the semicolon, even though the compiler accepts the syntax.

Reply


Messages In This Thread
IdFTP.Quit deprecated? - by BosseB - 10-25-2018, 11:03 AM
RE: IdFTP.Quit deprecated? - by rlebeau - 10-25-2018, 06:58 PM
RE: IdFTP.Quit deprecated? - by BosseB - 10-25-2018, 09:22 PM
RE: IdFTP.Quit deprecated? - by rlebeau - 10-25-2018, 10:08 PM
RE: IdFTP.Quit deprecated? - by BosseB - 10-26-2018, 09:34 AM

Forum Jump:


Users browsing this thread: 1 Guest(s)