12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes a given program ("Google Chrome" by default) the default handler for
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// some URL protocol ("http" by default) on Windows 8. These defaults can be
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// overridden via the --program and --protocol command line switches.
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <windows.h>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/at_exit.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/win/atl_module.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "win8/test/open_with_dialog_controller.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSwitchProgram[] = "program";
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSwitchProtocol[] = "protocol";
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const wchar_t kDefaultProgram[] = L"Google Chrome";
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const wchar_t kDefaultProtocol[] = L"http";
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)extern "C"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int wmain(int argc, wchar_t* argv[]) {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the commandline singleton from the environment.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine::Init(0, NULL);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The exit manager is in charge of calling the dtors of singletons.
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AtExitManager exit_manager;
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  logging::LoggingSettings settings;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  logging::InitLogging(settings);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  logging::SetMinLogLevel(logging::LOG_VERBOSE);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::win::CreateATLModuleIfNeeded();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 protocol(command_line->GetSwitchValueNative(kSwitchProtocol));
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (protocol.empty())
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    protocol = kDefaultProtocol;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 program(command_line->GetSwitchValueNative(kSwitchProgram));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (program.empty())
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    program = kDefaultProgram;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> choices;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HRESULT result = S_OK;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  win8::OpenWithDialogController controller;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result = controller.RunSynchronously(NULL, protocol, program, &choices);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (SUCCEEDED(result)) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printf("success\n");
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (!choices.empty()) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    printf("failed to set program. possible choices: %ls\n",
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           JoinString(choices, L", ").c_str());
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    printf("failed with HRESULT: %0x08X\n", result);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return FAILED(result);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
66