2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
6 SOPE is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with SOPE; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #include "NGFileManagerURL.h"
25 @interface NGFileManagerURLHandle : NSURLHandle
27 id<NSObject,NGFileManager> fileManager;
30 NSURLHandleStatus status;
32 NSDictionary *cachedProperties;
36 @implementation NGFileManagerURL
38 - (id)initWithPath:(NSString *)_path
39 fileManager:(id<NSObject,NGFileManager>)_fm
41 static BOOL didRegisterHandleClass = NO;
42 if (!didRegisterHandleClass) {
43 [NSURLHandle registerURLHandleClass:[NGFileManagerURLHandle class]];
44 didRegisterHandleClass = YES;
47 self->path = [[_fm standardizePath:_path] copy];
48 self->fileManager = [_fm retain];
54 [self->fileManager release];
60 - (id<NSObject,NGFileManager>)fileManager {
61 return self->fileManager;
64 - (NSString *)fragment {
73 - (NSString *)scheme {
79 - (NSString *)password {
93 @end /* NGFileManagerURL */
95 @implementation NGFileManagerURLHandle
97 + (BOOL)canInitWithURL:(NSURL *)_url {
98 return [_url isKindOfClass:[NGFileManagerURL class]] ? YES : NO;
101 - (id)initWithURL:(NSURL *)_url cached:(BOOL)_flag {
102 if (![[self class] canInitWithURL:_url]) {
107 self->fileManager = [[(NGFileManagerURL *)_url fileManager] retain];
108 self->path = [[_url path] copy];
109 self->shallCache = _flag;
110 self->status = NSURLHandleNotLoaded;
114 [self->cachedData release];
115 [self->cachedProperties release];
116 [self->path release];
117 [self->fileManager release];
121 - (NSData *)loadInForeground {
122 [self->cachedProperties release]; self->cachedProperties = nil;
123 [self->cachedData release]; self->cachedData = nil;
125 self->cachedData = [[self->fileManager contentsAtPath:self->path] retain];
126 self->cachedProperties =
127 [[self->fileManager fileAttributesAtPath:self->path traverseLink:YES]
130 return self->cachedData;
132 - (void)loadInBackground {
133 [self loadInBackground];
136 - (void)flushCachedData {
137 [self->cachedData release]; self->cachedData = nil;
138 [self->cachedProperties release]; self->cachedProperties = nil;
141 - (NSData *)resourceData {
144 if (self->cachedData)
145 return [[self->cachedData copy] autorelease];
147 data = [self loadInForeground];
150 if (!self->shallCache)
151 [self flushCachedData];
153 return [data autorelease];
156 - (NSData *)availableResourceData {
157 return [[self->cachedData copy] autorelease];
160 - (NSURLHandleStatus)status {
163 - (NSString *)failureReason {
164 if (self->status != NSURLHandleLoadFailed)
167 return @"loading of URL failed";
172 - (id)propertyForKey:(NSString *)_key {
173 if (self->cachedProperties)
174 return [self->cachedProperties objectForKey:_key];
176 if ([self loadInForeground]) {
179 value = [self->cachedProperties objectForKey:_key];
180 value = [value retain];
182 if (!self->shallCache)
183 [self flushCachedData];
185 return [value autorelease];
188 [self flushCachedData];
192 - (id)propertyForKeyIfAvailable:(NSString *)_key {
193 return [self->cachedProperties objectForKey:_key];
198 - (BOOL)writeData:(NSData *)_data {
199 [self flushCachedData];
204 @end /* NGFileManagerURLHandle */