Home | History | Annotate | Download | only in Console
      1 // UserInputUtils.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../../Common/StdInStream.h"
      6 #include "../../../Common/StringConvert.h"
      7 
      8 #include "UserInputUtils.h"
      9 
     10 static const char kYes = 'y';
     11 static const char kNo = 'n';
     12 static const char kYesAll = 'a';
     13 static const char kNoAll = 's';
     14 static const char kAutoRenameAll = 'u';
     15 static const char kQuit = 'q';
     16 
     17 static const char *kFirstQuestionMessage = "? ";
     18 static const char *kHelpQuestionMessage =
     19   "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? ";
     20 
     21 // return true if pressed Quite;
     22 
     23 NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)
     24 {
     25   if (outStream)
     26     *outStream << kFirstQuestionMessage;
     27   for (;;)
     28   {
     29     if (outStream)
     30     {
     31       *outStream << kHelpQuestionMessage;
     32       outStream->Flush();
     33     }
     34     AString scannedString = g_StdIn.ScanStringUntilNewLine();
     35     scannedString.Trim();
     36     if (!scannedString.IsEmpty())
     37       switch (::MyCharLower_Ascii(scannedString[0]))
     38       {
     39         case kYes:    return NUserAnswerMode::kYes;
     40         case kNo:     return NUserAnswerMode::kNo;
     41         case kYesAll: return NUserAnswerMode::kYesAll;
     42         case kNoAll:  return NUserAnswerMode::kNoAll;
     43         case kAutoRenameAll: return NUserAnswerMode::kAutoRenameAll;
     44         case kQuit:   return NUserAnswerMode::kQuit;
     45       }
     46   }
     47 }
     48 
     49 #ifdef _WIN32
     50 #ifndef UNDER_CE
     51 #define MY_DISABLE_ECHO
     52 #endif
     53 #endif
     54 
     55 UString GetPassword(CStdOutStream *outStream)
     56 {
     57   if (outStream)
     58   {
     59     *outStream << "\nEnter password"
     60       #ifdef MY_DISABLE_ECHO
     61       " (will not be echoed)"
     62       #endif
     63       ":";
     64     outStream->Flush();
     65   }
     66 
     67   #ifdef MY_DISABLE_ECHO
     68 
     69   HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
     70   bool wasChanged = false;
     71   DWORD mode = 0;
     72   if (console != INVALID_HANDLE_VALUE && console != 0)
     73     if (GetConsoleMode(console, &mode))
     74       wasChanged = (SetConsoleMode(console, mode & ~ENABLE_ECHO_INPUT) != 0);
     75   UString res = g_StdIn.ScanUStringUntilNewLine();
     76   if (wasChanged)
     77     SetConsoleMode(console, mode);
     78   if (outStream)
     79   {
     80     *outStream << endl;
     81     outStream->Flush();
     82   }
     83   return res;
     84 
     85   #else
     86 
     87   return g_StdIn.ScanUStringUntilNewLine();
     88 
     89   #endif
     90 }
     91