xref: /aosp_15_r20/external/openscreen/osp/go/cmd/osp.go (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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