blob: 736a03da0dcfb63bae815af46fadb646d94f6a18 [file] [log] [blame]
Austin Schuh75263e32022-02-22 18:05:32 -08001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#include "wpi/MulticastServiceAnnouncer.h"
6
7#include <wpi/SmallVector.h>
8
9#include "MulticastHandleManager.h"
10
11extern "C" {
12WPI_MulticastServiceAnnouncerHandle WPI_CreateMulticastServiceAnnouncer(
13 const char* serviceName, const char* serviceType, int32_t port,
14 int32_t txtCount, const char** keys, const char** values)
15
16{
17 auto& manager = wpi::GetMulticastManager();
18 std::scoped_lock lock{manager.mutex};
19
20 wpi::SmallVector<std::pair<std::string_view, std::string_view>, 8> txts;
21
22 for (int32_t i = 0; i < txtCount; i++) {
23 txts.emplace_back(
24 std::pair<std::string_view, std::string_view>{keys[i], values[i]});
25 }
26
27 auto announcer = std::make_unique<wpi::MulticastServiceAnnouncer>(
28 serviceName, serviceType, port, txts);
29
30 size_t index = manager.handleIds.emplace_back(3);
31 manager.announcers[index] = std::move(announcer);
32
33 return index;
34}
35
36void WPI_FreeMulticastServiceAnnouncer(
37 WPI_MulticastServiceAnnouncerHandle handle) {
38 auto& manager = wpi::GetMulticastManager();
39 std::scoped_lock lock{manager.mutex};
40 manager.announcers[handle] = nullptr;
41 manager.handleIds.erase(handle);
42}
43
44void WPI_StartMulticastServiceAnnouncer(
45 WPI_MulticastServiceAnnouncerHandle handle) {
46 auto& manager = wpi::GetMulticastManager();
47 std::scoped_lock lock{manager.mutex};
48 auto& announcer = manager.announcers[handle];
49 announcer->Start();
50}
51
52void WPI_StopMulticastServiceAnnouncer(
53 WPI_MulticastServiceAnnouncerHandle handle) {
54 auto& manager = wpi::GetMulticastManager();
55 std::scoped_lock lock{manager.mutex};
56 auto& announcer = manager.announcers[handle];
57 announcer->Stop();
58}
59
60int32_t WPI_GetMulticastServiceAnnouncerHasImplementation(
61 WPI_MulticastServiceAnnouncerHandle handle) {
62 auto& manager = wpi::GetMulticastManager();
63 std::scoped_lock lock{manager.mutex};
64 auto& announcer = manager.announcers[handle];
65 return announcer->HasImplementation();
66}
67} // extern "C"