This is example.m in view mode; [Download] [Up]
/* Example of using RUNNER.
Written by Tiggr <tiggr@es.ele.tue.nl> and Michael <michael@thi.nl>
Copyright (C) 1994, 1995 Pieter J. Schoenmakers and Michael L.H. Brouwer.
All rights reserved.
This file is part of RUNNER.
RUNNER 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, or (at
your option) any later version.
RUNNER 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 RUNNER; see the file COPYING.LIB. If not, write
to the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
$Id: example.m,v 1.2 1995/11/29 17:40:52 tiggr Exp $ */
#import <remote/NXConnection.h>
#import <remote/NXProxy.h>
#import <libc.h>
#import "runner.h"
#define REGISTERED_NAME "App Noot Mies"
/* The Client and Server protocols only employ asynchronous messages.
When running example several times, the order of the method
invocations, as printed, can be tell:to:, beTold: and die, or
tell:to:, die, beTold:. */
@protocol Client
-(oneway void) beTold: (const char *) whatever;
@end
@protocol Server
-(oneway void) die;
-(oneway void) tell: (const char *) something to: (id <Client>) me;
@end
@interface Server: Object <Server>
-(void) run;
@end
@interface Client: Object <Client, TMProxyDeath>
{
id <Server> server;
}
-(void) killServer;
@end
void
te_handler_2 (DPSTimedEntry te, double now, void *userData)
{
struct timeval tv;
gettimeofday (&tv, 0);
printf ("%d.%06d timed entry 2\n", tv.tv_sec, tv.tv_usec);
} /* te_handler_2 */
void
te_handler_1 (DPSTimedEntry te, double now, void *userData)
{
static DPSTimedEntry te2;
struct timeval tv;
gettimeofday (&tv, 0);
printf ("%d.%06d timed entry 1\n", tv.tv_sec, tv.tv_usec);
if (te2)
{
printf ("server: remove timed entry handler=2\n");
DPSRemoveTimedEntry (te2);
te2 = NULL;
}
else
{
printf ("server: add timed entry handler=2 period=0.25\n");
te2 = DPSAddTimedEntry (0.25, te_handler_2, 0, 0);
}
} /* te_handler_1 */
@implementation Server
-(void) run
{
/* Register ourselves. */
NXConnection *c = [NXConnection registerRoot: self
withName: REGISTERED_NAME];
if (!c)
{
/* Oops, something's wrong! */
LogError ("Can't register server");
}
else
{
/* Tell the connection how it is to communicate. */
[c runFromAppKit];
/* Go for it! */
[[TMConnectionRunner sharedRunner] run];
}
} /* -run */
-(oneway void) die
{
printf ("-[Server die]\n");
/* Shot! */
exit (0);
} /* -die */
-(oneway void) tell: (const char *) something to: (id <Client>) me
{
printf ("-[Server tell:to:] %s %p\n", something, me);
printf ("server: add timed entry handler=2 period=0.001\n");
DPSAddTimedEntry (0.001, te_handler_2, 0, 0);
/* Set the protocol, since this is the first time we hear something
from this client. */
[(NXProxy *) me setProtocolForProxy: @protocol (Client)];
/* Tell it what it wants. */
[me beTold: something];
} /* -tell:to: */
@end
@implementation Client
-init
{
/* Get a proxy to the server. */
NXProxy *p = [NXConnection connectToName: REGISTERED_NAME];
if (!p)
{
/* There's this problem we're having... */
LogError ("Can't find server");
exit (0);
}
/* Avoid a synchronous RPC to discover the method signature for each
of the methods we invoke at the server. */
[p setProtocolForProxy: @protocol (Server)];
/* Make sure we are notified of our server's death. */
[[TMConnectionRunner sharedRunner] registerProxy: p forLocal: self];
/* Tell this new connection how it is to perform its communication. */
[[p connectionForProxy] runFromAppKit];
server = (id) p;
return (self);
} /* -init */
-(void) killServer
{
printf ("-[Client killServer]\n");
/* Be polite... */
[server tell: "Farewell cruel world..." to: self];
/* Shoot! */
[server die];
} /* -init */
-(oneway void) beTold: (const char *) whatever
{
printf ("-[Client beTold:] %s\n", whatever);
} /* beTold: */
-(void) proxyDied: (id) proxy
{
printf ("-[Client proxyDied: %p], server=%p\n", proxy, server);
exit (0);
} /* -proxyDied: */
@end
int
main (int argc, char **argv)
{
switch (fork ())
{
case -1:
perror ("fork");
break;
case 0:
printf ("server: add timed entry handler=1 period=2\n");
DPSAddTimedEntry (2, te_handler_1, 0, 0);
[(Server *) [[Server alloc] init] run];
break;
default:
/* Give server time to register, and play with timed entries. */
sleep (8);
[[[Client alloc] init] killServer];
[[TMConnectionRunner sharedRunner] run];
break;
}
return (0);
} /* main */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.