// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_MAC_KEYSTONE_REGISTRATION_H_
#define CHROME_BROWSER_MAC_KEYSTONE_REGISTRATION_H_

#import <Foundation/Foundation.h>
#include <Security/Authorization.h>

// Declarations of the Keystone registration bits needed here. From
// KSRegistration.h.

namespace keystone_registration {

typedef enum {
  kKSPathExistenceChecker,
} KSExistenceCheckerType;

typedef enum {
  kKSRegistrationUserTicket,
  kKSRegistrationSystemTicket,
  kKSRegistrationDontKnowWhatKindOfTicket,
} KSRegistrationTicketType;

extern NSString* KSRegistrationVersionKey;
extern NSString* KSRegistrationExistenceCheckerTypeKey;
extern NSString* KSRegistrationExistenceCheckerStringKey;
extern NSString* KSRegistrationServerURLStringKey;
extern NSString* KSRegistrationPreserveTrustedTesterTokenKey;
extern NSString* KSRegistrationTagKey;
extern NSString* KSRegistrationTagPathKey;
extern NSString* KSRegistrationTagKeyKey;
extern NSString* KSRegistrationBrandPathKey;
extern NSString* KSRegistrationBrandKeyKey;
extern NSString* KSRegistrationVersionPathKey;
extern NSString* KSRegistrationVersionKeyKey;

extern NSString* KSRegistrationDidCompleteNotification;
extern NSString* KSRegistrationPromotionDidCompleteNotification;

extern NSString* KSRegistrationCheckForUpdateNotification;
extern NSString* KSRegistrationStatusKey;
extern NSString* KSRegistrationUpdateCheckErrorKey;

extern NSString* KSRegistrationStartUpdateNotification;
extern NSString* KSUpdateCheckSuccessfulKey;
extern NSString* KSUpdateCheckSuccessfullyInstalledKey;

extern NSString* KSRegistrationRemoveExistingTag;
#define KSRegistrationPreserveExistingTag nil

}  // namespace keystone_registration

@interface KSRegistration : NSObject

+ (id)registrationWithProductID:(NSString*)productID;

- (BOOL)registerWithParameters:(NSDictionary*)args;

- (BOOL)promoteWithParameters:(NSDictionary*)args
                authorization:(AuthorizationRef)authorization;

- (void)setActive;
- (void)checkForUpdate;
- (void)startUpdate;
- (keystone_registration::KSRegistrationTicketType)ticketType;

@end  // @interface KSRegistration

#endif  // CHROME_BROWSER_MAC_KEYSTONE_REGISTRATION_H_
