JIMS: plug extraction
[scilab.git] / scilab / modules / external_objects_java / src / cpp / unwrap.hpp
1 /*
2  * JIMS ( http://forge.scilab.org/index.php/p/JIMS/ ) - This file is a part of JIMS
3  * Copyright (C) 2010 - 2011 - Calixte DENIZET <calixte@contrib.scilab.org>
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 /*
14  * Template to handle several unwrapping operations
15  */
16
17 #include <jni.h>
18 #include "api_scilab.h"
19 #include "GiwsException.hxx"
20 #include "NoMoreScilabMemoryException.hxx"
21 #include "JIMSwrapunwrap.h"
22
23 #define SCILABJAVAOBJECT "org/scilab/modules/external_objects_java/ScilabJavaObject"
24
25 template <typename T, typename U, class V>
26 void unwrapMat(JavaVM * jvm_, const bool methodOfConv, const int javaID, const int pos)
27 {
28     SciErr err;
29     jint lenRow, lenCol;
30     jboolean isCopy = JNI_FALSE;
31     jarray oneDim;
32     JNIEnv * curEnv = NULL;
33     U *addr = NULL;
34
35     jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
36     jclass cls = curEnv->FindClass(SCILABJAVAOBJECT);
37
38     jmethodID id = curEnv->GetStaticMethodID(cls, V::getMatMethodName(), V::getMatMethodSignature()) ;
39     if (id == NULL)
40     {
41         throw GiwsException::JniMethodNotFoundException(curEnv, V::getMatMethodName());
42     }
43
44     jobjectArray res = static_cast<jobjectArray>(curEnv->CallStaticObjectMethod(cls, id, javaID));
45     if (curEnv->ExceptionCheck())
46     {
47         throw GiwsException::JniCallMethodException(curEnv);
48     }
49
50     lenRow = curEnv->GetArrayLength(res);
51     oneDim = reinterpret_cast<jarray>(curEnv->GetObjectArrayElement(res, 0));
52     lenCol = curEnv->GetArrayLength(oneDim);
53     curEnv->DeleteLocalRef(oneDim);
54
55     if (getMethodOfConv())
56     {
57         err = V::allocMatrix(pvApiCtx, pos, lenRow, lenCol, (void**) &addr);
58     }
59     else
60     {
61         err = V::allocMatrix(pvApiCtx, pos, lenCol, lenRow, (void**) &addr);
62     }
63
64     if (err.iErr)
65     {
66         curEnv->DeleteLocalRef(res);
67         throw org_scilab_modules_external_objects_java::NoMoreScilabMemoryException();
68     }
69
70     T *resultsArray;
71     for (int i = 0; i < lenRow; i++)
72     {
73         oneDim = reinterpret_cast<jarray>(curEnv->GetObjectArrayElement(res, i));
74         resultsArray = static_cast<T *>(curEnv->GetPrimitiveArrayCritical(oneDim, &isCopy));
75         if (getMethodOfConv())
76         {
77             for (int j = 0; j < lenCol; j++)
78             {
79                 addr[j * lenRow + i] = static_cast<U>(resultsArray[j]);
80             }
81         }
82         else
83         {
84             for (int j = 0; j < lenCol; j++)
85             {
86                 addr[i * lenCol + j] = static_cast<U>(resultsArray[j]);
87             }
88         }
89         curEnv->ReleasePrimitiveArrayCritical(oneDim, resultsArray, JNI_ABORT);
90         curEnv->DeleteLocalRef(oneDim);
91     }
92
93     curEnv->DeleteLocalRef(res);
94     if (curEnv->ExceptionCheck())
95     {
96         throw GiwsException::JniCallMethodException(curEnv);
97     }
98 }
99
100 template <typename T, typename U, class V>
101 void unwrapRow(JavaVM * jvm_, const bool methodOfConv, const int javaID, const int pos)
102 {
103     SciErr err;
104     jint lenRow;
105     jboolean isCopy = JNI_FALSE;
106     JNIEnv * curEnv = NULL;
107     U *addr = NULL;
108
109     jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
110     jclass cls = curEnv->FindClass(SCILABJAVAOBJECT);
111
112     jmethodID id = curEnv->GetStaticMethodID(cls, V::getRowMethodName(), V::getRowMethodSignature());
113     if (id == NULL)
114     {
115         throw GiwsException::JniMethodNotFoundException(curEnv, V::getRowMethodName());
116     }
117
118     jobjectArray res = static_cast<jobjectArray>(curEnv->CallStaticObjectMethod(cls, id, javaID));
119     if (curEnv->ExceptionCheck())
120     {
121         curEnv->DeleteLocalRef(res);
122         throw GiwsException::JniCallMethodException(curEnv);
123     }
124
125     lenRow = curEnv->GetArrayLength(res);
126     err = V::allocMatrix(pvApiCtx, pos, 1, lenRow, (void**) &addr);
127
128     if (err.iErr)
129     {
130         curEnv->DeleteLocalRef(res);
131         throw org_scilab_modules_external_objects_java::NoMoreScilabMemoryException();
132     }
133
134     T *resultsArray = static_cast<T *>(curEnv->GetPrimitiveArrayCritical(res, &isCopy));
135     for (int i = 0; i < lenRow; i++)
136     {
137         addr[i] = static_cast<U>(resultsArray[i]);
138     }
139
140     curEnv->ReleasePrimitiveArrayCritical(res, resultsArray, JNI_ABORT);
141     curEnv->DeleteLocalRef(res);
142     if (curEnv->ExceptionCheck())
143     {
144         throw GiwsException::JniCallMethodException(curEnv);
145     }
146 }
147
148 template <typename T, typename U, class V>
149 void unwrapSingle(JavaVM * jvm_, const bool methodOfConv, const int javaID, const int pos)
150 {
151     SciErr err;
152     JNIEnv * curEnv = NULL;
153     U *addr = NULL;
154
155     jvm_->AttachCurrentThread(reinterpret_cast<void **>(&curEnv), NULL);
156     jclass cls = curEnv->FindClass(SCILABJAVAOBJECT);
157
158     jmethodID id = curEnv->GetStaticMethodID(cls, V::getMethodName(), V::getMethodSignature()) ;
159     if (id == NULL)
160     {
161         throw GiwsException::JniMethodNotFoundException(curEnv, V::getMethodName());
162     }
163
164     err = V::allocMatrix(pvApiCtx, pos, 1, 1, (void**) &addr);
165
166     if (err.iErr)
167     {
168         throw org_scilab_modules_external_objects_java::NoMoreScilabMemoryException();
169     }
170
171     *addr = static_cast<U>(V::getSingleVar(curEnv, cls, id, javaID));
172     if (curEnv->ExceptionCheck())
173     {
174         throw GiwsException::JniCallMethodException(curEnv);
175     }
176 }