blob: 8ec280652c9fcf5a0894f16f39821fb869ddea11 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// TODO(vlaviano): update accessor style (GetFoo/SetFoo -> foo)
#ifndef SRC_DATA_PLAN_H_
#define SRC_DATA_PLAN_H_
#include <glib.h>
#include <map>
#include <string>
#include <vector>
#include <base/basictypes.h> // NOLINT
#include <base/time.h> // NOLINT
#include <base/values.h> // NOLINT
#include <dbus-c++/dbus.h> // NOLINT
namespace cashew {
class DataPlan;
class Device;
class Policy;
class Service;
class ServiceManager;
// byte count
// TODO(vlaviano): this should be a uint64, but libcros/Chrome expects this
typedef int64 ByteCount;
// List of DataPlan objects
// TODO(vlaviano): consider promoting this from a typedef to a class
typedef std::vector<DataPlan*> DataPlanList;
// DataPlan object formatted for D-Bus (using DBus::Variants to wrap fields)
typedef std::map<std::string, DBus::Variant> DBusDataPlan;
// List of DataPlan objects formatted for D-Bus
typedef std::vector<DBusDataPlan> DBusDataPlanList;
// Represents a data plan associated with a cellular service
class DataPlan {
public:
// valid type values for this plan
typedef enum {
kTypeUnlimited = 0,
kTypeMeteredFree,
kTypeMeteredPaid,
} Type;
// |data_bytes_max| must be set to 0 for unlimited plans
DataPlan(const std::string& name, DataPlan::Type type,
base::Time update_time, base::Time start_time,
base::Time end_time, ByteCount data_bytes_max,
ByteCount data_bytes_used);
virtual ~DataPlan();
// get plan name
virtual const std::string& GetName() const;
// get plan type
virtual Type GetType() const;
// get last update time
virtual base::Time GetUpdateTime() const;
// get plan start time
virtual base::Time GetStartTime() const;
// get plan end time
virtual base::Time GetEndTime() const;
// get plan max bytes
virtual ByteCount GetDataBytesMax() const;
// get plan used bytes
virtual ByteCount GetDataBytesUsed() const;
// get local used bytes
virtual ByteCount GetLocalBytesUsed() const;
// set local used bytes
// must be >= 0
virtual void SetLocalBytesUsed(ByteCount local_bytes_used);
// get total used bytes
virtual ByteCount GetTotalBytesUsed() const;
// set the service for this data plan
virtual void SetService(Service *service);
// is this an active plan?
// we define active to mean that the plan is current and not exhausted
virtual bool IsActive() const;
// return a{sv} representation for D-Bus
virtual DBusDataPlan ToDBusFormat() const;
// construct DataPlan from DictionaryValue
static DataPlan* FromDictionaryValue(const DictionaryValue *value,
const Policy *policy);
// convert ISO 8601 time value to base::Time
// returns true on success and false on failure
// |time_out| must not be NULL and is set on a successful return
static bool TimeFromIso8601(const std::string& time_8601,
base::Time *time_out,
bool zoneless_strings_are_local);
// returns first active plan in |data_plans|
// returns NULL if list is empty or contains no active plans
static DataPlan* GetActivePlan(const DataPlanList& data_plans);
// assign as much of |bytes_to_assign| as we can to |data_plan|
// returns the number of bytes assigned to |data_plan|
static ByteCount AssignBytesToPlan(DataPlan *data_plan,
ByteCount bytes_to_assign);
// event handler for |service's| local byte counter on |device|
// updates active plans in |data_plans| based on the |delta_rx_bytes| and
// |delta_tx_bytes| values gathered during the most recent sample interval
// notifies |service_manager| if an active plan is completely consumed
// returns true if any plans were updated and false otherwise
// |data_plans|, |service|, |service_manager| and |device| must not be NULL
static bool OnByteCounterUpdate(DataPlanList *data_plans, Service *service,
ServiceManager *service_manager,
Device *device, uint64 delta_rx_bytes,
uint64 delta_tx_bytes);
private:
// service for this data plan
Service *service_;
// human-readable plan name
const std::string name_;
// plan type
const Type type_;
// last update time (i.e., how fresh is plan data)
// this refers to carrier API data, not local measurements
base::Time update_time_;
// plan start time
const base::Time start_time_;
// plan end time
const base::Time end_time_;
// max bytes available during plan period
// irrelevant for plans of type kTypeUnlimited
const ByteCount data_bytes_max_;
// bytes consumed so far during plan period
// this measurement comes from the carrier API
ByteCount data_bytes_used_;
// local measurement of bytes used since we received |data_bytes_used_|
// baseline from the carrier API
ByteCount local_bytes_used_;
// our best estimate of total bytes used for this plan
// carrier baseline (|data_bytes_used_|) +
// locally measured traffic (|local_bytes_used_|)
ByteCount total_bytes_used_;
// a timer that goes off when this data plan expires
// TODO(mikemeko): we need to do more testing for timer
GSource *expiration_timeout_source_;
// is this plan current?
bool IsCurrent() const;
// does this plan have bytes remaining?
bool HasBytesRemaining() const;
// this data plan just expired
void OnDataPlanExpired();
// static wrapper for OnDataPlanExpired
// takes object ptr as data and invokes object->OnDataPlanExpired
static gboolean StaticOnDataPlanExpired(gpointer data);
// creates and starts a timer that will fire when this data plan expires
// returns true on success and false on failure
bool CreateExpirationTimer();
// stops and destroys the expiration timer if it exists
void DestroyExpirationTimer();
// convert plan type enum value to string formatted for libcros
const char* TypeToLibcrosString(Type type) const;
// convert string formatted for Cros Usage API to plan type enum value
// returns true on success and false on failure
// |type_out| must not be NULL and is set on a successful return
static bool CrosUsageStringToType(const std::string& type_string,
Type *type_out);
// converts the value associated with |key| in |dict| to an int64
// returns true on success and false on failure
// |out_value| must not be NULL and is set on a successful return
static bool GetInt64FromDictionary(const DictionaryValue& dict,
const std::string& key,
int64* out_value);
DISALLOW_COPY_AND_ASSIGN(DataPlan);
};
} // namespace cashew
#endif // SRC_DATA_PLAN_H_