Home | History | Annotate | Download | only in ipc
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ipc/ipc_test_sink.h"
      6 
      7 #include "ipc/ipc_listener.h"
      8 #include "ipc/ipc_message.h"
      9 
     10 namespace IPC {
     11 
     12 TestSink::TestSink() {
     13 }
     14 
     15 TestSink::~TestSink() {
     16 }
     17 
     18 bool TestSink::Send(Message* message) {
     19   OnMessageReceived(*message);
     20   delete message;
     21   return true;
     22 }
     23 
     24 bool TestSink::OnMessageReceived(const Message& msg) {
     25   ObserverListBase<Listener>::Iterator it(filter_list_);
     26   Listener* observer;
     27   while ((observer = it.GetNext()) != NULL) {
     28     if (observer->OnMessageReceived(msg))
     29       return true;
     30   }
     31 
     32   // No filter handled the message, so store it.
     33   messages_.push_back(Message(msg));
     34   return true;
     35 }
     36 
     37 void TestSink::ClearMessages() {
     38   messages_.clear();
     39 }
     40 
     41 const Message* TestSink::GetMessageAt(size_t index) const {
     42   if (index >= messages_.size())
     43     return NULL;
     44   return &messages_[index];
     45 }
     46 
     47 const Message* TestSink::GetFirstMessageMatching(uint32 id) const {
     48   for (size_t i = 0; i < messages_.size(); i++) {
     49     if (messages_[i].type() == id)
     50       return &messages_[i];
     51   }
     52   return NULL;
     53 }
     54 
     55 const Message* TestSink::GetUniqueMessageMatching(uint32 id) const {
     56   size_t found_index = 0;
     57   size_t found_count = 0;
     58   for (size_t i = 0; i < messages_.size(); i++) {
     59     if (messages_[i].type() == id) {
     60       found_count++;
     61       found_index = i;
     62     }
     63   }
     64   if (found_count != 1)
     65     return NULL;  // Didn't find a unique one.
     66   return &messages_[found_index];
     67 }
     68 
     69 void TestSink::AddFilter(Listener* filter) {
     70   filter_list_.AddObserver(filter);
     71 }
     72 
     73 void TestSink::RemoveFilter(Listener* filter) {
     74   filter_list_.RemoveObserver(filter);
     75 }
     76 
     77 }  // namespace IPC
     78