• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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