15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UserInputUtils.cpp
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "StdAfx.h"
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Common/StdInStream.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "Common/StringConvert.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "UserInputUtils.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kYes = 'Y';
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kNo = 'N';
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kYesAll = 'A';
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kNoAll = 'S';
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kAutoRenameAll = 'U';
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kQuit = 'Q';
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *kFirstQuestionMessage = "?\n";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *kHelpQuestionMessage =
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "(Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? ";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return true if pressed Quite;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*outStream) << kFirstQuestionMessage;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (;;)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*outStream) << kHelpQuestionMessage;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outStream->Flush();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AString scannedString = g_StdIn.ScanStringUntilNewLine();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scannedString.Trim();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!scannedString.IsEmpty())
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ::MyCharUpper(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        #ifdef UNDER_CE
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (wchar_t)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        #endif
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scannedString[0]))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kYes:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kYes;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNo:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kNo;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kYesAll:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kYesAll;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kNoAll:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kNoAll;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kAutoRenameAll:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kAutoRenameAll;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case kQuit:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return NUserAnswerMode::kQuit;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef _WIN32
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UNDER_CE
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MY_DISABLE_ECHO
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UString GetPassword(CStdOutStream *outStream)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*outStream) << "\nEnter password"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #ifdef MY_DISABLE_ECHO
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " (will not be echoed)"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #endif
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ":";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outStream->Flush();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #ifdef MY_DISABLE_ECHO
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool wasChanged = false;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD mode = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (console != INVALID_HANDLE_VALUE && console != 0)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetConsoleMode(console, &mode))
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wasChanged = (SetConsoleMode(console, mode & ~ENABLE_ECHO_INPUT) != 0);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UString res = g_StdIn.ScanUStringUntilNewLine();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (wasChanged)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetConsoleMode(console, mode);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*outStream) << "\n";
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  outStream->Flush();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return res;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #else
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_StdIn.ScanUStringUntilNewLine();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)