Merge pull request #32 from gnustep/NSFileWrapper_move_branch

NSFileWrapper move to Foundation
This commit is contained in:
Gregory Casamento 2019-09-13 17:16:30 -04:00 committed by GitHub
commit 54354f2b29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 54 additions and 1151 deletions

View file

@ -140,7 +140,7 @@
#import <AppKit/NSDocument.h>
#import <AppKit/NSDocumentController.h>
#import <AppKit/NSDrawer.h>
#import <AppKit/NSFileWrapper.h>
#import <AppKit/NSFileWrapperExtensions.h>
#import <AppKit/NSFontDescriptor.h>
#import <AppKit/NSGestureRecognizer.h>
#import <AppKit/NSGlyphGenerator.h>

View file

@ -25,150 +25,11 @@
If not, see <http://www.gnu.org/licenses/> or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
*/
#ifndef _GNUstep_H_NSFileWrapper
#define _GNUstep_H_NSFileWrapper
#import <GNUstepBase/GSVersionMacros.h>
#ifndef _GNUstep_H_NSFileWrapper_GUI
#define _GNUstep_H_NSFileWrapper_GUI
#import <Foundation/NSObject.h>
#import <Foundation/NSFileWrapper.h>
@class NSData;
@class NSDictionary;
@class NSError;
@class NSMutableDictionary;
@class NSString;
@class NSURL;
@class NSImage;
typedef enum
{
GSFileWrapperDirectoryType,
GSFileWrapperRegularFileType,
GSFileWrapperSymbolicLinkType
} GSFileWrapperType;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
enum {
NSFileWrapperReadingImmediate = 1,
NSFileWrapperReadingWithoutMapping = 2,
};
typedef NSUInteger NSFileWrapperReadingOptions;
enum {
NSFileWrapperWritingAtomic = 1,
NSFileWrapperWritingWithNameUpdating = 2,
};
typedef NSUInteger NSFileWrapperWritingOptions;
#endif
@interface NSFileWrapper : NSObject
{
NSString *_filename;
NSString *_preferredFilename;
NSMutableDictionary *_fileAttributes;
GSFileWrapperType _wrapperType;
id _wrapperData;
NSImage *_iconImage;
}
//
// Initialization
//
// Init instance of directory type
- (id)initDirectoryWithFileWrappers:(NSDictionary *)docs;
// Init instance of regular file type
- (id)initRegularFileWithContents:(NSData *)data;
// Init instance of symbolic link type
- (id)initSymbolicLinkWithDestination:(NSString *)path;
// Init an instance from the file, directory, or symbolic link at path.
// This can create a tree of instances
- (id)initWithPath:(NSString *)path; // with a directory instance at the top
// Init an instance from data in standard serial format. Serial format
// is the same as that used by NSText's RTFDFromRange: method. This can
// create a tree of instances with a directory instance at the top
- (id)initWithSerializedRepresentation:(NSData *)data;
//
// General methods
//
// write instace to disk at path. if directory type, this method is recursive
// if flag is YES, the wrapper will be updated with the name used in writing
// the file
- (BOOL)writeToFile:(NSString *)path
atomically:(BOOL)atomicFlag
updateFilenames:(BOOL)updateFilenamesFlag;
- (NSData *)serializedRepresentation;
- (void)setFilename:(NSString *)filename;
- (NSString *)filename;
- (void)setPreferredFilename:(NSString *)filename;
- (NSString *)preferredFilename;
- (void)setFileAttributes:(NSDictionary *)attributes;
- (NSDictionary *)fileAttributes;
- (BOOL)isRegularFile;
- (BOOL)isDirectory;
- (BOOL)isSymbolicLink;
- (void)setIcon:(NSImage *)icon;
- (NSImage *)icon;
- (BOOL)needsToBeUpdatedFromPath:(NSString *)path;
- (BOOL)updateFromPath:(NSString *)path;
//
// Directory type methods
//
// these messages raise an exception when sent to non-directory type wrappers!
- (NSString *)addFileWrapper:(NSFileWrapper *)doc;
- (void)removeFileWrapper:(NSFileWrapper *)doc;
- (NSDictionary *)fileWrappers;
- (NSString *)keyForFileWrapper:(NSFileWrapper *)doc;
- (NSString *)addFileWithPath:(NSString *)path;
- (NSString *)addRegularFileWithContents:(NSData *)data
preferredFilename:(NSString *)filename;
- (NSString *)addSymbolicLinkWithDestination:(NSString *)path
preferredFilename:(NSString *)filename;
//
// Regular file type methods
//
- (NSData *)regularFileContents;
//
// Symbolic link type methods
//
- (NSString *)symbolicLinkDestination;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
- (id)initSymbolicLinkWithDestinationURL:(NSURL *)url;
- (id)initWithURL:(NSURL *)url
options:(NSFileWrapperReadingOptions)options
error:(NSError **)outError;
- (BOOL)matchesContentsOfURL:(NSURL *)url;
- (BOOL)readFromURL:(NSURL *)url
options:(NSFileWrapperReadingOptions)options
error:(NSError **)outError;
- (NSURL *)symbolicLinkDestinationURL;
- (BOOL)writeToURL:(NSURL *)url
options:(NSFileWrapperWritingOptions)options
originalContentsURL:(NSURL *)originalContentsURL
error:(NSError **)outError;
#endif
@end
#endif // _GNUstep_H_NSFileWrapper

View file

@ -0,0 +1,42 @@
/*
NSFileWrapperExtensions.h
NSFileWrapper objects hold a file's contents in dynamic memory.
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Felipe A. Rodriguez <far@ix.netcom.com>
Date: Sept 1998
This file is part of the GNUstep GUI Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; see the file COPYING.LIB.
If not, see <http://www.gnu.org/licenses/> or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef _GNUstep_H_NSFileWrapper_Extensions
#define _GNUstep_H_NSFileWrapper_Extensions
#import <Foundation/NSFileWrapper.h>
@class NSImage;
@interface NSFileWrapper (NSExtensions)
- (void) setIcon: (NSImage*)icon;
- (NSImage*) icon;
@end
#endif

View file

@ -91,7 +91,7 @@ NSDocumentController.m \
NSDrawer.m \
NSEPSImageRep.m \
NSEvent.m \
NSFileWrapper.m \
NSFileWrapperExtensions.m \
NSFont.m \
NSFontDescriptor.m \
NSFontManager.m \
@ -327,6 +327,7 @@ NSDrawer.h \
NSEPSImageRep.h \
NSEvent.h \
NSFileWrapper.h \
NSFileWrapperExtensions.h \
NSFont.h \
NSFontDescriptor.h \
NSFontManager.h \

View file

@ -26,6 +26,7 @@
#import "AppKit/NSFileWrapper.h"
#import "AppKit/NSFileWrapperExtensions.h"
#import "AppKit/NSImage.h"
#import "GNUstepGUI/GSHelpAttachment.h"

View file

@ -1,780 +0,0 @@
/** <title>NSFileWrapper</title>
<abstract>Hold a file's contents in dynamic memory.</abstract>
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Felipe A. Rodriguez <far@ix.netcom.com>
Date: Sept 1998
Author: Jonathan Gapen <jagapen@whitewater.chem.wisc.edu>
Date: Dec 1999
This file is part of the GNUstep GUI Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; see the file COPYING.LIB.
If not, see <http://www.gnu.org/licenses/> or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "config.h"
#import <Foundation/NSArchiver.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSData.h>
#import <Foundation/NSDebug.h>
#import <Foundation/NSException.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSURL.h>
#import <Foundation/NSValue.h>
#import "AppKit/NSFileWrapper.h"
#import "AppKit/NSFont.h"
#import "AppKit/NSImage.h"
#import "AppKit/NSWorkspace.h"
@implementation NSFileWrapper
//
// Initialization
//
// Init instance of directory type
- (id) initDirectoryWithFileWrappers: (NSDictionary*)docs
{
self = [super init];
if (self != nil)
{
NSEnumerator *enumerator;
id key;
NSFileWrapper *wrapper;
_wrapperType = GSFileWrapperDirectoryType;
_wrapperData
= [[NSMutableDictionary alloc] initWithCapacity: [docs count]];
enumerator = [docs keyEnumerator];
while ((key = [enumerator nextObject]) != nil)
{
wrapper = (NSFileWrapper*)[docs objectForKey: key];
if (![wrapper preferredFilename])
{
[wrapper setPreferredFilename: key];
}
[_wrapperData setObject: wrapper forKey: key];
}
}
return self;
}
// Init instance of regular file type
- (id) initRegularFileWithContents: (NSData*)data
{
self = [super init];
if (self != nil)
{
_wrapperData = [data copyWithZone: [self zone]];
_wrapperType = GSFileWrapperRegularFileType;
}
return self;
}
// Init instance of symbolic link type
- (id) initSymbolicLinkWithDestination: (NSString*)path
{
self = [super init];
if (self != nil)
{
_wrapperData = [path copyWithZone: [self zone]];
_wrapperType = GSFileWrapperSymbolicLinkType;
}
return self;
}
- (id) initSymbolicLinkWithDestinationURL: (NSURL*)url
{
// FIXME
return [self initSymbolicLinkWithDestination: [url path]];
}
/**
* Init an instance from the file, directory, or symbolic link at path.<br />
* This can create a tree of instances with a directory instance at the top
*/
- (id) initWithPath: (NSString*)path
{
CREATE_AUTORELEASE_POOL(arp);
NSFileManager *fm = [NSFileManager defaultManager];
NSDictionary *fileAttributes;
NSString *fileType;
NSDebugLLog(@"NSFileWrapper", @"initWithPath: %@", path);
fileAttributes = [fm fileAttributesAtPath: path traverseLink: NO];
fileType = [fileAttributes fileType];
if ([fileType isEqualToString: NSFileTypeDirectory])
{
NSString *filename;
NSMutableArray *fileWrappers = [NSMutableArray array];
NSArray *filenames = [fm directoryContentsAtPath: path];
NSEnumerator *enumerator = [filenames objectEnumerator];
while ((filename = [enumerator nextObject]) != nil)
{
NSFileWrapper *w;
w = [[NSFileWrapper alloc] initWithPath:
[path stringByAppendingPathComponent: filename]];
[fileWrappers addObject: w];
RELEASE(w);
}
self = [self initDirectoryWithFileWrappers:
[NSDictionary dictionaryWithObjects: fileWrappers forKeys: filenames]];
}
else if ([fileType isEqualToString: NSFileTypeRegular])
{
self = [self initRegularFileWithContents:
AUTORELEASE([[NSData alloc] initWithContentsOfFile: path])];
}
else if ([fileType isEqualToString: NSFileTypeSymbolicLink])
{
self = [self initSymbolicLinkWithDestination:
[fm pathContentOfSymbolicLinkAtPath: path]];
}
// Store the full path in filename, the specification is unclear in this point
[self setFilename: path];
[self setPreferredFilename: [path lastPathComponent]];
[self setFileAttributes: fileAttributes];
[arp drain];
return self;
}
- (id) initWithURL: (NSURL*)url
options: (NSFileWrapperReadingOptions)options
error: (NSError**)outError
{
// FIXME
if ([self readFromURL: url
options: options
error: outError])
{
return self;
}
else
{
DESTROY(self);
return nil;
}
}
// Init an instance from data in std serial format. Serial format is the
// same as that used by NSText's RTFDFromRange: method. This can
// create a tree of instances with a directory instance at the top
- (id) initWithSerializedRepresentation: (NSData*)data
{
// FIXME - This should use a serializer. To get that working a helper object
// is needed that implements the NSObjCTypeSerializationCallBack protocol.
// We should add this later, currently the NSArchiver is used.
// Thanks to Richard, for pointing this out.
NSFileWrapper *wrapper = [NSUnarchiver unarchiveObjectWithData: data];
RELEASE(self);
return RETAIN(wrapper);
}
- (void) dealloc
{
TEST_RELEASE(_filename);
TEST_RELEASE(_fileAttributes);
TEST_RELEASE(_preferredFilename);
TEST_RELEASE(_wrapperData);
TEST_RELEASE(_iconImage);
[super dealloc];
}
//
// General methods
//
// write instance to disk at path; if directory type, this
// method is recursive; if updateFilenamesFlag is YES, the wrapper
// will be updated with the name used in writing the file
- (BOOL) writeToFile: (NSString*)path
atomically: (BOOL)atomicFlag
updateFilenames: (BOOL)updateFilenamesFlag
{
NSFileManager *fm = [NSFileManager defaultManager];
BOOL success = NO;
NSDebugLLog(@"NSFileWrapper",
@"writeToFile: %@ atomically: updateFilenames: ", path);
switch (_wrapperType)
{
case GSFileWrapperDirectoryType:
{
// FIXME - more robust save proceedure when atomicFlag set
NSEnumerator *enumerator = [_wrapperData keyEnumerator];
NSString *key;
[fm createDirectoryAtPath: path
withIntermediateDirectories: YES
attributes: _fileAttributes
error: NULL];
while ((key = (NSString*)[enumerator nextObject]))
{
NSString *newPath =
[path stringByAppendingPathComponent: key];
[[_wrapperData objectForKey: key] writeToFile: newPath
atomically: atomicFlag
updateFilenames: updateFilenamesFlag];
}
success = YES;
break;
}
case GSFileWrapperRegularFileType:
{
if ([_wrapperData writeToFile: path atomically: atomicFlag])
success = [fm changeFileAttributes: _fileAttributes
atPath: path];
break;
}
case GSFileWrapperSymbolicLinkType:
{
success = [fm createSymbolicLinkAtPath: path pathContent: _wrapperData];
break;
}
}
if (success && updateFilenamesFlag)
{
[self setFilename: [path lastPathComponent]];
}
return success;
}
- (NSData*) serializedRepresentation
{
// FIXME - This should use a serializer. To get that working a helper object
// is needed that implements the NSObjCTypeSerializationCallBack protocol.
// We should add this later, currently the NSArchiver is used.
// Thanks to Richard, for pointing this out.
return [NSArchiver archivedDataWithRootObject: self];
}
- (void) setFilename: (NSString*)filename
{
if (filename == nil || [filename isEqualToString: @""])
{
[NSException raise: NSInternalInconsistencyException
format: @"Empty or nil argument to setFilename: "];
}
else
{
ASSIGN(_filename, filename);
}
}
- (NSString*) filename
{
return _filename;
}
- (void) setPreferredFilename: (NSString*)filename
{
if (filename == nil || [filename isEqualToString: @""])
{
[NSException raise: NSInternalInconsistencyException
format: @"Empty or nil argument to setPreferredFilename: "];
}
else
{
ASSIGN(_preferredFilename, filename);
}
}
- (NSString*) preferredFilename
{
return _preferredFilename;
}
- (void) setFileAttributes: (NSDictionary*)attributes
{
if (_fileAttributes == nil)
{
_fileAttributes = [NSMutableDictionary new];
}
[_fileAttributes addEntriesFromDictionary: attributes];
}
- (NSDictionary*) fileAttributes
{
return _fileAttributes;
}
- (BOOL) isRegularFile
{
if (_wrapperType == GSFileWrapperRegularFileType)
{
return YES;
}
else
{
return NO;
}
}
- (BOOL) isDirectory
{
if (_wrapperType == GSFileWrapperDirectoryType)
{
return YES;
}
else
{
return NO;
}
}
- (BOOL) isSymbolicLink
{
if (_wrapperType == GSFileWrapperSymbolicLinkType)
{
return YES;
}
else
{
return NO;
}
}
- (void) setIcon: (NSImage*)icon
{
ASSIGN(_iconImage, icon);
}
- (NSImage*) icon
{
if (_iconImage == nil && [self filename])
{
return [[NSWorkspace sharedWorkspace] iconForFile: [self filename]];
}
else
{
return _iconImage;
}
}
- (BOOL) needsToBeUpdatedFromPath: (NSString*)path
{
NSFileManager *fm = [NSFileManager defaultManager];
switch (_wrapperType)
{
case GSFileWrapperRegularFileType:
if ([[self fileAttributes]
isEqualToDictionary: [fm fileAttributesAtPath: path
traverseLink: NO]])
return NO;
break;
case GSFileWrapperSymbolicLinkType:
if ([_wrapperData isEqualToString:
[fm pathContentOfSymbolicLinkAtPath: path]])
return NO;
break;
case GSFileWrapperDirectoryType:
// Has the dictory itself changed?
if (![[self fileAttributes]
isEqualToDictionary: [fm fileAttributesAtPath: path
traverseLink: NO]])
return YES;
// FIXME - for directory wrappers, we have to check if all the files are still there,
// if they have the same attributes and if any new files have been added.
// And this recursive for all included file wrappers
return NO;
break;
}
return YES;
}
- (BOOL) updateFromPath: (NSString*)path
{
NSFileManager *fm = [NSFileManager defaultManager];
switch (_wrapperType)
{
case GSFileWrapperRegularFileType:
if ([[self fileAttributes]
isEqualToDictionary: [fm fileAttributesAtPath: path
traverseLink: NO]])
return NO;
[self initWithPath: path];
break;
case GSFileWrapperSymbolicLinkType:
if ([[self fileAttributes]
isEqualToDictionary: [fm fileAttributesAtPath: path
traverseLink: NO]] &&
[_wrapperData isEqualToString:
[fm pathContentOfSymbolicLinkAtPath: path]])
return NO;
[self initWithPath: path];
break;
case GSFileWrapperDirectoryType:
// Has the dictory itself changed?
if (![[self fileAttributes]
isEqualToDictionary: [fm fileAttributesAtPath: path
traverseLink: NO]])
{
// FIXME: This is not effizent
[self initWithPath: path];
return YES;
}
// FIXME - for directory wrappers, we have to check if all the files are still there,
// if they have the same attributes and if any new files have been added.
// And this recursive for all included file wrappers
return NO;
break;
}
return YES;
}
//
// Directory type methods
//
#define GSFileWrapperDirectoryTypeCheck() \
if (![self isDirectory]) \
[NSException raise: NSInternalInconsistencyException \
format: @"Can't invoke %@ on a file wrapper that" \
@" does not wrap a directory!", NSStringFromSelector(_cmd)];
- (NSString*) addFileWrapper: (NSFileWrapper*)doc
{
NSString *key;
GSFileWrapperDirectoryTypeCheck();
key = [doc preferredFilename];
if (key == nil || [key isEqualToString: @""])
{
[NSException raise: NSInvalidArgumentException
format: @"Adding file wrapper with no preferred filename."];
return nil;
}
if ([_wrapperData objectForKey: key] != nil)
{
// FIXME - handle duplicate names
}
[_wrapperData setObject: doc forKey: key];
return key;
}
- (void) removeFileWrapper: (NSFileWrapper*)doc
{
GSFileWrapperDirectoryTypeCheck();
[_wrapperData removeObjectsForKeys: [_wrapperData allKeysForObject: doc]];
}
- (NSDictionary*) fileWrappers
{
GSFileWrapperDirectoryTypeCheck();
return _wrapperData;
}
- (NSString*) keyForFileWrapper: (NSFileWrapper*)doc
{
GSFileWrapperDirectoryTypeCheck();
return [[_wrapperData allKeysForObject: doc] objectAtIndex: 0];
}
- (NSString*) addFileWithPath: (NSString*)path
{
NSFileWrapper *wrapper;
GSFileWrapperDirectoryTypeCheck();
wrapper = AUTORELEASE([[NSFileWrapper alloc] initWithPath: path]);
if (wrapper != nil)
{
return [self addFileWrapper: wrapper];
}
else
{
return nil;
}
}
- (NSString*) addRegularFileWithContents: (NSData*)data
preferredFilename: (NSString*)filename
{
NSFileWrapper *wrapper;
GSFileWrapperDirectoryTypeCheck();
wrapper = AUTORELEASE([[NSFileWrapper alloc]
initRegularFileWithContents: data]);
if (wrapper != nil)
{
[wrapper setPreferredFilename: filename];
return [self addFileWrapper: wrapper];
}
else
{
return nil;
}
}
- (NSString*) addSymbolicLinkWithDestination: (NSString*)path
preferredFilename: (NSString*)filename
{
NSFileWrapper *wrapper;
GSFileWrapperDirectoryTypeCheck();
wrapper = AUTORELEASE([[NSFileWrapper alloc]
initSymbolicLinkWithDestination: path]);
if (wrapper != nil)
{
[wrapper setPreferredFilename: filename];
return [self addFileWrapper: wrapper];
}
else
{
return nil;
}
}
//
// Regular file type methods
//
- (NSData*) regularFileContents
{
if ([self isRegularFile])
{
return _wrapperData;
}
else
{
[NSException raise: NSInternalInconsistencyException
format: @"File wrapper does not wrap regular file."];
}
return nil;
}
//
// Symbolic link type methods
//
- (NSString*) symbolicLinkDestination
{
if ([self isSymbolicLink])
{
return _wrapperData;
}
else
{
[NSException raise: NSInternalInconsistencyException
format: @"File wrapper does not wrap symbolic link."];
}
return nil;
}
- (NSURL *)symbolicLinkDestinationURL
{
// FIXME
return [NSURL fileURLWithPath: [self symbolicLinkDestination]];
}
- (BOOL) matchesContentsOfURL: (NSURL*)url
{
// FIXME
// For
return NO;
}
- (BOOL) readFromURL: (NSURL*)url
options: (NSFileWrapperReadingOptions)options
error: (NSError**)outError
{
// FIXME
NSFileManager *fm = [NSFileManager defaultManager];
NSString *path = [url path];
NSDictionary *fileAttributes;
NSString *fileType;
NSDebugLLog(@"NSFileWrapper", @"readFromURL: %@", path);
fileAttributes = [fm fileAttributesAtPath: path traverseLink: NO];
fileType = [fileAttributes fileType];
if ([fileType isEqualToString: NSFileTypeDirectory])
{
if (options & NSFileWrapperReadingImmediate)
{
NSString *filename;
NSMutableArray *fileWrappers = [NSMutableArray array];
NSArray *filenames = [fm directoryContentsAtPath: path];
NSEnumerator *enumerator = [filenames objectEnumerator];
while ((filename = [enumerator nextObject]) != nil)
{
NSFileWrapper *w;
w = [[NSFileWrapper alloc] initWithPath:
[path stringByAppendingPathComponent: filename]];
[fileWrappers addObject: w];
RELEASE(w);
}
self = [self initDirectoryWithFileWrappers:
[NSDictionary dictionaryWithObjects: fileWrappers
forKeys: filenames]];
}
else
{
self = [self initDirectoryWithFileWrappers: nil];
}
}
else if ([fileType isEqualToString: NSFileTypeRegular])
{
if (options & NSFileWrapperReadingWithoutMapping)
{
self = [self initRegularFileWithContents:
AUTORELEASE([[NSData alloc] initWithContentsOfFile: path])];
}
else
{
self = [self initRegularFileWithContents:
AUTORELEASE([[NSData alloc] initWithContentsOfMappedFile: path])];
}
}
else if ([fileType isEqualToString: NSFileTypeSymbolicLink])
{
self = [self initSymbolicLinkWithDestination:
[fm pathContentOfSymbolicLinkAtPath: path]];
}
// Store the full path in filename, the specification is unclear in this point
[self setFilename: path];
[self setPreferredFilename: [path lastPathComponent]];
[self setFileAttributes: [fm fileAttributesAtPath: path traverseLink: NO]];
return NO;
}
- (BOOL) writeToURL: (NSURL*)url
options: (NSFileWrapperWritingOptions)options
originalContentsURL: (NSURL*)originalContentsURL
error: (NSError**)outError
{
// FIXME
return [self writeToFile: [url path]
atomically: options & NSFileWrapperWritingAtomic
updateFilenames: options & NSFileWrapperWritingWithNameUpdating];
}
//
// Archiving
//
- (void) encodeWithCoder: (NSCoder*)aCoder
{
if ([aCoder allowsKeyedCoding])
{
[aCoder encodeObject: [self serializedRepresentation] forKey: @"NSFileWrapperData"];
}
else
{
[aCoder encodeValueOfObjCType: @encode(int) at: &_wrapperType];
// Dont store the file name
[aCoder encodeObject: _preferredFilename];
[aCoder encodeObject: _fileAttributes];
[aCoder encodeObject: _wrapperData];
[aCoder encodeObject: _iconImage];
}
}
- (id) initWithCoder: (NSCoder*)aDecoder
{
if ([aDecoder allowsKeyedCoding])
{
NSData *data = [aDecoder decodeObjectForKey: @"NSFileWrapperData"];
return [self initWithSerializedRepresentation: data];
}
else
{
int wrapperType;
NSString *preferredFilename;
NSDictionary *fileAttributes;
id wrapperData;
NSImage *iconImage;
[aDecoder decodeValueOfObjCType: @encode(int) at: &wrapperType];
// Dont restore the file name
preferredFilename = [aDecoder decodeObject];
fileAttributes = [aDecoder decodeObject];
wrapperData = [aDecoder decodeObject];
iconImage = [aDecoder decodeObject];
switch (wrapperType)
{
case GSFileWrapperRegularFileType:
{
self = [self initRegularFileWithContents: wrapperData];
break;
}
case GSFileWrapperSymbolicLinkType:
{
self = [self initSymbolicLinkWithDestination: wrapperData];
break;
}
case GSFileWrapperDirectoryType:
{
self = [self initDirectoryWithFileWrappers: wrapperData];
break;
}
}
if (preferredFilename != nil)
{
[self setPreferredFilename: preferredFilename];
}
if (fileAttributes != nil)
{
[self setFileAttributes: fileAttributes];
}
if (iconImage != nil)
{
[self setIcon: iconImage];
}
}
return self;
}
@end

View file

@ -38,6 +38,7 @@
#import "AppKit/NSCell.h"
#import "AppKit/NSFileWrapper.h"
#import "AppKit/NSFileWrapperExtensions.h"
#import "AppKit/NSImage.h"
#import "AppKit/NSEvent.h"
#import "AppKit/NSTextContainer.h"

View file

@ -71,6 +71,7 @@
#import "AppKit/NSDragging.h"
#import "AppKit/NSEvent.h"
#import "AppKit/NSFileWrapper.h"
#import "AppKit/NSFileWrapperExtensions.h"
#import "AppKit/NSGraphics.h"
#import "AppKit/NSImage.h"
#import "AppKit/NSKeyValueBinding.h"

View file

@ -1,224 +0,0 @@
;
; libgnustep-gui.def
;
; Exports for libgnustep-gui DLL
; Specific to WIN32 operating systems
;
; Copyright (C) 2003 Free Software Foundation, Inc.
;
; This file is part of the GNUstep GUI Library.
;
; This library is free software; you can redistribute it and/or
; modify it under the terms of the GNU Lesser General Public
; License as published by the Free Software Foundation; either
; version 2 of the License, or (at your option) any later version.
;
; This library is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
; Lesser General Public License for more details.
;
; You should have received a copy of the GNU Lesser General Public
; License along with this library; see the file COPYING.LIB.
; If not, see <http://www.gnu.org/licenses/> or write to the
; Free Software Foundation, 51 Franklin Street, Fifth Floor,
; Boston, MA 02110-1301, USA.
;
LIBRARY libgnustep-gui
EXPORTS
__objc_class_name_GSDisplayServer
__objc_class_name_GSFontEnumerator
__objc_class_name_GSFontInfo
__objc_class_name_GSHbox
__objc_class_name_GSHelpManagerPanel
__objc_class_name_GSHorizontalTypesetter
__objc_class_name__GSLabelListView
__objc_class_name_GSInfoPanel
__objc_class_name_GSKeyBindingAction
__objc_class_name_GSKeyBindingActionQuoteNextKeyStroke
__objc_class_name_GSKeyBindingActionSelector
__objc_class_name_GSKeyBindingActionSelectorArray
__objc_class_name_GSKeyBindingTable
__objc_class_name_GSLayoutManager
__objc_class_name_GSMemoryPanel
__objc_class_name_GSMemoryPanelEntry
__objc_class_name_GSClassSwapper
__objc_class_name_GSControlTemplate
__objc_class_name_GSCustomView
__objc_class_name_GSMenuTemplate
__objc_class_name_GSNibContainer
__objc_class_name_GSNibItem
__objc_class_name_GSObjectTemplate
__objc_class_name_GSTemplateFactory
__objc_class_name_GSTextTemplate
__objc_class_name_GSTextViewTemplate
__objc_class_name_GSViewTemplate
__objc_class_name_GSWindowTemplate
__objc_class_name_NSWindowTemplate
__objc_class_name_GSListener
__objc_class_name_GSServicesManager
__objc_class_name_GSSlideView
__objc_class_name_GSTable
__objc_class_name_GSTextInfo
__objc_class_name_GSTextStorage
__objc_class_name_GSTrackingRect
__objc_class_name_GSTypesetter
__objc_class_name_GSVbox
__objc_class_name_NSActionCell
__objc_class_name_NSAffineTransform
__objc_class_name_NSAppIconView
__objc_class_name_NSApplication
__objc_class_name_NSIconWindow
__objc_class_name_GSBezierPath
__objc_class_name_NSBezierPath
__objc_class_name_NSBitmapImageRep
__objc_class_name_NSBox
__objc_class_name_GSBrowserTitleCell
__objc_class_name_NSBrowser
__objc_class_name_NSBrowserColumn
__objc_class_name_NSBrowserCell
__objc_class_name_NSNibConnector
__objc_class_name_NSNibControlConnector
__objc_class_name_NSNibOutletConnector
__objc_class_name_NSButton
__objc_class_name_NSButtonCell
__objc_class_name_GSCacheW
__objc_class_name_NSCachedImageRep
__objc_class_name_NSCell
__objc_class_name_NSClipView
__objc_class_name_GSCalibratedRGBColor
__objc_class_name_GSCalibratedWhiteColor
__objc_class_name_GSDeviceCMYKColor
__objc_class_name_GSDeviceRGBColor
__objc_class_name_GSDeviceWhiteColor
__objc_class_name_GSNamedColor
__objc_class_name_GSPatternColor
__objc_class_name_GSRGBColor
__objc_class_name_GSWhiteColor
__objc_class_name_NSColor
__objc_class_name_NSColorList
__objc_class_name_NSColorPanel
__objc_class_name_NSColorPicker
__objc_class_name_NSColorWell
__objc_class_name_NSComboBox
__objc_class_name_GSComboWindow
__objc_class_name_NSComboBoxCell
__objc_class_name_NSControl
__objc_class_name_NSCursor
__objc_class_name_NSCustomImageRep
__objc_class_name_NSDataLink
__objc_class_name_NSDataLinkManager
__objc_class_name_GSDataLinkPanelController
__objc_class_name_NSDataLinkPanel
__objc_class_name_NSDocument
__objc_class_name_NSDocumentController
__objc_class_name_NSDrawer
__objc_class_name_NSEPSImageRep
__objc_class_name_NSEvent
__objc_class_name_NSFileWrapper
__objc_class_name_NSFont
__objc_class_name_NSFontManager
__objc_class_name_NSFontPanel
__objc_class_name_NSForm
__objc_class_name_NSFormCell
__objc_class_name_NSGraphicsContext
__objc_class_name_NSHelpManager
__objc_class_name_NSHelpPanel
__objc_class_name_GSRepData
__objc_class_name_NSImage
__objc_class_name_NSImageCell
__objc_class_name_NSImageRep
__objc_class_name_NSImageView
__objc_class_name_NSInputManager
__objc_class_name_NSInputServer
__objc_class_name_GSInterfaceStyle
__objc_class_name_NSLayoutManager
__objc_class_name_NSMatrix
__objc_class_name_NSMenu
__objc_class_name_NSMenuPanel
__objc_class_name_GSMenuSeparator
__objc_class_name_NSMenuItem
__objc_class_name_NSMenuItemCell
__objc_class_name_NSMenuView
__objc_class_name_NSMenuWindowTitleView
__objc_class_name_NSOpenGLContext
__objc_class_name_NSOpenGLPixelFormat
__objc_class_name_NSOpenGLView
__objc_class_name_NSOpenPanel
__objc_class_name_NSOutlineView
__objc_class_name_NSPageLayout
__objc_class_name_GSAlertPanel
__objc_class_name_NSPanel
__objc_class_name_NSMutableParagraphStyle
__objc_class_name_NSParagraphStyle
__objc_class_name_NSTextTab
__objc_class_name_GSFiltered
__objc_class_name_NSPasteboard
__objc_class_name_NSPasteboardObjectDummy
__objc_class_name_NSPasteboardServerDummy
__objc_class_name_NSPopUpButton
__objc_class_name_NSPopUpButtonCell
__objc_class_name_NSPrintInfo
__objc_class_name_GSEPSPrintOperation
__objc_class_name_GSPDFPrintOperation
__objc_class_name_GSPrintOperation
__objc_class_name_NSPrintOperation
__objc_class_name_NSPrintPanel
__objc_class_name_NSPrinter
__objc_class_name_NSProgressIndicator
__objc_class_name_NSResponder
__objc_class_name_NSRulerMarker
__objc_class_name_GSRulerUnit
__objc_class_name_NSRulerView
__objc_class_name_NSSavePanel
__objc_class_name_NSScreen
__objc_class_name_NSScrollView
__objc_class_name_NSScroller
__objc_class_name_GSSimpleSecureLayoutManager
__objc_class_name_NSSecureTextField
__objc_class_name_NSSecureTextFieldCell
__objc_class_name_NSSecureTextView
__objc_class_name_NSSelection
__objc_class_name_NSSlider
__objc_class_name_NSSliderCell
__objc_class_name_NSSound
__objc_class_name_NSSpellChecker
__objc_class_name_NSSpellServer
__objc_class_name_NSSplitView
__objc_class_name_NSStepper
__objc_class_name_NSStepperCell
__objc_class_name_NSTabView
__objc_class_name_NSTabViewItem
__objc_class_name_NSTableColumn
__objc_class_name_NSTableHeaderCell
__objc_class_name_NSTableHeaderView
__objc_class_name_GSTableCornerView
__objc_class_name_NSTableView
__objc_class_name_NSText
__objc_class_name_NSTextAttachment
__objc_class_name_NSTextAttachmentCell
__objc_class_name_NSTextContainer
__objc_class_name_NSTextField
__objc_class_name_NSTextFieldCell
__objc_class_name_NSTextStorage
__objc_class_name_NSTextView
__objc_class_name_GSToolbarButton
__objc_class_name_GSToolbarView
__objc_class_name_NSToolbar
__objc_class_name_GSToolbarCustomizeToolbarItem
__objc_class_name_GSToolbarFlexibleSpaceItem
__objc_class_name_GSToolbarPrintItem
__objc_class_name_GSToolbarSeperatorItem
__objc_class_name_GSToolbarShowColorsItem
__objc_class_name_GSToolbarShowFontsItem
__objc_class_name_GSToolbarSpaceItem
__objc_class_name_NSToolbarItem
__objc_class_name_NSView
__objc_class_name_GSWindowView
__objc_class_name_NSMiniWindow
__objc_class_name_NSMiniWindowView
__objc_class_name_NSWindow
__objc_class_name_NSWindowController
__objc_class_name__GSWorkspaceCenter
__objc_class_name_NSWorkspace
__objc_class_name_GSTheme

View file

@ -5,12 +5,12 @@
GNUSTEP_GUI_GCC=4.0.0
# Versions for libraries that gnustep-gui is dependent upon
GNUSTEP_GUI_BASE=1.26.0
GNUSTEP_GUI_BASE=1.27.0
GNUSTEP_GUI_LIBTIFF=3.4
# The version number of this release.
GNUSTEP_GUI_MAJOR_VERSION=0
GNUSTEP_GUI_MINOR_VERSION=27
GNUSTEP_GUI_MINOR_VERSION=28
GNUSTEP_GUI_SUBMINOR_VERSION=0
# numeric value should match above
VERSION_NUMBER=027.0