// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef WIN8_DELEGATE_EXECUTE_DELEGATE_EXECUTE_OPERATION_H_
#define WIN8_DELEGATE_EXECUTE_DELEGATE_EXECUTE_OPERATION_H_

#include <windows.h>
#include <atldef.h>

#include "base/basictypes.h"
#include "base/files/file_path.h"
#include "base/strings/string16.h"

namespace base {
class CommandLine;
}

namespace delegate_execute {

// Parses a portion of the DelegateExecute handler's command line to determine
// the desired operation. The operation type is decided by looking at the
// command line. The operations are:
// DELEGATE_EXECUTE:
//   When the delegate_execute.exe is invoked by windows when a chrome
//   activation via the shell, possibly using ShellExecute. Control must
//   be given to ATLs WinMain.
// RELAUNCH_CHROME:
//   When the delegate_execute.exe is launched by chrome, when chrome needs
//   to re-launch itself. The required command line parameters are:
//     --relaunch-shortcut=<PathToShortcut>
//     --wait-for-mutex=<MutexNamePid>
//   The PathToShortcut must be the fully qualified file name to the chrome
//   shortcut that has the appId and other 'metro ready' parameters.
//   The MutexNamePid is a mutex name that also encodes the process id and
//   must follow the format <A>.<B>.<pid> where A and B are arbitray strings
//   (usually chrome.relaunch) and pid is the process id of chrome.
class DelegateExecuteOperation {
 public:
  enum OperationType {
    DELEGATE_EXECUTE,
    RELAUNCH_CHROME,
  };

  DelegateExecuteOperation();
  ~DelegateExecuteOperation();

  bool Init(const base::CommandLine* cmd_line);

  OperationType operation_type() const {
    return operation_type_;
  }

  const base::string16& relaunch_flags() const {
    return relaunch_flags_;
  }

  const base::string16& mutex() const {
    return mutex_;
  }

  // Returns the process id of the parent or 0 on failure.
  DWORD GetParentPid() const;

  const base::FilePath& shortcut() const {
    return relaunch_shortcut_;
  }

 private:
  OperationType operation_type_;
  base::string16 relaunch_flags_;
  base::FilePath relaunch_shortcut_;
  base::string16 mutex_;

  DISALLOW_COPY_AND_ASSIGN(DelegateExecuteOperation);
};

}  // namespace delegate_execute

#endif  // WIN8_DELEGATE_EXECUTE_DELEGATE_EXECUTE_OPERATION_H_