/* Implementation for NSFileHandle for GNUStep Copyright (C) 1997 Free Software Foundation, Inc. Written by: Richard Frith-Macdonald Date: 1997 This file is part of the GNUstep Base Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ #include #include #include #include #include #include #include static Class NSFileHandle_concrete_class = nil; @implementation NSFileHandle + (void)initialize { if (self == [NSFileHandle class]) { NSFileHandle_concrete_class = [UnixFileHandle class]; } } + (void)_setConcreteClass: (Class)c { NSFileHandle_concrete_class = c; } + (Class)_concreteClass { return NSFileHandle_concrete_class; } + allocWithZone: (NSZone*)z { return NSAllocateObject ([self _concreteClass], 0, z); } // Allocating and Initializing a FileHandle Object + (id)fileHandleForReadingAtPath: (NSString*)path { return [[[[self _concreteClass] alloc] initForReadingAtPath: path] autorelease]; } + (id)fileHandleForWritingAtPath: (NSString*)path { return [[[[self _concreteClass] alloc] initForWritingAtPath: path] autorelease]; } + (id)fileHandleForUpdatingAtPath: (NSString*)path { return [[[[self _concreteClass] alloc] initForUpdatingAtPath: path] autorelease]; } + (id)fileHandleWithStandardError { return [[[[self _concreteClass] alloc] initWithStandardError] autorelease]; } + (id)fileHandleWithStandardInput { return [[[[self _concreteClass] alloc] initWithStandardInput] autorelease]; } + (id)fileHandleWithStandardOutput { return [[[[self _concreteClass] alloc] initWithStandardOutput] autorelease]; } + (id)fileHandleWithNullDevice { return [[[[self _concreteClass] alloc] initWithNullDevice] autorelease]; } - (id)initWithFileDescriptor: (int)desc { return [self initWithFileDescriptor: desc closeOnDealloc: NO]; } - (id)initWithFileDescriptor: (int)desc closeOnDealloc: (BOOL)flag { [self subclassResponsibility: _cmd]; return nil; } - (id)initWithNativeHandle: (void*)hdl { return [self initWithNativeHandle: hdl closeOnDealloc: NO]; } // This is the designated initializer. - (id)initWithNativeHandle: (void*)hdl closeOnDealloc: (BOOL)flag { [self subclassResponsibility: _cmd]; return nil; } // Returning file handles - (int)fileDescriptor { [self subclassResponsibility: _cmd]; return -1; } - (void*)nativeHandle { [self subclassResponsibility: _cmd]; return 0; } // Synchronous I/O operations - (NSData*)availableData { [self subclassResponsibility: _cmd]; return nil; } - (NSData*)readDataToEndOfFile { [self subclassResponsibility: _cmd]; return nil; } - (NSData*)readDataOfLength: (unsigned int)len { [self subclassResponsibility: _cmd]; return nil; } - (void)writeData: (NSData*)item { [self subclassResponsibility: _cmd]; } // Asynchronous I/O operations - (void)acceptConnectionInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } - (void)acceptConnectionInBackgroundAndNotify { [self subclassResponsibility: _cmd]; } - (void)readInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } - (void)readInBackgroundAndNotify { [self subclassResponsibility: _cmd]; } - (void)readToEndOfFileInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } - (void)readToEndOfFileInBackgroundAndNotify { [self subclassResponsibility: _cmd]; } - (void)waitForDataInBackgroundAndNotifyForModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } - (void)waitForDataInBackgroundAndNotify { [self subclassResponsibility: _cmd]; } // Seeking within a file - (unsigned long long)offsetInFile { [self subclassResponsibility: _cmd]; return 0; } - (unsigned long long)seekToEndOfFile { [self subclassResponsibility: _cmd]; return 0; } - (void)seekToFileOffset: (unsigned long long)pos { [self subclassResponsibility: _cmd]; } // Operations on file - (void)closeFile { [self subclassResponsibility: _cmd]; } - (void)synchronizeFile { [self subclassResponsibility: _cmd]; } - (void)truncateFileAtOffset: (unsigned long long)pos { [self subclassResponsibility: _cmd]; } @end // Keys for accessing userInfo dictionary in notification handlers. NSString* NSFileHandleNotificationDataItem = @"NSFileHandleNotificationDataItem"; NSString* NSFileHandleNotificationFileHandleItem = @"NSFileHandleNotificationFileHandleItem"; NSString* NSFileHandleNotificationMonitorModes = @"NSFileHandleNotificationMonitorModes"; // Notification names NSString* NSFileHandleConnectionAcceptedNotification = @"NSFileHandleConnectionAcceptedNotification"; NSString* NSFileHandleDataAvailableNotification = @"NSFileHandleDataAvailableNotification"; NSString* NSFileHandleReadCompletionNotification = @"NSFileHandleReadCompletionNotification"; NSString* NSFileHandleReadToEndOfFileCompletionNotification = @"NSFileHandleReadToEndOfFileCompletionNotification"; // Exceptions NSString* NSFileHandleOperationException = @"NSFileHandleOperationException"; // GNUstep class extensions @implementation NSFileHandle (GNUstepExtensions) + (id)fileHandleAsClientAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { return [[[[self _concreteClass] alloc] initAsClientAtAddress: address service: service protocol: protocol] autorelease]; } + (id)fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { return [[[[self _concreteClass] alloc] initAsClientInBackgroundAtAddress: address service: service protocol: protocol forModes: nil] autorelease]; } + (id)fileHandleAsClientInBackgroundAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol forModes: (NSArray*)modes { return [[[[self _concreteClass] alloc] initAsClientInBackgroundAtAddress: address service: service protocol: protocol forModes: modes] autorelease]; } + (id)fileHandleAsServerAtAddress: (NSString*)address service: (NSString*)service protocol: (NSString*)protocol { return [[[[self _concreteClass] alloc] initAsServerAtAddress: address service: service protocol: protocol] autorelease]; } - (BOOL)readInProgress { [self subclassResponsibility: _cmd]; return NO; } - (NSString*)socketAddress { return nil; } - (NSString*)socketService { return nil; } - (NSString*)socketProtocol { return nil; } - (void)writeInBackgroundAndNotify: (NSData*)item forModes: (NSArray*)modes { [self subclassResponsibility: _cmd]; } - (void)writeInBackgroundAndNotify: (NSData*)item; { [self subclassResponsibility: _cmd]; } - (BOOL)writeInProgress { [self subclassResponsibility: _cmd]; return NO; } // GNUstep Notification names NSString* GSFileHandleConnectCompletionNotification = @"GSFileHandleConnectCompletionNotification"; NSString* GSFileHandleWriteCompletionNotification = @"GSFileHandleWriteCompletionNotification"; // GNUstep key for getting error message. NSString* GSFileHandleNotificationError = @"GSFileHandleNotificationError"; @end