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 = "?\n";
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 
ScanUserYesNoAllQuit(CStdOutStream * outStream)23 NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)
24 {
25   (*outStream) << kFirstQuestionMessage;
26   for (;;)
27   {
28     (*outStream) << kHelpQuestionMessage;
29     outStream->Flush();
30     AString scannedString = g_StdIn.ScanStringUntilNewLine();
31     scannedString.Trim();
32     if (!scannedString.IsEmpty())
33       switch(::MyCharLower_Ascii(scannedString[0]))
34       {
35         case kYes:    return NUserAnswerMode::kYes;
36         case kNo:     return NUserAnswerMode::kNo;
37         case kYesAll: return NUserAnswerMode::kYesAll;
38         case kNoAll:  return NUserAnswerMode::kNoAll;
39         case kAutoRenameAll: return NUserAnswerMode::kAutoRenameAll;
40         case kQuit:   return NUserAnswerMode::kQuit;
41       }
42   }
43 }
44 
45 #ifdef _WIN32
46 #ifndef UNDER_CE
47 #define MY_DISABLE_ECHO
48 #endif
49 #endif
50 
GetPassword(CStdOutStream * outStream)51 UString GetPassword(CStdOutStream *outStream)
52 {
53   (*outStream) << "\nEnter password"
54       #ifdef MY_DISABLE_ECHO
55       " (will not be echoed)"
56       #endif
57       ":";
58   outStream->Flush();
59 
60   #ifdef MY_DISABLE_ECHO
61   HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
62   bool wasChanged = false;
63   DWORD mode = 0;
64   if (console != INVALID_HANDLE_VALUE && console != 0)
65     if (GetConsoleMode(console, &mode))
66       wasChanged = (SetConsoleMode(console, mode & ~ENABLE_ECHO_INPUT) != 0);
67   UString res = g_StdIn.ScanUStringUntilNewLine();
68   if (wasChanged)
69     SetConsoleMode(console, mode);
70   (*outStream) << "\n";
71   outStream->Flush();
72   return res;
73   #else
74   return g_StdIn.ScanUStringUntilNewLine();
75   #endif
76 }
77