
    |~g                         d dl m Z d dlmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lZd d
lZd d
lZd dlmZ d dlmZ d dlmZ  G d dee      Zy
)    )gettext)DictAnyCallableTuple)AppletPlugin)Notification)SERIAL_PORT_SVCLASS_ID)RFCOMMConnectedListener)get_services)rfcomm_listRFCOMMError)PopenN)Device)GLib)SerialServicec                   J   e Zd ZU dZ ed      ZdZdddZded ed	       ed
      diZ	i Z
eeeedf   f   ed<   d)dZd)dZd)dZdedededdfdZdededdfdZdeddfdZdededeeef   ddfdZdeded dddfd!Zded"ed#ed$ededdfd%Zdeddfd&Zd'eddfd(Zy)*SerialManagerzbluetooth-symboliczHStandard SPP profile connection handler, allows executing custom actionswalmisz!org.blueman.plugins.serialmanagerN)schemapathscript zScript to execute on connectiona+  <span size="small">The following arguments will be passed:
Address, Name, service name, uuid16s, rfcomm node
For example:
AA:BB:CC:DD:EE:FF, Phone, DUN service, 0x1103, /dev/rfcomm0
uuid16s are returned as a comma separated list

Upon device disconnection the script will be sent a HUP signal</span>)typedefaultnamedescz
Popen[Any]scriptsreturnc                     i | _         y N)r   )selfs    F/usr/lib/python3/dist-packages/blueman/plugins/applet/SerialManager.pyon_loadzSerialManager.on_load*   s	        c                 d    | j                   j                         D ]  }| j                  |        y r!   )r   keysterminate_all_scriptsr"   bdaddrs     r#   	on_unloadzSerialManager.on_unload-   s,    ll'') 	/F&&v.	/r%   c                 r    t        j                  d       | j                  D ]  }| j                  |        y )NzTerminating any running scripts)loggingdebugr   r(   r)   s     r#   	on_deletezSerialManager.on_delete1   s0    78ll 	/F&&v.	/r%   r   keyvaluec                 x    |dk(  r5|s2t        |      }| j                  |d          | j                  |       y y y )N	Connected)obj_pathAddress)r   r(   on_device_disconnect)r"   r   r0   r1   devices        r#   on_device_property_changedz(SerialManager.on_device_property_changed6   s?    +eT*F&&vi'89%%f- ',r%   serviceportc                 *   |j                   }t        |j                  k(  rtt        t	        d      t	        d      |j
                  |fz  d      j                          | j                  |d   |j
                  |j                  |j                  |       y y )NzSerial port connectedzKSerial port service on device <b>%s</b> now will be available via <b>%s</b>blueman-serial	icon_namer5   )	r7   r
   
short_uuidr	   _display_nameshowcall_scriptr   )r"   r9   r:   r7   s       r#   on_rfcomm_connectedz!SerialManager.on_rfcomm_connected<   s    !W%7%7723hi,,dm4 4#35 6:TVVI.#00$\\$//!	# 8r%   addressc                 j   || j                   vry | j                   |   j                         D ]S  }t        j                  d|j                          	 t        j                  |j                  t        j                         U y # t        $ r% t        j                  d|j                          Y w xY w)NSending HUP to zNo process found for pid )r   valuesr-   infopidoskillpgsignalSIGHUPProcessLookupErrorr.   )r"   rE   ps      r#   r(   z#SerialManager.terminate_all_scriptsJ   s    $,,&g&--/ 	CALL?155'23C		!%%/	C & C 9!%%ABCs   .B+B21B2rJ   _condaddress_nodec                 `    |\  }}| j                   |   |= t        j                  d| d       y )NzScript with PID z closed)r   r-   rI   )r"   rJ   rQ   rR   rE   nodes         r#   on_script_closedzSerialManager.on_script_closedV   s2    $LL!$''uG45r%   rT   processc                    || j                   vri | j                   |<   || j                   |   v r | j                   |   |   j                          || j                   |   |<   t        j                  |j                  | j
                  ||f       y r!   )r   	terminater   child_watch_addrJ   rU   )r"   rE   rT   rV   s       r#   manage_scriptzSerialManager.manage_script[   sz    $,,&$&DLL!4<<((LL!$'113&-Wd#W[[$*?*?'4Qr%   r   sv_nameuuid16c           	         | j                  d      }|rj|dk7  rd|j                  d      }	 |||||d|gz  }t        j                  dj	                  |             t        |d       }| j                  |||       y y y # t        $ rd}	t        j                  t        |	             t        t        d      t        d      |t        |	      fz  d	
      j                          Y d }	~	y d }	~	ww xY w)Nr   r    z#xc                  .    t        j                  dd      S )Nr   )rK   setpgid r%   r#   <lambda>z+SerialManager.call_script.<locals>.<lambda>l   s    2::a3C r%   )
preexec_fnz$Serial port connection script failedz*There was a problem launching script %s
%sr<   r=   )
get_optionsplitr-   r.   joinr   rZ   	Exceptionstrr	   r@   rB   )
r"   rE   r   r[   r\   rT   cargsrP   es
             r#   rC   zSerialManager.call_scripte   s    OOH%b773<D@$F2;FFchhtn-$+CD""7D!4 1  @c!f%QEF  $ %()3q6{3'79 :>@s   AA? ?	C,AC''C,c                    | j                   j                         D ]m  \  }}|j                  d|d      }|st        j                  d|j
                          t        j                  |j
                  t        j                         o y )N/dev/rfcommirG   )
r   itemsgetr-   rI   rJ   rK   rL   rM   rN   )r"   r:   r*   r   rV   s        r#   on_rfcomm_disconnectz"SerialManager.on_rfcomm_disconnectw   si    #||113 	6OFGkkKQx"89Gw{{m<=		'++v}}5		6r%   r7   c                    t        |      D cg c]  }t        |t              s| }}|sy 	 t               D cg c]  }|d   |d   k(  s|d    }}|D ]5  }d|d}	 t        j                  d|        |d   j                  |       7 y c c}w c c}w # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w# t        j                  $ r t        j                  d	| d
       Y w xY w)Ndstr5   idzrfcomm_list failed with: rm   dzDisconnecting r   zFailed to disconnect T)exc_info)r   
isinstancer   r   r   r-   errorrI   
disconnectr   Error)	r"   r7   r9   serial_servicesrfcommactive_portsrk   r:   r   s	            r#   r6   z"SerialManager.on_device_disconnect~   s   2>v2Fmw*U\^kJl7mm	7B}kVuY_`iYjHjF4LkLk
 ! 	MD a)DM~dV45"--d3		M n l 	MM5aS9:	 :: M 5dV<tLMsJ   BBB BBB  ,CB 	C"B??C-C76C7)r   N)__name__
__module____qualname____icon__r@   __description__
__author____gsettings__rh   __options__r   r   __annotations__r$   r+   r/   r   r8   r   rD   r(   intr   rU   rZ   rC   rq   r   r6   ra   r%   r#   r   r      s   #HbcOJ 6M
 	32>? e fg	K 35GT#tC-../4//
.s . .S .T .#= # # #
CS 
CT 
C6C 6 65c? 6W[ 6
RS R Rl Rt R@3 @c @C @ @TW @\` @$6 6 6M6 Md Mr%   r   ) r   r@   typingr   r   r   r   blueman.plugins.AppletPluginr   blueman.gui.Notificationr	   blueman.Sdpr
   "blueman.plugins.applet.DBusServicer   blueman.services.Functionsr   _bluemanr   r   
subprocessr   r-   rK   rM   blueman.bluez.Devicer   gi.repositoryr   blueman.services.metar   r   ra   r%   r#   <module>r      sH      - - 5 1 . F 3 -   	  '  /|ML"9 |Mr%   