blob: 89d5eafe7ebc05bab8fd14aae573dcf0432fb762 [file] [log] [blame]
// Copyright (c) 2012 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.
#import <Cocoa/Cocoa.h>
#import <PreferencePanes/PreferencePanes.h>
#import <SecurityInterface/SFAuthorizationView.h>
#include <string>
#include "base/memory/scoped_ptr.h"
#include "third_party/jsoncpp/source/include/json/value.h"
namespace remoting {
// This is an implementation of JsonHostConfig which does not use code from
// the "base" target, so it can be built for 64-bit on Mac OS X.
// TODO(lambroslambrou): Once the "base" target has 64-bit support, remove this
// implementation and use the functions from remoting/host/host_config.h - see
class JsonHostConfig {
JsonHostConfig(const std::string& filename);
bool Read();
bool GetString(const std::string& path, std::string* out_value) const;
std::string GetSerializedData() const;
Json::Value config_;
std::string filename_;
@class Me2MePreferencePaneConfirmPin;
@class Me2MePreferencePaneDisable;
@interface Me2MePreferencePane : NSPreferencePane {
Me2MePreferencePaneConfirmPin* confirm_pin_view_;
Me2MePreferencePaneDisable* disable_view_;
IBOutlet NSTextField* status_message_;
IBOutlet NSBox* box_;
IBOutlet SFAuthorizationView* authorization_view_;
// Holds the new proposed configuration if a temporary config file is
// present.
scoped_ptr<remoting::JsonHostConfig> config_;
NSTimer* service_status_timer_;
// These flags determine the UI state. These are computed in the
// update...Status methods.
BOOL is_service_running_;
BOOL is_pane_unlocked_;
// True if a new proposed config file has been loaded into memory.
BOOL have_new_config_;
// True if launchd has been instructed to stop the service and we are waiting
// for the operation to complete.
BOOL awaiting_service_stop_;
// True if a version-mismatch has been detected. If true, this causes all
// controls to be greyed out, and also prevents any config file from being
// deleted, pending a restart of the preference pane.
BOOL restart_pending_or_canceled_;
- (void)mainViewDidLoad;
- (void)willSelect;
- (void)didSelect;
- (void)willUnselect;
- (void)onDisable:(id)sender;
- (void)applyConfiguration:(id)sender
- (void)onNewConfigFile:(NSNotification*)notification;
- (void)refreshServiceStatus:(NSTimer*)timer;
- (void)authorizationViewDidAuthorize:(SFAuthorizationView*)view;
- (void)authorizationViewDidDeauthorize:(SFAuthorizationView*)view;
- (void)updateServiceStatus;
- (void)updateAuthorizationStatus;
// Read any new config file if present. If a config file is successfully read,
// this deletes the file and keeps the config data loaded in memory. If this
// method is called a second time (when the file has been deleted), the current
// config is remembered, so this method acts as a latch: it can change
// |have_new_config_| from NO to YES, but never from YES to NO.
// This scheme means that this method can delete the file immediately (to avoid
// leaving a stale file around in case of a crash), but this method can safely
// be called multiple times without forgetting the loaded config. To explicitly
// forget the current config, set |have_new_config_| to NO.
// This method should not be called if |restart_pending_or_canceled_| is YES,
// since this would delete any config file.
- (void)readNewConfig;
// Update all UI controls according to any stored flags and loaded config.
// This should be called after any sequence of operations that might change the
// UI state.
- (void)updateUI;
// Alert the user to a generic error condition.
- (void)showError;
// Alert the user that the typed PIN is incorrect.
- (void)showIncorrectPinMessage;
// Save the new config to the system, and either start the service or inform
// the currently-running service of the new config.
- (void)applyNewServiceConfig;
- (BOOL)runHelperAsRootWithCommand:(const char*)command
inputData:(const std::string&)input_data;
- (BOOL)sendJobControlMessage:(const char*)launch_key;
// Compare the version of the running pref-pane against the installed version.
// If the versions are mismatched and the pref-pane is visible, disable the
// pane to prevent interaction, and prompt the user to restart System
// Preferences.
// This should be called on notification of a new config, and also in
// |didSelect| when the pane becomes visible. The pane needs to be visible so
// that the alert appears as a sheet over the pane (instead of a detached
// window), which gives the user an appropriate context for the alert.
// In the case of a version-mismatch, the new config file should be kept until
// System Preferences is restarted, or thrown away when the user cancels the
// alert. This method sets the |restart_pending_or_canceled_| flag on
// detecting version-mismatch.
- (void)checkInstalledVersion;
- (void)mismatchAlertDidEnd:(NSAlert*)alert
// Called when the user chooses OK when prompted to restart System Preferences.
- (void)restartSystemPreferences;