001// Copyright (c) FIRST and other WPILib contributors. 002// Open Source Software; you can modify and/or share it under the terms of 003// the WPILib BSD license file in the root directory of this project. 004 005package edu.wpi.first.net; 006 007import edu.wpi.first.util.WPICleaner; 008import java.lang.ref.Cleaner.Cleanable; 009import java.util.Map; 010 011/** Class to announce over mDNS that a service is available. */ 012public class MulticastServiceAnnouncer implements AutoCloseable { 013 private final int m_handle; 014 private final Cleanable m_cleanable; 015 016 private static Runnable cleanupAction(int handle) { 017 return () -> WPINetJNI.freeMulticastServiceAnnouncer(handle); 018 } 019 020 /** 021 * Creates a MulticastServiceAnnouncer. 022 * 023 * @param serviceName service name 024 * @param serviceType service type 025 * @param port port 026 * @param txt txt 027 */ 028 @SuppressWarnings("this-escape") 029 public MulticastServiceAnnouncer( 030 String serviceName, String serviceType, int port, Map<String, String> txt) { 031 String[] keys = txt.keySet().toArray(String[]::new); 032 String[] values = txt.values().toArray(String[]::new); 033 m_handle = 034 WPINetJNI.createMulticastServiceAnnouncer(serviceName, serviceType, port, keys, values); 035 m_cleanable = WPICleaner.register(this, cleanupAction(m_handle)); 036 } 037 038 /** 039 * Creates a MulticastServiceAnnouncer. 040 * 041 * @param serviceName service name 042 * @param serviceType service type 043 * @param port port 044 */ 045 @SuppressWarnings("this-escape") 046 public MulticastServiceAnnouncer(String serviceName, String serviceType, int port) { 047 m_handle = 048 WPINetJNI.createMulticastServiceAnnouncer(serviceName, serviceType, port, null, null); 049 m_cleanable = WPICleaner.register(this, cleanupAction(m_handle)); 050 } 051 052 @Override 053 public void close() { 054 m_cleanable.clean(); 055 } 056 057 public void start() { 058 WPINetJNI.startMulticastServiceAnnouncer(m_handle); 059 } 060 061 public void stop() { 062 WPINetJNI.stopMulticastServiceAnnouncer(m_handle); 063 } 064 065 public boolean hasImplementation() { 066 return WPINetJNI.getMulticastServiceAnnouncerHasImplementation(m_handle); 067 } 068}