// Copyright (c) 2012 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 "base/memory/weak_ptr.h"
#include "ppapi/proxy/var_serialization_rules.h"

namespace ppapi {
namespace proxy {

class PluginDispatcher;
class PluginVarTracker;

// Implementation of the VarSerializationRules 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.
  explicit PluginVarSerializationRules(
      const base::WeakPtr<PluginDispatcher>& dispatcher);
  ~PluginVarSerializationRules();

  // VarSerialization implementation.
  virtual PP_Var SendCallerOwned(const PP_Var& var);
  virtual PP_Var BeginReceiveCallerOwned(const PP_Var& var);
  virtual void EndReceiveCallerOwned(const PP_Var& var);
  virtual PP_Var ReceivePassRef(const PP_Var& var);
  virtual PP_Var BeginSendPassRef(const PP_Var& var);
  virtual void EndSendPassRef(const PP_Var& var);
  virtual void ReleaseObjectRef(const PP_Var& var);

 private:
  PluginVarTracker* var_tracker_;

  // In most cases, |dispatcher_| won't be NULL, but you should always check
  // before using it.
  // One scenario that it becomes NULL: A SerializedVar holds a ref to this
  // object, and a sync message is issued. While waiting for the reply to the
  // sync message, some incoming message causes the dispatcher to be destroyed.
  // If that happens, we may leak references to object vars. Considering that
  // scripting has been deprecated, this may not be a big issue.
  base::WeakPtr<PluginDispatcher> dispatcher_;

  DISALLOW_COPY_AND_ASSIGN(PluginVarSerializationRules);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_PLUGIN_VAR_SERIALIZATION_RULES_H_
