libs-steptalk/Frameworks/StepTalk/STRemoteConversation.m
Stefan Urbanek b4e1c926df Added remote conversation and language manager, removed STLanguage
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/steptalk/trunk@21697 72102866-910b-0410-8b05-ffd578937521
2005-09-05 20:02:03 +00:00

142 lines
3.3 KiB
Objective-C

/* FIXME: not used! just an unimplemented idea.
*/
#import "STRemoteConversation.h"
#import <Foundation/NSException.h>
#import <Foundation/NSNotification.h>
#import <Foundation/NSConnection.h>
#import <Foundation/NSDistantObject.h>
#import "STEnvironment.h"
@implementation STRemoteConversation
- initWithEnvironmentName:(NSString *)envName
host:(NSString *)host
language:(NSString *)langName
{
self = [super init];
if(!envName)
{
[NSException raise:@"STConversationException"
format:@"Unspecified environment name for a distant conversation"];
[self dealloc];
return nil;
}
environmentName = RETAIN(envName);
hostName = RETAIN(host);
[self open];
return self;
}
- (void)open
{
NSString *envProcName;
if(connection)
{
[NSException raise:@"STConversationException"
format:@"Unable to open conversation: already opened."];
return;
}
envProcName = [NSString stringWithFormat:@"STEnvironment:%@",
environmentName];
connection = [NSConnection connectionWithRegisteredName:envProcName
host:hostName];
RETAIN(connection);
if(!connection)
{
[NSException raise:@"STConversationException"
format:@"Connection failed for environment '%@'",
environmentName];
return;
}
environmentProcess = RETAIN([connection rootProxy]);
proxy = RETAIN([environmentProcess createConversation]);
[proxy setProtocolForProxy:@protocol(STConversation)];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(connectionDidDie:)
name: NSConnectionDidDieNotification
object: connection];
}
- (void)close
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
RELEASE(proxy);
proxy = nil;
RELEASE(environmentProcess);
environmentProcess = nil;
[connection invalidate];
RELEASE(connection);
connection = nil;
return;
}
- (void)dealloc
{
/* After this we should not have any connection, environmentProcess
nor proxy */
[self close];
RELEASE(environmentName);
RELEASE(hostName);
[super dealloc];
}
- (void)setLanguage:(NSString *)newLanguage
{
[proxy setLanguage:newLanguage];
}
/** Return name of the language used in the receiver conversation */
- (NSString *)language
{
return [proxy language];
}
- (STEnvironment *)environment
{
/* FIXME: return local description */
return nil;
}
- (void)interpretScript:(NSString *)aString
{
[proxy interpretScript:aString];
}
- (id)result
{
return [proxy result];
}
- (bycopy id)resultByCopy
{
return [proxy resultByCopy];
}
- (void)connectionDidDie:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
if(proxy)
{
NSLog(@"Connection did die for %@ (%@)", self, environmentName);
}
else
{
NSLog(@"Closing conversation (%@) with %@", self, environmentName);
}
proxy = nil;
environmentProcess = nil;
RELEASE(connection);
connection = nil;
}
@end