/*
Copyright_License {

  XCSoar Glide Computer - http://www.xcsoar.org/
  Copyright (C) 2000-2014 The XCSoar Project
  A detailed list of copyright holders can be found in the file "AUTHORS".

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
}
*/

#include "AndroidPort.hpp"
#include "Android/PortBridge.hpp"

#include <assert.h>

AndroidPort::AndroidPort(DataHandler &_handler, PortBridge *_bridge)
  :BufferedPort(_handler), bridge(_bridge)
{
  assert(bridge != nullptr);

  bridge->setListener(Java::GetEnv(), this);
}

AndroidPort::~AndroidPort()
{
  assert(bridge != nullptr);

  BeginClose();

  delete bridge;

  EndClose();
}

PortState
AndroidPort::GetState() const
{
  assert(bridge != nullptr);

  return (PortState)bridge->getState(Java::GetEnv());
}

bool
AndroidPort::Drain()
{
  assert(bridge != nullptr);

  return bridge->drain(Java::GetEnv());
}

unsigned
AndroidPort::GetBaudrate() const
{
  assert(bridge != nullptr);

  return bridge->getBaudRate(Java::GetEnv());
}

bool
AndroidPort::SetBaudrate(unsigned baud_rate)
{
  assert(bridge != nullptr);

  return bridge->setBaudRate(Java::GetEnv(), baud_rate);
}

size_t
AndroidPort::Write(const void *data, size_t length)
{
  assert(bridge != nullptr);

  JNIEnv *env = Java::GetEnv();
  int nbytes = bridge->write(env, data, length);
  return nbytes > 0
    ? (size_t)nbytes
    : 0;
}
