OLD | NEW |
| (Empty) |
1 // Copyright 2007-2009 Google Inc. | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 // ======================================================================== | |
15 // | |
16 // There are two phases of setup. Both are done in an instance running from a | |
17 // temp location. | |
18 // 1) Copy the Google Update files to the install location. | |
19 // 2) Do everything else to install Google Update. | |
20 // * Executed by SetupGoogleUpdate(). | |
21 // | |
22 // Uninstall() undoes both phases of setup. | |
23 // All methods assume the instance is running with the correct permissions. | |
24 | |
25 #ifndef OMAHA_SETUP_SETUP_H__ | |
26 #define OMAHA_SETUP_SETUP_H__ | |
27 | |
28 #include <windows.h> | |
29 #include <atlstr.h> | |
30 #include <vector> | |
31 #include "base/basictypes.h" | |
32 #include "base/scoped_ptr.h" | |
33 #include "omaha/base/scoped_any.h" | |
34 | |
35 namespace omaha { | |
36 | |
37 class GLock; | |
38 class HighresTimer; | |
39 struct NamedObjectAttributes; | |
40 | |
41 class SetupFiles; | |
42 | |
43 class Setup { | |
44 public: | |
45 explicit Setup(bool is_machine); | |
46 ~Setup(); | |
47 | |
48 // Installs Omaha if necessary. | |
49 HRESULT Install(bool set_keepalive); | |
50 | |
51 // Acquires the Setup Lock and uninstalls all Omaha versions if Omaha can be | |
52 // uninstalled. | |
53 HRESULT Uninstall(bool send_uninstall_ping); | |
54 | |
55 // Verifies that Omaha is either properly installed or uninstalled completely. | |
56 // TODO(omaha): Consider making this and did_uninstall_ non-static after | |
57 // refactoring Setup phases. May require a Setup member in Goopdate. | |
58 static void CheckInstallStateConsistency(bool is_machine); | |
59 | |
60 int extra_code1() const { return extra_code1_; } | |
61 | |
62 void set_is_self_update(bool is_self_update) { | |
63 is_self_update_ = is_self_update; | |
64 } | |
65 | |
66 private: | |
67 typedef std::vector<uint32> Pids; | |
68 | |
69 // Completes installation. | |
70 HRESULT SetupGoogleUpdate(); | |
71 | |
72 // Handles Setup lock acquisition failures and returns the error to report. | |
73 HRESULT HandleLockFailed(int lock_version); | |
74 | |
75 // Does the install work within all necessary locks, which have already been | |
76 // acquired. | |
77 HRESULT DoProtectedInstall(bool set_keepalive); | |
78 | |
79 // Uninstalls all Google Update versions after checking if Google Update can | |
80 // be uninstalled. | |
81 HRESULT DoProtectedUninstall(bool send_uninstall_ping); | |
82 | |
83 // Returns whether Google Update should be installed. | |
84 bool ShouldInstall(SetupFiles* setup_files); | |
85 | |
86 // Returns whether the same version of Google Update should be over-installed. | |
87 bool ShouldOverinstallSameVersion(SetupFiles* setup_files); | |
88 | |
89 HRESULT DoProtectedGoogleUpdateInstall(SetupFiles* setup_files); | |
90 | |
91 // Rolls back the changes made during DoProtectedGoogleUpdateInstall(). | |
92 // Call when that method fails. | |
93 void RollBack(SetupFiles* setup_files); | |
94 | |
95 // Tells other instances to stop. | |
96 HRESULT StopGoogleUpdate(); | |
97 | |
98 // Tells other instances to stop then waits for them to exit. | |
99 HRESULT StopGoogleUpdateAndWait(); | |
100 | |
101 // Sets the shutdown event to signal other instances for this user or machine | |
102 // to exit. | |
103 HRESULT SignalShutdownEvent(); | |
104 | |
105 // Releases all the shutdown events. | |
106 void ReleaseShutdownEvents(); | |
107 | |
108 // Waits for other instances of GoogleUpdate.exe to exit. | |
109 HRESULT WaitForOtherInstancesToExit(const Pids& pids); | |
110 | |
111 // Gets the list of all the GoogleUpdate.exe processes to wait for. | |
112 HRESULT GetPidsToWaitFor(Pids* pids) const; | |
113 | |
114 // Gets a list of GoogleUpdate.exe processes for user or machine that are | |
115 // running from the respective official directory, except "/install" or | |
116 // "/registerproduct" instances. | |
117 // In the machine case we search in all the accounts since the workers can be | |
118 // running in any admin account and the machine update worker runs as SYSTEM. | |
119 // In the user case, we only search the user's account. | |
120 // In both cases, the command line location is used to determine the | |
121 // machine/user cases. | |
122 HRESULT GetPidsToWaitForUsingCommandLine(Pids* pids) const; | |
123 | |
124 // Returns whether elevation is required to perform this install. | |
125 bool IsElevationRequired() const; | |
126 | |
127 // TODO(omaha3): Support offline builds. Prefer to detect and maybe copy outside | |
128 // Setup. | |
129 #if 0 | |
130 // Given a guid, finds and copies the offline manifest and binaries from the | |
131 // current module directory to the offline_dir passed in. offline_dir is | |
132 // typically the Google\Update\Offline\ directory. The offline manifest is | |
133 // copied to offline_dir\{GUID}.gup. The binaries are in the format | |
134 // "Installer.msi.{GUID}", and they are copied to the offline_dir under the | |
135 // subdirectory {GUID}, as Installer.msi. | |
136 static HRESULT CopyOfflineFilesForGuid(const CString& app_guid, | |
137 const CString& offline_dir); | |
138 | |
139 // For all the applications that have been requested, copy the offline | |
140 // binaries. Calls CopyOfflineFilesForGuid() for each app_guid. | |
141 bool CopyOfflineFiles(const CString& offline_dir); | |
142 #endif | |
143 | |
144 // Starts the core. | |
145 HRESULT StartMachineCoreProcess() const; | |
146 HRESULT StartUserCoreProcess(const CString& core_cmd_line) const; | |
147 | |
148 // Returns the pids of running Omaha 2 Core processes for this user/system. | |
149 HRESULT FindCoreProcesses(Pids* found_core_pids) const; | |
150 | |
151 // Forcefully kills appropriate core processes using ::TerminateProcess(). | |
152 HRESULT TerminateCoreProcesses() const; | |
153 | |
154 // Verifies that the appropriate core is running. | |
155 bool IsCoreProcessRunning() const; | |
156 | |
157 // Starts the long-lived Core process. | |
158 HRESULT StartCore() const; | |
159 | |
160 // Returns the SID to use for process searches, mutexes, etc. during this | |
161 // installation. | |
162 HRESULT GetAppropriateSid(CString* sid) const; | |
163 | |
164 // Initializes the Setup Lock with correct name and security attributes. | |
165 static bool InitSetupLock(bool is_machine, GLock* setup_lock); | |
166 | |
167 // Returns true if GoogleUpdate can be uninstalled now. | |
168 bool CanUninstallGoogleUpdate() const; | |
169 | |
170 // Control the state of the DelayUninstall flag. If set, uninstall will | |
171 // be delayed for at least 24 hours after initial install. | |
172 bool ShouldDelayUninstall() const; | |
173 HRESULT SetDelayUninstall(bool should_delay) const; | |
174 | |
175 // Sends the uninstall ping and waits for the ping to be sent. | |
176 HRESULT SendUninstallPing(); | |
177 | |
178 const bool is_machine_; | |
179 bool is_self_update_; | |
180 CString saved_version_; // Previous version saved for roll back. | |
181 scoped_event shutdown_event_; | |
182 int extra_code1_; | |
183 | |
184 scoped_ptr<HighresTimer> metrics_timer_; | |
185 | |
186 // Whether this process uninstalled Google Update for any reason. | |
187 // Access must be protected by the Setup Lock. | |
188 static bool did_uninstall_; | |
189 | |
190 friend class SetupTest; | |
191 friend class SetupOfflineInstallerTest; | |
192 DISALLOW_EVIL_CONSTRUCTORS(Setup); | |
193 }; | |
194 | |
195 } // namespace omaha | |
196 | |
197 #endif // OMAHA_SETUP_SETUP_H__ | |
198 | |
OLD | NEW |