| Index: goopdate/ondemand.h
|
| diff --git a/goopdate/ondemand.h b/goopdate/ondemand.h
|
| deleted file mode 100644
|
| index 5aaaeac2d65fb0e5e8172d91d6d9f92a79d19486..0000000000000000000000000000000000000000
|
| --- a/goopdate/ondemand.h
|
| +++ /dev/null
|
| @@ -1,294 +0,0 @@
|
| -// Copyright 2010 Google Inc.
|
| -//
|
| -// Licensed under the Apache License, Version 2.0 (the "License");
|
| -// you may not use this file except in compliance with the License.
|
| -// You may obtain a copy of the License at
|
| -//
|
| -// http://www.apache.org/licenses/LICENSE-2.0
|
| -//
|
| -// Unless required by applicable law or agreed to in writing, software
|
| -// distributed under the License is distributed on an "AS IS" BASIS,
|
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -// See the License for the specific language governing permissions and
|
| -// limitations under the License.
|
| -// ========================================================================
|
| -
|
| -// TODO(omaha3): This really is a client. Where should it and similar code live?
|
| -
|
| -#ifndef OMAHA_GOOPDATE_ONDEMAND_H_
|
| -#define OMAHA_GOOPDATE_ONDEMAND_H_
|
| -
|
| -#include <atlbase.h>
|
| -#include <oaidl.h>
|
| -#include <oleauto.h>
|
| -#include "base/basictypes.h"
|
| -#include "base/debug.h"
|
| -#include "base/scoped_ptr.h"
|
| -#include "omaha/base/atlregmapex.h"
|
| -#include "omaha/base/constants.h"
|
| -#include "omaha/base/preprocessor_fun.h"
|
| -#include "omaha/base/scope_guard.h"
|
| -#include "omaha/base/thread_pool_callback.h"
|
| -#include "omaha/base/utils.h"
|
| -#include "omaha/common/const_goopdate.h"
|
| -#include "omaha/goopdate/com_proxy.h"
|
| -#include "omaha/goopdate/elevation_moniker_resource.h"
|
| -#include "goopdate/omaha3_idl.h"
|
| -// TODO(omaha3): Worker is convenient, but it is very odd to include part of the
|
| -// Omaha 3 COM server in one of its clients.
|
| -#include "omaha/goopdate/goopdate.h"
|
| -
|
| -namespace omaha {
|
| -
|
| -namespace internal {
|
| -
|
| -struct OnDemandParameters {
|
| - public:
|
| - OnDemandParameters(const CString& guid,
|
| - DWORD job_observer_cookie,
|
| - bool is_check_only,
|
| - const CString& sess_id,
|
| - HANDLE caller_impersonation_token,
|
| - HANDLE caller_primary_token)
|
| - : app_id(guid),
|
| - job_observer_git_cookie(job_observer_cookie),
|
| - is_update_check_only(is_check_only),
|
| - session_id(sess_id),
|
| - impersonation_token(caller_impersonation_token),
|
| - primary_token(caller_primary_token) {
|
| - ASSERT1(guid.GetLength() > 0);
|
| - ASSERT1(IsGuid(session_id));
|
| - ASSERT1(job_observer_cookie);
|
| - }
|
| -
|
| - CString app_id;
|
| - DWORD job_observer_git_cookie;
|
| - bool is_update_check_only;
|
| - CString session_id;
|
| - HANDLE impersonation_token;
|
| - HANDLE primary_token;
|
| -};
|
| -
|
| -HRESULT DoOnDemand(bool is_machine,
|
| - OnDemandParameters on_demand_params);
|
| -
|
| -} // namespace internal
|
| -
|
| -#pragma warning(push)
|
| -
|
| -// Construction of local static object is not thread-safe
|
| -#pragma warning(disable:4640)
|
| -
|
| -template <typename T>
|
| -class ATL_NO_VTABLE OnDemand
|
| - : public CComObjectRootEx<CComObjectThreadModel>,
|
| - public CComCoClass<OnDemand<T> >,
|
| - public IGoogleUpdate,
|
| - public StdMarshalInfo {
|
| - public:
|
| - // IGoogleUpdate::CheckForUpdate().
|
| - STDMETHOD(CheckForUpdate)(const WCHAR* guid, IJobObserver* observer) {
|
| - return DoOnDemandInternalAsync(guid, observer, true);
|
| - }
|
| -
|
| - // IGoogleUpdate::Update().
|
| - STDMETHOD(Update)(const WCHAR* guid, IJobObserver* observer) {
|
| - // Verify that the caller is an administrator for the machine case.
|
| - if (T::is_machine() &&
|
| - !UserRights::TokenIsAdmin(impersonation_token_.GetHandle())) {
|
| - CORE_LOG(LE, (_T("[User is not an admin]")));
|
| - return E_ACCESSDENIED;
|
| - }
|
| -
|
| - return DoOnDemandInternalAsync(guid, observer, false);
|
| - }
|
| -
|
| - HRESULT FinalConstruct() {
|
| - CORE_LOG(L2, (_T("[OnDemand::FinalConstruct]")));
|
| -
|
| - if (!T::is_machine()) {
|
| - return S_OK;
|
| - }
|
| -
|
| - HRESULT hr = UserRights::GetCallerToken(&impersonation_token_);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[GetCallerToken failed][0x%x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - if (!impersonation_token_.CreatePrimaryToken(&primary_token_)) {
|
| - HRESULT hr = HRESULTFromLastError();
|
| - CORE_LOG(LE, (_T("[CreatePrimaryToken failed][%d]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - protected:
|
| - OnDemand() : StdMarshalInfo(T::is_machine()) {
|
| - CORE_LOG(L2, (_T("[OnDemand::OnDemand]")));
|
| - }
|
| -
|
| - virtual ~OnDemand() {
|
| - CORE_LOG(L2, (_T("[OnDemand::~OnDemand]")));
|
| - }
|
| -
|
| - void FinalRelease() {
|
| - CORE_LOG(L2, (_T("[OnDemand::FinalRelease]")));
|
| - }
|
| -
|
| - HRESULT DoOnDemandInternalAsync(const WCHAR* guid,
|
| - IJobObserver* observer,
|
| - bool is_update_check_only) {
|
| - CORE_LOG(L2, (_T("[DoOnDemandInternalAsync][%s][%d]"),
|
| - guid, is_update_check_only));
|
| -
|
| - CComGITPtr<IJobObserver> job_observer_git;
|
| - HRESULT hr = job_observer_git.Attach(observer);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[job_observer_git.Attach failed][0x%x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - CAccessToken dup_impersonation_token;
|
| - CAccessToken dup_primary_token;
|
| - if (T::is_machine()) {
|
| - hr = DuplicateTokenIntoCurrentProcess(::GetCurrentProcess(),
|
| - impersonation_token_.GetHandle(),
|
| - &dup_impersonation_token);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[Failed to duplicate impersonation token][0x%x]"),
|
| - hr));
|
| - return hr;
|
| - }
|
| -
|
| - hr = DuplicateTokenIntoCurrentProcess(::GetCurrentProcess(),
|
| - primary_token_.GetHandle(),
|
| - &dup_primary_token);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[Failed to duplicate primary token][0x%x]"), hr));
|
| - return hr;
|
| - }
|
| - }
|
| -
|
| - if (session_id_.IsEmpty()) {
|
| - VERIFY1(SUCCEEDED(GetGuid(&session_id_)));
|
| - }
|
| -
|
| - // Create a thread pool work item for deferred execution of the on demand
|
| - // check. The thread pool owns this call back object. The thread owns the
|
| - // impersonation and primary tokens.
|
| - typedef StaticThreadPoolCallBack1<internal::OnDemandParameters> Callback;
|
| - scoped_ptr<Callback> callback(
|
| - new Callback(&OnDemand::DoOnDemandInternal,
|
| - internal::OnDemandParameters(
|
| - guid,
|
| - job_observer_git.Detach(),
|
| - is_update_check_only,
|
| - session_id_,
|
| - dup_impersonation_token.GetHandle(),
|
| - dup_primary_token.GetHandle())));
|
| -
|
| - hr = Goopdate::Instance().QueueUserWorkItem(callback.get(),
|
| - WT_EXECUTELONGFUNCTION);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[QueueUserWorkItem failed][0x%x]"), hr));
|
| - return hr;
|
| - }
|
| -
|
| - if (T::is_machine()) {
|
| - dup_impersonation_token.Detach();
|
| - dup_primary_token.Detach();
|
| - }
|
| -
|
| - callback.release();
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - static void DoOnDemandInternal(
|
| - internal::OnDemandParameters on_demand_params) {
|
| - CORE_LOG(L2, (_T("[DoOnDemandInternal][%d]"),
|
| - on_demand_params.is_update_check_only));
|
| - _pAtlModule->Lock();
|
| - ON_SCOPE_EXIT_OBJ(*_pAtlModule, &CAtlModule::Unlock);
|
| -
|
| - scoped_handle impersonation_token(on_demand_params.impersonation_token);
|
| - scoped_handle primary_token(on_demand_params.primary_token);
|
| -
|
| - scoped_co_init init_com_apt(COINIT_APARTMENTTHREADED);
|
| - HRESULT hr = init_com_apt.hresult();
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[init_com_apt failed][0x%x]"), hr));
|
| - return;
|
| - }
|
| -
|
| - hr = internal::DoOnDemand(T::is_machine(), on_demand_params);
|
| - if (FAILED(hr)) {
|
| - CORE_LOG(LE, (_T("[DoOnDemand failed][0x%x]"), hr));
|
| - return;
|
| - }
|
| - }
|
| -
|
| - DECLARE_NOT_AGGREGATABLE(OnDemand)
|
| - DECLARE_REGISTRY_RESOURCEID_EX(T::registry_res_id())
|
| -
|
| - BEGIN_REGISTRY_MAP()
|
| - REGMAP_ENTRY(_T("HKROOT"), T::hk_root())
|
| - REGMAP_ENTRY(_T("VERSION"), _T("1.0"))
|
| - REGMAP_ENTRY(_T("PROGID"), T::prog_id())
|
| - REGMAP_ENTRY(_T("DESCRIPTION"), _T("Google Update Legacy On Demand"))
|
| - REGMAP_ENTRY(_T("CLSID"), T::class_id())
|
| - REGMAP_MODULE2(_T("MODULE"), kOmahaOnDemandFileName)
|
| - REGMAP_ENTRY(_T("ICONRESID"), PP_STRINGIZE(IDI_ELEVATION_MONIKER_ICON))
|
| - REGMAP_ENTRY(_T("STRINGRESID"),
|
| - PP_STRINGIZE(IDS_ELEVATION_MONIKER_DISPLAYNAME))
|
| - END_REGISTRY_MAP()
|
| -
|
| - BEGIN_COM_MAP(OnDemand)
|
| - COM_INTERFACE_ENTRY(IGoogleUpdate)
|
| - COM_INTERFACE_ENTRY(IStdMarshalInfo)
|
| - END_COM_MAP()
|
| -
|
| - private:
|
| - CAccessToken impersonation_token_;
|
| - CAccessToken primary_token_;
|
| - CString session_id_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(OnDemand);
|
| -};
|
| -
|
| -struct OnDemandModeUser {
|
| - static bool is_machine() { return false; }
|
| - static const TCHAR* const prog_id() { return kProgIDOnDemandUser; }
|
| - static GUID class_id() { return __uuidof(OnDemandUserAppsClass); }
|
| - static UINT registry_res_id() { return IDR_LOCAL_SERVER_RGS; }
|
| - static const TCHAR* const hk_root() { return _T("HKCU"); }
|
| -};
|
| -
|
| -struct OnDemandModeMachineFallback {
|
| - static bool is_machine() { return true; }
|
| - static const TCHAR* const prog_id() { return kProgIDOnDemandMachineFallback; }
|
| - static GUID class_id() { return __uuidof(OnDemandMachineAppsFallbackClass); }
|
| - static UINT registry_res_id() { return IDR_LOCAL_SERVER_ELEVATION_RGS; }
|
| - static const TCHAR* const hk_root() { return _T("HKLM"); }
|
| -};
|
| -
|
| -struct OnDemandModeService {
|
| - static bool is_machine() { return true; }
|
| - static const TCHAR* const prog_id() { return kProgIDOnDemandSvc; }
|
| - static GUID class_id() { return __uuidof(OnDemandMachineAppsServiceClass); }
|
| - static UINT registry_res_id() { return IDR_LOCAL_SERVICE_RGS; }
|
| - static const TCHAR* const hk_root() { return _T("HKLM"); }
|
| -};
|
| -
|
| -typedef OnDemand<OnDemandModeUser> OnDemandUser;
|
| -typedef OnDemand<OnDemandModeMachineFallback> OnDemandMachineFallback;
|
| -typedef OnDemand<OnDemandModeService> OnDemandService;
|
| -
|
| -#pragma warning(pop)
|
| -
|
| -} // namespace omaha
|
| -
|
| -#endif // OMAHA_GOOPDATE_ONDEMAND_H_
|
|
|