Index: client/ua.cc |
diff --git a/client/ua.cc b/client/ua.cc |
deleted file mode 100644 |
index 20e0d9146c4d0e9922efc52e1463caacd60a83f3..0000000000000000000000000000000000000000 |
--- a/client/ua.cc |
+++ /dev/null |
@@ -1,197 +0,0 @@ |
-// Copyright 2007-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(omaha): Dig out the RefHolder in scope_guard.h so we can use const |
-// references instead pointers. This TODO was added for some code that no longer |
-// exists, but it is still a good idea. |
- |
-#include "omaha/client/ua.h" |
-#include "omaha/client/ua_internal.h" |
-#include <windows.h> |
-#include <atlstr.h> |
-#include "omaha/base/const_object_names.h" |
-#include "omaha/base/debug.h" |
-#include "omaha/base/error.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/program_instance.h" |
-#include "omaha/base/safe_format.h" |
-#include "omaha/base/scoped_ptr_address.h" |
-#include "omaha/base/utils.h" |
-#include "omaha/client/install_apps.h" |
-#include "omaha/client/install_self.h" |
-#include "omaha/client/client_metrics.h" |
-#include "omaha/common/app_registry_utils.h" |
-#include "omaha/common/config_manager.h" |
-#include "omaha/common/const_goopdate.h" |
-#include "omaha/common/event_logger.h" |
-#include "omaha/common/goopdate_utils.h" |
-#include "omaha/common/ping.h" |
- |
-// Design Notes: |
-// Following are the mutexes that are taken by the worker |
-// 1. SingleUpdateWorker. Only taken by the update worker. |
-// 2. SingleInstallWorker. This is application specific. Only taken by the |
-// install worker and for the specific application. |
-// 3. Before install, the install manager takes the global install lock. |
-// 4. A key thing to add to this code is after taking the install lock, |
-// to validate that the version of the applicaion that is present in the |
-// registry is the same as that we queried for. The reason to do this |
-// is to ensure that there are no races between update and install workers. |
-// 5. Termination of the worker happens because of four reasons: |
-// a. Shutdown event - Only applicable to the update worker. When this event |
-// is signalled, the main thread comes out of the wait. It then tries to |
-// destroy the contained thread pool, which causes a timed wait for the |
-// worker thread. The worker thread is notified by setting a |
-// cancelled flag on the worker. |
-// b. Install completes, user closes UI - Only applicable for the |
-// interactive installs. In this case the main thread comes out of |
-// the message loop and deletes the thread pool. The delete happens |
-// immediately, since the worker is doing nothing. |
-// c. User cancels install - Only applicable in case if interactive installs. |
-// The main thread sets the cancelled flag on the workerjob and comes out |
-// of the message loop. It then tries to delete the thread pool, causing |
-// a timed wait. The worker job queries the cancelled flag periodically |
-// and quits as soon as possible. |
-// d. The update worker completes - In this case we do not run on a thread |
-// pool. |
- |
-namespace omaha { |
- |
-namespace { |
- |
-void WriteUpdateAppsStartEvent(bool is_machine) { |
- GoogleUpdateLogEvent update_event(EVENTLOG_INFORMATION_TYPE, |
- kWorkerStartEventId, |
- is_machine); |
- update_event.set_event_desc(_T("Update Apps start")); |
- |
- ConfigManager& cm = *ConfigManager::Instance(); |
- |
- int au_check_period_ms = cm.GetAutoUpdateTimerIntervalMs(); |
- int time_since_last_checked_sec = cm.GetTimeSinceLastCheckedSec(is_machine); |
- bool is_period_overridden = false; |
- int last_check_period_ms = cm.GetLastCheckPeriodSec(&is_period_overridden); |
- |
- CString event_text; |
- SafeCStringFormat(&event_text, |
- _T("AuCheckPeriodMs=%d, TimeSinceLastCheckedSec=%d, ") |
- _T("LastCheckedPeriodSec=%d"), |
- au_check_period_ms, time_since_last_checked_sec, last_check_period_ms); |
- |
- update_event.set_event_text(event_text); |
- update_event.WriteEvent(); |
-} |
- |
-} // namespace |
- |
-namespace internal { |
- |
-// Ensures there is only one instance of /ua per session per Omaha instance. |
-bool EnsureSingleUAProcess(bool is_machine, ProgramInstance** instance) { |
- ASSERT1(instance); |
- ASSERT1(!*instance); |
- NamedObjectAttributes single_ua_process_attr; |
- GetNamedObjectAttributes(kUpdateAppsSingleInstance, |
- is_machine, |
- &single_ua_process_attr); |
- |
- *instance = new ProgramInstance(single_ua_process_attr.name); |
- return !(*instance)->EnsureSingleInstance(); |
-} |
- |
-} // namespace internal |
- |
-// Always checks whether it should uninstall. |
-// Checks for updates of all apps if the required period has elapsed, it is |
-// being run on-demand, or an uninstall seems necessary. It will also send a |
-// self-update failure ping in these cases if necessary. |
-// |
-// Calls UpdateAllApps(), which will call IAppBundle::updateAllApps(), even in |
-// cases where an uninstall seems necessary. This allows an uninstall ping to |
-// be sent for any uninstalled apps. Because the COM server does not know about |
-// uninstall, the COM server will also do a final update check for the remaining |
-// app - should be Omaha. It's possible that this update check could result in |
-// a self-update, in which case the uninstall may fail and be delayed an hour. |
-// See http://b/2814535. |
-// Since all pings are sent by the AppBundle destructor, if the bundle has |
-// normal or uninstall pings need, the network request could delay the exiting |
-// of the COM server beyond the point where this client releases the IAppBundle. |
-// and launches /uninstall. This could cause uninstall to fail if the ping takes |
-// a long time. |
-// |
-// TODO(omaha): Test this method as it is very important. |
-HRESULT UpdateApps(bool is_machine, |
- bool is_interactive, |
- bool is_on_demand, |
- const CString& install_source, |
- const CString& display_language, |
- bool* has_ui_been_displayed) { |
- CORE_LOG(L1, (_T("[UpdateApps]"))); |
- ASSERT1(has_ui_been_displayed); |
- |
- WriteUpdateAppsStartEvent(is_machine); |
- |
- scoped_ptr<ProgramInstance> single_ua_process; |
- |
- if (internal::EnsureSingleUAProcess(is_machine, address(single_ua_process))) { |
- OPT_LOG(L1, (_T("[Another worker is already running. Exiting.]"))); |
- ++metric_client_another_update_in_progress; |
- return GOOPDATE_E_UA_ALREADY_RUNNING; |
- } |
- |
- if (ConfigManager::Instance()->CanUseNetwork(is_machine)) { |
- VERIFY1(SUCCEEDED(Ping::SendPersistedPings(is_machine))); |
- } |
- |
- // Generate a session ID for network accesses. |
- CString session_id; |
- VERIFY1(SUCCEEDED(GetGuid(&session_id))); |
- |
- // A tentative uninstall check is done here. There are stronger checks, |
- // protected by locks, which are done by Setup. |
- size_t num_clients(0); |
- const bool is_uninstall = |
- FAILED(app_registry_utils::GetNumClients(is_machine, &num_clients)) || |
- num_clients <= 1; |
- CORE_LOG(L4, (_T("[UpdateApps][registered apps: %u]"), num_clients)); |
- |
- const bool should_check_for_updates = |
- goopdate_utils::ShouldCheckForUpdates(is_machine); |
- |
- if (is_uninstall) { |
- // TODO(omaha3): The interactive /ua process will not exit without user |
- // interaction. This could cause the uninstall to fail. |
- CORE_LOG(L1, (_T("[/ua launching /uninstall]"))); |
- return goopdate_utils::LaunchUninstallProcess(is_machine); |
- } |
- |
- if (!(is_on_demand || should_check_for_updates)) { |
- OPT_LOG(L1, (_T("[Update check not needed at this time]"))); |
- return S_OK; |
- } |
- |
- HRESULT hr = UpdateAllApps(is_machine, |
- is_interactive, |
- install_source, |
- display_language, |
- session_id, |
- has_ui_been_displayed); |
- if (FAILED(hr)) { |
- CORE_LOG(LW, (_T("[UpdateAllApps failed][0x%08x]"), hr)); |
- } |
- return hr; |
-} |
- |
-} // namespace omaha |