diff options
author | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-17 18:41:59 +0000 |
---|---|---|
committer | alexeypa@chromium.org <alexeypa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-17 18:41:59 +0000 |
commit | b29bd891a10d78ac675e5e9074bacdb97ba82286 (patch) | |
tree | a9854c746de3261df42d6120b84f3856ce452785 /remoting | |
parent | 74174cc887b62e183c2b208ec7416af84ac16e93 (diff) | |
download | chromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.zip chromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.tar.gz chromium_src-b29bd891a10d78ac675e5e9074bacdb97ba82286.tar.bz2 |
[Chromoting] Avoid potential conflicts leading to pending reboots while upgrading the me2me host:
- Install the host binaries to versioned folders.
- Drop references to the COM objects quickly.
- Auto-generate CLSID of the daemon controller at GYP time. This makes sure that a freshly installed version of the controller will be launched after upgrade even if there is already running instance cached by RPCSS.
This CL restores https://chromiumcodereview.appspot.com/10831037 (r148671) and https://chromiumcodereview.appspot.com/10837087 (r149866) previously reverted by r150494. Unlike the previous two CLs this one does not require GYP changes (that is changes to GYP itself, not .gyp files).
BUG=137755
Review URL: https://chromiumcodereview.appspot.com/10828352
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152120 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
-rw-r--r-- | remoting/host/plugin/daemon_controller_win.cc | 22 | ||||
-rw-r--r-- | remoting/host/win/chromoting.wxs | 20 | ||||
-rw-r--r-- | remoting/host/win/elevated_controller.h | 7 | ||||
-rw-r--r-- | remoting/host/win/elevated_controller_idl.templ (renamed from remoting/host/win/elevated_controller.idl) | 2 | ||||
-rw-r--r-- | remoting/remoting.gyp | 30 | ||||
-rwxr-xr-x | remoting/tools/candle_and_light.py | 2 | ||||
-rwxr-xr-x | remoting/tools/uuidgen.py | 18 |
7 files changed, 86 insertions, 15 deletions
diff --git a/remoting/host/plugin/daemon_controller_win.cc b/remoting/host/plugin/daemon_controller_win.cc index 2d8082c..2985652 100644 --- a/remoting/host/plugin/daemon_controller_win.cc +++ b/remoting/host/plugin/daemon_controller_win.cc @@ -51,8 +51,17 @@ const wchar_t kDaemonControllerElevationMoniker[] = // Name of the Daemon Controller's worker thread. const char kDaemonControllerThreadName[] = "Daemon Controller thread"; -// The maximum interval between showing UAC prompts. -const int kUacTimeoutSec = 15 * 60; +// The maximum duration of keeping a reference to a privileged instance of +// the Daemon Controller. This effectively reduces number of UAC prompts a user +// sees. +const int kPrivilegedTimeoutSec = 5 * 60; + +// The maximum duration of keeping a reference to an unprivileged instance of +// the Daemon Controller. This interval should not be too long. If upgrade +// happens while there is a live reference to a Daemon Controller instance +// the old binary still can be used. So dropping the references often makes sure +// that the old binary will go away sooner. +const int kUnprivilegedTimeoutSec = 60; // A base::Thread implementation that initializes COM on the new thread. class ComThread : public base::Thread { @@ -296,6 +305,13 @@ HRESULT DaemonControllerWin::ActivateController() { // Ignore the error. IID_IDaemonControl2 is optional. control_.QueryInterface(IID_IDaemonControl2, control2_.ReceiveVoid()); + + // Release |control_| upon expiration of the timeout. + release_timer_.reset(new base::OneShotTimer<DaemonControllerWin>()); + release_timer_->Start(FROM_HERE, + base::TimeDelta::FromSeconds(kUnprivilegedTimeoutSec), + this, + &DaemonControllerWin::ReleaseController); } return S_OK; @@ -339,7 +355,7 @@ HRESULT DaemonControllerWin::ActivateElevatedController() { // Release |control_| upon expiration of the timeout. release_timer_.reset(new base::OneShotTimer<DaemonControllerWin>()); release_timer_->Start(FROM_HERE, - base::TimeDelta::FromSeconds(kUacTimeoutSec), + base::TimeDelta::FromSeconds(kPrivilegedTimeoutSec), this, &DaemonControllerWin::ReleaseController); } diff --git a/remoting/host/win/chromoting.wxs b/remoting/host/win/chromoting.wxs index 57f8789..bf8170f 100644 --- a/remoting/host/win/chromoting.wxs +++ b/remoting/host/win/chromoting.wxs @@ -26,7 +26,6 @@ <?define ControllerAppid = "{4ff35d5e-d226-4550-9248-03e7779e67de}" ?> <?define ControllerBinary = "remoting_host_controller.exe" ?> <?define ControllerClass = "ElevatedController Class" ?> - <?define ControllerClsid = "{430a9403-8176-4733-afdc-0b325a8fda84}" ?> <?define ControllerProgid = "ChromotingElevatedController.ElevatedController" ?> <?define ControllerTypelib = "{9d9a5a2c-576e-4acd-9c75-aabff74b205d}" ?> @@ -44,6 +43,10 @@ --> <?define ControllerSd = "010004805C0000006C00000000000000140000000200480003000000000014000300000001010000000000050400000000001400030000000101000000000005120000000000180003000000010200000000000520000000200200000102000000000005200000002002000001020000000000052000000020020000" ?> + <?ifndef ControllerClsid ?> + <?error ControllerClsid must be defined ?> + <?endif?> + <?ifndef FileSource ?> <?error FileSource must be defined ?> <?endif?> @@ -90,10 +93,14 @@ <Directory Id="ProgramFilesFolder"> <?ifdef OfficialBuild ?> <Directory Id="program_files_google" Name="Google"> - <Directory Id="binaries" Name="Chrome Remote Desktop"/> + <Directory Id="chromoting" Name="Chrome Remote Desktop"> + <Directory Id="binaries" Name="$(var.Version)"/> + </Directory> </Directory> <?else?> - <Directory Id="binaries" Name="Chromoting"/> + <Directory Id="chromoting" Name="Chromoting"> + <Directory Id="binaries" Name="$(var.Version)"/> + </Directory> <?endif?> </Directory> <Directory Id="CommonAppDataFolder"> @@ -217,11 +224,12 @@ <RegistryKey Key="CurVer" Action="create"> <RegistryValue Type="string" - Value="$(var.ControllerProgid).1"/> + Value="$(var.ControllerProgid).$(var.Version)"/> </RegistryKey> </RegistryKey> - <RegistryKey Key="$(var.ControllerProgid).1" Action="create"> + <RegistryKey Key="$(var.ControllerProgid).$(var.Version)" + Action="create"> <RegistryValue Type="string" Value="$(var.ControllerClass)"/> @@ -251,7 +259,7 @@ <RegistryKey Key="ProgID" Action="create"> <RegistryValue Type="string" - Value="$(var.ControllerProgid).1"/> + Value="$(var.ControllerProgid).$(var.Version)"/> </RegistryKey> <RegistryKey Key="TypeLib" Action="create"> diff --git a/remoting/host/win/elevated_controller.h b/remoting/host/win/elevated_controller.h index dc33e1e..23bd3a5 100644 --- a/remoting/host/win/elevated_controller.h +++ b/remoting/host/win/elevated_controller.h @@ -16,9 +16,10 @@ namespace remoting { -class ATL_NO_VTABLE ElevatedController +class ATL_NO_VTABLE __declspec(uuid(DAEMON_CONTROLLER_CLSID)) ElevatedController : public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>, - public ATL::CComCoClass<ElevatedController, &CLSID_ElevatedController>, + public ATL::CComCoClass<ElevatedController, + &__uuidof(ElevatedController)>, public ATL::IDispatchImpl<IDaemonControl2, &IID_IDaemonControl2, &LIBID_ChromotingElevatedControllerLib, 1, 1> { public: @@ -57,7 +58,7 @@ class ATL_NO_VTABLE ElevatedController DECLARE_PROTECT_FINAL_CONSTRUCT() }; -OBJECT_ENTRY_AUTO(CLSID_ElevatedController, ElevatedController) +OBJECT_ENTRY_AUTO(__uuidof(ElevatedController), ElevatedController) } // namespace remoting diff --git a/remoting/host/win/elevated_controller.idl b/remoting/host/win/elevated_controller_idl.templ index 590b8dd..27b15ae 100644 --- a/remoting/host/win/elevated_controller.idl +++ b/remoting/host/win/elevated_controller_idl.templ @@ -73,7 +73,7 @@ library ChromotingElevatedControllerLib { importlib("stdole2.tlb"); [ - uuid(430a9403-8176-4733-afdc-0b325a8fda84), + uuid(@DAEMON_CONTROLLER_CLSID@), helpstring("ElevatedController Class") ] coclass ElevatedController { diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp index 8b0fbd4..6154111 100644 --- a/remoting/remoting.gyp +++ b/remoting/remoting.gyp @@ -118,6 +118,12 @@ 'webapp/_locales/en/messages.json', ], }], + ['OS=="win"', { + # Use auto-generated CLSID for the daemon controller to make sure that + # the newly installed version of the controller will be used during + # upgrade even if there is an old instance running already. + 'daemon_controller_clsid': '<!(python tools/uuidgen.py)', + }], ], 'remoting_webapp_files': [ 'resources/chromoting16.png', @@ -508,13 +514,13 @@ 'tools/breakpad_tester_win.cc', ], }, # end of target 'remoting_breakpad_tester' - { 'target_name': 'remoting_elevated_controller', 'type': 'static_library', 'sources': [ - 'host/win/elevated_controller.idl', + 'host/win/elevated_controller_idl.templ', '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.h', + '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.idl', '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller_i.c', ], # This target exports a hard dependency because dependent targets may @@ -530,6 +536,24 @@ '<(SHARED_INTERMEDIATE_DIR)', ], }, + 'rules': [ + { + 'rule_name': 'generate_idl', + 'extension': 'templ', + 'outputs': [ + '<(SHARED_INTERMEDIATE_DIR)/remoting/host/elevated_controller.idl', + ], + 'action': [ + 'python', + '<(version_py_path)', + '-e', 'DAEMON_CONTROLLER_CLSID="<(daemon_controller_clsid)"', + '<(RULE_INPUT_PATH)', + '<@(_outputs)', + ], + 'process_outputs_as_sources': 1, + 'message': 'Generating <@(_outputs)' + }, + ], }, # end of target 'remoting_elevated_controller' { 'target_name': 'remoting_host_controller', @@ -540,6 +564,7 @@ '_ATL_NO_AUTOMATIC_NAMESPACE', '_ATL_CSTRING_EXPLICIT_CONSTRUCTORS', 'STRICT', + 'DAEMON_CONTROLLER_CLSID="{<(daemon_controller_clsid)}"', ], 'include_dirs': [ '<(INTERMEDIATE_DIR)', @@ -767,6 +792,7 @@ 'action': [ 'python', 'tools/candle_and_light.py', '--wix_path', '<(wix_path)', + '--controller_clsid', '{<(daemon_controller_clsid)}', '--version', '<(version_full)', '--product_dir', '<(PRODUCT_DIR).', '--intermediate_dir', '<(INTERMEDIATE_DIR).', diff --git a/remoting/tools/candle_and_light.py b/remoting/tools/candle_and_light.py index 056bffd..74a2572 100755 --- a/remoting/tools/candle_and_light.py +++ b/remoting/tools/candle_and_light.py @@ -23,6 +23,7 @@ def main(): parser = OptionParser() parser.add_option('--wix_path', dest='wix_path') parser.add_option('--version', dest='version') + parser.add_option('--controller_clsid', dest='controller_clsid') parser.add_option('--product_dir', dest='product_dir') parser.add_option('--intermediate_dir', dest='intermediate_dir') parser.add_option('--sas_dll_path', dest='sas_dll_path') @@ -42,6 +43,7 @@ def main(): '-ext "%(wix_path)s\\WixFirewallExtension.dll" ' '-ext "%(wix_path)s\\WixUIExtension.dll" ' '-ext "%(wix_path)s\\WixUtilExtension.dll" ' + '"-dControllerClsid="%(controller_clsid)s"" ' '-dVersion=%(version)s ' '"-dFileSource=%(product_dir)s" ' '-dIconPath=resources/chromoting.ico ' diff --git a/remoting/tools/uuidgen.py b/remoting/tools/uuidgen.py new file mode 100755 index 0000000..ed1e415 --- /dev/null +++ b/remoting/tools/uuidgen.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# 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. + +""" +uuidgen.py -- UUID generation utility. +""" + +import sys +import uuid + +def main(): + print uuid.uuid4() + return 0 + +if __name__ == '__main__': + sys.exit(main()) |