Home | History | Annotate | Download | only in delegate_execute
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <atlbase.h>
      6 #include <atlcom.h>
      7 #include <atlctl.h>
      8 #include <ShObjIdl.h>
      9 #include <WinInet.h>
     10 
     11 #include <string>
     12 
     13 #include "base/command_line.h"
     14 #include "base/files/file_path.h"
     15 #include "base/process/process_handle.h"
     16 #include "win8/delegate_execute/resource.h"       // main symbols
     17 
     18 EXTERN_C const GUID CLSID_CommandExecuteImpl;
     19 
     20 // CommandExecuteImpl
     21 // This class implements the IExecuteCommand and related interfaces for
     22 // handling ShellExecute launches of the Chrome browser, i.e. whether to
     23 // launch Chrome in metro mode or desktop mode.
     24 // The CLSID here is a dummy CLSID not used for anything, since we register
     25 // the class with a dynamic CLSID.  However, a static CLSID is necessary
     26 // so that we can force at least one entry into ATL's object map (it will
     27 // treat a 0-element object map as an initialization failure case).
     28 class ATL_NO_VTABLE DECLSPEC_UUID("071BB5F2-85A4-424F-BFE7-5F1609BE4C2C")
     29     CommandExecuteImpl
     30     : public CComObjectRootEx<CComSingleThreadModel>,
     31       public CComCoClass<CommandExecuteImpl, &CLSID_CommandExecuteImpl>,
     32       public IExecuteCommand,
     33       public IObjectWithSiteImpl<CommandExecuteImpl>,
     34       public IInitializeCommand,
     35       public IObjectWithSelection,
     36       public IExecuteCommandApplicationHostEnvironment,
     37       public IForegroundTransfer {
     38  public:
     39   CommandExecuteImpl();
     40 
     41   DECLARE_REGISTRY_RESOURCEID(IDR_COMMANDEXECUTEIMPL)
     42 
     43   BEGIN_COM_MAP(CommandExecuteImpl)
     44     COM_INTERFACE_ENTRY(IExecuteCommand)
     45     COM_INTERFACE_ENTRY(IObjectWithSite)
     46     COM_INTERFACE_ENTRY(IInitializeCommand)
     47     COM_INTERFACE_ENTRY(IObjectWithSelection)
     48     COM_INTERFACE_ENTRY(IExecuteCommandApplicationHostEnvironment)
     49     COM_INTERFACE_ENTRY(IForegroundTransfer)
     50   END_COM_MAP()
     51 
     52   DECLARE_PROTECT_FINAL_CONSTRUCT()
     53 
     54   HRESULT FinalConstruct() {
     55     return S_OK;
     56   }
     57 
     58   void FinalRelease() {
     59   }
     60 
     61  public:
     62   // IExecuteCommand
     63   STDMETHOD(SetKeyState)(DWORD key_state);
     64   STDMETHOD(SetParameters)(LPCWSTR params);
     65   STDMETHOD(SetPosition)(POINT pt);
     66   STDMETHOD(SetShowWindow)(int show);
     67   STDMETHOD(SetNoShowUI)(BOOL no_show_ui);
     68   STDMETHOD(SetDirectory)(LPCWSTR directory);
     69   STDMETHOD(Execute)(void);
     70 
     71   // IInitializeCommand
     72   STDMETHOD(Initialize)(LPCWSTR name, IPropertyBag* bag);
     73 
     74   // IObjectWithSelection
     75   STDMETHOD(SetSelection)(IShellItemArray* item_array);
     76   STDMETHOD(GetSelection)(REFIID riid, void** selection);
     77 
     78   // IExecuteCommandApplicationHostEnvironment
     79   STDMETHOD(GetValue)(enum AHE_TYPE* pahe);
     80 
     81   // IForegroundTransfer
     82   STDMETHOD(AllowForegroundTransfer)(void* reserved);
     83 
     84   static bool FindChromeExe(base::FilePath* chrome_exe);
     85 
     86  private:
     87 
     88   static bool path_provider_initialized_;
     89 
     90   bool GetLaunchScheme(base::string16* display_name, INTERNET_SCHEME* scheme);
     91   HRESULT LaunchDesktopChrome();
     92   // Returns the launch mode, i.e. desktop launch/metro launch, etc.
     93   EC_HOST_UI_MODE GetLaunchMode();
     94 
     95   CComPtr<IShellItemArray> item_array_;
     96   base::CommandLine parameters_;
     97   base::FilePath chrome_exe_;
     98   STARTUPINFO start_info_;
     99   base::string16 verb_;
    100   base::string16 display_name_;
    101   INTERNET_SCHEME launch_scheme_;
    102 
    103   base::IntegrityLevel integrity_level_;
    104 };
    105 
    106 OBJECT_ENTRY_AUTO(__uuidof(CommandExecuteImpl), CommandExecuteImpl)
    107