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

#include "shill/modem.h"

#include <mm/mm-modem.h>

#include "shill/cellular.h"

using std::string;
using std::vector;

namespace shill {

ModemClassic::ModemClassic(const string &owner,
                           const string &service,
                           const string &path,
                           ControlInterface *control_interface,
                           EventDispatcher *dispatcher,
                           Metrics *metrics,
                           Manager *manager,
                           CellularOperatorInfo *cellular_operator_info,
                           mobile_provider_db *provider_db)
    : Modem(owner, service, path, control_interface, dispatcher, metrics,
            manager, cellular_operator_info, provider_db) {
}

ModemClassic::~ModemClassic() {}

bool ModemClassic::GetLinkName(const DBusPropertiesMap& modem_properties,
                               string *name) const {
  return DBusProperties::GetString(modem_properties, kPropertyLinkName, name);
}

void ModemClassic::CreateDeviceClassic(
    const DBusPropertiesMap &modem_properties) {
  Init();
  uint32 mm_type = kuint32max;
  DBusProperties::GetUint32(modem_properties, kPropertyType, &mm_type);
  switch (mm_type) {
    case MM_MODEM_TYPE_CDMA:
      set_type(Cellular::kTypeCDMA);
      break;
    case MM_MODEM_TYPE_GSM:
      set_type(Cellular::kTypeGSM);
      break;
    default:
      LOG(ERROR) << "Unsupported cellular modem type: " << mm_type;
      return;
  }
  uint32 ip_method = kuint32max;
  if (!DBusProperties::GetUint32(modem_properties,
                                 kPropertyIPMethod,
                                 &ip_method) ||
      ip_method != MM_MODEM_IP_METHOD_DHCP) {
    LOG(ERROR) << "Unsupported IP method: " << ip_method;
    return;
  }

  DBusInterfaceToProperties properties;
  properties[MM_MODEM_INTERFACE] = modem_properties;
  CreateDeviceFromModemProperties(properties);
}

string ModemClassic::GetModemInterface(void) const {
  return string(MM_MODEM_INTERFACE);
}

}  // namespace shill
