// 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_SERIALIZED_STRUCTS_H_
#define PPAPI_PROXY_SERIALIZED_STRUCTS_H_

#include <string>
#include <vector>

#include "base/logging.h"
#include "base/memory/shared_memory.h"
#include "build/build_config.h"
#include "ppapi/c/dev/ppb_truetype_font_dev.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_point.h"
#include "ppapi/c/pp_rect.h"
#include "ppapi/c/ppb_network_list.h"
#include "ppapi/c/private/ppb_net_address_private.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/shared_impl/host_resource.h"

class Pickle;
struct PP_FontDescription_Dev;
struct PP_BrowserFont_Trusted_Description;

namespace ppapi {
namespace proxy {

// PP_FontDescription_Dev/PP_BrowserFontDescription (same definition, different
// names) has to be redefined with a string in place of the PP_Var used for the
// face name.
struct PPAPI_PROXY_EXPORT SerializedFontDescription {
  SerializedFontDescription();
  ~SerializedFontDescription();

  // Converts a PP_FontDescription_Dev to a SerializedFontDescription.
  //
  // The reference of |face| owned by the PP_FontDescription_Dev will be
  // unchanged and the caller is responsible for freeing it.
  void SetFromPPFontDescription(const PP_FontDescription_Dev& desc);
  void SetFromPPBrowserFontDescription(
      const PP_BrowserFont_Trusted_Description& desc);

  // Converts to a PP_FontDescription_Dev. The face name will have one ref
  // assigned to it. The caller is responsible for freeing it.
  void SetToPPFontDescription(PP_FontDescription_Dev* desc) const;
  void SetToPPBrowserFontDescription(
      PP_BrowserFont_Trusted_Description* desc) const;

  std::string face;
  int32_t family;
  uint32_t size;
  int32_t weight;
  PP_Bool italic;
  PP_Bool small_caps;
  int32_t letter_spacing;
  int32_t word_spacing;
};

struct PPAPI_PROXY_EXPORT SerializedNetworkInfo {
  SerializedNetworkInfo();
  ~SerializedNetworkInfo();

  std::string name;
  PP_NetworkList_Type type;
  PP_NetworkList_State state;
  std::vector<PP_NetAddress_Private> addresses;
  std::string display_name;
  int mtu;
};
typedef std::vector<SerializedNetworkInfo> SerializedNetworkList;

struct PPAPI_PROXY_EXPORT SerializedTrueTypeFontDesc {
  SerializedTrueTypeFontDesc();
  ~SerializedTrueTypeFontDesc();

  // Sets this to correspond to the contents of a PP_TrueTypeFontDesc_Dev.
  //
  // The reference count of the desc.family PP_Var will be unchanged and the
  // caller is responsible for releasing it.
  void SetFromPPTrueTypeFontDesc(const PP_TrueTypeFontDesc_Dev& desc);

  // Converts this to a PP_FontDescription_Dev.
  //
  // The desc.family PP_Var will have one reference assigned to it. The caller
  // is responsible for releasing it.
  void CopyToPPTrueTypeFontDesc(PP_TrueTypeFontDesc_Dev* desc) const;

  std::string family;
  PP_TrueTypeFontFamily_Dev generic_family;
  PP_TrueTypeFontStyle_Dev style;
  PP_TrueTypeFontWeight_Dev weight;
  PP_TrueTypeFontWidth_Dev width;
  PP_TrueTypeFontCharset_Dev charset;
};

struct SerializedDirEntry {
  std::string name;
  bool is_dir;
};

struct PPAPI_PROXY_EXPORT PPBFlash_DrawGlyphs_Params {
  PPBFlash_DrawGlyphs_Params();
  ~PPBFlash_DrawGlyphs_Params();

  PP_Instance instance;
  ppapi::HostResource image_data;
  SerializedFontDescription font_desc;
  uint32_t color;
  PP_Point position;
  PP_Rect clip;
  float transformation[3][3];
  PP_Bool allow_subpixel_aa;
  std::vector<uint16_t> glyph_indices;
  std::vector<PP_Point> glyph_advances;
};

struct PPBURLLoader_UpdateProgress_Params {
  PP_Instance instance;
  ppapi::HostResource resource;
  int64_t bytes_sent;
  int64_t total_bytes_to_be_sent;
  int64_t bytes_received;
  int64_t total_bytes_to_be_received;
};

struct PPPDecryptor_Buffer {
  ppapi::HostResource resource;
  uint32_t size;
  base::SharedMemoryHandle handle;
};

// TODO(raymes): Make ImageHandle compatible with SerializedHandle.
#if defined(OS_WIN)
typedef HANDLE ImageHandle;
#else
typedef base::SharedMemoryHandle ImageHandle;
#endif

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_SERIALIZED_STRUCTS_H_
