普通文本  |  89行  |  2.52 KB

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

#include "examples/provider/file_config_store.h"

#include <sys/stat.h>
#include <sys/utsname.h>

#include <fstream>
#include <map>
#include <string>
#include <vector>

#include <base/bind.h>

namespace weave {
namespace examples {

const char kSettingsDir[] = "/var/lib/weave/";

FileConfigStore::FileConfigStore(const std::string& model_id,
                                 provider::TaskRunner* task_runner)
    : model_id_{model_id},
      task_runner_{task_runner} {}

std::string FileConfigStore::GetPath(const std::string& name) const {
  std::string path{kSettingsDir};
  path += "weave_settings_" + model_id_;
  if (!name.empty())
    path += "_" + name;
  return path + ".json";
}

bool FileConfigStore::LoadDefaults(Settings* settings) {
  char host_name[HOST_NAME_MAX] = {};
  gethostname(host_name, HOST_NAME_MAX);

  settings->name = host_name;
  settings->description = "";

  utsname uname_data;
  uname(&uname_data);

  settings->firmware_version = uname_data.sysname;
  settings->oem_name = "Unknown";
  settings->model_name = "Unknown";
  settings->model_id = model_id_;
  settings->pairing_modes = {PairingType::kEmbeddedCode};
  settings->embedded_code = "0000";

  // Keys owners:
  //   avakulenko@google.com
  //   gene@chromium.org
  //   vitalybuka@chromium.org
  settings->client_id =
      "338428340000-vkb4p6h40c7kja1k3l70kke8t615cjit.apps.googleusercontent."
      "com";
  settings->client_secret = "LS_iPYo_WIOE0m2VnLdduhnx";
  settings->api_key = "AIzaSyACK3oZtmIylUKXiTMqkZqfuRiCgQmQSAQ";

  return true;
}

std::string FileConfigStore::LoadSettings() {
  return LoadSettings("");
}

std::string FileConfigStore::LoadSettings(const std::string& name) {
  LOG(INFO) << "Loading settings from " << GetPath(name);
  std::ifstream str(GetPath(name));
  return std::string(std::istreambuf_iterator<char>(str),
                     std::istreambuf_iterator<char>());
}

void FileConfigStore::SaveSettings(const std::string& name,
                                   const std::string& settings,
                                   const DoneCallback& callback) {
  CHECK(mkdir(kSettingsDir, S_IRWXU) == 0 || errno == EEXIST);
  LOG(INFO) << "Saving settings to " << GetPath(name);
  std::ofstream str(GetPath(name));
  str << settings;
  if (!callback.is_null())
    task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr), {});
}

}  // namespace examples
}  // namespace weave