Var serialization-related proxy stuff. This allows vars to be sent over IPC
and received with proper refcounting semantics.

The basic design is that the SerializedVar is the thing actually handled by
IPC. Then you use one of the many helper classes depending on whether you are
sending or receiving and what the ownership semantics are. The helper classes,
along with the VarSerialization interface makes the right thing happen for
string conversion & refcounting.

The VarSerialization class is implemented differently on the browser and plugin
side and is where the differences in refcounting & strings are handled. This
allows the rest of the code to be the same on both the plugin and browser side
and allows vars to be sent back and forth.

This patch references some files not in it like the dispatcher and various
tracker classes. This is the cleanest cut I could make for a reasonably
reviewable chunk.
Review URL: http://codereview.chromium.org/4096008

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65262 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/proxy/plugin_var_serialization_rules.h b/ppapi/proxy/plugin_var_serialization_rules.h
new file mode 100644
index 0000000..6f302f2
--- /dev/null
+++ b/ppapi/proxy/plugin_var_serialization_rules.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2010 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_PROXY_PLUGIN_VAR_SERIALIZATION_RULES_H_
+#define PPAPI_PROXY_PLUGIN_VAR_SERIALIZATION_RULES_H_
+
+#include "base/basictypes.h"
+#include "ppapi/proxy/var_serialization_rules.h"
+
+namespace pp {
+namespace proxy {
+
+class PluginVarTracker;
+
+// Implementation of the VarSerialization interface for the plugin.
+class PluginVarSerializationRules : public VarSerializationRules {
+ public:
+  // This class will use the given non-owning pointer to the var tracker to
+  // handle object refcounting and string conversion.
+  PluginVarSerializationRules(PluginVarTracker* tracker);
+  ~PluginVarSerializationRules();
+
+  // VarSerialization implementation.
+  virtual void SendCallerOwned(const PP_Var& var, std::string* str_val);
+  virtual PP_Var BeginReceiveCallerOwned(const PP_Var& var,
+                                         const std::string* str_val);
+  virtual void EndReceiveCallerOwned(const PP_Var& var);
+  virtual PP_Var ReceivePassRef(const PP_Var& var,
+                                const std::string& str_val);
+  virtual void BeginSendPassRef(const PP_Var& var, std::string* str_val);
+  virtual void EndSendPassRef(const PP_Var& var);
+  virtual void ReleaseObjectRef(const PP_Var& var);
+
+ private:
+  PluginVarTracker* var_tracker_;
+
+  DISALLOW_COPY_AND_ASSIGN(PluginVarSerializationRules);
+};
+
+}  // namespace proxy
+}  // namespace pp
+
+#endif  // PPAPI_PROXY_PLUGIN_VAR_SERIALIZATION_RULES_H_