| Index: remoting/host/heartbeat_sender.h
|
| diff --git a/remoting/host/heartbeat_sender.h b/remoting/host/heartbeat_sender.h
|
| index 08665c6451145ec07798f66e45a21eb12843fe9a..b8d459f55dd676bb29e7c4d9209f37db687ffb99 100644
|
| --- a/remoting/host/heartbeat_sender.h
|
| +++ b/remoting/host/heartbeat_sender.h
|
| @@ -9,34 +9,80 @@
|
|
|
| #include "base/scoped_ptr.h"
|
| #include "base/ref_counted.h"
|
| +#include "remoting/host/host_key_pair.h"
|
| #include "remoting/jingle_glue/iq_request.h"
|
| +#include "testing/gtest/include/gtest/gtest_prod.h"
|
|
|
| namespace remoting {
|
|
|
| class IqRequest;
|
| +class HostKeyPair;
|
| class JingleClient;
|
| class MutableHostConfig;
|
|
|
| -// HeartbeatSender periodically sends hertbeats to the chromoting bot.
|
| -// TODO(sergeyu): Write unittest for this class.
|
| +// HeartbeatSender periodically sends heartbeat stanzas to the Chromoting Bot.
|
| +// Each heartbeat stanza looks as follows:
|
| +//
|
| +// <iq type="set" to="remoting@bot.talk.google.com"
|
| +// from="user@gmail.com/chromoting123123" id="5" xmlns="jabber:client">
|
| +// <rem:heartbeat rem:hostid="a1ddb11e-8aef-11df-bccf-18a905b9cb5a"
|
| +// xmlns:rem="google:remoting">
|
| +// <rem:signature rem:time="1279061748">.signature.</rem:signature>
|
| +// </rem:heartbeat>
|
| +// </iq>
|
| +//
|
| +// The time attribute of the signature is the decimal time when the message
|
| +// was sent in second since the epoch (01/01/1970). The signature is a BASE64
|
| +// encoded SHA-1/RSA signature created with the host's private key. The message
|
| +// being signed is the full Jid concatenated with the time value, separated by
|
| +// space. For example, for the heartbeat stanza above the message that is being
|
| +// signed is "user@gmail.com/chromoting123123 1279061748".
|
| class HeartbeatSender : public base::RefCountedThreadSafe<HeartbeatSender> {
|
| public:
|
| HeartbeatSender();
|
| + virtual ~HeartbeatSender();
|
|
|
| - // Starts heart-beating for |jingle_client|.
|
| - void Start(MutableHostConfig* config, JingleClient* jingle_client);
|
| + // Initializes heart-beating for |jingle_client| with the specified
|
| + // config. Returns false if the config is invalid (e.g. private key
|
| + // cannot be parsed).
|
| + bool Init(MutableHostConfig* config, JingleClient* jingle_client);
|
| +
|
| + // Starts heart-beating. Must be called after init.
|
| + void Start();
|
| +
|
| + // Stops heart-beating. Must be called before corresponding JingleClient
|
| + // is destroyed. This object will not be deleted until Stop() is called,
|
| + // and it may (and will) crash after JingleClient is destroyed. Heartbeating
|
| + // cannot be restarted after it has been stopped, A new sender must be created
|
| + // instead.
|
| + void Stop();
|
|
|
| private:
|
| - void DoStart();
|
| + FRIEND_TEST_ALL_PREFIXES(HeartbeatSenderTest, DoSendStanza);
|
| + FRIEND_TEST_ALL_PREFIXES(HeartbeatSenderTest, CreateHeartbeatMessage);
|
| +
|
| + enum State {
|
| + CREATED,
|
| + INITIALIZED,
|
| + STARTED,
|
| + STOPPED,
|
| + };
|
| +
|
| void DoSendStanza();
|
|
|
| + // Helper methods used by DoSendStanza() to generate heartbeat stanzas.
|
| + // Caller owns the result.
|
| + buzz::XmlElement* CreateHeartbeatMessage();
|
| + buzz::XmlElement* CreateSignature();
|
| +
|
| void ProcessResponse(const buzz::XmlElement* response);
|
|
|
| - bool started_;
|
| + State state_;
|
| scoped_refptr<MutableHostConfig> config_;
|
| JingleClient* jingle_client_;
|
| scoped_ptr<IqRequest> request_;
|
| std::string host_id_;
|
| + HostKeyPair key_pair_;
|
| };
|
|
|
| } // namespace remoting
|
|
|