// natCoreInputStream.cc -- C++ side of CoreInputStream

/* Copyright (C) 2001  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

/* Author: Anthony Green <green@redhat.com>.  */

#include <config.h>

#include <gcj/cni.h>
#include <jvm.h>
#include <string.h>

#include <java/lang/NullPointerException.h>
#include <java/lang/ArrayIndexOutOfBoundsException.h>
#include <gnu/java/net/protocol/core/CoreInputStream.h>

jint
gnu::java::net::protocol::core::CoreInputStream::unsafeGetByte (jlong offset)
{
  return ((char*) ptr) [offset];
}

jint
gnu::java::net::protocol::core::CoreInputStream::copyIntoByteArray (jbyteArray dest,
							            jint offset,
							            jint numBytes)
{
  if (!dest)
    throw new ::java::lang::NullPointerException;
  
  jsize destSize = JvGetArrayLength (dest);
  
  if (offset < 0 || numBytes < 0 || offset + numBytes < 0
      || offset + numBytes > destSize
      || pos + numBytes > count)
    throw new ::java::lang::ArrayIndexOutOfBoundsException;

  void *pcore = (void *) &((char*) ptr) [pos];
  void *pdest = (void *) (elements (dest) + offset);

  memcpy (pdest, pcore, numBytes);

  return 0;
}

