Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3745)

Unified Diff: components/cast_channel/cast_socket.h

Issue 2942993003: [cast_channel] Make CastMessageHandler a CastSocket::Observer instead of CastTransport::Delegate (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/cast_channel/cast_socket.h
diff --git a/components/cast_channel/cast_socket.h b/components/cast_channel/cast_socket.h
index 6afee6a91bb34101507820d7478776f5d6f3a2a4..af29832ba19370002abb034986e142aa5430aeb2 100644
--- a/components/cast_channel/cast_socket.h
+++ b/components/cast_channel/cast_socket.h
@@ -55,6 +55,19 @@ enum CastDeviceCapability {
// Public interface of the CastSocket class.
class CastSocket {
public:
+ class Observer {
+ public:
+ virtual ~Observer() {}
+
+ // Invoked when an error occurs on |socket|.
+ virtual void OnError(const CastSocket& socket,
+ cast_channel::ChannelError error_state) = 0;
+
+ // Invoked when |socket| receives a message.
+ virtual void OnMessage(const CastSocket& socket,
+ const cast_channel::CastMessage& message) = 0;
+ };
+
virtual ~CastSocket() {}
// Used by BrowserContextKeyedAPIFactory.
@@ -68,10 +81,8 @@ class CastSocket {
// If the CastSocket is destroyed while the connection is pending, |callback|
// will be invoked with CHANNEL_ERROR_UNKNOWN. In this case, invoking
// |callback| must not result in any re-entrancy behavior.
- // |delegate| receives message receipt and error events.
// Ownership of |delegate| is transferred to this CastSocket.
- virtual void Connect(std::unique_ptr<CastTransport::Delegate> delegate,
- base::Callback<void(ChannelError)> callback) = 0;
+ virtual void Connect(base::Callback<void(ChannelError)> callback) = 0;
// Closes the channel if not already closed. On completion, the channel will
// be in READY_STATE_CLOSED.
@@ -112,6 +123,14 @@ class CastSocket {
// Returns a pointer to the socket's message transport layer. Can be used to
// send and receive CastMessages over the socket.
virtual CastTransport* transport() const = 0;
+
+ // Returns true if current socket has an observer with |id|.
+ virtual bool HasObserver(const std::string& id) = 0;
imcheng 2017/06/16 23:39:25 I'm not sure if we need to associate an id with an
zhaobin 2017/06/20 00:54:36 Done.
+
+ // Register |observer| with current socket to receive message receipt
+ // and error events.
+ virtual void AddObserver(const std::string& id,
+ std::unique_ptr<Observer> observer) = 0;
imcheng 2017/06/16 23:39:25 It's a bit unusual to take ownership of observers.
zhaobin 2017/06/20 00:54:36 Make CastSocketService own observers.
};
// This class implements a channel between Chrome and a Cast device using a TCP
@@ -153,8 +172,7 @@ class CastSocketImpl : public CastSocket {
~CastSocketImpl() override;
// CastSocket interface.
- void Connect(std::unique_ptr<CastTransport::Delegate> delegate,
- base::Callback<void(ChannelError)> callback) override;
+ void Connect(base::Callback<void(ChannelError)> callback) override;
CastTransport* transport() const override;
void Close(const net::CompletionCallback& callback) override;
const net::IPEndPoint& ip_endpoint() const override;
@@ -164,6 +182,9 @@ class CastSocketImpl : public CastSocket {
ChannelError error_state() const override;
bool keep_alive() const override;
bool audio_only() const override;
+ bool HasObserver(const std::string& id) override;
+ void AddObserver(const std::string& id,
+ std::unique_ptr<Observer> observer) override;
protected:
// CastTransport::Delegate methods for receiving handshake messages.
@@ -189,6 +210,22 @@ class CastSocketImpl : public CastSocket {
LastError last_error_;
};
+ // CastTransport::Delegate methods to receive normal messages and errors.
+ class CastSocketMessageDelegate : public CastTransport::Delegate {
+ public:
+ CastSocketMessageDelegate(cast_channel::CastSocketImpl* socket);
+ ~CastSocketMessageDelegate() override;
+
+ // CastTransport::Delegate implementation.
+ void OnError(cast_channel::ChannelError error_state) override;
+ void OnMessage(const cast_channel::CastMessage& message) override;
+ void Start() override;
+
+ private:
+ CastSocketImpl* const socket_;
+ DISALLOW_COPY_AND_ASSIGN(CastSocketMessageDelegate);
+ };
+
// Replaces the internally-constructed transport object with one provided
// by the caller (e.g. a mock).
void SetTransportForTesting(std::unique_ptr<CastTransport> transport);
@@ -204,7 +241,9 @@ class CastSocketImpl : public CastSocket {
TestConnectChallengeReplyReceiveError);
FRIEND_TEST_ALL_PREFIXES(CastSocketTest,
TestConnectChallengeVerificationFails);
+ FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestObservers);
friend class AuthTransportDelegate;
+ friend class CastSocketMessageDelegate;
friend class CastSocketTest;
friend class TestCastSocket;
@@ -377,6 +416,11 @@ class CastSocketImpl : public CastSocket {
// information.
AuthTransportDelegate* auth_delegate_;
+ // Map of CastSocket::Observer keyed by observer id. For extension side
+ // observers, id is extension_id; For browser side observers, id is a hard
+ // coded string.
+ std::map<std::string, std::unique_ptr<Observer>> observer_map_;
mark a. foltz 2017/06/16 23:26:14 Would a base::ObserverList work here? I.e. can so
zhaobin 2017/06/20 00:54:36 Done.
+
DISALLOW_COPY_AND_ASSIGN(CastSocketImpl);
};
} // namespace cast_channel
« no previous file with comments | « no previous file | components/cast_channel/cast_socket.cc » ('j') | extensions/browser/api/cast_channel/cast_channel_api.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698