UserInputUtils.cpp revision baa3858d3f5d128a5c8466b700098109edcad5f2
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
10static const char kYes = 'Y';
11static const char kNo = 'N';
12static const char kYesAll = 'A';
13static const char kNoAll = 'S';
14static const char kAutoRenameAll = 'U';
15static const char kQuit = 'Q';
16
17static const char *kFirstQuestionMessage = "?\n";
18static 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
23NUserAnswerMode::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(
34        ::MyCharUpper(
35        #ifdef UNDER_CE
36        (wchar_t)
37        #endif
38        scannedString[0]))
39      {
40        case kYes:
41          return NUserAnswerMode::kYes;
42        case kNo:
43          return NUserAnswerMode::kNo;
44        case kYesAll:
45          return NUserAnswerMode::kYesAll;
46        case kNoAll:
47          return NUserAnswerMode::kNoAll;
48        case kAutoRenameAll:
49          return NUserAnswerMode::kAutoRenameAll;
50        case kQuit:
51          return NUserAnswerMode::kQuit;
52      }
53  }
54}
55
56#ifdef _WIN32
57#ifndef UNDER_CE
58#define MY_DISABLE_ECHO
59#endif
60#endif
61
62UString GetPassword(CStdOutStream *outStream)
63{
64  (*outStream) << "\nEnter password"
65      #ifdef MY_DISABLE_ECHO
66      " (will not be echoed)"
67      #endif
68      ":";
69  outStream->Flush();
70
71  #ifdef MY_DISABLE_ECHO
72  HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
73  bool wasChanged = false;
74  DWORD mode = 0;
75  if (console != INVALID_HANDLE_VALUE && console != 0)
76    if (GetConsoleMode(console, &mode))
77      wasChanged = (SetConsoleMode(console, mode & ~ENABLE_ECHO_INPUT) != 0);
78  UString res = g_StdIn.ScanUStringUntilNewLine();
79  if (wasChanged)
80    SetConsoleMode(console, mode);
81  (*outStream) << "\n";
82  outStream->Flush();
83  return res;
84  #else
85  return g_StdIn.ScanUStringUntilNewLine();
86  #endif
87}
88