1 // Copyright (c) 2012 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 #import <Cocoa/Cocoa.h> 6 #import <PreferencePanes/PreferencePanes.h> 7 #import <SecurityInterface/SFAuthorizationView.h> 8 9 #include <string> 10 11 #include "base/memory/scoped_ptr.h" 12 #include "third_party/jsoncpp/source/include/json/value.h" 13 14 namespace remoting { 15 16 // This is an implementation of JsonHostConfig which does not use code from 17 // the "base" target, so it can be built for 64-bit on Mac OS X. 18 19 // TODO(lambroslambrou): Once the "base" target has 64-bit support, remove this 20 // implementation and use the one in remoting/host/json_host_config.h - see 21 // http://crbug.com/128122. 22 class JsonHostConfig { 23 public: 24 JsonHostConfig(const std::string& filename); 25 ~JsonHostConfig(); 26 27 bool Read(); 28 bool GetString(const std::string& path, std::string* out_value) const; 29 std::string GetSerializedData() const; 30 31 private: 32 Json::Value config_; 33 std::string filename_; 34 35 DISALLOW_COPY_AND_ASSIGN(JsonHostConfig); 36 }; 37 38 } 39 40 @class Me2MePreferencePaneConfirmPin; 41 @class Me2MePreferencePaneDisable; 42 43 @interface Me2MePreferencePane : NSPreferencePane { 44 Me2MePreferencePaneConfirmPin* confirm_pin_view_; 45 Me2MePreferencePaneDisable* disable_view_; 46 47 IBOutlet NSTextField* status_message_; 48 IBOutlet NSBox* box_; 49 IBOutlet SFAuthorizationView* authorization_view_; 50 51 // Holds the new proposed configuration if a temporary config file is 52 // present. 53 scoped_ptr<remoting::JsonHostConfig> config_; 54 55 NSTimer* service_status_timer_; 56 57 // These flags determine the UI state. These are computed in the 58 // update...Status methods. 59 BOOL is_service_running_; 60 BOOL is_pane_unlocked_; 61 62 // True if a new proposed config file has been loaded into memory. 63 BOOL have_new_config_; 64 65 // True if launchd has been instructed to stop the service and we are waiting 66 // for the operation to complete. 67 BOOL awaiting_service_stop_; 68 69 // True if a version-mismatch has been detected. If true, this causes all 70 // controls to be greyed out, and also prevents any config file from being 71 // deleted, pending a restart of the preference pane. 72 BOOL restart_pending_or_canceled_; 73 } 74 75 - (void)mainViewDidLoad; 76 - (void)willSelect; 77 - (void)didSelect; 78 - (void)willUnselect; 79 - (void)onDisable:(id)sender; 80 - (void)applyConfiguration:(id)sender 81 pin:(NSString*)pin; 82 - (void)onNewConfigFile:(NSNotification*)notification; 83 - (void)refreshServiceStatus:(NSTimer*)timer; 84 - (void)authorizationViewDidAuthorize:(SFAuthorizationView*)view; 85 - (void)authorizationViewDidDeauthorize:(SFAuthorizationView*)view; 86 - (void)updateServiceStatus; 87 - (void)updateAuthorizationStatus; 88 89 // Read any new config file if present. If a config file is successfully read, 90 // this deletes the file and keeps the config data loaded in memory. If this 91 // method is called a second time (when the file has been deleted), the current 92 // config is remembered, so this method acts as a latch: it can change 93 // |have_new_config_| from NO to YES, but never from YES to NO. 94 // 95 // This scheme means that this method can delete the file immediately (to avoid 96 // leaving a stale file around in case of a crash), but this method can safely 97 // be called multiple times without forgetting the loaded config. To explicitly 98 // forget the current config, set |have_new_config_| to NO. 99 // 100 // This method should not be called if |restart_pending_or_canceled_| is YES, 101 // since this would delete any config file. 102 - (void)readNewConfig; 103 104 // Update all UI controls according to any stored flags and loaded config. 105 // This should be called after any sequence of operations that might change the 106 // UI state. 107 - (void)updateUI; 108 109 // Alert the user to a generic error condition. 110 - (void)showError; 111 112 // Alert the user that the typed PIN is incorrect. 113 - (void)showIncorrectPinMessage; 114 115 // Save the new config to the system, and either start the service or inform 116 // the currently-running service of the new config. 117 - (void)applyNewServiceConfig; 118 119 - (BOOL)runHelperAsRootWithCommand:(const char*)command 120 inputData:(const std::string&)input_data; 121 - (BOOL)sendJobControlMessage:(const char*)launch_key; 122 123 // Compare the version of the running pref-pane against the installed version. 124 // If the versions are mismatched and the pref-pane is visible, disable the 125 // pane to prevent interaction, and prompt the user to restart System 126 // Preferences. 127 // 128 // This should be called on notification of a new config, and also in 129 // |didSelect| when the pane becomes visible. The pane needs to be visible so 130 // that the alert appears as a sheet over the pane (instead of a detached 131 // window), which gives the user an appropriate context for the alert. 132 // 133 // In the case of a version-mismatch, the new config file should be kept until 134 // System Preferences is restarted, or thrown away when the user cancels the 135 // alert. This method sets the |restart_pending_or_canceled_| flag on 136 // detecting version-mismatch. 137 - (void)checkInstalledVersion; 138 139 - (void)mismatchAlertDidEnd:(NSAlert*)alert 140 returnCode:(NSInteger)returnCode 141 contextInfo:(void*)contextInfo; 142 143 // Called when the user chooses OK when prompted to restart System Preferences. 144 - (void)restartSystemPreferences; 145 146 @end 147