Răsfoiți Sursa

Bug fix: Do not say "Terminated by user" when the session has actually timed out.

(cherry picked from commit 1dc5bc03c945ec1f7444f3b5aa60bd78c9d762a2)

Source commit: e12c9159b6f2caa209e3017a4f08b4772cdfb581
Martin Prikryl 4 ani în urmă
părinte
comite
f074f481bf

+ 1 - 0
source/core/CoreMain.cpp

@@ -77,6 +77,7 @@ TQueryParams::TQueryParams(unsigned int AParams, UnicodeString AHelpKeyword)
   TimerQueryType = static_cast<TQueryType>(-1);
   Timeout = 0;
   TimeoutAnswer = 0;
+  TimeoutResponse = 0;
   NoBatchAnswers = 0;
   HelpKeyword = AHelpKeyword;
 }

+ 1 - 0
source/core/Interface.h

@@ -125,6 +125,7 @@ struct TQueryParams
   TQueryType TimerQueryType;
   unsigned int Timeout;
   unsigned int TimeoutAnswer;
+  unsigned int TimeoutResponse;
   unsigned int NoBatchAnswers;
   UnicodeString HelpKeyword;
 };

+ 10 - 2
source/core/SecureShell.cpp

@@ -1264,6 +1264,7 @@ unsigned int __fastcall TSecureShell::TimeoutPrompt(TQueryParamsTimerEvent PoolE
     {
       Params.Timeout = FConfiguration->SessionReopenAutoStall;
       Params.TimeoutAnswer = qaAbort;
+      Params.TimeoutResponse = qaNo;
     }
     Answer = FUI->QueryUser(MainInstructions(FMTLOAD(CONFIRM_PROLONG_TIMEOUT3, (FSessionData->Timeout))),
       NULL, qaRetry | qaAbort, &Params);
@@ -1298,6 +1299,11 @@ void __fastcall TSecureShell::SendBuffer(unsigned int & Result)
   }
 }
 //---------------------------------------------------------------------------
+void TSecureShell::TimeoutAbort(unsigned int Answer)
+{
+  FatalError(MainInstructions(LoadStr(Answer == qaAbort ? USER_TERMINATED : TIMEOUT_ERROR)));
+}
+//---------------------------------------------------------------------------
 void __fastcall TSecureShell::DispatchSendBuffer(int BufSize)
 {
   TDateTime Start = Now();
@@ -1336,7 +1342,8 @@ void __fastcall TSecureShell::DispatchSendBuffer(int BufSize)
           // fallthru
 
         case qaAbort:
-          FatalError(MainInstructions(LoadStr(USER_TERMINATED)));
+        case qaNo:
+          TimeoutAbort(Answer);
           break;
       }
     }
@@ -1877,7 +1884,8 @@ void __fastcall TSecureShell::WaitForData()
           // fallthru
 
         case qaAbort:
-          FatalError(MainInstructions(LoadStr(USER_TERMINATED)));
+        case qaNo:
+          TimeoutAbort(Answer);
           break;
       }
     }

+ 1 - 0
source/core/SecureShell.h

@@ -100,6 +100,7 @@ private:
   void __fastcall DispatchSendBuffer(int BufSize);
   void __fastcall SendBuffer(unsigned int & Result);
   unsigned int __fastcall TimeoutPrompt(TQueryParamsTimerEvent PoolEvent);
+  void TimeoutAbort(unsigned int Answer);
   bool __fastcall TryFtp();
   UnicodeString __fastcall ConvertInput(const RawByteString & Input);
   void __fastcall GetRealHost(UnicodeString & Host, int & Port);

+ 1 - 0
source/core/Terminal.cpp

@@ -2189,6 +2189,7 @@ bool __fastcall TTerminal::DoQueryReopen(Exception * E)
     TQueryParams Params(qpAllowContinueOnError);
     Params.Timeout = Configuration->SessionReopenAuto;
     Params.TimeoutAnswer = qaRetry;
+    Params.TimeoutResponse = Params.TimeoutAnswer;
     TQueryButtonAlias Aliases[1];
     Aliases[0].Button = qaRetry;
     Aliases[0].Alias = LoadStr(RECONNECT_BUTTON);

+ 1 - 0
source/resource/TextsCore.h

@@ -330,6 +330,7 @@
 #define S3_SECRET_ACCESS_KEY_PROMPT 359
 #define DUPLICATE_FOLDER_NOT_SUPPORTED 360
 #define MISSING_TARGET_BUCKET   361
+#define TIMEOUT_ERROR           362
 
 #define CORE_INFORMATION_STRINGS 400
 #define YES_STR                 401

+ 1 - 0
source/resource/TextsCore1.rc

@@ -246,6 +246,7 @@ BEGIN
   STREAM_IN_SCRIPT_ERROR, "When uploading streamed data, only one source can be specified and the target must specify a filename."
   STREAM_READ_ERROR, "Error reading input stream."
   S3_CONFIG_ERROR, "Error reading AWS configuration parameter %s"
+  TIMEOUT_ERROR, "Timeout waiting for server to respond."
 
   CORE_CONFIRMATION_STRINGS, "CORE_CONFIRMATION"
   CONFIRM_PROLONG_TIMEOUT3, "Host is not communicating for %d seconds.\n\nWait for another %0:d seconds?"

+ 6 - 0
source/windows/ConsoleRunner.cpp

@@ -1412,6 +1412,7 @@ void __fastcall TConsoleRunner::ScriptTerminalQueryUser(TObject * /*Sender*/,
   unsigned int Timer = 0;
   unsigned int Timeout = 0;
   unsigned int TimeoutA = 0;
+  unsigned int TimeoutR = 0;
   unsigned int NoBatchA = 0;
 
   if (Params != NULL)
@@ -1420,6 +1421,8 @@ void __fastcall TConsoleRunner::ScriptTerminalQueryUser(TObject * /*Sender*/,
     {
       Timeout = Params->Timeout;
       TimeoutA = Params->TimeoutAnswer;
+      TimeoutR = Params->TimeoutResponse;
+      DebugAssert((TimeoutA != 0) && (TimeoutR != 0));
     }
 
     if (Params->Timer > 0)
@@ -1449,8 +1452,10 @@ void __fastcall TConsoleRunner::ScriptTerminalQueryUser(TObject * /*Sender*/,
       Timeout = InputTimeout();
       if (Timeout != 0)
       {
+        DebugAssert((TimeoutA == 0) && (TimeoutR == 0));
         // See a duplicate AbortAnswer call below
         TimeoutA = AbortAnswer(Answers & ~NoBatchA);
+        TimeoutR = TimeoutA;
       }
     }
   }
@@ -1669,6 +1674,7 @@ void __fastcall TConsoleRunner::ScriptTerminalQueryUser(TObject * /*Sender*/,
       else if (Timeouting && (Timeout < MSecsPerSec))
       {
         AnswerIndex = TimeoutIndex;
+        Answer = TimeoutR;
       }
       else
       {

+ 20 - 7
source/windows/WinInterface.cpp

@@ -64,6 +64,7 @@ TMessageParams::TMessageParams(const TQueryParams * AParams)
     TimerQueryType = AParams->TimerQueryType;
     Timeout = AParams->Timeout;
     TimeoutAnswer = AParams->TimeoutAnswer;
+    TimeoutResponse = AParams->TimeoutResponse;
 
     if (FLAGSET(AParams->Params, qpNeverAskAgainCheck))
     {
@@ -88,6 +89,7 @@ inline void TMessageParams::Reset()
   TimerQueryType = static_cast<TQueryType>(-1);
   Timeout = 0;
   TimeoutAnswer = 0;
+  TimeoutResponse = 0;
   NeverAskAgainTitle = L"";
   NeverAskAgainAnswer = 0;
   NeverAskAgainCheckedInitially = false;
@@ -323,7 +325,7 @@ void __fastcall TMessageTimer::DoTimer(TObject * /*Sender*/)
 class TMessageTimeout : public TTimer
 {
 public:
-  __fastcall TMessageTimeout(TComponent * AOwner, unsigned int Timeout, TButton * Button);
+  __fastcall TMessageTimeout(TComponent * AOwner, unsigned int Timeout, TButton * Button, unsigned int Answer);
 
 protected:
   unsigned int FOrigTimeout;
@@ -332,6 +334,7 @@ protected:
   UnicodeString FOrigCaption;
   TPoint FOrigCursorPos;
   std::unique_ptr<TApplicationEvents> FApplicationEvents;
+  unsigned int FAnswer;
 
   void __fastcall DoTimer(TObject * Sender);
   void __fastcall UpdateButton();
@@ -341,8 +344,8 @@ protected:
 };
 //---------------------------------------------------------------------------
 __fastcall TMessageTimeout::TMessageTimeout(TComponent * AOwner,
-  unsigned int Timeout, TButton * Button) :
-  TTimer(AOwner), FOrigTimeout(Timeout), FTimeout(Timeout), FButton(Button)
+  unsigned int Timeout, TButton * Button, unsigned int Answer) :
+  TTimer(AOwner), FOrigTimeout(Timeout), FTimeout(Timeout), FButton(Button), FAnswer(Answer)
 {
   OnTimer = DoTimer;
   Interval = MSecsPerSec;
@@ -407,7 +410,16 @@ void __fastcall TMessageTimeout::DoTimer(TObject * /*Sender*/)
 
     // Needed particularly for "keep up to date" dialog, which does not close on the button click
     Enabled = false;
-    FButton->Click();
+    TModalResult PrevModalResult = FButton->ModalResult;
+    FButton->ModalResult = FAnswer;
+    try
+    {
+      FButton->Click();
+    }
+    __finally
+    {
+      FButton->ModalResult = PrevModalResult;
+    }
   }
   else
   {
@@ -416,9 +428,9 @@ void __fastcall TMessageTimeout::DoTimer(TObject * /*Sender*/)
   }
 }
 //---------------------------------------------------------------------------
-void InitiateDialogTimeout(TForm * Dialog, unsigned int Timeout, TButton * Button)
+void InitiateDialogTimeout(TForm * Dialog, unsigned int Timeout, TButton * Button, unsigned int Answer)
 {
-  TMessageTimeout * MessageTimeout = new TMessageTimeout(Application, Timeout, Button);
+  TMessageTimeout * MessageTimeout = new TMessageTimeout(Application, Timeout, Button, Answer);
   MessageTimeout->Name = L"MessageTimeout";
   Dialog->InsertComponent(MessageTimeout);
 }
@@ -471,7 +483,7 @@ TForm * __fastcall CreateMoreMessageDialogEx(const UnicodeString Message, TStrin
   {
     if (Params->Timeout > 0)
     {
-      InitiateDialogTimeout(Dialog.get(), Params->Timeout, TimeoutButton);
+      InitiateDialogTimeout(Dialog.get(), Params->Timeout, TimeoutButton, Params->TimeoutResponse);
     }
   }
 
@@ -662,6 +674,7 @@ unsigned int __fastcall FatalExceptionMessageDialog(Exception * E, TQueryType Ty
   {
     AParams.Timeout = SessionReopenTimeout;
     AParams.TimeoutAnswer = qaRetry;
+    AParams.TimeoutResponse = AParams.TimeoutAnswer;
   }
   DebugAssert(AParams.Aliases == NULL);
   AParams.Aliases = Aliases;

+ 2 - 1
source/windows/WinInterface.h

@@ -72,6 +72,7 @@ struct TMessageParams
   TQueryType TimerQueryType;
   unsigned int Timeout;
   unsigned int TimeoutAnswer;
+  unsigned int TimeoutResponse;
   UnicodeString NeverAskAgainTitle;
   unsigned int NeverAskAgainAnswer;
   bool NeverAskAgainCheckedInitially;
@@ -118,7 +119,7 @@ Tbx::TTBXSeparatorItem * __fastcall AddMenuSeparator(Tb2item::TTBCustomItem * Me
 void __fastcall AddMenuLabel(Tb2item::TTBCustomItem * Menu, const UnicodeString & Label);
 void __fastcall ClickToolbarItem(Tb2item::TTBCustomItem * Item, bool PositionCursor);
 
-void InitiateDialogTimeout(TForm * Dialog, unsigned int Timeout, TButton * Button);
+void InitiateDialogTimeout(TForm * Dialog, unsigned int Timeout, TButton * Button, unsigned int Answer = 0);
 
 // windows\WinHelp.cpp
 void __fastcall InitializeWinHelp();