blob: 55c9fe4fe20537d88a4f5b6f7d0cdc8ba74ce4bc [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 Buka22a04752015-11-06 14:53:35 -080037 Update();
Vitaly Buka0bd32132015-07-30 15:54:48 -070038}
39
40Publisher::~Publisher() {
41 RemoveService();
42}
43
Vitaly Buka0bd32132015-07-30 15:54:48 -070044void Publisher::Update() {
45 if (device_->GetHttpEnpoint().first == 0)
46 return RemoveService();
47 ExposeService();
48}
49
50void Publisher::ExposeService() {
Vitaly Buka658aa362015-09-15 20:59:12 -070051 std::string name{cloud_->GetName()};
52 std::string model_id{cloud_->GetModelId()};
Vitaly Buka0bd32132015-07-30 15:54:48 -070053 DCHECK_EQ(model_id.size(), 5U);
54
Vitaly Buka7a350052015-10-10 23:58:20 -070055 VLOG(2) << "DNS-SD update requested";
Vitaly Buka0bd32132015-07-30 15:54:48 -070056 const uint16_t port = device_->GetHttpEnpoint().first;
57 DCHECK_NE(port, 0);
58
Vitaly Buka3dc2f532015-09-08 18:01:32 -070059 std::vector<std::string> txt_record{
60 {"txtvers=3"},
61 {"ty=" + name},
Vitaly Buka87eb7882015-10-27 22:23:49 -070062 {"services=" + GetDeviceUiKind(model_id)},
Johan Euphrosine0b7bb9f2015-09-29 01:11:21 -070063 {"id=" + cloud_->GetDeviceId()},
Vitaly Buka3dc2f532015-09-08 18:01:32 -070064 {"mmid=" + model_id},
65 {"flags=" + WifiSsidGenerator{cloud_, wifi_}.GenerateFlags()},
Vitaly Buka0bd32132015-07-30 15:54:48 -070066 };
67
68 if (!cloud_->GetCloudId().empty())
Vitaly Buka3dc2f532015-09-08 18:01:32 -070069 txt_record.emplace_back("gcd_id=" + cloud_->GetCloudId());
Vitaly Buka0bd32132015-07-30 15:54:48 -070070
71 if (!cloud_->GetDescription().empty())
Vitaly Buka3dc2f532015-09-08 18:01:32 -070072 txt_record.emplace_back("note=" + cloud_->GetDescription());
Vitaly Buka0bd32132015-07-30 15:54:48 -070073
Vitaly Buka8589b052015-09-29 00:46:14 -070074 auto new_data = std::make_pair(port, txt_record);
75 if (published_ == new_data)
76 return;
Vitaly Buka22a04752015-11-06 14:53:35 -080077
78 VLOG(1) << "Updating service using DNS-SD, port: " << port;
Vitaly Buka8589b052015-09-29 00:46:14 -070079 published_ = new_data;
Vitaly Bukabeddc602015-09-24 15:28:03 -070080 dns_sd_->PublishService(kPrivetServiceType, port, txt_record);
Vitaly Buka0bd32132015-07-30 15:54:48 -070081}
82
83void Publisher::RemoveService() {
Vitaly Buka8589b052015-09-29 00:46:14 -070084 if (!published_.first)
Vitaly Buka11b2f232015-08-20 13:55:41 -070085 return;
Vitaly Buka8589b052015-09-29 00:46:14 -070086 published_ = {};
Vitaly Buka7a350052015-10-10 23:58:20 -070087 VLOG(1) << "Stopping service publishing";
Vitaly Bukabeddc602015-09-24 15:28:03 -070088 dns_sd_->StopPublishing(kPrivetServiceType);
Vitaly Buka0bd32132015-07-30 15:54:48 -070089}
90
91} // namespace privet
92} // namespace weave