1// Copyright 2013 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 "content/child/websocket_dispatcher.h" 6 7#include <stdint.h> 8#include <map> 9 10#include "base/logging.h" 11#include "content/child/websocket_bridge.h" 12#include "content/common/websocket_messages.h" 13#include "ipc/ipc_message.h" 14#include "url/gurl.h" 15 16namespace content { 17 18WebSocketDispatcher::WebSocketDispatcher() : channel_id_max_(0) {} 19 20WebSocketDispatcher::~WebSocketDispatcher() {} 21 22int WebSocketDispatcher::AddBridge(WebSocketBridge* bridge) { 23 ++channel_id_max_; 24 bridges_.insert(std::make_pair(channel_id_max_, bridge)); 25 return channel_id_max_; 26} 27 28void WebSocketDispatcher::RemoveBridge(int channel_id) { 29 std::map<int, WebSocketBridge*>::iterator iter = bridges_.find(channel_id); 30 if (iter == bridges_.end()) { 31 DVLOG(1) << "Remove a non-existent bridge(" << channel_id << ")"; 32 return; 33 } 34 bridges_.erase(iter); 35} 36 37bool WebSocketDispatcher::OnMessageReceived(const IPC::Message& msg) { 38 switch (msg.type()) { 39 case WebSocketMsg_AddChannelResponse::ID: 40 case WebSocketMsg_NotifyStartOpeningHandshake::ID: 41 case WebSocketMsg_NotifyFinishOpeningHandshake::ID: 42 case WebSocketMsg_NotifyFailure::ID: 43 case WebSocketMsg_SendFrame::ID: 44 case WebSocketMsg_FlowControl::ID: 45 case WebSocketMsg_DropChannel::ID: 46 case WebSocketMsg_NotifyClosing::ID: 47 break; 48 default: 49 return false; 50 } 51 52 WebSocketBridge* bridge = GetBridge(msg.routing_id(), msg.type()); 53 if (!bridge) 54 return true; 55 return bridge->OnMessageReceived(msg); 56} 57 58WebSocketBridge* WebSocketDispatcher::GetBridge(int channel_id, uint32 type) { 59 std::map<int, WebSocketBridge*>::iterator iter = bridges_.find(channel_id); 60 if (iter == bridges_.end()) { 61 DVLOG(1) << "No bridge for channel_id=" << channel_id 62 << ", type=" << type; 63 return NULL; 64 } 65 return iter->second; 66} 67 68} // namespace content 69