15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#include "ipc/ipc_test_sink.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_listener.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSink::TestSink() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestSink::~TestSink() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSink::Send(Message* message) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnMessageReceived(*message);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete message;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestSink::OnMessageReceived(const Message& msg) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverListBase<Listener>::Iterator it(filter_list_);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Listener* observer;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while ((observer = it.GetNext()) != NULL) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (observer->OnMessageReceived(msg))
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No filter handled the message, so store it.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_.push_back(Message(msg));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::ClearMessages() {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  messages_.clear();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetMessageAt(size_t index) const {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (index >= messages_.size())
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &messages_[index];
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetFirstMessageMatching(uint32 id) const {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < messages_.size(); i++) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (messages_[i].type() == id)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &messages_[i];
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const Message* TestSink::GetUniqueMessageMatching(uint32 id) const {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t found_index = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t found_count = 0;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < messages_.size(); i++) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (messages_[i].type() == id) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_count++;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      found_index = i;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found_count != 1)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;  // Didn't find a unique one.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &messages_[found_index];
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::AddFilter(Listener* filter) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter_list_.AddObserver(filter);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestSink::RemoveFilter(Listener* filter) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  filter_list_.RemoveObserver(filter);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace IPC
78