blob: 8449f84a759fef8b25c768a9c6336fadd2fada87 [file] [log] [blame]
// Copyright 2018 The Chromium 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 <signal.h>
#include <unistd.h>
#include <algorithm>
#include <vector>
#include "api/impl/mdns_screen_listener_factory.h"
#include "api/impl/mdns_screen_publisher_factory.h"
#include "api/public/network_service_manager.h"
#include "api/public/screen_listener.h"
#include "api/public/screen_publisher.h"
#include "platform/api/logging.h"
namespace openscreen {
namespace {
bool g_done = false;
bool g_dump_services = false;
void sigusr1_dump_services(int) {
g_dump_services = true;
}
void sigint_stop(int) {
OSP_LOG_INFO << "caught SIGINT, exiting...";
g_done = true;
}
void SignalThings() {
struct sigaction usr1_sa;
struct sigaction int_sa;
struct sigaction unused;
usr1_sa.sa_handler = &sigusr1_dump_services;
sigemptyset(&usr1_sa.sa_mask);
usr1_sa.sa_flags = 0;
int_sa.sa_handler = &sigint_stop;
sigemptyset(&int_sa.sa_mask);
int_sa.sa_flags = 0;
sigaction(SIGUSR1, &usr1_sa, &unused);
sigaction(SIGINT, &int_sa, &unused);
OSP_LOG_INFO << "signal handlers setup";
OSP_LOG_INFO << "pid: " << getpid();
}
class ListenerObserver final : public ScreenListener::Observer {
public:
~ListenerObserver() override = default;
void OnStarted() override { OSP_LOG_INFO << "listener started!"; }
void OnStopped() override { OSP_LOG_INFO << "listener stopped!"; }
void OnSuspended() override { OSP_LOG_INFO << "listener suspended!"; }
void OnSearching() override { OSP_LOG_INFO << "listener searching!"; }
void OnScreenAdded(const ScreenInfo& info) override {
OSP_LOG_INFO << "found! " << info.friendly_name;
}
void OnScreenChanged(const ScreenInfo& info) override {
OSP_LOG_INFO << "changed! " << info.friendly_name;
}
void OnScreenRemoved(const ScreenInfo& info) override {
OSP_LOG_INFO << "removed! " << info.friendly_name;
}
void OnAllScreensRemoved() override { OSP_LOG_INFO << "all removed!"; }
void OnError(ScreenListenerError) override {}
void OnMetrics(ScreenListener::Metrics) override {}
};
class PublisherObserver final : public ScreenPublisher::Observer {
public:
~PublisherObserver() override = default;
void OnStarted() override { OSP_LOG_INFO << "publisher started!"; }
void OnStopped() override { OSP_LOG_INFO << "publisher stopped!"; }
void OnSuspended() override { OSP_LOG_INFO << "publisher suspended!"; }
void OnError(ScreenPublisherError) override {}
void OnMetrics(ScreenPublisher::Metrics) override {}
};
void ListenerDemo() {
SignalThings();
ListenerObserver listener_observer;
MdnsScreenListenerConfig listener_config;
auto mdns_listener =
MdnsScreenListenerFactory::Create(listener_config, &listener_observer);
auto* network_service = NetworkServiceManager::Create(
std::move(mdns_listener), nullptr, nullptr, nullptr);
network_service->GetMdnsScreenListener()->Start();
while (!g_done) {
network_service->RunEventLoopOnce();
}
network_service->GetMdnsScreenListener()->Stop();
NetworkServiceManager::Dispose();
}
void PublisherDemo(const std::string& friendly_name) {
SignalThings();
PublisherObserver publisher_observer;
// TODO(btolsch): aggregate initialization probably better?
ScreenPublisher::Config publisher_config;
publisher_config.friendly_name = friendly_name;
publisher_config.hostname = "turtle-deadbeef";
publisher_config.service_instance_name = "deadbeef";
publisher_config.connection_server_port = 6667;
auto mdns_publisher =
MdnsScreenPublisherFactory::Create(publisher_config, &publisher_observer);
auto* network_service = NetworkServiceManager::Create(
nullptr, std::move(mdns_publisher), nullptr, nullptr);
network_service->GetMdnsScreenPublisher()->Start();
while (!g_done) {
network_service->RunEventLoopOnce();
}
network_service->GetMdnsScreenPublisher()->Stop();
NetworkServiceManager::Dispose();
}
} // namespace
} // namespace openscreen
int main(int argc, char** argv) {
openscreen::platform::SetLogLevel(openscreen::platform::LogLevel::kVerbose,
1);
if (argc == 1) {
openscreen::ListenerDemo();
} else {
openscreen::PublisherDemo(argv[1]);
}
return 0;
}