a
    V$cM$                     @   s   d dl mZ d dlZd dlZd dlZd dlZd dlZg ai ae	 Z
ejrvd dlZd dlZed G dd deZn>ejddrd dlZd dlZd dlZd dlZG dd deZG d	d
 d
eZG dd dZdd Zdd ZdS )    )print_functionNaO  RenPyWeb = {
    xhr_id: 0,
    xhrs: {},

    dl_new: function(path) {
        var xhr = new XMLHttpRequest();
        xhr.responseType = 'arraybuffer';
        xhr.onerror = function() {
            console.log("Network error", xhr);
        };
        xhr.onload = function() {
            if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || (xhr.status == 0 && xhr.response)) {
                // Create file reusing XHR's buffer (no-copy)
                try { FS.unlink(path); } catch(error) {}
                FS.writeFile(path, new Uint8Array(xhr.response), {canOwn:true});
            } else {
                console.log("Download error", xhr);
            }
        };
        xhr.open('GET', path);
        xhr.send();
        RenPyWeb.xhrs[RenPyWeb.xhr_id] = xhr;
        var ret = RenPyWeb.xhr_id;
        RenPyWeb.xhr_id++;
        return ret;
    },

    dl_get: function(xhr_id) {
        return RenPyWeb.xhrs[xhr_id];
    },

    dl_free: function(xhr_id) {
        delete RenPyWeb.xhrs[xhr_id];
        // Note: xhr.response kept alive until file is unlinked
    },
};
c                   @   s@   e Zd Zdd Zdd Zedd Zedd Zed	d
 ZdS )XMLHttpRequestc                 C   s$   d| }t dt|| _d S )Nzgame/zRenPyWeb.dl_new({}))
emscriptenrun_script_intformatjsondumpsid)selffilenameurl r   renpy/webloader.py__init__[   s    XMLHttpRequest.__init__c                 C   s   t d| j d S )NzRenPyWeb.dl_free({});)r   
run_scriptr   r	   r
   r   r   r   __del__`   s    zXMLHttpRequest.__del__c                 C   s   t d| jS )NzRenPyWeb.dl_get({}).readyStater   r   r   r	   r   r   r   r   
readyStatec   s    XMLHttpRequest.readyStatec                 C   s   t d| jS )NzRenPyWeb.dl_get({}).statusr   r   r   r   r   statusg   s    XMLHttpRequest.statusc                 C   s   t d| jS )NzRenPyWeb.dl_get({}).statusText)r   run_script_stringr   r	   r   r   r   r   
statusTextk   s    XMLHttpRequest.statusTextN)	__name__
__module____qualname__r   r   propertyr   r   r   r   r   r   r   r   Z   s   

r   RENPY_SIMULATE_DOWNLOADFc                   @   s8   e Zd Zdd Zedd Zedd Zedd Zd	S )
r   c                    sB   d_ d _dtj   fdd}tj|dd  d S )NFzhttp://127.0.0.1:8042/game/c               
      s   zt t d  t} tjtj	j
 }tF t|d}|| j W d    n1 sb0    Y  W d    n1 s0    Y  W n` tjy } zt|_W Y d }~n:d }~0  ty } zdt| _W Y d }~n
d }~0 0 d_d S )Ng      ?wbzError: T)timesleeprandomrequestsgetospathjoinrenpyconfiggamedir
queue_lockopenwritecontentRequestExceptionreprerror	Exceptionstrdone)rfullpathfer   r
   r   r   r   thread_mainy   s    
L$z,XMLHttpRequest.__init__.<locals>.thread_mainr   )targetname)r6   r3   urllibparsequote	threadingThreadstart)r
   r   r<   r   r;   r   r   u   s
    r   c                 C   s   | j r
dS dS d S )N   r   )r6   r   r   r   r   r      s    r   c                 C   s   | j r
dS dS )Nr      r3   r   r   r   r   r      s    r   c                 C   s
   | j pdS )NOKrG   r   r   r   r   r      s    r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   t   s   

c                   @   s   e Zd Zdd ZdS )DownloadNeededc                 C   s   || _ || _|| _d S )N)relpathrtypesize)r
   rJ   rK   rL   r   r   r   r      s    zDownloadNeeded.__init__N)r   r   r   r   r   r   r   r   rI      s   rI   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ReloadRequestc                 C   s(   || _ || _|| _d| _t| j | _d S )Nr   )rJ   rK   datagc_genr   xhr)r
   rJ   rK   rN   r   r   r   r      s
    zReloadRequest.__init__c                 C   s   | j jdkS )NrE   )rP   r   r   r   r   r   download_completed   s    z ReloadRequest.download_completedc                 C   s   d | j| j|  S )Nz<ReloadRequest {} '{}' {}>)r   rK   rJ   rQ   r   r   r   r   __repr__   s    zReloadRequest.__repr__N)r   r   r   r   rQ   rR   r   r   r   r   rM      s   rM   c                 C   s  t   tD ]}|j|  kr&dkrLn n"|}|j|kr W d    d S q|j|  krbdkrn n|j| kr W d    d S |j|  krdkrn q|j| kr W d    d S tdd tD tjjkr W d    d S qt	t
| || W d    n1 s0    Y  d S )Nimagemusicvoicec                 S   s   g | ]}|j d krdqS )rU   T)type).0rrr   r   r   
<listcomp>       zenqueue.<locals>.<listcomp>)r-   queuerK   rN   rJ   lenr*   r+   predict_statementsappendrM   )rJ   rK   rN   rX   image_filenamer   r   r   enqueue   s    
$
r`   c               	   C   sp  t sd S t t d d  } g }z| r|  }| sB|| q"|jdkrtjt	j
j|j}tj|std|jjp|d|j||j}t	j| tjt	j
j|j}t t|< q"|jdkrq"|jdkr"tjt	j
j|j}t d t|< q"W ||  a n
||  a 0 W d    n1 s$0    Y  d}t D ]0}t t|  }||kr:t| t|= q:d S )NrS   z Download error: {} ('{}' > '{}')znetwork errorrT   rU   x   <   )r[   r-   poprQ   r^   rK   r'   r(   r)   r*   r+   r,   rJ   existsIOErrorr   rP   r   rN   exportsflush_cache_filer"   	to_unlinkkeysunlink)todo	postponedrX   r8   r_   ttldeltar   r   r   process_downloaded_resources   sB    



4

ro   )
__future__r   r*   r'   renpy.displayrB   r"   r[   rh   RLockr-   r   r   r   objectr   environr&   r?   urllib.parser$   r%   r4   rI   rM   r`   ro   r   r   r   r   <module>   s&   
& &