JNIEXPORT jbyteArray JNICALL Java_java_util_zip_ZipFile_inflateEntryImpl2 (JNIEnv * env, jobject recv, jlong descriptor, jstring entryName) { PORT_ACCESS_FROM_ENV (env); I_32 retval; HyZipFile *zipFile; HyZipEntry zipEntry; const char *entryCopy; jbyteArray buf; JCLZipFile *jclZipFile = (JCLZipFile *) (IDATA) descriptor; /* Build the zipFile */ if (jclZipFile == (void *) -1) { throwNewIllegalStateException (env, ""); return NULL; } zipFile = &(jclZipFile->hyZipFile); entryCopy = (*env)->GetStringUTFChars (env, entryName, NULL); if (entryCopy == NULL) return NULL; zip_initZipEntry (privatePortLibrary, &zipEntry); retval = zip_getZipEntry (privatePortLibrary, zipFile, &zipEntry, entryCopy, TRUE); (*env)->ReleaseStringUTFChars (env, entryName, entryCopy); if (retval) { zip_freeZipEntry (privatePortLibrary, &zipEntry); if (retval == ZIP_ERR_OUT_OF_MEMORY) throwNewOutOfMemoryError (env, ""); return NULL; } buf = (*env)->NewByteArray (env, zipEntry.uncompressedSize); if (!buf) { throwNewOutOfMemoryError (env, ""); return NULL; } retval = zip_getZipEntryData (privatePortLibrary, zipFile, &zipEntry, NULL, zipEntry.uncompressedSize); if (retval == 0) (*env)->SetByteArrayRegion (env, buf, 0, zipEntry.uncompressedSize, zipEntry.data); zip_freeZipEntry (privatePortLibrary, &zipEntry); if (!retval) return buf; if (retval == ZIP_ERR_OUT_OF_MEMORY) throwNewOutOfMemoryError (env, ""); else throwJavaZIOException (env, ""); return NULL; }
JNIEXPORT jobject JNICALL Java_java_util_zip_ZipFile_getEntryImpl (JNIEnv * env, jobject recv, jlong zipPointer, jstring entryName) { PORT_ACCESS_FROM_ENV (env); I_32 retval; HyZipFile *zipFile; HyZipEntry zipEntry; jobject java_ZipEntry, extra; jclass entryClass; jmethodID mid; const char *entryCopy; JCLZipFile *jclZipFile = (JCLZipFile *) (IDATA) zipPointer; if (jclZipFile == (void *) -1) { throwNewIllegalStateException (env, ""); return NULL; } zipFile = &(jclZipFile->hyZipFile); entryCopy = (*env)->GetStringUTFChars (env, entryName, NULL); if (entryCopy == NULL) return (jobject) NULL; zip_initZipEntry (PORTLIB, &zipEntry); retval = zip_getZipEntry (PORTLIB, zipFile, &zipEntry, entryCopy, TRUE); (*env)->ReleaseStringUTFChars (env, entryName, entryCopy); if (retval) { zip_freeZipEntry (PORTLIB, &zipEntry); return (jobject) NULL; } extra = NULL; if (zipEntry.extraFieldLength > 0) { zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, zipEntry.extraFieldLength); if (zipEntry.extraField == NULL) { zip_freeZipEntry (PORTLIB, &zipEntry); return (jobject) NULL; } extra = ((*env)->NewByteArray (env, zipEntry.extraFieldLength)); if (((*env)->ExceptionCheck (env))) { zip_freeZipEntry (PORTLIB, &zipEntry); return (jobject) NULL; } ((*env)-> SetByteArrayRegion (env, extra, 0, zipEntry.extraFieldLength, zipEntry.extraField)); } entryClass = JCL_CACHE_GET (env, CLS_java_util_zip_ZipEntry); entryClass = (*env)->NewLocalRef(env, entryClass); if (entryClass == NULL) { zip_freeZipEntry (PORTLIB, &zipEntry); return (jobject) NULL; } mid = JCL_CACHE_GET (env, MID_java_util_zip_ZipEntry_init); /* Build a new ZipEntry from the C struct */ java_ZipEntry = ((*env)->NewObject (env, entryClass, mid, entryName, NULL, extra, (jlong) zipEntry.lastModTime, (jlong) zipEntry.uncompressedSize, (jlong) zipEntry.compressedSize, (jlong) zipEntry.crc32, zipEntry.compressionMethod, (jlong) zipEntry.lastModDate, (jlong) zipEntry.dataPointer)); zip_freeZipEntry (PORTLIB, &zipEntry); return java_ZipEntry; }
JNIEXPORT jobject JNICALL Java_java_util_zip_ZipFile_00024ZFEnum_getNextEntry (JNIEnv * env, jobject recv, jlong descriptor, jlong nextEntry) { PORT_ACCESS_FROM_ENV (env); I_32 retval; HyZipFile *zipFile; HyZipEntry zipEntry; jobject java_ZipEntry, extra; jclass javaClass; jmethodID mid; jstring entryName = NULL; IDATA nextEntryPointer; JCLZipFile *jclZipFile = (JCLZipFile *) (IDATA) descriptor; if (jclZipFile == (void *) -1) { throwNewIllegalStateException (env, ""); return NULL; } zipFile = &(jclZipFile->hyZipFile); zip_initZipEntry (PORTLIB, &zipEntry); nextEntryPointer = (IDATA) nextEntry; retval = zip_getNextZipEntry (PORTLIB, zipFile, &zipEntry, &nextEntryPointer); if (retval) { if (retval != ZIP_ERR_NO_MORE_ENTRIES) { char buf[40]; sprintf (buf, "Error %d getting next zip entry", retval); throwNewInternalError (env, buf); } return (jobject) NULL; } /* Build a new ZipEntry from the C struct */ entryName = ((*env)->NewStringUTF (env, zipEntry.filename)); if (((*env)->ExceptionCheck (env))) return NULL; extra = NULL; if (zipEntry.extraFieldLength > 0) { zip_getZipEntryExtraField (PORTLIB, zipFile, &zipEntry, NULL, zipEntry.extraFieldLength); extra = ((*env)->NewByteArray (env, zipEntry.extraFieldLength)); if (((*env)->ExceptionCheck (env))) { /* free the extraField entry */ zip_freeZipEntry (PORTLIB, &zipEntry); return NULL; } ((*env)-> SetByteArrayRegion (env, extra, 0, zipEntry.extraFieldLength, zipEntry.extraField)); jclmem_free_memory (env, zipEntry.extraField); zipEntry.extraField = NULL; } javaClass = JCL_CACHE_GET (env, CLS_java_util_zip_ZipEntry); javaClass = (*env)->NewLocalRef(env, javaClass); if (javaClass == NULL) { return NULL; } mid = JCL_CACHE_GET (env, MID_java_util_zip_ZipEntry_init); java_ZipEntry = ((*env)->NewObject (env, javaClass, mid, entryName, NULL, /* comment */ extra, (jlong) zipEntry.lastModTime, (jlong) zipEntry.uncompressedSize, (jlong) zipEntry.compressedSize, (jlong) zipEntry.crc32, zipEntry.compressionMethod, (jlong) zipEntry.lastModDate, (jlong) zipEntry.dataPointer)); zip_freeZipEntry (PORTLIB, &zipEntry); (*env)->SetLongField (env, recv, JCL_CACHE_GET (env, FID_java_util_zip_ZipFile_nextEntryPointer), nextEntryPointer); return java_ZipEntry; }
char* Read_Manifest(JavaVM *vm, JNIEnv *env,const char *jar_name){ I_32 retval; #ifndef HY_ZIP_API HyZipFile zipFile; HyZipEntry zipEntry; #else VMIZipFile zipFile; VMIZipEntry zipEntry; #endif char *result; int size = 0; char errorMessage[1024]; /* Reach for the VM interface */ VMI_ACCESS_FROM_JAVAVM(vm); PORT_ACCESS_FROM_JAVAVM(vm); #ifdef HY_ZIP_API VMIZipFunctionTable *zipFuncs = (*VMI)->GetZipFunctions(VMI); #endif /* HY_ZIP_API */ /* open zip file */ #ifndef HY_ZIP_API retval = zip_openZipFile(privatePortLibrary, (char *)jar_name, &zipFile, NULL); #else /* HY_ZIP_API */ retval = zipFuncs->zip_openZipFile(VMI, (char *)jar_name, &zipFile, 0); #endif /* HY_ZIP_API */ if(retval){ sprintf(errorMessage,"failed to open file:%s, %d\n", jar_name, retval); (*env)->FatalError(env, errorMessage); return NULL; } /* get manifest entry */ #ifndef HY_ZIP_API zip_initZipEntry(privatePortLibrary, &zipEntry); retval = zip_getZipEntry(privatePortLibrary, &zipFile, &zipEntry, "META-INF/MANIFEST.MF", TRUE); #else /* HY_ZIP_API */ zipFuncs->zip_initZipEntry(VMI, &zipEntry); retval = zipFuncs->zip_getZipEntry(VMI, &zipFile, &zipEntry, "META-INF/MANIFEST.MF", ZIP_FLAG_READ_DATA_POINTER); #endif /* HY_ZIP_API */ if (retval) { #ifndef HY_ZIP_API zip_freeZipEntry(PORTLIB, &zipEntry); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); #endif /* HY_ZIP_API */ sprintf(errorMessage,"failed to get entry: %d\n", retval); (*env)->FatalError(env, errorMessage); return NULL; } /* read bytes */ size = zipEntry.uncompressedSize; result = (char *)hymem_allocate_memory(size*sizeof(char) + 1); #ifndef HY_ZIP_API retval = zip_getZipEntryData(privatePortLibrary, &zipFile, &zipEntry, (unsigned char*)result, size); #else /* HY_ZIP_API */ retval = zipFuncs->zip_getZipEntryData(VMI, &zipFile, &zipEntry, (unsigned char*)result, size); #endif /* HY_ZIP_API */ if(retval){ #ifndef HY_ZIP_API zip_freeZipEntry(PORTLIB, &zipEntry); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); #endif /* HY_ZIP_API */ sprintf(errorMessage,"failed to get bytes from zip entry, %d\n", zipEntry.extraFieldLength); (*env)->FatalError(env, errorMessage); return NULL; } result[size] = '\0'; /* free resource */ #ifndef HY_ZIP_API zip_freeZipEntry(privatePortLibrary, &zipEntry); retval = zip_closeZipFile(privatePortLibrary, &zipFile); #else /* HY_ZIP_API */ zipFuncs->zip_freeZipEntry(VMI, &zipEntry); retval = zipFuncs->zip_closeZipFile(VMI, &zipFile); #endif /* HY_ZIP_API */ if (retval) { sprintf(errorMessage,"failed to close zip file: %s, %d\n", jar_name, retval); (*env)->FatalError(env, errorMessage); return NULL; } return result; }