1 /************************************************************************/
2 /*                       Stuff for progress callback                    */
3 /************************************************************************/
4 
5 %header %{
6 typedef struct {
7     JNIEnv *jenv;
8     jobject pJavaCallback;
9 } JavaProgressData;
10 %}
11 
12 %inline
13 %{
14 class ProgressCallback
15 {
16 public:
~ProgressCallback()17         virtual ~ProgressCallback() {  }
run(double dfComplete,const char * pszMessage)18         virtual int run(double dfComplete, const char* pszMessage)
19         {
20             return 1;
21         }
22 };
23 
24 class TermProgressCallback : public ProgressCallback
25 {
26 public:
TermProgressCallback()27     TermProgressCallback()
28     {
29     }
30 
run(double dfComplete,const char * pszMessage)31     virtual int run(double dfComplete, const char* pszMessage)
32     {
33         return GDALTermProgress(dfComplete, pszMessage, NULL);
34     }
35 };
36 %}
37 
38 %{
39 /************************************************************************/
40 /*                        JavaProgressProxy()                           */
41 /************************************************************************/
42 
43 static int CPL_STDCALL
JavaProgressProxy(double dfComplete,const char * pszMessage,void * pData)44 JavaProgressProxy( double dfComplete, const char *pszMessage, void *pData )
45 {
46     JavaProgressData* psProgressInfo = (JavaProgressData*)pData;
47     JNIEnv *jenv = psProgressInfo->jenv;
48     int ret;
49     const jclass progressCallbackClass = jenv->FindClass("org/gdal/gdal/ProgressCallback");
50     const jmethodID runMethod = jenv->GetMethodID(progressCallbackClass, "run", "(DLjava/lang/String;)I");
51     jstring temp_string = jenv->NewStringUTF(pszMessage);
52     ret = jenv->CallIntMethod(psProgressInfo->pJavaCallback, runMethod, dfComplete, temp_string);
53     jenv->DeleteLocalRef(temp_string);
54     return ret;
55 }
56 %}
57 
58 %typemap(arginit, noblock=1) ( GDALProgressFunc callback = NULL, void* callback_data=NULL)
59 {
60     JavaProgressData sProgressInfo;
61     sProgressInfo.jenv = jenv;
62     sProgressInfo.pJavaCallback = NULL;
63 
64 }
65 
66 %typemap(in) ( GDALProgressFunc callback = NULL, void* callback_data=NULL)
67 {
68     if ( $input != 0 ) {
69         sProgressInfo.pJavaCallback = $input;
70         $1 = JavaProgressProxy;
71         $2 = &sProgressInfo;
72     }
73     else
74     {
75         $1 = NULL;
76         $2 = NULL;
77     }
78 }
79 
80 
81 /* These 3 typemaps tell SWIG what JNI and Java types to use */
82 %typemap(jni) (GDALProgressFunc callback = NULL, void* callback_data=NULL)  "jobject"
83 %typemap(jtype) (GDALProgressFunc callback = NULL, void* callback_data=NULL)  "ProgressCallback"
84 %typemap(jstype) (GDALProgressFunc callback = NULL, void* callback_data=NULL)  "ProgressCallback"
85 %typemap(javain) (GDALProgressFunc callback = NULL, void* callback_data=NULL)  "$javainput"
86 %typemap(javaout) (GDALProgressFunc callback = NULL, void* callback_data=NULL) {
87     return $jnicall;
88   }
89