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