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