OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2009 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 // An implementation of WebSocketStreamHandle. |
| 6 |
| 7 #include "webkit/glue/websocketstreamhandle_impl.h" |
| 8 |
| 9 #include <vector> |
| 10 |
| 11 #include "base/compiler_specific.h" |
| 12 #include "base/logging.h" |
| 13 #include "base/ref_counted.h" |
| 14 #include "base/scoped_ptr.h" |
| 15 #include "webkit/api/public/WebData.h" |
| 16 #include "webkit/api/public/WebURL.h" |
| 17 #include "webkit/api/public/WebSocketStreamHandleClient.h" |
| 18 #include "webkit/glue/websocketstreamhandle_bridge.h" |
| 19 #include "webkit/glue/websocketstreamhandle_delegate.h" |
| 20 |
| 21 namespace webkit_glue { |
| 22 |
| 23 // WebSocketStreamHandleImpl::Context ----------------------------------------- |
| 24 |
| 25 class WebSocketStreamHandleImpl::Context |
| 26 : public base::RefCounted<Context>, |
| 27 public WebSocketStreamHandleDelegate { |
| 28 public: |
| 29 explicit Context(WebSocketStreamHandleImpl* handle); |
| 30 |
| 31 WebKit::WebSocketStreamHandleClient* client() const { return client_; } |
| 32 void set_client(WebKit::WebSocketStreamHandleClient* client) { |
| 33 client_ = client; |
| 34 } |
| 35 |
| 36 void Connect(const WebKit::WebURL& url); |
| 37 bool Send(const WebKit::WebData& data); |
| 38 void Close(); |
| 39 |
| 40 // WebSocketStreamHandleDelegate methods: |
| 41 virtual void WillOpenStream(WebKit::WebSocketStreamHandle*, const GURL&); |
| 42 virtual void DidOpenStream(WebKit::WebSocketStreamHandle*, int); |
| 43 virtual void DidSendData(WebKit::WebSocketStreamHandle*, int); |
| 44 virtual void DidReceiveData( |
| 45 WebKit::WebSocketStreamHandle*, const char*, int); |
| 46 virtual void DidClose(WebKit::WebSocketStreamHandle*); |
| 47 |
| 48 private: |
| 49 friend class base::RefCounted<Context>; |
| 50 ~Context() {} |
| 51 |
| 52 WebSocketStreamHandleImpl* handle_; |
| 53 WebKit::WebSocketStreamHandleClient* client_; |
| 54 WebSocketStreamHandleBridge* bridge_; |
| 55 |
| 56 DISALLOW_COPY_AND_ASSIGN(Context); |
| 57 }; |
| 58 |
| 59 WebSocketStreamHandleImpl::Context::Context(WebSocketStreamHandleImpl* handle) |
| 60 : handle_(handle), |
| 61 client_(NULL), |
| 62 bridge_(ALLOW_THIS_IN_INITIALIZER_LIST( |
| 63 WebSocketStreamHandleBridge::Create(handle_, this))) { |
| 64 } |
| 65 |
| 66 void WebSocketStreamHandleImpl::Context::Connect(const WebKit::WebURL& url) { |
| 67 LOG(INFO) << "Connect url=" << url; |
| 68 DCHECK(bridge_); |
| 69 bridge_->Connect(url); |
| 70 } |
| 71 |
| 72 bool WebSocketStreamHandleImpl::Context::Send(const WebKit::WebData& data) { |
| 73 LOG(INFO) << "Send data.size=" << data.size(); |
| 74 DCHECK(bridge_); |
| 75 return bridge_->Send( |
| 76 std::vector<char>(data.data(), data.data() + data.size())); |
| 77 } |
| 78 |
| 79 void WebSocketStreamHandleImpl::Context::Close() { |
| 80 LOG(INFO) << "Close"; |
| 81 if (bridge_) |
| 82 bridge_->Close(); |
| 83 } |
| 84 |
| 85 void WebSocketStreamHandleImpl::Context::WillOpenStream( |
| 86 WebKit::WebSocketStreamHandle* web_handle, const GURL& url) { |
| 87 LOG(INFO) << "WillOpenStream url=" << url; |
| 88 if (client_) |
| 89 client_->willOpenStream(handle_, url); |
| 90 } |
| 91 |
| 92 void WebSocketStreamHandleImpl::Context::DidOpenStream( |
| 93 WebKit::WebSocketStreamHandle* web_handle, int max_amount_send_allowed) { |
| 94 LOG(INFO) << "DidOpen"; |
| 95 if (client_) |
| 96 client_->didOpenStream(handle_, max_amount_send_allowed); |
| 97 } |
| 98 |
| 99 void WebSocketStreamHandleImpl::Context::DidSendData( |
| 100 WebKit::WebSocketStreamHandle* web_handle, int amount_sent) { |
| 101 if (client_) |
| 102 client_->didSendData(handle_, amount_sent); |
| 103 } |
| 104 |
| 105 void WebSocketStreamHandleImpl::Context::DidReceiveData( |
| 106 WebKit::WebSocketStreamHandle* web_handle, const char* data, int size) { |
| 107 if (client_) |
| 108 client_->didReceiveData(handle_, WebKit::WebData(data, size)); |
| 109 } |
| 110 |
| 111 void WebSocketStreamHandleImpl::Context::DidClose( |
| 112 WebKit::WebSocketStreamHandle* web_handle) { |
| 113 LOG(INFO) << "DidClose"; |
| 114 bridge_ = 0; |
| 115 WebSocketStreamHandleImpl* handle = handle_; |
| 116 handle_ = 0; |
| 117 if (client_) { |
| 118 WebKit::WebSocketStreamHandleClient* client = client_; |
| 119 client_ = NULL; |
| 120 client->didClose(handle); |
| 121 } |
| 122 } |
| 123 |
| 124 // WebSocketStreamHandleImpl ------------------------------------------------ |
| 125 |
| 126 WebSocketStreamHandleImpl::WebSocketStreamHandleImpl() |
| 127 : ALLOW_THIS_IN_INITIALIZER_LIST(context_(new Context(this))) { |
| 128 } |
| 129 |
| 130 WebSocketStreamHandleImpl::~WebSocketStreamHandleImpl() { |
| 131 close(); |
| 132 } |
| 133 |
| 134 void WebSocketStreamHandleImpl::connect( |
| 135 const WebKit::WebURL& url, WebKit::WebSocketStreamHandleClient* client) { |
| 136 LOG(INFO) << "connect url=" << url; |
| 137 DCHECK(!context_->client()); |
| 138 context_->set_client(client); |
| 139 |
| 140 context_->Connect(url); |
| 141 } |
| 142 |
| 143 bool WebSocketStreamHandleImpl::send(const WebKit::WebData& data) { |
| 144 return context_->Send(data); |
| 145 } |
| 146 |
| 147 void WebSocketStreamHandleImpl::close() { |
| 148 context_->Close(); |
| 149 } |
| 150 |
| 151 } // namespace webkit_glue |
OLD | NEW |