o
    o_4{                     @   s~  d dl mZmZ 	 d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ dZdZdZdZdZd	Zd
Zi dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*Zd+d,d-d. ed/d0D  Zd1Zd2d3e d4 d5e d6 gZG d7d8 d8ZdMd:d;Zd<d= Zd>d? Zd@dA ZG dBdC dCZe a	E	FdNdGdHZ G dIdJ dJZ!dKdL Z"dS )O    )divisionprint_functionN)utila2  
// Urwid web (CGI/Asynchronous Javascript) display module
//    Copyright (C) 2004-2005  Ian Ward
//
//    This library is free software; you can redistribute it and/or
//    modify it under the terms of the GNU Lesser General Public
//    License as published by the Free Software Foundation; either
//    version 2.1 of the License, or (at your option) any later version.
//
//    This library is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//    Lesser General Public License for more details.
//
//    You should have received a copy of the GNU Lesser General Public
//    License along with this library; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// Urwid web site: http://excess.org/urwid/

colours = new Object();
colours = {
    '0': "black",
    '1': "#c00000",
    '2': "green",
    '3': "#804000",
    '4': "#0000c0",
    '5': "#c000c0",
    '6': "teal",
    '7': "silver",
    '8': "gray",
    '9': "#ff6060",
    'A': "lime",
    'B': "yellow",
    'C': "#8080ff",
    'D': "#ff40ff",
    'E': "aqua",
    'F': "white"
};

keycodes = new Object();
keycodes = {
    8: "backspace", 9: "tab", 13: "enter", 27: "esc",
    33: "page up", 34: "page down", 35: "end", 36: "home",
    37: "left", 38: "up", 39: "right", 40: "down",
    45: "insert", 46: "delete",
    112: "f1", 113: "f2", 114: "f3", 115: "f4",
    116: "f5", 117: "f6", 118: "f7", 119: "f8",
    120: "f9", 121: "f10", 122: "f11", 123: "f12"
    };

var conn = null;
var char_width = null;
var char_height = null;
var screen_x = null;
var screen_y = null;

var urwid_id = null;
var send_conn = null;
var send_queue_max = 32;
var send_queue = new Array(send_queue_max);
var send_queue_in = 0;
var send_queue_out = 0;

var check_font_delay = 1000;
var send_more_delay = 100;
var poll_again_delay = 500;

var document_location = null;

var update_method = "multipart";

var sending = false;
var lastkeydown = null;

function setup_connection() {
    if (window.XMLHttpRequest) {
        conn = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        conn = new ActiveXObject("Microsoft.XMLHTTP");
    }

    if (conn == null) {
        set_status("Connection Failed");
        alert( "Can't figure out how to send request." );
        return;
    }
    try{
        conn.multipart = true;
    }catch(e){
        update_method = "polling";
    }
    conn.onreadystatechange = handle_recv;
    conn.open("POST", document_location, true);
    conn.setRequestHeader("X-Urwid-Method",update_method);
    conn.setRequestHeader("Content-type","text/plain");
    conn.send("window resize " +screen_x+" "+screen_y+"\n");
}

function do_poll() {
    if (urwid_id == null){
        alert("that's unpossible!");
        return;
    }
    if (window.XMLHttpRequest) {
        conn = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        conn = new ActiveXObject("Microsoft.XMLHTTP");
    }
    conn.onreadystatechange = handle_recv;
    conn.open("POST", document_location, true);
    conn.setRequestHeader("X-Urwid-Method","polling");
    conn.setRequestHeader("X-Urwid-ID",urwid_id);
    conn.setRequestHeader("Content-type","text/plain");
    conn.send("eh?");
}

function handle_recv() {
    if( ! conn ){ return;}
    if( conn.readyState != 4) {
        return;
    }
    if( conn.status == 404 && urwid_id != null) {
        set_status("Connection Closed");
        return;
    }
    if( conn.status == 403 && update_method == "polling" ) {
        set_status("Server Refused Connection");
        alert("This server does not allow polling clients.\n\n" +
            "Please use a web browser with multipart support " +
            "such as Mozilla Firefox");
        return;
    }
    if( conn.status == 503 ) {
        set_status("Connection Failed");
        alert("The server has reached its maximum number of "+
            "connections.\n\nPlease try again later.");
        return;
    }
    if( conn.status != 200) {
        set_status("Connection Failed");
        alert("Error from server: "+conn.statusText);
        return;
    }
    if( urwid_id == null ){
        urwid_id = conn.getResponseHeader("X-Urwid-ID");
        if( send_queue_in != send_queue_out ){
            // keys waiting
            do_send();
        }
        if(update_method=="polling"){
            set_status("Polling");
        }else if(update_method=="multipart"){
            set_status("Connected");
        }

    }

    if( conn.responseText == "" ){
        if(update_method=="polling"){
            poll_again();
        }
        return; // keepalive
    }
    if( conn.responseText == "Z" ){
        set_status("Connection Closed");
        update_method = null;
        return;
    }

    var text = document.getElementById('text');

    var last_screen = Array(text.childNodes.length);
    for( var i=0; i<text.childNodes.length; i++ ){
        last_screen[i] = text.childNodes[i];
    }

    var frags = conn.responseText.split("\n");
    var ln = document.createElement('span');
    var k = 0;
    for( var i=0; i<frags.length; i++ ){
        var f = frags[i];
        if( f == "" ){
            var br = document.getElementById('br').cloneNode(true);
            ln.appendChild( br );
            if( text.childNodes.length > k ){
                text.replaceChild(ln, text.childNodes[k]);
            }else{
                text.appendChild(ln);
            }
            k = k+1;
            ln = document.createElement('span');
        }else if( f.charAt(0) == "<" ){
            line_number = parseInt(f.substr(1));
            if( line_number == k ){
                k = k +1;
                continue;
            }
            var clone = last_screen[line_number].cloneNode(true);
            if( text.childNodes.length > k ){
                text.replaceChild(clone, text.childNodes[k]);
            }else{
                text.appendChild(clone);
            }
            k = k+1;
        }else{
            var span=make_span(f.substr(2),f.charAt(0),f.charAt(1));
            ln.appendChild( span );
        }
    }
    for( var i=k; i < text.childNodes.length; i++ ){
        text.removeChild(last_screen[i]);
    }

    if(update_method=="polling"){
        poll_again();
    }
}

function poll_again(){
    if(conn.status == 200){
        setTimeout("do_poll();",poll_again_delay);
    }
}


function load_web_display(){
    if( document.documentURI ){
        document_location = document.documentURI;
    }else{
        document_location = document.location;
    }

    document.onkeypress = body_keypress;
    document.onkeydown = body_keydown;
    document.onresize = body_resize;

    body_resize();
    send_queue_out = send_queue_in; // don't queue the first resize

    set_status("Connecting");
    setup_connection();

    setTimeout("check_fontsize();",check_font_delay);
}

function set_status( status ){
    var s = document.getElementById('status');
    var t = document.createTextNode(status);
    s.replaceChild(t, s.firstChild);
}

function make_span(s, fg, bg){
    d = document.createElement('span');
    d.style.backgroundColor = colours[bg];
    d.style.color = colours[fg];
    d.appendChild(document.createTextNode(s));

    return d;
}

function body_keydown(e){
    if (conn == null){
        return;
    }
    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

    var mod = "";
    var key;

    if( e.ctrlKey ){ mod = "ctrl " + mod; }
    if( e.altKey || e.metaKey ){ mod = "meta " + mod; }
    if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; }

    key = keycodes[code];

    if( key != undefined ){
        lastkeydown = key;
        send_key( mod + key );
        stop_key_event(e);
        return false;
    }
}

function body_keypress(e){
    if (conn == null){
        return;
    }

    if (!e) var e = window.event;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;

    var mod = "";
    var key;

    if( e.ctrlKey ){ mod = "ctrl " + mod; }
    if( e.altKey || e.metaKey ){ mod = "meta " + mod; }
    if( e.shiftKey && e.charCode == 0 ){ mod = "shift " + mod; }

    if( e.charCode != null && e.charCode != 0 ){
        key = String.fromCharCode(e.charCode);
    }else if( e.charCode == null ){
        key = String.fromCharCode(code);
    }else{
        key = keycodes[code];
        if( key == undefined || lastkeydown == key ){
            lastkeydown = null;
            stop_key_event(e);
            return false;
        }
    }

    send_key( mod + key );
    stop_key_event(e);
    return false;
}

function stop_key_event(e){
    e.cancelBubble = true;
    if( e.stopPropagation ){
        e.stopPropagation();
    }
    if( e.preventDefault  ){
        e.preventDefault();
    }
}

function send_key( key ){
    if( (send_queue_in+1)%send_queue_max == send_queue_out ){
        // buffer overrun
        return;
    }
    send_queue[send_queue_in] = key;
    send_queue_in = (send_queue_in+1)%send_queue_max;

    if( urwid_id != null ){
        if (send_conn == undefined || send_conn.ready_state != 4 ){
            send_more();
            return;
        }
        do_send();
    }
}

function do_send() {
    if( ! urwid_id ){ return; }
    if( ! update_method ){ return; } // connection closed
    if( send_queue_in == send_queue_out ){ return; }
    if( sending ){
        //var queue_delta = send_queue_in - send_queue_out;
        //if( queue_delta < 0 ){ queue_delta += send_queue_max; }
        //set_status("Sending (queued "+queue_delta+")");
        return;
    }
    try{
        sending = true;
        //set_status("starting send");
        if( send_conn == null ){
            if (window.XMLHttpRequest) {
                send_conn = new XMLHttpRequest();
            } else if (window.ActiveXObject) {
                send_conn = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }else if( send_conn.status != 200) {
            alert("Error from server: "+send_conn.statusText);
            return;
        }else if(send_conn.readyState != 4 ){
            alert("not ready on send connection");
            return;
        }
    } catch(e) {
        alert(e);
        sending = false;
        return;
    }
    send_conn.open("POST", document_location, true);
    send_conn.onreadystatechange = send_handle_recv;
    send_conn.setRequestHeader("Content-type","text/plain");
    send_conn.setRequestHeader("X-Urwid-ID",urwid_id);
    var tmp_send_queue_in = send_queue_in;
    var out = null;
    if( send_queue_out > tmp_send_queue_in ){
        out = send_queue.slice(send_queue_out).join("\n")
        if( tmp_send_queue_in > 0 ){
            out += "\n"  + send_queue.slice(0,tmp_send_queue_in).join("\n");
        }
    }else{
        out = send_queue.slice(send_queue_out,
             tmp_send_queue_in).join("\n");
    }
    send_queue_out = tmp_send_queue_in;
    //set_status("Sending");
    send_conn.send( out +"\n" );
}

function send_handle_recv() {
    if( send_conn.readyState != 4) {
        return;
    }
    if( send_conn.status == 404) {
        set_status("Connection Closed");
        update_method = null;
        return;
    }
    if( send_conn.status != 200) {
        alert("Error from server: "+send_conn.statusText);
        return;
    }

    sending = false;

    if( send_queue_out != send_queue_in ){
        send_more();
    }
}

function send_more(){
    setTimeout("do_send();",send_more_delay);
}

function check_fontsize(){
    body_resize()
    setTimeout("check_fontsize();",check_font_delay);
}

function body_resize(){
    var t = document.getElementById('testchar');
    var t2 = document.getElementById('testchar2');
    var text = document.getElementById('text');

    var window_width;
    var window_height;
    if (window.innerHeight) {
        window_width = window.innerWidth;
        window_height = window.innerHeight;
    }else{
        window_width = document.documentElement.clientWidth;
        window_height = document.documentElement.clientHeight;
        //var z = "CI:"; for(var i in bod){z = z + " " + i;} alert(z);
    }

    char_width = t.offsetLeft / 44;
    var avail_width = window_width-18;
    var avail_width_mod = avail_width % char_width;
    var x_size = (avail_width - avail_width_mod)/char_width;

    char_height = t2.offsetTop - t.offsetTop;
    var avail_height = window_height-text.offsetTop-10;
    var avail_height_mod = avail_height % char_height;
    var y_size = (avail_height - avail_height_mod)/char_height;

    text.style.width = x_size*char_width+"px";
    text.style.height = y_size*char_height+"px";

    if( screen_x != x_size || screen_y != y_size ){
        send_key("window resize "+x_size+" "+y_size);
    }
    screen_x = x_size;
    screen_y = y_size;
}

<         d   i   i @  black0zdark red1z
dark green2brown3z	dark blue4zdark magenta5z	dark cyan6
light gray7z	dark gray8z	light red9zlight greenAyellowBz
light blueCzlight magentaDz
light cyanEwhiteFz ???????????????????????????????? c                 C   s   g | ]}t |qS  )chr).0xr   r   3/usr/lib/python3/dist-packages/urwid/web_display.py
<listcomp>  s    r$          ah  
body {    margin: 8px 8px 8px 8px; border: 0;
    color: black; background-color: silver;
    font-family: fixed; overflow: hidden; }

form { margin: 0 0 8px 0; }

#text { position: relative;
    background-color: silver;
    width: 100%; height: 100%;
    margin: 3px 0 0 0; border: 1px solid #999; }

#page { position: relative;  width: 100%;height: 100%;}
z<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Urwid Web Display - z!</title>
<style type="text/css">
a  
</style>
</head>
<body id="body" onload="load_web_display()">
<div style="position:absolute; visibility:hidden;">
<br id="br"\>
<pre>The quick brown fox jumps over the lazy dog.<span id="testchar">X</span>
<span id="testchar2">Y</span></pre>
</div>
Urwid Web Display - <b>z[</b> -
Status: <span id="status">Set up</span>
<script type="text/javascript">
//<![CDATA[
z7
//]]>
</script>
<pre id="text"></pre>
</body>
</html>
c                   @   s   e Zd Zdd Zedd Zdd Z	d*dd	Zd+ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd,d(d)ZdS )-Screenc                 C   s   i | _ d| _d| _d S )NTF)palette	has_color_startedselfr   r   r#   __init__@  s   
zScreen.__init__c                 C      | j S N)r*   r+   r   r   r#   <lambda>E  s    zScreen.<lambda>c                 C   sh   |D ]/}t |dv r| j|  qt |dksJ d|\}}|| jvr)td| | j| | j|< qdS )zRegister a list of palette entries.

        l -- list of (name, foreground, background) or
             (name, same_as_other_name) palette entries.

        calls self.register_palette_entry for each item in l
        )r         zInvalid register_palette usagez palette entry '%s' doesn't existN)lenregister_palette_entryr(   	Exception)r,   litemname	like_namer   r   r#   register_paletteG  s   	

zScreen.register_paletteNc                 C   s,   |dkrd}|dkrd}|||f| j |< dS )a  Register a single palette entry.

        name -- new entry/attribute name
        foreground -- foreground colour
        background -- background colour
        mono -- monochrome terminal attribute

        See curses_display.register_palette_entry for more info.
        defaultr	   r   N)r(   )r,   r8   
foreground
backgroundmonor   r   r#   r4   Z  s
   zScreen.register_palette_entryTc                 C      dS )zNot yet implementedNr   )r,   enabler   r   r#   set_mouse_trackingk     zScreen.set_mouse_trackingc                 O   r?   )zDo nothing.Nr   )r,   argsvargsr   r   r#   tty_signal_keyso  rB   zScreen.tty_signal_keysc                 C   s  | j rt| S tjd}|dsJ ||dd\}}}}t|}t|}| 	|| i | _
d| _tjd | _| jdv sBJ | jdkrUtjsUtjd	 td ttjtjd
}t|tjkrrtjd td dtdtdf }tjtjd| | _t| jd d ttj| j  t!| jd tj"tj#B | _$d| _%d| d | _&| jdkrd| d | _&ttj'| j( t)t* d| _ t| S )z
        This function reads the initial screen size, generates a
        unique id and handles cleanup when fn exits.

        web_display.set_preferences(..) must be called before calling
        this function for the preferences to take effect
        2   window resize  r   r   HTTP_X_URWID_METHOD)	multipartpollingrK   Status: 403 Forbidden

z	urwid*.inzStatus: 503 Sever Busy

z%09d%09di ʚ;urwid.ini  r   zAContent-type: multipart/x-mixed-replace;boundary=ZZ
X-Urwid-ID: z


--ZZ
z&Content-type: text/plain
X-Urwid-ID: z


T)+r*   r   StoppingContextsysstdinread
startswithsplitint_set_screen_sizelast_screenlast_screen_widthosenvironupdate_method_prefsallow_pollingstdoutwriteexitglobpathjoinpipe_dirr3   max_clientsrandom	randrange	pipe_namemkfifosignalSIGTERM_cleanup_pipeopen
O_NONBLOCKO_RDONLYinput_fd
input_tailcontent_headSIGALRM_handle_alarmalarmALARM_DELAY)r,   client_initignore1ignore2r"   yclientsurwid_idr   r   r#   starts  sZ   








zScreen.startc                 C   sL   | j sdS z|   W n	 ty   Y nw ttjtj |   d| _ dS )z0
        Restore settings and clean up.
        NF)r*   _close_connectionr5   rj   rk   SIG_DFLrl   r+   r   r   r#   stop  s   
zScreen.stopc                 G   s   d S r/   r   r,   rC   r   r   r#   set_input_timeouts  s   zScreen.set_input_timeoutsc                 C   s$   z|    | W |   S |   w )zb
        Run the application main loop, calling start() first
        and stop() on exit.
        )r}   r   )r,   fnr   r   r#   run_wrapper  s   zScreen.run_wrapperc                 C   s^   | j dkr| jd | j \}}|d |  | j dkr-tjd tj	  d S d S )Npolling childr   ZrJ   z
Z
--ZZ--
)
r[   server_socket
settimeoutacceptsendallcloserP   r^   r_   flush)r,   sockaddrr   r   r#   r~     s   


zScreen._close_connectionc                 G   sF   | j sd S zt| j d  t| j d  W d S  ty"   Y d S w )NrN   .update)rh   rY   remover5   r   r   r   r#   rl     s   
zScreen._cleanup_pipec                 C   s&   |t krt }|tkrt}||f| _dS )z&Set the screen size (within max size).N)MAX_COLSMAX_ROWSscreen_size)r,   colsrowsr   r   r#   rV     s
   zScreen._set_screen_sizec              
   C   s  |\}}|| j kri | _| jg}| jdkr|j}n6| jdkr@td z	| j \}}W n t	j
y;   td Y nw |j}ntd |j}|d d| _| |ksWJ |jdurb|j\}	}
nd }	}
i }d}| D ]}|d7 }t|}g }t|}||
kr||	f }||g |g ||< | j|d}|dur||v r|}n|d }|d	|  qnd}|D ]Y\}}}|t}|du rd
\}}}n| j| \}}}||
kr||	krt|dt|}|| |	kr|t||||	|  n	|t||| ||7 }q|t||| q|d|d  qn|| _|| _ | jdkr;tjd| tj  tj  |    n| jdkrF|  n|d tjd| tj  tt! dS )z#Send a screen update to the client.rK   r   r   z
r   N   z<%d
)r	   r   N
z
--ZZ
)"rX   rW   rr   r[   appendrj   ru   r   r   sockettimeoutrP   r`   r   r   cursorcontentlisttupleget	translate_trans_tabler(   r   
calc_widthr3   	code_spanrc   r^   r_   r   r   _fork_childrv   )r,   sizerr   r   sendqsendsr   cxcy
new_screenrz   rowr6   sigold_line_numbersold_linecolacsrunfgbgr>   	run_widthr   r   r#   draw_screen  s   












zScreen.draw_screenc                 C   r?   )z
        Force the screen to be completely repainted on the next
        call to draw_screen().

        (does nothing for web_display)
        Nr   r+   r   r   r#   clearG  s   zScreen.clearc                 C   sn   t | jd  t| jd tjtjB | _d| _ttj	tj
}|| jd  |d |t || _dS )zw
        Fork a child to run CGI disconnected for polling update method.
        Force parent process to exit.
        z.errrN   r   r   r   N)	daemonizerh   rY   rm   rn   ro   rp   r[   r   AF_UNIXSOCK_STREAMbindlistenr   POLL_CONNECTr   )r,   r   r   r   r#   r   Q  s   



zScreen._fork_childc                 C   sv   | j dv sJ | j dkr)z| j \}}|  W n tjy(   td Y nw tj	d tj
  tt d S )N)rJ   r   r   r   z


--ZZ
)r[   r   r   r   r   r   rP   r`   r^   r_   r   rj   ru   rv   )r,   r   framer   r   r   r   r#   rt   `  s   

zScreen._handle_alarmc                 C   r.   )zReturn the screen size.)r   r+   r   r   r#   get_cols_rowsp  s   zScreen.get_cols_rowsFc              
   C   sd  g }d}zt  | jgg g d\}}}W n) t jy< } z|jd dkr7|r/g g fW  Y d}~S g W  Y d}~S  d}~ww |sG|rEg g fS g S t| jt}t| j t| j	d tj
tjB | _|d}	| j|	d  |	d< |	d | _|	dd D ]'}
|
d	r|
d
d\}}}}t|}t|}| || d}q{||
 q{|r|d |r|g fS |S )zReturn pending input as a list.Fg      ?r   r1   NrN   r   r   rG   rH   r   Tzwindow resize)selectrp   errorrC   rY   rR   MAX_READr   rm   rh   rn   ro   rT   rq   rS   rU   rV   r   )r,   raw_keysr6   resizedireadyoreadyereadyekeydatakeyskign1ign2r"   rz   r   r   r#   	get_inputt  sN   




zScreen.get_inputr/   )T)F)__name__
__module____qualname__r-   propertystartedr:   r4   rA   rE   r}   r   r   r   r~   rl   rV   r   r   r   rt   r   r   r   r   r   r#   r'   ?  s*    

<		[
r'   r   c           	      C   s   t | }t | }|dkrEt| dt| |\}}t| |t| }|| | d |  d | | | ||  d | | | |d   d S || |  d S )Nr   r   )_code_coloursr   calc_text_posr3   move_next_char)	r   r   r   r   code_fgcode_bgc_off_ignc2_offr   r   r#   r     s.   

r   c                 C   s(   |  dd} |  dd} |  dd} | S )z;Escape text so that it will be displayed safely within HTML&z&amp;<z&lt;>z&gt;)replace)textr   r   r#   html_escape  s   r   c                   C   s
   dt jv S )z3
    Return True if this is a CGI web request.
    REQUEST_METHOD)rY   rZ   r   r   r   r#   is_web_request  s   
r   c                  C   s  t  sdS tjd dkrtjdttj	t
  dS tjd dkr%dS dtjvr,dS tjd } t| dkr?tjd	 dS | D ]}|d
vrPtjd  dS qAtjdddkrttjtj}z(|tj	tjd|  d  d|t }|rtj| |t}|s{W dS  tjy   tjd Y dS w zttj	tjd|  d tj}W n ty   tjd Y dS w tjt}t||d t| tjd dS )ar  
    Handle short requests such as passing keystrokes to the application
    or sending the initial html page.  If returns True, then this
    function recognised and handled a short request, and the calling
    script should immediately exit.

    web_display.set_preferences(..) should be called before calling this
    function for the preferences to take effect
    Fr   GETzContent-type: text/html

TPOSTHTTP_X_URWID_ID   zStatus: 414 URI Too Long


0123456789rL   rI   NrK   rM   r   zContent-type: text/plain

zStatus: 404 Not Found

rN   ascii)r   rY   rZ   rP   r^   r_   r   r\   app_namerc   
_html_pager3   r   r   r   r   connectrb   rd   recvBUF_SZr   rm   O_WRONLYOSErrorrQ   rR   r   encoder   )r|   cr   datafdr   r   r   r#   handle_short_request  sf   





r   c                   @   s   e Zd ZdZdZdZdZdS )_PreferenceszUnnamed Application/tmpTr   N)r   r   r   r   rd   r]   re   r   r   r   r#   r   
  s
    r   r   Tr   c                 C   s   | t _|t _|t _|t _dS )a  
    Set web_display preferences.

    app_name -- application name to appear in html interface
    pipe_dir -- directory for input pipes, daemon update sockets
                and daemon error logs
    allow_polling -- allow creation of daemon processes for
                     browsers without multipart support
    max_clients -- maximum concurrent client connections. This
               pool is shared by all urwid applications
               using the same pipe_dir
    N)r\   r   rd   r]   re   )r   rd   r]   re   r   r   r#   set_preferences  s   
r   c                   @   s   e Zd Zdd Zdd ZdS )ErrorLogc                 C   s
   || _ d S r/   )errfile)r,   r   r   r   r#   r-   (  s   
zErrorLog.__init__c                 C   s   t | jd| d S )Nr   )rm   r   r_   )r,   errr   r   r#   r_   *  s   zErrorLog.writeN)r   r   r   r-   r_   r   r   r   r#   r   '  s    r   c              	   C   s   t  }|rt d t   ttjtj t d t  }|r't d t d t	ddD ]}zt 
| W q1 tyC   Y q1w tddt_tddt_t| t_dS )z-
    Detach process and become a daemon.
    r   /r   z	/dev/nullr   wN)rY   fork_exitsetsidrj   SIGHUPSIG_IGNumaskchdirranger   r   rm   rP   rQ   r^   r   stderr)r   pidr   r   r   r#   r   .  s&   



r   )r   )r   Tr   )#
__future__r   r   rY   rP   rj   rf   r   r   ra   rM   r   _js_coderv   r   r   r   r   r   r   rc   r  r   
_css_styler   r'   r   r   r   r   r   r\   r   r   r   r   r   r   r#   <module>   s      U	
  
fJ
