Index: google_apis/gcm/engine/connection_handler.h |
diff --git a/google_apis/gcm/engine/connection_handler.h b/google_apis/gcm/engine/connection_handler.h |
index 6dd838c86946473e583c01be2850cdbd05c6f096..5b9ea715c7803d4ac9ec7ff9ba076ab4049c7101 100644 |
--- a/google_apis/gcm/engine/connection_handler.h |
+++ b/google_apis/gcm/engine/connection_handler.h |
@@ -5,13 +5,21 @@ |
#ifndef GOOGLE_APIS_GCM_ENGINE_CONNECTION_HANDLER_H_ |
#define GOOGLE_APIS_GCM_ENGINE_CONNECTION_HANDLER_H_ |
-#include "base/memory/weak_ptr.h" |
-#include "base/timer/timer.h" |
+#include "base/callback.h" |
#include "google_apis/gcm/base/gcm_export.h" |
-#include "google_apis/gcm/protocol/mcs.pb.h" |
namespace net{ |
class StreamSocket; |
+} // namespace net |
+ |
+namespace google { |
+namespace protobuf { |
+class MessageLite; |
+} // namespace protobuf |
+} // namepsace google |
+ |
+namespace mcs_proto { |
+class LoginRequest; |
} |
namespace gcm { |
@@ -31,113 +39,23 @@ class GCM_EXPORT ConnectionHandler { |
typedef base::Closure ProtoSentCallback; |
typedef base::Callback<void(int)> ConnectionChangedCallback; |
- explicit ConnectionHandler(base::TimeDelta read_timeout); |
- ~ConnectionHandler(); |
+ ConnectionHandler(); |
+ virtual ~ConnectionHandler(); |
// Starts a new MCS connection handshake (using |login_request|) and, upon |
- // success, begins listening for incoming/outgoing messages. A successful |
- // handshake is when a mcs_proto::LoginResponse is received, and is signaled |
- // via the |read_callback|. |
- // Outputs: |
- // |read_callback| will be invoked with the contents of any received protobuf |
- // message. |
- // |write_callback| will be invoked anytime a message has been successfully |
- // sent. Note: this just means the data was sent to the wire, not that the |
- // other end received it. |
- // |connection_callback| will be invoked with any fatal read/write errors |
- // encountered. |
+ // success, begins listening for incoming/outgoing messages. |
// |
// Note: It is correct and expected to call Init more than once, as connection |
// issues are encountered and new connections must be made. |
- void Init(scoped_ptr<net::StreamSocket> socket, |
- const google::protobuf::MessageLite& login_request, |
- const ProtoReceivedCallback& read_callback, |
- const ProtoSentCallback& write_callback, |
- const ConnectionChangedCallback& connection_callback); |
+ virtual void Init(const mcs_proto::LoginRequest& login_request, |
+ scoped_ptr<net::StreamSocket> socket) = 0; |
// Checks that a handshake has been completed and a message is not already |
// in flight. |
- bool CanSendMessage() const; |
+ virtual bool CanSendMessage() const = 0; |
// Send an MCS protobuf message. CanSendMessage() must be true. |
- void SendMessage(const google::protobuf::MessageLite& message); |
- |
- private: |
- // State machine for handling incoming data. See WaitForData(..) for usage. |
- enum ProcessingState { |
- // Processing the version, tag, and size packets (assuming minimum length |
- // size packet). Only used during the login handshake. |
- MCS_VERSION_TAG_AND_SIZE = 0, |
- // Processing the tag and size packets (assuming minimum length size |
- // packet). Used for normal messages. |
- MCS_TAG_AND_SIZE, |
- // Processing a maximum length size packet (for messages with length > 128). |
- // Used when a normal size packet was not sufficient to read the message |
- // size. |
- MCS_FULL_SIZE, |
- // Processing the protocol buffer bytes (for those messages with non-zero |
- // sizes). |
- MCS_PROTO_BYTES |
- }; |
- |
- // Sends the protocol version and login request. First step in the MCS |
- // connection handshake. |
- void Login(const google::protobuf::MessageLite& login_request); |
- |
- // SendMessage continuation. Invoked when Socket::Write completes. |
- void OnMessageSent(); |
- |
- // Starts the message processing process, which is comprised of the tag, |
- // message size, and bytes packet types. |
- void GetNextMessage(); |
- |
- // Performs any necessary SocketInputStream refreshing until the data |
- // associated with |packet_type| is fully ready, then calls the appropriate |
- // OnGot* message to process the packet data. If the read times out, |
- // will close the stream and invoke the connection callback. |
- void WaitForData(ProcessingState state); |
- |
- // Incoming data helper methods. |
- void OnGotVersion(); |
- void OnGotMessageTag(); |
- void OnGotMessageSize(); |
- void OnGotMessageBytes(); |
- |
- // Timeout handler. |
- void OnTimeout(); |
- |
- // Closes the current connection. |
- void CloseConnection(); |
- |
- // Timeout policy: the timeout is only enforced while waiting on the |
- // handshake (version and/or LoginResponse) or once at least a tag packet has |
- // been received. It is reset every time new data is received, and is |
- // only stopped when a full message is processed. |
- // TODO(zea): consider enforcing a separate timeout when waiting for |
- // a message to send. |
- const base::TimeDelta read_timeout_; |
- base::OneShotTimer<ConnectionHandler> read_timeout_timer_; |
- |
- // This connection's socket and the input/output streams attached to it. |
- scoped_ptr<net::StreamSocket> socket_; |
- scoped_ptr<SocketInputStream> input_stream_; |
- scoped_ptr<SocketOutputStream> output_stream_; |
- |
- // Whether the MCS login handshake has successfully completed. See Init(..) |
- // description for more info on what the handshake involves. |
- bool handshake_complete_; |
- |
- // State for the message currently being processed, if there is one. |
- uint8 message_tag_; |
- uint32 message_size_; |
- |
- ProtoReceivedCallback read_callback_; |
- ProtoSentCallback write_callback_; |
- ConnectionChangedCallback connection_callback_; |
- |
- base::WeakPtrFactory<ConnectionHandler> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ConnectionHandler); |
+ virtual void SendMessage(const google::protobuf::MessageLite& message) = 0; |
}; |
} // namespace gcm |