
    uc*                     r    d 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  G d d          Z	 G d d          Z
dS )zo
Implementation of the XDG Recent File Storage Specification
http://standards.freedesktop.org/recent-file-spec
    N)ParsingErrorc                   F    e Zd Zd ZddZd ZddZddZdd	Zd
 Z	d Z
dS )RecentFilesc                 "    g | _         d| _        d S )N )r   filenameselfs    1/usr/lib/python3/dist-packages/xdg/RecentFiles.py__init__zRecentFiles.__init__   s        Nc                 v   |s2t           j                            t          j        d          d          }	 t          j        j                            |          }nF# t          $ r t          d|          t          j
        j        j        $ r t          d|          w xY w|| _        |j        D ]u}|j        t          j        j        j        k    rT|j        dk    rI|j        D ]A}|j        t          j        j        j        k    r |j        dk    r|                     |           Bv|                                  dS )ziParse a list of recently used files.
        
        filename defaults to ``~/.recently-used``.
        HOMEz.recently-usedFile not foundzNot a valid .menu filer   
RecentItemN)ospathjoingetenvxmldomminidomparseIOErrorr   parsersexpat
ExpatErrorr   
childNodesnodeTypeNodeELEMENT_NODEtagName_RecentFiles__parseRecentItemsort)r
   r   docchildrecents        r   r   zRecentFiles.parse   s<   
  	Iw||BIf$5$57GHHH	C'/''11CC 	; 	; 	;/:::{ + 	C 	C 	C7BBB	C !^ 	? 	?E~!:::=M11"'"2 ? ?!?cgl.GGG%~== $ 6 6v > > >		s   $A ABc                    t                      }| j                            |           |j        D ]}|j        t
          j        j        j        k    r|j	        dk    r|j        d         j
        |_        E|j	        dk    r|j        d         j
        |_        h|j	        dk    r%t          |j        d         j
                  |_        |j	        dk    rd|_        |j	        dk    r^|j        D ]V}|j        t
          j        j        j        k    r5|j	        dk    r*|j                            |j        d         j
                   Wd S )	NURIr   z	Mime-Type	TimestampPrivateTGroupsGroup)
RecentFiler   appendr   r   r   r   r    r!   r"   	nodeValuer)   MimeTypeintr*   Prviater,   )r
   itemr'   	attributegroups        r   __parseRecentItemzRecentFiles.__parseRecentItem*   sC   ''' 	T 	TI!SW\%>>>$--!*!5a!8!BFJJ&+55&/&:1&=&GFOO&+55'*9+?+B+L'M'MF$$&)33%)FNN&(22!*!5 T T >SW\-FFF$}77 & 4 4U5Ea5H5R S S S	T 	Tr   c                    |s| j         st          d|          |s| j         }t          |d          5 }t          j        |t          j                   |                    d           |                    d           | j        D ]*}|                    d           |                    dt          j	        j
                            |j                  z             |                    d|j        z             |                    d|j        z             |j        d	k    r|                    d
           t!          |j                  dk    rL|                    d           |j        D ]}|                    d|z             |                    d           |                    d           ,|                    d           t          j        |t          j                   ddd           dS # 1 swxY w Y   dS )zWrite the list of recently used files to disk.
        
        If the instance is already associated with a file, filename can be
        omitted to save it there again.
        r   wz<?xml version="1.0"?>
z<RecentFiles>
z  <RecentItem>
z    <URI>%s</URI>
z    <Mime-Type>%s</Mime-Type>
z    <Timestamp>%s</Timestamp>
Tz    <Private/>
r   z    <Groups>
z      <Group>%s</Group>
z    </Groups>
z  </RecentItem>
z</RecentFiles>
N)r   r   openfcntllockfLOCK_EXwriter   r   saxsaxutilsescaper)   r1   r*   r+   lenr,   LOCK_UN)r
   r   frr6   s        r   r>   zRecentFiles.write?   s*     	% 	%/::: 	%}H(C   	*AK5=)))GG-...GG%&&&% - -*+++-0@0G0G0N0NNOOO9AJFGGG9AKGHHH9$$GG.///qx==1$$GG,---!" E E ;e CDDDDGG-...+,,,,GG&'''K5=))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   F1G11G58G5r   c                 8   g }d}| j         D ]}|r)|D ]%}||j        v r|                    |           |dz  }&nR|r+|D ]'}||j        k    r|                    |           |dz  }(n%|j        dk    r|                    |           |dz  }|dk    r||k    r n|S )zGet a list of recently used files.
        
        The parameters can be used to filter by mime types, by group, or to
        limit the number of items returned. By default, the entire list is
        returned, except for items marked private.
        r      F)r   r,   r/   r1   r+   )	r
   	mimetypesgroupslimittmpir4   r6   mimetypes	            r   getFileszRecentFiles.getFiles`   s     $ 	 	D #  E++

4(((Q   )  H4=00

4(((Q
 <5((JJt$$$FAzza5jj
r   Fc                    || j         v r(| j                             |          }| j         |         }nYt          | j                   dk    r| j                                          t	                      }| j                             |           ||_        ||_        t          t          j	                              |_
        ||_        |r||_        |                                  dS )z}Add a recently used file.
        
        item should be the URI of the file, typically starting with ``file:///``.
        i  N)r   indexrB   popr.   r/   r)   r1   r2   timer*   r+   r,   r$   )r
   r4   rM   rI   privaterP   r'   s          r   addFilezRecentFiles.addFile}   s     4###$**400E%e,FF 4#$$++ $$&&&\\F##F+++
"ty{{++  	#"FM		r   c                 P    || j         v r| j                             |           dS dS )z<Remove a recently used file, by URI, from the list.
        N)r   remove)r
   r4   s     r   
deleteFilezRecentFiles.deleteFile   s7     4#####D))))) $#r   c                 j    | j                                          | j                                          d S N)r   r$   reverser	   s    r   r$   zRecentFiles.sort   s2      """""r   rY   )NNr   )NF)__name__
__module____qualname__r   r   r#   r>   rN   rT   rW   r$    r   r   r   r   
   s             6T T T** * * *B   :   4* * *# # # # #r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r.   c                 L    d| _         d| _        d| _        d| _        g | _        d S )Nr   F)r)   r1   r*   r+   r,   r	   s    r   r   zRecentFile.__init__   s)    r   c                 6    t          | j        |j                  S rY   )cmpr*   r
   others     r   __cmp__zRecentFile.__cmp__   s    4>5?333r   c                 "    | j         |j         k     S rY   )r*   rc   s     r   __lt__zRecentFile.__lt__   s    ~//r   c                 2    | j         t          |          k    S rY   )r)   strrc   s     r   __eq__zRecentFile.__eq__   s    x3u::%%r   c                     | j         S rY   )r)   r	   s    r   __str__zRecentFile.__str__   s	    xr   N)r[   r\   r]   r   re   rg   rj   rl   r^   r   r   r.   r.      s_          4 4 40 0 0& & &    r   r.   )__doc__xml.dom.minidomr   xml.sax.saxutilsr   rR   r;   xdg.Exceptionsr   r   r.   r^   r   r   <module>rq      s    
 ) ( ( ( ( ( ( (             ' ' ' ' ' 'U# U# U# U# U# U# U# U#p         r   