| // 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_ |