blob: fc1dccce9efbb51b14b771216376c36ad63773df [file] [log] [blame]
Adam Sadovskyd8584572015-07-31 20:04:00 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build mojo
6
7package main
8
9// To build:
10// cd $V23_ROOT/experimental/projects/ether
Nicolas Lacasse863e8592015-08-26 16:35:48 -070011// make build
Adam Sadovskyd8584572015-07-31 20:04:00 -070012
Adam Sadovskyd8584572015-07-31 20:04:00 -070013import (
14 "log"
15
Adam Sadovskyd8584572015-07-31 20:04:00 -070016 "mojo/public/go/application"
17 "mojo/public/go/bindings"
18 "mojo/public/go/system"
19
20 "mojom/syncbase"
21
Adam Sadovskyd8584572015-07-31 20:04:00 -070022 "v.io/v23"
Adam Sadovsky9fb308f2015-08-10 19:12:34 -070023 "v.io/v23/context"
24 "v.io/v23/rpc"
Adam Sadovskyf2efeb52015-08-31 14:17:49 -070025 "v.io/x/ref/services/syncbase/server"
Adam Sadovskyd8584572015-07-31 20:04:00 -070026)
27
28//#include "mojo/public/c/system/types.h"
29import "C"
30
31type delegate struct {
Adam Sadovsky9fb308f2015-08-10 19:12:34 -070032 ctx *context.T
33 srv rpc.Server
34 disp rpc.Dispatcher
35 stubs []*bindings.Stub
Adam Sadovskyd8584572015-07-31 20:04:00 -070036}
37
Adam Sadovsky9fb308f2015-08-10 19:12:34 -070038func (d *delegate) Initialize(ctx application.Context) {
39 d.srv, d.disp = Serve(d.ctx)
40}
Adam Sadovskyd8584572015-07-31 20:04:00 -070041
42func (d *delegate) Create(req syncbase.Syncbase_Request) {
Adam Sadovsky9fb308f2015-08-10 19:12:34 -070043 impl := server.NewMojoImpl(d.ctx, d.srv, d.disp)
Adam Sadovskyd8584572015-07-31 20:04:00 -070044 stub := syncbase.NewSyncbaseStub(req, impl, bindings.GetAsyncWaiter())
45 d.stubs = append(d.stubs, stub)
46 go func() {
47 for {
48 if err := stub.ServeRequest(); err != nil {
49 connErr, ok := err.(*bindings.ConnectionError)
50 if !ok || !connErr.Closed() {
51 log.Println(err)
52 }
53 break
54 }
55 }
56 }()
57}
58
59func (d *delegate) AcceptConnection(conn *application.Connection) {
60 conn.ProvideServices(&syncbase.Syncbase_ServiceFactory{d})
61}
62
63func (d *delegate) Quit() {
64 for _, stub := range d.stubs {
65 stub.Close()
66 }
67}
68
69//export MojoMain
70func MojoMain(handle C.MojoHandle) C.MojoResult {
71 ctx, shutdown := v23.Init()
72 defer shutdown()
Adam Sadovsky9fb308f2015-08-10 19:12:34 -070073 application.Run(&delegate{ctx: ctx}, system.MojoHandle(handle))
Adam Sadovskyd8584572015-07-31 20:04:00 -070074 return C.MOJO_RESULT_OK
75}
76
Nicolas Lacasse7644a552015-08-06 15:19:40 -070077// NOTE(nlacasse): Mojo runs Go code by calling MojoMain(). The main() method
78// below is still needed because the Go tool won't build without it.
79func main() {}