75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
""" Multicast DNS Service Discovery for Python, v0.14-wmcbrine
|
|
Copyright 2003 Paul Scott-Murphy, 2014 William McBrine
|
|
|
|
This module provides a framework for the use of DNS Service Discovery
|
|
using IP multicast.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
USA
|
|
"""
|
|
|
|
import enum
|
|
from typing import TYPE_CHECKING, Any, Callable, List
|
|
|
|
if TYPE_CHECKING:
|
|
from .._core import Zeroconf
|
|
|
|
|
|
@enum.unique
|
|
class ServiceStateChange(enum.Enum):
|
|
Added = 1
|
|
Removed = 2
|
|
Updated = 3
|
|
|
|
|
|
class ServiceListener:
|
|
def add_service(self, zc: 'Zeroconf', type_: str, name: str) -> None:
|
|
raise NotImplementedError()
|
|
|
|
def remove_service(self, zc: 'Zeroconf', type_: str, name: str) -> None:
|
|
raise NotImplementedError()
|
|
|
|
def update_service(self, zc: 'Zeroconf', type_: str, name: str) -> None:
|
|
raise NotImplementedError()
|
|
|
|
|
|
class Signal:
|
|
__slots__ = ('_handlers',)
|
|
|
|
def __init__(self) -> None:
|
|
self._handlers: List[Callable[..., None]] = []
|
|
|
|
def fire(self, **kwargs: Any) -> None:
|
|
for h in self._handlers[:]:
|
|
h(**kwargs)
|
|
|
|
@property
|
|
def registration_interface(self) -> 'SignalRegistrationInterface':
|
|
return SignalRegistrationInterface(self._handlers)
|
|
|
|
|
|
class SignalRegistrationInterface:
|
|
__slots__ = ('_handlers',)
|
|
|
|
def __init__(self, handlers: List[Callable[..., None]]) -> None:
|
|
self._handlers = handlers
|
|
|
|
def register_handler(self, handler: Callable[..., None]) -> 'SignalRegistrationInterface':
|
|
self._handlers.append(handler)
|
|
return self
|
|
|
|
def unregister_handler(self, handler: Callable[..., None]) -> 'SignalRegistrationInterface':
|
|
self._handlers.remove(handler)
|
|
return self
|