summaryrefslogtreecommitdiff
path: root/rpc++/example/server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'rpc++/example/server.cc')
-rw-r--r--rpc++/example/server.cc112
1 files changed, 112 insertions, 0 deletions
diff --git a/rpc++/example/server.cc b/rpc++/example/server.cc
new file mode 100644
index 00000000000..f57496c0674
--- /dev/null
+++ b/rpc++/example/server.cc
@@ -0,0 +1,112 @@
+// -*- c++ -*-
+static char _server_cc_[]
+= "server.cc,v 2.3 1992/06/15 19:13:18 mnl Exp";
+
+// server.cc,v
+// Revision 2.3 1992/06/15 19:13:18 mnl
+// Fixed a few bugs, clarified interface.
+//
+// Revision 2.2 1992/06/13 14:27:33 mnl
+// Adapted to (patched) gcc-2.2. Fixed several bugs.
+//
+// Revision 2.1.1.1 1992/03/08 13:28:45 mnl
+// Initial mnl version.
+//
+
+#include <unistd.h>
+#include <stream.h>
+#include <string.h>
+#include <malloc.h>
+
+#include "rpc++/service.h"
+#include "calcsvc.h"
+
+class Calc
+{
+public:
+ void* Add (void*, void*);
+ void* Sub (void*, void*);
+ void* Times (void*, void*);
+ void* Div (void*, void*);
+ void* Inc (void*);
+ void* IToA (void**);
+ void Reset (RpcService*);
+};
+
+void* Calc::Add (void* in1, void* in2)
+{
+ static int res;
+ res = *(int*)in1 + *(int*)in2;
+ return &res;
+}
+
+void* Calc::Sub (void* in1, void* in2)
+{
+ static int res;
+ res = *(int*)in1 - *(int*)in2;
+ return &res;
+}
+
+void* Calc::Times (void* in1, void* in2)
+{
+ static int res;
+ res = *(int*)in1 * *(int*)in2;
+ return &res;
+}
+
+void* Calc::Div (void* in1, void* in2)
+{
+ static int res;
+ res = *(int*)in1 / *(int*)in2;
+ return &res;
+}
+
+void* Calc::Inc (void* in)
+{
+ static int res;
+ res = *(int*)in + 1;
+ return &res;
+}
+
+void* Calc::IToA (void** in)
+{
+ static char *s = 0;
+ delete s;
+ char *t = form ("%d", *(int*)in[0]);
+ s = new char[strlen (t) + 1];
+ strcpy (s, t);
+ return &s;
+}
+
+void Calc::Reset (RpcService* svc)
+{
+ cout << "Received reset from " << svc->CallerName () << ".\n";
+}
+
+void printMessage (void* in)
+{
+ cout << *(char**)in;
+}
+
+void doSleep (void* in)
+{
+ cout << form ("Sleeping %d secs.\n", *(int*)in);
+ sleep (*(int*)in);
+ cout << "Woke up.\n";
+}
+
+main ()
+{
+ RpcService svc (CALCSVC, 1);
+ Calc calc;
+ svc.Register (CalcRequests::Add, RpcMethodCall<Calc> (&calc, &calc.Add));
+ svc.Register (CalcRequests::Sub, RpcMethodCall<Calc> (&calc, &calc.Sub));
+ svc.Register (CalcRequests::Times, RpcMethodCall<Calc> (&calc, &calc.Times));
+ svc.Register (CalcRequests::Div, RpcMethodCall<Calc> (&calc, &calc.Div));
+ svc.Register (CalcRequests::Inc, RpcMethodCall<Calc> (&calc, &calc.Inc));
+ svc.Register (CalcRequests::IToA,RpcMethodCall<Calc>(&calc, &calc.IToA));
+ svc.Register (CalcRequests::Reset, RpcMethodCall<Calc> (&calc, &calc.Reset));
+ svc.Register (CalcRequests::Msg, RpcCallback (printMessage));
+ svc.Register (CalcRequests::Sleep, RpcCallback (doSleep));
+ svc.Provide ();
+}