1*3f982cf4SFabien Sanglard// Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard// Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard// found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardpackage main 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard// TODO(jophba): 8*3f982cf4SFabien Sanglard// Add response messages from receiver 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard// Inject JS into viewURL to using .Eval and .Bind to send and receiver presentation connection messages 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglardimport ( 13*3f982cf4SFabien Sanglard "context" 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard "flag" 16*3f982cf4SFabien Sanglard "fmt" 17*3f982cf4SFabien Sanglard "log" 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard "osp" 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard mdns "github.com/grandcat/zeroconf" 22*3f982cf4SFabien Sanglard "github.com/zserge/webview" 23*3f982cf4SFabien Sanglard) 24*3f982cf4SFabien Sanglard 25*3f982cf4SFabien Sanglardfunc runServer(ctx context.Context, mdnsInstanceName string, port int) { 26*3f982cf4SFabien Sanglard tlsCert, err := osp.GenerateTlsCert() 27*3f982cf4SFabien Sanglard if err != nil { 28*3f982cf4SFabien Sanglard log.Fatalln("Failed to generate TLS cert:", err.Error()) 29*3f982cf4SFabien Sanglard } 30*3f982cf4SFabien Sanglard osp.RunPresentationReceiver(ctx, mdnsInstanceName, port, *tlsCert, viewUrl) 31*3f982cf4SFabien Sanglard} 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglardfunc browseMdns(ctx context.Context) { 34*3f982cf4SFabien Sanglard entries, err := osp.BrowseMdns(ctx) 35*3f982cf4SFabien Sanglard if err != nil { 36*3f982cf4SFabien Sanglard log.Fatalf("Failed to browse mDNS: %v\n", err) 37*3f982cf4SFabien Sanglard } 38*3f982cf4SFabien Sanglard for entry := range entries { 39*3f982cf4SFabien Sanglard log.Println(fmt.Sprintf("%s at %s(%s or %s):%d", entry.Instance, entry.HostName, entry.AddrIPv4, entry.AddrIPv6, entry.Port)) 40*3f982cf4SFabien Sanglard } 41*3f982cf4SFabien Sanglard} 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglardfunc getMdnsHost(entry *mdns.ServiceEntry) string { 44*3f982cf4SFabien Sanglard for _, ipv6 := range entry.AddrIPv6 { 45*3f982cf4SFabien Sanglard log.Printf("Choosing IPv6 address [%s]\n", ipv6) 46*3f982cf4SFabien Sanglard return fmt.Sprintf("[%s]", ipv6) 47*3f982cf4SFabien Sanglard } 48*3f982cf4SFabien Sanglard for _, ipv4 := range entry.AddrIPv4 { 49*3f982cf4SFabien Sanglard log.Printf("Choosing IPv4 address %s\n", ipv4) 50*3f982cf4SFabien Sanglard return fmt.Sprintf("%s", ipv4) 51*3f982cf4SFabien Sanglard } 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard // This shouldn't happen 54*3f982cf4SFabien Sanglard log.Printf("No IP address found. Falling back to hostname %s\n", entry.HostName) 55*3f982cf4SFabien Sanglard return entry.HostName 56*3f982cf4SFabien Sanglard} 57*3f982cf4SFabien Sanglard 58*3f982cf4SFabien Sanglardfunc flingUrl(ctx context.Context, target string, url string) { 59*3f982cf4SFabien Sanglard log.Printf("Search for %s\n", target) 60*3f982cf4SFabien Sanglard entries, err := osp.LookupMdns(ctx, target) 61*3f982cf4SFabien Sanglard if err != nil { 62*3f982cf4SFabien Sanglard log.Fatalf("Failed to browse mDNS: %v\n", err) 63*3f982cf4SFabien Sanglard } 64*3f982cf4SFabien Sanglard for entry := range entries { 65*3f982cf4SFabien Sanglard log.Printf("Fling %s to %s:%d\n", url, entry.HostName, entry.Port) 66*3f982cf4SFabien Sanglard host := getMdnsHost(entry) 67*3f982cf4SFabien Sanglard err := osp.StartPresentation(ctx, host, entry.Port, url) 68*3f982cf4SFabien Sanglard if err != nil { 69*3f982cf4SFabien Sanglard log.Fatalln("Failed to start presentation.") 70*3f982cf4SFabien Sanglard } 71*3f982cf4SFabien Sanglard break 72*3f982cf4SFabien Sanglard } 73*3f982cf4SFabien Sanglard} 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglardfunc viewUrl(url string) { 76*3f982cf4SFabien Sanglard web := webview.New(webview.Settings{ 77*3f982cf4SFabien Sanglard // Title: "Open Screen", 78*3f982cf4SFabien Sanglard URL: url, 79*3f982cf4SFabien Sanglard Width: 800, 80*3f982cf4SFabien Sanglard Height: 600, 81*3f982cf4SFabien Sanglard Resizable: true, 82*3f982cf4SFabien Sanglard }) 83*3f982cf4SFabien Sanglard web.Dispatch(func() { 84*3f982cf4SFabien Sanglard // web.SetFullscreen(true) 85*3f982cf4SFabien Sanglard }) 86*3f982cf4SFabien Sanglard web.Dispatch(func() { 87*3f982cf4SFabien Sanglard // web.Eval(); 88*3f982cf4SFabien Sanglard // web.Bind(); 89*3f982cf4SFabien Sanglard }) 90*3f982cf4SFabien Sanglard web.Run() 91*3f982cf4SFabien Sanglard} 92*3f982cf4SFabien Sanglard 93*3f982cf4SFabien Sanglardfunc main() { 94*3f982cf4SFabien Sanglard port := flag.Int("port", 10000, "port") 95*3f982cf4SFabien Sanglard flag.Parse() 96*3f982cf4SFabien Sanglard args := flag.Args() 97*3f982cf4SFabien Sanglard if len(args) < 1 { 98*3f982cf4SFabien Sanglard log.Fatalln("Usage: osp server name; osp browse; osp fling url; osp view url") 99*3f982cf4SFabien Sanglard } 100*3f982cf4SFabien Sanglard 101*3f982cf4SFabien Sanglard ctx := context.Background() 102*3f982cf4SFabien Sanglard 103*3f982cf4SFabien Sanglard cmd := args[0] 104*3f982cf4SFabien Sanglard switch cmd { 105*3f982cf4SFabien Sanglard case "server": 106*3f982cf4SFabien Sanglard if len(args) < 2 { 107*3f982cf4SFabien Sanglard log.Fatalln("Usage: osp server name") 108*3f982cf4SFabien Sanglard } 109*3f982cf4SFabien Sanglard mdnsInstanceName := args[1] 110*3f982cf4SFabien Sanglard runServer(ctx, mdnsInstanceName, *port) 111*3f982cf4SFabien Sanglard 112*3f982cf4SFabien Sanglard case "browse": 113*3f982cf4SFabien Sanglard browseMdns(ctx) 114*3f982cf4SFabien Sanglard 115*3f982cf4SFabien Sanglard case "fling": 116*3f982cf4SFabien Sanglard if len(args) < 3 { 117*3f982cf4SFabien Sanglard log.Fatalln("Usage: osp fling target url") 118*3f982cf4SFabien Sanglard } 119*3f982cf4SFabien Sanglard target := args[1] 120*3f982cf4SFabien Sanglard url := args[2] 121*3f982cf4SFabien Sanglard 122*3f982cf4SFabien Sanglard flingUrl(ctx, target, url) 123*3f982cf4SFabien Sanglard 124*3f982cf4SFabien Sanglard case "view": 125*3f982cf4SFabien Sanglard if len(args) < 2 { 126*3f982cf4SFabien Sanglard log.Fatalln("Usage: osp view url") 127*3f982cf4SFabien Sanglard } 128*3f982cf4SFabien Sanglard 129*3f982cf4SFabien Sanglard url := args[1] 130*3f982cf4SFabien Sanglard 131*3f982cf4SFabien Sanglard viewUrl(url) 132*3f982cf4SFabien Sanglard } 133*3f982cf4SFabien Sanglard} 134