// 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.

#ifndef SHILL_MM1_MODEM_PROXY_INTERFACE_H_
#define SHILL_MM1_MODEM_PROXY_INTERFACE_H_

#include <string>

#include <base/basictypes.h>

#include "shill/callbacks.h"

namespace shill {
class Error;

namespace mm1 {

typedef base::Callback<void(int32,
                            int32, uint32)> ModemStateChangedSignalCallback;

// These are the methods that a org.freedesktop.ModemManager1.Modem
// proxy must support. The interface is provided so that it can be
// mocked in tests. All calls are made asynchronously. Call completion
// is signalled via the callbacks passed to the methods.
class ModemProxyInterface {
 public:
  virtual ~ModemProxyInterface() {}

  virtual void Enable(bool enable,
                      Error *error,
                      const ResultCallback &callback,
                      int timeout) = 0;
  virtual void ListBearers(Error *error,
                           const DBusPathsCallback &callback,
                           int timeout) = 0;
  virtual void CreateBearer(const DBusPropertiesMap &properties,
                            Error *error,
                            const DBusPathCallback &callback,
                            int timeout) = 0;
  virtual void DeleteBearer(const ::DBus::Path &bearer,
                            Error *error,
                            const ResultCallback &callback,
                            int timeout) = 0;
  virtual void Reset(Error *error,
                     const ResultCallback &callback,
                     int timeout) = 0;
  virtual void FactoryReset(const std::string &code,
                            Error *error,
                            const ResultCallback &callback,
                            int timeout) = 0;
  virtual void SetCurrentCapabilities(const uint32_t &capabilities,
                                      Error *error,
                                      const ResultCallback &callback,
                                      int timeout) = 0;
  virtual void SetCurrentModes(const ::DBus::Struct<uint32_t, uint32_t> &modes,
                               Error *error,
                               const ResultCallback &callback,
                               int timeout) = 0;
  virtual void SetCurrentBands(const std::vector<uint32_t> &bands,
                               Error *error,
                               const ResultCallback &callback,
                               int timeout) = 0;
  virtual void Command(const std::string &cmd,
                       const uint32_t &user_timeout,
                       Error *error,
                       const StringCallback &callback,
                       int timeout) = 0;
  virtual void SetPowerState(const uint32_t &power_state,
                             Error *error,
                             const ResultCallback &callback,
                             int timeout) = 0;


  virtual void set_state_changed_callback(
      const ModemStateChangedSignalCallback &callback) = 0;

  // Properties.
  virtual const ::DBus::Path Sim() = 0;
  virtual const std::vector<uint32_t> SupportedCapabilities() = 0;
  virtual uint32_t CurrentCapabilities() = 0;
  virtual uint32_t MaxBearers() = 0;
  virtual uint32_t MaxActiveBearers() = 0;
  virtual const std::string Manufacturer() = 0;
  virtual const std::string Model() = 0;
  virtual const std::string Revision() = 0;
  virtual const std::string DeviceIdentifier() = 0;
  virtual const std::string Device() = 0;
  virtual const std::vector<std::string> Drivers() = 0;
  virtual const std::string Plugin() = 0;
  virtual const std::string EquipmentIdentifier() = 0;
  virtual uint32_t UnlockRequired() = 0;
  virtual const std::map<uint32_t, uint32_t> UnlockRetries() = 0;
  virtual uint32_t State() = 0;
  virtual uint32_t AccessTechnologies() = 0;
  virtual const ::DBus::Struct<uint32_t, bool> SignalQuality() = 0;
  virtual const std::vector<std::string> OwnNumbers() = 0;
  virtual const std::vector<::DBus::Struct<uint32_t, uint32_t>>
      SupportedModes() = 0;
  virtual const ::DBus::Struct<uint32_t, uint32_t> CurrentModes() = 0;
  virtual const std::vector<uint32_t> SupportedBands() = 0;
  virtual const std::vector<uint32_t> CurrentBands() = 0;
  virtual uint32_t SupportedIpFamilies() = 0;
  virtual uint32_t PowerState() = 0;
};

}  // namespace mm1
}  // namespace shill

#endif  // SHILL_MM1_MODEM_PROXY_INTERFACE_H_
