a
    Q\a                     @   s   d Z ddlZddlZddlmZmZmZmZmZm	Z	 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 dd	gZG d
d de
jZG dd	 d	e
jZdS )zI
Utility for running a prompt_toolkit application in an asyncssh server.
    N)Any	AwaitableCallableOptionalTextIOcast)
AppSessioncreate_app_session)Size)create_pipe_input)Vt100_OutputPromptToolkitSSHSessionPromptToolkitSSHServerc                   @   s   e Zd Zed ged f ddddZedddZeddd	d
Z	e
dddZddddZddddZeeeeddddZeeddddZdS )r   Ninteractreturnc                    sJ   | _ d  _d  _d  _t  _d  _G  fddd}tt|  _	d S )Nc                       sR   e Zd Zedd fddZedddZdddd	Zeed fd
dZ	dS )z0PromptToolkitSSHSession.__init__.<locals>.StdoutN)datar   c                    s:   z" j d ur  j |dd W n ty4   Y n0 d S )N
z
)_chanwritereplaceBrokenPipeError)sr   self @lib/python3.9/site-packages/prompt_toolkit/contrib/ssh/server.pyr   $   s
    
z6PromptToolkitSSHSession.__init__.<locals>.Stdout.writer   c                 S   s   dS NTr   r   r   r   r   isatty+   s    z7PromptToolkitSSHSession.__init__.<locals>.Stdout.isattyc                 S   s   d S Nr   r   r   r   r   flush.   s    z6PromptToolkitSSHSession.__init__.<locals>.Stdout.flushc                    s"    j d usJ t j j d S )Nr   )r   strZ
_orig_chanZget_encodingr   r   r   r   encoding1   s    z9PromptToolkitSSHSession.__init__.<locals>.Stdout.encoding)
__name__
__module____qualname__r#   r   boolr    r"   propertyr$   r   r   r   r   Stdout#   s
   r*   )
r   interact_taskr   app_sessionr   _input_outputr   r   stdout)r   r   r*   r   r   r   __init__   s    z PromptToolkitSSHSession.__init__r   c                 C   s8   | j du rtdddS | j  \}}}}t||dS dS )zU
        Callable that returns the current `Size`, required by Vt100_Output.
        N   O   )Zrowscolumns)r   r
   get_terminal_sizer   widthheightpixwidth	pixheightr   r   r   	_get_size8   s    
z!PromptToolkitSSHSession._get_size)chanr   c                 C   s
   || _ d S r!   )r   )r   r;   r   r   r   connection_madeB   s    z'PromptToolkitSSHSession.connection_madec                 C   s   dS r   r   r   r   r   r   shell_requestedE   s    z'PromptToolkitSSHSession.shell_requestedc                 C   s   t  |  | _d S r!   )asyncioZget_event_loopZcreate_task	_interactr+   r   r   r   r   session_startedH   s    z'PromptToolkitSSHSession.session_startedc              	      s   | j d u rtdt| j dr6| j jd ur6| j d | j  }t| j| j|dd| _	t
| j| j	dv}|| _zHz| | I d H  W n ty   t  Y n0 W | j   | j  n| j   | j  0 W d    n1 s0    Y  d S )Nz,`_interact` called before `connection_made`.set_line_modeF)termZwrite_binary)inputoutput)r   	ExceptionhasattrZ_editorrA   Zget_terminal_typer   r/   r:   r.   r	   r-   r,   r   BaseException	traceback	print_excclose)r   rB   Zsessionr   r   r   r?   K   s$    



z!PromptToolkitSSHSession._interact)r6   r7   r8   r9   r   c                 C   s   | j r| j jr| j j  d S r!   )r,   ZappZ
_on_resizer5   r   r   r   terminal_size_changede   s    z-PromptToolkitSSHSession.terminal_size_changed)r   datatyper   c                 C   s   | j | d S r!   )r-   Z	send_text)r   r   rL   r   r   r   data_receivedl   s    z%PromptToolkitSSHSession.data_received)r%   r&   r'   r   r   r0   r
   r:   r   r<   r(   r=   r@   r?   intobjectrK   r#   rM   r   r   r   r   r      s   %
c                   @   sL   e Zd ZdZeeged f ddddZee	dddZ
ed	d
dZdS )r   a,  
    Run a prompt_toolkit application over an asyncssh server.

    This takes one argument, an `interact` function, which is called for each
    connection. This should be an asynchronous function that runs the
    prompt_toolkit applications. This function runs in an `AppSession`, which
    means that we can have multiple UI interactions concurrently.

    Example usage:

    .. code:: python

        async def interact(ssh_session: PromptToolkitSSHSession) -> None:
            await yes_no_dialog("my title", "my text").run_async()

            prompt_session = PromptSession()
            text = await prompt_session.prompt_async("Type something: ")
            print_formatted_text('You said: ', text)

        server = PromptToolkitSSHServer(interact=interact)
        loop = get_event_loop()
        loop.run_until_complete(
            asyncssh.create_server(
                lambda: MySSHServer(interact),
                "",
                port,
                server_host_keys=["/etc/ssh/..."],
            )
        )
        loop.run_forever()
    Nr   c                 C   s
   || _ d S r!   )r   )r   r   r   r   r   r0      s    zPromptToolkitSSHServer.__init__)usernamer   c                 C   s   dS )NFr   )r   rP   r   r   r   
begin_auth   s    z!PromptToolkitSSHServer.begin_authr   c                 C   s
   t | jS r!   )r   r   r   r   r   r   session_requested   s    z(PromptToolkitSSHServer.session_requested)r%   r&   r'   __doc__r   r   r   r0   r#   r(   rQ   rR   r   r   r   r   r   p   s   !)rS   r>   rH   typingr   r   r   r   r   r   ZasyncsshZ"prompt_toolkit.application.currentr   r	   Zprompt_toolkit.data_structuresr
   Zprompt_toolkit.inputr   Zprompt_toolkit.output.vt100r   __all__ZSSHServerSessionr   Z	SSHServerr   r   r   r   r   <module>   s    ^