U
    d                     @  s   d Z ddlm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 ddlZddlmZmZ ddlmZ ddlmZ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.
    )annotationsN)get_running_loop)Any	AwaitableCallableOptionalTextIOcast)
AppSessioncreate_app_session)Size)	PipeInputcreate_pipe_input)Vt100_OutputPromptToolkitSSHSessionPromptToolkitSSHServerc                   @  s   e Zd ZddddddZddd	d
ZdddddZddddZddddZddddZddddddddZ	ddddddZ
dS )r   4Callable[[PromptToolkitSSHSession], Awaitable[None]]boolNoneinteract
enable_cprreturnc                  sN   | _ | _d  _d  _d  _d  _d  _G  fddd}tt|  _	d S )Nc                      sR   e Zd Zddd fddZdddd	Zddd
dZedd fddZdS )z0PromptToolkitSSHSession.__init__.<locals>.Stdoutstrr   )datar   c                   s<   z" j d k	r  j |dd W n tk
r6   Y nX d S )N
z
)_chanwritereplaceBrokenPipeError)sr   self E/tmp/pip-unpacked-wheel-4x_7prb2/prompt_toolkit/contrib/ssh/server.pyr   +   s
    
z6PromptToolkitSSHSession.__init__.<locals>.Stdout.writer   r   c                 S  s   dS NTr#   r    r#   r#   r$   isatty2   s    z7PromptToolkitSSHSession.__init__.<locals>.Stdout.isattyc                 S  s   d S Nr#   r'   r#   r#   r$   flush5   s    z6PromptToolkitSSHSession.__init__.<locals>.Stdout.flushc                   s"    j d k	stt j j d S )Nr   )r   AssertionErrorr   Z
_orig_chanZget_encodingr'   r!   r#   r$   encoding8   s    z9PromptToolkitSSHSession.__init__.<locals>.Stdout.encodingN)__name__
__module____qualname__r   r(   r*   propertyr,   r#   r!   r#   r$   Stdout*   s
   r1   )
r   r   interact_taskr   app_session_input_outputr	   r   stdout)r"   r   r   r1   r#   r!   r$   __init__   s    z PromptToolkitSSHSession.__init__r   r%   c                 C  s8   | j dk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_size?   s    
z!PromptToolkitSSHSession._get_sizer   )chanr   c                 C  s
   || _ d S r)   )r   )r"   rB   r#   r#   r$   connection_madeI   s    z'PromptToolkitSSHSession.connection_madec                 C  s   dS r&   r#   r!   r#   r#   r$   shell_requestedL   s    z'PromptToolkitSSHSession.shell_requestedc                 C  s   t  |  | _d S r)   )r   Zcreate_task	_interactr2   r!   r#   r#   r$   session_startedO   s    z'PromptToolkitSSHSession.session_startedc              
     s   | j d krtdt| j dr6| j jd k	r6| j d | j  }t| j| j|| j	d| _
t x| _t| j| j
dZ}|| _z6z| | I d H  W n tk
r   t  Y nX W 5 | j   | j  X W 5 Q R X W 5 Q R X d S )Nz,`_interact` called before `connection_made`.set_line_modeF)termr   )inputoutput)r   	ExceptionhasattrZ_editorrG   Zget_terminal_typer   r6   rA   r   r5   r   r4   r   r3   closer   BaseException	traceback	print_exc)r"   rH   sessionr#   r#   r$   rE   R   s(    

   

z!PromptToolkitSSHSession._interactintobject)r=   r>   r?   r@   r   c                 C  s   | j r| j jr| j j  d S r)   )r3   ZappZ
_on_resizer<   r#   r#   r$   terminal_size_changedn   s    z-PromptToolkitSSHSession.terminal_size_changedr   )r   datatyper   c                 C  s   | j d krd S | j | d S r)   )r4   Z	send_text)r"   r   rU   r#   r#   r$   data_receivedu   s    
z%PromptToolkitSSHSession.data_receivedN)r-   r.   r/   r7   rA   rC   rD   rF   rE   rT   rV   r#   r#   r#   r$   r      s   )
c                   @  sF   e Zd ZdZdddddddd	Zd
ddddZddddZdS )r   aZ  
    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_running_loop()
        loop.run_until_complete(
            asyncssh.create_server(
                lambda: MySSHServer(interact),
                "",
                port,
                server_host_keys=["/etc/ssh/..."],
            )
        )
        loop.run_forever()

    :param enable_cpr: When `True`, the default, try to detect whether the SSH
        client runs in a terminal that responds to "cursor position requests".
        That way, we can properly determine how much space there is available
        for the UI (especially for drop down menus) to render.
    Tr   r   r   r   r   c                C  s   || _ || _d S r)   )r   r   )r"   r   r   r#   r#   r$   r7      s    zPromptToolkitSSHServer.__init__r   )usernamer   c                 C  s   dS )NFr#   )r"   rX   r#   r#   r$   
begin_auth   s    z!PromptToolkitSSHServer.begin_authr   r%   c                 C  s   t | j| jdS )NrW   )r   r   r   r!   r#   r#   r$   session_requested   s    z(PromptToolkitSSHServer.session_requestedN)r-   r.   r/   __doc__r7   rY   rZ   r#   r#   r#   r$   r   }   s
   )	)r[   
__future__r   ZasynciorO   r   typingr   r   r   r   r   r	   ZasyncsshZ"prompt_toolkit.application.currentr
   r   Zprompt_toolkit.data_structuresr   Zprompt_toolkit.inputr   r   Zprompt_toolkit.output.vt100r   __all__ZSSHServerSessionr   Z	SSHServerr   r#   r#   r#   r$   <module>   s    h