168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/child/websocket_dispatcher.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <stdint.h> 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <map> 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/child/websocket_bridge.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/common/websocket_messages.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ipc/ipc_message.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "url/gurl.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace content { 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)WebSocketDispatcher::WebSocketDispatcher() : channel_id_max_(0) {} 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)WebSocketDispatcher::~WebSocketDispatcher() {} 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int WebSocketDispatcher::AddBridge(WebSocketBridge* bridge) { 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ++channel_id_max_; 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bridges_.insert(std::make_pair(channel_id_max_, bridge)); 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return channel_id_max_; 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void WebSocketDispatcher::RemoveBridge(int channel_id) { 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::map<int, WebSocketBridge*>::iterator iter = bridges_.find(channel_id); 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (iter == bridges_.end()) { 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(1) << "Remove a non-existent bridge(" << channel_id << ")"; 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bridges_.erase(iter); 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool WebSocketDispatcher::OnMessageReceived(const IPC::Message& msg) { 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) switch (msg.type()) { 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case WebSocketMsg_AddChannelResponse::ID: 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case WebSocketMsg_NotifyStartOpeningHandshake::ID: 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case WebSocketMsg_NotifyFinishOpeningHandshake::ID: 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case WebSocketMsg_NotifyFailure::ID: 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case WebSocketMsg_SendFrame::ID: 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case WebSocketMsg_FlowControl::ID: 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) case WebSocketMsg_DropChannel::ID: 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WebSocketMsg_NotifyClosing::ID: 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) default: 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) WebSocketBridge* bridge = GetBridge(msg.routing_id(), msg.type()); 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!bridge) 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return bridge->OnMessageReceived(msg); 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)WebSocketBridge* WebSocketDispatcher::GetBridge(int channel_id, uint32 type) { 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::map<int, WebSocketBridge*>::iterator iter = bridges_.find(channel_id); 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (iter == bridges_.end()) { 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(1) << "No bridge for channel_id=" << channel_id 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << ", type=" << type; 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return NULL; 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return iter->second; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace content 69