// 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 one in remoting/host/json_host_config.h - see // http://crbug.com/128122. class JsonHostConfig { public: JsonHostConfig(const std::string& filename); ~JsonHostConfig(); bool Read(); bool GetString(const std::string& path, std::string* out_value) const; std::string GetSerializedData() const; private: Json::Value config_; std::string filename_; DISALLOW_COPY_AND_ASSIGN(JsonHostConfig); }; } @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 pin:(NSString*)pin; - (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 returnCode:(NSInteger)returnCode contextInfo:(void*)contextInfo; // Called when the user chooses OK when prompted to restart System Preferences. - (void)restartSystemPreferences; @end