Revision 20217

View differences:

trunk/libraries/libjni-ecw/src/main/native/jecw/ecw_jni_config.c
1
/********************************************************** 
2
** Copyright 2004 Earth Resource Mapping Ltd.
3
** This document contains proprietary source code of
4
** Earth Resource Mapping Ltd, and can only be used under
5
** one of the three licenses as described in the 
6
** license.txt file supplied with this distribution. 
7
** See separate license.txt file for license details 
8
** and conditions.
9
**
10
** This software is covered by US patent #6,442,298,
11
** #6,102,897 and #6,633,688.  Rights to use these patents 
12
** is included in the license agreements.
13
** 
14
** FILE:   	ecw_jni_config.c
15
** CREATED:	10 May 2004
16
** AUTHOR: 	Mark Sheridan
17
** PURPOSE:	Java wrappers for JNI usage of the ECW config functions NCSecwSetConfig() && NCSecwGetConfig()
18
**			For some bizarre reason those calls were implemented as var args, since Java doesnt have var_args
19
**			it makes this code very verbose and prone to errors.
20
** EDITS:
21
**
22
**
23
*******************************************************/
24

  
25
#include "NCSErrors.h"
26
#include "NCSEcw.h"
27
#include "JNCSEcwConfig.h"
28

  
29
#ifndef JNI_VERSION_1_2
30
#error You must compile this class against a 1.2 virtual machine specification
31
#endif
32

  
33
static void ThrowRuntimeEx(JNIEnv *pEnv, char *pMessage)
34
{
35
	// throw an exception of the type "java.lang.RuntimeException"
36
	jclass runTimeExCls = (*pEnv)->FindClass(pEnv, "java/lang/RuntimeException");
37

  
38
	if (runTimeExCls != NULL)
39
	{
40
		(*pEnv)->ThrowNew(pEnv, runTimeExCls, (const char *)pMessage); 
41
	}
42

  
43
	(*pEnv)->DeleteLocalRef(pEnv, runTimeExCls);
44
}
45

  
46
/*
47
 * Class:     com_ermapper_ecw_JNCSEcwConfig
48
 * Method:    SetTextureDither
49
 * Signature: (Z)V
50
 */
51
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setTextureDither
52
  (JNIEnv *pEnv, jclass clazz, jboolean bValue)
53
{
54
	if (NCSecwSetConfig(NCSCFG_TEXTURE_DITHER, bValue) != NCS_SUCCESS)
55
	{
56
		ThrowRuntimeEx(pEnv, "Error setting texture dither property.");
57
	}
58
}
59

  
60
/*
61
 * Class:     com_ermapper_ecw_JNCSEcwConfig
62
 * Method:    GetTextureDither
63
 * Signature: ()Z
64
 */
65
JNIEXPORT jboolean JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getTextureDither
66
  (JNIEnv *pEnv, jclass clazz)
67
{
68
	jboolean bValue = FALSE;
69
	if (NCSecwGetConfig(NCSCFG_TEXTURE_DITHER, &bValue) != NCS_SUCCESS)
70
	{
71
		ThrowRuntimeEx(pEnv, "Error getting texture dither property.");
72
	}
73
	return bValue;
74
}
75

  
76
/*
77
 * Class:     com_ermapper_ecw_JNCSEcwConfig
78
 * Method:    SetForceFileReopen
79
 * Signature: (Z)V
80
 */
81
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setForceFileReopen
82
  (JNIEnv *pEnv, jclass clazz, jboolean  bValue)
83
{
84
	if (NCSecwSetConfig(NCSCFG_FORCE_FILE_REOPEN, bValue) != NCS_SUCCESS)
85
	{
86
		ThrowRuntimeEx(pEnv, "Error setting force file reopen property.");
87
	}
88
}
89

  
90
/*
91
 * Class:     com_ermapper_ecw_JNCSEcwConfig
92
 * Method:    GetForceFileReopen
93
 * Signature: ()Z
94
 */
95
JNIEXPORT jboolean JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getForceFileReopen
96
  (JNIEnv *pEnv, jclass clazz)
97
{
98
	jboolean bValue = FALSE;
99
	if (NCSecwGetConfig(NCSCFG_FORCE_FILE_REOPEN, &bValue) != NCS_SUCCESS)
100
	{
101
		ThrowRuntimeEx(pEnv, "Error getting force file reopen property.");
102
	}
103
	return bValue;
104
}
105

  
106

  
107
/*
108
 * Class:     com_ermapper_ecw_JNCSEcwConfig
109
 * Method:    SetCacheMaxMem
110
 * Signature: (J)V
111
 */
112
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setCacheMaxMem
113
  (JNIEnv *pEnv, jclass clazz, jlong value)
114
{
115
	if (NCSecwSetConfig(NCSCFG_CACHE_MAXMEM, value) != NCS_SUCCESS)
116
	{
117
		ThrowRuntimeEx(pEnv, "Error setting cache max mem property.");
118
	}
119
}
120

  
121

  
122
/*
123
 * Class:     com_ermapper_ecw_JNCSEcwConfig
124
 * Method:    GetCacheMaxMen
125
 * Signature: ()J
126
 */
127
JNIEXPORT jlong JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getCacheMaxMen
128
  (JNIEnv *pEnv, jclass clazz)
129
{
130
	jlong value = 0;
131
	if (NCSecwGetConfig(NCSCFG_CACHE_MAXMEM, &value) != NCS_SUCCESS)
132
	{
133
		ThrowRuntimeEx(pEnv, "Error getting cache max mem property.");
134
	}
135
	return value;
136
}
137

  
138

  
139
/*
140
 * Class:     com_ermapper_ecw_JNCSEcwConfig
141
 * Method:    SetCacheMaxOpenFiles
142
 * Signature: (I)V
143
 */
144
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setCacheMaxOpenFiles
145
  (JNIEnv *pEnv, jclass clazz, jint value)
146
{
147
	if (NCSecwSetConfig(NCSCFG_CACHE_MAXOPEN, value) != NCS_SUCCESS)
148
	{
149
		ThrowRuntimeEx(pEnv, "Error setting cache max open files property.");
150
	}
151
}
152

  
153

  
154
/*
155
 * Class:     com_ermapper_ecw_JNCSEcwConfig
156
 * Method:    GetCacheMaxOpenFiles
157
 * Signature: ()I
158
 */
159
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getCacheMaxOpenFiles
160
  (JNIEnv *pEnv, jclass clazz)
161
{
162
	jint value = 0;
163
	if (NCSecwGetConfig(NCSCFG_CACHE_MAXOPEN, &value) != NCS_SUCCESS)
164
	{
165
		ThrowRuntimeEx(pEnv, "Error getting cache max open files property.");
166
	}
167
	return value;
168
}
169

  
170

  
171
/*
172
 * Class:     com_ermapper_ecw_JNCSEcwConfig
173
 * Method:    SetBlockingTimeMS
174
 * Signature: (I)V
175
 */
176
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setBlockingTimeMS
177
  (JNIEnv *pEnv, jclass clazz, jint value)
178
{
179
	if (NCSecwSetConfig(NCSCFG_BLOCKING_TIME_MS, value) != NCS_SUCCESS)
180
	{
181
		ThrowRuntimeEx(pEnv, "Error setting cache max open files property.");
182
	}
183
}
184

  
185

  
186
/*
187
 * Class:     com_ermapper_ecw_JNCSEcwConfig
188
 * Method:    GetBlockingTimeMS
189
 * Signature: ()I
190
 */
191
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getBlockingTimeMS
192
  (JNIEnv *pEnv, jclass clazz)
193
{
194
	jint value = 0;
195
	if (NCSecwGetConfig(NCSCFG_BLOCKING_TIME_MS, &value) != NCS_SUCCESS)
196
	{
197
		ThrowRuntimeEx(pEnv, "Error getting cache max open files property.");
198
	}
199
	return value;
200
}
201

  
202
/*
203
 * Class:     com_ermapper_ecw_JNCSEcwConfig
204
 * Method:    SetRefreshTimeMS
205
 * Signature: (I)V
206
 */
207
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setRefreshTimeMS
208
  (JNIEnv *pEnv, jclass clazz, jint value)
209
{
210
	if (NCSecwSetConfig(NCSCFG_REFRESH_TIME_MS, value) != NCS_SUCCESS)
211
	{
212
		ThrowRuntimeEx(pEnv, "Error setting refresh time property.");
213
	}
214
}
215

  
216

  
217
/*
218
 * Class:     com_ermapper_ecw_JNCSEcwConfig
219
 * Method:    GetRefreshTimeMS
220
 * Signature: ()I
221
 */
222
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getRefreshTimeMS
223
  (JNIEnv *pEnv, jclass clazz)
224
{
225
	jint value = 0;
226
	if (NCSecwGetConfig(NCSCFG_REFRESH_TIME_MS, &value) != NCS_SUCCESS)
227
	{
228
		ThrowRuntimeEx(pEnv, "Error getting refresh time property.");
229
	}
230
	return value;
231
}
232

  
233

  
234
/*
235
 * Class:     com_ermapper_ecw_JNCSEcwConfig
236
 * Method:    SetPurgeDelayMS
237
 * Signature: (I)V
238
 */
239
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setPurgeDelayMS
240
  (JNIEnv *pEnv, jclass clazz, jint value)
241
{
242
	if (NCSecwSetConfig(NCSCFG_PURGE_DELAY_MS, value) != NCS_SUCCESS)
243
	{
244
		ThrowRuntimeEx(pEnv, "Error setting purge delay property.");
245
	}
246
}
247

  
248

  
249
/*
250
 * Class:     com_ermapper_ecw_JNCSEcwConfig
251
 * Method:    GetPurgeDelayMS
252
 * Signature: ()I
253
 */
254
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getPurgeDelayMS
255
  (JNIEnv *pEnv, jclass clazz)
256
{
257
	jint value = 0;
258
	if (NCSecwGetConfig(NCSCFG_REFRESH_TIME_MS, &value) != NCS_SUCCESS)
259
	{
260
		ThrowRuntimeEx(pEnv, "Error getting purge delay property.");
261
	}
262
	return value;
263
}
264

  
265

  
266
/*
267
 * Class:     com_ermapper_ecw_JNCSEcwConfig
268
 * Method:    SetFilePurgeDelayMS
269
 * Signature: (I)V
270
 */
271
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setFilePurgeDelayMS
272
  (JNIEnv *pEnv, jclass clazz, jint value)
273
{
274
	if (NCSecwSetConfig(NCSCFG_FILE_PURGE_DELAY_MS, value) != NCS_SUCCESS)
275
	{
276
		ThrowRuntimeEx(pEnv, "Error setting file purge delay property.");
277
	}
278
}
279

  
280

  
281
/*
282
 * Class:     com_ermapper_ecw_JNCSEcwConfig
283
 * Method:    GetFilePurgeDelayMS
284
 * Signature: ()I
285
 */
286
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getFilePurgeDelayMS
287
  (JNIEnv *pEnv, jclass clazz)
288
{
289
	jint value = 0;
290
	if (NCSecwGetConfig(NCSCFG_FILE_PURGE_DELAY_MS, &value) != NCS_SUCCESS)
291
	{
292
		ThrowRuntimeEx(pEnv, "Error getting file purge delay property.");
293
	}
294
	return value;
295
}
296

  
297

  
298
/*
299
 * Class:     com_ermapper_ecw_JNCSEcwConfig
300
 * Method:    SetMinPurgeDelayMS
301
 * Signature: (I)V
302
 */
303
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setMinPurgeDelayMS
304
  (JNIEnv *pEnv, jclass clazz, jint value)
305
{
306
	if (NCSecwSetConfig(NCSCFG_MIN_FILE_PURGE_DELAY_MS, value) != NCS_SUCCESS)
307
	{
308
		ThrowRuntimeEx(pEnv, "Error setting min file purge delay property.");
309
	}
310
}
311

  
312

  
313
/*
314
 * Class:     com_ermapper_ecw_JNCSEcwConfig
315
 * Method:    GetMinPurgeDelayMS
316
 * Signature: ()I
317
 */
318
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getMinPurgeDelayMS
319
  (JNIEnv *pEnv, jclass clazz)
320
{
321
	jint value = 0;
322
	if (NCSecwGetConfig(NCSCFG_MIN_FILE_PURGE_DELAY_MS, &value) != NCS_SUCCESS)
323
	{
324
		ThrowRuntimeEx(pEnv, "Error getting min file purge delay property.");
325
	}
326
	return value;
327
}
328

  
329

  
330
/*
331
 * Class:     com_ermapper_ecw_JNCSEcwConfig
332
 * Method:    SetProxy
333
 * Signature: (Ljava/lang/String;)V
334
 */
335
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setECWPProxy
336
  (JNIEnv *pEnv, jclass clazz, jstring value)
337
{
338
	const char *proxy = (*pEnv)->GetStringUTFChars(pEnv, value, (jboolean *)NULL);
339

  
340
	if (proxy != NULL)
341
	{
342
		if (NCSecwSetConfig(NCSCFG_ECWP_PROXY, proxy) != NCS_SUCCESS)
343
		{
344
			ThrowRuntimeEx(pEnv, "Error setting proxy property.");
345
		}
346

  
347
		(*pEnv)->ReleaseStringUTFChars(pEnv, value, proxy);
348
	}
349
}
350

  
351

  
352
/*
353
 * Class:     com_ermapper_ecw_JNCSEcwConfig
354
 * Method:    GetProxy
355
 * Signature: ()Ljava/lang/String;
356
 */
357
JNIEXPORT jstring JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getECWPProxy
358
  (JNIEnv *pEnv, jclass clazz)
359
{
360
	char *pvalue = NULL;
361

  
362
	if (NCSecwGetConfig(NCSCFG_ECWP_PROXY, &pvalue) != NCS_SUCCESS)
363
	{
364
		ThrowRuntimeEx(pEnv, "Error getting proxy property.");
365
	}
366
	else
367
	{
368
		return (*pEnv)->NewStringUTF(pEnv, pvalue);
369
	}
370
	return (*pEnv)->NewStringUTF(pEnv, "");
371
}
372

  
373

  
374
/*
375
 * Class:     com_ermapper_ecw_JNCSEcwConfig
376
 * Method:    SetForceLowMemCompress
377
 * Signature: (Z)V
378
 */
379
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setForceLowMemCompress
380
  (JNIEnv *pEnv, jclass clazz, jboolean bValue)
381
{
382
	if (NCSecwSetConfig(NCSCFG_FORCE_LOWMEM_COMPRESS, bValue) != NCS_SUCCESS)
383
	{
384
		ThrowRuntimeEx(pEnv, "Error setting low mem compress property.");
385
	}
386
}
387

  
388

  
389
/*
390
 * Class:     com_ermapper_ecw_JNCSEcwConfig
391
 * Method:    GetForceLowMemCompress
392
 * Signature: ()Z
393
 */
394
JNIEXPORT jboolean JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getForceLowMemCompress
395
  (JNIEnv *pEnv, jclass clazz)
396
{
397
	jboolean bValue = FALSE;
398
	if (NCSecwGetConfig(NCSCFG_FORCE_LOWMEM_COMPRESS, &bValue) != NCS_SUCCESS)
399
	{
400
		ThrowRuntimeEx(pEnv, "Error getting low mem compress property.");
401
	}
402
	return bValue;
403
}
404

  
405

  
406
/*
407
 * Class:     com_ermapper_ecw_JNCSEcwConfig
408
 * Method:    SetECWPReconnect
409
 * Signature: (Z)V
410
 */
411
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_setECWPReconnect
412
  (JNIEnv *pEnv, jclass clazz, jboolean bValue)
413
{
414
	if (NCSecwSetConfig(NCSCFG_TRY_ECWP_RECONNECT, bValue) != NCS_SUCCESS)
415
	{
416
		ThrowRuntimeEx(pEnv, "Error setting ECWP reconnect property.");
417
	}
418
}
419

  
420

  
421
/*
422
 * Class:     com_ermapper_ecw_JNCSEcwConfig
423
 * Method:    GetECWPReconnect
424
 * Signature: ()Z
425
 */
426
JNIEXPORT jboolean JNICALL Java_com_ermapper_ecw_JNCSEcwConfig_getECWPReconnect
427
  (JNIEnv *pEnv, jclass clazz)
428
{
429
	jboolean bValue = FALSE;
430
	if (NCSecwGetConfig(NCSCFG_TRY_ECWP_RECONNECT, &bValue) != NCS_SUCCESS)
431
	{
432
		ThrowRuntimeEx(pEnv, "Error getting ECWP reconnect property.");
433
	}
434
	return bValue;
435
}
trunk/libraries/libjni-ecw/src/main/native/jecw/ecw_jni.c
1
/********************************************************** 
2
** Copyright 1998 Earth Resource Mapping Ltd.
3
** This document contains proprietary source code of
4
** Earth Resource Mapping Ltd, and can only be used under
5
** one of the three licenses as described in the 
6
** license.txt file supplied with this distribution. 
7
** See separate license.txt file for license details 
8
** and conditions.
9
**
10
** This software is covered by US patent #6,442,298,
11
** #6,102,897 and #6,633,688.  Rights to use these patents 
12
** is included in the license agreements.
13
** 
14
** FILE:   	ecw_jni.c
15
** CREATED:	4 Jan 2000
16
** AUTHOR: 	Mark Sheridan
17
** PURPOSE:	Java wrappers for JNI usage of the ECW library in Java.
18
** EDITS:
19
** 
20
** [01] 01Nov00 mjs Rewrote to be JVM 1.1 compliant.
21
** [02] 08Mar04 mjs Removed old 1.1 spec stuff, now needs a 1.2 compatible virtual machine.
22
** [03] 01Oct05 nbt ECWOpenArray function to support name parameter in char array
23
**
24
*******************************************************/
25

  
26
#include "NCSErrors.h"
27
#include "NCSECWClient.h"
28
#include "NCSMalloc.h" 
29
#include "NCSUtil.h"
30
#include "NCSBuildNumber.h"
31
#include "JNCSFile.h"
32
#include "NCSDynamicLib.h"
33

  
34
//#ifndef JNI_VERSION_1_2
35
//#error You must compile this class against a 1.2 virtual machine specification
36
//#endif
37

  
38
static JavaVM *pJavaVirtualMachineInst = NULL;
39
struct NCSJNIFieldIDs *pGlobalJNCSFieldIDs = NULL;
40

  
41
typedef struct NCSJNIFieldIDs {
42
	jfieldID jIDNativeDataPointer;
43
	jfieldID jIDWidth;
44
	jfieldID jIDHeight;	
45
	jfieldID jIDNumberOfBands;
46
	jfieldID jIDCompressionRate;
47
	jfieldID jIDCellIncrementX;
48
	jfieldID jIDCellIncrementY;
49
	jfieldID jIDCellSizeUnits;
50
	jfieldID jIDOriginX;
51
	jfieldID jIDOriginY;
52
	jfieldID jIDDatum;
53
	jfieldID jIDProjection;
54
	jfieldID jIDFilename;
55
	jfieldID jIDIsOpen;
56
	jmethodID jIDRefreshUpdateMethod;
57
	jfieldID jIDFileType;
58
	jfieldID jIDFileMimeType;
59
} NCSJNIFieldIDs;
60

  
61
// This is the object specific data structure, its cached.
62
typedef struct NCSJNIInfo {
63
	//jobject  ECWFile;
64
	NCSFileView *pFileView;
65
} NCSJNIInfo;
66

  
67
void NCSJNIThrowException(JNIEnv *pEnv, const char *pSignature, const char *pMessage)
68
{
69
	jclass jExceptionClass = NULL;
70

  
71
	if ((*pEnv)->ExceptionCheck(pEnv)) {
72
		(*pEnv)->ExceptionDescribe(pEnv);
73
		(*pEnv)->ExceptionClear(pEnv);
74
	}
75

  
76
	jExceptionClass = (*pEnv)->FindClass(pEnv, pSignature);
77

  
78
	if (jExceptionClass != NULL) {
79
		(*pEnv)->ThrowNew(pEnv, jExceptionClass, pMessage); 
80
	}
81
	(*pEnv)->DeleteLocalRef(pEnv, jExceptionClass);
82
}
83

  
84
NCSError NCSCreateJNIInfoStruct(JNIEnv *pEnv, jobject ECWFile, NCSFileView *pNCSFileView, NCSJNIInfo **pReturn)
85
{
86
	NCSJNIInfo *pJNIInfo;
87
	//char *pErrorString = NULL;
88
	
89
	pJNIInfo = (NCSJNIInfo *)NCSMalloc(sizeof(NCSJNIInfo), TRUE);
90
	if (pJNIInfo != NULL)
91
	{
92
		pJNIInfo->pFileView = pNCSFileView;
93
		//pJNIInfo->ECWFile = (void *)(*pEnv)->NewGlobalRef(pEnv, ECWFile);
94
		*pReturn = pJNIInfo;
95
	}
96
	else
97
	{
98
		return NCS_COULDNT_ALLOC_MEMORY;
99
	}
100
	return NCS_SUCCESS;
101
}
102

  
103
/*
104
 * Class:     None
105
 * Method:    JNI_OnLoad
106
 * Signature: ()Z
107
 */
108

  
109
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *pJVM, void *reserved)
110
{
111
	JNIEnv *pEnv;
112

  
113
	if ((*pJVM)->GetEnv(pJVM, (void **)&pEnv, JNI_VERSION_1_2)) {
114
		NCSJNIThrowException(pEnv, "java/lang/Exception", "JNCS classes require a version 1.2 or higher virtual machine.");
115
		return JNI_ERR;
116
	}
117
	else {
118
		pJavaVirtualMachineInst = pJVM;
119
#ifndef WIN32
120
		NCSecwInit();
121
#endif
122
	}
123
	return JNI_VERSION_1_2;
124
}
125

  
126

  
127
/*
128
 * Class:     None
129
 * Method:    JNI_OnUnload
130
 * Signature: ()Z
131
 */
132
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *pJVM, void *reserved)
133
{
134
#ifndef WIN32
135
		NCSecwShutdown();
136
#endif
137
		NCSFree((void *)pGlobalJNCSFieldIDs);
138
	return;
139
}
140

  
141
/*
142
 * Class:     com_ermapper_ecw_JNCSFile
143
 * Method:    NCSJNIInit
144
 * Signature: ()I
145
 */
146
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_NCSJNIInit
147
  (JNIEnv *pEnv, jclass ECWFileClass)
148
{
149
	NCSJNIFieldIDs *pJNIInfo = NULL;
150
	char *pErrorString = NULL;
151

  
152
	if (!pGlobalJNCSFieldIDs) {
153

  
154
		pJNIInfo = (NCSJNIFieldIDs *)NCSMalloc(sizeof(NCSJNIFieldIDs), TRUE);
155

  
156
		// Get all the field ids of the ECWFile object
157
		pJNIInfo->jIDNativeDataPointer	= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "nativeDataPointer", "J" );
158
		pJNIInfo->jIDWidth				= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "width", "I" );
159
		pJNIInfo->jIDHeight				= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "height", "I" );
160
		pJNIInfo->jIDNumberOfBands		= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "numBands", "I" );
161
		pJNIInfo->jIDCompressionRate	= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "compressionRate", "D" );
162
		pJNIInfo->jIDCellIncrementX		= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "cellIncrementX", "D" );
163
		pJNIInfo->jIDCellIncrementY		= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "cellIncrementY", "D" );
164
		pJNIInfo->jIDCellSizeUnits		= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "cellSizeUnits", "I" );
165
		pJNIInfo->jIDOriginX			= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "originX", "D" );
166
		pJNIInfo->jIDOriginY			= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "originY", "D" );
167
		pJNIInfo->jIDDatum				= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "datum", "Ljava/lang/String;" );
168
		pJNIInfo->jIDProjection			= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "projection", "Ljava/lang/String;" );
169
		pJNIInfo->jIDFilename			= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "fileName", "Ljava/lang/String;" );
170
		pJNIInfo->jIDIsOpen				= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "bIsOpen", "Z" );
171
		pJNIInfo->jIDRefreshUpdateMethod= (*pEnv)->GetMethodID(pEnv, ECWFileClass, "refreshUpdate", "(IIDDDD)V");
172

  
173
		//pJNIInfo->jIDFileType			= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "fileType", "I" );
174
		//pJNIInfo->jIDFileMimeType		= (*pEnv)->GetFieldID(pEnv, ECWFileClass, "mimeType", "Ljava/lang/String;" );
175

  
176

  
177
		// Do some error checking
178
		if (!pJNIInfo->jIDNativeDataPointer)
179
			pErrorString = "Could not determine fieldID for 'nativeDataPointer' in ECWFile object.";
180
		if (!pJNIInfo->jIDWidth)
181
			pErrorString = "Could not determine fieldID for 'width' in ECWFile object.";
182
		if (!pJNIInfo->jIDHeight)
183
			pErrorString = "Could not determine fieldID for 'height' in ECWFile object.";
184
		if (!pJNIInfo->jIDNumberOfBands)
185
			pErrorString = "Could not determine fieldID for 'numBands' in ECWFile object.";
186
		if (!pJNIInfo->jIDCompressionRate)
187
			pErrorString = "Could not determine fieldID for 'compressionRate' in ECWFile object.";
188
		if (!pJNIInfo->jIDCellIncrementX)
189
			pErrorString = "Could not determine fieldID for 'cellIncrementX' in ECWFile object.";
190
		if (!pJNIInfo->jIDCellIncrementY)
191
			pErrorString = "Could not determine fieldID for 'cellIncrementY' in ECWFile object.";
192
		if (!pJNIInfo->jIDCellSizeUnits)
193
			pErrorString = "Could not determine fieldID for 'cellSizeUnits' in ECWFile object.";
194
		if (!pJNIInfo->jIDOriginX)
195
			pErrorString = "Could not determine fieldID for 'originX' in ECWFile object.";
196
		if (!pJNIInfo->jIDOriginY)
197
			pErrorString = "Could not determine fieldID for 'originY' in ECWFile object.";
198
		if (!pJNIInfo->jIDDatum)
199
			pErrorString = "Could not determine fieldID for 'datum' in ECWFile object.";
200
		if (!pJNIInfo->jIDProjection)
201
			pErrorString = "Could not determine fieldID for 'projection' in ECWFile object.";
202
		if (!pJNIInfo->jIDFilename)
203
			pErrorString = "Could not determine fieldID for 'fileName' in ECWFile object.";
204
		if (!pJNIInfo->jIDIsOpen)
205
			pErrorString = "Could not determine fieldID for 'bIsOpen' in ECWFile object.";
206
		/*if (!pJNIInfo->jIDFileType)
207
			pErrorString = "Could not determine fieldID for 'fileType' in ECWFile object.";
208
		if (!pJNIInfo->jIDFileMimeType)
209
			pErrorString = "Could not determine fieldID for 'mimeType' in ECWFile object.";*/
210
			
211
		if (pErrorString) {
212
#ifdef WIN32
213
			MessageBox(NULL, OS_STRING(pErrorString), TEXT("JNCSClass Library (JNI)"), MB_OK);
214
#else
215
			fprintf(stderr, "JNCSClass Library (JNI) : %s\n", pErrorString);
216
#endif
217
			NCSFormatErrorText(NCS_JNI_ERROR, pErrorString);
218
			return NCS_JNI_ERROR;
219
		}
220
		else {
221
			pGlobalJNCSFieldIDs = pJNIInfo;
222
			return NCS_SUCCESS;
223
		}
224
	}
225
	else {
226
		return NCS_SUCCESS;
227
	}
228
}
229

  
230
/*
231
 * There is so much that can go wrong in this call, that is why there is so much error checking.
232
 *
233
 * Class:     None
234
 * Method:    NCSJNIRefreshCallback
235
 * Signature: 
236
 */
237
NCSEcwReadStatus NCSJNIRefreshCallback(NCSFileView *pNCSFileView)
238
{
239
	NCSFileViewSetInfo	*pViewInfo;
240
	NCSJNIInfo *pJNIInfo;
241
	jint nError;
242
	JNIEnv *pEnv;
243
	jclass EcwObjectClass = NULL;
244
	jobject pECWFile = NULL;
245
	
246
	NCScbmGetViewInfo(pNCSFileView, &pViewInfo);
247

  
248
	// Must attach to the vm thread before calling any java methods.
249
	nError = (*pJavaVirtualMachineInst)->AttachCurrentThread(pJavaVirtualMachineInst, (void **)&pEnv, NULL);
250
	
251
	if (nError != 0) {
252
		char Message[] = "The ECW JNI interface could not attach to the current thread in\n"
253
						 "the Java virtual machine. Please refer to the Image Web Server\n"
254
						 "Java SDK documentation for more information about JVM threads.\n\n"
255
						 "Progressive imagery will not be available.";
256
#ifdef WIN32
257
		MessageBox(GetActiveWindow(), OS_STRING(Message), TEXT("JNCSFile VM Error"), MB_OK);
258
#else
259
		fprintf(stderr, "JNCSFile VM Error : %s\n", Message);
260
#endif
261
		return NCSECW_READ_FAILED;
262
	}
263

  
264
	// Make sure we got a view info struct.
265
	if (!pViewInfo) {
266
		NCSJNIThrowException(pEnv, "java/lang/Exception", "ECW JNI component could not obtain the NCSViewInfo pointer from the NCSFileView. No refreshUpdate() will occur.");
267
		(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
268
		return NCSECW_READ_FAILED;
269
	}
270

  
271
	// The file is the global reference stashed in the client data pointer.
272
	pECWFile = (jobject)pViewInfo->pClientData;
273
	
274
	// Check to make sure that the ECW object has not been free'd or garbaged collected. This is only valid for JNI 1.2
275
	if ((*pEnv)->IsSameObject(pEnv, pECWFile/*pViewInfo->pClientData*/, NULL) == JNI_TRUE) {
276
		(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
277
		return NCSECW_READ_FAILED;
278
	}
279

  
280
	// Use the valid reference to the object, to obtain the data pointer.
281
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, pViewInfo->pClientData, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
282

  
283
	if (!pJNIInfo) {
284
		NCSJNIThrowException(pEnv, "java/lang/Exception", "The ECW JNI component could not obtain the client data pointer from the NCSViewInfo struct. No refreshUpdate() will occur.");
285
		(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
286
		return NCSECW_READ_FAILED;
287
	}
288
	
289
	EcwObjectClass = (*pEnv)->GetObjectClass(pEnv, pECWFile/*pJNIInfo->ECWFile*/);
290
	if (EcwObjectClass == NULL) {
291
		NCSJNIThrowException(pEnv, "java/lang/Exception", "The ECW JNI component could not determine the class signature of the ECW object.");
292
		(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
293
		return NCSECW_READ_FAILED;
294
	}
295

  
296
	(*pEnv)->DeleteLocalRef(pEnv, EcwObjectClass);
297

  
298
	//Call the  "refreshUpdate" method on this object, if it implements the JNCSProgressiveUpdate interface.
299
	if (pGlobalJNCSFieldIDs->jIDRefreshUpdateMethod) {
300
		(*pEnv)->CallVoidMethod(pEnv, \
301
								pECWFile, \
302
								pGlobalJNCSFieldIDs->jIDRefreshUpdateMethod, \
303
								pViewInfo->nSizeX, pViewInfo->nSizeY, \
304
								pViewInfo->fTopX, pViewInfo->fLeftY, \
305
								pViewInfo->fBottomX, pViewInfo->fRightY);
306
	}
307
	else {
308
		NCSJNIThrowException(pEnv, "java/lang/ClassNotFoundException", "'refreshUpdate' method not found. Derived classes must implement the interface 'JNCSProgressiveUpdate' to use progressive imagery.");
309
		(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
310
		return NCSECW_READ_FAILED;
311
	}
312

  
313
	(*pJavaVirtualMachineInst)->DetachCurrentThread(pJavaVirtualMachineInst);
314

  
315
	return NCSECW_READ_OK;
316
}
317

  
318

  
319
/**
320
 * 
321
 */
322
int openFile(JNIEnv *pEnv, jobject *JNCSFile, jstring Filename, char *pFilename, jboolean bProgressive, NCSFileViewSetInfo *pNCSFileViewSetInfo, NCSFileView *pNCSFileView){
323
	NCSError nError;
324
		
325
	if (bProgressive) {
326
		nError = NCScbmOpenFileView((char *)pFilename, &pNCSFileView, NCSJNIRefreshCallback);
327
	}
328
	else {
329
		nError = NCScbmOpenFileView((char *)pFilename, &pNCSFileView, NULL);
330
	}
331

  
332

  
333
	if (NCS_FAILED(nError)) {
334
		// Return the short filename, since people dont like diplaying the full ecwp url
335
		char	*pProtocol, *pHost, *pECWFilename, *pShortFileName;
336
		int		nProtocolLength, nHostLength, nFilenameLength;
337

  
338
		NCSecwNetBreakdownUrl((char *)pFilename, &pProtocol, &nProtocolLength,
339
									 &pHost, &nHostLength,
340
									 &pECWFilename, &nFilenameLength);
341

  
342
		if (pECWFilename && nFilenameLength > 0 && (strstr(pECWFilename, "/") || strstr(pECWFilename, "\\")))
343
		{
344
			int len = strlen(pECWFilename), index = 0;
345
			for (index=len; index > 0; index--)
346
			{
347
				pShortFileName = &pECWFilename[index];
348
				if (pECWFilename[index] == '\\' || pECWFilename[index] == '/')
349
				{
350
					pShortFileName ++;
351
					break;
352
				}
353
			}
354
		}
355
		else 
356
		{
357
			pShortFileName = (char *)pFilename;
358
		}
359
		
360
		NCSFormatErrorText(NCS_FILE_OPEN_FAILED, pShortFileName, NCSGetLastErrorText(nError));
361
		return NCS_FILE_OPEN_FAILED;
362
	}
363
	else {
364
		NCSJNIInfo *pJNIInfo = NULL;
365
		char *pMimeType = NULL;
366
		NCSFileViewFileInfo	*pNCSFileInfo = NULL;
367
		
368
		nError = NCSCreateJNIInfoStruct(pEnv, (*JNCSFile), pNCSFileView, &pJNIInfo);
369
		NCScbmGetViewFileInfo(pNCSFileView, &pNCSFileInfo);
370

  
371
		// Set the properties in the actual Java object
372
		(*pEnv)->SetIntField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDWidth, (jint)pNCSFileInfo->nSizeX	);
373
		(*pEnv)->SetIntField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDHeight, (jint)pNCSFileInfo->nSizeY );
374
		(*pEnv)->SetIntField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDNumberOfBands, (jint)pNCSFileInfo->nBands);
375
		(*pEnv)->SetDoubleField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDCompressionRate, (jdouble)pNCSFileInfo->nCompressionRate );
376
		(*pEnv)->SetDoubleField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDCellIncrementX, (jdouble)pNCSFileInfo->fCellIncrementX );
377
		(*pEnv)->SetDoubleField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDCellIncrementY, (jdouble)pNCSFileInfo->fCellIncrementY );
378
		(*pEnv)->SetIntField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDCellSizeUnits, (jint)pNCSFileInfo->eCellSizeUnits);
379
		(*pEnv)->SetDoubleField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDOriginX, (jdouble)pNCSFileInfo->fOriginX );
380
		(*pEnv)->SetDoubleField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDOriginY, (jdouble)pNCSFileInfo->fOriginY );
381
		(*pEnv)->SetObjectField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDDatum, (*pEnv)->NewStringUTF(pEnv, pNCSFileInfo->szDatum));
382
		(*pEnv)->SetObjectField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDProjection, (*pEnv)->NewStringUTF(pEnv, pNCSFileInfo->szProjection));
383
		(*pEnv)->SetObjectField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDFilename, Filename);
384
		(*pEnv)->SetBooleanField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDIsOpen, JNI_TRUE);
385
		(*pEnv)->SetLongField(pEnv, (*JNCSFile), pGlobalJNCSFieldIDs->jIDNativeDataPointer, (jlong)pJNIInfo);
386
	}
387
	return NCS_SUCCESS;
388
}
389

  
390
/*
391
 * Class:     com_ermapper_ecw_JNCSFile
392
 * Method:    ECWOpen
393
 * Signature: (Ljava/lang/String;Z)I
394
 */
395
 
396
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_ECWOpen
397
  (JNIEnv *pEnv, jobject JNCSFile, jstring Filename, jboolean bProgressive){
398
	const char *pFilename = (*pEnv)->GetStringUTFChars(pEnv, Filename, (jboolean *)NULL);
399
	NCSFileView *pNCSFileView = NULL;
400
	NCSFileViewSetInfo *pNCSFileViewSetInfo = NULL;
401
	int ret;
402

  
403
	ret = openFile(pEnv, &JNCSFile, Filename, (char *)pFilename, bProgressive, pNCSFileViewSetInfo, pNCSFileView);
404
	
405
	(*pEnv)->ReleaseStringUTFChars(pEnv, Filename, (const char *)pFilename);
406

  
407
	NCScbmGetViewInfo(pNCSFileView, &pNCSFileViewSetInfo);
408

  
409
	pNCSFileViewSetInfo->pClientData = (void *)(*pEnv)->NewGlobalRef(pEnv, JNCSFile);
410

  
411
	return ret;
412
}
413

  
414

  
415
/*
416
 * Class:     com_ermapper_ecw_JNCSFile
417
 * Method:    ECWOpen
418
 * Signature: (Ljava/lang/String;Z)I
419
 */
420
 
421
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_ECWOpenArray
422
  (JNIEnv *pEnv, jobject JNCSFile, jstring Filename, jboolean bProgressive, jbyteArray pszF){
423
  	
424
	NCSFileView *pNCSFileView = NULL;
425
	NCSFileViewSetInfo *pNCSFileViewSetInfo = NULL;
426
	int ret;
427
	jbyte *pFilename;
428
	int longitud = 0;
429
	NCSError nError;
430
  	
431
  	longitud = (*pEnv)->GetArrayLength(pEnv, pszF); 
432
  	pFilename = (*pEnv)->GetByteArrayElements(pEnv, pszF, 0);
433
  	pFilename = (jbyte *)realloc(pFilename, longitud + 1);
434
  	pFilename[longitud] = '\0';
435
  	
436
  	if (bProgressive) {
437
		nError = NCScbmOpenFileView((char *)pFilename, &pNCSFileView, NCSJNIRefreshCallback);
438
	}else {
439
		nError = NCScbmOpenFileView((char *)pFilename, &pNCSFileView, NULL);
440
	}
441

  
442

  
443
	if (NCS_FAILED(nError)) {
444
		// Return the short filename, since people dont like diplaying the full ecwp url
445
		char	*pProtocol, *pHost, *pECWFilename, *pShortFileName;
446
		int		nProtocolLength, nHostLength, nFilenameLength;
447

  
448
		NCSecwNetBreakdownUrl((char *)pFilename, &pProtocol, &nProtocolLength,
449
									 &pHost, &nHostLength,
450
									 &pECWFilename, &nFilenameLength);
451

  
452
		if (pECWFilename && nFilenameLength > 0 && (strstr(pECWFilename, "/") || strstr(pECWFilename, "\\")))
453
		{
454
			int len = strlen(pECWFilename), index = 0;
455
			for (index=len; index > 0; index--)
456
			{
457
				pShortFileName = &pECWFilename[index];
458
				if (pECWFilename[index] == '\\' || pECWFilename[index] == '/')
459
				{
460
					pShortFileName ++;
461
					break;
462
				}
463
			}
464
		}
465
		else 
466
		{
467
			pShortFileName = (char *)pFilename;
468
		}
469
		
470
		NCSFormatErrorText(NCS_FILE_OPEN_FAILED, pShortFileName, NCSGetLastErrorText(nError));
471
		return NCS_FILE_OPEN_FAILED;
472
	}
473
	else {
474
		NCSJNIInfo *pJNIInfo = NULL;
475
		char *pMimeType = NULL;
476
		NCSFileViewFileInfo	*pNCSFileInfo = NULL;
477
		
478
		nError = NCSCreateJNIInfoStruct(pEnv, JNCSFile, pNCSFileView, &pJNIInfo);
479
		NCScbmGetViewFileInfo(pNCSFileView, &pNCSFileInfo);
480

  
481
		// Set the properties in the actual Java object
482
		(*pEnv)->SetIntField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDWidth, (jint)pNCSFileInfo->nSizeX	);
483
		(*pEnv)->SetIntField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDHeight, (jint)pNCSFileInfo->nSizeY );
484
		(*pEnv)->SetIntField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNumberOfBands, (jint)pNCSFileInfo->nBands);
485
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCompressionRate, (jdouble)pNCSFileInfo->nCompressionRate );
486
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellIncrementX, (jdouble)pNCSFileInfo->fCellIncrementX );
487
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellIncrementY, (jdouble)pNCSFileInfo->fCellIncrementY );
488
		(*pEnv)->SetIntField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellSizeUnits, (jint)pNCSFileInfo->eCellSizeUnits);
489
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDOriginX, (jdouble)pNCSFileInfo->fOriginX );
490
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDOriginY, (jdouble)pNCSFileInfo->fOriginY );
491
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDDatum, (*pEnv)->NewStringUTF(pEnv, pNCSFileInfo->szDatum));
492
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDProjection, (*pEnv)->NewStringUTF(pEnv, pNCSFileInfo->szProjection));
493
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDFilename, Filename);
494
		(*pEnv)->SetBooleanField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDIsOpen, JNI_TRUE);
495
		(*pEnv)->SetLongField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer, (jlong)pJNIInfo);
496

  
497
	}
498
  	
499
  	
500
	//ret = openFile(pEnv, &JNCSFile, Filename, (char *)pszFilename, bProgressive, pNCSFileViewSetInfo, pNCSFileView);
501
	
502
	(*pEnv)->ReleaseByteArrayElements(pEnv, pszF,(jbyte *)pFilename, 0);
503

  
504
	NCScbmGetViewInfo(pNCSFileView, &pNCSFileViewSetInfo);
505

  
506
	pNCSFileViewSetInfo->pClientData = (void *)(*pEnv)->NewGlobalRef(pEnv, JNCSFile);
507

  
508
	return NCS_SUCCESS;
509
}
510

  
511

  
512
/*
513
 * Class:     com_ermapper_ecw_JNCSFile
514
 * Method:    ECWClose
515
 * Signature: (Z)V
516
 */
517
JNIEXPORT void JNICALL Java_com_ermapper_ecw_JNCSFile_ECWClose
518
  (JNIEnv *pEnv , jobject JNCSFile, jboolean bFreeCache)
519
{
520
	NCSError nError;
521
	NCSJNIInfo *pJNIInfo = NULL;
522
	
523
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
524
	
525
	if (pJNIInfo != NULL) {
526
		NCSFileViewSetInfo	*pViewInfo;
527

  
528
		NCScbmGetViewInfo(pJNIInfo->pFileView, &pViewInfo);
529
	
530
		// Clear the Java object members.
531
		(*pEnv)->SetIntField   (pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDWidth, (jint)0	);
532
		(*pEnv)->SetIntField   (pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDHeight, (jint)0 );
533
		(*pEnv)->SetIntField   (pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNumberOfBands, (jint)0);
534
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCompressionRate, (jdouble)0.0 );
535
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellIncrementX, (jdouble)0.0 );
536
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellIncrementY, (jdouble)0.0 );
537
		(*pEnv)->SetIntField   (pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDCellSizeUnits, (jint)0 );
538
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDOriginX, (jdouble)0.0 );
539
		(*pEnv)->SetDoubleField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDOriginY, (jdouble)0.0 );
540
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDDatum, (*pEnv)->NewStringUTF(pEnv, ""));
541
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDProjection, (*pEnv)->NewStringUTF(pEnv, ""));
542
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDFilename, NULL);
543
		(*pEnv)->SetBooleanField(pEnv,JNCSFile, pGlobalJNCSFieldIDs->jIDIsOpen, JNI_FALSE);
544
		(*pEnv)->SetLongField  (pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer, (jlong)0);
545

  
546
		(*pEnv)->SetIntField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDFileType, (jint)0 );
547
		(*pEnv)->SetObjectField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDFileMimeType, NULL );
548

  
549
		// Clean up any global refs
550
		//(*pEnv)->DeleteGlobalRef(pEnv, pJNIInfo->ECWFile);
551
		(*pEnv)->DeleteGlobalRef(pEnv, pViewInfo->pClientData);
552

  
553
		nError = NCScbmCloseFileViewEx(pJNIInfo->pFileView, bFreeCache);
554

  
555
		pJNIInfo->pFileView = NULL;
556
		NCSFree(pJNIInfo);
557
	}
558
	return;
559
}
560

  
561
/*
562
 * Class:     com_ermapper_ecw_JNCSFile
563
 * Method:    ECWSetView
564
 * Signature: (I[IIIIIDDDDII)I
565
 */
566
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_ECWSetView
567
  (JNIEnv *pEnv, jobject ECWFile, jint nBands, jintArray nBandList, jint nDatasetTLX, jint nDatasetTLY, jint nDatasetBRX, jint nDatasetBRY, jdouble dWorldTLX, jdouble dWorldTLY, jdouble dWorldBRX, jdouble dWorldBRY, jint nWidth, jint nHeight)
568
{
569
	NCSError nError = NCS_SUCCESS;
570
	NCSJNIInfo *pJNIInfo = NULL;
571

  
572
	// Sanity check
573
	if ((*pEnv)->IsInstanceOf(pEnv, ECWFile, (*pEnv)->FindClass(pEnv, "com/ermapper/ecw/JNCSFile")) == JNI_FALSE)
574
	{
575
#ifdef WIN32
576
		MessageBox(NULL, OS_STRING("ECWSetView() error : object is not a JNCSFile instance"), TEXT("JNCSClass Library (JNI)"), MB_OK);
577
#endif //WIN32
578
		return NCS_JNI_ERROR;
579
	}
580

  
581
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, ECWFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
582

  
583
	if (pJNIInfo) {
584
		
585
		jint *pBandBuffer = (jint *)NCSMalloc(sizeof(UINT32)*nBands+1, TRUE);
586
		(*pEnv)->GetIntArrayRegion(pEnv, nBandList, 0, nBands, pBandBuffer);
587
		
588
		nError = NCScbmSetFileViewEx(   pJNIInfo->pFileView, 
589
										nBands, 
590
										(UINT32*)pBandBuffer,
591
										nDatasetTLX, nDatasetTLY, nDatasetBRX, nDatasetBRY,
592
										nWidth,
593
										nHeight,
594
										dWorldTLX,
595
										dWorldTLY,
596
										dWorldBRX,
597
										dWorldBRY);
598
		NCSFree(pBandBuffer);
599

  
600
	} else {
601
		NCSFormatErrorText(NCS_JNI_ERROR, "method SetView() could not get native data from JNCSFile object.");
602
		nError = NCS_JNI_ERROR;
603
	}
604
		
605
	return nError;
606
}
607

  
608

  
609
/*
610
 * Class:     com_ermapper_ecw_JNCSFile
611
 * Method:    ECWReadImageRGBA
612
 * Signature: ([I)I
613
 */
614
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_ECWReadImageRGBA
615
  (JNIEnv *pEnv, jobject JNCSFile, jintArray pRGBArray, jint width, jint height)
616
{
617
	jboolean bIsCopy;
618
	NCSEcwReadStatus eStatus;
619
	NCSJNIInfo *pJNIInfo = NULL;
620
	NCSError nError = NCS_SUCCESS;
621
	jint *pRGBAPixels;
622
	jint *pRGBLineArrayPtr = NULL;
623
	int nIndex;
624

  
625
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
626
	
627
	if (!pJNIInfo) {
628
		NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() could not get native data from JNCSFile object.");
629
		nError = NCS_JNI_ERROR;
630
	}
631
	else {
632
		// Lock the primitive array and get a pointer to the memory.
633
		pRGBAPixels = (jint *)(*pEnv)->GetPrimitiveArrayCritical(pEnv, pRGBArray, &bIsCopy);
634

  
635
		if (pRGBAPixels) {
636

  
637
			pRGBLineArrayPtr = pRGBAPixels;
638
			for (nIndex = 0; nIndex < height; nIndex ++) {
639
#if defined(NCSBO_LSBFIRST)
640
				eStatus = NCScbmReadViewLineBGRA( pJNIInfo->pFileView, (UINT32 *)pRGBLineArrayPtr);
641
#elif defined(NCSBO_MSBFIRST)
642
				eStatus = NCScbmReadViewLineBGRA( pJNIInfo->pFileView, (UINT32 *)pRGBLineArrayPtr);
643
				//eStatus = NCScbmReadViewLineRGBA( pJNIInfo->pFileView, (UINT32 *)pRGBLineArrayPtr);
644
#endif
645
				pRGBLineArrayPtr += width;
646

  
647
				if (eStatus == NCSECW_READ_CANCELLED) {
648
					nError = NCS_SUCCESS;
649
					break;
650
				}
651
				if (eStatus == NCSECW_READ_FAILED) {
652
					NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() failed (internal error).");
653
					nError = NCS_JNI_ERROR;
654
					break;
655
				}
656
#ifndef WIN32
657
				NCSThreadYield();
658
#endif
659
			}
660
		}
661
		else {
662
			NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() could not allocate memory for RGB Array.");
663
			nError = NCS_JNI_ERROR;
664
		}
665
		// Copy the array back to the object and free the memory
666
		(*pEnv)->ReleasePrimitiveArrayCritical(pEnv, pRGBArray, pRGBAPixels, 0);
667
	}
668
	return nError;
669
}
670

  
671

  
672
/*
673
 * Class:     com_ermapper_ecw_JNCSFile
674
 * Method:    ECWReadLineRGB
675
 * Signature: ([I)I
676
 */
677

  
678
JNIEXPORT jint JNICALL Java_com_ermapper_ecw_JNCSFile_ECWReadLineRGBA
679
  (JNIEnv *pEnv, jobject JNCSFile, jintArray pRGBArray)
680
{
681
	jboolean bIsCopy;
682
	NCSEcwReadStatus eStatus;
683
	NCSJNIInfo *pJNIInfo = NULL;
684
	NCSError nError = NCS_SUCCESS;
685
	jint *pRGBAPixels;
686

  
687
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
688
	
689
	if (!pJNIInfo) {
690
		NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() could not get native data from JNCSFile object.");
691
		nError = NCS_JNI_ERROR;
692
	}
693
	else {
694
		// Lock the primitive array and get a pointer to the memory.
695
		pRGBAPixels = (jint *)(*pEnv)->GetPrimitiveArrayCritical(pEnv, pRGBArray, &bIsCopy);
696

  
697
		if (pRGBAPixels) {
698
			// Read into a RGBA Java scaneline (which is byte reversed, so go the BGRA here (???)
699
			eStatus = NCScbmReadViewLineBGRA( pJNIInfo->pFileView, (UINT32 *)pRGBAPixels);
700

  
701
			if (eStatus == NCSECW_READ_FAILED) {
702
				NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() failed (internal error).");
703
				nError = NCS_JNI_ERROR;
704
			}	
705
		}
706
		else {
707
			NCSFormatErrorText(NCS_JNI_ERROR, "method readLineRGB() could not allocate memory for RGB Array.");
708
			nError = NCS_JNI_ERROR;
709
		}
710
		// Copy the array back to the object and free the memory
711
		(*pEnv)->ReleasePrimitiveArrayCritical(pEnv, pRGBArray, pRGBAPixels, 0);
712
	}
713
	return nError;
714
}
715

  
716
/*
717
 * Class:     com_ermapper_ecw_JNCSFile
718
 * Method:    ECWGetErrorString
719
 * Signature: (I)Ljava/lang/String;
720
 */
721
JNIEXPORT jstring JNICALL Java_com_ermapper_ecw_JNCSFile_ECWGetErrorString
722
  (JNIEnv *pEnv, jobject JNCSFile, jint nErrorNumber)
723
{
724
	//return (*pEnv)->NewStringUTF(pEnv, NCSGetLastErrorText(nErrorNumber));
725
	
726
	return (*pEnv)->NewStringUTF(pEnv, "....");
727
}
728

  
729

  
730
/*
731
 * Class:     com_ermapper_ecw_JNCSFile
732
 * Method:    ECWGetLibVersion
733
 * Signature: ()Ljava/lang/String;
734
 */
735
JNIEXPORT jstring JNICALL Java_com_ermapper_ecw_JNCSFile_ECWGetLibVersion
736
  (JNIEnv *pEnv, jclass clazz)
737
{
738
	return (*pEnv)->NewStringUTF(pEnv, NCS_VERSION_STRING_NO_NULL);	
739
}
740

  
741
/*
742
 * Class:     com_ermapper_ecw_JNCSFile
743
 * Method:    ECWGetPercentComplete
744
 * Signature: ()I
745
 */
746

  
747
JNIEXPORT jshort JNICALL Java_com_ermapper_ecw_JNCSFile_ECWGetPercentComplete
748
  (JNIEnv *pEnv, jobject JNCSFile)
749

  
750
{
751
	NCSFileViewSetInfo *pViewInfo = NULL;
752
	NCSJNIInfo *pJNIInfo = NULL;
753

  
754
	pJNIInfo = (NCSJNIInfo *)(*pEnv)->GetLongField(pEnv, JNCSFile, pGlobalJNCSFieldIDs->jIDNativeDataPointer);
755

  
756
	if (!pJNIInfo) 
757
		return 0;
758

  
759
	if (pJNIInfo->pFileView) {
760
		NCScbmGetViewInfo(pJNIInfo->pFileView, &pViewInfo); 
761
		if (pViewInfo) {
762
			return (jshort)((pViewInfo->nBlocksAvailable / (double)pViewInfo->nBlocksInView) * 100);
763
		}
764
	}
765
	else { 
766
		return 0;
767
	}
768

  
769
	return 0;
770
}

Also available in: Unified diff