logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From carn...@apache.org
Subject svn commit: r487686 - /logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp
Date Fri, 15 Dec 2006 22:03:39 GMT
Author: carnold
Date: Fri Dec 15 14:03:38 2006
New Revision: 487686

URL: http://svn.apache.org/viewvc?view=rev&rev=487686
Log:
Bug 39437: Eliminate unnecessary conversion to local code page

Modified:
    logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp

Modified: logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp
URL: http://svn.apache.org/viewvc/logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp?view=diff&rev=487686&r1=487685&r2=487686
==============================================================================
--- logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp (original)
+++ logging/log4j/branches/v1_2-branch/src/java/org/apache/log4j/nt/nteventlog.cpp Fri Dec
15 14:03:38 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,71 +24,8 @@
 #include "org_apache_log4j_Priority.h"
 #include "org_apache_log4j_nt_NTEventLogAppender.h"
 #include <windows.h>
+#include <jni.h>
 
-// Borrowed unabashedly from the JNI Programmer's Guide
-void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) {
-
-  jclass classForName = env->FindClass(name);
-  // If cls is null, an exception has already been thrown.
-  if (classForName != (jclass)0) {
-    env->ThrowNew(classForName, msg);
-  }
-  // cleanup
-  env->DeleteLocalRef(classForName);
-  return;
-}
-
-// Borrowed unabashedly from the JNI Programmer's Guide
-char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) {
-  static jmethodID midStringGetBytes = 0;
-  jbyteArray bytes = 0;
-  jthrowable exc;
-  char *nstr = 0;
-  
-  //if (env->EnsureLocalCapacity(2) < 0) {
-  // out of memory
-  //return 0;
-  //}
-
-  if (midStringGetBytes == 0) {
-    // Lookup and cache the String.getBytes() method id.
-    jclass stringClass = env->FindClass("java/lang/String");
-    if (stringClass == 0) {
-      // An exception will have been thrown.
-      return 0;
-    }
-    midStringGetBytes = env->GetMethodID(stringClass, "getBytes", "()[B");
-    env->DeleteLocalRef(stringClass);
-    if (midStringGetBytes == 0) {
-      // An exception will have been thrown.
-      return 0;
-    }
-  }
-
-  bytes = (jbyteArray)env->CallObjectMethod(jstr, midStringGetBytes);
-  exc = env->ExceptionOccurred();
-  if (exc == 0) {
-    // Attempt to malloc enough room for the length of the Java
-    // string plus one byte for the 0-terminator.
-    jint len = env->GetArrayLength(bytes);
-    nstr = (char *)malloc(len + 1);
-    if (nstr == 0) {
-      // malloc failed -- throw an OutOfMemoryError
-      JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 0);
-      env->DeleteLocalRef(bytes);
-      return 0;
-    }
-    // copy to the malloc'd array and 0-terminate
-    env->GetByteArrayRegion(bytes, 0, len, (jbyte *)nstr);
-    nstr[len] = 0;
-  } else {
-    // cleanup
-    env->DeleteLocalRef(exc);
-  }
-  // cleanup
-  env->DeleteLocalRef(bytes);
-  return nstr;
-}
 
 /*
  * Convert log4j Priority to an EventLog category. Each category is
@@ -125,39 +62,39 @@
   return ret_val;
 }
 
-HKEY regGetKey(TCHAR *subkey, DWORD *disposition) {
+HKEY regGetKey(wchar_t *subkey, DWORD *disposition) {
   HKEY hkey = 0;
-  RegCreateKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, NULL, 
+  RegCreateKeyExW(HKEY_LOCAL_MACHINE, subkey, 0, NULL, 
 		 REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, 
 		 &hkey, disposition);
   return hkey;
 }
 
-void regSetString(HKEY hkey, TCHAR *name, TCHAR *value) {
-  RegSetValueEx(hkey, name, 0, REG_SZ, (LPBYTE)value, lstrlen(value) + sizeof(TCHAR));
+void regSetString(HKEY hkey, wchar_t *name, wchar_t *value) {
+  RegSetValueExW(hkey, name, 0, REG_SZ, (LPBYTE)value, (wcslen(value) + 1) * sizeof(wchar_t));
 }
 
-void regSetDword(HKEY hkey, TCHAR *name, DWORD value) {
-  RegSetValueEx(hkey, name, 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
+void regSetDword(HKEY hkey, wchar_t *name, DWORD value) {
+  RegSetValueExW(hkey, name, 0, REG_DWORD, (LPBYTE)&value, sizeof(DWORD));
 }
 
 /*
  * Add this source with appropriate configuration keys to the registry.
  */
-void addRegistryInfo(char *source) {
-  const TCHAR *prefix = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\";
+void addRegistryInfo(wchar_t *source) {
+  const wchar_t *prefix = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\";
   DWORD disposition;
   HKEY hkey = 0;
-  TCHAR subkey[256];
+  wchar_t subkey[256];
   
-  lstrcpy(subkey, prefix);
-  lstrcat(subkey, source);
+  wcscpy(subkey, prefix);
+  wcscat(subkey, source);
   hkey = regGetKey(subkey, &disposition);
   if (disposition == REG_CREATED_NEW_KEY) {
-    regSetString(hkey, "EventMessageFile", "NTEventLogAppender.dll");
-    regSetString(hkey, "CategoryMessageFile", "NTEventLogAppender.dll");
-    regSetDword(hkey, "TypesSupported", (DWORD)7);
-    regSetDword(hkey, "CategoryCount", (DWORD)8);
+    regSetString(hkey, L"EventMessageFile", L"NTEventLogAppender.dll");
+    regSetString(hkey, L"CategoryMessageFile", L"NTEventLogAppender.dll");
+    regSetDword(hkey, L"TypesSupported", (DWORD)7);
+    regSetDword(hkey, L"CategoryCount", (DWORD)8);
   }
 	//RegSetValueEx(hkey, "EventMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname));
 	//RegSetValueEx(hkey, "CategoryMessageFile", 0, REG_SZ, (LPBYTE)dllname, lstrlen(dllname));
@@ -175,19 +112,25 @@
 JNIEXPORT jint JNICALL Java_org_apache_log4j_nt_NTEventLogAppender_registerEventSource(
    JNIEnv *env, jobject java_this, jstring server, jstring source) {
   
-  char *nserver = 0;
-  char *nsource = 0;
+  jchar *nserver = 0;
+  jchar *nsource = 0;
 
   if (server != 0) {
-    nserver = JNU_GetStringNativeChars(env, server);
+    jsize serverLen = env->GetStringLength(server);
+    nserver = (jchar*) malloc((serverLen +1) * sizeof(jchar));
+    env->GetStringRegion(server, 0, serverLen, nserver);
+    nserver[serverLen] = 0;
   }
   if (source != 0) {
-    nsource = JNU_GetStringNativeChars(env, source);
-  }
-  addRegistryInfo(nsource);
-  jint handle = (jint)RegisterEventSource(nserver, nsource);
-  free((void *)nserver);
-  free((void *)nsource);
+    jsize sourceLen = env->GetStringLength(source);
+    nsource = (jchar*) malloc((sourceLen +1) * sizeof(jchar));
+    env->GetStringRegion(source, 0, sourceLen, nsource);
+    nsource[sourceLen] = 0;
+  }
+  addRegistryInfo((wchar_t*) nsource);
+  jint handle = (jint)RegisterEventSourceW((const wchar_t*) nserver, (const wchar_t*) nsource);
+  free(nserver);
+  free(nsource);
   return handle;
 }
 
@@ -202,25 +145,25 @@
   jboolean localHandle = JNI_FALSE;
   if (handle == 0) {
     // Client didn't give us a handle so make a local one.
-    handle = (jint)RegisterEventSource(NULL, "Log4j");
+    handle = (jint)RegisterEventSourceW(NULL, L"Log4j");
     localHandle = JNI_TRUE;
   }
   
   // convert Java String to character array
-  const int numStrings = 1;
-  LPCTSTR array[numStrings];
-  char *nstr = JNU_GetStringNativeChars(env, jstr);
-  array[0] = nstr;
+  jsize msgLen = env->GetStringLength(jstr);
+  jchar* msg = (jchar*) malloc((msgLen + 1) * sizeof(jchar));
+  env->GetStringRegion(jstr, 0, msgLen, msg);
+  msg[msgLen] = 0;
   
   // This is the only message supported by the package. It is backed by
   // a message resource which consists of just '%1' which is replaced
   // by the string we just created.
   const DWORD messageID = 0x1000;
-  ReportEvent((HANDLE)handle, getType(priority), 
+  ReportEventW((HANDLE)handle, getType(priority), 
 	      getCategory(priority), 
-	      messageID, NULL, 1, 0, array, NULL);
+	      messageID, NULL, 1, 0, (const wchar_t**) &msg, NULL);
   
-  free((void *)nstr);
+  free((void *)msg);
   if (localHandle == JNI_TRUE) {
     // Created the handle here so free it here too.
     DeregisterEventSource((HANDLE)handle);



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org


Mime
View raw message