- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / shared_impl / var.h
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef PPAPI_SHARED_IMPL_VAR_H_
6 #define PPAPI_SHARED_IMPL_VAR_H_
7
8 #include <string>
9
10 #include "base/compiler_specific.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/shared_memory.h"
13 #include "base/platform_file.h"
14 #include "ppapi/c/pp_var.h"
15 #include "ppapi/shared_impl/host_resource.h"
16 #include "ppapi/shared_impl/ppapi_shared_export.h"
17
18 namespace ppapi {
19
20 class ArrayBufferVar;
21 class ArrayVar;
22 class DictionaryVar;
23 class NPObjectVar;
24 class ProxyObjectVar;
25 class ResourceVar;
26 class StringVar;
27 class VarTracker;
28
29 // Var -------------------------------------------------------------------------
30
31 // Represents a non-POD var.
32 class PPAPI_SHARED_EXPORT Var : public base::RefCounted<Var> {
33  public:
34   // Returns a string representing the given var for logging purposes.
35   static std::string PPVarToLogString(PP_Var var);
36
37   virtual StringVar* AsStringVar();
38   virtual ArrayBufferVar* AsArrayBufferVar();
39   virtual NPObjectVar* AsNPObjectVar();
40   virtual ProxyObjectVar* AsProxyObjectVar();
41   virtual ArrayVar* AsArrayVar();
42   virtual DictionaryVar* AsDictionaryVar();
43   virtual ResourceVar* AsResourceVar();
44
45   // Creates a PP_Var corresponding to this object. The return value will have
46   // one reference addrefed on behalf of the caller.
47   PP_Var GetPPVar();
48
49   // Returns the type of this var.
50   virtual PP_VarType GetType() const = 0;
51
52   // Returns the ID corresponing to the string or object if it exists already,
53   // or 0 if an ID hasn't been generated for this object (the plugin is holding
54   // no refs).
55   //
56   // Contrast to GetOrCreateVarID which creates the ID and a ref on behalf of
57   // the plugin.
58   int32 GetExistingVarID() const;
59
60  protected:
61   friend class base::RefCounted<Var>;
62   friend class VarTracker;
63
64   Var();
65   virtual ~Var();
66
67   // Returns the unique ID associated with this string or object, creating it
68   // if necessary. The return value will be 0 if the string or object is
69   // invalid.
70   //
71   // This function will take a reference to the var that will be passed to the
72   // caller.
73   int32 GetOrCreateVarID();
74
75   // Sets the internal object ID. This assumes that the ID hasn't been set
76   // before. This is used in cases where the ID is generated externally.
77   void AssignVarID(int32 id);
78
79   // Reset the assigned object ID.
80   void ResetVarID() { var_id_ = 0; }
81
82  private:
83   // This will be 0 if no ID has been assigned (this happens lazily).
84   int32 var_id_;
85
86   DISALLOW_COPY_AND_ASSIGN(Var);
87 };
88
89 // StringVar -------------------------------------------------------------------
90
91 // Represents a string-based Var.
92 //
93 // Returning a given string as a PP_Var:
94 //   return StringVar::StringToPPVar(my_string);
95 //
96 // Converting a PP_Var to a string:
97 //   StringVar* string = StringVar::FromPPVar(var);
98 //   if (!string)
99 //     return false;  // Not a string or an invalid var.
100 //   DoSomethingWithTheString(string->value());
101 class PPAPI_SHARED_EXPORT StringVar : public Var {
102  public:
103   explicit StringVar(const std::string& str);
104   StringVar(const char* str, uint32 len);
105   virtual ~StringVar();
106
107   const std::string& value() const { return value_; }
108   // Return a pointer to the internal string. This allows other objects to
109   // temporarily store a weak pointer to our internal string. Use with care; the
110   // pointer *will* become invalid if this StringVar is removed from the
111   // tracker. (All of this applies to value(), but this one's even easier to use
112   // dangerously).
113   const std::string* ptr() const { return &value_; }
114
115   // Var override.
116   virtual StringVar* AsStringVar() OVERRIDE;
117   virtual PP_VarType GetType() const OVERRIDE;
118
119   // Helper function to create a PP_Var of type string that contains a copy of
120   // the given string. The input data must be valid UTF-8 encoded text, if it
121   // is not valid UTF-8, a NULL var will be returned.
122   //
123   // The return value will have a reference count of 1. Internally, this will
124   // create a StringVar and return the reference to it in the var.
125   static PP_Var StringToPPVar(const std::string& str);
126   static PP_Var StringToPPVar(const char* str, uint32 len);
127
128   // Same as StringToPPVar but avoids a copy by destructively swapping the
129   // given string into the newly created StringVar. The string must already be
130   // valid UTF-8. After the call, *src will be empty.
131   static PP_Var SwapValidatedUTF8StringIntoPPVar(std::string* src);
132
133   // Helper function that converts a PP_Var to a string. This will return NULL
134   // if the PP_Var is not of string type or the string is invalid.
135   static StringVar* FromPPVar(PP_Var var);
136
137  private:
138   StringVar();  // Makes an empty string.
139
140   std::string value_;
141
142   DISALLOW_COPY_AND_ASSIGN(StringVar);
143 };
144
145 // ArrayBufferVar --------------------------------------------------------------
146
147 // Represents an array buffer Var.
148 //
149 // Note this is an abstract class. To create an appropriate concrete one, you
150 // need to use the VarTracker:
151 //   VarArrayBuffer* buf =
152 //       PpapiGlobals::Get()->GetVarTracker()->CreateArrayBuffer(size);
153 //
154 // Converting a PP_Var to an ArrayBufferVar:
155 //   ArrayBufferVar* array = ArrayBufferVar::FromPPVar(var);
156 //   if (!array)
157 //     return false;  // Not an ArrayBuffer or an invalid var.
158 //   DoSomethingWithTheBuffer(array);
159 class PPAPI_SHARED_EXPORT ArrayBufferVar : public Var {
160  public:
161   ArrayBufferVar();
162   virtual ~ArrayBufferVar();
163
164   virtual void* Map() = 0;
165   virtual void Unmap() = 0;
166   virtual uint32 ByteLength() = 0;
167
168   // Creates a new shared memory region, and copies the data in the
169   // ArrayBufferVar into it. On the plugin side, host_shm_handle_id will be set
170   // to some value that is not -1. On the host side, plugin_shm_handle will be
171   // set to a valid SharedMemoryHandle.
172   //
173   // Returns true if creating the shared memory (and copying) is successful,
174   // false otherwise.
175   virtual bool CopyToNewShmem(
176       PP_Instance instance,
177       int *host_shm_handle_id,
178       base::SharedMemoryHandle *plugin_shm_handle) = 0;
179
180   // Var override.
181   virtual ArrayBufferVar* AsArrayBufferVar() OVERRIDE;
182   virtual PP_VarType GetType() const OVERRIDE;
183
184   // Helper function that converts a PP_Var to an ArrayBufferVar. This will
185   // return NULL if the PP_Var is not of ArrayBuffer type.
186   static ArrayBufferVar* FromPPVar(PP_Var var);
187
188  private:
189   DISALLOW_COPY_AND_ASSIGN(ArrayBufferVar);
190 };
191
192 }  // namespace ppapi
193
194 #endif  // PPAPI_SHARED_IMPL_VAR_H_