libweave: Buffet includes only weave/include files

External components should include only weave/include files

BUG=brillo:1242
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I39edb5662694be23afa2a09aaca39f041e2d009b
Reviewed-on: https://chromium-review.googlesource.com/285673
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
new file mode 100644
index 0000000..7d2943b
--- /dev/null
+++ b/libweave/src/device_manager.cc
@@ -0,0 +1,119 @@
+// 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/src/device_manager.h"
+
+#include <string>
+
+#include <chromeos/dbus/dbus_object.h>
+
+#include <base/message_loop/message_loop.h>
+
+#include "libweave/src/base_api_handler.h"
+#include "libweave/src/commands/command_manager.h"
+#include "libweave/src/privet/privet_manager.h"
+#include "libweave/src/privet/shill_client.h"
+#include "libweave/src/states/state_change_queue.h"
+#include "libweave/src/states/state_manager.h"
+
+namespace weave {
+
+namespace {
+
+// Max of 100 state update events should be enough in the queue.
+const size_t kMaxStateChangeQueueSize = 100;
+// The number of seconds each HTTP request will be allowed before timing out.
+const int kRequestTimeoutSeconds = 30;
+
+}  // namespace
+
+DeviceManager::DeviceManager() {}
+
+DeviceManager::~DeviceManager() {}
+
+void DeviceManager::Start(
+    const Options& options,
+    chromeos::dbus_utils::DBusObject* dbus_object,
+    chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
+  command_manager_ =
+      std::make_shared<CommandManager>(dbus_object->GetObjectManager());
+  command_manager_->Startup(options.definitions_path,
+                            options.test_definitions_path);
+  state_change_queue_.reset(new StateChangeQueue(kMaxStateChangeQueueSize));
+  state_manager_ = std::make_shared<StateManager>(state_change_queue_.get());
+  state_manager_->Startup();
+
+  auto transport = chromeos::http::Transport::CreateDefault();
+  transport->SetDefaultTimeout(
+      base::TimeDelta::FromSeconds(kRequestTimeoutSeconds));
+
+  std::unique_ptr<BuffetConfig> config{new BuffetConfig{options.state_path}};
+  config->Load(options.config_path);
+
+  shill_client_.reset(
+      new privet::ShillClient(dbus_object->GetBus(), options.device_whitelist));
+
+  // TODO(avakulenko): Figure out security implications of storing
+  // device info state data unencrypted.
+  device_info_.reset(new DeviceRegistrationInfo(
+      command_manager_, state_manager_, std::move(config), transport,
+      base::MessageLoop::current()->task_runner(), options.xmpp_enabled,
+      shill_client_.get()));
+  base_api_handler_.reset(new BaseApiHandler{device_info_->AsWeakPtr(),
+                                             state_manager_, command_manager_});
+
+  device_info_->Start();
+
+  if (!options.disable_privet)
+    StartPrivet(options, dbus_object, sequencer);
+}
+
+CommandManager* DeviceManager::GetCommands() {
+  return command_manager_.get();
+}
+
+StateManager* DeviceManager::GetState() {
+  return state_manager_.get();
+}
+
+BuffetConfig* DeviceManager::GetConfig() {
+  return device_info_->GetMutableConfig();
+}
+
+DeviceRegistrationInfo* DeviceManager::GetCloud() {
+  return device_info_.get();
+}
+
+privet::Manager* DeviceManager::GetPrivet() {
+  return privet_.get();
+}
+
+void DeviceManager::StartPrivet(
+    const Options& options,
+    chromeos::dbus_utils::DBusObject* dbus_object,
+    chromeos::dbus_utils::AsyncEventSequencer* sequencer) {
+  privet_.reset(new privet::Manager{});
+  privet_->Start(options, dbus_object->GetBus(), shill_client_.get(),
+                 device_info_.get(), command_manager_.get(),
+                 state_manager_.get(), sequencer);
+
+  privet_->AddOnWifiSetupChangedCallback(
+      base::Bind(&DeviceManager::OnWiFiBootstrapStateChanged,
+                 weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DeviceManager::OnWiFiBootstrapStateChanged(
+    weave::privet::WifiBootstrapManager::State state) {
+  const std::string& ssid = privet_->GetCurrentlyConnectedSsid();
+  if (ssid != device_info_->GetConfig().last_configured_ssid()) {
+    weave::BuffetConfig::Transaction change{device_info_->GetMutableConfig()};
+    change.set_last_configured_ssid(ssid);
+  }
+}
+
+std::unique_ptr<Device> Device::Create() {
+  return std::unique_ptr<Device>{new DeviceManager};
+}
+
+}  // namespace weave