1*f6dc9357SAndroid Build Coastguard Worker // UserInputUtils.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StdInStream.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "UserInputUtils.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker static const char kYes = 'y';
11*f6dc9357SAndroid Build Coastguard Worker static const char kNo = 'n';
12*f6dc9357SAndroid Build Coastguard Worker static const char kYesAll = 'a';
13*f6dc9357SAndroid Build Coastguard Worker static const char kNoAll = 's';
14*f6dc9357SAndroid Build Coastguard Worker static const char kAutoRenameAll = 'u';
15*f6dc9357SAndroid Build Coastguard Worker static const char kQuit = 'q';
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker static const char * const kFirstQuestionMessage = "? ";
18*f6dc9357SAndroid Build Coastguard Worker static const char * const kHelpQuestionMessage =
19*f6dc9357SAndroid Build Coastguard Worker "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? ";
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker // return true if pressed Quite;
22*f6dc9357SAndroid Build Coastguard Worker
ScanUserYesNoAllQuit(CStdOutStream * outStream)23*f6dc9357SAndroid Build Coastguard Worker NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker if (outStream)
26*f6dc9357SAndroid Build Coastguard Worker *outStream << kFirstQuestionMessage;
27*f6dc9357SAndroid Build Coastguard Worker for (;;)
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker if (outStream)
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker *outStream << kHelpQuestionMessage;
32*f6dc9357SAndroid Build Coastguard Worker outStream->Flush();
33*f6dc9357SAndroid Build Coastguard Worker }
34*f6dc9357SAndroid Build Coastguard Worker AString scannedString;
35*f6dc9357SAndroid Build Coastguard Worker if (!g_StdIn.ScanAStringUntilNewLine(scannedString))
36*f6dc9357SAndroid Build Coastguard Worker return NUserAnswerMode::kError;
37*f6dc9357SAndroid Build Coastguard Worker if (g_StdIn.Error())
38*f6dc9357SAndroid Build Coastguard Worker return NUserAnswerMode::kError;
39*f6dc9357SAndroid Build Coastguard Worker scannedString.Trim();
40*f6dc9357SAndroid Build Coastguard Worker if (scannedString.IsEmpty() && g_StdIn.Eof())
41*f6dc9357SAndroid Build Coastguard Worker return NUserAnswerMode::kEof;
42*f6dc9357SAndroid Build Coastguard Worker
43*f6dc9357SAndroid Build Coastguard Worker if (scannedString.Len() == 1)
44*f6dc9357SAndroid Build Coastguard Worker switch (::MyCharLower_Ascii(scannedString[0]))
45*f6dc9357SAndroid Build Coastguard Worker {
46*f6dc9357SAndroid Build Coastguard Worker case kYes: return NUserAnswerMode::kYes;
47*f6dc9357SAndroid Build Coastguard Worker case kNo: return NUserAnswerMode::kNo;
48*f6dc9357SAndroid Build Coastguard Worker case kYesAll: return NUserAnswerMode::kYesAll;
49*f6dc9357SAndroid Build Coastguard Worker case kNoAll: return NUserAnswerMode::kNoAll;
50*f6dc9357SAndroid Build Coastguard Worker case kAutoRenameAll: return NUserAnswerMode::kAutoRenameAll;
51*f6dc9357SAndroid Build Coastguard Worker case kQuit: return NUserAnswerMode::kQuit;
52*f6dc9357SAndroid Build Coastguard Worker default: break;
53*f6dc9357SAndroid Build Coastguard Worker }
54*f6dc9357SAndroid Build Coastguard Worker }
55*f6dc9357SAndroid Build Coastguard Worker }
56*f6dc9357SAndroid Build Coastguard Worker
57*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
58*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE
59*f6dc9357SAndroid Build Coastguard Worker #define MY_DISABLE_ECHO
60*f6dc9357SAndroid Build Coastguard Worker #endif
61*f6dc9357SAndroid Build Coastguard Worker #endif
62*f6dc9357SAndroid Build Coastguard Worker
GetPassword(CStdOutStream * outStream,UString & psw)63*f6dc9357SAndroid Build Coastguard Worker static bool GetPassword(CStdOutStream *outStream, UString &psw)
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker if (outStream)
66*f6dc9357SAndroid Build Coastguard Worker {
67*f6dc9357SAndroid Build Coastguard Worker *outStream << "\nEnter password"
68*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_DISABLE_ECHO
69*f6dc9357SAndroid Build Coastguard Worker " (will not be echoed)"
70*f6dc9357SAndroid Build Coastguard Worker #endif
71*f6dc9357SAndroid Build Coastguard Worker ":";
72*f6dc9357SAndroid Build Coastguard Worker outStream->Flush();
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker
75*f6dc9357SAndroid Build Coastguard Worker #ifdef MY_DISABLE_ECHO
76*f6dc9357SAndroid Build Coastguard Worker
77*f6dc9357SAndroid Build Coastguard Worker const HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
78*f6dc9357SAndroid Build Coastguard Worker
79*f6dc9357SAndroid Build Coastguard Worker /*
80*f6dc9357SAndroid Build Coastguard Worker GetStdHandle() returns
81*f6dc9357SAndroid Build Coastguard Worker INVALID_HANDLE_VALUE: If the function fails.
82*f6dc9357SAndroid Build Coastguard Worker NULL : If an application does not have associated standard handles,
83*f6dc9357SAndroid Build Coastguard Worker such as a service running on an interactive desktop,
84*f6dc9357SAndroid Build Coastguard Worker and has not redirected them. */
85*f6dc9357SAndroid Build Coastguard Worker bool wasChanged = false;
86*f6dc9357SAndroid Build Coastguard Worker DWORD mode = 0;
87*f6dc9357SAndroid Build Coastguard Worker if (console != INVALID_HANDLE_VALUE && console != NULL)
88*f6dc9357SAndroid Build Coastguard Worker if (GetConsoleMode(console, &mode))
89*f6dc9357SAndroid Build Coastguard Worker wasChanged = (SetConsoleMode(console, mode & ~(DWORD)ENABLE_ECHO_INPUT) != 0);
90*f6dc9357SAndroid Build Coastguard Worker const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
91*f6dc9357SAndroid Build Coastguard Worker if (wasChanged)
92*f6dc9357SAndroid Build Coastguard Worker SetConsoleMode(console, mode);
93*f6dc9357SAndroid Build Coastguard Worker
94*f6dc9357SAndroid Build Coastguard Worker #else
95*f6dc9357SAndroid Build Coastguard Worker
96*f6dc9357SAndroid Build Coastguard Worker const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
97*f6dc9357SAndroid Build Coastguard Worker
98*f6dc9357SAndroid Build Coastguard Worker #endif
99*f6dc9357SAndroid Build Coastguard Worker
100*f6dc9357SAndroid Build Coastguard Worker if (outStream)
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker *outStream << endl;
103*f6dc9357SAndroid Build Coastguard Worker outStream->Flush();
104*f6dc9357SAndroid Build Coastguard Worker }
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker return res;
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker
GetPassword_HRESULT(CStdOutStream * outStream,UString & psw)109*f6dc9357SAndroid Build Coastguard Worker HRESULT GetPassword_HRESULT(CStdOutStream *outStream, UString &psw)
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker if (!GetPassword(outStream, psw))
112*f6dc9357SAndroid Build Coastguard Worker return E_INVALIDARG;
113*f6dc9357SAndroid Build Coastguard Worker if (g_StdIn.Error())
114*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
115*f6dc9357SAndroid Build Coastguard Worker if (g_StdIn.Eof() && psw.IsEmpty())
116*f6dc9357SAndroid Build Coastguard Worker return E_ABORT;
117*f6dc9357SAndroid Build Coastguard Worker return S_OK;
118*f6dc9357SAndroid Build Coastguard Worker }
119