File: JRIBootstrap.c

package info (click to toggle)
rjava 1.0-14-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,188 kB
  • sloc: java: 13,223; ansic: 5,503; sh: 3,776; xml: 325; makefile: 250; perl: 33
file content (166 lines) | stat: -rw-r--r-- 4,941 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include "JRIBootstrap.h"

#if defined WIN32 || defined Win32

#include <windows.h>
#include <winreg.h>

static const HKEY keyDB[2] = { HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER };

JNIEXPORT jstring JNICALL Java_JRIBootstrap_getenv
(JNIEnv *env, jclass cl, jstring sVar) {
  char cVal[1024];
  int res;
  const char *cVar = (*env)->GetStringUTFChars(env, sVar, 0);
  if (!cVar) return 0;
  *cVal=0; cVal[1023]=0;
  res = GetEnvironmentVariable(cVar, cVal, 1023);
  (*env)->ReleaseStringUTFChars(env, sVar, cVar);
  return res?((*env)->NewStringUTF(env, cVal)):0;
}

JNIEXPORT void JNICALL Java_JRIBootstrap_setenv
(JNIEnv *env, jclass cl, jstring sVar, jstring sVal) {
  const char *cVar = sVar?(*env)->GetStringUTFChars(env, sVar, 0):0;
  const char *cVal = sVal?(*env)->GetStringUTFChars(env, sVal, 0):0;
  if (cVar) SetEnvironmentVariable(cVar, cVal?cVal:"");
  if (cVar) (*env)->ReleaseStringUTFChars(env, sVar, cVar);
  if (cVal) (*env)->ReleaseStringUTFChars(env, sVal, cVal);
  return;
}

JNIEXPORT jstring JNICALL Java_JRIBootstrap_regvalue
(JNIEnv *env, jclass cl, jint iRoot, jstring sKey, jstring sVal) {
  const char *cKey = sKey?(*env)->GetStringUTFChars(env, sKey, 0):0;
  const char *cVal = sVal?(*env)->GetStringUTFChars(env, sVal, 0):0;
  jstring res = 0;
  if (cKey && cVal) {
    HKEY key;
    if (RegOpenKeyEx(keyDB[iRoot], cKey, 0, KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
      char buf[1024];
      DWORD t, s = 1023;
      *buf=0; buf[1023]=0;
      if (RegQueryValueEx(key, cVal, 0, &t, buf, &s) == ERROR_SUCCESS) {
	res = (*env)->NewStringUTF(env, buf);
      }
      RegCloseKey(key);
    }
  }
  if (cVal) (*env)->ReleaseStringUTFChars(env, sVal, cVal);
  if (cKey) (*env)->ReleaseStringUTFChars(env, sKey, cKey);
  
  return res;
}

JNIEXPORT jobjectArray JNICALL Java_JRIBootstrap_regsubkeys
(JNIEnv *env, jclass cl, jint iRoot, jstring sKey) {
  const char *cKey = sKey?(*env)->GetStringUTFChars(env, sKey, 0):0;
  jobjectArray res = 0;
  if (cKey) {
    HKEY key;
    if (RegOpenKeyEx(keyDB[iRoot], cKey, 0, KEY_ENUMERATE_SUB_KEYS|KEY_QUERY_VALUE, &key) == ERROR_SUCCESS) {
      int n = 0, i = 0;
      char buf[256];
      jclass cStr;
      *buf=0;
      buf[255]=0;
      /* pass 1: count the entries */
      while (RegEnumKey(key, n, buf, 254) == ERROR_SUCCESS) n++;
      /* pass 2: get the values */
      cStr = (*env)->FindClass(env, "java/lang/String");
      res = (*env)->NewObjectArray(env, n, cStr, 0);
      (*env)->DeleteLocalRef(env, cStr);
      while (i<n && RegEnumKey(key, i, buf, 254) == ERROR_SUCCESS)
	(*env)->SetObjectArrayElement(env, res, i++,
				      (*env)->NewStringUTF(env, buf));
      RegCloseKey(key);
    }
    (*env)->ReleaseStringUTFChars(env, sKey, cKey);
  }
  return res;
}

JNIEXPORT jstring JNICALL Java_JRIBootstrap_expand
(JNIEnv *env, jclass cl, jstring sVal) {
  jstring res = sVal;
  const char *cVal = sVal?(*env)->GetStringUTFChars(env, sVal, 0):0;
  char buf[1024];
  *buf=0; buf[1023]=0;
  if (cVal) {
    if (ExpandEnvironmentStrings(cVal, buf, 1023))
      res = (*env)->NewStringUTF(env, buf);
  }
  if (cVal) (*env)->ReleaseStringUTFChars(env, sVal, cVal);
  return res;
}

JNIEXPORT jboolean JNICALL Java_JRIBootstrap_hasreg
(JNIEnv *env, jclass cl) {
  return JNI_TRUE;
}

#else

#include <stdlib.h>

JNIEXPORT jstring JNICALL Java_JRIBootstrap_getenv
(JNIEnv *env, jclass cl, jstring sVar) {
  char *cVal;
  const char *cVar = sVar?(*env)->GetStringUTFChars(env, sVar, 0):0;
  if (!cVar) return 0;
  cVal=getenv(cVar);
  (*env)->ReleaseStringUTFChars(env, sVar, cVar);
  return cVal?((*env)->NewStringUTF(env, cVal)):0;
}

JNIEXPORT void JNICALL Java_JRIBootstrap_setenv
(JNIEnv *env, jclass cl, jstring sVar, jstring sVal) {
  const char *cVar = sVar?(*env)->GetStringUTFChars(env, sVar, 0):0;
  const char *cVal = sVal?(*env)->GetStringUTFChars(env, sVal, 0):0;
  if (cVar) setenv(cVar, cVal?cVal:"", 1);
  if (cVar) (*env)->ReleaseStringUTFChars(env, sVar, cVar);
  if (cVal) (*env)->ReleaseStringUTFChars(env, sVal, cVal);
  return;
}

/* no registry on unix, so always return null */
JNIEXPORT jstring JNICALL Java_JRIBootstrap_regvalue
(JNIEnv *env, jclass cl, jint iRoot, jstring sKey, jstring sVal) {
  return 0;
}

JNIEXPORT jobjectArray JNICALL Java_JRIBootstrap_regsubkeys
(JNIEnv *env, jclass cl, jint iRoot, jstring sKey) {
  return 0;
}

JNIEXPORT jstring JNICALL Java_JRIBootstrap_expand
(JNIEnv *env, jclass cl, jstring sVal) {
  return sVal;
}

JNIEXPORT jboolean JNICALL Java_JRIBootstrap_hasreg
(JNIEnv *env, jclass cl) {
  return JNI_FALSE;
}

#endif

JNIEXPORT jstring JNICALL Java_JRIBootstrap_arch
(JNIEnv *env, jclass cl) {
  const char *ca = "unknown";
  /* this is mainly for Macs so we can determine the correct arch ... */
#ifdef __ppc__
  ca = "ppc";
#endif
#ifdef __i386__
  ca = "i386";
#endif
#ifdef __x86_64__
  ca = "x86_64";
#endif
#ifdef __ppc64__
  ca = "ppc64";
#endif
  return (*env)->NewStringUTF(env, ca);
}