3
v_                 @   s  d Z ddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZmZ ddlmZ ddlZddlZejjjZdd ZG d	d
 d
ZG dd dZG dd dZG dd dZG dd dZG dd dZG dd dZi Zdd Z dIddZ!dJd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/d0 Z,d1d2 Z-d3d4 Z.d5d6 Z/d7d8 Z0d9d: Z1d;d< Z2d=d> Z3d?d@ Z4dAdB Z5dCdD Z6dEdF Z7G dGdH dHZ8dS )Ka  
Implementation of the XDG Menu Specification Version 1.0.draft-1
http://standards.freedesktop.org/menu-spec/

Example code:

from xdg.Menu import parse, Menu, MenuEntry

def print_menu(menu, tab=0):
  for submenu in menu.Entries:
    if isinstance(submenu, Menu):
      print ("	" * tab) + unicode(submenu)
      print_menu(submenu, tab+1)
    elif isinstance(submenu, MenuEntry):
      print ("	" * tab) + unicode(submenu.DesktopEntry)

print_menu(parse())
    N)xdg_data_dirsxdg_config_dirs)DesktopEntry)ParsingErrorValidationErrordebug)PY3c             C   s$   t  rt| tr| jd} tj| S )zkWrapper around locale.strxfrm that accepts unicode strings on Python 2.
    
    See Python bug #2481.
    zutf-8)r   
isinstanceunicodeencodelocalestrxfrm)s r   */usr/lib/python3/dist-packages/xdg/Menu.py_strxfrm!   s    
r   c               @   s   e Zd Z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%ddZdd Zd&ddZdd Zdd Zdd Zdd  Zd!d" Zd#S )'Menuz[Menu containing sub menus under menu.Entries

	Contains both Menu and MenuEntry items.
    c             C   s   d| _ d | _g | _d| _d| _d| _d | _d| _d| _d| _	g | _
d | _d| _g | _g | _d | _g | _g | _d| _g | _g | _d S )N r   FTnotset)Name	DirectoryEntriesDocFilenameDepthParentNotInXmlShowVisibleAppDirsDefaultLayoutDeletedDirectoriesDirectoryDirsLayoutMenuEntriesMovesOnlyUnallocatedRulesSubmenus)selfr   r   r   __init__/   s*    zMenu.__init__c             C   s   | j S )N)r   )r*   r   r   r   __str__K   s    zMenu.__str__c             C   s   x|j D ]}| j j| qW x|jD ]}| jj| q$W x|jD ]}| jj| q@W |jdkrf|j| _|jdkrx|j| _|jr|j| _|jr|j| _x|jD ]}| jj| qW x|j	D ]}| j	j| qW x|j
D ]}| j| qW | S )Nr   )r   appendr#   r"   r!   r'   r$   r    r(   r&   r)   
addSubmenu)r*   otherdir	directoryrulemovesubmenur   r   r   __add__N   s*    

zMenu.__add__c             C   s   t j| j |j S )N)r   strcollgetName)r*   r/   r   r   r   __cmp__p   s    zMenu.__cmp__c             C   s   t | j S )z&Key function for locale-aware sorting.)r   r7   )r*   r   r   r   _keys   s    z	Menu._keyc             C   s.   y|j  }W n tk
r    Y nX | j  |k S )N)r9   AttributeError)r*   r/   r   r   r   __lt__w   s
    zMenu.__lt__c             C   s2   y| j t|kS  tk
r,   | j t|kS X d S )N)r   r
   	NameErrorstr)r*   r/   r   r   r   __eq__~   s    zMenu.__eq__Fc             c   s4   x.| j D ]$}|dkr|V  q|jdkr|V  qW dS )z4Interator for a list of Entries visible to the user.TN)r   r   )r*   Zhiddenentryr   r   r   
getEntries   s
    
zMenu.getEntriesc             C   sF   x| j D ]}|j|kr|S qW |dkrBx| jD ]}|j|| q.W dS )z4Searches for a MenuEntry with a given DesktopFileID.TN)r%   DesktopFileIDr)   getMenuEntry)r*   ZdesktopfileidZdeep	menuentryr4   r   r   r   rB      s    
zMenu.getMenuEntryc             C   sL   |j dd}x:| jD ]0}|j|d krt|dkr@|j|d S |S qW dS )z&Searches for a Menu with a given path./   r   N)splitr)   r   lengetMenu)r*   pathZarrayr4   r   r   r   rH      s    zMenu.getMenuc             C   s   | }g }x8|r|j |j n|j |j  |jdkr<|j}q
P q
W |j  d}|dkr`|jd x|D ]}tjj	||}qfW |S )z/Returns this menu's path in the menu structure.r   r   F)
r-   r   r7   r   r   reversepoposrI   join)r*   ZorgZtoplevelparentnamesrI   namer   r   r   getPath   s     


zMenu.getPathc             C   s(   y| j jj S  tk
r"   | jS X dS )z"Returns the menu's localised name.N)r   r   r7   r:   r   )r*   r   r   r   r7      s    zMenu.getNamec             C   s&   y| j jj S  tk
r    dS X dS )z Returns the menu's generic name.r   N)r   r   getGenericNamer:   )r*   r   r   r   rR      s    zMenu.getGenericNamec             C   s&   y| j jj S  tk
r    dS X dS )z Returns the menu's comment text.r   N)r   r   
getCommentr:   )r*   r   r   r   rS      s    zMenu.getCommentc             C   s&   y| j jj S  tk
r    dS X dS )z0Returns the menu's icon, filename or simple namer   N)r   r   getIconr:   )r*   r   r   r   rT      s    zMenu.getIconc             C   sD   x>| j D ]}||kr||7 }P qW | j j| | |_| jd |_d S )NrE   )r)   r-   r   r   )r*   newmenur4   r   r   r   r.      s    zMenu.addSubmenuN)F)F)FF)__name__
__module____qualname____doc__r+   r,   r5   r8   r9   r;   r>   r@   rB   rH   rQ   r7   rR   rS   rT   r.   r   r   r   r   r   *   s"   "

	

r   c               @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )MovezA move operationNc             C   s    |r| j | nd| _d| _d S )Nr   )	parseNodeOldNew)r*   noder   r   r   r+      s    zMove.__init__c             C   s   t | j|jS )N)Zcmpr\   )r*   r/   r   r   r   r8      s    zMove.__cmp__c             C   s   x|j D ]}|jtkr|jdkrXy| j|j d j W q tk
rT   tddY qX q|jdkry| j|j d j W q tk
r   tddY qX qW d S )Nr\   r   zOld cannot be emptyz??r]   zNew cannot be empty)	
childNodesnodeTypeELEMENT_NODEtagNameparseOld	nodeValue
IndexErrorr   parseNew)r*   r^   childr   r   r   r[      s    


zMove.parseNodec             C   s
   || _ d S )N)r\   )r*   valuer   r   r   rc      s    zMove.parseOldc             C   s
   || _ d S )N)r]   )r*   rh   r   r   r   rf      s    zMove.parseNew)N)	rV   rW   rX   rY   r+   r8   r[   rc   rf   r   r   r   r   rZ      s   
rZ   c               @   sF   e Zd ZdZdddZdd Zdd
dZdd Zdd ZdddZ	dS )r$   zMenu Layout classNc             C   s   g | _ |rr|jdpd| _|jdp&d| _|jdp6d| _|jdpFd| _|jdpVd| _t| j| _| j| n>d| _d| _d| _d| _d| _| j j	d	d
g | j j	d	dg d S )N
show_emptyfalseinlineinline_limit   inline_headertrueinline_aliasMergemenusfiles)
ordergetAttributeri   rk   rl   rn   rp   intr[   r-   )r*   r^   r   r   r   r+     s     zLayout.__init__c             C   s  x|j D ]}|jtkr
|jdkryR| j|j d j|jdp@d|jdpLd|jdpXd|jdpdd	|jd
ppd W n tk
r   tddY nX q
|jdkr| j	  q
|jdkry| j
|j d j W n tk
r   tddY nX q
|jdkr
| j|jdp
d q
W d S )NMenunamer   ri   rj   rk   rl   rm   rn   ro   rp   zMenuname cannot be emptyr   	Separatorr   zFilename cannot be emptyrq   typeall)r_   r`   ra   rb   parseMenunamerd   ru   re   r   parseSeparatorparseFilename
parseMerge)r*   r^   rg   r   r   r   r[     s,    






zLayout.parseNoderj   rm   ro   c             C   s:   | j jd||||||g t| j d d | j d d< d S )Nrw   rE   rm   r   )rt   r-   rv   )r*   rh   emptyrk   rl   rn   rp   r   r   r   r{   -  s    zLayout.parseMenunamec             C   s   | j jdg d S )Nrx   )rt   r-   )r*   r   r   r   r|   1  s    zLayout.parseSeparatorc             C   s   | j jd|g d S )Nr   )rt   r-   )r*   rh   r   r   r   r}   4  s    zLayout.parseFilenamerz   c             C   s   | j jd|g d S )Nrq   )rt   r-   )r*   ry   r   r   r   r~   7  s    zLayout.parseMerge)N)rj   rj   rm   ro   rj   )rz   )
rV   rW   rX   rY   r+   r[   r{   r|   r}   r~   r   r   r   r   r$      s   

r$   c               @   sl   e Zd ZdZdddZdd Zdd Z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S )RulezInlcude / Exclude Rules ClassNc             C   s2   || _ d| _d| _dg| _d| _|r.| j| d S )Nr   r   orT)Typer   r   Exprr]   r[   )r*   ry   r^   r   r   r   r+   =  s    zRule.__init__c             C   s   | j S )N)r   )r*   r   r   r   r,   L  s    zRule.__str__c             C   sX   xR|D ]J}|dkr*|j dks|jdkr*qqt| jr|dkrJd|_d|_ qd|_qW |S )N   TIncludeF)MatchedInclude	Allocatedevalr   Add)r*   menuentriesry   ZrunrC   r   r   r   doO  s    



zRule.doc             C   s   x|j D ]}|jtkr|jdkrXy| j|j d j W q tk
rT   tddY qX q|jdkry| j|j d j W q tk
r   tddY qX q|jdkr| j	  q|jdkr| j
| q|jd	kr| j| q|jd
kr| j| qW d S )Nr   r   zFilename cannot be emptyz???ZCategoryzCategory cannot be emptyZAllZAndZOrZNot)r_   r`   ra   rb   r}   rd   re   r   parseCategoryparseAllparseAndparseOrparseNot)r*   r^   rg   r   r   r   r[   \  s(    







zRule.parseNodeTc             C   s>   | j s$|  jd| j| j  d 7  _|s0d| _ n
|r:d| _ d S )N TF)r]   r   r   r   )r*   setr   r   r   rf   r  s    zRule.parseNewc             C   s"   | j   |  jd|j  7  _d S )Nzmenuentry.DesktopFileID == %r)rf   r   strip)r*   rh   r   r   r   r}   z  s    zRule.parseFilenamec             C   s"   | j   |  jd|j  7  _d S )Nz%r in menuentry.Categories)rf   r   r   )r*   rh   r   r   r   r   ~  s    zRule.parseCategoryc             C   s   | j   |  jd7  _d S )NTrue)rf   r   )r*   r   r   r   r     s    zRule.parseAllc             C   sf   | j d |  jd7  _|  jd7  _| jjd | j| |  jd8  _| jj  |  jd7  _d S )NF(rE   and))rf   r   r   r   r-   r[   rK   )r*   r^   r   r   r   r     s    


zRule.parseAndc             C   sf   | j d |  jd7  _|  jd7  _| jjd | j| |  jd8  _| jj  |  jd7  _d S )NFr   rE   r   r   )rf   r   r   r   r-   r[   rK   )r*   r^   r   r   r   r     s    


zRule.parseOrc             C   sf   | j d |  jd7  _|  jd7  _| jjd | j| |  jd8  _| jj  |  jd7  _d S )NFznot (rE   r   r   )rf   r   r   r   r-   r[   rK   )r*   r^   r   r   r   r     s    


zRule.parseNot)N)T)rV   rW   rX   rY   r+   r,   r   r[   rf   r}   r   r   r   r   r   r   r   r   r   r   ;  s   



r   c               @   st   e Zd ZdZdddZdd Zdd Z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S )	MenuEntryz(Wrapper for 'Menu Style' Desktop Entriesr   c             C   sV   t tjj||| _ | j||| d| _d | _g | _d| _d| _	d| _
| j j | _d S )NTF)r   rL   rI   rM   setAttributesr   OriginalParentsr   r   r   ZgetCategories
Categories)r*   filenamer0   prefixr   r   r   r+     s    zMenuEntry.__init__c             C   s   | j jdkr| j j  dS )z&Save any changes to the desktop entry.TN)r   Ztaintedwrite)r*   r   r   r   save  s    zMenuEntry.savec             C   s   | j jj| jdS )z7Return the directory containing the desktop entry file.r   )r   r   replacer   )r*   r   r   r   getDir  s    zMenuEntry.getDirc             C   s8   t jjdkr0| jrdS td | jjkr*dS dS ndS dS )z.Return the type of MenuEntry, System/User/BothFZBothr   UserSystemN)xdgConfig	root_moder   r   r   r   )r*   r   r   r   getType  s    zMenuEntry.getTypec             C   s@   || _ || _tjj||jdd| _tjj| jj	s<| j
  d S )NrD   -)r   PrefixrL   rI   rM   r   rA   isabsr   r   _MenuEntry__setFilename)r*   r   r0   r   r   r   r   r     s
    zMenuEntry.setAttributesc             C   s.   | j  dkr*t| j| j | j| _| j  d S )Nr   )r   r   r   r   r   r   r   )r*   r   r   r   updateAttributes  s    zMenuEntry.updateAttributesc             C   sb   t jjdkrtd }ntd }| jj dkr<tjj|d}ntjj|d}tjj|| j	| j_
d S )NFr   rE   ZApplicationapplicationszdesktop-directories)r   r   r   r   r   r   rL   rI   rM   r   r   )r*   rI   r0   r   r   r   Z__setFilename  s    
zMenuEntry.__setFilenamec             C   s   t j| jj |jj S )N)r   r6   r   r7   )r*   r/   r   r   r   r8     s    zMenuEntry.__cmp__c             C   s   t | jj S )z&Key function for locale-aware sorting.)r   r   r7   )r*   r   r   r   r9     s    zMenuEntry._keyc             C   s.   y|j  }W n tk
r    Y nX | j  |k S )N)r9   r:   )r*   r/   r   r   r   r;     s
    zMenuEntry.__lt__c             C   s   | j t|krdS dS d S )NTF)rA   r=   )r*   r/   r   r   r   r>     s    zMenuEntry.__eq__c             C   s   | j S )N)rA   )r*   r   r   r   __repr__  s    zMenuEntry.__repr__N)r   r   )r   r   )rV   rW   rX   rY   r+   r   r   r   r   r   r   r8   r9   r;   r>   r   r   r   r   r   r     s   

r   c               @   s   e Zd ZdZdd ZdS )rx   z!Just a dummy class for Separatorsc             C   s   || _ d| _d S )NT)r   r   )r*   rN   r   r   r   r+     s    zSeparator.__init__N)rV   rW   rX   rY   r+   r   r   r   r   rx     s   rx   c               @   s    e Zd ZdZdd Zdd ZdS )HeaderzClass for Inline Headersc             C   s   || _ || _|| _d S )N)r   GenericNameComment)r*   rP   Zgeneric_nameZcommentr   r   r   r+     s    zHeader.__init__c             C   s   | j S )N)r   )r*   r   r   r   r,     s    zHeader.__str__N)rV   rW   rX   rY   r+   r,   r   r   r   r   r   
  s   r   c             C   s`   t d d  }tjjdkr"|jd x8|D ]0}tjj|d| }tjj|r(tjj	|r(|S q(W d S )NTr   rr   )
r   r   r   r   rK   rL   rI   rM   isdirisfile)r   dirsr0   Zmenunamer   r   r   __getFileName  s    

r   c             C   sH  | rt jj|  rt| } | sVt jjddd }t|} | sVt jjddd }t|} | shtdd| t jj| d dkstd	| ytj	j
j| }W n$ tjjjk
r   td
| Y nX dtd< g td< g td< t td< t|| td  ttd  ttd  |td _| td _ttd  ttd  ttd  td S )zLoad an applications.menu file.
    
    filename : str, optional
      The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
    ZXDG_MENU_PREFIXr   zapplications.menuzdebian-menu.menuzFile not foundz/etc/xdg/menus/%srE   z.menuzNot a .menu filezNot a valid .menu fileRoot
mergeFilesr#   cache)rL   rI   r   r   environgetr   splitextxmldomminidomparseparsersexpat
ExpatErrortmpMenuEntryCache__parse__parsemove__postparser   r   __genmenuNotOnlyAllocated__genmenuOnlyAllocatedsort)r   	candidatedocr   r   r   r   !  s<    



r   c             C   s  x| j D ]}|jtkr
|jdkr2t||| q
|jdkrvyt|j d j|| W n tk
rr   td|Y nX q
|jdkrt	|| q
|jdkryt
|j d j|| W n tk
r   td|Y nX q
|jdkrt|| q
|jd	kr(y|j d j|_W n  tk
r$   td
|Y nX q
|jdkrpy|jj|j d j W n  tk
rl   td|Y nX q
|jdkrd|_q
|jdkrd|_q
|jdkrd|_q
|jdkrd|_q
|jdks|jdkr|jjt|j| q
|jdkrXy:|jddkrtd||| nt|j d j||| W n  tk
rT   td|Y nX q
|jdkryt|j d j||| W n  tk
r   td|Y nX q
|jdkrt||| q
|jdkr|jjt| q
|jdkrt|j dkrt||_q
|jd kr*t|j dkrt||_q
|jd!krzy t|j d j|jd"|| W n  tk
rv   td#|Y nX q
|jd$kr
t|| q
W d S )%Nr   ZAppDirr   zAppDir cannot be emptyZDefaultAppDirsZDirectoryDirzDirectoryDir cannot be emptyZDefaultDirectoryDirsr   zName cannot be emptyr   zDirectory cannot be emptyr'   TZNotOnlyUnallocatedFr!   Z
NotDeletedr   ZExcludeZ	MergeFilery   rN   zapplications.menuzMergeFile cannot be emptyZMergeDirzMergeDir cannot be emptyZDefaultMergeDirsrZ   r$   rE   r    Z	LegacyDirr   zLegacyDir cannot be emptyZKDELegacyDirs)r_   r`   ra   rb   __parseMenu__parseAppDirrd   re   r   __parseDefaultAppDir__parseDirectoryDir__parseDefaultDirectoryDirr   r"   r-   r'   r!   r(   r   ru   __parseMergeFile__parseMergeDir__parseDefaultMergeDirsr&   rZ   rG   r$   r    __parseLegacyDir__parseKDELegacyDirs)r^   r   rN   rg   r   r   r   r   ]  s    





 
r   c             C   s   x| j D ]}t| qW x| jD ]}| j|j}|r | j|j}|jjd}d }xdt|dkr|sf| }|j|d }|st }|d |_	t|dkrd|_
|j| |}|jd qRW ||7 }|jj j| q W d S )NrD   r   rE   T)r)   r   r&   rH   r\   r]   rF   rG   r   r   r   r.   rK   r   remove)menur4   r3   Zmove_from_menuZmove_to_menurr   Z	oldparentrU   r   r   r   r     s,    

r   c             C   s  | j dkrd| _ | jdkr d| _| j s0| j r| jr@| j| _nV| jrf| jdkr\| jj| _qt | _n0| jdkr| jj| _| jj| _nt | _t | _| jdkr| jj| j | _| jj| j | _t| j	| _	t| j| _t| j| _x| j
D ]}t| qW | j	j  | jj  | jj  x| j	D ]z}xh| jD ]^}tjjtjj||r.t||}| jsd|| _n&|j dkr.| jj dkr.|| j_q.W | jr"P q"W d S )Nr   Fr   r   r   )r!   r'   r$   r    r   r   r   r#   __removeDuplicatesr"   r)   r   rJ   rL   rI   r   rM   r   r   r   r   )r   r4   r1   r0   rC   r   r   r   r     sL    











r   c             C   s.   t  }t| || |r"|j| n|td< d S )Nr   )r   r   r.   r   )rg   r   rN   mr   r   r   r     s
    r   c             C   s   t jj|}t jj| s&t jj|| } t jj| } |dkrVt jj| rVt jj| rV| S |dkrzt jj| rzt jj| rz| S dS d S )Nr0   fileF)	rL   rI   dirnamer   rM   abspathexistsr   r   )rh   r   ry   rI   r   r   r   __check  s      r   c             C   s    t | |d} | r|jj|  d S )Nr0   )r   r   r-   )rh   r   rN   r   r   r   r     s    r   c             C   s,   x&t tD ]}ttjj|d| | q
W d S )Nr   )reversedr   r   rL   rI   rM   )r   rN   r0   r   r   r   r     s    r   c             C   s    t | |d} | r|jj|  d S )Nr0   )r   r#   r-   )rh   r   rN   r   r   r   r     s    r   c             C   s,   x&t tD ]}ttjj|d| | q
W d S )Nzdesktop-directories)r   r   r   rL   rI   rM   )r   rN   r0   r   r   r   r      s    r   c             C   s   |j ddkr~xtD ]d}|j|djd}||krxDtD ]<}||krFq8tjjtjj||r8ttjj|||| P q8W qW nt	| |d} | rt| || d S )Nry   rN   r   rD   r   )
ru   r   r   r   rL   rI   r   rM   __mergeFiler   )rh   rg   r   rN   r0   Zrel_filepr   r   r   r   %  s    

r   c             C   sn   t | |d} | rjxXtj| D ]J}y.tjj|d dkrLttjj| ||| W q tk
rd   wY qX qW d S )Nr0   rE   z.menu)r   rL   listdirrI   r   r   rM   UnicodeDecodeError)rh   rg   r   rN   itemr   r   r   r   5  s    r   c             C   sL   t jjt jj|d }x.ttD ]"}tt jj|d|d | || q"W d S )Nr   rr   z-merged)rL   rI   r   basenamer   r   r   rM   )rg   r   rN   r   r0   r   r   r   r   ?  s    r   c             C   s   | t d kr trtd| nd S t d j|  ytjjj| }W nT tk
rh   tr`td| nd S Y n. tj	j
jk
r   trtd| nd S Y nX x&|jD ]}|jtkrt|| | P qW d S )Nr   z Infinite MergeFile loop detectedzFile not foundzNot a valid .menu file)r   r   r   r-   r   r   r   r   IOErrorr   r   r   r_   r`   ra   r   )r   rg   rN   r   r   r   r   r   D  s&    

r   c             C   s   t | |||}|r||7 }d S )N)__mergeLegacyDir)r0   r   r   rN   r   r   r   r   r   c  s    r   c       
      C   sf  t | |d} | o| td krbtd j|  t }|jj|  |jj|  tjj| |_	d|_
xxtj| D ]j}yN|dkr|jj| n4tjjtjj| |r|jttjj| |||| W qj tk
r   wjY qjX qjW td j| g|d td j| gd}x^|D ]V}|j}t|dkr<td}	|	j|j |jj|	 | |jkr|jd	 ||_qW |S d S )
Nr0   r#   Tz
.directoryr   Fr   r   ZLegacy)r   r   r-   r   r   r#   rL   rI   r   r   r   r   r"   r   rM   r.   r   r   addMenuEntriesgetMenuEntriesr   rG   r   r}   rA   r(   )
r0   r   r   rN   r   r   r   rC   Z
categoriesrr   r   r   r   h  s8    "

r   c             C   s   y,t jdddgt jdd}|j d j }W n tk
r@   d S X y*x$|d jdD ]}t|d| | qTW W n tk
r   Y nX d S )	Nz
kde-configz--pathZappsT)stdoutZuniversal_newlinesr   :Zkde)	
subprocessPopenPIPEZcommunicate
splitlinesOSErrorrF   r   re   )r   rN   procoutputr0   r   r   r   r     s    r   c                s*   i  | j    fdd| D } | j   | S )Nc                s    g | ]}| kr j ||qS r   )
setdefault).0e)r   r   r   
<listcomp>  s    z&__removeDuplicates.<locals>.<listcomp>)rJ   )listr   )r   r   r     s
    r   c             C   s   x| j D ]}t| qW | jdkrtd j| j g }x*| jD ] }|jtd j| j|j	d}q>W x:|D ]2}|j
dkrh|jj|  d|_
d|_| jj| qhW d S )NFr   rE   T)r)   r   r'   r   r   r   r(   r   r   r   r   r   r-   r   r%   )r   r4   r   r2   rC   r   r   r   r     s    
 

r   c             C   s   x| j D ]}t| qW | jdkrtd j| j g }x*| jD ] }|jtd j| j|j	d}q>W x.|D ]&}|j
dkrh|jj|  | jj| qhW d S )NTr   r   )r)   r   r'   r   r   r   r(   r   r   r   r   r   r-   r%   )r   r4   r   r2   rC   r   r   r   r     s    
 

r   c             C   sR  g | _ d| _x| jD ]}t| qW g }g }xF| jjD ]:}|d dkrV|j|d  q6|d dkr6|j|d  q6W xZ| jjD ]L}|d dkrt| }t| j dkrt	| j d trd|_
| j j| q|d dkr| j|d }|r| j j| q|d dkr&| j|d }|rt||  q|d dkr|d dksN|d d	kr| jj  xt| jD ]}||kr`| j j| q`W q|d d
ks|d d	kr| jj  x&| jD ]}|j|krt||  qW qW x| j D ]}d|_
|  jd7  _t	|tr|jdkr$d|_
|  jd8  _n\t	|jtr|jjj dkrZd|_
|  jd8  _n&|jjj dkrd|_
|  jd8  _nt	|trf|jj dkrd|_
|  jd8  _n|jj dkrd|_
|  jd8  _n|jj rt|jj  rd|_
|  jd8  _nVtjjr|jj g kr<tjj|jj ksPtjj|jj krd|_
|  jd8  _nt	|tr|  jd8  _qW t| j dkrt	| j d trd| j d _
t| j dkrt	| j d trd| j d _
xj| j d d  D ]X}t	|tr|jjdkr|jdkrd|_
|  jd8  _|jdkr| j j | qW d S )Nr   r   rE   rw   rx   Frq   rs   rz   rr   Tr!   Z	NoDisplayZHiddenZNoExecZ	NotShowInrj   ZEmptyr   r   r   )!r   r   r)   r   r$   rt   r-   rx   rG   r	   r   rB   rH   __parse_inliner%   r   r   r!   r   r   r   ZgetNoDisplayZ	getHiddenZ
getTryExec
__try_execr   r   ZwindowmanagerZgetOnlyShowInZgetNotShowInri   r   r   )r   r4   Ztmp_sZtmp_ert   Z	separatorrC   r?   r   r   r   r     s    



$&r   c             C   sp   t jd jt j}t jj| sZxL|D ]0}t jj|| }t jj|r$t j|t jr$dS q$W nt j| t jrldS dS )NPATHTF)	rL   r   rF   pathseprI   r   rM   accessX_OK)
executablepathsr   fr   r   r   r     s    

r   c             C   s
  | j jdkrt| jdkr| j jdkr| jd }|jjd| j dd |jjd| j dd |jjd| j	 dd |jj
| nxt| j| j jks| j jdkr| j jdkrt| j | j | j	 }|jj
| x(| jD ]}|jj
| qW n|jj
|  n|jj
|  d S )	Nro   rE   r   r   T)r   r   r   )r$   rk   rG   r   rp   r   r   r7   rR   rS   r-   rl   rn   r   )r4   r   rC   headerr?   r   r   r   r   -  s    
r   c               @   s4   e Zd ZdZdd ZdddZdd	 ZdddZdS )r   zClass to cache Desktop Entriesc             C   s   i | _ g | j d< i | _d S )Nlegacy)cacheEntriesr   )r*   r   r   r   r+   B  s    
zMenuEntryCache.__init__r   Fc             C   s6   x0|D ](}|| j krg | j |< | j|d|| qW d S )Nr   )r  _MenuEntryCache__addFiles)r*   r   r   r  r0   r   r   r   r   G  s    


zMenuEntryCache.addMenuEntriesc             C   s   xt jt jj||D ]}t jj|d dkrytt jj||||}W n tk
r^   wY nX | j| j| |dkr| jd j| qt jj	t jj|||r|dkr| j
|t jj|||| qW d S )NrE   z.desktopTr  F)rL   r   rI   rM   r   r   r   r  r-   r   r  )r*   r0   Zsubdirr   r  r   rC   r   r   r   Z
__addFilesM  s     zMenuEntryCache.__addFilesTc             C   s   g }g }|d d  }|dkr&|j d dj|}y
| j| S  tk
rN   Y nX x|D ]}x| j| D ]r}yV|j|kr|j |j |j | n0|j dkr|j|}	||	 }
|
j dkr||
_W qf t	k
r   wfY qfX qfW qVW || j|< |S )NTr  r   r   r   )
r-   rM   r   KeyErrorr  rA   r   indexr   r   )r*   r   r  r   ZidsZappdirskeyr0   rC   ir   r   r   r   r   [  s2    







zMenuEntryCache.getMenuEntriesN)r   F)T)rV   rW   rX   rY   r+   r   r  r   r   r   r   r   r   @  s
   
r   )N)N)9rY   r   rL   Zxml.dom.minidomr   r   Zxdg.BaseDirectoryr   r   Zxdg.DesktopEntryr   Zxdg.Exceptionsr   r   r   Zxdg.utilr   Z
xdg.Localer   Z
xdg.Configr   ZNodera   r   r   rZ   r$   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sX   
	 7 ;j^

<
F:	
#[