Index: cloud_print/service/win/cloud_print_service.cc |
diff --git a/cloud_print/service/win/cloud_print_service.cc b/cloud_print/service/win/cloud_print_service.cc |
index 976e59859e445e273ac69ad291182c9002aa9716..2eeac75ad92f55ddbf4b28c4ff2742c78c839ab6 100644 |
--- a/cloud_print/service/win/cloud_print_service.cc |
+++ b/cloud_print/service/win/cloud_print_service.cc |
@@ -10,9 +10,12 @@ |
#include "base/at_exit.h" |
#include "base/command_line.h" |
#include "base/file_path.h" |
+#include "base/file_util.h" |
#include "base/path_service.h" |
+#include "base/string_util.h" |
#include "base/win/scoped_handle.h" |
#include "cloud_print/service/win/resource.h" |
+#include "cloud_print/service/win/service_state.h" |
namespace { |
@@ -26,6 +29,8 @@ const char kServiceSwitch[] = "service"; |
const char kUserDataDirSwitch[] = "user-data-dir"; |
const char kQuietSwitch[] = "quiet"; |
+const wchar_t kServiceStateFileName[] = L"Service State"; |
+ |
// The traits class for Windows Service. |
class ServiceHandleTraits { |
public: |
@@ -98,6 +103,34 @@ void InvalidUsage() { |
std::cout << "\n"; |
} |
+std::string GetOption(const std::string& name, const std::string& default, |
+ bool secure) { |
+ std::cout << "Input \'" << name << "\'"; |
+ if (!default.empty()) { |
+ std::cout << ", press [ENTER] to keep '"; |
+ std::cout << default; |
+ std::cout << "'"; |
+ } |
+ std::cout << ":"; |
+ std::string tmp; |
+ |
+ if (secure) { |
+ DWORD saved_mode = 0; |
+ // Don't close. |
+ HANDLE stdin_handle = ::GetStdHandle(STD_INPUT_HANDLE); |
+ ::GetConsoleMode(stdin_handle, &saved_mode); |
+ ::SetConsoleMode(stdin_handle, saved_mode & ~ENABLE_ECHO_INPUT); |
+ std::getline(std::cin, tmp); |
+ ::SetConsoleMode(stdin_handle, saved_mode); |
+ std::cout << "\n"; |
+ } else { |
+ std::getline(std::cin, tmp); |
+ } |
+ if (tmp.empty()) |
+ return default; |
+ return tmp; |
+} |
+ |
} // namespace |
class CloudPrintServiceModule |
@@ -118,7 +151,7 @@ class CloudPrintServiceModule |
HRESULT Install(const FilePath& user_data_dir) { |
// TODO(vitalybuka): consider "lite" version if we don't want unregister |
// printers here. |
- if (!Uninstall()) |
+ if (!Uninstall()) |
return E_FAIL; |
FilePath service_path; |
@@ -196,7 +229,11 @@ class CloudPrintServiceModule |
} |
FilePath data_dir = command_line.GetSwitchValuePath(kUserDataDirSwitch); |
- HRESULT hr = Install(data_dir); |
+ HRESULT hr = ProcessServiceState(data_dir, |
+ command_line.HasSwitch(kQuietSwitch)); |
+ if (FAILED(hr)) |
+ return hr; |
+ hr = Install(data_dir); |
if (SUCCEEDED(hr) && command_line.HasSwitch(kStartSwitch)) |
return StartService(); |
@@ -216,6 +253,61 @@ class CloudPrintServiceModule |
return S_FALSE; |
} |
+ HRESULT ProcessServiceState(const FilePath& user_data_dir, bool quiet) { |
+ FilePath file = user_data_dir.Append(kServiceStateFileName); |
+ |
+ for (;;) { |
+ std::string contents; |
+ ServiceState service_state; |
+ |
+ bool is_valid = file_util::ReadFileToString(file, &contents) && |
+ service_state.FromString(contents); |
+ |
+ if (!quiet) { |
+ std::cout << file.value() << ":\n"; |
+ std::cout << contents << "\n"; |
+ } |
+ |
+ if (!is_valid) |
+ LOG(ERROR) << "Invalid file: " << file.value(); |
+ |
+ if (quiet) |
+ return is_valid ? S_OK : HRESULT_FROM_WIN32(ERROR_FILE_INVALID); |
+ |
+ std::cout << "Do you want to use this file [y/n]:"; |
+ for (;;) { |
+ std::string input; |
+ std::getline(std::cin, input); |
+ StringToLowerASCII(&input); |
+ if (input == "y") { |
+ return S_OK; |
+ } else if (input == "n") { |
+ is_valid = false; |
+ break; |
+ } |
+ } |
+ |
+ while (!is_valid) { |
+ std::string email = GetOption("email", service_state.email(), false); |
+ std::string password = GetOption("password", "", true); |
+ std::string proxy_id = GetOption("connector_id", |
+ service_state.proxy_id(), false); |
+ is_valid = service_state.Configure(email, password, proxy_id); |
+ if (is_valid) { |
+ std::string new_contents = service_state.ToString(); |
+ if (new_contents != contents) { |
+ if (file_util::WriteFile(file, new_contents.c_str(), |
+ new_contents.size()) <= 0) { |
+ return HResultFromLastError(); |
+ } |
+ } |
+ } |
+ } |
+ } |
+ |
+ return S_OK; |
+ } |
+ |
HRESULT OpenServiceManager(ServiceHandle* service_manager) { |
if (!service_manager) |
return E_POINTER; |