U
    9_@                  	   @   s  d dl Z d dlZeje je jd d dlZd dlZd dlZd dl	Z	d dl
T G dd dZedkrd dlZe ZeeZg Ze D ]HZeeZzeeZee e W q ek
r   ee Y qX qe  eD ],Zee  e ZeD ]Zede qqdS )    N)Zdomain	localedir)*c                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )PhysicalDevicec                 C   s:   d | _ d | _d | _d| _d | _| | i | _tj| _	d S )NF)
devices_network_hostdnssd_hostname_cupsserverfirsturi
add_device
_user_data	ppdippstrZbackends
_ppdippstr)selfdevice r   2/usr/share/system-config-printer/PhysicalDevice.py__init__   s    
zPhysicalDevice.__init__c                 C   sf   t |drT|jdd}|jdd}|dks@| | rF|}qZd||f }n|j}tj|S )Nid_dictZMFG ZMDL%s %s)	hasattrr   getlower
startswithmake_and_modelcupshelpersppdsppdMakeModelSplit)r   r   mfgmdlr   r   r   r   _canonical_id)   s    
zPhysicalDevice._canonical_idc                 C   s4   |d krd S d|kr,d|kr,|dkr,|d S |S d S )N.:Z	localhostz.localr   )r   hostnamer   r   r   _add_dot_local_if_needed7   s    z'PhysicalDevice._add_dot_local_if_neededc              	   C   sh   z"t j|dt jdd d d }W n@   z"t j|dt jdd d d }W n   d }Y nX Y nX |S )Nr   )Zfamily   )socketZgetaddrinfoZAF_INETZAF_INET6)r   r#   addressr   r   r   _get_address@   s0    zPhysicalDevice._get_addressc           
      C   s^  d }d }d }t j|\}}|dks,|dkrd }|drRt j|dd  \}}|d k	r|drr|dd  }q|dr|dd  }q|d	r|dd  }qd
S qd
S n0|dks|dkrd
S t j|\}}|d krd
S |rt j|\}}|r$d }	z| |}	|	r|	}W n   Y nX n&|rJz| |}W n   d }Y nX | || |fS )NhpZhpfaxz/net/   zip=   z	hostname=	   zzc=)NNZdnssdZmdns)	urllibparseZ	splittyper   Z
splitqueryZ	splithostZ	splitportr(   r$   )
r   uriZhostporthost	dnssdhostZschemerestZipparamZportZipr   r   r   _get_host_from_uriL   sP    





z!PhysicalDevice._get_host_from_uric                 C   s2  | j s| jr| |j\}}t|dr2| |j}t|drP|d krP| |j}|d kr`|d ks|rt| j rt|| j ks|r| jr|| jks|r| j r|| j ks|r| jr|| jkr|d kr| jd ks|d kr| j d krtn| 	|\}}| j
d kr,|| _|| _| | _| | _|jdd| _g | _
nXdd }|| j|| _|| j|| _|jdd}|dkr| jdkr|| jkrt|jdkr|jdd|_|jd	r|jd
dks|jds|jdr|jdrd| _n| jrd S | j
D ]}|j|jkr d S q| js0|j| _| j
| | j
  | j rV| js|jdkr| |j\| _ }|r|| _t|dr| j d kr|j}	|	r| |	| _ t|dr| jd kr|j}
|
r| |
| _| jr| j d krz| |
| _ W n   d | _ Y nX td|jt| f  d S )Nr'   r#   ZSNr   c                 S   s    dd }|||| k r|S | S )Nc                 S   s:   |   }d}tt| D ]}|| | | kr|d7 }q|S )Nr      )r   rangelen)slnir   r   r   count_lower   s    
z>PhysicalDevice.add_device.<locals>.nicest.<locals>.count_lowerr   )abr;   r   r   r   nicest   s    z)PhysicalDevice.add_device.<locals>.nicestr&   z:9100ipp:
/printers/dnssd:mdns:/cupsTZnetworkz&Device %s added to physical device: %s) r   r   r3   r/   r   r$   r'   r#   
ValueErrorr    r   r   r   r   Z	mfg_lowerZ	mdl_lowerr   r   sntypereplacer   findendswithr   r	   appendsortZdevice_classr(   Z
debugprintrepr)r   r   r0   r1   r   r   r>   rF   dr'   r#   r   r   r   r
   ~   s    
		



"






zPhysicalDevice.add_devicec                 C   s   | j S N)r   r   r   r   r   get_devices   s    zPhysicalDevice.get_devicesc                 C   s
  | j d jdr(| j d jddks^| j d jdsL| j d jdr| j d jdr| jspd| j }nJ| jr| jd	dkrd| j }n(| j| jkrd
| j| jf }n
d| j }nF| jdks| jdkr| jdr| j	
| j d j}nd| j| jf }| jrt| jdks2| jrt| jdkr| j d jdsZ| j d jdrn| j d jds| jr|| jdkr| jr|| jdkr| js|d| j 7 }n,| js|d| j 7 }n|d| j| jf 7 }nt| jdkr|d| j 7 }|S )Nr   r?   r@   rA   rB   rC   rD   z%sr"   z%s (%s)r   ZHPZFaxr   z (%s)z	 (%s, %s))r   r/   r   rI   rJ   r   r   r   r   r   r   infor6   rF   )r   rR   r   r   r   get_info   sd    

	zPhysicalDevice.get_infoc                 C   s   || j |< d S rO   )r   )r   keyvaluer   r   r   set_data  s    zPhysicalDevice.set_datac                 C   s   | j |S rO   )r   r   )r   rT   r   r   r   get_data  s    zPhysicalDevice.get_datac                 C   s   d|    S )Nz(description: %s))__repr__rP   r   r   r   __str__  s    zPhysicalDevice.__str__c                 C   s    d| j | j| j| j| j| jf S )Nz3<PhysicalDevice.PhysicalDevice (%s,%s,%s,%s,%s,%s)>)r   r   rF   r   r   r	   rP   r   r   r   rX     s     zPhysicalDevice.__repr__c           
      C   s|  t |t | krdS | jr(t| jdkrh|jr<t|jdkrh| jrPt| jdkrh|jrTt|jdksT| jrt| jdkr|jrt|jdkr| j|jksT| jrt| jdkr|jrt|jdkr| j|jksT| jrt| jdkr|jrt|jdkr| j|jksT| jrPt| jdkrP|jrPt|jdkrP| j|jksTdS | }|rdd | jD }|D ]}|j|krv dS qv|jdkr|jdks| jdkr| jdkr|jdkr| jdkr| jd |jd kS dS dd }|| \}}||\}}	||krdS |d	krF| j	dkrF| j	|j	krFdS ||	krTdS | j	dksl|j	dkrpdS | j	|j	kS )
NFr   c                 S   s   g | ]
}|j qS r   r/   .0xr   r   r   
<listcomp>7  s     z)PhysicalDevice.__eq__.<locals>.<listcomp>Tr   c                 S   s`   | j dks | j | j  r(| j}nd| j | jf }tj|\}}tj|tj|fS Nr   r   r   r   r   r   r   r   r   Z	normalizedevr   r   r   r   r   r   split_make_and_modelF  s     

z3PhysicalDevice.__eq__.<locals>.split_make_and_modelr)   )
rG   r   r6   r   rQ   r   r/   r   r   rF   
r   otherZdevsZurisrb   rc   Zour_mfgZour_mdlZ	other_mfgZ	other_mdlr   r   r   __eq__  s    
		




	
$
zPhysicalDevice.__eq__c           
      C   s  t |t | krdS | |kr dS | j|jkrT| jd kr:dS |jd krHdS | j|jk S | j|jkr| jd krndS |jd kr|dS | j|jk S | }|rdd | jD }|D ]}|j|kr dS q|jdkr|jdks| jdkr,| jdkr,|jdkr| jdkr| jd |jd k S |jdko*|jdkS dd }|| \}}||\}}	||kr^||k S ||	krp||	k S | jdks|jdkrdS | j|jk S )	NFTc                 S   s   g | ]
}|j qS r   rZ   r[   r   r   r   r^   {  s     z)PhysicalDevice.__lt__.<locals>.<listcomp>r   r   c                 S   s`   | j dks | j | j  r(| j}nd| j | jf }tj|\}}tj|tj|fS r_   r`   ra   r   r   r   rc     s     

z3PhysicalDevice.__lt__.<locals>.split_make_and_model)	rG   r   r   rQ   r   r/   r   r   rF   rd   r   r   r   __lt__`  sP    




	

zPhysicalDevice.__lt__N)__name__
__module____qualname__r   r    r$   r(   r3   r
   rQ   rS   rV   rW   rY   rX   rf   rg   r   r   r   r   r      s   
	2d+Br   __main__ )ZconfiggettextinstallZPACKAGEr   r   Zurllib.parser-   r   r&   debugr   rh   ZauthconnZ
ConnectioncZ
getDevicesr   Zphysicaldevicesvaluesr   Zphysicaldeviceindexr:   r
   rE   rK   rL   printrS   rQ   r   r   r   r   <module>   s:      


