diff options
Diffstat (limited to 'examples/src/main/ruby/Poi4R.i')
-rw-r--r-- | examples/src/main/ruby/Poi4R.i | 614 |
1 files changed, 614 insertions, 0 deletions
diff --git a/examples/src/main/ruby/Poi4R.i b/examples/src/main/ruby/Poi4R.i new file mode 100644 index 0000000000..2f72ce9948 --- /dev/null +++ b/examples/src/main/ruby/Poi4R.i @@ -0,0 +1,614 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +%module poi4r + + +%{ + +#include <gcj/cni.h> +#include <java/lang/Object.h> +#include <java/lang/Thread.h> +#include <java/lang/ThreadGroup.h> +#include <java/lang/Runnable.h> +#include <java/lang/String.h> +#include <java/lang/Throwable.h> +#include <java/lang/Comparable.h> +#include <java/lang/Integer.h> +#include <java/lang/Long.h> +#include <java/lang/Float.h> +#include <java/lang/Double.h> +#include <java/io/StringWriter.h> +#include <java/io/PrintWriter.h> +#include <java/util/HashMap.h> +#include <java/util/Date.h> +#include <java/util/Calendar.h> +#include <java/lang/System.h> + +#include "org/apache/poi/hssf/usermodel/HSSFWorkbook.h" +#include "org/apache/poi/hssf/usermodel/HSSFSheet.h" +#include "org/apache/poi/hssf/usermodel/HSSFRow.h" +#include "org/apache/poi/hssf/usermodel/HSSFCell.h" +#include "org/apache/poi/hssf/usermodel/HSSFFont.h" +#include "org/apache/poi/hssf/usermodel/HSSFCellStyle.h" +#include "org/apache/poi/hssf/usermodel/HSSFDataFormat.h" +#include "org/apache/poi/hssf/usermodel/HSSFHeader.h" +#include "org/apache/poi/hssf/usermodel/HSSFFooter.h" +#include "org/apache/poi/RubyOutputStream.h" + + +typedef ::org::apache::poi::hssf::usermodel::HSSFWorkbook *jhworkbook; +typedef ::org::apache::poi::hssf::usermodel::HSSFSheet *jhsheet; +typedef ::org::apache::poi::hssf::usermodel::HSSFRow *jhrow; +typedef ::org::apache::poi::hssf::usermodel::HSSFCell *jhcell; +typedef ::org::apache::poi::hssf::usermodel::HSSFCellStyle *jhcellstyle; +typedef ::org::apache::poi::hssf::usermodel::HSSFFont *jhfont; +typedef ::org::apache::poi::hssf::usermodel::HSSFFooter *jhfooter; +typedef ::org::apache::poi::hssf::usermodel::HSSFHeader *jhheader; +typedef ::org::apache::poi::hssf::usermodel::HSSFDataFormat *jhdataformat; + +typedef ::java::util::Date *jdate; +typedef ::java::util::Calendar *jcalendar; +typedef ::java::io::OutputStream *joutputstream; +typedef ::java::io::InputStream *jinputstream; +typedef ::java::util::Collection *jstringCollection; +typedef ::java::util::Collection *jtermCollection; +typedef ::java::util::Locale *jlocale; +typedef ::java::lang::Comparable *jcomparable; +typedef JArray<jobject> *jobjectArray; +typedef JArray<jstring> *jstringArray; + + +static java::lang::Thread *nextThread; +static java::util::HashMap *objects; + + +static void store_reference(jobject object) { + java::lang::Integer *ji =new java::lang::Integer(java::lang::System::identityHashCode(object)); + jobject jo = objects->get(ji); + if (!jo) { + // printf("put object in hash\n"); + objects->put(ji,object); + } +} +static VALUE jo2rv(jobject object, swig_type_info *descriptor) +{ + if (object == NULL) + { + return Qnil; + } + else + { + return SWIG_NewPointerObj((void *) object, descriptor, 0); + } +} +static int cvtptr(VALUE value, void **jo, swig_type_info *info) +{ + if (SWIG_ConvertPtr(value, jo, info, 0) == 0) + return 0; + else + { + return -1; + } +} + +static int rv2jo(VALUE rv, jobject *jo, swig_type_info *descriptor) +{ + if (NIL_P(rv)) + *jo = NULL; + else + { + java::lang::Object *javaObj; + + if (cvtptr(rv, (void **) &javaObj, descriptor) == -1) + return 0; + + *jo = javaObj; + } + + return 1; +} + + +static jstring r2j(VALUE object) +{ + if (NIL_P(object)){ + return NULL; + } + else { + char *ps = STR2CSTR(object); + jstring js = JvNewStringLatin1(ps); + + if (!js) + { + rb_raise(rb_eRuntimeError, "ruby str cannot be converted to java: %s",ps); + } + + return js; + } +} + +VALUE j2r(jstring js) +{ + if (!js) + { + return Qnil; + } + else + { + jint len = JvGetStringUTFLength(js); + char buf[len + 1]; + + JvGetStringUTFRegion(js, 0, len, buf); + buf[len] = '\0'; + + return rb_str_new2(buf); + } +} + +static void free_java_obj(void* arg1) { + jobject object =(jobject) arg1; + java::lang::Integer *ji =new java::lang::Integer(java::lang::System::identityHashCode(object)); + jobject jo = objects->get(ji); + if (jo) { + // printf("removed object from hash\n"); + objects->remove(ji); + } +} + +static void raise_ruby_error(java::lang::Throwable *e) { + java::io::StringWriter *buffer = new java::io::StringWriter(); + java::io::PrintWriter *writer = new java::io::PrintWriter(buffer); + e->printStackTrace(writer); + writer->close(); + jstring message = buffer->toString(); + jint len = JvGetStringUTFLength(message); + char buf[len + 1]; + JvGetStringUTFRegion(message, 0, len, buf); + buf[len] = '\0'; + rb_raise(rb_eRuntimeError, "error calling poi \n %s", buf); +} + +%} + +typedef long jint; +typedef long long jlong; +typedef char jbyte; +typedef float jfloat; +typedef float jdouble; +typedef int jshort; +typedef bool jboolean; + +%typemap(in) SWIGTYPE * { + + if (!rv2jo($input, (jobject *) &$1, $1_descriptor)) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping"); +} +%typemap(out) SWIGTYPE * { + + $result = jo2rv($1, $1_descriptor); +} + +%typemap(in) org::apache::poi::hssf::usermodel::HSSFWorkbook{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFWorkbook *))) + SWIG_fail; +} +%typemap(out) org::apache::poi::hssf::usermodel::HSSFWorkbook { + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFWorkbook *)); +} + +%typemap(in) jhsheet{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFSheet *))) + SWIG_fail; +} +%typemap(out) jhsheet { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFSheet *)); +} +%typemap(in) jhrow{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFRow *))) + SWIG_fail; +} +%typemap(out) jhrow { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFRow *)); +} +%typemap(in) jhcell{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFCell *))) + SWIG_fail; +} +%typemap(out) jhcell { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFCell *)); +} +%typemap(in) jhfont{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFFont *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFFont"); +} + +%typemap(out) jhfont { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFFont *)); +} + +%typemap(in) jhcellstyle{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFCellStyle *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFCellStyle"); +} +%typemap(out) jhcellstyle { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFCellStyle *)); +} +%typemap(in) jhdataformat{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFDataFormat *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFDataFormat"); +} +%typemap(out) jhdataformat { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFDataFormat *)); +} + + +%typemap(in) jstring { + $1 = r2j($input); +} +%typemap(out) jstring { + $result = j2r($1); +} +%typecheck(SWIG_TYPECHECK_STRING) jstring { + $1 = ( NIL_P($input) || TYPE($input)==T_STRING ); +} + +%typemap(in) joutputstream { + + jlong ptr; + if (!rb_respond_to($input, rb_intern("putc"))) rb_raise(rb_eTypeError,"Expected IO"); + *(VALUE *) &ptr = (VALUE) $input; + $1 = new org::apache::poi::RubyOutputStream(ptr); +} +%typemap(in) jcalendar { + $1 = java::util::Calendar::getInstance(); + //$1->setTimeInMillis((long long) NUM2DBL(rb_funcall($input,rb_intern("to_i"),0,NULL))*1000.0); + $1->set(FIX2INT(rb_funcall($input,rb_intern("year"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("mon"),0,NULL))-1, + FIX2INT(rb_funcall($input,rb_intern("day"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("hour"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("min"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("sec"),0,NULL)) + ); +} + +%typecheck(SWIG_TYPECHECK_POINTER) jcalendar { + $1 = rb_respond_to($input, rb_intern("asctime")); +} + +%typemap(out) jdate { + jlong t = ((jdate) $1)->getTime(); + //TODO: separate seconds and microsecs + int ts=t/1000; + $result=rb_time_new((time_t) ts, 0 ); +} + + +%freefunc org::apache::poi::hssf::usermodel::HSSFWorkbook "free_java_obj"; + +%exception { + try { + $action + } catch (java::lang::Throwable *e) { + raise_ruby_error(e); + } +} +%exception org::apache::poi::hssf::usermodel::HSSFWorkbook::HSSFWorkbook { + try { + $action + store_reference(result); + } catch (java::lang::Throwable *e) { + raise_ruby_error(e); + } +} + + + + +namespace java { + namespace lang { + class Object { + jstring toString(); + }; +%nodefault; + class System : public Object { + public: + static jstring getProperty(jstring); + static jstring getProperty(jstring, jstring); + static void load(jstring); + static void loadLibrary(jstring); + static void mapLibraryName(jstring); + static void runFinalization(); + static void setProperty(jstring, jstring); + }; +%makedefault; + } + namespace io { +%nodefault; + class InputStream : public ::java::lang::Object { + }; + class OutputStream : public ::java::lang::Object { + }; + +%makedefault; + } + namespace util { + class Date : public ::java::lang::Object { + public: + Date(); + Date(jlong); + void setTime(jlong); + jstring toString(); + }; + } +} + + +namespace org { + namespace apache { + namespace poi { + namespace hssf { + namespace usermodel { +%nodefault; + class HSSFWorkbook : public ::java::lang::Object { + public: + HSSFWorkbook(); + jstring getSheetName(jint); + jint getNumberOfSheets(); + void setSheetOrder(jstring,jint); + void setSheetName(jint,jstring); + void setSheetName(jint,jstring,jshort); + jint getSheetIndex(jstring); + jhsheet createSheet(); + jhsheet cloneSheet(jint); + jhsheet createSheet(jstring); + jhsheet getSheetAt(jint); + jhsheet getSheet(jstring); + void removeSheetAt(jint); + jhcellstyle createCellStyle(); + jhfont createFont(); + jhdataformat createDataFormat(); + void write(joutputstream); + + }; + + class HSSFSheet : public ::java::lang::Object { + public: + jhrow createRow(jint); + jhrow getRow(jint); + jhfooter getFooter(); + jhheader getHeader(); + }; + class HSSFRow : public ::java::lang::Object { + public: + jhcell createCell(jshort); + jhcell getCell(jshort); + //jboolean getProtect(); //only in 2.5 + + }; + class HSSFCell : public ::java::lang::Object { + public: + void setCellValue(jdouble); + void setCellValue(jstring); + void setCellValue(jboolean); + void setCellValue(jcalendar); + void setCellFormula(jstring); + jstring getStringCellValue(); + jdouble getNumericCellValue(); + jdate getDateCellValue(); + jstring getCellFormula(); + jboolean getBooleanCellValue(); + jint getCellType(); + jshort getEncoding(); + void setAsActiveCell(); + + void setCellStyle(jhcellstyle); + void setEncoding(jshort encoding); + + static const jint CELL_TYPE_BLANK; + static const jint CELL_TYPE_BOOLEAN; + static const jint CELL_TYPE_ERROR; + static const jint CELL_TYPE_FORMULA; + static const jint CELL_TYPE_NUMERIC; + static const jint CELL_TYPE_STRING; + + static const jshort ENCODING_COMPRESSED_UNICODE; + static const jshort ENCODING_UTF_16; + }; + class HSSFCellStyle : public ::java::lang::Object { + public: + static const jshort ALIGN_CENTER; + static const jshort ALIGN_CENTER_SELECTION; + static const jshort ALIGN_FILL; + static const jshort ALIGN_GENERAL; + static const jshort ALIGN_JUSTIFY; + static const jshort ALIGN_LEFT; + static const jshort ALIGN_RIGHT; + static const jshort ALT_BARS; + static const jshort BIG_SPOTS; + static const jshort BORDER_DASH_DOT; + static const jshort BORDER_DASH_DOT_DOT; + static const jshort BORDER_DASHED; + static const jshort BORDER_DOTTED; + static const jshort BORDER_DOUBLE; + static const jshort BORDER_HAIR; + static const jshort BORDER_MEDIUM; + static const jshort BORDER_MEDIUM_DASH_DOT; + static const jshort BORDER_MEDIUM_DASH_DOT_DOT; + static const jshort BORDER_MEDIUM_DASHED; + static const jshort BORDER_NONE; + static const jshort BORDER_SLANTED_DASH_DOT; + static const jshort BORDER_THICK; + static const jshort BORDER_THIN; + static const jshort BRICKS; + static const jshort DIAMONDS; + static const jshort FINE_DOTS; + static const jshort NO_FILL; + static const jshort SOLID_FOREGROUND; + static const jshort SPARSE_DOTS; + static const jshort SQUARES; + static const jshort THICK_BACKWARD_DIAG; + static const jshort THICK_FORWARD_DIAG; + static const jshort THICK_HORZ_BANDS; + static const jshort THICK_VERT_BANDS; + static const jshort THIN_BACKWARD_DIAG; + static const jshort THIN_FORWARD_DIAG; + static const jshort THIN_HORZ_BANDS; + static const jshort THIN_VERT_BANDS; + static const jshort VERTICAL_BOTTOM; + static const jshort VERTICAL_CENTER; + static const jshort VERTICAL_JUSTIFY; + static const jshort VERTICAL_TOP; + + jshort getAlignment(); + jshort getBorderBottom(); + jshort getBorderLeft(); + jshort getBorderRight(); + jshort getBorderTop(); + jshort getBottomBorderColor(); + jshort getDataFormat(); + jshort getFillBackgroundColor(); + jshort getFillForegroundColor(); + jshort getFillPattern(); + jshort getFontIndex(); + jboolean getHidden(); + jshort getIndention(); + jshort getIndex(); + jshort getLeftBorderColor(); + jboolean getLocked(); + jshort getRightBorderColor(); + jshort getRotation(); + jshort getTopBorderColor(); + jshort getVerticalAlignment(); + jboolean getWrapText(); + void setAlignment(jshort) ; + void setBorderBottom(jshort ); + void setBorderLeft(jshort ); + void setBorderRight(jshort ); + void setBorderTop(jshort ); + void setBottomBorderColor(jshort ); + void setDataFormat(jshort ); + void setFillBackgroundColor(jshort ); + void setFillForegroundColor(jshort ); + void setFillPattern(jshort ); + void setFont(jhfont ); + void setHidden(jboolean ); + void setIndention(jshort ); + void setLeftBorderColor(jshort ); + void setLocked(jboolean ); + void setRightBorderColor(jshort ); + void setRotation(jshort ); + void setTopBorderColor(jshort ); + void setVerticalAlignment(jshort ); + void setWrapText(jboolean ); + }; + class HSSFDataFormat : public ::java::lang::Object { + public: + static jstring getBuiltinFormat(jshort); + static jshort getBuiltinFormat(jstring); + jstring getFormat(jshort); + jshort getFormat(jstring); + static jint getNumberOfBuiltinBuiltinFormats(); + //TODO static jlist getBuiltinFormats(); + + }; + class HSSFFont : public ::java::lang::Object { + public: + static const jshort BOLDWEIGHT_BOLD; +static const jshort BOLDWEIGHT_NORMAL; +static const jshort COLOR_NORMAL; +static const jshort COLOR_RED; +static const jstring FONT_ARIAL; +static const jshort SS_NONE; +static const jshort SS_SUB; +static const jshort SS_SUPER; +static const jshort U_DOUBLE; +static const jshort U_DOUBLE_ACCOUNTING; +static const jshort U_NONE; +static const jshort U_SINGLE; +static const jshort U_SINGLE_ACCOUNTING; + + jshort getBoldweight(); + jshort getColor(); + jshort getFontHeight(); + jshort getFontHeightInPoints(); + jstring getFontName(); + jshort getIndex(); + jboolean getItalic(); + jboolean getStrikeout(); + jshort getTypeOffset(); + jshort getUnderline(); + void setBoldweight(jshort ); + void setColor(jshort ); + void setFontHeight(jshort ); + void setFontHeightInPoints(jshort ); + void setFontName(jstring ); + void setItalic(jboolean ); + void setStrikeout(jboolean ); + void setTypeOffset(jshort ); + void setUnderline(jshort ); +}; +%makedefault; + } + } + } + } +} + + + + + +%init %{ + + JvCreateJavaVM(NULL); + JvAttachCurrentThread(NULL, NULL); + + nextThread = new java::lang::Thread(); + objects = new java::util::HashMap(); + + java::util::HashMap *props = (java::util::HashMap *) + java::lang::System::getProperties(); + props->put(JvNewStringUTF("inRuby"), objects); + + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFFont::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFCell::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFSheet::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFCellStyle::class$); + +%} + |