
    |~gG                        d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZmZ d dlmZ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mZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+Z+ e+jX                  dd       d dl-m.Z.  e+jX                  dd       d dl-m/Z/ d dl-m0Z0 erd dl1m2Z2 d dl3m4Z4  G d d      Z5 G d d      Z6 G d de.jn                        Z8y)    N)Enumauto)gettext)
attrgetter)DictListTupleOptionalTYPE_CHECKINGUnionIterable)create_menuiteme_)Adapter)
AnyNetwork)	AnyDeviceDevice)AutoConnectConfig)ManagerProgressbar)Builder)AppletServiceDBusProxyFailed)ServiceUUIDAUDIO_SOURCE_SVCLASS_IDAUDIO_SINK_SVCLASS_IDHANDSFREE_AGW_SVCLASS_IDHANDSFREE_SVCLASS_IDHEADSET_SVCLASS_IDHID_SVCLASS_IDGtkz3.0)r    Gdk)r!   )GLib)ManagerDeviceList)Bluemanc                   J    e Zd Z G d de      Zdej                  dedefdZy)DeviceMenuItemc                   D    e Zd Z e       Z e       Z e       Z e       Zy)DeviceMenuItem.GroupN)__name__
__module____qualname__r   CONNECT
DISCONNECTAUTOCONNECTACTIONS     G/usr/lib/python3/dist-packages/blueman/gui/manager/ManagerDeviceMenu.pyGroupr(   %   s    &V
f&r1   r3   itemgrouppositionc                 .    || _         || _        || _        y N)r4   r5   r6   )selfr4   r5   r6   s       r2   __init__zDeviceMenuItem.__init__+   s    	
 r1   N)	r)   r*   r+   r   r3   r    MenuItemintr:   r0   r1   r2   r&   r&   $   s,     !S\\ !% !3 !r1   r&   c            	       *    e Zd Zdddededee   fdZy)MenuItemsProvider_manager_menuManagerDeviceMenu_device_poweredreturnc                     g S r8   r0   )r9   r?   rA   rB   s       r2   on_request_menu_itemsz'MenuItemsProvider.on_request_menu_items2   s	     	r1   N)r)   r*   r+   r   boolr   r&   rE   r0   r1   r2   r>   r>   1   s4     	 	
  
n	r1   r>   c                       e Zd ZU i Zeeef   ed<   g Zed    ed<   e	ed<   d+ fdZ
d,dZdeej                     ddf fd	Zd,d
Zde	deddfdZde	dee   fdZde	ddfdZdeeef   dedededdf
dZdZefde	deddfdZedfde	dededdfdZddde	dej<                  deeef   ddf
d Z d!e!jD                  ddfd"Z# G d# d$e$      Z%e%jL                  e%jL                  e%jN                  e%jN                  e%jN                  e%jN                  e%jP                  e%jP                  e%jR                  e%jT                  e%jT                  d%Z+d&e,e   de-fd'Z.d,d(Z/e0d)edejb                  fd*       Z2 xZ3S )-r@   __ops____instances__SelectedDevicerC   Nc                 v   t         |           | j                  d       || _        d| _        | j                  j
                  j                  d| j                        | _        t        j                  j                  |        t               | _        | j                  j                  d| j                         t!               | _        | j"                  j                  d| j                         	 t%               | _        | j/                          y # t(        $ r! t+        j,                  dd       d | _        Y :w xY w)Nr@   Fzdevice-property-changedzproperty-changedz** Failed to connect to appletT)exc_info)superr:   set_namer$   is_popupr   connecton_device_property_changed_device_property_changed_signalr@   rI   appendr   _any_networkconnect_signal_on_service_property_changedr   _any_devicer   _applr   loggingerrorgenerate)r9   blueman	__class__s     r2   r:   zManagerDeviceMenu.__init__B   s    )*/3||/@/@/H/HIbIMIhIh0j,''..t4&L(();T=^=^_$;''(:D<]<]^	2?/DJ
 		  	MM:TJDJ	s   .D 'D87D8c                 .    t        j                  d       y )Nzdeleting devicemenu)rY   debug)r9   s    r2   __del__zManagerDeviceMenu.__del__[   s    +,r1   eventc                 R    d| _         | j                          t        |   |       y )NT)rO   r[   rM   popup_at_pointer)r9   ra   r]   s     r2   rc   z"ManagerDeviceMenu.popup_at_pointer^   s      'r1   c                 X     dt         j                  dd f fd} j                  |       y )NchildrC   c                 H    j                  |        | j                          y r8   )removedestroy)re   r9   s    r2   remove_and_destroyz3ManagerDeviceMenu.clear.<locals>.remove_and_destroye   s    KKMMOr1   )r    Widgetforeach)r9   ri   s   ` r2   clearzManagerDeviceMenu.cleard   s)    	cjj 	T 	 	'(r1   devicemessagec                 :   |t         j                  |j                         <   t         j                  D ]g  }t	        j
                  d|        |j                  | j                  k(  s5|j                  r|j                  j                  sX|j                          i y Nzop: regenerating instance r@   rH   get_object_pathrI   rY   inforJ   rO   propsvisibler[   )r9   rm   rn   insts       r2   set_opzManagerDeviceMenu.set_opk   sw    >E!!&"8"8":;%33 	 DLL5dV<=""d&9&994==Y]YcYcYkYk	 r1   c                 d    	 t         j                  |j                            S # t        $ r Y y w xY wr8   )r@   rH   rr   KeyError)r9   rm   s     r2   get_opzManagerDeviceMenu.get_opr   s3    	$,,V-C-C-EFF 		s    # 	//c                 6   t         j                  |j                         = t         j                  D ]g  }t	        j
                  d|        |j                  | j                  k(  s5|j                  r|j                  j                  sX|j                          i y rp   rq   )r9   rm   rv   s      r2   unset_opzManagerDeviceMenu.unset_opx   st    %%f&<&<&>?%33 	 DLL5dV<=""d&9&994==Y]YcYcYkYk	 r1   _servicekey_value_pathc                 0    |dk(  r| j                          y y )N	Connected)r[   )r9   r}   r~   r   r   s        r2   rV   z.ManagerDeviceMenu._on_service_property_changed   s    +MMO r1   $00000000-0000-0000-0000-000000000000uuidc                 :    dt         dd dd dd f fd}dt        t            dt        j                  dd dd f fd} j	                  t        d             t         j                  | j                  k(  	      | j                  k(  rj                  d
 fd        j                   |d t        j                  d      d        y  j                  j                  dj                         |||t        j                         j                          y )N_obj_result
_user_datarC   c                     t        j                  d       j                  t        d             j	                         y )NsuccesszSuccess!)rY   rs   rn   _r|   )r   r   r   rm   progr9   s      r2   r   z2ManagerDeviceMenu.connect_service.<locals>.success   s+    LL#LL:'MM&!r1   resultc                     j                  t        d             j                         t        j                  d|        j                  |       y )NFailedzfail )rn   r   r|   rY   warning_handle_error_message)r   r   r   rm   r   r9   s      r2   failz/ManagerDeviceMenu.connect_service.<locals>.fail   s@    LL8%MM&!OOeF8,-&&v.r1   u   Connecting…)cancellable	cancelledc                 &    j                        S r8   )disconnect_service)xrm   r9   s    r2   <lambda>z3ManagerDeviceMenu.connect_service.<locals>.<lambda>   s    0G0G0O r1   !Applet DBus Service not availablez(os)result_handlererror_handlertimeout)r   r
   r"   Errorrw   r   r   r$   GENERIC_CONNECTrP   rX   ConnectServicerr   MAXINTstart)r9   rm   r   r   r   r   s   ``   @r2   connect_servicez!ManagerDeviceMenu.connect_service   s    	"- 	"$ 	"D 	"T 	"	/x. 	/

 	/PT 	/Y] 	/ 	FAo./!$,,DDDXDX<XY4'''LL&OP::tzz"EFM

!!&&*@*@*BD18*.++ 	" 	7 	

r1   r   portc           	      H    dt         dd dd dd f fd}dt        t            dt        j                  dd dd f fd} j                   |d t        j                  d      d        y  j                  j                  d	|j                         ||||t        j                  
       y )Nr   r   
_user_daterC   c                 P    t        j                  d       j                          y )Nzdisconnect success)rY   rs   r[   )r   r   r   r9   s      r2   okz0ManagerDeviceMenu.disconnect_service.<locals>.ok   s    LL-.MMOr1   r   c                     t        j                  d|        t        |j                        \  }}j                  j                  t        d      |z   |       j                          y )Nzdisconnect failed zDisconnection Failed: )bt)rY   r   r   rn   r$   infobar_updater   r[   )r   r   r   msgtbr9   s        r2   errz1ManagerDeviceMenu.disconnect_service.<locals>.err   sT    OO09:(GCLL''*B(Cc(Ib'QMMOr1   r   z(osd)r   )r   r
   r"   r   rX   DisconnectServicerr   r   )r9   rm   r   r   r   r   s   `     r2   r   z$ManagerDeviceMenu.disconnect_service   s    	] 	T 	t 	 		h}- 	tzz 	t 	X\ 	 ::djj!DEtL

$$Wf.D.D.Fd46cSWS^S^ 	% 	`r1   lstr#   rA   	tree_iter	key_valuec                 z    |\  }}|j                  ||j                               r|dv r| j                          y y y )N)r   UUIDsTrustedPairedBlocked)compareselectedr[   )r9   r   rA   r   r   r~   values          r2   rQ   z,ManagerDeviceMenu.on_device_property_changed   s<    
U;;y#,,.1LL M 2r1   rZ   c                    | j                   j                  |j                  j                  dd      d   j	                               }|| j
                  j                  k(  r!t        j                  d       t        d      }n|| j
                  j                  k(  r!t        j                  d       t        d      }n|| j
                  j                  k(  rt        d      }ng|| j
                  j                  k(  r!t        j                  d	       t        d
      }n-|j                  j                  dd      d   j	                         }|| j
                  j                  k7  r(| j                  j                  t        d      |z          y y )N:   z~No audio endpoints registered to bluetoothd. Pulseaudio Bluetooth module, bluez-alsa, PipeWire or other audio support missing.zNo audio endpoints registeredzCbluetoothd reported input/output error. Check its logs for context.Input/output errorzDevice did not respondzJbluetoothd reported an unknown error. Retry or check its logs for context.zUnknown errorzConnection Failed: )_BLUEZ_ERROR_MAPgetrn   splitstrip_BluezErrorPROFILE_UNAVAILABLErY   r   r   CREATE_SOCKETPAGE_TIMEOUTUNKNOWNCANCELEDr$   r   )r9   rZ   r   r   s       r2   r   z'ManagerDeviceMenu._handle_error_message   s?   ##''(;(;C(CB(G(M(M(OP$""666OO p q34CD$$222OOab()CD$$111,-CD$$,,,OO C DO$C--%%c1-b1779C$""+++LL''*?(@3(FG ,r1   c                   R    e Zd Z e       Z e       Z e       Z e       Z e       Zy)ManagerDeviceMenu._BluezErrorN)	r)   r*   r+   r   r   r   r   r   r   r0   r1   r2   r   r      s&    v"f6&r1   r   )zProtocol not availablez!br-connection-profile-unavailabler   z	I/O errorzbr-connection-create-socketzle-connection-create-socketzHost is downzbr-connection-page-timeoutzbr-connection-unknown	Cancelledzbr-connection-canceleddevice_uuidsc           	          |D ]P  }t        |      }|j                  t        t        t        t
        t        t        dfv r y|j                  rJ|dk(  sP y | S )Ni  Tz$03b80e5a-ede8-4b33-a751-6ce34ec4c700)	r   
short_uuidr   r   r   r   r   r   reserved)r9   r   r   service_uuids       r2   show_generic_connect_calcz+ManagerDeviceMenu.show_generic_connect_calc   sf      		 D&t,L&&+-BD\^r&+  !**AA		   r1   c           
           j                           j                  r j                  j                  rT j                  j
                  j                         }|sy  j                  j
                  j                  |ddddddd      }n j                  j
                  j                         \  }} j                  j
                  j                  ||      }|y |d   }|t        d	       j                  j
                  j                  j                  |      }|J  j                  j
                  j                  j                  |      }|J  j                  j
                  j                  |ddddddd      }|d    _         j                   j                        }	|	?t!        |	d
      }
d|
j                  _        |
j%                           j'                  |
       y  j)                   j                  d         }t+         j                  d         d   }|d   sj|rh|rft!        t-        d      d      }|j/                  d fd       t-        d      |j                  _        |j%                           j'                  |       nl|d   rg|ret!        t-        d      d      }t-        d      |j                  _        |j/                  d fd       |j%                           j'                  |       t3        j4                  |d           j                  j6                  j9                  t:              D 
cg c]&  }|j=                    j                  |      D ]  }
|
 ( }}}
|D cg c],  }|j>                  t@        jB                  jD                  k(  s+|. }}|D cg c],  }|j>                  t@        jB                  jF                  k(  s+|. }}|D 
cg c],  }
|
j>                  t@        jB                  jH                  k(  s+|
. }}
|D cg c],  }|j>                  t@        jB                  jJ                  k(  s+|. }}|r_ j'                   jM                  t-        d                   tO        |tQ        d            D ]  } j'                  |jR                          |r_ j'                   jM                  t-        d                   tO        |tQ        d            D ]  } j'                  |jR                          tU               }tW        d      } j                  jY                         } j                  d   }|t[        |      ft]        |d         v }|d   s|s|rĉ j'                   jM                  t-        d                    |d   s|r^t_        j`                  |jb                  !      }
|je                  |
|t[        |      f       |
j%                           j'                  |
       tO        |tQ        d            D ]  } j'                  |jR                          |r|s|s|s|r5t_        jf                         }
|
j%                           j'                  |
       tO        |tQ        d            D ]  } j'                  |jR                          |rt!        t-        d"      d#      }d|j                  _         j'                  |       |j%                          |d   r&|j/                  d fd$       d%|j                  _        t_        jf                         }
|
j%                           j'                  |
       t!        t-        d&      d'      }
t-        d(      |
j                  _         j'                  |
       |
j%                          |d   s|
j/                  d fd)       nd|
j                  _        |d   sLt!        t-        d*      d+      }
|
j/                  d fd,        j'                  |
       |
j%                          nKt!        t-        d-      d.      }
 j'                  |
       |
j/                  d fd/       |
j%                          t-        d0      |
j                  _        |d   sLt!        t-        d1      d2      }
|
j/                  d fd3        j'                  |
       |
j%                          nKt!        t-        d4      d2      }
 j'                  |
       |
j/                  d fd5       |
j%                          t-        d6      |
j                  _        d7t^        jh                  dtj        d8d f fd9}t^        jh                  jm                  t-        d:            }
|
j/                  d| j                          j'                  |
       |
j%                          t_        jf                         }
|
j%                           j'                  |
       t!        t-        d;      d<      }
|
j/                  d fd=        j'                  |
       |
j%                          t-        d>      |
j                  _        y c c}
}w c c}w c c}w c c}
w c c}w )?Naliaspaired	connectedtrustedobjpushrm   blockedr   zPath should never be Nonez!network-transmit-receive-symbolicFr   r   )obj_pathPoweredz<b>_Connect</b>zbluetooth-symbolicactivatec                 :    j                  j                        S r8   )r   rJ   _itemr9   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>(  s    4;O;OPTPcPc;d r1   z>Connects auto connect profiles A2DP source, A2DP sink, and HIDz<b>_Disconnect</b>zbluetooth-disabled-symbolicz Forcefully disconnect the devicec                 :    j                  j                        S r8   )r   rJ   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>/  s    4;R;RSWSfSf;g r1   z<b>Connect To:</b>r6   )r~   z<b>Disconnect:</b>r   Addressservicesz<b>Auto-connect:</b>)labelu   Send a _File…zblueman-send-symbolicc                 N    j                   j                  j                        S r8   )r$   sendrJ   r   r9   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>h  s    8I8I$J]J]8^ r1   T_Pairzblueman-pair-symboliczCreate pairing with the devicec                 N    j                   j                  j                        S r8   )r$   bondrJ   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>t  s    t||/@/@ATAT/U r1   _Trustzblueman-trust-symbolicc                 N    j                   j                  j                        S r8   r$   toggle_trustrJ   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>z      t||/H/HI\I\/] r1   _Untrustzblueman-untrust-symbolicc                 N    j                   j                  j                        S r8   r   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>  r   r1   z"Mark/Unmark this device as trusted_Blockzblueman-block-symbolicc                 N    j                   j                  j                        S r8   r$   toggle_blockedrJ   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>      t||/J/J4K^K^/_ r1   _Unblockc                 N    j                   j                  j                        S r8   r   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>  r   r1   zBlock/Unblock this devicer   rC   c                    dt         j                  dt        dd ffd}t        d      }|j	                  dt         j                        }|j                  j                  j                         d|j                  _	        |j	                  dt         j                        j                  d          |j                  d	|       |j                          y )
Ndialogresponse_idrC   c                    |t         j                  j                  k(  r=t        t         j                        sJ j                  dj                                n|dk(  rj                  dd       | j                          y )NAlias    )r    ResponseTypeACCEPT
isinstanceEntrysetget_textrh   )r   r   alias_entryrm   s     r2   on_responsezBManagerDeviceMenu.generate.<locals>.on_rename.<locals>.on_response  sb    #"2"2"9"99%k399===JJw(<(<(>? A%JJw+ r1   zrename-device.uir\   r  r   response)r    Dialogr<   r   
get_widgetset_transient_forr$   windowrt   	icon_namer  set_textrP   present)r   rm   r  builderr   r  r9   s    `   @r2   	on_renamez-ManagerDeviceMenu.generate.<locals>.on_rename  s    !CJJ !S !T ! 01G''#**=F$$T\\%8%89%.FLL"!,,]CIIFK  1NN:{3NNr1   u   R_ename device…u
   _Remove…zlist-remove-symbolicc                 N    j                   j                  j                        S r8   )r$   rg   rJ   r   s    r2   r   z,ManagerDeviceMenu.generate.<locals>.<lambda>  s    4<<+>+>t?R?R+S r1   z.Remove this device from the known devices list)7rl   rO   rt   ru   r$   r   r   r   get_pointerget_path_at_pos	TypeErrorfilterget_iterconvert_iter_to_child_iterrJ   rz   r   	sensitiveshowrS   r   r   r   rP   tooltip_textrY   r_   Pluginsget_loaded_pluginsr>   rE   r5   r&   r3   r,   r-   r.   r/   _create_headersortedr   r4   r   r   rr   strr  r    CheckMenuItemnamebind_to_menuitemSeparatorMenuItemr;   r   new_with_mnemonic)r9   r   rowr   yposdatapathr   
child_iteropr4   show_generic_connectpoweredconnect_itempluginitemsiconnect_itemsdisconnect_itemsautoconnect_itemsaction_itemsitconfiggeneric_serviceobject_path	btaddressgeneric_autoconnect	send_itemr  s   `                            r2   r[   zManagerDeviceMenu.generate   sl   

}}

 2 2||((113H,,##'''8[R[]fhp(13C \\&&224FQll''771=G1:D| ;<<))0099$?I(((**11LLYWJ))),,##''
GX{T]_hjr(13C "(m[[,,->!05X!YD#(DJJ IIKKK#==d>Q>QRY>Z[4#6#6y#AB9M;$8W*1->+?AUVL  -de./0p.qL+KK%"6*1-A+BDabL./0R.SL+  -ghKK%c'l#$(LL$8$8$K$KL]$^ _&#99$@S@SU\]_  _ _ _ %*UqQWW8L8L8T8T-TUU',[!>;O;O;Z;Z0ZA[[.3fdtzz^EYEYEeEe7eTff#(TaAGG~7K7K7S7S,STTKK++A.B,CDE]
:0FG %BGG$% KK++A.B,CDE-:j3IJ %BGG$% #$%&LM))99;''	2	*C,@ASPZI[E\\{26GKK++A.D,EFG;#6((/C/CD''y#o:N.OP		D!.Jz4JK %BGG$% ,BRVg((*DIIKKK:j+AB 	!BKK 	! '*;(<>UVI(-IOO%KK	"NN9~!!*.^_,0	)((*DIIKKKqz+BC"#$D"E

D		8}LL%UV#(DJJ 9~"1X;0HIDLL%]^KKIIK"1Z=2LMDKKLL%]^IIK"#$H"I

9~"1X;0HIDLL%_`KKIIK"1Z=2JKDKKLL%_`IIK"#$?"@

	S\\ 	6 	d 	$ ||--a0C.DEZD,?,?@D		$$&		Dq0FGZ!STD		"#$T"U

u_ V[fTs6   ;+i-,ii$,ii,i"i",i'?i'textc                    t        j                         }t        j                         }|j                  |        d|j                  _        |j                          |j                  |       d|j                  _        |j                          |S )Ng        F)	r    r;   Label
set_markuprt   xalignr  addr  )r<  r4   r   s      r2   r  z ManagerDeviceMenu._create_header  s`    ||~		 

$

		r1   )r\   r$   rC   N)rC   N)4r)   r*   r+   rH   r   r  __annotations__rI   r   r   r:   r`   r
   r!   Eventrc   rl   rw   rz   r|   r   r   r   objectrV   r   r   r<   r   r    TreeIterr	   rQ   r"   r   r   r   r   r   r   r   r   r   r   r   rF   r   r[   staticmethodr;   r  __classcell__)r]   s   @r2   r@   r@   <   s8    GT#s(^ /1M4+,12-(hsyy&9 (d () V  c  d  V   v  $  U:y;P5Q X[ ek ,/48
 =O:I f C d : >MZ[ ` `s `TW ``d `$ .A  F  _b_k_k  .3CK.@ EI H4:: H$ H,d  #."A"A-8-L-L)77 ..'2'@'@'2'@'@#00&1&>&>!,!4!4 ))"-"6"6 hsm    sVj 
S 
S\\ 
 
r1   r@   )9rY   enumr   r   r   r   operatorr   typingr   r   r	   r
   r   r   r   blueman.Functionsr   r   blueman.bluez.Adapterr   blueman.bluez.Networkr   blueman.bluez.Devicer   r    blueman.config.AutoConnectConfigr   &blueman.gui.manager.ManagerProgressbarr   blueman.main.Builderr   blueman.main.DBusProxiesr   r   blueman.Sdpr   r   r   r   r   r   r   girequire_versiongi.repositoryr    r!   r"   %blueman.gui.manager.ManagerDeviceListr#   blueman.main.Managerr$   r&   r>   Menur@   r0   r1   r2   <module>rZ     s         N N N 1 ) , 2 > E ( C   
   5%      5%    G,
! 
! @ @r1   