// Copyright (c) 2013 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 "mist/usb_modem_one_shot_switcher.h"

#include <base/bind.h>

#include "mist/context.h"
#include "mist/event_dispatcher.h"
#include "mist/metrics.h"
#include "mist/usb_modem_switch_context.h"
#include "mist/usb_modem_switch_operation.h"

using base::Bind;
using base::Unretained;

namespace mist {

// TODO(benchan): Add unit tests for UsbModemOneShotSwitcher.

UsbModemOneShotSwitcher::UsbModemOneShotSwitcher(Context* context)
    : context_(context), is_success_(false) {
  CHECK(context_);
}

UsbModemOneShotSwitcher::~UsbModemOneShotSwitcher() {
  if (operation_) {
    operation_->Cancel();
    operation_.reset();
  }
}

void UsbModemOneShotSwitcher::Start(UsbModemSwitchContext* switch_context) {
  // Ownership of |switch_context| is transferred to |operation_|.
  operation_.reset(new UsbModemSwitchOperation(context_, switch_context));
  CHECK(operation_);

  operation_->Start(Bind(&UsbModemOneShotSwitcher::OnSwitchOperationCompleted,
                         Unretained(this)));
}

void UsbModemOneShotSwitcher::OnSwitchOperationCompleted(
    UsbModemSwitchOperation* operation, bool success) {
  CHECK_EQ(operation_.get(), operation);
  operation_.reset();

  is_success_ = success;
  context_->metrics()->RecordSwitchResult(success);

  // Stop the message loop upon the completion of the switch operation.
  context_->event_dispatcher()->Stop();
}

}  // namespace mist
