You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/12/14 12:06:42 UTC

svn commit: r890273 - in /commons/sandbox/runtime/trunk/src/main: java/org/apache/commons/runtime/platform/windows/HKEY.java native/os/win32/registry.c

Author: mturk
Date: Mon Dec 14 11:06:41 2009
New Revision: 890273

URL: http://svn.apache.org/viewvc?rev=890273&view=rev
Log:
Make HKEY class instead enum

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/windows/HKEY.java
    commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/windows/HKEY.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/windows/HKEY.java?rev=890273&r1=890272&r2=890273&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/windows/HKEY.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/platform/windows/HKEY.java Mon Dec 14 11:06:41 2009
@@ -16,8 +16,12 @@
 
 package org.apache.commons.runtime.platform.windows;
 
+import java.io.Closeable;
+import java.io.IOException;
+import org.apache.commons.runtime.io.Status;
+
 /**
- * Registry key type enum.
+ * Registry key type.
  * <p>
  * An application can use handles to these keys as entry points to the
  * registry. These handles are valid for all implementations of the
@@ -27,8 +31,9 @@
  * keys.
  * </p>
  */
-public enum HKEY
+public class HKEY implements Closeable
 {
+
     /** Registry entries subordinate to this key define types (or classes)
      * of documents and the properties associated with those types. Shell
      * and COM applications use the information stored under this key.
@@ -43,19 +48,7 @@
      * This handle should not be used in a service or an application that
      * impersonates different users.
      */
-    CLASSES_ROOT(   1),
-
-    /** Contains information about the current hardware profile of the
-     * local computer system.
-     * <p>
-     * The information under {@code HKEY_CURRENT_CONFIG}
-     * describes only the differences between the current hardware
-     * configuration and the standard configuration. Information about
-     * the standard hardware configuration is stored under the Software
-     * and System keys of {@code HKEY_LOCAL_MACHINE}.
-     * </p>
-     */
-    CURRENT_CONFIG( 2),
+    public static final HKEY CLASSES_ROOT       = new HKEY(0x80000000L);
 
     /** Registry entries subordinate to this key define the preferences of
      * the current user. These preferences include the settings of
@@ -64,7 +57,7 @@
      * easier to establish the current user's settings; the key maps to the
      * current user's branch in {@code HKEY_USERS}.
      */
-    CURRENT_USER(   3),
+    public static final HKEY CURRENT_USER       = new HKEY(0x80000001L);
 
     /** Registry entries subordinate to this key define the physical state
      * of the computer, including data about the bus type, system memory,
@@ -75,33 +68,88 @@
      * security information, software-related information (such as server
      * names and the location of the server), and other system information.
      */
-    LOCAL_MACHINE(  4),
+    public static final HKEY LOCAL_MACHINE      = new HKEY(0x80000002L);
 
     /** Registry entries subordinate to this key define the default user
      * configuration for new users on the local computer and the user
      * configuration for the current user.
      */
-    USERS (         5);
+    public static final HKEY USERS              = new HKEY(0x80000003L);
 
+    public static final HKEY PERFORMANCE_DATA   = new HKEY(0x80000004L);
 
-    private int value;
-    private HKEY(int v)
+    /** Contains information about the current hardware profile of the
+     * local computer system.
+     * <p>
+     * The information under {@code HKEY_CURRENT_CONFIG}
+     * describes only the differences between the current hardware
+     * configuration and the standard configuration. Information about
+     * the standard hardware configuration is stored under the Software
+     * and System keys of {@code HKEY_LOCAL_MACHINE}.
+     * </p>
+     */
+    public static final HKEY CURRENT_CONFIG     = new HKEY(0x80000005L);
+
+    public static final HKEY DYN_DATA           = new HKEY(0x80000006L);
+
+
+    private long hKey;
+    private HKEY(long v)
     {
-        value = v;
+        hKey = v;
     }
 
-    public int valueOf()
+    public long handle()
     {
-        return value;
+        return hKey;
     }
 
-    public static HKEY valueOf(int value)
+    private static native int close0(long key);
+    /**
+     * Called by the garbage collector when the object is destroyed.
+     * The class will free internal resources allocated by the Operating system.
+     * @see Object#finalize()
+     * @throws Throwable the {@code Exception} raised by this method.
+     */
+    @Override
+    protected final void finalize()
+        throws Throwable
     {
-        for (HKEY e : values()) {
-            if (e.value == value)
-                return e;
+        if (hKey != 0L) {
+            try {
+                close0(hKey);
+            } catch (Exception e) {
+                // Ignore
+            } finally {
+                hKey = 0L;
+            }
+        }
+    }
+
+    /**
+     * Free the allocated resource by the Operating system.
+     * <p>
+     * Note that {@code Object.finalize()} method will call
+     * this function. However if the native code can block for
+     * long time explicit {@code close()} should be called.
+     * </p>
+     * @see java.io.Closeable#close()
+     * @throws IOException if an I/O error occurs.
+     */
+    public final void close()
+        throws IOException
+    {
+        int s = Status.ENOTIMPL;
+        try {
+            s = close0(hKey);
+        } catch (Exception e) {
+            // Ignore
+        } finally {
+            hKey = 0L;
+        }
+        if (s != 0) {
+            throw new IOException(Status.describe(s));
         }
-        throw new IllegalArgumentException("Invalid initializer: " + value);
     }
 
 }

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c?rev=890273&r1=890272&r2=890273&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/registry.c Mon Dec 14 11:06:41 2009
@@ -398,3 +398,24 @@
     x_free(k.name);
     return i;
 }
+
+ACR_JNI_PLATFORM_DECLARE(jint, HKEY, close0)(ACR_JNISTDARGS,
+                                             jlong key)
+{
+    int rc    = ACR_EBADF;
+    HKEY hkey = J2P(key, HKEY);
+
+    if (IS_VALID_HANDLE(hkey)) {
+        if (hkey == HKEY_CLASSES_ROOT ||
+            hkey == HKEY_CURRENT_CONFIG ||
+            hkey == HKEY_CURRENT_USER ||
+            hkey == HKEY_LOCAL_MACHINE ||
+            hkey == HKEY_USERS ||
+            hkey == HKEY_DYN_DATA)
+            rc = 0;
+        else
+            rc = (int)RegCloseKey(hkey);
+    }
+    return rc;
+}
+