//
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#ifndef SHILL_CELLULAR_CELLULAR_BEARER_H_
#define SHILL_CELLULAR_CELLULAR_BEARER_H_
#include <memory>
#include <string>
#include <vector>
#include <base/macros.h>
#include <gtest/gtest_prod.h>
#include "shill/ipconfig.h"
namespace shill {
class DBusPropertiesProxyInterface;
class ControlInterface;
// A class for observing property changes of a bearer object exposed by
// ModemManager.
class CellularBearer {
public:
// Constructs a cellular bearer for observing property changes of a
// corresponding bearer object, at the DBus path |dbus_path| of DBus service
// |dbus_service|, exposed by ModemManager. The ownership of |proxy_factory|
// is not transferred, and should outlive this object.
//
// TODO(benchan): Use a context object approach to pass objects like
// ControlInterface through constructor.
CellularBearer(ControlInterface* control_interface,
const std::string& dbus_path,
const std::string& dbus_service);
~CellularBearer();
// Initializes this object by creating a DBus properties proxy to observe
// property changes of the corresponding bearer object exposed by ModemManager
// and also fetching the current properties of the bearer. Returns true on
// success or false if it fails to the DBus properties proxy.
bool Init();
// Callback upon property changes of the bearer.
void OnPropertiesChanged(
const std::string& interface,
const KeyValueStore& changed_properties,
const std::vector<std::string>& invalidated_properties);
const std::string& dbus_path() const { return dbus_path_; }
const std::string& dbus_service() const { return dbus_service_; }
bool connected() const { return connected_; }
const std::string& data_interface() const { return data_interface_; }
IPConfig::Method ipv4_config_method() const { return ipv4_config_method_; }
const IPConfig::Properties* ipv4_config_properties() const {
return ipv4_config_properties_.get();
}
IPConfig::Method ipv6_config_method() const { return ipv6_config_method_; }
const IPConfig::Properties* ipv6_config_properties() const {
return ipv6_config_properties_.get();
}
private:
friend class CellularBearerTest;
FRIEND_TEST(CellularTest, EstablishLinkDHCP);
FRIEND_TEST(CellularTest, EstablishLinkPPP);
FRIEND_TEST(CellularTest, EstablishLinkStatic);
// Gets the IP configuration method and properties from |properties|.
// |address_family| specifies the IP address family of the configuration.
// |ipconfig_method| and |ipconfig_properties| are used to return the IP
// configuration method and properties and should be non-NULL.
void GetIPConfigMethodAndProperties(
const KeyValueStore& properties,
IPAddress::Family address_family,
IPConfig::Method* ipconfig_method,
std::unique_ptr<IPConfig::Properties>* ipconfig_properties) const;
// Resets bearer properties.
void ResetProperties();
// Updates bearer properties by fetching the current properties of the
// corresponding bearer object exposed by ModemManager over DBus.
void UpdateProperties();
// Setters for unit tests.
void set_connected(bool connected) { connected_ = connected; }
void set_data_interface(const std::string& data_interface) {
data_interface_ = data_interface;
}
void set_ipv4_config_method(IPConfig::Method ipv4_config_method) {
ipv4_config_method_ = ipv4_config_method;
}
void set_ipv4_config_properties(
std::unique_ptr<IPConfig::Properties> ipv4_config_properties) {
ipv4_config_properties_ = std::move(ipv4_config_properties);
}
void set_ipv6_config_method(IPConfig::Method ipv6_config_method) {
ipv6_config_method_ = ipv6_config_method;
}
void set_ipv6_config_properties(
std::unique_ptr<IPConfig::Properties> ipv6_config_properties) {
ipv6_config_properties_ = std::move(ipv6_config_properties);
}
ControlInterface* control_interface_;
std::string dbus_path_;
std::string dbus_service_;
std::unique_ptr<DBusPropertiesProxyInterface> dbus_properties_proxy_;
bool connected_;
std::string data_interface_;
// If |ipv4_config_method_| is set to |IPConfig::kMethodStatic|,
// |ipv4_config_properties_| is guaranteed to contain valid IP configuration
// properties. Otherwise, |ipv4_config_properties_| is set to nullptr.
// |ipv6_config_properties_| is handled similarly.
IPConfig::Method ipv4_config_method_;
std::unique_ptr<IPConfig::Properties> ipv4_config_properties_;
IPConfig::Method ipv6_config_method_;
std::unique_ptr<IPConfig::Properties> ipv6_config_properties_;
DISALLOW_COPY_AND_ASSIGN(CellularBearer);
};
} // namespace shill
#endif // SHILL_CELLULAR_CELLULAR_BEARER_H_