summaryrefslogtreecommitdiff
path: root/chromium/ppapi/cpp/vpn_provider.h
blob: 12fbd50e5815ebf5b99d65c96cbc862cd96610f4 (plain)
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
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_CPP_VPN_PROVIDER_H_
#define PPAPI_CPP_VPN_PROVIDER_H_

#include "ppapi/c/ppb_vpn_provider.h"
#include "ppapi/cpp/completion_callback.h"

namespace pp {

class InstanceHandle;

/// @file
/// This file defines the VpnProvider interface providing a way to implement a
/// VPN client.
/// Important: This API is available only on Chrome OS.

/// The <code>VpnProvider</code> class enhances the
/// <code>chrome.vpnProvider</code> JavaScript API by providing a high
/// performance path for packet handling.
///
/// Permissions: Apps permission <code>vpnProvider</code> is required for
/// <code>VpnProvider.Bind()</code>.
///
/// Typical usage:
/// - Create a <code>VpnProvider</code> instance.
/// - Register the callback for <code>VpnProvider.ReceivePacket()</code>.
/// - In the extension follow the usual workflow for configuring a VPN
///   connection via the <code>chrome.vpnProvider</code> API until the step for
///   notifying the connection state as "connected".
/// - Bind to the previously created connection using
///   <code>VpnProvider.Bind()</code>.
/// - Notify the connection state as "connected" from JavaScript using
///   <code>chrome.vpnProvider.notifyConnectionStateChanged</code>.
/// - When the steps above are completed without errors, a virtual tunnel is
///   created to the network stack of Chrome OS. IP packets can be sent through
///   the tunnel using <code>VpnProvider.SendPacket()</code> and any packets
///   originating on the Chrome OS device will be received using the callback
///   registered for <code>VpnProvider.ReceivePacket()</code>.
/// - When the user disconnects from the VPN configuration or there is an error
///   the extension will be notfied via
///   <code>chrome.vpnProvider.onPlatformMessage</code>.
class VpnProvider : public Resource {
 public:
  /// Constructs a VpnProvider object.
  ///
  /// @param[in] instance The instance with which this resource will be
  /// associated.
  explicit VpnProvider(const InstanceHandle& instance);

  /// Destructs a VpnProvider object.
  virtual ~VpnProvider();

  /// Static function for determining whether the browser supports the
  /// <code>VpnProvider</code> interface.
  ///
  /// @return true if the interface is available, false otherwise.
  static bool IsAvailable();

  /// Binds to an existing configuration created from JavaScript by
  /// <code>chrome.vpnProvider.createConfig</code>. All packets will be routed
  /// via <code>SendPacket</code> and <code>ReceivePacket</code>. The user
  /// should register the callback for <code>ReceivePacket</code> before calling
  /// <code>Bind()</code>.
  ///
  /// @param[in] configuration_id The configuration id from the callback of
  /// <code>chrome.vpnProvider.createConfig</code>. This <code>Var</code> must
  /// be of string type.
  ///
  /// @param[in] configuration_name The configuration name as defined by the
  /// user when calling <code>chrome.vpnProvider.createConfig</code>. This
  /// <code>Var</code> must be of string type.
  ///
  /// @param[in] callback A <code>CompletionCallback</code> to be called on
  /// completion.
  ///
  /// @return An int32_t containing an error code from <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to
  /// <code>Bind()</code> has not completed.
  /// Returns <code>PP_ERROR_BADARGUMENT</code> if the <code>Var</code> type of
  /// either <code>configuration_id</code> or <code>configuration_name</code> is
  /// not of string type.
  /// Returns <code>PP_ERROR_NOACCESS</code> if the caller does the have the
  /// required "vpnProvider" permission.
  /// Returns <code>PP_ERROR_FAILED</code> if <code>connection_id</code> and
  /// <code>connection_name</code> could not be matched with the existing
  /// connection, or if the plugin originates from a different extension than
  /// the one that created the connection.
  int32_t Bind(const Var& configuration_id,
               const Var& configuration_name,
               const CompletionCallback& callback);

  /// Sends an IP packet through the tunnel created for the VPN session. This
  /// will succeed only when the VPN session is owned by the module and
  /// connection is bound.
  ///
  /// @param[in] packet IP packet to be sent to the platform. The
  /// <code>Var</code> must be of ArrayBuffer type.
  ///
  /// @param[in] callback A <code>CompletionCallback</code> to be called on
  /// completion.
  ///
  /// @return An int32_t containing an error code from <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_FAILED</code> if the connection is not bound.
  /// Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to
  /// <code>SendPacket()</code> has not completed.
  /// Returns <code>PP_ERROR_BADARGUMENT</code> if the <code>Var</code> type of
  /// <code>packet</code> is not of ArrayBuffer type.
  int32_t SendPacket(const Var& packet, const CompletionCallback& callback);

  /// Receives an IP packet from the tunnel for the VPN session. This function
  /// only returns a single packet. That is, this function must be called at
  /// least N times to receive N packets, no matter the size of each packet. The
  /// callback should be registered before calling <code>Bind()</code>.
  ///
  /// @param[in] callback A <code>CompletionCallbackWithOutput</code> to be
  /// called upon completion of ReceivePacket. It will be passed an ArrayBuffer
  /// type <code>Var</code> containing an IP packet to be sent to the platform.
  ///
  /// @return An int32_t containing an error code from <code>pp_errors.h</code>.
  /// Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to
  /// <code>ReceivePacket()</code> has not completed.
  int32_t ReceivePacket(const CompletionCallbackWithOutput<Var>& callback);

 private:
  InstanceHandle associated_instance_;
};

}  // namespace pp

#endif  // PPAPI_CPP_VPN_PROVIDER_H_