blob: 833e147844e82acb4af1bbef6f4b4e5f3e030906 [file] [log] [blame]
Gilad Arnold55f39b72014-01-28 12:51:45 -08001// Copyright (c) 2014 The Chromium OS 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
Gilad Arnold2cbb3852014-03-07 12:40:50 -08005#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_SHILL_PROVIDER_H_
6#define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_SHILL_PROVIDER_H_
Gilad Arnold55f39b72014-01-28 12:51:45 -08007
Gilad Arnold5ef9c482014-03-03 13:51:02 -08008// TODO(garnold) Much of the functionality in this module was adapted from the
9// update engine's connection_manager. We need to make sure to deprecate use of
10// connection manager when the time comes.
11
12#include <string>
13
Alex Vakulenko75039d72014-03-25 12:36:28 -070014#include <base/time/time.h>
Gilad Arnold5ef9c482014-03-03 13:51:02 -080015
16#include "update_engine/clock_interface.h"
17#include "update_engine/dbus_wrapper_interface.h"
Gilad Arnoldef120fa2014-04-09 12:52:10 -070018#include "update_engine/policy_manager/generic_variables.h"
Gilad Arnold55f39b72014-01-28 12:51:45 -080019#include "update_engine/policy_manager/shill_provider.h"
20
Gilad Arnold5ef9c482014-03-03 13:51:02 -080021using chromeos_update_engine::ClockInterface;
22using chromeos_update_engine::DBusWrapperInterface;
Gilad Arnold55f39b72014-01-28 12:51:45 -080023
24namespace chromeos_policy_manager {
25
26// ShillProvider concrete implementation.
Gilad Arnold55f39b72014-01-28 12:51:45 -080027class RealShillProvider : public ShillProvider {
28 public:
Gilad Arnold5ef9c482014-03-03 13:51:02 -080029 RealShillProvider(DBusWrapperInterface* dbus, ClockInterface* clock)
Gilad Arnoldbeb39e92014-03-11 11:34:50 -070030 : dbus_(dbus), clock_(clock) {}
Gilad Arnold55f39b72014-01-28 12:51:45 -080031
Gilad Arnoldef120fa2014-04-09 12:52:10 -070032 virtual ~RealShillProvider();
33
Gilad Arnolddf3dd242014-04-09 07:15:51 -070034 virtual inline Variable<bool>* var_is_connected() override {
Gilad Arnoldef120fa2014-04-09 12:52:10 -070035 return &var_is_connected_;
Gilad Arnolddf3dd242014-04-09 07:15:51 -070036 }
37
38 virtual inline Variable<ConnectionType>* var_conn_type() override {
Gilad Arnoldef120fa2014-04-09 12:52:10 -070039 return &var_conn_type_;
40 }
41
42 virtual inline Variable<ConnectionTethering>* var_conn_tethering() override {
43 return &var_conn_tethering_;
Gilad Arnolddf3dd242014-04-09 07:15:51 -070044 }
45
46 virtual inline Variable<base::Time>* var_conn_last_changed() override {
Gilad Arnoldef120fa2014-04-09 12:52:10 -070047 return &var_conn_last_changed_;
Gilad Arnolddf3dd242014-04-09 07:15:51 -070048 }
49
Gilad Arnoldef120fa2014-04-09 12:52:10 -070050 // Helper methods for converting shill strings into symbolic values.
51 static ConnectionType ParseConnectionType(const char* type_str);
52 static ConnectionTethering ParseConnectionTethering(
53 const char* tethering_str);
54
Gilad Arnold55f39b72014-01-28 12:51:45 -080055 protected:
Gilad Arnolddf3dd242014-04-09 07:15:51 -070056 virtual bool DoInit() override;
Gilad Arnold55f39b72014-01-28 12:51:45 -080057
58 private:
Gilad Arnoldef120fa2014-04-09 12:52:10 -070059 // Default error strings for variables.
60 static const char* kConnStatusUnavailable;
61 static const char* kConnTypeUnavailable;
62 static const char* kConnTetheringUnavailable;
63
64 // Return a DBus proxy for a given |path| and |interface| within shill.
65 DBusGProxy* GetProxy(const char* path, const char* interface);
66
67 // Issues a GetProperties call through a given |proxy|, storing the result to
68 // |*result_p|. Returns true on success.
69 bool GetProperties(DBusGProxy* proxy, GHashTable** result_p);
70
Gilad Arnoldbeb39e92014-03-11 11:34:50 -070071 // Process a default connection value, update last change time as needed.
72 bool ProcessDefaultService(GValue* value);
73
74 // A handler for manager PropertyChanged signal, and a static version.
75 void HandlePropertyChanged(DBusGProxy* proxy, const char *name,
76 GValue* value);
77 static void HandlePropertyChangedStatic(DBusGProxy* proxy, const char* name,
78 GValue* value, void* data);
79
Gilad Arnolddf3dd242014-04-09 07:15:51 -070080 // Whether the connection status has been properly initialized.
81 bool is_conn_status_init_ = false;
82
Gilad Arnold55f39b72014-01-28 12:51:45 -080083 // The time when the connection type last changed.
Gilad Arnold5ef9c482014-03-03 13:51:02 -080084 base::Time conn_last_changed_;
85
Gilad Arnoldbeb39e92014-03-11 11:34:50 -070086 // The current connection status.
87 bool is_connected_;
88
Gilad Arnoldef120fa2014-04-09 12:52:10 -070089 // The default connection type and whether its value is valid.
90 ConnectionType conn_type_;
91 bool conn_type_is_valid_ = false;
92
93 // The default connection tethering mode and whether its value is valid.
94 ConnectionTethering conn_tethering_;
95 bool conn_tethering_is_valid_ = false;
96
Gilad Arnoldbeb39e92014-03-11 11:34:50 -070097 // The current default service path, if connected.
98 std::string default_service_path_;
99
Gilad Arnoldef120fa2014-04-09 12:52:10 -0700100 // The DBus interface (mockable), connection, and a shill manager proxy.
Gilad Arnold5ef9c482014-03-03 13:51:02 -0800101 DBusWrapperInterface* const dbus_;
Gilad Arnoldef120fa2014-04-09 12:52:10 -0700102 DBusGConnection* connection_ = NULL;
103 DBusGProxy* manager_proxy_ = NULL;
Gilad Arnold5ef9c482014-03-03 13:51:02 -0800104
105 // A clock abstraction (mockable).
106 ClockInterface* const clock_;
107
Gilad Arnoldef120fa2014-04-09 12:52:10 -0700108 // The provider's variable.
109 CopyVariable<bool> var_is_connected_{
110 "is_connected", kVariableModePoll, is_connected_, &is_conn_status_init_,
111 kConnStatusUnavailable};
112 CopyVariable<ConnectionType> var_conn_type_{
113 "conn_type", kVariableModePoll, conn_type_, &conn_type_is_valid_,
114 kConnTypeUnavailable};
115 CopyVariable<ConnectionTethering> var_conn_tethering_{
116 "conn_tethering", kVariableModePoll, conn_tethering_,
117 &conn_tethering_is_valid_, kConnTetheringUnavailable};
118 CopyVariable<base::Time> var_conn_last_changed_{
119 "conn_last_changed", kVariableModePoll, conn_last_changed_,
120 &is_conn_status_init_, kConnStatusUnavailable};
Gilad Arnolddf3dd242014-04-09 07:15:51 -0700121
Gilad Arnold55f39b72014-01-28 12:51:45 -0800122 DISALLOW_COPY_AND_ASSIGN(RealShillProvider);
123};
124
125} // namespace chromeos_policy_manager
126
Gilad Arnold2cbb3852014-03-07 12:40:50 -0800127#endif // CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_SHILL_PROVIDER_H_