Home | History | Annotate | Download | only in mac
      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