Blame jni/src/jawvalue.c

Packit ffe0d2
/*
Packit ffe0d2
 * Java ATK Wrapper for GNOME
Packit ffe0d2
 * Copyright (C) 2009 Sun Microsystems Inc.
Packit ffe0d2
 *
Packit ffe0d2
 * This library is free software; you can redistribute it and/or
Packit ffe0d2
 * modify it under the terms of the GNU Lesser General Public
Packit ffe0d2
 * License as published by the Free Software Foundation; either
Packit ffe0d2
 * version 2.1 of the License, or (at your option) any later version.
Packit ffe0d2
 *
Packit ffe0d2
 * This library is distributed in the hope that it will be useful,
Packit ffe0d2
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ffe0d2
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ffe0d2
 * Lesser General Public License for more details.
Packit ffe0d2
 *
Packit ffe0d2
 * You should have received a copy of the GNU Lesser General Public
Packit ffe0d2
 * License along with this library; if not, write to the Free Software
Packit ffe0d2
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit ffe0d2
 */
Packit ffe0d2
Packit ffe0d2
#include <atk/atk.h>
Packit ffe0d2
#include <glib.h>
Packit ffe0d2
#include "jawimpl.h"
Packit ffe0d2
#include "jawutil.h"
Packit ffe0d2
Packit ffe0d2
extern void	jaw_value_interface_init (AtkValueIface*);
Packit ffe0d2
extern gpointer	jaw_value_data_init (jobject ac);
Packit ffe0d2
extern void	jaw_value_data_finalize (gpointer);
Packit ffe0d2
Packit ffe0d2
static void jaw_value_get_current_value(AtkValue *obj, GValue *value);
Packit ffe0d2
static void jaw_value_get_maximum_value(AtkValue *obj, GValue *value);
Packit ffe0d2
static void jaw_value_get_minimum_value(AtkValue *obj, GValue *value);
Packit ffe0d2
static gboolean jaw_value_set_current_value(AtkValue *obj, const GValue *value);
Packit ffe0d2
static gdouble jaw_value_get_increment (AtkValue *obj);
Packit ffe0d2
Packit ffe0d2
typedef struct _ValueData {
Packit ffe0d2
  jobject atk_value;
Packit ffe0d2
} ValueData;
Packit ffe0d2
Packit ffe0d2
void
Packit ffe0d2
jaw_value_interface_init (AtkValueIface *iface)
Packit ffe0d2
{
Packit ffe0d2
  iface->get_current_value = jaw_value_get_current_value;
Packit ffe0d2
  iface->get_maximum_value = jaw_value_get_maximum_value;
Packit ffe0d2
  iface->get_minimum_value = jaw_value_get_minimum_value;
Packit ffe0d2
  iface->set_current_value = jaw_value_set_current_value;
Packit ffe0d2
  iface->get_increment = jaw_value_get_increment;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
gpointer
Packit ffe0d2
jaw_value_data_init (jobject ac)
Packit ffe0d2
{
Packit ffe0d2
  ValueData *data = g_new0(ValueData, 1);
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classValue = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                           "org/GNOME/Accessibility/AtkValue");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classValue,
Packit ffe0d2
                                          "<init>",
Packit ffe0d2
                                          "(Ljavax/accessibility/AccessibleContext;)V");
Packit ffe0d2
  jobject jatk_value = (*jniEnv)->NewObject(jniEnv, classValue, jmid, ac);
Packit ffe0d2
  data->atk_value = (*jniEnv)->NewGlobalRef(jniEnv, jatk_value);
Packit ffe0d2
Packit ffe0d2
  return data;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
void
Packit ffe0d2
jaw_value_data_finalize (gpointer p)
Packit ffe0d2
{
Packit ffe0d2
  ValueData *data = (ValueData*)p;
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
Packit ffe0d2
  if (data && data->atk_value)
Packit ffe0d2
  {
Packit ffe0d2
    (*jniEnv)->DeleteGlobalRef(jniEnv, data->atk_value);
Packit ffe0d2
    data->atk_value = NULL;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
get_g_value_from_java_number (JNIEnv *jniEnv, jobject jnumber, GValue *value)
Packit ffe0d2
{
Packit ffe0d2
  jclass classByte = (*jniEnv)->FindClass(jniEnv, "java/lang/Byte");
Packit ffe0d2
  jclass classDouble = (*jniEnv)->FindClass(jniEnv, "java/lang/Double");
Packit ffe0d2
  jclass classFloat = (*jniEnv)->FindClass(jniEnv, "java/lang/Float");
Packit ffe0d2
  jclass classInteger = (*jniEnv)->FindClass(jniEnv, "java/lang/Integer");
Packit ffe0d2
  jclass classLong = (*jniEnv)->FindClass(jniEnv, "java/lang/Long");
Packit ffe0d2
  jclass classShort = (*jniEnv)->FindClass(jniEnv, "java/lang/Short");
Packit ffe0d2
Packit ffe0d2
  jmethodID jmid;
Packit ffe0d2
Packit ffe0d2
  if ((*jniEnv)->IsInstanceOf(jniEnv, jnumber, classByte))
Packit ffe0d2
  {
Packit ffe0d2
    jmid = (*jniEnv)->GetMethodID(jniEnv, classByte, "byteValue", "()B");
Packit ffe0d2
    g_value_init(value, G_TYPE_CHAR);
Packit ffe0d2
    g_value_set_schar(value,
Packit ffe0d2
                      (gchar)(*jniEnv)->CallByteMethod(jniEnv, jnumber, jmid));
Packit ffe0d2
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  if ((*jniEnv)->IsInstanceOf(jniEnv, jnumber, classDouble))
Packit ffe0d2
  {
Packit ffe0d2
    jmid = (*jniEnv)->GetMethodID(jniEnv, classDouble, "doubleValue", "()D");
Packit ffe0d2
    g_value_init(value, G_TYPE_DOUBLE);
Packit ffe0d2
    g_value_set_double(value,
Packit ffe0d2
                       (gdouble)(*jniEnv)->CallDoubleMethod(jniEnv, jnumber, jmid));
Packit ffe0d2
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  if ((*jniEnv)->IsInstanceOf(jniEnv, jnumber, classFloat))
Packit ffe0d2
  {
Packit ffe0d2
    jmid = (*jniEnv)->GetMethodID(jniEnv, classFloat, "floatValue", "()F");
Packit ffe0d2
    g_value_init(value, G_TYPE_FLOAT);
Packit ffe0d2
    g_value_set_float(value,
Packit ffe0d2
                      (gfloat)(*jniEnv)->CallFloatMethod(jniEnv, jnumber, jmid));
Packit ffe0d2
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  if ((*jniEnv)->IsInstanceOf(jniEnv, jnumber, classInteger)
Packit ffe0d2
    || (*jniEnv)->IsInstanceOf(jniEnv, jnumber, classShort))
Packit ffe0d2
    {
Packit ffe0d2
    jmid = (*jniEnv)->GetMethodID(jniEnv, classInteger, "intValue", "()I");
Packit ffe0d2
    g_value_init(value, G_TYPE_INT);
Packit ffe0d2
    g_value_set_int(value,
Packit ffe0d2
                    (gint)(*jniEnv)->CallIntMethod(jniEnv, jnumber, jmid));
Packit ffe0d2
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  if ((*jniEnv)->IsInstanceOf(jniEnv, jnumber, classLong)) {
Packit ffe0d2
    jmid = (*jniEnv)->GetMethodID(jniEnv, classLong, "longValue", "()J");
Packit ffe0d2
    g_value_init(value, G_TYPE_INT64);
Packit ffe0d2
    g_value_set_int64(value,
Packit ffe0d2
                      (gint64)(*jniEnv)->CallLongMethod(jniEnv, jnumber, jmid));
Packit ffe0d2
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
jaw_value_get_current_value (AtkValue *obj, GValue *value)
Packit ffe0d2
{
Packit ffe0d2
  if (!value)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(obj);
Packit ffe0d2
  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
Packit ffe0d2
  jobject atk_value = data->atk_value;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkValue = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                              "org/GNOME/Accessibility/AtkValue");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkValue,
Packit ffe0d2
                                          "get_current_value",
Packit ffe0d2
                                          "()Ljava/lang/Number;");
Packit ffe0d2
  jobject jnumber = (*jniEnv)->CallObjectMethod(jniEnv,
Packit ffe0d2
                                                atk_value,
Packit ffe0d2
                                                jmid);
Packit ffe0d2
Packit ffe0d2
  if (!jnumber)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  get_g_value_from_java_number(jniEnv, jnumber, value);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
jaw_value_get_maximum_value (AtkValue *obj, GValue *value)
Packit ffe0d2
{
Packit ffe0d2
  if (!value)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(obj);
Packit ffe0d2
  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
Packit ffe0d2
  jobject atk_value = data->atk_value;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkValue = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                              "org/GNOME/Accessibility/AtkValue");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkValue,
Packit ffe0d2
                                          "get_maximum_value",
Packit ffe0d2
                                          "()Ljava/lang/Number;");
Packit ffe0d2
  jobject jnumber = (*jniEnv)->CallObjectMethod(jniEnv, atk_value, jmid);
Packit ffe0d2
Packit ffe0d2
  if (!jnumber)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  get_g_value_from_java_number(jniEnv, jnumber, value);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static void
Packit ffe0d2
jaw_value_get_minimum_value (AtkValue *obj, GValue *value)
Packit ffe0d2
{
Packit ffe0d2
  if (!value)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(obj);
Packit ffe0d2
  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
Packit ffe0d2
  jobject atk_value = data->atk_value;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkValue = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                              "org/GNOME/Accessibility/AtkValue");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkValue,
Packit ffe0d2
                                          "get_minimum_value",
Packit ffe0d2
                                          "()Ljava/lang/Number;");
Packit ffe0d2
  jobject jnumber = (*jniEnv)->CallObjectMethod(jniEnv, atk_value, jmid);
Packit ffe0d2
Packit ffe0d2
  if (!jnumber)
Packit ffe0d2
  {
Packit ffe0d2
    return;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  get_g_value_from_java_number(jniEnv, jnumber, value);
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gboolean
Packit ffe0d2
jaw_value_set_current_value (AtkValue *obj, const GValue *value)
Packit ffe0d2
{
Packit ffe0d2
  if (!value)
Packit ffe0d2
  {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  if (!G_TYPE_IS_FUNDAMENTAL (G_VALUE_TYPE (value)))
Packit ffe0d2
  {
Packit ffe0d2
    return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  JawObject *jaw_obj = JAW_OBJECT(obj);
Packit ffe0d2
  ValueData *data = jaw_object_get_interface_data(jaw_obj, INTERFACE_VALUE);
Packit ffe0d2
  jobject atk_value = data->atk_value;
Packit ffe0d2
Packit ffe0d2
  JNIEnv *jniEnv = jaw_util_get_jni_env();
Packit ffe0d2
  jclass classAtkValue = (*jniEnv)->FindClass(jniEnv,
Packit ffe0d2
                                              "org/GNOME/Accessibility/AtkValue");
Packit ffe0d2
  jmethodID jmid = (*jniEnv)->GetMethodID(jniEnv,
Packit ffe0d2
                                          classAtkValue,
Packit ffe0d2
                                          "set_current_value",
Packit ffe0d2
                                          "(Ljava/lang/Number;)Z");
Packit ffe0d2
Packit ffe0d2
  jboolean jbool;
Packit ffe0d2
  jclass klass;
Packit ffe0d2
  jmethodID jmidInit;
Packit ffe0d2
  jobject o;
Packit ffe0d2
  switch (value->g_type) {
Packit ffe0d2
    case G_TYPE_CHAR:
Packit ffe0d2
    {
Packit ffe0d2
      gchar c = g_value_get_schar(value);
Packit ffe0d2
      klass = (*jniEnv)->FindClass(jniEnv, "java/lang/Byte");
Packit ffe0d2
      jmidInit = (*jniEnv)->GetMethodID(jniEnv, klass, "<init>", "(B)V");
Packit ffe0d2
      o = (*jniEnv)->NewObject(jniEnv, klass, jmidInit, (jbyte)c);
Packit ffe0d2
      jbool = (*jniEnv)->CallBooleanMethod(jniEnv, atk_value, jmid, o);
Packit ffe0d2
      break;
Packit ffe0d2
    }
Packit ffe0d2
    case G_TYPE_DOUBLE:
Packit ffe0d2
    {
Packit ffe0d2
      gdouble d = g_value_get_double(value);
Packit ffe0d2
      klass = (*jniEnv)->FindClass(jniEnv, "java/lang/Double");
Packit ffe0d2
      jmidInit = (*jniEnv)->GetMethodID(jniEnv, klass, "<init>", "(D)V");
Packit ffe0d2
      o = (*jniEnv)->NewObject(jniEnv, klass, jmidInit, (jdouble)d);
Packit ffe0d2
      jbool = (*jniEnv)->CallBooleanMethod(jniEnv, atk_value, jmid, o);
Packit ffe0d2
      break;
Packit ffe0d2
    }
Packit ffe0d2
    case G_TYPE_FLOAT:
Packit ffe0d2
    {
Packit ffe0d2
      gfloat f = g_value_get_float(value);
Packit ffe0d2
      klass = (*jniEnv)->FindClass(jniEnv, "java/lang/Float");
Packit ffe0d2
      jmidInit = (*jniEnv)->GetMethodID(jniEnv, klass, "<init>", "(F)V");
Packit ffe0d2
      o = (*jniEnv)->NewObject(jniEnv, klass, jmidInit, (jfloat)f);
Packit ffe0d2
      jbool = (*jniEnv)->CallBooleanMethod(jniEnv, atk_value, jmid, o);
Packit ffe0d2
      break;
Packit ffe0d2
    }
Packit ffe0d2
    case G_TYPE_INT:
Packit ffe0d2
    {
Packit ffe0d2
      gint i = g_value_get_int(value);
Packit ffe0d2
      klass = (*jniEnv)->FindClass(jniEnv, "java/lang/Integer");
Packit ffe0d2
      jmidInit = (*jniEnv)->GetMethodID(jniEnv, klass, "<init>", "(I)V");
Packit ffe0d2
      o = (*jniEnv)->NewObject(jniEnv, klass, jmidInit, (jint)i);
Packit ffe0d2
      jbool = (*jniEnv)->CallBooleanMethod(jniEnv, atk_value, jmid, o);
Packit ffe0d2
      break;
Packit ffe0d2
    }
Packit ffe0d2
    case G_TYPE_INT64:
Packit ffe0d2
    {
Packit ffe0d2
      gint64 i64 = g_value_get_int64(value);
Packit ffe0d2
      klass = (*jniEnv)->FindClass(jniEnv, "java/lang/Long");
Packit ffe0d2
      jmidInit = (*jniEnv)->GetMethodID(jniEnv, klass, "<init>", "(J)V");
Packit ffe0d2
      o = (*jniEnv)->NewObject(jniEnv, klass, jmidInit, (jlong)i64);
Packit ffe0d2
      jbool = (*jniEnv)->CallBooleanMethod(jniEnv, atk_value, jmid, o);
Packit ffe0d2
      break;
Packit ffe0d2
    }
Packit ffe0d2
    default:
Packit ffe0d2
      return FALSE;
Packit ffe0d2
  }
Packit ffe0d2
Packit ffe0d2
  return (jbool == JNI_TRUE) ? TRUE : FALSE;
Packit ffe0d2
}
Packit ffe0d2
Packit ffe0d2
static gdouble
Packit ffe0d2
jaw_value_get_increment (AtkValue *obj)
Packit ffe0d2
{
Packit ffe0d2
 return atk_value_get_increment(obj);
Packit ffe0d2
}
Packit ffe0d2