#ifndef PPAPI_PROXY_RAW_VAR_DATA_H_
#define PPAPI_PROXY_RAW_VAR_DATA_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/functional/callback.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/proxy/ppapi_param_traits.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/proxy/serialized_handle.h"
namespace base {
class Pickle;
class PickleIterator;
}
namespace IPC {
class Message;
}
namespace ppapi {
namespace proxy {
class RawVarData;
typedef base::RepeatingCallback<void(base::Pickle*, const SerializedHandle&)>
HandleWriter;
class PPAPI_PROXY_EXPORT RawVarDataGraph {
public:
static std::unique_ptr<RawVarDataGraph> Create(const PP_Var& var,
PP_Instance instance);
RawVarDataGraph();
RawVarDataGraph(const RawVarDataGraph&) = delete;
RawVarDataGraph& operator=(const RawVarDataGraph&) = delete;
~RawVarDataGraph();
PP_Var CreatePPVar(PP_Instance instance);
void Write(base::Pickle* m, const HandleWriter& handle_writer);
static std::unique_ptr<RawVarDataGraph> Read(const base::Pickle* m,
base::PickleIterator* iter);
std::vector<SerializedHandle*> GetHandles();
static void SetMinimumArrayBufferSizeForShmemForTest(uint32_t threshold);
private:
std::vector<std::unique_ptr<RawVarData>> data_;
};
class RawVarData {
public:
static RawVarData* Create(PP_VarType type);
RawVarData();
virtual ~RawVarData();
virtual PP_VarType Type() = 0;
virtual bool Init(const PP_Var& var, PP_Instance instance) = 0;
virtual PP_Var CreatePPVar(PP_Instance instance) = 0;
virtual void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) = 0;
virtual void Write(base::Pickle* m, const HandleWriter& handle_writer) = 0;
virtual bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) = 0;
virtual SerializedHandle* GetHandle();
bool initialized() { return initialized_; }
protected:
bool initialized_;
};
class BasicRawVarData : public RawVarData {
public:
BasicRawVarData();
~BasicRawVarData() override;
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
private:
PP_Var var_;
};
class StringRawVarData : public RawVarData {
public:
StringRawVarData();
~StringRawVarData() override;
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
private:
std::string data_;
};
class ArrayBufferRawVarData : public RawVarData {
public:
enum ShmemType {
ARRAY_BUFFER_NO_SHMEM,
ARRAY_BUFFER_SHMEM_HOST,
ARRAY_BUFFER_SHMEM_PLUGIN,
};
ArrayBufferRawVarData();
~ArrayBufferRawVarData() override;
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
SerializedHandle* GetHandle() override;
private:
ShmemType type_;
std::string data_;
int host_shm_handle_id_;
SerializedHandle plugin_shm_handle_;
};
class ArrayRawVarData : public RawVarData {
public:
ArrayRawVarData();
~ArrayRawVarData() override;
void AddChild(size_t element);
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
private:
std::vector<size_t> children_;
};
class DictionaryRawVarData : public RawVarData {
public:
DictionaryRawVarData();
~DictionaryRawVarData() override;
void AddChild(const std::string& key, size_t value);
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
private:
std::vector<std::pair<std::string, size_t> > children_;
};
class ResourceRawVarData : public RawVarData {
public:
ResourceRawVarData();
~ResourceRawVarData() override;
PP_VarType Type() override;
bool Init(const PP_Var& var, PP_Instance instance) override;
PP_Var CreatePPVar(PP_Instance instance) override;
void PopulatePPVar(const PP_Var& var,
const std::vector<PP_Var>& graph) override;
void Write(base::Pickle* m, const HandleWriter& handle_writer) override;
bool Read(PP_VarType type,
const base::Pickle* m,
base::PickleIterator* iter) override;
private:
PP_Resource pp_resource_;
int pending_renderer_host_id_;
int pending_browser_host_id_;
std::unique_ptr<IPC::Message> creation_message_;
};
}
}
#endif