buffet: Move privetd sources into buffet

No functional changes, only renaming, fixed include paths and include
guards to avoid resubmit warnings.

BUG=brillo:1161
CQ-DEPEND=CL:276521
TEST=none

Change-Id: Icacff92aef47fdd46542bc96eba3ffbb4df6241a
Reviewed-on: https://chromium-review.googlesource.com/276319
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/privet/wifi_ssid_generator.cc b/buffet/privet/wifi_ssid_generator.cc
new file mode 100644
index 0000000..0fa0c7c
--- /dev/null
+++ b/buffet/privet/wifi_ssid_generator.cc
@@ -0,0 +1,92 @@
+// Copyright 2014 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 "buffet/privet/wifi_ssid_generator.h"
+
+#include <bitset>
+
+#include <base/bind.h>
+#include <base/rand_util.h>
+#include <base/strings/string_number_conversions.h>
+#include <base/strings/stringprintf.h>
+
+#include "buffet/privet/cloud_delegate.h"
+#include "buffet/privet/device_delegate.h"
+#include "buffet/privet/wifi_delegate.h"
+
+namespace privetd {
+
+namespace {
+
+const int kDeviceNameSize = 20;
+// [DeviceName+Idx <= 20].[modelID == 5][flags == 2]prv
+const char kSsidFormat[] = "%s %s.%5.5s%2.2sprv";
+
+const char base64chars[] =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+bool IsSetupNeeded(const ConnectionState& state) {
+  if (state.error())
+    return true;
+  switch (state.status()) {
+    case ConnectionState::kUnconfigured:
+      return true;
+    case ConnectionState::kDisabled:
+    case ConnectionState::kConnecting:
+    case ConnectionState::kOnline:
+    case ConnectionState::kOffline:
+      return false;
+  }
+  CHECK(false);
+  return false;
+}
+
+}  // namespace
+
+WifiSsidGenerator::WifiSsidGenerator(const CloudDelegate* cloud,
+                                     const WifiDelegate* wifi)
+    : gcd_(cloud), wifi_(wifi), get_random_(base::Bind(&base::RandInt, 0, 99)) {
+  CHECK(gcd_);
+}
+
+std::string WifiSsidGenerator::GenerateFlags() const {
+  std::bitset<6> flags1;
+  // Device needs WiFi configuration.
+  flags1[0] = wifi_ && IsSetupNeeded(wifi_->GetConnectionState());
+  // Device needs GCD registration.
+  flags1[1] = IsSetupNeeded(gcd_->GetConnectionState());
+
+  std::bitset<6> flags2;
+  // Device is discoverable over WiFi.
+  flags2[0] = true;
+
+  std::string result{2, base64chars[0]};
+  result[0] = base64chars[flags1.to_ulong()];
+  result[1] = base64chars[flags2.to_ulong()];
+  return result;
+}
+
+std::string WifiSsidGenerator::GenerateSsid() const {
+  std::string name;
+  std::string model_id;
+  if (!gcd_ || !gcd_->GetName(&name, nullptr) ||
+      !gcd_->GetModelId(&model_id, nullptr)) {
+    return std::string();
+  }
+  std::string idx{base::IntToString(get_random_.Run())};
+  name = name.substr(0, kDeviceNameSize - idx.size() - 1);
+  CHECK_EQ(5u, model_id.size());
+
+  std::string result =
+      base::StringPrintf(kSsidFormat, name.c_str(), idx.c_str(),
+                         model_id.c_str(), GenerateFlags().c_str());
+  CHECK_EQ(result[result.size() - 11], '.');
+  return result;
+}
+
+void WifiSsidGenerator::SetRandomForTests(int n) {
+  get_random_ = base::Bind(&base::RandInt, n, n);
+}
+
+}  // namespace privetd