1 /* 2 * Copyright (c) 2011, 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 27 #import <CoreFoundation/CoreFoundation.h> 28 #import <ApplicationServices/ApplicationServices.h> 29 #import <JavaNativeFoundation/JavaNativeFoundation.h> 30 31 /* 32 * Class: sun_lwawt_macosx_CDesktopPeer 33 * Method: _lsOpenURI 34 * Signature: (Ljava/lang/String;)I; 35 */ 36 JNIEXPORT jint JNICALL Java_sun_lwawt_macosx_CDesktopPeer__1lsOpenURI 37 (JNIEnv *env, jclass clz, jstring uri) 38 { 39 OSStatus status = noErr; 40 JNF_COCOA_ENTER(env); 41 42 // I would love to use NSWorkspace here, but it's not thread safe. Why? I don't know. 43 // So we use LaunchServices directly. 44 45 NSURL *url = [NSURL URLWithString:JNFJavaToNSString(env, uri)]; 46 47 LSLaunchFlags flags = kLSLaunchDefaults; 48 49 LSApplicationParameters params = {0, flags, NULL, NULL, NULL, NULL, NULL}; 50 status = LSOpenURLsWithRole((CFArrayRef)[NSArray arrayWithObject:url], kLSRolesAll, NULL, ¶ms, NULL, 0); 51 52 JNF_COCOA_EXIT(env); 53 return status; 54 } 55 56 /* 57 * Class: sun_lwawt_macosx_CDesktopPeer 58 * Method: _lsOpenFile 59 * Signature: (Ljava/lang/String;Z)I; 60 */ 61 JNIEXPORT jint JNICALL Java_sun_lwawt_macosx_CDesktopPeer__1lsOpenFile 62 (JNIEnv *env, jclass clz, jstring jpath, jboolean print) 63 { 64 OSStatus status = noErr; 65 JNF_COCOA_ENTER(env); 66 67 // I would love to use NSWorkspace here, but it's not thread safe. Why? I don't know. 68 // So we use LaunchServices directly. 69 70 NSString *path = JNFNormalizedNSStringForPath(env, jpath); 71 72 NSURL *url = [NSURL fileURLWithPath:(NSString *)path]; 73 74 // This byzantine workaround is necesary, or else directories won't open in Finder 75 url = (NSURL *)CFURLCreateWithFileSystemPath(NULL, (CFStringRef)[url path], kCFURLPOSIXPathStyle, false); 76 77 LSLaunchFlags flags = kLSLaunchDefaults; 78 if (print) flags |= kLSLaunchAndPrint; 79 80 LSApplicationParameters params = {0, flags, NULL, NULL, NULL, NULL, NULL}; 81 status = LSOpenURLsWithRole((CFArrayRef)[NSArray arrayWithObject:url], kLSRolesAll, NULL, ¶ms, NULL, 0); 82 CFRelease(url); 83 84 JNF_COCOA_EXIT(env); 85 return status; 86 } 87