Move SSLStream into separate file

Change-Id: If5f2ec10d5f0455b748a2b86968ac28b2a8da1b6
Reviewed-on: https://weave-review.googlesource.com/1115
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/network_manager.cc
index 6217f25..2414d7d 100644
--- a/libweave/examples/ubuntu/network_manager.cc
+++ b/libweave/examples/ubuntu/network_manager.cc
@@ -5,20 +5,17 @@
 #include "libweave/examples/ubuntu/network_manager.h"
 
 #include <arpa/inet.h>
-#include <fcntl.h>
 #include <linux/wireless.h>
-#include <netdb.h>
-#include <openssl/ssl.h>
 #include <sys/ioctl.h>
-#include <sys/socket.h>
 #include <sys/wait.h>
 
-#include <cstdlib>
 #include <fstream>
 
 #include <base/bind.h>
 #include <weave/task_runner.h>
 
+#include "libweave/examples/ubuntu/ssl_stream.h"
+
 namespace weave {
 namespace examples {
 
@@ -39,150 +36,6 @@
   NOTREACHED();
 }
 
-class SSLStream : public Stream {
- public:
-  explicit SSLStream(TaskRunner* task_runner) : task_runner_{task_runner} {}
-
-  ~SSLStream() { CancelPendingAsyncOperations(); }
-
-  void RunDelayedTask(const base::Closure& success_callback) {
-    success_callback.Run();
-  }
-
-  void ReadAsync(void* buffer,
-                 size_t size_to_read,
-                 const base::Callback<void(size_t)>& success_callback,
-                 const base::Callback<void(const Error*)>& error_callback) {
-    int res = SSL_read(ssl_.get(), buffer, size_to_read);
-    if (res > 0) {
-      task_runner_->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
-                     base::Bind(success_callback, res)),
-          {});
-      return;
-    }
-
-    int err = SSL_get_error(ssl_.get(), res);
-
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
-      task_runner_->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&SSLStream::ReadAsync, weak_ptr_factory_.GetWeakPtr(),
-                     buffer, size_to_read, success_callback, error_callback),
-          base::TimeDelta::FromSeconds(1));
-      return;
-    }
-
-    ErrorPtr weave_error;
-    Error::AddTo(&weave_error, FROM_HERE, "ssl", "socket_read_failed",
-                 "SSL error");
-    task_runner_->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(
-            &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
-            base::Bind(error_callback, base::Owned(weave_error.release()))),
-        {});
-    return;
-  }
-
-  void WriteAllAsync(const void* buffer,
-                     size_t size_to_write,
-                     const base::Closure& success_callback,
-                     const base::Callback<void(const Error*)>& error_callback) {
-    int res = SSL_write(ssl_.get(), buffer, size_to_write);
-    if (res > 0) {
-      buffer = static_cast<const char*>(buffer) + res;
-      size_to_write -= res;
-      if (size_to_write == 0) {
-        task_runner_->PostDelayedTask(
-            FROM_HERE,
-            base::Bind(&SSLStream::RunDelayedTask,
-                       weak_ptr_factory_.GetWeakPtr(), success_callback),
-            {});
-        return;
-      }
-
-      task_runner_->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&SSLStream::WriteAllAsync, weak_ptr_factory_.GetWeakPtr(),
-                     buffer, size_to_write, success_callback, error_callback),
-          base::TimeDelta::FromSeconds(1));
-
-      return;
-    }
-
-    int err = SSL_get_error(ssl_.get(), res);
-
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
-      task_runner_->PostDelayedTask(
-          FROM_HERE,
-          base::Bind(&SSLStream::WriteAllAsync, weak_ptr_factory_.GetWeakPtr(),
-                     buffer, size_to_write, success_callback, error_callback),
-          base::TimeDelta::FromSeconds(1));
-      return;
-    }
-
-    ErrorPtr weave_error;
-    Error::AddTo(&weave_error, FROM_HERE, "ssl", "socket_write_failed",
-                 "SSL error");
-    task_runner_->PostDelayedTask(
-        FROM_HERE,
-        base::Bind(
-            &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
-            base::Bind(error_callback, base::Owned(weave_error.release()))),
-        {});
-    return;
-  }
-
-  void CancelPendingAsyncOperations() {
-    weak_ptr_factory_.InvalidateWeakPtrs();
-  }
-
-  bool Init(const std::string& host, uint16_t port) {
-    ctx_.reset(SSL_CTX_new(TLSv1_2_client_method()));
-    CHECK(ctx_);
-    ssl_.reset(SSL_new(ctx_.get()));
-
-    char end_point[255];
-    snprintf(end_point, sizeof(end_point), "%s:%u", host.c_str(), port);
-    BIO* stream_bio = BIO_new_connect(end_point);
-    CHECK(stream_bio);
-    BIO_set_nbio(stream_bio, 1);
-
-    while (BIO_do_connect(stream_bio) != 1) {
-      CHECK(BIO_should_retry(stream_bio));
-      sleep(1);
-    }
-
-    SSL_set_bio(ssl_.get(), stream_bio, stream_bio);
-    SSL_set_connect_state(ssl_.get());
-
-    for (;;) {
-      int res = SSL_do_handshake(ssl_.get());
-      if (res) {
-        return true;
-      }
-
-      res = SSL_get_error(ssl_.get(), res);
-
-      if (res != SSL_ERROR_WANT_READ || res != SSL_ERROR_WANT_WRITE) {
-        return false;
-      }
-
-      sleep(1);
-    }
-    return false;
-  }
-
- private:
-  TaskRunner* task_runner_{nullptr};
-  std::unique_ptr<SSL_CTX, decltype(&SSL_CTX_free)> ctx_{nullptr, SSL_CTX_free};
-  std::unique_ptr<SSL, decltype(&SSL_free)> ssl_{nullptr, SSL_free};
-
-  base::WeakPtrFactory<SSLStream> weak_ptr_factory_{this};
-};
-
 }  // namespace
 
 NetworkImpl::NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping)
diff --git a/libweave/examples/ubuntu/ssl_stream.cc b/libweave/examples/ubuntu/ssl_stream.cc
new file mode 100644
index 0000000..e383f01
--- /dev/null
+++ b/libweave/examples/ubuntu/ssl_stream.cc
@@ -0,0 +1,152 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "libweave/examples/ubuntu/ssl_stream.h"
+
+#include <base/bind.h>
+#include <weave/task_runner.h>
+
+namespace weave {
+namespace examples {
+
+SSLStream::SSLStream(TaskRunner* task_runner) : task_runner_{task_runner} {}
+
+SSLStream::~SSLStream() {
+  CancelPendingAsyncOperations();
+}
+
+void SSLStream::RunDelayedTask(const base::Closure& success_callback) {
+  success_callback.Run();
+}
+
+void SSLStream::ReadAsync(
+    void* buffer,
+    size_t size_to_read,
+    const base::Callback<void(size_t)>& success_callback,
+    const base::Callback<void(const Error*)>& error_callback) {
+  int res = SSL_read(ssl_.get(), buffer, size_to_read);
+  if (res > 0) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+                   base::Bind(success_callback, res)),
+        {});
+    return;
+  }
+
+  int err = SSL_get_error(ssl_.get(), res);
+
+  if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&SSLStream::ReadAsync, weak_ptr_factory_.GetWeakPtr(),
+                   buffer, size_to_read, success_callback, error_callback),
+        base::TimeDelta::FromSeconds(1));
+    return;
+  }
+
+  ErrorPtr weave_error;
+  Error::AddTo(&weave_error, FROM_HERE, "ssl", "socket_read_failed",
+               "SSL error");
+  task_runner_->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(
+          &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+          base::Bind(error_callback, base::Owned(weave_error.release()))),
+      {});
+  return;
+}
+
+void SSLStream::WriteAllAsync(
+    const void* buffer,
+    size_t size_to_write,
+    const base::Closure& success_callback,
+    const base::Callback<void(const Error*)>& error_callback) {
+  int res = SSL_write(ssl_.get(), buffer, size_to_write);
+  if (res > 0) {
+    buffer = static_cast<const char*>(buffer) + res;
+    size_to_write -= res;
+    if (size_to_write == 0) {
+      task_runner_->PostDelayedTask(
+          FROM_HERE,
+          base::Bind(&SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+                     success_callback),
+          {});
+      return;
+    }
+
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&SSLStream::WriteAllAsync, weak_ptr_factory_.GetWeakPtr(),
+                   buffer, size_to_write, success_callback, error_callback),
+        base::TimeDelta::FromSeconds(1));
+
+    return;
+  }
+
+  int err = SSL_get_error(ssl_.get(), res);
+
+  if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
+    task_runner_->PostDelayedTask(
+        FROM_HERE,
+        base::Bind(&SSLStream::WriteAllAsync, weak_ptr_factory_.GetWeakPtr(),
+                   buffer, size_to_write, success_callback, error_callback),
+        base::TimeDelta::FromSeconds(1));
+    return;
+  }
+
+  ErrorPtr weave_error;
+  Error::AddTo(&weave_error, FROM_HERE, "ssl", "socket_write_failed",
+               "SSL error");
+  task_runner_->PostDelayedTask(
+      FROM_HERE,
+      base::Bind(
+          &SSLStream::RunDelayedTask, weak_ptr_factory_.GetWeakPtr(),
+          base::Bind(error_callback, base::Owned(weave_error.release()))),
+      {});
+  return;
+}
+
+void SSLStream::CancelPendingAsyncOperations() {
+  weak_ptr_factory_.InvalidateWeakPtrs();
+}
+
+bool SSLStream::Init(const std::string& host, uint16_t port) {
+  ctx_.reset(SSL_CTX_new(TLSv1_2_client_method()));
+  CHECK(ctx_);
+  ssl_.reset(SSL_new(ctx_.get()));
+
+  char end_point[255];
+  snprintf(end_point, sizeof(end_point), "%s:%u", host.c_str(), port);
+  BIO* stream_bio = BIO_new_connect(end_point);
+  CHECK(stream_bio);
+  BIO_set_nbio(stream_bio, 1);
+
+  while (BIO_do_connect(stream_bio) != 1) {
+    CHECK(BIO_should_retry(stream_bio));
+    sleep(1);
+  }
+
+  SSL_set_bio(ssl_.get(), stream_bio, stream_bio);
+  SSL_set_connect_state(ssl_.get());
+
+  for (;;) {
+    int res = SSL_do_handshake(ssl_.get());
+    if (res) {
+      return true;
+    }
+
+    res = SSL_get_error(ssl_.get(), res);
+
+    if (res != SSL_ERROR_WANT_READ || res != SSL_ERROR_WANT_WRITE) {
+      return false;
+    }
+
+    sleep(1);
+  }
+  return false;
+}
+
+}  // namespace examples
+}  // namespace weave
diff --git a/libweave/examples/ubuntu/ssl_stream.h b/libweave/examples/ubuntu/ssl_stream.h
new file mode 100644
index 0000000..5530cce
--- /dev/null
+++ b/libweave/examples/ubuntu/ssl_stream.h
@@ -0,0 +1,54 @@
+// Copyright 2015 The Chromium OS 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_UBUNTU_SSL_STREAM_H_
+#define LIBWEAVE_EXAMPLES_UBUNTU_SSL_STREAM_H_
+
+#include <openssl/ssl.h>
+
+#include <base/memory/weak_ptr.h>
+#include <weave/stream.h>
+
+namespace weave {
+
+class TaskRunner;
+
+namespace examples {
+
+class SSLStream : public Stream {
+ public:
+  explicit SSLStream(TaskRunner* task_runner);
+
+  ~SSLStream() override;
+
+  void ReadAsync(
+      void* buffer,
+      size_t size_to_read,
+      const base::Callback<void(size_t)>& success_callback,
+      const base::Callback<void(const Error*)>& error_callback) override;
+
+  void WriteAllAsync(
+      const void* buffer,
+      size_t size_to_write,
+      const base::Closure& success_callback,
+      const base::Callback<void(const Error*)>& error_callback) override;
+
+  void CancelPendingAsyncOperations() override;
+
+  bool Init(const std::string& host, uint16_t port);
+
+ private:
+  void RunDelayedTask(const base::Closure& success_callback);
+
+  TaskRunner* task_runner_{nullptr};
+  std::unique_ptr<SSL_CTX, decltype(&SSL_CTX_free)> ctx_{nullptr, SSL_CTX_free};
+  std::unique_ptr<SSL, decltype(&SSL_free)> ssl_{nullptr, SSL_free};
+
+  base::WeakPtrFactory<SSLStream> weak_ptr_factory_{this};
+};
+
+}  // namespace examples
+}  // namespace weave
+
+#endif  // LIBWEAVE_EXAMPLES_UBUNTU_SSL_STREAM_H_
diff --git a/libweave/examples/ubuntu/weave.gyp b/libweave/examples/ubuntu/weave.gyp
index e8abc5e..a4df01d 100644
--- a/libweave/examples/ubuntu/weave.gyp
+++ b/libweave/examples/ubuntu/weave.gyp
@@ -5,14 +5,15 @@
       'type': 'executable',
       'cflags': ['-pthread'],
       'sources': [
-        'main.cc',
-        'file_config_store.cc',
-        'event_task_runner.cc',
-        'curl_http_client.cc',
-        'network_manager.cc',
         'avahi_client.cc',
-        'event_http_server.cc',
         'bluez_client.cc',
+        'curl_http_client.cc',
+        'event_http_server.cc',
+        'event_task_runner.cc',
+        'file_config_store.cc',
+        'main.cc',
+        'network_manager.cc',
+        'ssl_stream.cc',
       ],
       'dependencies': [
         '../../libweave_standalone.gyp:libweave',