I am still having problems in my screensaver to access files that are stored on 
an external disk.
The disk is just a simple hard disk connected to my Macbook via USB.
(It is an important use case, since a lot of people like to keep there huge 
image collections on external hard disks.)

I can access the files just fine in Finder.
My screensaver can also access them during the first run, when the users points 
it to the directory (i.e., while it is running in preview mode in System 
Preferences).
However, next time it gets invoked it cannot access them any more, although I 
am using security-scoped bookmarks (SSB).
Details follow. Code excerpts below.

The first time the screensaver runs, the user points it to a specific directory 
via System Preferences / Screen Saver Options.
I get the directory from an NSOpenPanel, and store this as a SSB in the user 
preferences.
Also, I create a list of all image files in the directory, and sub-directories, 
using Spotlight.
I store that as well in the user preferences.
In the next invocation (where it runs as a plugin of legacyScreenSaver),
I get the SSB, resolve it, load the list of images files (basically a list of 
paths),
and try to display them.

Problem is that loading the image fails.

Here is the relevant code excerpt from the function -animateOneFrame:


    // load new image from disk
    NSURL * url = [NSURL fileURLWithPath: [self absolutePathFor: filename_] 
isDirectory: NO];  
    // filename_ is one of the paths from the list of images under the user 
selected directory
    // at this point, url is a proper URL, I have checked

    [url startAccessingSecurityScopedResource];
    CGImageSourceRef sourceRef = CGImageSourceCreateWithURL( (CFURLRef) url, 
NULL );
    // sourceRef is not NULL, I checked
    CGImageSourceStatus imgstatus = CGImageSourceGetStatus( sourceRef );
    if ( imgstatus != kCGImageStatusComplete )
        // this happens with each and every file on an external disk!
        .. log imgstatus ..
        [url stopAccessingSecurityScopedResource];
        return;
    }
    

Loading the image with NSImage like this:

    [url startAccessingSecurityScopedResource];    
    NSImage * image = [[NSImage alloc] initWithContentsOfURL: url];

also fails, I always get NULL.


I also tried this (thanks, Steve!):

    NSError * error;
    NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingFromURL: url 
error: & error];
    if ( ! fileHandle )
    {
        [self logMessage: [NSString stringWithFormat: @"Complete path: %@ , 
%@",  [url path], error]
                 asError: YES];
        [url stopAccessingSecurityScopedResource];
        return;
    }


Interestingly, I get this error message:

Complete path: /Volumes/cgvr/test2/backs_detail.jpg , Error 
Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file 
“backs_detail.jpg” in the folder “test2”." 
UserInfo={NSFilePath=/Volumes/cgvr/test2/backs_detail.jpg, 
NSUnderlyingError=0x600002c56c70 {Error Domain=NSPOSIXErrorDomain Code=1 
"Operation not permitted"}}

It talks about "saving" even though I used fileHandleForReadingFromURL :-(


I create the SSB like this:

    directoryBookmark_ = [dir bookmarkDataWithOptions: 
NSURLBookmarkCreationWithSecurityScope | 
NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess
                       includingResourceValuesForKeys: nil
                                        relativeToURL: nil
                                                error: &systemError];

I tried it also *without* the 
NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess,
but there was no difference in the error message.

legacyScreenSaver (the screen saver engine invoking my screen saver) has this 
entitlement:

        
<key>com.apple.security.temporary-exception.files.absolute-path.read-only</key>
        <array>
                <string>/</string>
        </array>

It also has the entitlement  com.apple.security.files.user-selected.read-only .

Is the problem that the files I am trying to read are outside / ?
But I thought, I can read all files in folders for which I am getting a 
bookmark via openPanel? (no matter which directory they are ..)


If you want, you can find the complete source code here:

   https://owncloud.informatik.uni-bremen.de/index.php/s/H7wHqwdgwYwqwy9 
<https://owncloud.informatik.uni-bremen.de/index.php/s/H7wHqwdgwYwqwy9>


I should mention that everything works fine when the folder of images is in my 
home
(which is, of course, on my local disk).


I will appreciate all kinds of hints and pointers very much.

Confused, Gabriel.


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to