
    =	f1(                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddl ddlm	Z	 ddl
mZmZmZmZ dZdZdZdZd	Zd
ZdZd Zd Zd Zd Zd Zd ZddZd ZddZy)    N   )*)utils)BytesIOto_bytes_utf8to_bytes_latinto_string_latin      !         c                     | |z   || | |z    fS N offsetdatals      /usr/share/hplip/base/mdns.py	read_utf8r   1       !8T&***    c                     | |z   || | |z    fS r   r   r   s      r   	read_datar   4   r   r   c           
          t        j                  |      }| |z   t        j                  |t        || | |z                fS r   )structcalcsizeunpackr   )r   r   fmtr   s       r   read_data_unpackr!   7   s:    A!8V]]3tF6!87L(MNNNr   c                    d}| }d}|}	 t        |||dz          }|dz  }|dk(  rn|dz  }|dk(  r%t        |||      \  }}dj                  ||dg      }nc|dk(  rE|dk  r|dz   }|dz  dz  t        |||dz          z  }||k\  rt        j	                  d	|z         n|}nt        j	                  d
|z         n|dk\  r|} | |fS |} | |fS )N r   r      .?      z$Bad domain name (circular) at 0x%04xzBad domain name at 0x%04x)ordr   joinlogerror)	r   r   resultoffnextfirstr   tutf8s	            r   	read_namer3   ;   s   F
CDE
SQ q6H9!#tQ/ICWWfdC01F$YaxQwH?c$s3q5/&::Ce|		@3FGE II1C787 : qy
 6> 6>r   c           	          |j                  d      D ]R  }|j                  d      }| j                  t        j                  dt        |                   | j                  |       T y )Nr&   zutf-8!B)splitencodewriter   packlen)packetnameputf8_strings       r   
write_namer?   g   sO    ZZ_ "hhw'V[[s;'789[!"r   c                    d}d}d}g }t               }t               }	 |j                  d       |j                          t        | ||t        z          }|dk(  r|dk(  r	 |S d}t        |       |z
  t        k  rd}|j                  t        j                  dd|||dd             |r_t        |d       |j                  t        j                  dd             |j                  t        j                  dt        t                     d}	| ||t        z    D ]  }
|j                  d       |j                          |s6|	r4d	}	t        |d       |j                  t        j                  dd             n%|j                  t        j                  d
d             |j                  t        j                  dt        t                     |j                  t        j                  dd             |j                         }|j                  t        j                  d
d             t        ||
       |j                  t        j                  d
d             |j                         |z
  dz
  }|j                  |       |j                  t        j                  d
|             |j                  d       |j                  |j                                 |j                  |j                                |dz  }|rd}d	})Nr   r   Ti   !HHHHHHz_pdl-datastream._tcp.localr5   !HHFz!Hi  z!Ii        )r   seektruncater:   MAX_ANSWERS_PER_PACKETr8   r   r9   r?   	QTYPE_PTR	QCLASS_INtellreadappendgetvalue)answersindexnum_questionsfirst_packetpacketsr;   answer_recordnum_answersflagsfirst_recorddrdlength_posrdlengths                r   create_outgoing_packetsrZ   n   s   EMLGYFIM
A'%.D(DEF! 2x Nu w<%#99E 	V[[FE=+W]_efgv;<LLT401 LLUIyABu%;;<  	/Aq!""$  L$=*FG##FKKd$;<##FKKf$=> E9i HI D& 9:(--/L D& 9: }a(D& 9: %))+l:Q>H|,D( ;<q!LL++-.A 	/D 	v()M LC r   c                    d }	 t        j                   t         j                  t         j                  t         j                        }t        j                   t         j                  t         j                        }|j	                  d       |j                         d   }|j                          |j                  d       t        j                  d|       } 	 |j                  t         j                  t         j                  d       |j                  t         j                  t         j                  d       	 |j                  t         j"                  t         j$                  |        |j                  t         j"                  t         j&                  t        j(                  |      t        j(                  d      z          |j                  t         j"                  t         j*                  d       |S # t         j                  $ r* t        j                  d       |r|j                          Y y w xY w# t         t         j                  f$ r Y w xY w# t,        $ r4}t        j                  d|z         |r|j                          Y d }~y d }~ww xY w)N)z1.2.3.48   r   BzNetwork errorr   z0.0.0.0z-Unable to setup multicast socket for mDNS: %s)socketAF_INET
SOCK_DGRAMIPPROTO_UDPconnectgetsocknameclosesetblockingr   r9   r,   r+   
setsockopt
SOL_SOCKETSO_REUSEADDRSO_REUSEPORTAttributeErrorSOL_IPIP_MULTICAST_TTLIP_MULTICAST_IF	inet_atonIP_MULTICAST_LOOP	Exception)ttlsxintfes        r   createSocketsWithsetOptionrv      s   
AMM&..&*;*;V=O=OPMM&..&*;*;<			/"}}q!			akk#s#	V&&(;(;Q?	V&&(;(;Q?	V]]F$;$;SA	V]]F$:$:F<L<LT<RU[UeUefoUp<pq	V]]F$<$<a@ H+ << 		/"GGI	 FLL)   		AAEFGGI	s>   CG* AH* 2B6I
 *:H'&H'*II
	J*JJc                    t                ddddddddd}t        j                  dt        |       z         t        j	                  | d       d}t        || d	      \  }\  }}}}}}	t        j                  d
||||||	fz         t        |      D ]I  }
t                t        ||       \  }}t        || d      \  }\  }}t        j                  d|||fz         K d}t        ||z   |	z         D ]Z  }t                t        ||       \  }}t        || d      \  }}|d   t        k(  r_t        || d      \  }}dj                  |D cg c]  }t        t        |             c}      }t        j                  d|z         ||d<   |d   t        k(  rNt        ||       \  }}t        j                  d|z         ||d<   |j                  |j                  dd             |d   t         k(  rt        || |d         \  }}i d}}|t        |      k  rLt        |||dz          }|dz  }||||z    }	 |j#                  d      \  }}|||<   ||z  }|t        |      k  rLt        j                  dt'        |      z         	 d|d   z  |d<   	 d|d   z  |d<   d|v s|d   |d<   |d   t*        k(  r:t        || d      \  }\  }}}t        ||       \  }}|j                  d d      |d!<   |d   t,        k(  r3t        || d      \  }}t        j                  d"t'        |      z         =t        j/                  d#|d   z          ||fS  ||fS c c}w # t$        $ r Y w xY w# t(        $ r% t        j                  dt'        |      z         Y w xY w# t(        $ r% t        j                  dt'        |      z         Y -w xY w)$Nr   r#   r   0)num_devices	num_ports
product_idmacstatus_codedevice2device3notezIncoming: (%d)r   widthrA   z3Response: ID=%d FLAGS=0x%x Q=%d A=%d AUTH=%d ADD=%drB   zQ: %s TYPE=%d CLASS=%dz!HHiH   r&   zA: %sipzPTR: %smdnsz._pdl-datastream._tcp.local.   =zTXT: %sz'MFG:Hewlett-Packard;MDL:%s;CLS:PRINTER;tydevice1zNO ty Key in txt: %susb_MDLzNO usb_MDL Key in txt: %sr   z!HHHz.local.hnzAAAA: %szUnknown DNS record type (%d).)update_spinnerr+   debugr:   log_datar!   ranger3   QTYPE_Ar   r*   strr)   rH   rL   replace	QTYPE_TXTr6   
ValueErrorreprKeyError	QTYPE_SRV
QTYPE_AAAAr,   )r   rN   yr   idrU   rP   rT   num_authoritiesnum_additionalsquestionr<   typclsr    recordinfor-   rs   r   txtr.   r   keyvaluepriorityweightportservers                                r   updateReceivedDatar      s   2bcc2	GA IIT*+LLRL Fy1 VFUR{O_ IIC	UM;QR S -( ? .-fdEB
c		*dC-==>	? Co5GH = .'g>7g&vtQ7NFF713s1v;78BIIgl#AdG!W	!$VT2LFDIIi$&'AfINN4<<(FKL!W	!$VT47;LFD1CD	/SQ(qc#a%!'c!2JC$CH q D	/ IIi$s)+,>H3t9T)CH3y>Y)
 }K&	!W	!/?f/U,F,Xvt&vt4NFFnnY3AdG!W
"&vtR8NFFIIj4</0 II5Q?@g:}=| g:o 8, "   >		049<=>  C		5S	ABCs<   M
1M M&N	M#"M#&*NN*OOc                 4   d\  }}i }g }t        |       }|si S t        j                         }|}||z   }	d}
	 t        j                         }||	kD  rn||k\  ri	 t        |      D ]O  }t        j	                  dt        |      z         t        j                  |d       |j                  |d||f       Q 	 ||
z  }|
dz  }
t                t        j                  |gg |gd	      \  }}}|s|j                  d
      \  }}t        |      }|r#t        ||      \  }}|||j                  d      <   t        j	                  dt        |      z         |j!                          |S # t        j                  $ r"}t        j                  d|z         Y d }~d }~ww xY w)N)z224.0.0.251i  r   zOutgoing: (%d)r   r   r   z'Unable to send broadcast DNS packet: %srC   g      ?i @  r   zFound %d devices)rv   timerZ   r+   r   r:   r   sendtor^   r,   r   selectrecvfromr	   r   getrd   )rq   timeout
mcast_addr
mcast_portfound_devicesrN   rr   nowr/   lastdelayr=   ru   rwr   addrr   s                     r   detectNetworkDevicesr   4  s   /J
MG"3'A	
))+CD=DE
iik:$;I09 =AII.Q78LL"L-HHQJ
#;<= EMDQJE--R!c21aZZ&
dt$+D':JAw)*M!%%+&= @ II 3}#556GGI+ << I		CaGHHIs   AE" "F5FF)r   )r   
   )sysr   r^   r   r   randomregr#   r   sixextr   r   r   r	   rG   r   r   r   r   rH   rI   r   r   r!   r3   r?   rZ   rv   r   r   r   r   r   <module>r      s   2       	   K K 
		
		++O)X"KZ DTn0r   