Skip to content

Commit 0958df3

Browse files
committed
Fixed writeToURL app sandbox methods unavailable on OS X 10.7.3 or earlier. Added a sample code for writeToURL method in NSDocument subclass.
1 parent 8d92bbc commit 0958df3

File tree

2 files changed

+25
-28
lines changed

2 files changed

+25
-28
lines changed

LSFileWrapper.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,16 @@ FOUNDATION_EXPORT const unsigned char LSFileWrapperVersionString[];
228228
*
229229
* @warning Should only be called on the Main LSFileWrapper.
230230
*
231+
* @code
232+
* // Example usage in NSDocument:
233+
* -(BOOL)writeToURL:(NSURL *)url forSaveOperation:(NSSaveOperationType)saveOperation originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError *__autoreleasing *)outError {
234+
* [url startAccessingSecurityScopedResource];
235+
* BOOL success = [lsFileWrapper writeToURL: url forSaveOperation: saveOperation originalContentsURL: absoluteOriginalContentsURL backupDocumnetURL: [self backupFileURL] outError: outError];
236+
* [url stopAccessingSecurityScopedResource];
237+
* return success;
238+
* }
239+
* @endcode
240+
*
231241
* @param url NSURL where LSFileWrapper should be written to.
232242
* @param saveOperation NSSaveOperationType passed from NSDcoument.
233243
* @param absoluteOriginalContentsURL Optional NSURL where the current NSDocument – LSFileWrapper contents are already present.

LSFileWrapper.m

Lines changed: 15 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,6 @@ - (BOOL)writeToURL:(NSURL *)url error:(NSError *__autoreleasing *)outError {
337337

338338
#if TARGET_OS_OSX
339339
- (BOOL)writeToURL:(NSURL *)url forSaveOperation:(NSSaveOperationType)saveOperation originalContentsURL:(nullable NSURL *)absoluteOriginalContentsURL backupDocumentURL:(nullable NSURL *)backupFileURL error:(NSError *__autoreleasing *)outError {
340-
[url startAccessingSecurityScopedResource];
341340
switch (saveOperation) {
342341
case NSAutosaveInPlaceOperation:
343342
// Auto overwrite
@@ -350,18 +349,15 @@ - (BOOL)writeToURL:(NSURL *)url forSaveOperation:(NSSaveOperationType)saveOperat
350349
}
351350
if (absoluteOriginalContentsURL) {
352351
if (![self writeUpdatesToURL:absoluteOriginalContentsURL error:outError]) {
353-
[url stopAccessingSecurityScopedResource];
354352
return NO;
355353
}
356354
if (![url isEqual:absoluteOriginalContentsURL]) {
357355
if(![[NSFileManager defaultManager] copyItemAtURL:absoluteOriginalContentsURL toURL:url error:outError]) {
358-
[url stopAccessingSecurityScopedResource];
359356
return NO;
360357
}
361358
}
362359
} else {
363360
if(![self writeToURL:url error:outError]) {
364-
[url stopAccessingSecurityScopedResource];
365361
return NO;
366362
}
367363
}
@@ -371,46 +367,37 @@ - (BOOL)writeToURL:(NSURL *)url forSaveOperation:(NSSaveOperationType)saveOperat
371367
case NSSaveAsOperation:
372368
// New with switch
373369
if(![self writeToURL:url error:outError]) {
374-
[url stopAccessingSecurityScopedResource];
375370
return NO;
376371
}
377372
// Switches self to new NSURL
378-
if (self) {
379-
filename = [url lastPathComponent];
380-
writtenURL = url;
381-
isDirectory = YES;
382-
_reserve = 0;
383-
fileWrappers = [[NSMutableDictionary alloc] init];
384-
for (NSURL *childUrl in [[NSFileManager defaultManager] contentsOfDirectoryAtURL:url
385-
includingPropertiesForKeys:nil
386-
options:0
387-
error:nil]) {
388-
LSFileWrapper *fileWrapper = [[LSFileWrapper alloc] initWithURL:childUrl isDirectory:NO];
389-
[fileWrapper setParent:self];
390-
[fileWrappers setObject:fileWrapper forKey:[childUrl lastPathComponent]];
391-
}
373+
filename = [url lastPathComponent];
374+
writtenURL = url;
375+
isDirectory = YES;
376+
_reserve = 0;
377+
fileWrappers = [[NSMutableDictionary alloc] init];
378+
for (NSURL *childUrl in [[NSFileManager defaultManager] contentsOfDirectoryAtURL:url
379+
includingPropertiesForKeys:nil
380+
options:0
381+
error:nil]) {
382+
LSFileWrapper *fileWrapper = [[LSFileWrapper alloc] initWithURL:childUrl isDirectory:NO];
383+
[fileWrapper setParent:self];
384+
[fileWrappers setObject:fileWrapper forKey:[childUrl lastPathComponent]];
392385
}
393-
[url setResourceValues:@{NSURLIsHiddenKey: @YES} error:nil];
386+
[url setResourceValues:@{NSURLHasHiddenExtensionKey: @YES} error:nil];
394387
break;
395388
case NSAutosaveElsewhereOperation:
396389
// Auto totally new
397390
case NSSaveToOperation:
398391
// Totally new
399392
if(![self writeToURL:url error:outError]) {
400-
[url stopAccessingSecurityScopedResource];
401393
return NO;
402394
}
403-
[url setResourceValues:@{NSURLIsHiddenKey: @YES} error:nil];
395+
[url setResourceValues:@{NSURLHasHiddenExtensionKey: @YES} error:nil];
404396
break;
405397
default:
406398
break;
407399
}
408-
BOOL success = [url setResourceValues:@{NSURLContentModificationDateKey: [NSDate date]} error:outError];
409-
[url stopAccessingSecurityScopedResource];
410-
if (!success) {
411-
return NO;
412-
}
413-
return YES;
400+
return [url setResourceValues:@{NSURLContentModificationDateKey: [NSDate date]} error:outError];
414401
}
415402
#endif
416403

0 commit comments

Comments
 (0)