blob: f1ef4a67e8f203d10b3144dd70eeb3b908f0e358 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Bukacd850602015-09-21 17:23:57 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Johan Euphrosine3523fdd2015-10-14 20:46:05 -07005#ifndef LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_
6#define LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_
Vitaly Bukacd850602015-09-21 17:23:57 -07007
8#include <openssl/ssl.h>
9
10#include <base/memory/weak_ptr.h>
Vitaly Buka10e69bc2015-10-16 01:21:07 -070011#include <weave/provider/network.h>
Vitaly Bukacd850602015-09-21 17:23:57 -070012#include <weave/stream.h>
13
14namespace weave {
15
Vitaly Buka1e363672015-09-25 14:01:16 -070016namespace provider {
Vitaly Bukacd850602015-09-21 17:23:57 -070017class TaskRunner;
Vitaly Buka1e363672015-09-25 14:01:16 -070018}
Vitaly Bukacd850602015-09-21 17:23:57 -070019
20namespace examples {
21
22class SSLStream : public Stream {
23 public:
Vitaly Bukacd850602015-09-21 17:23:57 -070024 ~SSLStream() override;
25
Vitaly Buka4ebd3292015-09-23 18:04:17 -070026 void Read(void* buffer,
27 size_t size_to_read,
Vitaly Buka74763422015-10-11 00:39:52 -070028 const ReadCallback& callback) override;
Vitaly Bukacd850602015-09-21 17:23:57 -070029
Vitaly Buka4ebd3292015-09-23 18:04:17 -070030 void Write(const void* buffer,
31 size_t size_to_write,
Vitaly Buka74763422015-10-11 00:39:52 -070032 const WriteCallback& callback) override;
Vitaly Bukacd850602015-09-21 17:23:57 -070033
Vitaly Bukada987282015-09-23 16:50:40 -070034 void CancelPendingOperations() override;
Vitaly Bukacd850602015-09-21 17:23:57 -070035
Vitaly Buka10e69bc2015-10-16 01:21:07 -070036 static void Connect(provider::TaskRunner* task_runner,
37 const std::string& host,
38 uint16_t port,
39 const provider::Network::OpenSslSocketCallback& callback);
Vitaly Bukacd850602015-09-21 17:23:57 -070040
41 private:
Vitaly Buka10e69bc2015-10-16 01:21:07 -070042 struct SslDeleter {
43 void operator()(BIO* bio) const;
44 void operator()(SSL* ssl) const;
45 void operator()(SSL_CTX* ctx) const;
46 };
47
48 SSLStream(provider::TaskRunner* task_runner,
49 std::unique_ptr<BIO, SslDeleter> stream_bio);
50
51 static void ConnectBio(
52 std::unique_ptr<SSLStream> stream,
53 const provider::Network::OpenSslSocketCallback& callback);
54 static void DoHandshake(
55 std::unique_ptr<SSLStream> stream,
56 const provider::Network::OpenSslSocketCallback& callback);
57
58 // Send task to this method with WeakPtr if callback should not be executed
59 // after SSLStream is destroyed.
60 void RunTask(const base::Closure& task);
Vitaly Bukacd850602015-09-21 17:23:57 -070061
Vitaly Buka1e363672015-09-25 14:01:16 -070062 provider::TaskRunner* task_runner_{nullptr};
Vitaly Buka10e69bc2015-10-16 01:21:07 -070063 std::unique_ptr<SSL_CTX, SslDeleter> ctx_;
64 std::unique_ptr<SSL, SslDeleter> ssl_;
Vitaly Bukacd850602015-09-21 17:23:57 -070065
66 base::WeakPtrFactory<SSLStream> weak_ptr_factory_{this};
67};
68
69} // namespace examples
70} // namespace weave
71
Johan Euphrosine3523fdd2015-10-14 20:46:05 -070072#endif // LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_