// 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 "gobi-cromo-plugin/gobi_3k_modem.h"

#include <gobi3k.h>

#include "gobi-cromo-plugin/gobi_modem_handler.h"

Gobi3KModemHelper::Gobi3KModemHelper(gobi::Sdk* sdk) : GobiModemHelper(sdk) {}

Gobi3KModemHelper::~Gobi3KModemHelper() {}

void Gobi3KModemHelper::SetCarrier(GobiModem* modem,
                                   GobiModemHandler* handler,
                                   const std::string& carrier_name,
                                   DBus::Error& error) {
  gobifw_init(nullptr);
  gobifw *fw = gobifw_bycarrier(carrier_name.c_str());
  enum gobifw_activate_status rc;
  bool was_connected = modem->IsApiConnected();
  DBus::Error connect_error;

  if (!fw) {
    LOG(WARNING) << "No such carrier: " << carrier_name << ": "
                 << gobifw_lasterror();
    error.set(kFirmwareLoadError, kErrorUnknownCarrier);
    return;
  }

  if (modem->is_connecting_or_connected()) {
    error.set(kFirmwareLoadError,
              "Cannot load firmware while connected or connecting");
    gobifw_free(fw);
    return;
  }

  if (was_connected)
    modem->ApiDisconnect();

  rc = gobifw_activate(fw);
  if (rc) {
    LOG(WARNING) << "Firmware activation failed: " << gobifw_lasterror();
    error.set(kFirmwareLoadError, gobifw_lasterror());
  }

  if (rc == GOBIFW_ACTIVATE_OK || rc == GOBIFW_ACTIVATE_ERROR_RESET) {
    // Object is deceased. Remove it early so that we don't process any
    // queued-up dbus calls on the now-dead device.
    modem->unregister_obj();
    handler->Remove(modem);
  } else if (rc == GOBIFW_ACTIVATE_ERROR_NORESET) {
    if (was_connected)
      modem->ApiConnect(connect_error);
  }
}
