root/chrome/renderer/pepper/pepper_shared_memory_message_filter.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. host_
  2. OnInstanceMessageReceived
  3. Send
  4. OnHostMsgCreateSharedMemory

// Copyright (c) 2013 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.

#include "chrome/renderer/pepper/pepper_shared_memory_message_filter.h"

#include "base/memory/scoped_ptr.h"
#include "base/memory/shared_memory.h"
#include "base/process/process_handle.h"
#include "content/public/common/content_client.h"
#include "content/public/renderer/pepper_plugin_instance.h"
#include "content/public/renderer/render_thread.h"
#include "content/public/renderer/renderer_ppapi_host.h"
#include "ppapi/host/ppapi_host.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/var_tracker.h"

PepperSharedMemoryMessageFilter::PepperSharedMemoryMessageFilter(
    content::RendererPpapiHost* host)
    : InstanceMessageFilter(host->GetPpapiHost()),
      host_(host) {
}

PepperSharedMemoryMessageFilter::~PepperSharedMemoryMessageFilter() {
}

bool PepperSharedMemoryMessageFilter::OnInstanceMessageReceived(
    const IPC::Message& msg) {
  bool handled = true;
  IPC_BEGIN_MESSAGE_MAP(PepperSharedMemoryMessageFilter, msg)
    IPC_MESSAGE_HANDLER(PpapiHostMsg_SharedMemory_CreateSharedMemory,
                        OnHostMsgCreateSharedMemory)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}

bool PepperSharedMemoryMessageFilter::Send(IPC::Message* msg) {
  return host_->GetPpapiHost()->Send(msg);
}

void PepperSharedMemoryMessageFilter::OnHostMsgCreateSharedMemory(
    PP_Instance instance,
    uint32_t size,
    int* host_handle_id,
    ppapi::proxy::SerializedHandle* plugin_handle) {
  plugin_handle->set_null_shmem();
  *host_handle_id = -1;
  scoped_ptr<base::SharedMemory> shm(content::RenderThread::Get()->
      HostAllocateSharedMemoryBuffer(size).Pass());
  if (!shm.get())
    return;

  base::SharedMemoryHandle host_shm_handle;
  shm->ShareToProcess(base::GetCurrentProcessHandle(), &host_shm_handle);
  *host_handle_id = content::PepperPluginInstance::Get(instance)->
      GetVarTracker()->TrackSharedMemoryHandle(instance, host_shm_handle, size);

  base::PlatformFile host_handle =
#if defined(OS_WIN)
      host_shm_handle;
#elif defined(OS_POSIX)
      host_shm_handle.fd;
#else
  #error Not implemented.
#endif
  // We set auto_close to false since we need our file descriptor to
  // actually be duplicated on linux. The shared memory destructor will
  // close the original handle for us.
  plugin_handle->set_shmem(
      host_->ShareHandleWithRemote(host_handle, false), size);
}

/* [<][>][^][v][top][bottom][index][help] */