15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "win8/delegate_execute/delegate_execute_operation.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/win/windows_version.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "win8/delegate_execute/delegate_execute_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace delegate_execute {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DelegateExecuteOperation::DelegateExecuteOperation()
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : operation_type_(DELEGATE_EXECUTE) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DelegateExecuteOperation::~DelegateExecuteOperation() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DelegateExecuteOperation::Init(const CommandLine* cmd_line) {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (base::win::GetVersion() >= base::win::VERSION_WIN7) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::FilePath shortcut(
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        cmd_line->GetSwitchValuePath(switches::kRelaunchShortcut));
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // On Windows 7 the command line coming in may not have a path to the
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // shortcut to launch Chrome. We ignore the shortcut and just do a regular
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // ShellExecute of chrome.exe in this case.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (shortcut.empty() &&
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::win::GetVersion() >= base::win::VERSION_WIN8) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      operation_type_ = DELEGATE_EXECUTE;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return true;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    relaunch_shortcut_ = shortcut;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutex_ = cmd_line->GetSwitchValueNative(switches::kWaitForMutex);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mutex_.empty())
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the mode forcing flags, if any.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* the_switch = NULL;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cmd_line->HasSwitch(switches::kForceDesktop))
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the_switch = switches::kForceDesktop;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (cmd_line->HasSwitch(switches::kForceImmersive))
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the_switch = switches::kForceImmersive;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  relaunch_flags_ = ParametersFromSwitch(the_switch);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operation_type_ = RELAUNCH_CHROME;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DWORD DelegateExecuteOperation::GetParentPid() const {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<base::string16> parts;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(mutex_, L'.', &parts);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parts.size() != 3)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD pid;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::StringToUint(parts[2], reinterpret_cast<uint32*>(&pid)))
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pid;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace delegate_execute
66