
    b_*                     d    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
y)zo
Implementation of the XDG Recent File Storage Specification
http://standards.freedesktop.org/recent-file-spec
    N)ParsingErrorc                   D    e Zd Zd Zd
dZd Zd
dZddZddZd Z	d	 Z
y)RecentFilesc                      g | _         d| _        y )N )r   filenameselfs    /lib/python3.12/site-packages/xdg/RecentFiles.py__init__zRecentFiles.__init__   s        Nc                    |s3t         j                  j                  t        j                  d      d      }	 t        j
                  j                  j                  |      }|| _        |j                  D ]  }|j                  t        j
                  j                   j"                  k(  s5|j$                  dk(  sE|j                  D ]U  }|j                  t        j
                  j                   j"                  k(  s5|j$                  dk(  sE| j'                  |       W  | j)                          y# t        $ r t        d|      t        j                  j                  j                  $ r t        d|      w xY w)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   
 ww||BIIf$57GHH	C''//''1C !^^E~~!:!::==M1"'"2"2!??cggll.G.GG%~~= $ 6 6v > #3 $ 			  	;/::{{  ++ 	C7BB	Cs   )D/ /AE7c                 V   t               }| j                  j                  |       |j                  D ]t  }|j                  t
        j                  j                  j                  k(  s6|j                  dk(  r|j                  d   j                  |_        d|j                  dk(  r|j                  d   j                  |_        |j                  dk(  r(t        |j                  d   j                        |_        |j                  dk(  rd|_        |j                  dk(  s|j                  D ]v  }|j                  t
        j                  j                  j                  k(  s5|j                  dk(  sE|j                   j                  |j                  d   j                         x w y )	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*   s;   'I!!SWW\\%>%>>$$-!*!5!5a!8!B!BFJ&&+5&/&:&:1&=&G&GFO&&+5'*9+?+?+B+L+L'MF$&&)3%)FN&&(2!*!5!5 >>SWW\\-F-FF$}}7 & 4 4U5E5Ea5H5R5R S "6 )r   c                    |s| j                   st        d|      |s| j                   }t        |d      5 }t        j                  |t        j
                         |j                  d       |j                  d       | j                  D ]%  }|j                  d       |j                  dt        j                  j                  j                  |j                        z         |j                  d|j                  z         |j                  d|j                  z         |j                  d	k(  r|j                  d
       t!        |j"                        dkD  rG|j                  d       |j"                  D ]  }|j                  d|z          |j                  d       |j                  d       ( |j                  d       t        j                  |t        j$                         ddd       y# 1 sw Y   yxY w)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?   sp    /::}}H(C AKK5==)GG-.GG%&%%*+-0@0@0G0G0NNO9AJJFG9AKKGH99$GG./qxx=1$GG,-!" ;e CD "*GG-.+, & GG&'KK5==)) !  s   F1G//G8c                 T   g }d}| j                   D ]  }|r-|D ]'  }||j                  v s|j                  |       |dz  }) nU|r.|D ](  }||j                  k(  s|j                  |       |dz  }* n%|j                  dk(  r|j                  |       |dz  }|dk7  s||k(  s |S  |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

4(Q !*
 <<5(JJt$FAza5j
% %$ 
r   c                    || j                   v r+| j                   j                  |      }| j                   |   }nWt        | j                         dk(  r| j                   j                          t	               }| j                   j                  |       ||_        ||_        t        t        j                               |_
        ||_        |r||_        | j                          y)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0E%%e,F 4##$+  $$&\F##F+
"tyy{+ "FM		r   c                 X    || j                   v r| j                   j                  |       yy)z<Remove a recently used file, by URI, from the list.
        N)r   remove)r
   r4   s     r   
deleteFilezRecentFiles.deleteFile   s+     4#####D) $r   c                 l    | j                   j                          | j                   j                          y N)r   r$   reverser	   s    r   r$   zRecentFiles.sort   s&      "r   rY   )NNr   )NF)__name__
__module____qualname__r   r   r#   r>   rN   rT   rW   r$    r   r   r   r   
   s,    6T**B:4*#r   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)r.   c                 J    d| _         d| _        d| _        d| _        g | _        y )Nr   F)r)   r1   r*   r+   r,   r	   s    r   r   zRecentFile.__init__   s%    r   c                 B    t        | j                  |j                        S rY   )cmpr*   r
   others     r   __cmp__zRecentFile.__cmp__   s    4>>5??33r   c                 4    | 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    xx3u:%%r   c                     | j                   S rY   )r)   r	   s    r   __str__zRecentFile.__str__   s    xxr   N)r[   r\   r]   r   re   rg   rj   rl   r^   r   r   r.   r.      s    40&r   r.   )__doc__xml.dom.minidomr   xml.sax.saxutilsr   rR   r;   xdg.Exceptionsr   r   r.   r^   r   r   <module>rq      s/   
 )   'U# U#p r   