1 /*
   2  * Copyright (c) 2011, 2016, 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 "com_apple_eio_FileManager.h"
  27 
  28 #import <Cocoa/Cocoa.h>
  29 #import <JavaNativeFoundation/JavaNativeFoundation.h>
  30 
  31 #import "ThreadUtilities.h"
  32 
  33 
  34 /*
  35  * Class:     com_apple_eio_FileManager
  36  * Method:    _setFileTypeAndCreator
  37  * Signature: (Ljava/lang/String;II)V
  38  */
  39 JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileTypeAndCreator
  40 (JNIEnv *env, jclass clz, jstring javaFilename, jint type, jint creator)
  41 {
  42 JNF_COCOA_ENTER(env);
  43         NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
  44         NSDictionary *attr = [NSDictionary dictionaryWithObjectsAndKeys:
  45                                                         [NSNumber numberWithInt:type], NSFileHFSTypeCode,
  46                                                         [NSNumber numberWithInt:creator], NSFileHFSCreatorCode, nil];
  47     [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
  48 JNF_COCOA_EXIT(env);
  49 }
  50 
  51 /*
  52  * Class:     com_apple_eio_FileManager
  53  * Method:    _setFileType
  54  * Signature: (Ljava/lang/String;I)V
  55  */
  56 JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileType
  57 (JNIEnv *env, jclass ckz, jstring javaFilename, jint type)
  58 {
  59 JNF_COCOA_ENTER(env);
  60         NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
  61         NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:type] forKey:NSFileHFSTypeCode];
  62     [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
  63 JNF_COCOA_EXIT(env);
  64 }
  65 
  66 /*
  67  * Class:     com_apple_eio_FileManager
  68  * Method:    _setFileCreator
  69  * Signature: (Ljava/lang/String;I)V
  70  */
  71 JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1setFileCreator
  72 (JNIEnv *env, jclass clz, jstring javaFilename, jint creator)
  73 {
  74 JNF_COCOA_ENTER(env);
  75         NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
  76         NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:creator] forKey:NSFileHFSCreatorCode];
  77     [[NSFileManager defaultManager] changeFileAttributes:attr atPath:filename];
  78 JNF_COCOA_EXIT(env);
  79 }
  80 
  81 /*
  82  * Class:     com_apple_eio_FileManager
  83  * Method:    _getFileType
  84  * Signature: (Ljava/lang/String;)I
  85  */
  86 JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileType
  87 (JNIEnv *env, jclass clz, jstring javaFilename)
  88 {
  89     jint type = 0;
  90 JNF_COCOA_ENTER(env);
  91         NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
  92     NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
  93     NSNumber *val = [attributes objectForKey:NSFileHFSTypeCode];
  94     type = [val intValue];
  95 JNF_COCOA_EXIT(env);
  96     return type;
  97 }
  98 
  99 /*
 100  * Class:     com_apple_eio_FileManager
 101  * Method:    _getFileCreator
 102  * Signature: (Ljava/lang/String;)I
 103  */
 104 JNIEXPORT jint JNICALL Java_com_apple_eio_FileManager__1getFileCreator
 105   (JNIEnv *env, jclass clz, jstring javaFilename)
 106 {
 107     jint creator = 0;
 108 JNF_COCOA_ENTER(env);
 109         NSString *filename = JNFNormalizedNSStringForPath(env, javaFilename);
 110     NSDictionary *attributes = [[NSFileManager defaultManager] fileAttributesAtPath:filename traverseLink:YES];
 111     NSNumber *val = [attributes objectForKey:NSFileHFSCreatorCode];
 112     creator = [val intValue];
 113 JNF_COCOA_EXIT(env);
 114     return creator;
 115 }
 116 
 117 /*
 118  * Class:     com_apple_eio_FileManager
 119  * Method:    _findFolder
 120  * Signature: (SIZ)Ljava/lang/String;
 121  */
 122 JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager__1findFolder__SIZ
 123 (JNIEnv *env, jclass clz, jshort domain, jint folderType, jboolean createIfNeeded)
 124 {
 125     jstring filename = nil;
 126 JNF_COCOA_ENTER(env);
 127 
 128     FSRef foundRef;
 129     createIfNeeded = createIfNeeded || (folderType == kTemporaryFolderType) || (folderType == kChewableItemsFolderType);
 130     if (FSFindFolder((SInt16)domain, (OSType)folderType, (Boolean)createIfNeeded, &foundRef) == noErr) {
 131         char path[PATH_MAX];
 132         if (FSRefMakePath(&foundRef, (UInt8 *)path, sizeof(path)) == noErr) {
 133             NSString *filenameString = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:path length:strlen(path)];
 134             filename = JNFNormalizedJavaStringForPath(env, filenameString);
 135         }
 136     }
 137 
 138 JNF_COCOA_EXIT(env);
 139     return filename;
 140 }
 141 
 142 
 143 /*
 144  * Class:     com_apple_eio_FileManager
 145  * Method:    _openURL
 146  * Signature: (Ljava/lang/String;)V
 147  */
 148 JNIEXPORT void JNICALL Java_com_apple_eio_FileManager__1openURL
 149 (JNIEnv *env, jclass clz, jstring urlString)
 150 {
 151 JNF_COCOA_ENTER(env);
 152 
 153     NSURL *url = [NSURL URLWithString:JNFNormalizedNSStringForPath(env, urlString)];
 154 
 155         // Radar 3208005: Run this on the main thread; file:// style URLs will hang otherwise.
 156     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 157         [[NSWorkspace sharedWorkspace] openURL:url];
 158     }];
 159 
 160 JNF_COCOA_EXIT(env);
 161 }
 162 
 163 
 164 /*
 165  * Class:     com_apple_eio_FileManager
 166  * Method:    getNativeResourceFromBundle
 167  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
 168  */
 169 JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativeResourceFromBundle
 170 (JNIEnv *env, jclass clz, jstring javaResourceName, jstring javaSubDirName, jstring javaTypeName)
 171 {
 172     jstring filename = NULL;
 173 JNF_COCOA_ENTER(env);
 174 
 175     NSString *resourceName = JNFNormalizedNSStringForPath(env, javaResourceName);
 176         NSString *subDirectory = JNFNormalizedNSStringForPath(env, javaSubDirName);
 177         NSString *typeName = JNFNormalizedNSStringForPath(env, javaTypeName);
 178 
 179     NSString *path = [[NSBundle mainBundle] pathForResource:resourceName
 180                                                      ofType:typeName
 181                                                 inDirectory:subDirectory];
 182 
 183     filename = JNFNormalizedJavaStringForPath(env, path);
 184 
 185 JNF_COCOA_EXIT(env);
 186     return filename;
 187 }
 188 
 189 
 190 /*
 191  * Class:     com_apple_eio_FileManager
 192  * Method:    getNativePathToApplicationBundle
 193  * Signature: ()Ljava/lang/String;
 194  */
 195 JNIEXPORT jstring JNICALL Java_com_apple_eio_FileManager_getNativePathToApplicationBundle
 196 (JNIEnv *env, jclass clazz)
 197 {
 198         jstring filename = nil;
 199 JNF_COCOA_ENTER(env);
 200 
 201         NSBundle *mainBundle = [NSBundle mainBundle];
 202         filename = JNFNormalizedJavaStringForPath(env, [mainBundle bundlePath]);
 203 
 204 JNF_COCOA_EXIT(env);
 205         return filename;
 206 }
 207 
 208 
 209 /*
 210  * Class:     com_apple_eio_FileManager
 211  * Method:    __moveToTrash
 212  * Signature: (Ljava/lang/String;)V
 213  */
 214 
 215 JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1moveToTrash
 216 (JNIEnv *env, jclass clz, jstring fileName)
 217 {
 218     __block BOOL returnValue = NO;
 219 JNF_COCOA_ENTER(env);
 220 
 221     NSString * path = JNFNormalizedNSStringForPath(env, fileName);
 222     NSURL *url = [NSURL fileURLWithPath:path];
 223     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 224 
 225         returnValue  = [[NSFileManager defaultManager] trashItemAtURL:url
 226                                                      resultingItemURL:nil
 227                                                                 error:nil];
 228     }];
 229 
 230 JNF_COCOA_EXIT(env);
 231 
 232         return returnValue ? JNI_TRUE: JNI_FALSE;
 233 }
 234 
 235 /*
 236  * Class:     com_apple_eio_FileManager
 237  * Method:    __revealInFinder
 238  * Signature: (Ljava/lang/String;)V
 239  */
 240 
 241 JNIEXPORT jboolean JNICALL Java_com_apple_eio_FileManager__1revealInFinder
 242 (JNIEnv *env, jclass clz, jstring url)
 243 {
 244         __block jboolean returnValue = JNI_FALSE;
 245 JNF_COCOA_ENTER(env);
 246 
 247     NSString *path = JNFNormalizedNSStringForPath(env, url);
 248     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 249         returnValue = [[NSWorkspace sharedWorkspace] selectFile:path inFileViewerRootedAtPath:@""];
 250     }];
 251 
 252 JNF_COCOA_EXIT(env);
 253 
 254         return returnValue;
 255 }