Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/macosx/native_NOTIOS/sun/awt/CDataTransferer.m
38829 views
1
/*
2
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation. Oracle designates this
8
* particular file as subject to the "Classpath" exception as provided
9
* by Oracle in the LICENSE file that accompanied this code.
10
*
11
* This code is distributed in the hope that it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14
* version 2 for more details (a copy is included in the LICENSE file that
15
* accompanied this code).
16
*
17
* You should have received a copy of the GNU General Public License version
18
* 2 along with this work; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
*
21
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
* or visit www.oracle.com if you need additional information or have any
23
* questions.
24
*/
25
26
#import "CDataTransferer.h"
27
#include "sun_lwawt_macosx_CDataTransferer.h"
28
29
#import <AppKit/AppKit.h>
30
#import <JavaNativeFoundation/JavaNativeFoundation.h>
31
#import "jni_util.h"
32
33
#include "ThreadUtilities.h"
34
35
36
// ***** NOTE ***** This dictionary corresponds to the static array predefinedClipboardNames
37
// in CDataTransferer.java.
38
NSMutableDictionary *sStandardMappings = nil;
39
40
NSMutableDictionary *getMappingTable() {
41
if (sStandardMappings == nil) {
42
sStandardMappings = [[NSMutableDictionary alloc] init];
43
[sStandardMappings setObject:NSStringPboardType
44
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_STRING]];
45
[sStandardMappings setObject:NSFilenamesPboardType
46
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_FILE]];
47
[sStandardMappings setObject:NSTIFFPboardType
48
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_TIFF]];
49
[sStandardMappings setObject:NSRTFPboardType
50
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_RICH_TEXT]];
51
[sStandardMappings setObject:NSHTMLPboardType
52
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_HTML]];
53
[sStandardMappings setObject:NSPDFPboardType
54
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_PDF]];
55
[sStandardMappings setObject:NSURLPboardType
56
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_URL]];
57
[sStandardMappings setObject:NSPasteboardTypePNG
58
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_PNG]];
59
[sStandardMappings setObject:(NSString*)kUTTypeJPEG
60
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_JPEG]];
61
[sStandardMappings setObject:NSPICTPboardType
62
forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_XPICT]];
63
}
64
return sStandardMappings;
65
}
66
67
/*
68
* Convert from a standard NSPasteboard data type to an index in our mapping table.
69
*/
70
jlong indexForFormat(NSString *format) {
71
jlong returnValue = -1;
72
73
NSMutableDictionary *mappingTable = getMappingTable();
74
NSArray *matchingKeys = [mappingTable allKeysForObject:format];
75
76
// There should only be one matching key here...
77
if ([matchingKeys count] > 0) {
78
NSNumber *formatID = (NSNumber *)[matchingKeys objectAtIndex:0];
79
returnValue = [formatID longValue];
80
}
81
82
// If we don't recognize the format, but it's a Java "custom" format register it
83
if (returnValue == -1 && ([format hasPrefix:@"JAVA_DATAFLAVOR:"]) ) {
84
returnValue = registerFormatWithPasteboard(format);
85
}
86
87
return returnValue;
88
}
89
90
/*
91
* Inverse of above -- given a long int index, get the matching data format NSString.
92
*/
93
NSString *formatForIndex(jlong inFormatCode) {
94
return [getMappingTable() objectForKey:[NSNumber numberWithLong:inFormatCode]];
95
}
96
97
jlong registerFormatWithPasteboard(NSString *format) {
98
NSMutableDictionary *mappingTable = getMappingTable();
99
NSUInteger nextID = [mappingTable count] + 1;
100
[mappingTable setObject:format forKey:[NSNumber numberWithLong:nextID]];
101
return nextID;
102
}
103
104
105
/*
106
* Class: sun_lwawt_macosx_CDataTransferer
107
* Method: registerFormatWithPasteboard
108
* Signature: (Ljava/lang/String;)J
109
*/
110
JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDataTransferer_registerFormatWithPasteboard
111
(JNIEnv *env, jobject jthis, jstring newformat)
112
{
113
jlong returnValue = -1;
114
JNF_COCOA_ENTER(env);
115
returnValue = registerFormatWithPasteboard(JNFJavaToNSString(env, newformat));
116
JNF_COCOA_EXIT(env);
117
return returnValue;
118
}
119
120
/*
121
* Class: sun_lwawt_macosx_CDataTransferer
122
* Method: formatForIndex
123
* Signature: (J)Ljava/lang/String;
124
*/
125
JNIEXPORT jstring JNICALL Java_sun_lwawt_macosx_CDataTransferer_formatForIndex
126
(JNIEnv *env, jobject jthis, jlong index)
127
{
128
jstring returnValue = NULL;
129
JNF_COCOA_ENTER(env);
130
returnValue = JNFNSToJavaString(env, formatForIndex(index));
131
JNF_COCOA_EXIT(env);
132
return returnValue;
133
}
134
135
static jobjectArray CreateJavaFilenameArray(JNIEnv *env, NSArray *filenameArray)
136
{
137
NSUInteger filenameCount = [filenameArray count];
138
if (filenameCount == 0) return nil;
139
140
// Get the java.lang.String class object:
141
jclass stringClazz = (*env)->FindClass(env, "java/lang/String");
142
CHECK_NULL_RETURN(stringClazz, nil);
143
jobject jfilenameArray = (*env)->NewObjectArray(env, filenameCount, stringClazz, NULL); // AWT_THREADING Safe (known object)
144
if ((*env)->ExceptionOccurred(env)) {
145
(*env)->ExceptionDescribe(env);
146
(*env)->ExceptionClear(env);
147
return nil;
148
}
149
if (!jfilenameArray) {
150
NSLog(@"CDataTransferer_CreateJavaFilenameArray: couldn't create jfilenameArray.");
151
return nil;
152
}
153
(*env)->DeleteLocalRef(env, stringClazz);
154
155
// Iterate through all the filenames:
156
NSUInteger i;
157
for (i = 0; i < filenameCount; i++) {
158
NSMutableString *stringVal = [[NSMutableString alloc] initWithString:[filenameArray objectAtIndex:i]];
159
CFStringNormalize((CFMutableStringRef)stringVal, kCFStringNormalizationFormC);
160
const char* stringBytes = [stringVal UTF8String];
161
162
// Create a Java String:
163
jstring string = (*env)->NewStringUTF(env, stringBytes);
164
if ((*env)->ExceptionOccurred(env)) {
165
(*env)->ExceptionDescribe(env);
166
(*env)->ExceptionClear(env);
167
continue;
168
}
169
if (!string) {
170
NSLog(@"CDataTransferer_CreateJavaFilenameArray: couldn't create jstring[%lu] for [%@].", (unsigned long) i, stringVal);
171
continue;
172
}
173
174
// Set the Java array element with our String:
175
(*env)->SetObjectArrayElement(env, jfilenameArray, i, string);
176
if ((*env)->ExceptionOccurred(env)) {
177
(*env)->ExceptionDescribe(env);
178
(*env)->ExceptionClear(env);
179
continue;
180
}
181
182
// Release local String reference:
183
(*env)->DeleteLocalRef(env, string);
184
}
185
186
return jfilenameArray;
187
}
188
189
/*
190
* Class: sun_lwawt_macosx_CDataTransferer
191
* Method: draqQueryFile
192
* Signature: ([B)[Ljava/lang/String;
193
*/
194
JNIEXPORT jobjectArray JNICALL
195
Java_sun_lwawt_macosx_CDataTransferer_nativeDragQueryFile
196
(JNIEnv *env, jclass clazz, jbyteArray jbytearray)
197
{
198
// Decodes a byte array into a set of String filenames.
199
// bytes here is an XML property list containing all of the filenames in the drag.
200
// Parse the XML list into strings and return an array of Java strings matching all of the
201
// files in the list.
202
203
jobjectArray jreturnArray = NULL;
204
205
JNF_COCOA_ENTER(env);
206
// Get byte array elements:
207
jboolean isCopy;
208
jbyte* jbytes = (*env)->GetByteArrayElements(env, jbytearray, &isCopy);
209
if (jbytes == NULL) {
210
return NULL;
211
}
212
213
// Wrap jbytes in an NSData object:
214
jsize jbytesLength = (*env)->GetArrayLength(env, jbytearray);
215
NSData *xmlData = [NSData dataWithBytesNoCopy:jbytes length:jbytesLength freeWhenDone:NO];
216
217
// Create a property list from the Java data:
218
NSString *errString = nil;
219
NSPropertyListFormat plistFormat = 0;
220
id plist = [NSPropertyListSerialization propertyListFromData:xmlData mutabilityOption:NSPropertyListImmutable
221
format:&plistFormat errorDescription:&errString];
222
223
// The property list must be an array of strings:
224
if (plist == nil || [plist isKindOfClass:[NSArray class]] == FALSE) {
225
NSLog(@"CDataTransferer_dragQueryFile: plist not a valid NSArray (error %@):\n%@", errString, plist);
226
(*env)->ReleaseByteArrayElements(env, jbytearray, jbytes, JNI_ABORT);
227
return NULL;
228
}
229
230
// Transfer all string items from the plistArray to filenameArray. This wouldn't be necessary
231
// if we could trust the array to contain all valid elements but this way we'll be sure.
232
NSArray *plistArray = (NSArray *)plist;
233
NSUInteger plistItemCount = [plistArray count];
234
NSMutableArray *filenameArray = [[NSMutableArray alloc] initWithCapacity:plistItemCount];
235
236
NSUInteger i;
237
for (i = 0; i < plistItemCount; i++) {
238
// Filenames must be strings:
239
id idVal = [plistArray objectAtIndex:i];
240
if ([idVal isKindOfClass:[NSString class]] == FALSE) {
241
NSLog(@"CDataTransferer_dragQueryFile: plist[%lu] not an NSString:\n%@", (unsigned long) i, idVal);
242
continue;
243
}
244
245
[filenameArray addObject:idVal];
246
}
247
248
// Convert our array of filenames into a Java array of String filenames:
249
jreturnArray = CreateJavaFilenameArray(env, filenameArray);
250
251
[filenameArray release];
252
253
// We're done with the jbytes (backing the plist/plistArray):
254
(*env)->ReleaseByteArrayElements(env, jbytearray, jbytes, JNI_ABORT);
255
JNF_COCOA_EXIT(env);
256
return jreturnArray;
257
}
258
259