[Metrics] Make MetricsStateManager take a callback param to check if UMA is enabled.
[chromium-blink-merge.git] / google_apis / gcm / engine / connection_handler_impl.h
blob9f9daa94e39e9ea9f80447b595732ce754fe9ad9
1 // Copyright 2013 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.
5 #ifndef GOOGLE_APIS_GCM_ENGINE_CONNECTION_HANDLER_IMPL_H_
6 #define GOOGLE_APIS_GCM_ENGINE_CONNECTION_HANDLER_IMPL_H_
8 #include "base/memory/weak_ptr.h"
9 #include "base/time/time.h"
10 #include "base/timer/timer.h"
11 #include "google_apis/gcm/engine/connection_handler.h"
13 namespace mcs_proto {
14 class LoginRequest;
15 } // namespace mcs_proto
17 namespace gcm {
19 class GCM_EXPORT ConnectionHandlerImpl : public ConnectionHandler {
20 public:
21 // |read_callback| will be invoked with the contents of any received protobuf
22 // message.
23 // |write_callback| will be invoked anytime a message has been successfully
24 // sent. Note: this just means the data was sent to the wire, not that the
25 // other end received it.
26 // |connection_callback| will be invoked with any fatal read/write errors
27 // encountered.
28 ConnectionHandlerImpl(
29 base::TimeDelta read_timeout,
30 const ProtoReceivedCallback& read_callback,
31 const ProtoSentCallback& write_callback,
32 const ConnectionChangedCallback& connection_callback);
33 virtual ~ConnectionHandlerImpl();
35 // ConnectionHandler implementation.
36 virtual void Init(const mcs_proto::LoginRequest& login_request,
37 net::StreamSocket* socket) OVERRIDE;
38 virtual void Reset() OVERRIDE;
39 virtual bool CanSendMessage() const OVERRIDE;
40 virtual void SendMessage(const google::protobuf::MessageLite& message)
41 OVERRIDE;
43 private:
44 // State machine for handling incoming data. See WaitForData(..) for usage.
45 enum ProcessingState {
46 // Processing the version, tag, and size packets (assuming minimum length
47 // size packet). Only used during the login handshake.
48 MCS_VERSION_TAG_AND_SIZE = 0,
49 // Processing the tag and size packets (assuming minimum length size
50 // packet). Used for normal messages.
51 MCS_TAG_AND_SIZE,
52 // Processing a maximum length size packet (for messages with length > 128).
53 // Used when a normal size packet was not sufficient to read the message
54 // size.
55 MCS_FULL_SIZE,
56 // Processing the protocol buffer bytes (for those messages with non-zero
57 // sizes).
58 MCS_PROTO_BYTES
61 // Sends the protocol version and login request. First step in the MCS
62 // connection handshake.
63 void Login(const google::protobuf::MessageLite& login_request);
65 // SendMessage continuation. Invoked when Socket::Write completes.
66 void OnMessageSent();
68 // Starts the message processing process, which is comprised of the tag,
69 // message size, and bytes packet types.
70 void GetNextMessage();
72 // Performs any necessary SocketInputStream refreshing until the data
73 // associated with |packet_type| is fully ready, then calls the appropriate
74 // OnGot* message to process the packet data. If the read times out,
75 // will close the stream and invoke the connection callback.
76 void WaitForData(ProcessingState state);
78 // Incoming data helper methods.
79 void OnGotVersion();
80 void OnGotMessageTag();
81 void OnGotMessageSize();
82 void OnGotMessageBytes();
84 // Timeout handler.
85 void OnTimeout();
87 // Closes the current connection.
88 void CloseConnection();
90 // Timeout policy: the timeout is only enforced while waiting on the
91 // handshake (version and/or LoginResponse) or once at least a tag packet has
92 // been received. It is reset every time new data is received, and is
93 // only stopped when a full message is processed.
94 // TODO(zea): consider enforcing a separate timeout when waiting for
95 // a message to send.
96 const base::TimeDelta read_timeout_;
97 base::OneShotTimer<ConnectionHandlerImpl> read_timeout_timer_;
99 // This connection's socket and the input/output streams attached to it.
100 net::StreamSocket* socket_;
101 scoped_ptr<SocketInputStream> input_stream_;
102 scoped_ptr<SocketOutputStream> output_stream_;
104 // Whether the MCS login handshake has successfully completed. See Init(..)
105 // description for more info on what the handshake involves.
106 bool handshake_complete_;
108 // State for the message currently being processed, if there is one.
109 uint8 message_tag_;
110 uint32 message_size_;
112 ProtoReceivedCallback read_callback_;
113 ProtoSentCallback write_callback_;
114 ConnectionChangedCallback connection_callback_;
116 base::WeakPtrFactory<ConnectionHandlerImpl> weak_ptr_factory_;
118 DISALLOW_COPY_AND_ASSIGN(ConnectionHandlerImpl);
121 } // namespace gcm
123 #endif // GOOGLE_APIS_GCM_ENGINE_CONNECTION_HANDLER_IMPL_H_