• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 * const kFirstQuestionMessage = "? ";
18 static const char * const 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   if (outStream)
26     *outStream << kFirstQuestionMessage;
27   for (;;)
28   {
29     if (outStream)
30     {
31       *outStream << kHelpQuestionMessage;
32       outStream->Flush();
33     }
34     AString scannedString;
35     if (!g_StdIn.ScanAStringUntilNewLine(scannedString))
36       return NUserAnswerMode::kError;
37     if (g_StdIn.Error())
38       return NUserAnswerMode::kError;
39     scannedString.Trim();
40     if (scannedString.IsEmpty() && g_StdIn.Eof())
41       return NUserAnswerMode::kEof;
42 
43     if (scannedString.Len() == 1)
44       switch (::MyCharLower_Ascii(scannedString[0]))
45       {
46         case kYes:    return NUserAnswerMode::kYes;
47         case kNo:     return NUserAnswerMode::kNo;
48         case kYesAll: return NUserAnswerMode::kYesAll;
49         case kNoAll:  return NUserAnswerMode::kNoAll;
50         case kAutoRenameAll: return NUserAnswerMode::kAutoRenameAll;
51         case kQuit:   return NUserAnswerMode::kQuit;
52       }
53   }
54 }
55 
56 #ifdef _WIN32
57 #ifndef UNDER_CE
58 #define MY_DISABLE_ECHO
59 #endif
60 #endif
61 
GetPassword(CStdOutStream * outStream,UString & psw)62 static bool GetPassword(CStdOutStream *outStream, UString &psw)
63 {
64   if (outStream)
65   {
66     *outStream << "\nEnter password"
67       #ifdef MY_DISABLE_ECHO
68       " (will not be echoed)"
69       #endif
70       ":";
71     outStream->Flush();
72   }
73 
74   #ifdef MY_DISABLE_ECHO
75 
76   const HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
77 
78   /*
79   GetStdHandle() returns
80     INVALID_HANDLE_VALUE: If the function fails.
81     NULL : If an application does not have associated standard handles,
82            such as a service running on an interactive desktop,
83            and has not redirected them. */
84   bool wasChanged = false;
85   DWORD mode = 0;
86   if (console != INVALID_HANDLE_VALUE && console != NULL)
87     if (GetConsoleMode(console, &mode))
88       wasChanged = (SetConsoleMode(console, mode & ~(DWORD)ENABLE_ECHO_INPUT) != 0);
89   const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
90   if (wasChanged)
91     SetConsoleMode(console, mode);
92 
93   #else
94 
95   const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
96 
97   #endif
98 
99   if (outStream)
100   {
101     *outStream << endl;
102     outStream->Flush();
103   }
104 
105   return res;
106 }
107 
GetPassword_HRESULT(CStdOutStream * outStream,UString & psw)108 HRESULT GetPassword_HRESULT(CStdOutStream *outStream, UString &psw)
109 {
110   if (!GetPassword(outStream, psw))
111     return E_INVALIDARG;
112   if (g_StdIn.Error())
113     return E_FAIL;
114   if (g_StdIn.Eof() && psw.IsEmpty())
115     return E_ABORT;
116   return S_OK;
117 }
118