14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "mojo/public/cpp/bindings/message.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <stdlib.h> 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <algorithm> 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/cpp/environment/logging.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace mojo { 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Message::Message() 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : data_num_bytes_(0), 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_(NULL) { 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Message::~Message() { 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) free(data_); 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (std::vector<Handle>::iterator it = handles_.begin(); 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) it != handles_.end(); ++it) { 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (it->is_valid()) 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CloseRaw(*it); 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Message::AllocUninitializedData(uint32_t num_bytes) { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_DCHECK(!data_); 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_num_bytes_ = num_bytes; 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_ = static_cast<internal::MessageData*>(malloc(num_bytes)); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Message::AdoptData(uint32_t num_bytes, internal::MessageData* data) { 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MOJO_DCHECK(!data_); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_num_bytes_ = num_bytes; 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data_ = data; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Message::Swap(Message* other) { 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::swap(data_num_bytes_, other->data_num_bytes_); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::swap(data_, other->data_); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::swap(handles_, other->handles_); 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)MojoResult ReadAndDispatchMessage(MessagePipeHandle handle, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MessageReceiver* receiver, 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* receiver_result) { 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MojoResult rv; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32_t num_bytes = 0, num_handles = 0; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = ReadMessageRaw(handle, 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL, 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &num_bytes, 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL, 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &num_handles, 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOJO_READ_MESSAGE_FLAG_NONE); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return rv; 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Message message; 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message.AllocUninitializedData(num_bytes); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message.mutable_handles()->resize(num_handles); 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) rv = ReadMessageRaw(handle, 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message.mutable_data(), 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &num_bytes, 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) message.mutable_handles()->empty() 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ? NULL 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : reinterpret_cast<MojoHandle*>( 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &message.mutable_handles()->front()), 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &num_handles, 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MOJO_READ_MESSAGE_FLAG_NONE); 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (receiver && rv == MOJO_RESULT_OK) 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) *receiver_result = receiver->Accept(&message); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return rv; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace mojo 83