Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 1 | // 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 | |
| 7 | package main |
| 8 | |
| 9 | // To build: |
| 10 | // cd $V23_ROOT/experimental/projects/ether |
Nicolas Lacasse | 863e859 | 2015-08-26 16:35:48 -0700 | [diff] [blame] | 11 | // make build |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 12 | |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 13 | import ( |
| 14 | "log" |
| 15 | |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 16 | "mojo/public/go/application" |
| 17 | "mojo/public/go/bindings" |
| 18 | "mojo/public/go/system" |
| 19 | |
| 20 | "mojom/syncbase" |
| 21 | |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 22 | "v.io/v23" |
Adam Sadovsky | 9fb308f | 2015-08-10 19:12:34 -0700 | [diff] [blame] | 23 | "v.io/v23/context" |
| 24 | "v.io/v23/rpc" |
Adam Sadovsky | f2efeb5 | 2015-08-31 14:17:49 -0700 | [diff] [blame] | 25 | "v.io/x/ref/services/syncbase/server" |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 26 | ) |
| 27 | |
| 28 | //#include "mojo/public/c/system/types.h" |
| 29 | import "C" |
| 30 | |
| 31 | type delegate struct { |
Adam Sadovsky | 9fb308f | 2015-08-10 19:12:34 -0700 | [diff] [blame] | 32 | ctx *context.T |
| 33 | srv rpc.Server |
| 34 | disp rpc.Dispatcher |
| 35 | stubs []*bindings.Stub |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 36 | } |
| 37 | |
Adam Sadovsky | 9fb308f | 2015-08-10 19:12:34 -0700 | [diff] [blame] | 38 | func (d *delegate) Initialize(ctx application.Context) { |
| 39 | d.srv, d.disp = Serve(d.ctx) |
| 40 | } |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 41 | |
| 42 | func (d *delegate) Create(req syncbase.Syncbase_Request) { |
Adam Sadovsky | 9fb308f | 2015-08-10 19:12:34 -0700 | [diff] [blame] | 43 | impl := server.NewMojoImpl(d.ctx, d.srv, d.disp) |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 44 | 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 | |
| 59 | func (d *delegate) AcceptConnection(conn *application.Connection) { |
| 60 | conn.ProvideServices(&syncbase.Syncbase_ServiceFactory{d}) |
| 61 | } |
| 62 | |
| 63 | func (d *delegate) Quit() { |
| 64 | for _, stub := range d.stubs { |
| 65 | stub.Close() |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | //export MojoMain |
| 70 | func MojoMain(handle C.MojoHandle) C.MojoResult { |
| 71 | ctx, shutdown := v23.Init() |
| 72 | defer shutdown() |
Adam Sadovsky | 9fb308f | 2015-08-10 19:12:34 -0700 | [diff] [blame] | 73 | application.Run(&delegate{ctx: ctx}, system.MojoHandle(handle)) |
Adam Sadovsky | d858457 | 2015-07-31 20:04:00 -0700 | [diff] [blame] | 74 | return C.MOJO_RESULT_OK |
| 75 | } |
| 76 | |
Nicolas Lacasse | 7644a55 | 2015-08-06 15:19:40 -0700 | [diff] [blame] | 77 | // 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. |
| 79 | func main() {} |