blob: 62e980ec98d87fcc97074aaa2d6869cbbb70e52e [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka0bd32132015-07-30 15:54:48 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Stefan Sauer2d16dfa2015-09-25 17:08:35 +02005#include "src/privet/publisher.h"
Vitaly Buka0bd32132015-07-30 15:54:48 -07006
7#include <map>
8
Vitaly Buka0801a1f2015-08-14 10:03:46 -07009#include <weave/error.h>
Vitaly Buka1e363672015-09-25 14:01:16 -070010#include <weave/provider/dns_service_discovery.h>
Vitaly Buka0bd32132015-07-30 15:54:48 -070011
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020012#include "src/privet/cloud_delegate.h"
13#include "src/privet/device_delegate.h"
Vitaly Buka87eb7882015-10-27 22:23:49 -070014#include "src/privet/device_ui_kind.h"
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020015#include "src/privet/wifi_bootstrap_manager.h"
16#include "src/privet/wifi_ssid_generator.h"
17#include "src/string_utils.h"
Vitaly Buka0bd32132015-07-30 15:54:48 -070018
19namespace weave {
20namespace privet {
21
22namespace {
23
Vitaly Bukabeddc602015-09-24 15:28:03 -070024// The service type we'll expose via DNS-SD.
Vitaly Buka3dc2f532015-09-08 18:01:32 -070025const char kPrivetServiceType[] = "_privet._tcp";
Vitaly Buka0bd32132015-07-30 15:54:48 -070026
27} // namespace
28
29Publisher::Publisher(const DeviceDelegate* device,
30 const CloudDelegate* cloud,
31 const WifiDelegate* wifi,
Vitaly Buka1e363672015-09-25 14:01:16 -070032 provider::DnsServiceDiscovery* dns_sd)
Vitaly Bukabeddc602015-09-24 15:28:03 -070033 : dns_sd_{dns_sd}, device_{device}, cloud_{cloud}, wifi_{wifi} {
Vitaly Buka0bd32132015-07-30 15:54:48 -070034 CHECK(device_);
35 CHECK(cloud_);
Vitaly Bukabeddc602015-09-24 15:28:03 -070036 CHECK(dns_sd_);
Vitaly Buka0bd32132015-07-30 15:54:48 -070037}
38
39Publisher::~Publisher() {
40 RemoveService();
41}
42
Vitaly Buka0bd32132015-07-30 15:54:48 -070043void Publisher::Update() {
44 if (device_->GetHttpEnpoint().first == 0)
45 return RemoveService();
46 ExposeService();
47}
48
49void Publisher::ExposeService() {
Vitaly Buka658aa362015-09-15 20:59:12 -070050 std::string name{cloud_->GetName()};
51 std::string model_id{cloud_->GetModelId()};
Vitaly Buka0bd32132015-07-30 15:54:48 -070052 DCHECK_EQ(model_id.size(), 5U);
53
Vitaly Buka7a350052015-10-10 23:58:20 -070054 VLOG(2) << "DNS-SD update requested";
Vitaly Buka0bd32132015-07-30 15:54:48 -070055 const uint16_t port = device_->GetHttpEnpoint().first;
56 DCHECK_NE(port, 0);
57
Vitaly Buka3dc2f532015-09-08 18:01:32 -070058 std::vector<std::string> txt_record{
59 {"txtvers=3"},
60 {"ty=" + name},
Vitaly Buka87eb7882015-10-27 22:23:49 -070061 {"services=" + GetDeviceUiKind(model_id)},
Johan Euphrosine0b7bb9f2015-09-29 01:11:21 -070062 {"id=" + cloud_->GetDeviceId()},
Vitaly Buka3dc2f532015-09-08 18:01:32 -070063 {"mmid=" + model_id},
64 {"flags=" + WifiSsidGenerator{cloud_, wifi_}.GenerateFlags()},
Vitaly Buka0bd32132015-07-30 15:54:48 -070065 };
66
67 if (!cloud_->GetCloudId().empty())
Vitaly Buka3dc2f532015-09-08 18:01:32 -070068 txt_record.emplace_back("gcd_id=" + cloud_->GetCloudId());
Vitaly Buka0bd32132015-07-30 15:54:48 -070069
70 if (!cloud_->GetDescription().empty())
Vitaly Buka3dc2f532015-09-08 18:01:32 -070071 txt_record.emplace_back("note=" + cloud_->GetDescription());
Vitaly Buka0bd32132015-07-30 15:54:48 -070072
Vitaly Buka8589b052015-09-29 00:46:14 -070073 auto new_data = std::make_pair(port, txt_record);
74 if (published_ == new_data)
75 return;
Vitaly Buka7a350052015-10-10 23:58:20 -070076 VLOG(1) << "Updating DNS-SD";
Vitaly Buka8589b052015-09-29 00:46:14 -070077 published_ = new_data;
Vitaly Bukabeddc602015-09-24 15:28:03 -070078 dns_sd_->PublishService(kPrivetServiceType, port, txt_record);
Vitaly Buka0bd32132015-07-30 15:54:48 -070079}
80
81void Publisher::RemoveService() {
Vitaly Buka8589b052015-09-29 00:46:14 -070082 if (!published_.first)
Vitaly Buka11b2f232015-08-20 13:55:41 -070083 return;
Vitaly Buka8589b052015-09-29 00:46:14 -070084 published_ = {};
Vitaly Buka7a350052015-10-10 23:58:20 -070085 VLOG(1) << "Stopping service publishing";
Vitaly Bukabeddc602015-09-24 15:28:03 -070086 dns_sd_->StopPublishing(kPrivetServiceType);
Vitaly Buka0bd32132015-07-30 15:54:48 -070087}
88
89} // namespace privet
90} // namespace weave