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 #ifndef NET_SOCKET_STREAM_SOCKET_STREAM_JOB_H_ 6 #define NET_SOCKET_STREAM_SOCKET_STREAM_JOB_H_ 7 #pragma once 8 9 #include <string> 10 11 #include "base/memory/ref_counted.h" 12 #include "base/string16.h" 13 #include "net/socket_stream/socket_stream.h" 14 15 class GURL; 16 17 namespace net { 18 19 // SocketStreamJob represents full-duplex communication over SocketStream. 20 // If a protocol (e.g. WebSocket protocol) needs to inspect/modify data 21 // over SocketStream, you can implement protocol specific job (e.g. 22 // WebSocketJob) to do some work on data over SocketStream. 23 // Registers the protocol specific SocketStreamJob by RegisterProtocolFactory 24 // and call CreateSocketStreamJob to create SocketStreamJob for the URL. 25 class SocketStreamJob : public base::RefCountedThreadSafe<SocketStreamJob> { 26 public: 27 // Callback function implemented by protocol handlers to create new jobs. 28 typedef SocketStreamJob* (ProtocolFactory)(const GURL& url, 29 SocketStream::Delegate* delegate); 30 31 static ProtocolFactory* RegisterProtocolFactory(const std::string& scheme, 32 ProtocolFactory* factory); 33 34 static SocketStreamJob* CreateSocketStreamJob( 35 const GURL& url, 36 SocketStream::Delegate* delegate, 37 const URLRequestContext& context); 38 39 SocketStreamJob(); InitSocketStream(SocketStream * socket)40 void InitSocketStream(SocketStream* socket) { 41 socket_ = socket; 42 } 43 44 virtual SocketStream::UserData* GetUserData(const void* key) const; 45 virtual void SetUserData(const void* key, SocketStream::UserData* data); 46 context()47 URLRequestContext* context() const { 48 return socket_->context(); 49 } set_context(URLRequestContext * context)50 void set_context(URLRequestContext* context) { 51 socket_->set_context(context); 52 } 53 54 virtual void Connect(); 55 56 virtual bool SendData(const char* data, int len); 57 58 virtual void Close(); 59 60 virtual void RestartWithAuth(const string16& username, 61 const string16& password); 62 63 virtual void DetachDelegate(); 64 65 protected: 66 friend class WebSocketJobTest; 67 friend class base::RefCountedThreadSafe<SocketStreamJob>; 68 virtual ~SocketStreamJob(); 69 70 scoped_refptr<SocketStream> socket_; 71 72 DISALLOW_COPY_AND_ASSIGN(SocketStreamJob); 73 }; 74 75 } // namespace net 76 77 #endif // NET_SOCKET_STREAM_SOCKET_STREAM_JOB_H_ 78