o
    Žâ¿Pe>  ã                   @   sd  d Z ddlZddlZddlZddlZddlmZ ddlZddlm	Z	m
Z
 ddlmZ dZi Zdadadadaejd dkZdd	„ Zd1d
d„ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZeddƒZeddƒZeddƒZeddƒZeddƒZeddƒZ eddƒZ!eddƒZ"eddƒZ#d a$d!d"„ Z%d#d$„ Z&d%d&„ Z'd2d(d)„Z(d2d*d+„Z)d3d-d.„Z*d/d0„ Z+dS )4a¡  
This module is based on a rox module (LGPL):

http://cvs.sourceforge.net/viewcvs.py/rox/ROX-Lib2/python/rox/mime.py?rev=1.21&view=log

This module provides access to the shared MIME database.

types is a dictionary of all known MIME types, indexed by the type name, e.g.
types['application/x-python']

Applications can install information about MIME types by storing an
XML file as <MIME>/packages/<application>.xml and running the
update-mime-database command, which is provided by the freedesktop.org
shared mime database package.

See http://www.freedesktop.org/standards/shared-mime-info-spec/ for
information about the format of these files.

(based on version 0.13)
é    N)ÚBaseDirectory)ÚminidomÚXML_NAMESPACE)Údefaultdictz5http://www.freedesktop.org/standards/shared-mime-infoé   c                 C   s   d  dd„ | jD ƒ¡ ¡ S )zGet text of XML nodeÚ c                 S   s   g | ]}|j ‘qS © )Ú	nodeValue)Ú.0Únr   r   ú:/var/www/html/env/lib/python3.10/site-packages/xdg/Mime.pyÚ
<listcomp>.   s    z"_get_node_data.<locals>.<listcomp>)ÚjoinÚ
childNodesÚstrip)Únoder   r   r   Ú_get_node_data,   s   r   c                 C   sJ   |du rd| v r|   dd¡\} }| |ftvrt| |ƒt| |f< t| |f S )z­Get the MIMEtype object for this type, creating a new one if needed.
    
    The name can either be passed as one part ('text/plain'), or as two
    ('text', 'plain').
    Nú/é   )ÚsplitÚtypesÚMIMEtype©ÚmediaÚsubtyper   r   r   Úlookup0   s
   r   c                   @   sH   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S )r   z#Type holding data about a MIME typec                 C   sF   |rd|vsJ ‚|rd|vsJ ‚||ft vsJ ‚|| _|| _d| _dS )z?Don't use this constructor directly; use mime.lookup() instead.r   N)r   r   r   Ú_comment)Úselfr   r   r   r   r   Ú__init__>   s   
zMIMEtype.__init__c                 C   s    t j d| j| jd ¡}t |¡D ]<}t |¡}|du rq|j	 
td¡D ](}| td¡p-d}d|tjjv  }|| jd krD|t|ƒf| _|d	krL  dS q$qdS )
z>Loads comment for current language. Use get_comment() instead.Úmimeú.xmlNÚcommentÚlangÚenr   r   é   )ÚosÚpathr   r   r   r   Úload_data_pathsr   ÚparseÚdocumentElementÚgetElementsByTagNameNSÚFREE_NSÚgetAttributeNSr   ÚxdgÚLocaleÚlangsr   r   )r   Úresourcer&   Údocr!   r"   Úgoodnessr   r   r   Ú_loadH   s   
ûüzMIMEtype._loadc                 C   s*   | j du rdt| ƒf| _ |  ¡  | j d S )z;Returns comment for current language, loading it if needed.Nr   r   )r   Ústrr3   ©r   r   r   r   Úget_commentW   s   

zMIMEtype.get_commentc                 C   s&   t ƒ  t| ƒ}|tv rtt| ƒS | S )z:Returns the canonical MimeType object if this is an alias.)Úupdate_cacher4   Úaliasesr   )r   Úsr   r   r   Ú	canonical_   s
   zMIMEtype.canonicalc                 C   s    t ƒ  tdd„ tt| ƒ D ƒƒS )z5Returns a set of Mime types which this inherits from.c                 s   s   � | ]}t |ƒV  qd S ©N)r   )r
   Útr   r   r   Ú	<genexpr>j   s   € z)MIMEtype.inherits_from.<locals>.<genexpr>)r7   ÚsetÚinheritancer4   r5   r   r   r   Úinherits_fromg   s   zMIMEtype.inherits_fromc                 C   s   | j d | j S )Nr   r   r5   r   r   r   Ú__str__l   s   zMIMEtype.__str__c                 C   s   d| | j pdf S )Nz<%s: %s>z(comment not loaded))r   r5   r   r   r   Ú__repr__o   ó   zMIMEtype.__repr__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r3   r6   r:   r@   rA   rB   r   r   r   r   r   <   s    
r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú	MagicRulec           	      C   s¶  d | _ d | _d}	 | d¡}|dkrn||7 }q	|sd| _nt| d¡ƒ| _d}	 | d¡}|dkr3n||7 }q)t| d¡ƒ| _| d¡}| d¡}t|ƒt|ƒd>  | _| | j¡| _	| d¡}|d	krr| | j¡| _
| d¡}nd | _
|d
kr¦d}|dkr�|dkr�| d¡}|dks�|dkr‘n||7 }|dkr�|dksƒt| d¡ƒ| _nd| _|dkrÎd}|dkrÅ| d¡}|dkr½n||7 }|dks³t| d¡ƒ| _nd| _|dkrÙtdƒ‚d S )Nó    Tr   ó   >r   Úasciió   =é   ó   &ó   ~ó   +ó   
zMalformed MIME magic line)ÚnextÚprevÚreadÚnestÚintÚdecodeÚstartÚordÚlenvalueÚvalueÚmaskÚwordÚrangeÚ
ValueError)	r   ÚfÚindÚcrX   ÚhbÚlbÚwÚrr   r   r   r   s   sh   
ü
ü



ü
üÿzMagicRule.__init__c                 C   s   | j | j | j S r;   )rX   rZ   r^   r5   r   r   r   Ú	getLength³   rC   zMagicRule.getLengthc                 C   s6   | j |j k r|| _| |_d S | jr| j |¡ d S d S r;   )rU   rR   rS   Ú
appendRule)r   Úruler   r   r   rh   ¶   s   
ÿzMagicRule.appendRulec                 C   s$   |   |¡r| jr| j |¡S dS d S )NT)Úmatch0rR   Úmatch)r   Úbufferr   r   r   rk   ¾   s
   
ýzMagicRule.matchc           	      C   s¼   t |ƒ}t| jƒD ]R}| j| }|| j }||k r dS | jrMd}t| jƒD ]%}tr6|||  | j| @ }nt|||  ƒt| j| ƒ@ }|t|ƒ7 }q&n|||… }|| jkr[ dS q	d S )NFr   T)	Úlenr^   rX   rZ   r\   ÚPY3rY   Úchrr[   )	r   rl   ÚlÚor9   ÚeÚtestÚirb   r   r   r   rj   Ä   s&   

û
ÿðzMagicRule.match0c                 C   s$   d| j | j| j| j| j| j| jf S )Nz!<MagicRule %d>%d=[%d]%r&%r~%d+%d>)rU   rX   rZ   r[   r\   r]   r^   r5   r   r   r   rB   Ù   s   úzMagicRule.__repr__N)	rD   rE   rF   r   rg   rh   rk   rj   rB   r   r   r   r   rH   r   s    @rH   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	MagicTypec                 C   s   || _ g | _d | _d S r;   )ÚmtypeÚ	top_rulesÚ	last_rule)r   rv   r   r   r   r   ã   s   
zMagicType.__init__c                 C   s8   t |ƒ}|jr| jr| j |¡ n| j |¡ || _|S r;   )rH   rU   rx   rh   rw   Úappend)r   r`   Únruler   r   r   ÚgetLineè   s   zMagicType.getLinec                 C   s$   | j D ]}| |¡r| j  S qd S r;   )rw   rk   rv   )r   rl   ri   r   r   r   rk   ô   s
   


ÿÿzMagicType.matchc                 C   ó
   d| j  S )Nz<MagicType %s>)rv   r5   r   r   r   rB   ù   ó   
zMagicType.__repr__N)rD   rE   rF   r   r{   rk   rB   r   r   r   r   ru   â   s
    ru   c                   @   s8   e Zd Zdd„ Zdd„ Zddd„Zdd	d
„Zdd„ ZdS )ÚMagicDBc                 C   s   i | _ d| _d S ©Nr   )r   Úmaxlenr5   r   r   r   r   ý   s   
zMagicDB.__init__c                 C   sb  t |dƒ�¢}| ¡ }|dkrtdƒ‚	 | ¡  d¡}|snz|d dks+|dd … d	kr/td
ƒ‚|dd…  d¡\}}t|ƒ}t|ƒ}z| j| }W n   g }|| j|< Y t	|ƒ}	| 
d¡}
| dd¡ |
rŽ|
dkrŽ|	 |¡}|r}| ¡ | jkr}| ¡ | _| 
d¡}
| dd¡ |
rŽ|
dksj| |	¡ |
s–n	qW d   ƒ d S W d   ƒ d S 1 sªw   Y  d S )NÚrbs   MIME-Magic 
zNot a MIME magic fileTrK   r   ú[éþÿÿÿz]
zMalformed section headingr   ú:éÿÿÿÿó   [)ÚopenÚreadlineÚIOErrorrW   r_   r   rV   r   r   ru   rT   Úseekr{   rg   r€   ry   )r   Úfnamer`   ÚlineÚsheadÚpriÚtnamerv   ÚentsÚ	magictyperb   ri   r   r   r   Ú	mergeFile  sH   



ù
	Ü÷)"×zMagicDB.mergeFileéd   r   c                 C   s^   t | j ¡ dd�D ]#}||krq	||k r d S | j| D ]}| |¡}|r+|    S qq	d S )NT)Úreverse)Úsortedr   Úkeysrk   )r   ÚdataÚmax_priÚmin_priÚpriorityÚtypeÚmr   r   r   Ú
match_data-  s   
ÿþúzMagicDB.match_datac                 C   sT   z#t |dƒ�}| | j¡}W d   ƒ n1 sw   Y  |  |||¡W S    Y d S )Nr�   )r‡   rT   r€   r�   )r   r&   r˜   r™   r`   Úbufr   r   r   rk   9  s   ÿzMagicDB.matchc                 C   r|   )Nz<MagicDB %s>)r   r5   r   r   r   rB   A  r}   zMagicDB.__repr__N©r“   r   )rD   rE   rF   r   r’   r�   rk   rB   r   r   r   r   r~   ü   s    
,
r~   ÚtextÚplainÚinodeÚblockdeviceÚ
chardeviceÚ	directoryÚfifoÚsocketÚsymlinkÚdoorÚapplicationÚ
executableFc               	   C   s^  da i ag ai ai attƒatƒ a	dd„ } t
 tj dd¡¡D ]}| |ƒ qt
 tj dd¡¡D ]}t	 |¡ q0tjdd„ d	� t
 tj dd
¡¡D ]*}t|dƒ�}|D ]}| ¡  d d¡\}}|t|< qTW d   ƒ n1 sow   Y  qJt
 tj dd¡¡D ]-}t|dƒ�}|D ]}| ¡  d d¡\}}t|  |¡ q‰W d   ƒ n1 s§w   Y  qd S )NTc                 S   sÐ   t | ƒ�Z}|D ]N}| d¡rq|dd… }| dd¡\}}t|ƒ}| d¡r=|dd… }d|v s=d	|v s=d
|v s=|t|< qd|v sId	|v sId
|v rQt ||f¡ q|t|< qW d  ƒ dS 1 saw   Y  dS )z6Loads name matching information from a MIME directory.ú#Nr…   r„   r   z*.r$   Ú*r‚   ú?)r‡   Ú
startswithr   r   ÚextsÚglobsry   Úliterals)r&   r`   rŒ   Ú	type_nameÚpatternrv   Úrestr   r   r   Ú_import_glob_file^  s    


ñ"ÿz*_cache_database.<locals>._import_glob_filer   r±   Úmagicc                 S   s   t | d ƒS r   )rm   )Úxr   r   r   Ú<lambda>x  s    z!_cache_database.<locals>.<lambda>)Úkeyr8   rf   r   Ú
subclasses)Ú_cache_uptodater°   r±   r²   r8   r   r>   r?   r~   r·   r   r'   r%   r&   r   r’   Úsortr‡   r   r   Úadd)r¶   r&   r`   rŒ   Úaliasr:   ÚsubÚparentr   r   r   Ú_cache_databaseR  s<   

þÿ€þÿ€ÿrÂ   c                   C   s   t stƒ  d S d S r;   )r¼   rÂ   r   r   r   r   r7   ˆ  s   
ÿr7   c                 C   sì   t ƒ  tj | ¡}|tv rt| S | ¡ }|tv rt| S |}	 | d¡}|dk r*n||d d… }|tv r:t| S q |}	 | d¡}|dk rHn||d d… }|tv rXt| S q>tD ]\}}t	 	||¡ri|  S t	 	||¡rs|  S q[dS )z6Returns type of file by its name, or None if not knownr   Ú.r   N)
r7   r%   r&   Úbasenamer²   ÚlowerÚfindr°   r±   Úfnmatch)r&   ÚleafÚlleafÚextÚpÚglobÚ	mime_typer   r   r   Úget_type_by_nameŒ  s<   

û

ûÿrÎ   r“   c                 C   ó   t ƒ  t | ||¡S )z:Returns type of file by its contents, or None if not known)r7   r·   rk   )r&   r˜   r™   r   r   r   Úget_type_by_contents­  ó   rÐ   c                 C   rÏ   )z0Returns type of the data, which should be bytes.)r7   r·   r�   )r—   r˜   r™   r   r   r   Úget_type_by_data³  rÑ   rÒ   Tc                 C   sü   t ƒ  z|rt | ¡}nt | ¡}W n   t| ƒ}|pt Y S t |j¡rLt| |d�}|s2t| ƒ}|s:t| |d�}|du rJt 	|j¡d@ rHt
S tS |S t |j¡rTtS t |j¡r\tS t |j¡rdtS t |j¡rltS t |j¡rttS t |j¡r|tS tS )aˆ  Returns type of file indicated by path.
    
    path :
      pathname to check (need not exist)
    follow :
      when reading file, follow symbolic links
    name_pri :
      Priority to do name matches.  100=override magic
    
    This tries to use the contents of the file, and falls back to the name. It
    can also handle special filesystem objects like directories and sockets.
    )r™   )r˜   NéI   )r7   r%   ÚstatÚlstatrÎ   r    ÚS_ISREGÚst_moderÐ   ÚS_IMODEÚapp_exeÚS_ISDIRÚ	inode_dirÚS_ISCHRÚ
inode_charÚS_ISBLKÚinode_blockÚS_ISFIFOÚ
inode_fifoÚS_ISLNKÚinode_symlinkÚS_ISSOCKÚinode_socketÚ
inode_door)r&   ÚfollowÚname_priÚstr<   r   r   r   Úget_type¹  s2   
€rê   c           	      C   sÈ   | d7 } t |ƒ ¡ }tj dd¡}tj || ¡}t |¡D ]}zt |ƒ ¡ }W n   Y q||kr4 dS qdatj t |¡| ¡}t |dƒ 	|¡ d}t 
tj||t d¡¡rbt |¡ td| ƒ‚dS )	a  Copy 'package_file' as ``~/.local/share/mime/packages/<application>.xml.``
    If package_file is None, install ``<app_dir>/<application>.xml``.
    If already installed, does nothing. May overwrite an existing
    file with the same name (if the contents are different)r    r   ÚpackagesNFre   zupdate-mime-databasez—The '%s' command returned an error code!
Make sure you have the freedesktop.org shared MIME package:
http://standards.freedesktop.org/shared-mime-info/)r‡   rT   r%   r&   r   r   r'   r¼   Úsave_data_pathÚwriteÚspawnlpÚP_WAITÚunlinkÚ	Exception)	rª   Úpackage_fileÚnew_dataÚpackage_dirr0   r¸   Úold_dataÚnew_fileÚcommandr   r   r   Úinstall_mime_infoã  s,   ÿ
þþrø   r;   rŸ   )Tr“   ),rG   r%   rÔ   ÚsysrÇ   r-   r   Ú
xdg.LocaleÚxml.domr   r   Úcollectionsr   r+   r   r°   r±   r²   r·   Úversion_inforn   r   r   r   rH   ru   r~   r    rß   rÝ   rÛ   rá   rå   rã   ræ   rÙ   r¼   rÂ   r7   rÎ   rÐ   rÒ   rê   rø   r   r   r   r   Ú<module>   sN    
6p
J







6
!

*