o
    \c6                     @   sx  d dl m Z  d dlmZmZ d dlZd dlZd dl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 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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)m*Z* erd dl+m,Z, G dd de,Z-G dd de,Z.eeef Z/G dd de#Z0G dd de#Z1G dd de"Z2G dd de%Z3dS )    )datetime)gettextngettextN)escape)ListDictTYPE_CHECKINGCallableTupleOptionalUnion)AgentManager)Manager)Transfer)Session)launch)Notification_NotificationBubble_NotificationDialog)BluemanApplet)DbusService	DbusError)AppletPlugin)Config)GLibGio)	TypedDictc                   @   s*   e Zd ZU eed< ee ed< eed< dS )TransferDictpathsizenameN__name__
__module____qualname__str__annotations__r   int r(   r(   H/usr/lib/python3/dist-packages/blueman/plugins/applet/TransferService.pyr      s   
 r   c                   @   sB   e Zd ZU eed< eed< eed< eed< ee ed< eed< dS )PendingTransferDicttransfer_pathaddressrootfilenamer   r    Nr!   r(   r(   r(   r)   r*      s   
 r*   c                   @      e Zd ZdZdS )ObexErrorRejectedzorg.bluez.obex.Error.RejectedNr"   r#   r$   _namer(   r(   r(   r)   r0   )       r0   c                   @   r/   )ObexErrorCanceledzorg.bluez.obex.Error.CanceledNr1   r(   r(   r(   r)   r4   -   r3   r4   c                       s|   e Zd ZdZdef fddZdddZdd	d
ZdddZde	de
e	gdf de
egdf ddfddZdddZ  ZS )Agentz/org/bluez/obex/agent/bluemanappletc                    s   t  d d| jtjj | ddd| j | ddd| j | jddd| j	d	d
 | 
  || _td| _g | _d | _d | _i | _d S )Nzorg.bluez.obex.Agent1Releaser(    CancelAuthorizePush)osT)is_asyncorg.blueman.transfer)super__init___Agent__agent_pathr   BusTypeSESSION
add_method_release_cancel_authorize_pushregister_appletr   _config_allowed_devices_notification_pending_transfer	transfers)selfr6   	__class__r(   r)   r@   4   s   

zAgent.__init__returnNc                 C      t  | j d S N)r   register_agentrA   rO   r(   r(   r)   register_at_managerD      zAgent.register_at_managerc                 C   rS   rT   )r   unregister_agentrA   rV   r(   r(   r)   unregister_from_managerG   rX   zAgent.unregister_from_managerc                 C   s   t | jd )Nz was released unexpectedly)	ExceptionrA   rV   r(   r(   r)   rE   J   s   zAgent._releaser+   okerrc              
      s  dt dd f fdd}t|d}t|jd}|j}|j}|j}	|j}
z jj	
 }jj	|| }|d us;J |d }|d }W n ty_ } zt| |}d}W Y d }~nd }~ww ||||	|
|d	_|jvrjd
 rv|sttdtddt|	 d dt| d d ddtdfdtdfg|dd _}|  d S |
r|
dkrttdtddt|	 d dt| d d dd _}|d |  d S d _|d d S )NactionrR   c                    s   t d|   | dkrVjsJ jd d tjjd  jd jd djjd	 < jjd	  d
  jjd  dt	ffdd}t
d| d S  td d S )Nz	Action %sacceptr-   /r.   r   r    )r   r   r    r+   r   r,   rR   c                      s$    j d usJ  j j d  dS )Nr,   F)rM   rK   remover(   rV   r(   r)   _remove^   s   z9Agent._authorize_push.<locals>.on_action.<locals>._removei`  Rejected)logginginforM   osr   basenamerN   rK   appendboolr   timeout_addr0   )r^   rb   r]   r\   rO   r(   r)   	on_actionO   s   
z(Agent._authorize_push.<locals>.on_action)obj_pathAliasTrustedF)r+   r,   r-   r.   r   r    z
opp-acceptzIncoming file over BluetoothzIncoming file %(0)s from %(1)s<b></b>010u  r_   AcceptrejectRejectblueman	icon_name0W zReceiving filezReceiving file %(0)s from %(1)s)r%   r   r   sessionr-   r,   r    r   rI   r   get_adapterfind_deviceget_object_pathr[   rd   	exceptionrM   rK   rJ   r   _r   rL   show)rO   r+   r\   r]   rl   transferr}   r-   r,   r.   r   adapterdevicer    trustedenotificationr(   rk   r)   rG   M   sX   

zAgent._authorize_pushc                 C   s   | j r| j   td)NCanceled)rL   closer4   rV   r(   r(   r)   rF      s   
zAgent._cancelrR   N)r"   r#   r$   rA   r   r@   rW   rZ   rE   r%   r	   r0   rG   rF   __classcell__r(   r(   rP   r)   r5   1   s    



Hr5   c                   @   s  e Zd ZU dZedZdZdZdZdZ	dZ
dZdZg Zee ed< d'dd	Zd'd
dZdeeef fddZd'ddZd'ddZdejdededdfddZdejdeddfddZdededdfddZdedededdfdd Z deded!eddfd"d#Z!ded$eddfd%d&Z"dS )(TransferServicecschrammz(Provides OBEX file transfer capabilitieszblueman-send-symbolicr   N_handleridsrR   c                    s   dt dd f fdd}td _  \}}|r8td}td}t|| jd |f d	d
dg|d _ j  t	 j
 j _d S )N_actionrR   c                    s    d  _  jd td d S )Nshared-pathzReset share path)rL   rJ   resetrd   re   r   rV   r(   r)   on_reset      z)TransferService.on_load.<locals>.on_resetr>   z6Configured directory for incoming files does not existzPlease make sure that directory "<b>%s</b>" exists or configure it with blueman-services. Until then the default "%s" will be usedr   ry   ru   )r   zReset to default)r{   timeoutactions
actions_cb)r%   r   rJ   _make_share_pathr   r   rL   r   r   watch_name_owner_on_dbus_name_appeared_on_dbus_name_vanished_watch)rO   r   
share_pathinvalid_share_pathtextsecondary_textr(   rV   r)   on_load   s   

zTransferService.on_loadc                 C   s   | j r	t| j  |   d S rT   )r   r   bus_unwatch_name_unregister_agentrV   r(   r(   r)   	on_unload   s   zTransferService.on_unloadc                 C   s   | j d }ttjj}d }d}|dkr|}ntj|s)|}d}t	d|  n|}|s8tj
d}t	d ||krFtd d| j d< ||fS )	Nr   Fr8   TzInvalid shared-path %s~z#Failed to get Download dir from XDGz-Reset stored path, identical to default path.)rJ   r   get_user_special_dirUserDirectoryDIRECTORY_DOWNLOADrf   r   isdirrd   warning
expanduserre   )rO   config_pathdefault_pathr   errorr(   r(   r)   r      s$   



z TransferService._make_share_pathc                 C   s    | j s	t| j| _ | j   d S rT   )_agentr5   parentrW   rV   r(   r(   r)   _register_agent   r   zTransferService._register_agentc                 C   s(   | j r| j   | j   d | _ d S d S rT   )r   rZ   
unregisterrV   r(   r(   r)   r      s
   


z!TransferService._unregister_agent_connectionr    ownerc                 C   sp   t | d|  t | _| j| jd| j | j| jd| j | j| jd| j	 | 
  d S )N ztransfer-startedztransfer-completedzsession-removed)rd   re   r   _managerr   rh   connect_on_transfer_started_on_transfer_completed_on_session_removedr   )rO   r   r    r   r(   r(   r)   r      s   z&TransferService._on_dbus_name_appearedc                 C   sX   t | d | jr| jD ]}| j| qd | _g | _| jr*| j  d | _d S d S )Nz not running or was stopped)rd   re   r   r   
disconnectr   r   )rO   r   r    sigidr(   r(   r)   r      s   


z&TransferService._on_dbus_name_vanishedr   r+   c                 C   s^   | j r	|| j jvrd S | j j| d }|d usJ |dkr&|  jd7  _d S |  jd7  _d S )Nr   r|      )r   rN   _normal_transfers_silent_transfers)rO   r   r+   r   r(   r(   r)   r      s   z$TransferService._on_transfer_startednr   c                    s>   |j rtd dtdd f fdd}|d|| d S d S )Nzadding actionr   rR   c                    s$   d _ td td gdd d S )Nopenzxdg-openT)pathssystem)rL   rd   re   r   r   r   rO   r(   r)   on_open  s   
z*TransferService._add_open.<locals>.on_openr   )actions_supportedrd   re   r%   
add_action)rO   r   r    r   r   r(   r   r)   	_add_open  s
   
zTransferService._add_opensuccessc              	   C   s  | j r	|| j jvrtd d S | j j| }|d }|  \}}tj|}tj||}	tj	|	rIt
 }
|
d d| }td|  zt||	 W n ttfye   tjddd d	}Y nw |rttd
tddt| d dt|d  d d dd| _| | jtd|	 | j  nA|sttdtddt| d dt|d  d d dd}|  |d d usJ |d dkr|  jd8  _n|  jd8  _| j j|= d S )Nz7This is probably not an incoming transfer we authorizedr   z%Y%m%d%H%M%Sr   z&Destination file exists, renaming to: zFailed to move filesT)exc_infoFzFile receivedz+File %(0)s from %(1)s successfully receivedrp   rq   r    rr   ry   rz   OpenzTransfer failedzTransfer of file %(0)s failedr   r|   r   )r   rN   rd   re   r   rf   r   rg   joinexistsr   nowstrftimeshutilmoveOSErrorPermissionErrorr   r   r   r   rL   r   r   r   r   )rO   r   r+   r   
attributessrcdest_dirignoredr.   destr   r   r(   r(   r)   r     sV   
z&TransferService._on_transfer_completed_session_pathc                 C   s   | j dkrd S |  \}}| jdkr7ttdtdd| j d| j i dd| _| | jtd| | j  d S ttdtd	d
| j d| j i dd| _| | jtd| | j  d S )Nr   zFiles receivedz)Received %(files)d file in the backgroundz*Received %(files)d files in the backgroundfilesry   rz   zOpen Locationz.Received %(files)d more file in the backgroundz/Received %(files)d more files in the background)	r   r   r   r   r   r   rL   r   r   )rO   r   r   r   r   r(   r(   r)   r   G  s4   

z#TransferService._on_session_removedr   )#r"   r#   r$   
__author__r   __description____icon__r   r   r   r   r   rL   r   r   r'   r&   r   r   r
   r%   ri   r   r   r   r   DBusConnectionr   r   r   r   NotificationTyper   r   r   r(   r(   r(   r)   r      s,   
 




0r   )4r   r   r   r   rf   r   rd   htmlr   typingr   r   r   r	   r
   r   r   blueman.bluez.obex.AgentManagerr   blueman.bluez.obex.Managerr   blueman.bluez.obex.Transferr   blueman.bluez.obex.Sessionr   blueman.Functionsr   blueman.gui.Notificationr   r   r   blueman.main.Appletr   blueman.main.DbusServicer   r   blueman.plugins.AppletPluginr   blueman.main.Configr   gi.repositoryr   r   typing_extensionsr   r   r*   r   r0   r4   r5   r   r(   r(   r(   r)   <module>   s6    $j