< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/CDataTransferer.m

Print this page
rev 54096 : 8259651: [macOS] Replace JNF_COCOA_ENTER/EXIT macros
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion


   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 "jni_util.h"
  30 
  31 #import <JavaNativeFoundation/JavaNativeFoundation.h>
  32 
  33 
  34 // ***** NOTE ***** This dictionary corresponds to the static array predefinedClipboardNames
  35 // in CDataTransferer.java.
  36 NSMutableDictionary *sStandardMappings = nil;
  37 
  38 NSMutableDictionary *getMappingTable() {
  39     if (sStandardMappings == nil) {
  40         sStandardMappings = [[NSMutableDictionary alloc] init];
  41         [sStandardMappings setObject:NSStringPboardType
  42                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_STRING]];
  43         [sStandardMappings setObject:NSFilenamesPboardType
  44                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_FILE]];
  45         [sStandardMappings setObject:NSTIFFPboardType
  46                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_TIFF]];
  47         [sStandardMappings setObject:NSRTFPboardType
  48                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_RICH_TEXT]];
  49         [sStandardMappings setObject:NSHTMLPboardType
  50                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_HTML]];
  51         [sStandardMappings setObject:NSPDFPboardType
  52                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_PDF]];


  92     return [getMappingTable() objectForKey:[NSNumber numberWithLong:inFormatCode]];
  93 }
  94 
  95 jlong registerFormatWithPasteboard(NSString *format) {
  96     NSMutableDictionary *mappingTable = getMappingTable();
  97     NSUInteger nextID = [mappingTable count] + 1;
  98     [mappingTable setObject:format forKey:[NSNumber numberWithLong:nextID]];
  99     return nextID;
 100 }
 101 
 102 
 103 /*
 104  * Class:     sun_lwawt_macosx_CDataTransferer
 105  * Method:    registerFormatWithPasteboard
 106  * Signature: (Ljava/lang/String;)J
 107  */
 108 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDataTransferer_registerFormatWithPasteboard
 109 (JNIEnv *env, jobject jthis, jstring newformat)
 110 {
 111     jlong returnValue = -1;
 112 JNF_COCOA_ENTER(env);
 113     returnValue = registerFormatWithPasteboard(JNFJavaToNSString(env, newformat));
 114 JNF_COCOA_EXIT(env);
 115     return returnValue;
 116 }
 117 
 118 /*
 119  * Class:     sun_lwawt_macosx_CDataTransferer
 120  * Method:    formatForIndex
 121  * Signature: (J)Ljava/lang/String;
 122  */
 123 JNIEXPORT jstring JNICALL Java_sun_lwawt_macosx_CDataTransferer_formatForIndex
 124   (JNIEnv *env, jobject jthis, jlong index)
 125 {
 126     jstring returnValue = NULL;
 127 JNF_COCOA_ENTER(env);
 128     returnValue = JNFNSToJavaString(env, formatForIndex(index));
 129 JNF_COCOA_EXIT(env);
 130     return returnValue;
 131 }
 132 
 133 static jobjectArray CreateJavaFilenameArray(JNIEnv *env, NSArray *filenameArray)
 134 {
 135     NSUInteger filenameCount = [filenameArray count];
 136     if (filenameCount == 0) return nil;
 137 
 138     // Get the java.lang.String class object:
 139     jclass stringClazz = (*env)->FindClass(env, "java/lang/String");
 140     CHECK_NULL_RETURN(stringClazz, nil);
 141     jobject jfilenameArray = (*env)->NewObjectArray(env, filenameCount, stringClazz, NULL); // AWT_THREADING Safe (known object)
 142     if ((*env)->ExceptionOccurred(env)) {
 143         (*env)->ExceptionDescribe(env);
 144         (*env)->ExceptionClear(env);
 145         return nil;
 146     }
 147     if (!jfilenameArray) {
 148         NSLog(@"CDataTransferer_CreateJavaFilenameArray: couldn't create jfilenameArray.");
 149         return nil;
 150     }
 151     (*env)->DeleteLocalRef(env, stringClazz);
 152 
 153     // Iterate through all the filenames:
 154     NSUInteger i;
 155     for (i = 0; i < filenameCount; i++) {
 156         NSMutableString *stringVal = [[NSMutableString alloc] initWithString:[filenameArray objectAtIndex:i]];
 157         CFStringNormalize((CFMutableStringRef)stringVal, kCFStringNormalizationFormC);
 158         const char* stringBytes = [stringVal UTF8String];
 159 
 160         // Create a Java String:
 161         jstring string = (*env)->NewStringUTF(env, stringBytes);


 183 
 184     return jfilenameArray;
 185 }
 186 
 187 /*
 188  * Class:     sun_lwawt_macosx_CDataTransferer
 189  * Method:    draqQueryFile
 190  * Signature: ([B)[Ljava/lang/String;
 191  */
 192 JNIEXPORT jobjectArray JNICALL
 193 Java_sun_lwawt_macosx_CDataTransferer_nativeDragQueryFile
 194 (JNIEnv *env, jclass clazz, jbyteArray jbytearray)
 195 {
 196     // Decodes a byte array into a set of String filenames.
 197     // bytes here is an XML property list containing all of the filenames in the drag.
 198     // Parse the XML list into strings and return an array of Java strings matching all of the
 199     // files in the list.
 200 
 201     jobjectArray jreturnArray = NULL;
 202 
 203 JNF_COCOA_ENTER(env);
 204     // Get byte array elements:
 205     jboolean isCopy;
 206     jbyte* jbytes = (*env)->GetByteArrayElements(env, jbytearray, &isCopy);
 207     if (jbytes == NULL) {
 208         return NULL;
 209     }
 210 
 211     // Wrap jbytes in an NSData object:
 212     jsize jbytesLength = (*env)->GetArrayLength(env, jbytearray);
 213     NSData *xmlData = [NSData dataWithBytesNoCopy:jbytes length:jbytesLength freeWhenDone:NO];
 214 
 215     // Create a property list from the Java data:
 216     NSString *errString = nil;
 217     NSPropertyListFormat plistFormat = 0;
 218     id plist = [NSPropertyListSerialization propertyListFromData:xmlData mutabilityOption:NSPropertyListImmutable
 219         format:&plistFormat errorDescription:&errString];
 220 
 221     // The property list must be an array of strings:
 222     if (plist == nil || [plist isKindOfClass:[NSArray class]] == FALSE) {
 223         NSLog(@"CDataTransferer_dragQueryFile: plist not a valid NSArray (error %@):\n%@", errString, plist);


 233 
 234     NSUInteger i;
 235     for (i = 0; i < plistItemCount; i++) {
 236         // Filenames must be strings:
 237         id idVal = [plistArray objectAtIndex:i];
 238         if ([idVal isKindOfClass:[NSString class]] == FALSE) {
 239             NSLog(@"CDataTransferer_dragQueryFile: plist[%lu] not an NSString:\n%@", (unsigned long) i, idVal);
 240             continue;
 241         }
 242 
 243         [filenameArray addObject:idVal];
 244     }
 245 
 246     // Convert our array of filenames into a Java array of String filenames:
 247     jreturnArray = CreateJavaFilenameArray(env, filenameArray);
 248 
 249     [filenameArray release];
 250 
 251     // We're done with the jbytes (backing the plist/plistArray):
 252     (*env)->ReleaseByteArrayElements(env, jbytearray, jbytes, JNI_ABORT);
 253 JNF_COCOA_EXIT(env);
 254     return jreturnArray;
 255 }


   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 "JNIUtilities.h"



  30 
  31 // ***** NOTE ***** This dictionary corresponds to the static array predefinedClipboardNames
  32 // in CDataTransferer.java.
  33 NSMutableDictionary *sStandardMappings = nil;
  34 
  35 NSMutableDictionary *getMappingTable() {
  36     if (sStandardMappings == nil) {
  37         sStandardMappings = [[NSMutableDictionary alloc] init];
  38         [sStandardMappings setObject:NSStringPboardType
  39                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_STRING]];
  40         [sStandardMappings setObject:NSFilenamesPboardType
  41                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_FILE]];
  42         [sStandardMappings setObject:NSTIFFPboardType
  43                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_TIFF]];
  44         [sStandardMappings setObject:NSRTFPboardType
  45                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_RICH_TEXT]];
  46         [sStandardMappings setObject:NSHTMLPboardType
  47                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_HTML]];
  48         [sStandardMappings setObject:NSPDFPboardType
  49                               forKey:[NSNumber numberWithLong:sun_lwawt_macosx_CDataTransferer_CF_PDF]];


  89     return [getMappingTable() objectForKey:[NSNumber numberWithLong:inFormatCode]];
  90 }
  91 
  92 jlong registerFormatWithPasteboard(NSString *format) {
  93     NSMutableDictionary *mappingTable = getMappingTable();
  94     NSUInteger nextID = [mappingTable count] + 1;
  95     [mappingTable setObject:format forKey:[NSNumber numberWithLong:nextID]];
  96     return nextID;
  97 }
  98 
  99 
 100 /*
 101  * Class:     sun_lwawt_macosx_CDataTransferer
 102  * Method:    registerFormatWithPasteboard
 103  * Signature: (Ljava/lang/String;)J
 104  */
 105 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDataTransferer_registerFormatWithPasteboard
 106 (JNIEnv *env, jobject jthis, jstring newformat)
 107 {
 108     jlong returnValue = -1;
 109 JNI_COCOA_ENTER(env);
 110     returnValue = registerFormatWithPasteboard(JavaStringToNSString(env, newformat));
 111 JNI_COCOA_EXIT(env);
 112     return returnValue;
 113 }
 114 
 115 /*
 116  * Class:     sun_lwawt_macosx_CDataTransferer
 117  * Method:    formatForIndex
 118  * Signature: (J)Ljava/lang/String;
 119  */
 120 JNIEXPORT jstring JNICALL Java_sun_lwawt_macosx_CDataTransferer_formatForIndex
 121   (JNIEnv *env, jobject jthis, jlong index)
 122 {
 123     jstring returnValue = NULL;
 124 JNI_COCOA_ENTER(env);
 125     returnValue = NSStringToJavaString(env, formatForIndex(index));
 126 JNI_COCOA_EXIT(env);
 127     return returnValue;
 128 }
 129 
 130 static jobjectArray CreateJavaFilenameArray(JNIEnv *env, NSArray *filenameArray)
 131 {
 132     NSUInteger filenameCount = [filenameArray count];
 133     if (filenameCount == 0) return nil;
 134 
 135     // Get the java.lang.String class object:
 136     jclass stringClazz = (*env)->FindClass(env, "java/lang/String");
 137     CHECK_NULL_RETURN(stringClazz, nil);
 138     jobject jfilenameArray = (*env)->NewObjectArray(env, filenameCount, stringClazz, NULL);
 139     if ((*env)->ExceptionOccurred(env)) {
 140         (*env)->ExceptionDescribe(env);
 141         (*env)->ExceptionClear(env);
 142         return nil;
 143     }
 144     if (!jfilenameArray) {
 145         NSLog(@"CDataTransferer_CreateJavaFilenameArray: couldn't create jfilenameArray.");
 146         return nil;
 147     }
 148     (*env)->DeleteLocalRef(env, stringClazz);
 149 
 150     // Iterate through all the filenames:
 151     NSUInteger i;
 152     for (i = 0; i < filenameCount; i++) {
 153         NSMutableString *stringVal = [[NSMutableString alloc] initWithString:[filenameArray objectAtIndex:i]];
 154         CFStringNormalize((CFMutableStringRef)stringVal, kCFStringNormalizationFormC);
 155         const char* stringBytes = [stringVal UTF8String];
 156 
 157         // Create a Java String:
 158         jstring string = (*env)->NewStringUTF(env, stringBytes);


 180 
 181     return jfilenameArray;
 182 }
 183 
 184 /*
 185  * Class:     sun_lwawt_macosx_CDataTransferer
 186  * Method:    draqQueryFile
 187  * Signature: ([B)[Ljava/lang/String;
 188  */
 189 JNIEXPORT jobjectArray JNICALL
 190 Java_sun_lwawt_macosx_CDataTransferer_nativeDragQueryFile
 191 (JNIEnv *env, jclass clazz, jbyteArray jbytearray)
 192 {
 193     // Decodes a byte array into a set of String filenames.
 194     // bytes here is an XML property list containing all of the filenames in the drag.
 195     // Parse the XML list into strings and return an array of Java strings matching all of the
 196     // files in the list.
 197 
 198     jobjectArray jreturnArray = NULL;
 199 
 200 JNI_COCOA_ENTER(env);
 201     // Get byte array elements:
 202     jboolean isCopy;
 203     jbyte* jbytes = (*env)->GetByteArrayElements(env, jbytearray, &isCopy);
 204     if (jbytes == NULL) {
 205         return NULL;
 206     }
 207 
 208     // Wrap jbytes in an NSData object:
 209     jsize jbytesLength = (*env)->GetArrayLength(env, jbytearray);
 210     NSData *xmlData = [NSData dataWithBytesNoCopy:jbytes length:jbytesLength freeWhenDone:NO];
 211 
 212     // Create a property list from the Java data:
 213     NSString *errString = nil;
 214     NSPropertyListFormat plistFormat = 0;
 215     id plist = [NSPropertyListSerialization propertyListFromData:xmlData mutabilityOption:NSPropertyListImmutable
 216         format:&plistFormat errorDescription:&errString];
 217 
 218     // The property list must be an array of strings:
 219     if (plist == nil || [plist isKindOfClass:[NSArray class]] == FALSE) {
 220         NSLog(@"CDataTransferer_dragQueryFile: plist not a valid NSArray (error %@):\n%@", errString, plist);


 230 
 231     NSUInteger i;
 232     for (i = 0; i < plistItemCount; i++) {
 233         // Filenames must be strings:
 234         id idVal = [plistArray objectAtIndex:i];
 235         if ([idVal isKindOfClass:[NSString class]] == FALSE) {
 236             NSLog(@"CDataTransferer_dragQueryFile: plist[%lu] not an NSString:\n%@", (unsigned long) i, idVal);
 237             continue;
 238         }
 239 
 240         [filenameArray addObject:idVal];
 241     }
 242 
 243     // Convert our array of filenames into a Java array of String filenames:
 244     jreturnArray = CreateJavaFilenameArray(env, filenameArray);
 245 
 246     [filenameArray release];
 247 
 248     // We're done with the jbytes (backing the plist/plistArray):
 249     (*env)->ReleaseByteArrayElements(env, jbytearray, jbytes, JNI_ABORT);
 250 JNI_COCOA_EXIT(env);
 251     return jreturnArray;
 252 }
< prev index next >