68 lines
2 KiB
Python
68 lines
2 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 asyncio
|
||
|
import socket
|
||
|
from typing import Tuple
|
||
|
|
||
|
|
||
|
class _WrappedTransport:
|
||
|
"""A wrapper for transports."""
|
||
|
|
||
|
__slots__ = (
|
||
|
'transport',
|
||
|
'is_ipv6',
|
||
|
'sock',
|
||
|
'fileno',
|
||
|
'sock_name',
|
||
|
)
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
transport: asyncio.DatagramTransport,
|
||
|
is_ipv6: bool,
|
||
|
sock: socket.socket,
|
||
|
fileno: int,
|
||
|
sock_name: Tuple,
|
||
|
) -> None:
|
||
|
"""Initialize the wrapped transport.
|
||
|
|
||
|
These attributes are used when sending packets.
|
||
|
"""
|
||
|
self.transport = transport
|
||
|
self.is_ipv6 = is_ipv6
|
||
|
self.sock = sock
|
||
|
self.fileno = fileno
|
||
|
self.sock_name = sock_name
|
||
|
|
||
|
|
||
|
def make_wrapped_transport(transport: asyncio.DatagramTransport) -> _WrappedTransport:
|
||
|
"""Make a wrapped transport."""
|
||
|
sock: socket.socket = transport.get_extra_info('socket')
|
||
|
return _WrappedTransport(
|
||
|
transport=transport,
|
||
|
is_ipv6=sock.family == socket.AF_INET6,
|
||
|
sock=sock,
|
||
|
fileno=sock.fileno(),
|
||
|
sock_name=sock.getsockname(),
|
||
|
)
|