xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Console/UserInputUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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