// Copyright 2015 The Weave Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_ #define LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_ #include <openssl/ssl.h> #include <base/memory/weak_ptr.h> #include <weave/provider/network.h> #include <weave/stream.h> namespace weave { namespace provider { class TaskRunner; } namespace examples { class SSLStream : public Stream { public: ~SSLStream() override; void Read(void* buffer, size_t size_to_read, const ReadCallback& callback) override; void Write(const void* buffer, size_t size_to_write, const WriteCallback& callback) override; void CancelPendingOperations() override; static void Connect(provider::TaskRunner* task_runner, const std::string& host, uint16_t port, const provider::Network::OpenSslSocketCallback& callback); private: struct SslDeleter { void operator()(BIO* bio) const; void operator()(SSL* ssl) const; void operator()(SSL_CTX* ctx) const; }; SSLStream(provider::TaskRunner* task_runner, std::unique_ptr<BIO, SslDeleter> stream_bio); static void ConnectBio( std::unique_ptr<SSLStream> stream, const provider::Network::OpenSslSocketCallback& callback); static void DoHandshake( std::unique_ptr<SSLStream> stream, const provider::Network::OpenSslSocketCallback& callback); // Send task to this method with WeakPtr if callback should not be executed // after SSLStream is destroyed. void RunTask(const base::Closure& task); provider::TaskRunner* task_runner_{nullptr}; std::unique_ptr<SSL_CTX, SslDeleter> ctx_; std::unique_ptr<SSL, SslDeleter> ssl_; base::WeakPtrFactory<SSLStream> weak_ptr_factory_{this}; }; } // namespace examples } // namespace weave #endif // LIBWEAVE_EXAMPLES_PROVIDER_SSL_STREAM_H_