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.