changeset 14284:f7da6c6b818b

8147634: Need a JImage API that given a JImageLocationRef returns class name Reviewed-by: hseigel
author jlaskey
date Mon, 25 Apr 2016 09:57:55 -0300
parents fe9e630bb80d
children 34d28218fa21
files make/lib/CoreLibraries.gmk make/mapfiles/libjimage/mapfile-vers src/java.base/share/native/libjimage/jimage.cpp src/java.base/share/native/libjimage/jimage.hpp
diffstat 4 files changed, 43 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/make/lib/CoreLibraries.gmk	Mon Apr 25 09:57:55 2016 -0300
+++ b/make/lib/CoreLibraries.gmk	Mon Apr 25 09:57:55 2016 -0300
@@ -267,7 +267,7 @@
     LDFLAGS_windows := -export:JIMAGE_Open -export:JIMAGE_Close \
         -export:JIMAGE_PackageToModule \
         -export:JIMAGE_FindResource -export:JIMAGE_GetResource \
-        -export:JIMAGE_ResourceIterator, \
+        -export:JIMAGE_ResourceIterator -export:JIMAGE_ResourcePath, \
     LIBS_unix := -ljvm -ldl $(LIBCXX), \
     LIBS_solaris := -lc, \
     LIBS_macosx := -lc++, \
--- a/make/mapfiles/libjimage/mapfile-vers	Mon Apr 25 09:57:55 2016 -0300
+++ b/make/mapfiles/libjimage/mapfile-vers	Mon Apr 25 09:57:55 2016 -0300
@@ -34,6 +34,7 @@
         JIMAGE_FindResource;
         JIMAGE_GetResource;
         JIMAGE_ResourceIterator;
+        JIMAGE_ResourcePath;
     local:
         *;
 };
--- a/src/java.base/share/native/libjimage/jimage.cpp	Mon Apr 25 09:57:55 2016 -0300
+++ b/src/java.base/share/native/libjimage/jimage.cpp	Mon Apr 25 09:57:55 2016 -0300
@@ -207,7 +207,30 @@
         if (!(*visitor)(image, module, "9", parent, base, extension, arg)) {
             break;
         }
-
     }
 }
 
+/*
+ * JIMAGE_ResourcePath- Given an open image file, a location reference, a buffer
+ * and a maximum buffer size, copy the path of the resource into the buffer.
+ * Returns false if not a valid location reference.
+ *
+ * Ex.
+ *   JImageLocationRef location = ...
+ *   char path[JIMAGE_MAX_PATH];
+ *    (*JImageResourcePath)(image, location, path, JIMAGE_MAX_PATH);
+ */
+extern "C" bool JIMAGE_ResourcePath(JImageFile* image, JImageLocationRef locationRef,
+                                    char* path, size_t max) {
+    ImageFileReader* imageFile = (ImageFileReader*) image;
+
+    u4 offset = (u4) locationRef;
+    if (offset >= imageFile->locations_size()) {
+        return false;
+    }
+
+    ImageLocation location(imageFile->get_location_offset_data(offset));
+    imageFile->location_path(location, path, max);
+
+    return true;
+}
--- a/src/java.base/share/native/libjimage/jimage.hpp	Mon Apr 25 09:57:55 2016 -0300
+++ b/src/java.base/share/native/libjimage/jimage.hpp	Mon Apr 25 09:57:55 2016 -0300
@@ -186,3 +186,20 @@
 
 typedef void (*JImageResourceIterator_t)(JImageFile* jimage,
         JImageResourceVisitor_t visitor, void* arg);
+
+/*
+ * JIMAGE_ResourcePath- Given an open image file, a location reference, a buffer
+ * and a maximum buffer size, copy the path of the resource into the buffer.
+ * Returns false if not a valid location reference.
+ *
+ * Ex.
+ *   JImageLocationRef location = ...
+ *   char path[JIMAGE_MAX_PATH];
+ *    (*JImageResourcePath)(image, location, path, JIMAGE_MAX_PATH);
+ */
+extern "C" bool JIMAGE_ResourcePath(JImageFile* image, JImageLocationRef locationRef,
+                                    char* path, size_t max);
+
+typedef bool (*JImage_ResourcePath_t)(JImageFile* jimage, JImageLocationRef location,
+        char* buffer, jlong size);
+