File: video_conferencing_routine.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (150 lines) | stat: -rw-r--r-- 5,729 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_ASH_NET_NETWORK_DIAGNOSTICS_VIDEO_CONFERENCING_ROUTINE_H_
#define CHROME_BROWSER_ASH_NET_NETWORK_DIAGNOSTICS_VIDEO_CONFERENCING_ROUTINE_H_

#include <memory>
#include <string>
#include <vector>

#include "base/containers/span.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ash/net/network_diagnostics/network_diagnostics_routine.h"
#include "chrome/browser/ash/net/network_diagnostics/tls_prober.h"
#include "chrome/browser/ash/net/network_diagnostics/udp_prober.h"
#include "net/base/net_errors.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/public/cpp/network_context_getter.h"
#include "url/gurl.h"

namespace ash {
namespace network_diagnostics {

extern const char kSupportDetails[];
extern const base::TimeDelta kTimeoutAfterHostResolution;

// Tests the device's video conferencing capabilities by testing the connection
// to a sample of Google servers used in various GVC offerings. See the
// README.md file for more details.
class VideoConferencingRoutine : public NetworkDiagnosticsRoutine {
 public:
  using UdpProberGetterCallback =
      base::RepeatingCallback<std::unique_ptr<UdpProber>(
          network::NetworkContextGetter network_context_getter,
          net::HostPortPair host_port_pair,
          base::span<const uint8_t> data,
          net::NetworkTrafficAnnotationTag tag,
          base::TimeDelta timeout_after_host_resolution,
          UdpProber::UdpProbeCompleteCallback callback)>;
  using TlsProberGetterCallback =
      base::RepeatingCallback<std::unique_ptr<TlsProber>(
          network::NetworkContextGetter network_context_getter,
          net::HostPortPair host_port_pair,
          bool negotiate_tls,
          TlsProber::TlsProbeCompleteCallback callback)>;

  // Creates a routine using a default STUN server.
  explicit VideoConferencingRoutine(
      chromeos::network_diagnostics::mojom::RoutineCallSource source);
  // Creates a routine using a custom STUN server.
  VideoConferencingRoutine(
      chromeos::network_diagnostics::mojom::RoutineCallSource source,
      const std::string& stun_server_hostname);
  VideoConferencingRoutine(const VideoConferencingRoutine&) = delete;
  VideoConferencingRoutine& operator=(const VideoConferencingRoutine&) = delete;
  ~VideoConferencingRoutine() override;

  // NetworkDiagnosticsRoutine:
  chromeos::network_diagnostics::mojom::RoutineType Type() override;
  void Run() override;
  void AnalyzeResultsAndExecuteCallback() override;

  void set_udp_prober_getter_callback_for_testing(
      UdpProberGetterCallback udp_prober_getter_callback) {
    udp_prober_getter_callback_ = std::move(udp_prober_getter_callback);
  }

  void set_tls_prober_getter_callback_for_testing(
      TlsProberGetterCallback tls_prober_getter_callback) {
    tls_prober_getter_callback_ = std::move(tls_prober_getter_callback);
  }

 private:
  // Probes the STUN server over UDP to determine whether an open port
  // connection exists.
  void ProbeStunServerOverUdp();

  // Probes the STUN server over TCP to determine whether an open port
  // connection exists.
  void ProbeStunServerOverTcp();

  // Probes media endpoints over TCP with TLS.
  void ProbeMediaHostnames();

  // Returns the network context.
  static network::mojom::NetworkContext* GetNetworkContext();

  // Creates and instance of UdpProber.
  static std::unique_ptr<UdpProber> CreateAndExecuteUdpProber(
      network::NetworkContextGetter network_context_getter,
      net::HostPortPair host_port_pair,
      base::span<const uint8_t> data,
      net::NetworkTrafficAnnotationTag tag,
      base::TimeDelta timeout_after_host_resolution,
      UdpProber::UdpProbeCompleteCallback callback);

  // Creates an instance of TlsProber.
  static std::unique_ptr<TlsProber> CreateAndExecuteTlsProber(
      network::NetworkContextGetter network_context_getter,
      net::HostPortPair host_port_pair,
      bool negotiate_tls,
      TlsProber::TlsProbeCompleteCallback callback);

  // Launches a UDP probe.
  void AttemptUdpProbe(net::HostPortPair host_port_pair);

  // Launches a TCP probe.
  void AttemptTcpProbe(net::HostPortPair host_port_pair);

  // Launches a TLS probe.
  void AttemptTlsProbe(net::HostPortPair host_port_pair);

  // Handles UDP probe completion.
  void OnUdpProbeComplete(int result, UdpProber::ProbeExitEnum probe_exit_enum);

  // Handles TCP probe completion.
  void OnTcpProbeComplete(int result, TlsProber::ProbeExitEnum probe_exit_enum);

  // Handles TLS probe completion.
  void OnTlsProbeComplete(int result, TlsProber::ProbeExitEnum probe_exit_enum);

  // Returns the weak pointer to |this|.
  base::WeakPtr<VideoConferencingRoutine> weak_ptr() {
    return weak_factory_.GetWeakPtr();
  }

  std::vector<chromeos::network_diagnostics::mojom::VideoConferencingProblem>
      problems_;
  std::string stun_server_hostname_;
  bool open_udp_port_found_ = false;
  bool open_tcp_port_found_ = false;
  bool media_hostnames_reachable_ = true;
  UdpProberGetterCallback udp_prober_getter_callback_;
  TlsProberGetterCallback tls_prober_getter_callback_;
  std::unique_ptr<UdpProber> udp_prober_;
  std::unique_ptr<TlsProber> tls_prober_;
  std::vector<int> udp_ports_;
  std::vector<int> tcp_ports_;
  std::vector<GURL> media_hostnames_;

  base::WeakPtrFactory<VideoConferencingRoutine> weak_factory_{this};
};

}  // namespace network_diagnostics
}  // namespace ash

#endif  // CHROME_BROWSER_ASH_NET_NETWORK_DIAGNOSTICS_VIDEO_CONFERENCING_ROUTINE_H_