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