15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_PROXY_RESOURCE_MESSAGE_PARAMS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_RESOURCE_MESSAGE_PARAMS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_utils.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/serialized_handle.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common parameters for resource call and reply params structures below. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT ResourceMessageParams { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourceMessageParams(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource pp_resource() const { return pp_resource_; } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t sequence() const { return sequence_; } 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the caller doesn't take ownership of the returned handles. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<SerializedHandle>& handles() const { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handles_->data(); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes ResourceMessageParams leave its handles open, even if they weren't 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // taken using a Take.* function. After this call, no Take.* calls are 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // allowed. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ConsumeHandles() const; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the handle at the given index if it exists and is of the given 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type. The corresponding slot in the list is set to an invalid handle. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the index doesn't exist or the handle isn't of the given type, returns 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an invalid handle. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the caller is responsible for closing the returned handle, if it 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is valid. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedHandle TakeHandleOfTypeAtIndex(size_t index, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedHandle::Type type) const; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper functions to return shared memory, socket or file handles passed in 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the params struct. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the index has a valid handle of the given type, it will be placed in the 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output parameter, the corresponding slot in the list will be set to an 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalid handle, and the function will return true. If the handle doesn't 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // exist or is a different type, the functions will return false and the 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output parameter will be untouched. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: 1) the handle could still be a "null" or invalid handle of the right 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type and the functions will succeed. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2) the caller is responsible for closing the returned handle, if it 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is valid. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TakeSharedMemoryHandleAtIndex(size_t index, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle* handle) const; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool TakeSocketHandleAtIndex(size_t index, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::PlatformFileForTransit* handle) const; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool TakeFileHandleAtIndex(size_t index, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IPC::PlatformFileForTransit* handle) const; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void TakeAllSharedMemoryHandles( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::SharedMemoryHandle>* handles) const; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Appends the given handle to the list of handles sent with the call or 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reply. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AppendHandle(const SerializedHandle& handle) const; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageParams(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageParams(PP_Resource resource, int32_t sequence); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Serialize(IPC::Message* msg) const; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Deserialize(const IPC::Message* msg, PickleIterator* iter); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Writes everything except the handles to |msg|. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WriteHeader(IPC::Message* msg) const; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Writes the handles to |msg|. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WriteHandles(IPC::Message* msg) const; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Matching deserialize helpers. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ReadHeader(const IPC::Message* msg, PickleIterator* iter); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ReadHandles(const IPC::Message* msg, PickleIterator* iter); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class PPAPI_PROXY_EXPORT SerializedHandles 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public base::RefCountedThreadSafe<SerializedHandles> { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedHandles(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SerializedHandles(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_should_close(bool value) { should_close_ = value; } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SerializedHandle>& data() { return data_; } 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCountedThreadSafe<SerializedHandles>; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the handles stored in |data_| should be closed when this object 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // goes away. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is set to true by ResourceMessageParams::Deserialize(), so that the 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receiving side of the params (the host side for 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceMessageCallParams; the plugin side for 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ResourceMessageReplyParams) will close those handles which haven't been 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // taken using any of the Take*() methods. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_close_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SerializedHandle> data_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource pp_resource_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Identifier for this message. Sequence numbers are quasi-unique within a 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resource, but will overlap between different resource objects. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If you send a lot of messages, the ID may wrap around. This is OK. All IDs 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are valid and 0 and -1 aren't special, so those cases won't confuse us. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In practice, if you send more than 4 billion messages for a resource, the 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // old ones will be long gone and there will be no collisions. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If there is a malicious plugin (or exceptionally bad luck) that causes a 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wraparound and collision the worst that will happen is that we can get 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confused between different callbacks. But since these can only cause 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // confusion within the plugin and within callbacks on the same resource, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there shouldn't be a security problem. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t sequence_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A list of all handles transferred in the message. Handles go here so that 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the NaCl adapter can extract them generally when it rewrites them to 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // go between Windows and NaCl (Posix) apps. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yzshen): Mark it as mutable so that we can take/append handles using a 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // const reference. We need to change all the callers and make it not mutable. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable scoped_refptr<SerializedHandles> handles_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters common to all ResourceMessage "Call" requests. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT ResourceMessageCallParams 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ResourceMessageParams { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageCallParams(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageCallParams(PP_Resource resource, int32_t sequence); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourceMessageCallParams(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_has_callback() { has_callback_ = true; } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_callback() const { return has_callback_; } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Serialize(IPC::Message* msg) const OVERRIDE; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Deserialize(const IPC::Message* msg, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickleIterator* iter) OVERRIDE; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_callback_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Parameters common to all ResourceMessage "Reply" requests. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT ResourceMessageReplyParams 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ResourceMessageParams { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageReplyParams(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMessageReplyParams(PP_Resource resource, int32_t sequence); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ResourceMessageReplyParams(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_result(int32_t r) { result_ = r; } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result() const { return result_; } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Serialize(IPC::Message* msg) const OVERRIDE; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Deserialize(const IPC::Message* msg, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PickleIterator* iter) OVERRIDE; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Writes everything except the handles to |msg|. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WriteReplyHeader(IPC::Message* msg) const; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pepper "result code" for the callback. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> struct PPAPI_PROXY_EXPORT 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ParamTraits<ppapi::proxy::ResourceMessageCallParams> { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ppapi::proxy::ResourceMessageCallParams param_type; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Write(Message* m, const param_type& p) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.Serialize(m); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* m, PickleIterator* iter, param_type* r) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return r->Deserialize(m, iter); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(const param_type& p, std::string* l) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> struct PPAPI_PROXY_EXPORT 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ParamTraits<ppapi::proxy::ResourceMessageReplyParams> { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ppapi::proxy::ResourceMessageReplyParams param_type; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Write(Message* m, const param_type& p) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.Serialize(m); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool Read(const Message* m, PickleIterator* iter, param_type* r) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return r->Deserialize(m, iter); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Log(const param_type& p, std::string* l) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace IPC 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PPAPI_PROXY_RESOURCE_MESSAGE_PARAMS_H_ 212