/* Copyright (C) 2006, 2007  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.  */

#include <config.h>

#include <java/net/VMURLConnection.h>
#include <gcj/cni.h>
#include <java/lang/UnsupportedOperationException.h>
#include <stdio.h>

#if defined (HAVE_MAGIC_T) && defined (HAVE_MAGIC_H) && defined (USE_LTDL)

#include <magic.h>
#include <ltdl.h>

static magic_t cookie;

static magic_t (*p_magic_open)(int flags);
static int (*p_magic_load)(magic_t cookie, const char *filename);
static void (*p_magic_close)(magic_t cookie);
static const char * (*p_magic_buffer) (magic_t cookie, const void *buffer,
				       size_t length);

#endif /* HAVE_MAGIC_T && HAVE_MAGIC_H && defined (USE_LTDL) */

void
java::net::VMURLConnection::init ()
{
#if defined (HAVE_MAGIC_T) && defined (HAVE_MAGIC_H) && defined (USE_LTDL)
  lt_dlhandle handle = lt_dlopenext ("libmagic.so");
  if (!handle)
    return;

  p_magic_open = (typeof (p_magic_open))lt_dlsym(handle, "magic_open");
  if (p_magic_open == NULL)
    return;
  p_magic_buffer = (typeof (p_magic_buffer))lt_dlsym(handle, "magic_buffer");
  if (p_magic_buffer == NULL)
    return;
  p_magic_close = (typeof (p_magic_close))lt_dlsym(handle, "magic_close");
  if (p_magic_close == NULL)
    return;
  p_magic_load = (typeof (p_magic_load))lt_dlsym(handle, "magic_load");
  if (p_magic_load == NULL)
    return;

  cookie = p_magic_open (MAGIC_MIME);
  if (cookie == (magic_t) NULL)
    return;
  if (p_magic_load (cookie, NULL) == -1)
    {
      p_magic_close (cookie);
      cookie = (magic_t) NULL;
    }
#endif /* HAVE_MAGIC_T && HAVE_MAGIC_H  && defined (USE_LTDL) */
}

::java::lang::String *
java::net::VMURLConnection::guessContentTypeFromBuffer (jbyteArray bytes __attribute__ ((unused)),
							jint valid __attribute__ ((unused)))
{
#if defined (HAVE_MAGIC_T) && defined (HAVE_MAGIC_H) && defined (USE_LTDL)
  const char *result;

  if (cookie == (magic_t) NULL)
    return NULL;

  result = p_magic_buffer (cookie, elements(bytes), valid);

  if (result == NULL)
    return NULL;
  return _Jv_NewStringUTF (result);
#else
  return NULL;
#endif /* HAVE_MAGIC_T && HAVE_MAGIC_H  && defined (USE_LTDL) */
}
