// 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_
#define SHILL_MM1_MODEM_PROXY_INTERFACE_

#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 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 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< uint32_t > SupportedBands() = 0;
  virtual uint32_t PowerState() = 0;
};

}  // namespace mm1
}  // namespace shill

#endif  // SHILL_MM1_MODEM_PROXY_INTERFACE_
