
    ̺i                     x    S r SSKrSSKrSSKJr  SSKJrJr  S r " S S\5      r	 " S	 S
\5      r
S rS rS rg)z
MIDI over TCP/IP.
    N   )Parser)
BaseIOPort	MultiPortc                 t    Sn[         R                   " U R                  " 5       // / U5      u  p#n[        U5      $ )z6Return True if there is data to be read on the socket.r   )selectfilenobool)sockettimeoutrlistwlistelists        K/var/www/piano.thomer.com/venv/lib/python3.13/site-packages/mido/sockets.py_is_readabler      s:     G"MM	2r7,U5 ;    c                   J    \ rS rSrSS jrS rS rS rSS jrS r	SS jr
S	rg
)
PortServer   c                    [         R                  " U [        X5      5        / U l        [        R                  " [        R
                  [        R                  5      U l        U R                  R                  [        R                  [        R                  S5        U R                  R                  S5        U R                  R                  X45        U R                  R                  U5        g )NT)r   __init__format_addressportsr   AF_INETSOCK_STREAM_socket
setsockopt
SOL_SOCKETSO_REUSEADDRsetblockingbindlisten)selfhostportnobacklogs       r   r   PortServer.__init__   s    4!=>
}}V^^V5G5GH 1 163F3FM  &4.)G$r   c                     g)Nserver r#   s    r   _get_device_typePortServer._get_device_type%       r   c                 ~    U R                    H  nUR                  5         M     U R                  R                  5         g N)r   closer   r#   ports     r   _closePortServer._close(   s)    JJDJJL r   c                 v    U R                    Vs/ s H  oR                  (       a  M  UPM     snU l         gs  snf )zRemove closed port ports.N)r   closedr2   s     r   _update_portsPortServer._update_ports.   s#    '+zzEztdzE
Es   66c                     U(       d  [        U R                  5      (       d  gU R                  5         U R                  R                  5       u  nu  p4[	        X4US9$ )z
Accept a connection from a client.

Will block until there is a new connection, and then return a
SocketPort object.

If block=False, None will be returned if there is no
new connection waiting.
N)conn)r   r   r8   accept
SocketPort)r#   blockr;   r$   r3   s        r   r<   PortServer.accept2   sJ     \$,,77!\\002lt$400r   c                 N    U R                  5         [        R                  " X5      $ r0   )r8   r   _send)r#   messages     r   rA   PortServer._sendD   s    t--r   c                     U R                  SS9nU(       a  U R                  R                  U5        U R                  5         [        R
                  " U 5      $ )NF)r>   )r<   r   appendr8   r   _receive)r#   r>   r3   s      r   rF   PortServer._receiveH   sD    {{{'JJd#!!$''r   )r   r   N)r   T)__name__
__module____qualname____firstlineno__r   r,   r4   r8   r<   rA   rF   __static_attributes__r*   r   r   r   r      s&    %F1$.(r   r   c                   :    \ rS rSrS	S jrS rS
S jrS rS rSr	g)r=   P   Nc                     [         R                  " U [        X5      S9  SU l        [	        5       U l        U R
                  R                  U l        Ucp  [        R                  " [        R                  [        R                  5      U l        U R                  R                  S5        U R                  R                  X45        OX0l        SS0nU R                  R                  " S0 UD6U l        U R                  R                  " S0 UD6U l        g )N)nameFT	bufferingr   )rb)wb)r   r   r   r7   r   _parsermessages	_messagesr   r   r   r   r    connectmakefile_rfile_wfile)r#   r$   r%   r;   kwargss        r   r   SocketPort.__init__Q   s    D~d'CDx..<!==9K9KLDLLL$$T*LL  $0Lq!ll++;F;ll++;F;r   c                     g)Nr   r*   r+   s    r   r,   SocketPort._get_device_typec   r.   r   c                    [        U R                  5      (       a}   U R                  R                  S5      n[        U5      S:X  a  U R                  5         g U R                  R                  [        U5      5        [        U R                  5      (       a  M|  g g ! [         a  n[	        UR
                  S   5      UeS nAff = f)Nr   r   )r   r   rZ   readOSErrorargslenr1   rU   	feed_byteord)r#   r>   byteerrs       r   rF   SocketPort._receivef   s    4<<((4{{''* 4yA~

&&s4y1 4<<((  4chhqk*34s   B 
C#B<<Cc                 "    U R                   R                  UR                  5       5        U R                   R                  5         g ! [         a>  nUR
                  S:X  a  U R                  5         [	        UR                  S   5      UeS nAff = f)N    r   )r[   writebinflushrb   errnor1   rc   )r#   rB   rh   s      r   rA   SocketPort._sends   sh    	0KKgkkm,KK 	0yyB

#((1+&C/	0s   AA 
B9B		Bc                 8    U R                   R                  5         g r0   )r   r1   r+   s    r   r4   SocketPort._close~   s    r   )rW   rU   rZ   r   r[   r7   r0   rH   )
rI   rJ   rK   rL   r   r,   rF   rA   r4   rM   r*   r   r   r=   r=   P   s    <$2	0r   r=   c                     [        X5      $ )zConnect to a socket port server.

The return value is a SocketPort object connected to another
SocketPort object at the server end. Messages can be sent either way.
)r=   r$   r%   s     r   rX   rX      s     d##r   c                     U R                  S5      n[        U5      S:w  a  [        S5      eUu  p# [        U5      nSUs=:  a  S:  d  O  [        S5      eX#4$ ! [         a  n[        S5      UeSnAff = f)	zParse and address on the format host:port.

Returns a tuple (host, port). Raises ValueError if format is
invalid or port is not an integer or out of range.
:   z&address must contain exactly one colonzport number must be an integerNr   i   zport number out of range)splitrd   
ValueErrorint)addresswordsr$   r3   ves        r   parse_addressr~      s     MM#E
5zQABBJDC4y
 tu344<  C9:BCs   A 
A4#A//A4c                     U  US 3$ )Ndr*   rt   s     r   r   r      s    VF1:r   )__doc__r   r   parserr   r   r   r   r   r   r=   rX   r~   r   r*   r   r   <module>r      sF   
    (4( 4(n/ /d$.r   