diff options
-rw-r--r-- | remoting/host/elevated_controller_win.cc | 21 | ||||
-rw-r--r-- | remoting/host/plugin/daemon_controller_win.cc | 33 |
2 files changed, 50 insertions, 4 deletions
diff --git a/remoting/host/elevated_controller_win.cc b/remoting/host/elevated_controller_win.cc index 484955e..7ca42dd 100644 --- a/remoting/host/elevated_controller_win.cc +++ b/remoting/host/elevated_controller_win.cc @@ -7,11 +7,13 @@ #include <sddl.h> #include "base/file_util.h" +#include "base/file_version_info.h" #include "base/logging.h" #include "base/json/json_reader.h" #include "base/json/json_writer.h" #include "base/memory/scoped_ptr.h" #include "base/path_service.h" +#include "base/process_util.h" #include "base/stringize_macros.h" #include "base/utf_string_conversions.h" #include "base/values.h" @@ -327,7 +329,24 @@ STDMETHODIMP ElevatedControllerWin::GetConfig(BSTR* config_out) { } STDMETHODIMP ElevatedControllerWin::GetVersion(BSTR* version_out) { - return E_NOTIMPL; + // Report the product version number of the daemon controller binary as + // the host version. + HMODULE binary = base::GetModuleFromAddress( + reinterpret_cast<void*>(&ReadConfig)); + scoped_ptr<FileVersionInfo> version_info( + FileVersionInfo::CreateFileVersionInfoForModule(binary)); + + string16 version; + if (version_info.get()) { + version = version_info->product_version(); + } + + *version_out = ::SysAllocString(version.c_str()); + if (version_out == NULL) { + return E_OUTOFMEMORY; + } + + return S_OK; } STDMETHODIMP ElevatedControllerWin::SetConfig(BSTR config) { diff --git a/remoting/host/plugin/daemon_controller_win.cc b/remoting/host/plugin/daemon_controller_win.cc index 864b4f8..101118d 100644 --- a/remoting/host/plugin/daemon_controller_win.cc +++ b/remoting/host/plugin/daemon_controller_win.cc @@ -123,6 +123,7 @@ class DaemonControllerWin : public remoting::DaemonController { const CompletionCallback& done_callback); void DoStop(const CompletionCallback& done_callback); void DoSetWindow(void* window_handle); + void DoGetVersion(const GetVersionCallback& callback); // |control_| holds a reference to an instance of the daemon controller // to prevent a UAC prompt on every operation. @@ -246,9 +247,11 @@ void DaemonControllerWin::SetWindow(void* window_handle) { window_handle)); } -void DaemonControllerWin::GetVersion(const GetVersionCallback& done_callback) { - NOTIMPLEMENTED(); - done_callback.Run(""); +void DaemonControllerWin::GetVersion(const GetVersionCallback& callback) { + worker_thread_.message_loop_proxy()->PostTask( + FROM_HERE, + base::Bind(&DaemonControllerWin::DoGetVersion, + base::Unretained(this), callback)); } HRESULT DaemonControllerWin::ActivateController() { @@ -561,6 +564,30 @@ void DaemonControllerWin::DoSetWindow(void* window_handle) { window_handle_ = reinterpret_cast<HWND>(window_handle); } +void DaemonControllerWin::DoGetVersion(const GetVersionCallback& callback) { + DCHECK(worker_thread_.message_loop_proxy()->BelongsToCurrentThread()); + + std::string version_null; + + // Configure and start the Daemon Controller if it is installed already. + HRESULT hr = ActivateController(); + if (FAILED(hr)) { + callback.Run(version_null); + return; + } + + // Get the version string. + ScopedBstr version; + hr = control_->GetVersion(version.Receive()); + if (FAILED(hr)) { + callback.Run(version_null); + return; + } + + callback.Run(UTF16ToUTF8( + string16(static_cast<BSTR>(version), version.Length()))); +} + } // namespace scoped_ptr<DaemonController> remoting::DaemonController::Create() { |