chromium/native_client_sdk/src/examples/api/vpn_provider/vpn_provider_helper.h

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXAMPLES_API_VPN_PROVIDER_VPN_PROVIDER_HELPER_H_
#define EXAMPLES_API_VPN_PROVIDER_VPN_PROVIDER_HELPER_H_

#include <stdint.h>

#include <queue>
#include <string>

#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/var.h"
#include "ppapi/cpp/vpn_provider.h"
#include "ppapi/utility/completion_callback_factory.h"
#include "ppapi/utility/threading/simple_thread.h"

// Helper class that keeps VpnPacket handling in its own thread.
class VpnProviderHelper {
 public:
  explicit VpnProviderHelper(pp::Instance* instance);

  void Init();
  void Bind(const std::string& config_name, const std::string& config_id);
  void SendPacket(const pp::Var& data);

 private:
  void InitOnThread(int32_t result);
  void BindOnThread(int32_t result,
                    const std::string& config,
                    const std::string& name);
  void SendPacketOnThread(int32_t result, const pp::Var& data);

  // Completion Callbacks
  void BindCompletionCallback(int32_t result);
  void ReceivePacketCompletionCallback(int32_t result, const pp::Var& packet);
  void SendPacketCompletionCallback(int32_t result);

  pp::Instance* instance_;
  pp::SimpleThread thread_;
  pp::VpnProvider vpn_;
  pp::CompletionCallbackFactory<VpnProviderHelper> factory_;

  bool send_packet_pending_;
  std::queue<pp::Var> send_packet_queue_;

  std::string config_name_;
  std::string config_id_;
};

#endif  // EXAMPLES_API_VPN_PROVIDER_VPN_PROVIDER_HELPER_H_