• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_COCOA_KEYSTONE_GLUE_H_
6 #define CHROME_BROWSER_COCOA_KEYSTONE_GLUE_H_
7 #pragma once
8 
9 #include "base/string16.h"
10 
11 #if defined(__OBJC__)
12 
13 #import <Foundation/Foundation.h>
14 
15 #import "base/memory/scoped_nsobject.h"
16 #include "chrome/browser/cocoa/scoped_authorizationref.h"
17 
18 // Possible outcomes of various operations.  A version may accompany some of
19 // these, but beware: a version is never required.  For statuses that can be
20 // accompanied by a version, the comment indicates what version is referenced.
21 // A notification posted containing an asynchronous status will always be
22 // followed by a notification with a terminal status.
23 enum AutoupdateStatus {
24   kAutoupdateNone = 0,        // no version (initial state only)
25   kAutoupdateRegistering,     // no version (asynchronous operation in progress)
26   kAutoupdateRegistered,      // no version
27   kAutoupdateChecking,        // no version (asynchronous operation in progress)
28   kAutoupdateCurrent,         // version of the running application
29   kAutoupdateAvailable,       // version of the update that is available
30   kAutoupdateInstalling,      // no version (asynchronous operation in progress)
31   kAutoupdateInstalled,       // version of the update that was installed
32   kAutoupdatePromoting,       // no version (asynchronous operation in progress)
33   kAutoupdatePromoted,        // no version
34   kAutoupdateRegisterFailed,  // no version
35   kAutoupdateCheckFailed,     // no version
36   kAutoupdateInstallFailed,   // no version
37   kAutoupdatePromoteFailed,   // no version
38 };
39 
40 // kAutoupdateStatusNotification is the name of the notification posted when
41 // -checkForUpdate and -installUpdate complete.  This notification will be
42 // sent with with its sender object set to the KeystoneGlue instance sending
43 // the notification.  Its userInfo dictionary will contain an AutoupdateStatus
44 // value as an intValue at key kAutoupdateStatusStatus.  If a version is
45 // available (see AutoupdateStatus), it will be present at key
46 // kAutoupdateStatusVersion.
47 extern NSString* const kAutoupdateStatusNotification;
48 extern NSString* const kAutoupdateStatusStatus;
49 extern NSString* const kAutoupdateStatusVersion;
50 
51 namespace {
52 
53 enum BrandFileType {
54   kBrandFileTypeNotDetermined = 0,
55   kBrandFileTypeNone,
56   kBrandFileTypeUser,
57   kBrandFileTypeSystem,
58 };
59 
60 } // namespace
61 
62 // KeystoneGlue is an adapter around the KSRegistration class, allowing it to
63 // be used without linking directly against its containing KeystoneRegistration
64 // framework.  This is used in an environment where most builds (such as
65 // developer builds) don't want or need Keystone support and might not even
66 // have the framework available.  Enabling Keystone support in an application
67 // that uses KeystoneGlue is as simple as dropping
68 // KeystoneRegistration.framework in the application's Frameworks directory
69 // and providing the relevant information in its Info.plist.  KeystoneGlue
70 // requires that the KSUpdateURL key be set in the application's Info.plist,
71 // and that it contain a string identifying the update URL to be used by
72 // Keystone.
73 
74 @class KSRegistration;
75 
76 @interface KeystoneGlue : NSObject {
77  @protected
78 
79   // Data for Keystone registration
80   NSString* productID_;
81   NSString* appPath_;
82   NSString* url_;
83   NSString* version_;
84   NSString* channel_;  // Logically: Dev, Beta, or Stable.
85   BrandFileType brandFileType_;
86 
87   // And the Keystone registration itself, with the active timer
88   KSRegistration* registration_;  // strong
89   NSTimer* timer_;  // strong
90 
91   // The most recent kAutoupdateStatusNotification notification posted.
92   scoped_nsobject<NSNotification> recentNotification_;
93 
94   // The authorization object, when it needs to persist because it's being
95   // carried across threads.
96   scoped_AuthorizationRef authorization_;
97 
98   // YES if a synchronous promotion operation is in progress (promotion during
99   // installation).
100   BOOL synchronousPromotion_;
101 
102   // YES if an update was ever successfully installed by -installUpdate.
103   BOOL updateSuccessfullyInstalled_;
104 }
105 
106 // Return the default Keystone Glue object.
107 + (id)defaultKeystoneGlue;
108 
109 // Load KeystoneRegistration.framework if present, call into it to register
110 // with Keystone, and set up periodic activity pings.
111 - (void)registerWithKeystone;
112 
113 // -checkForUpdate launches a check for updates, and -installUpdate begins
114 // installing an available update.  For each, status will be communicated via
115 // a kAutoupdateStatusNotification notification, and will also be available
116 // through -recentNotification.
117 - (void)checkForUpdate;
118 - (void)installUpdate;
119 
120 // Accessor for recentNotification_.  Returns an autoreleased NSNotification.
121 - (NSNotification*)recentNotification;
122 
123 // Accessor for the kAutoupdateStatusStatus field of recentNotification_'s
124 // userInfo dictionary.
125 - (AutoupdateStatus)recentStatus;
126 
127 // Returns YES if an asynchronous operation is pending: if an update check or
128 // installation attempt is currently in progress.
129 - (BOOL)asyncOperationPending;
130 
131 // Returns YES if the application is running from a read-only filesystem,
132 // such as a disk image.
133 - (BOOL)isOnReadOnlyFilesystem;
134 
135 // -needsPromotion is YES if the application needs its ticket promoted to
136 // a system ticket.  This will be YES when the application is on a user
137 // ticket and determines that the current user does not have sufficient
138 // permission to perform the update.
139 //
140 // -wantsPromotion is YES if the application wants its ticket promoted to
141 // a system ticket, even if it doesn't need it as determined by
142 // -needsPromotion.  -wantsPromotion will always be YES if -needsPromotion is,
143 // and it will additionally be YES when the application is on a user ticket
144 // and appears to be installed in a system-wide location such as
145 // /Applications.
146 //
147 // Use -needsPromotion to decide whether to show any update UI at all.  If
148 // it's YES, there's no sense in asking the user to "update now" because it
149 // will fail given the rights and permissions involved.  On the other hand,
150 // when -needsPromotion is YES, the application can encourage the user to
151 // promote the ticket so that updates will work properly.
152 //
153 // Use -wantsPromotion to decide whether to allow the user to promote.  The
154 // user shouldn't be nagged about promotion on the basis of -wantsPromotion,
155 // but if it's YES, the user should be allowed to promote the ticket.
156 - (BOOL)needsPromotion;
157 - (BOOL)wantsPromotion;
158 
159 // Promotes the Keystone ticket into the system store.  System Keystone will
160 // be installed if necessary.  If synchronous is NO, the promotion may occur
161 // in the background.  synchronous should be YES for promotion during
162 // installation. The KeystoneGlue object assumes ownership of
163 // authorization_arg.
164 - (void)promoteTicketWithAuthorization:(AuthorizationRef)authorization_arg
165                            synchronous:(BOOL)synchronous;
166 
167 // Requests authorization and calls -promoteTicketWithAuthorization: in
168 // asynchronous mode.
169 - (void)promoteTicket;
170 
171 // Sets a new value for appPath.  Used during installation to point a ticket
172 // at the installed copy.
173 - (void)setAppPath:(NSString*)appPath;
174 
175 @end  // @interface KeystoneGlue
176 
177 @interface KeystoneGlue(ExposedForTesting)
178 
179 // Load any params we need for configuring Keystone.
180 - (void)loadParameters;
181 
182 // Load the Keystone registration object.
183 // Return NO on failure.
184 - (BOOL)loadKeystoneRegistration;
185 
186 - (void)stopTimer;
187 
188 // Called when a checkForUpdate: notification completes.
189 - (void)checkForUpdateComplete:(NSNotification*)notification;
190 
191 // Called when an installUpdate: notification completes.
192 - (void)installUpdateComplete:(NSNotification*)notification;
193 
194 @end  // @interface KeystoneGlue(ExposedForTesting)
195 
196 #endif  // __OBJC__
197 
198 // Functions that may be accessed from non-Objective-C C/C++ code.
199 namespace keystone_glue {
200 
201 // True if Keystone is enabled.
202 bool KeystoneEnabled();
203 
204 // The version of the application currently installed on disk.
205 string16 CurrentlyInstalledVersion();
206 
207 }  // namespace keystone_glue
208 
209 #endif  // CHROME_BROWSER_COCOA_KEYSTONE_GLUE_H_
210