libs-base/Testing/call.m
Richard Frith-Macdonald db7b22a4fb Tidy up use of white space so we have it after if/for/while and not after (
or before ) or padding at end of line.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@20773 72102866-910b-0410-8b05-ffd578937521
2005-02-22 11:22:44 +00:00

195 lines
4 KiB
Objective-C

/* call - Program to test NSFileHandle TCP/IP connection.
Copyright (C) 2002 Free Software Foundation, Inc.
Written by: Richard Frith-Macdonald <rfm@gnu.org>
Date: Jun 2002
This file is part of the GNUstep Base Library.
*/
#include <Foundation/Foundation.h>
GS_EXPORT NSString * const GSTelnetNotification;
GS_EXPORT NSString * const GSTelnetErrorKey;
GS_EXPORT NSString * const GSTelnetTextKey;
@class GSTelnetHandle;
@interface Call : NSObject
{
NSFileHandle *ichan;
NSFileHandle *ochan;
id remote;
NSMutableData *buf;
}
- (void) didRead: (NSNotification*)notification;
- (void) didWrite: (NSNotification*)notification;
- (void) gotTelnet: (NSNotification*)notification;
@end
@implementation Call
- (void) dealloc
{
RELEASE(ichan);
RELEASE(ochan);
RELEASE(remote);
RELEASE(buf);
[super dealloc];
}
- (void) didRead: (NSNotification*)notification
{
NSDictionary *userInfo = [notification userInfo];
NSData *d;
d = [userInfo objectForKey: NSFileHandleNotificationDataItem];
if (d == nil || [d length] == 0)
{
NSLog(@"Read EOF");
exit(0);
}
else
{
char *ptr;
unsigned len;
int i;
[buf appendData: d];
ptr = [buf mutableBytes];
len = [buf length];
for (i = 0; i < len; i++)
{
if (ptr[i] == '\n')
{
NSString *s;
if (i > 0 && ptr[i-1] == '\r')
{
s = [NSString stringWithCString: ptr length: i-1];
}
else
{
s = [NSString stringWithCString: ptr length: i];
}
len -= (i + 1);
if (len > 0)
{
memcpy(ptr, &ptr[i+1], len);
}
[buf setLength: len];
ptr = [buf mutableBytes];
i = -1;
[remote putTelnetLine: s];
}
}
[ichan readInBackgroundAndNotify];
}
}
- (void) didWrite: (NSNotification*)notification
{
NSDictionary *userInfo = [notification userInfo];
NSString *e;
e = [userInfo objectForKey: GSFileHandleNotificationError];
if (e)
{
NSLog(@"%@", e);
exit(0);
}
}
- (void) gotTelnet: (NSNotification*)notification
{
NSDictionary *info = [notification userInfo];
NSArray *text;
text = [info objectForKey: GSTelnetTextKey];
if (text == nil)
{
NSLog(@"Lost telnet - %@", [info objectForKey: GSTelnetErrorKey]);
exit(0);
}
else
{
unsigned i;
for (i = 0; i < [text count]; i++)
{
[ochan writeInBackgroundAndNotify:
[[text objectAtIndex: i] dataUsingEncoding: NSUTF8StringEncoding]];
}
}
}
- (id) init
{
NSArray *args = [[NSProcessInfo processInfo] arguments];
NSString *host = @"localhost";
NSString *service = @"telnet";
NSString *protocol = @"tcp";
if ([args count] > 1)
{
host = [args objectAtIndex: 1];
if ([args count] > 2)
{
service = [args objectAtIndex: 2];
if ([args count] > 3)
{
protocol = [args objectAtIndex: 3];
}
}
}
buf = [NSMutableData new];
ichan = RETAIN([NSFileHandle fileHandleWithStandardInput]);
ochan = RETAIN([NSFileHandle fileHandleWithStandardOutput]);
remote = [[GSTelnetHandle alloc] initWithHandle:
[NSFileHandle fileHandleAsClientAtAddress:
host service: service protocol: protocol] isConnected: YES];
if (remote == nil)
{
NSLog(@"Failed to create connection");
DESTROY(self);
}
else
{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver: self
selector: @selector(didRead:)
name: NSFileHandleReadCompletionNotification
object: ichan];
[nc addObserver: self
selector: @selector(didWrite:)
name: GSFileHandleWriteCompletionNotification
object: ochan];
[nc addObserver: self
selector: @selector(gotTelnet:)
name: GSTelnetNotification
object: remote];
[ichan readInBackgroundAndNotify];
}
return self;
}
@end
int
main()
{
Call *console;
CREATE_AUTORELEASE_POOL(arp);
console = [Call new];
RELEASE(arp);
[[NSRunLoop currentRunLoop] run];
RELEASE(console);
return 0;
}