3
v_A                 @   sT   d Z ddlmZmZ ddlZddlmZ ddlZ	ddl
Z
ddlZG dd deZdS )a;  
Complete implementation of the XDG Desktop Entry Specification Version 1.0
http://standards.freedesktop.org/desktop-entry-spec/

Not supported:
- Encoding: Legacy Mixed
- Does not check exec parameters
- Does not check URL's
- Does not completly validate deprecated/kde items
- Does not completly check categories
    )IniFileis_asciiN)ParsingErrorc               @   s  e Zd ZdZdZdpd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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,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2d`da Z3dbdc Z4ddde Z5dfdg Z6dhdi Z7djdk Z8dldm Z9dndo Z:dS )qDesktopEntryz+Class to parse and validate Desktop EntrieszDesktop EntryNc             C   s6   t  | _|r$tjj|r$| j| n|r2| j| dS )zCreate a new DesktopEntry
        
        If filename exists, it will be parsed as a desktop entry file. If not,
        or if filename is None, a blank DesktopEntry is created.
        N)dictcontentospathexistsparsenew)selffilename r   2/usr/lib/python3/dist-packages/xdg/DesktopEntry.py__init__   s
    zDesktopEntry.__init__c             C   s   | j  S )N)getName)r   r   r   r   __str__%   s    zDesktopEntry.__str__c             C   s   t j| |ddg dS )zParse a desktop entry file.zDesktop EntryzKDE Desktop EntryN)r   r   )r   filer   r   r   r   (   s    zDesktopEntry.parsec             C   s
   | j dS )NType)get)r   r   r   r   getType-   s    zDesktopEntry.getTypec             C   s   | j dddS )z)deprecated, use getVersionString instead Versionnumeric)type)r   )r   r   r   r   
getVersion/   s    zDesktopEntry.getVersionc             C   s
   | j dS )Nr   )r   )r   r   r   r   getVersionString2   s    zDesktopEntry.getVersionStringc             C   s   | j dddS )NNameT)locale)r   )r   r   r   r   r   4   s    zDesktopEntry.getNamec             C   s   | j dddS )NZGenericNameT)r   )r   )r   r   r   r   getGenericName6   s    zDesktopEntry.getGenericNamec             C   s   | j dddS )N	NoDisplayboolean)r   )r   )r   r   r   r   getNoDisplay8   s    zDesktopEntry.getNoDisplayc             C   s   | j dddS )NCommentT)r   )r   )r   r   r   r   
getComment:   s    zDesktopEntry.getCommentc             C   s   | j dddS )NZIconT)r   )r   )r   r   r   r   getIcon<   s    zDesktopEntry.getIconc             C   s   | j dddS )NHiddenr!   )r   )r   )r   r   r   r   	getHidden>   s    zDesktopEntry.getHiddenc             C   s   | j dddS )N
OnlyShowInT)list)r   )r   r   r   r   getOnlyShowIn@   s    zDesktopEntry.getOnlyShowInc             C   s   | j dddS )N	NotShowInT)r)   )r   )r   r   r   r   getNotShowInB   s    zDesktopEntry.getNotShowInc             C   s
   | j dS )NTryExec)r   )r   r   r   r   
getTryExecD   s    zDesktopEntry.getTryExecc             C   s
   | j dS )NExec)r   )r   r   r   r   getExecF   s    zDesktopEntry.getExecc             C   s
   | j dS )NPath)r   )r   r   r   r   getPathH   s    zDesktopEntry.getPathc             C   s   | j dddS )NTerminalr!   )r   )r   )r   r   r   r   getTerminalJ   s    zDesktopEntry.getTerminalc             C   s   | j ddddS )z%deprecated, use getMimeTypes instead MimeTypeTregex)r)   r   )r   )r   r   r   r   getMimeTypeL   s    zDesktopEntry.getMimeTypec             C   s   | j dddS )Nr5   T)r)   )r   )r   r   r   r   getMimeTypesO   s    zDesktopEntry.getMimeTypesc             C   s   | j dddS )N
CategoriesT)r)   )r   )r   r   r   r   getCategoriesQ   s    zDesktopEntry.getCategoriesc             C   s   | j dddS )NStartupNotifyr!   )r   )r   )r   r   r   r   getStartupNotifyS   s    zDesktopEntry.getStartupNotifyc             C   s
   | j dS )NStartupWMClass)r   )r   r   r   r   getStartupWMClassU   s    zDesktopEntry.getStartupWMClassc             C   s
   | j dS )NURL)r   )r   r   r   r   getURLW   s    zDesktopEntry.getURLc             C   s   | j dddS )NServiceTypesT)r)   )r   )r   r   r   r   getServiceTypes\   s    zDesktopEntry.getServiceTypesc             C   s
   | j dS )NDocPath)r   )r   r   r   r   
getDocPath^   s    zDesktopEntry.getDocPathc             C   s   | j ddddS )NZKeywordsT)r)   r   )r   )r   r   r   r   getKeywords`   s    zDesktopEntry.getKeywordsc             C   s
   | j dS )NInitialPreference)r   )r   r   r   r   getInitialPreferenceb   s    z!DesktopEntry.getInitialPreferencec             C   s
   | j dS )NDev)r   )r   r   r   r   getDevd   s    zDesktopEntry.getDevc             C   s
   | j dS )NFSType)r   )r   r   r   r   	getFSTypef   s    zDesktopEntry.getFSTypec             C   s
   | j dS )N
MountPoint)r   )r   r   r   r   getMountPointh   s    zDesktopEntry.getMountPointc             C   s   | j dddS )NReadOnlyr!   )r   )r   )r   r   r   r   getReadonlyj   s    zDesktopEntry.getReadonlyc             C   s   | j dddS )NZUnmountIconT)r   )r   )r   r   r   r   getUnmountIconl   s    zDesktopEntry.getUnmountIconc             C   s   | j dddS )NZMiniIconT)r   )r   )r   r   r   r   getMiniIconq   s    zDesktopEntry.getMiniIconc             C   s
   | j dS )NTerminalOptions)r   )r   r   r   r   getTerminalOptionss   s    zDesktopEntry.getTerminalOptionsc             C   s
   | j dS )N
DefaultApp)r   )r   r   r   r   getDefaultAppu   s    zDesktopEntry.getDefaultAppc             C   s   | j dddS )N	ProtocolsT)r)   )r   )r   r   r   r   getProtocolsw   s    zDesktopEntry.getProtocolsc             C   s   | j dddS )N
ExtensionsT)r)   )r   )r   r   r   r   getExtensionsy   s    zDesktopEntry.getExtensionsc             C   s
   | j dS )NBinaryPattern)r   )r   r   r   r   getBinaryPattern{   s    zDesktopEntry.getBinaryPatternc             C   s
   | j dS )N	MapNotify)r   )r   r   r   r   getMapNotify}   s    zDesktopEntry.getMapNotifyc             C   s
   | j dS )NEncoding)r   )r   r   r   r   getEncoding   s    zDesktopEntry.getEncodingc             C   s   | j dddS )NZSwallowTitleT)r   )r   )r   r   r   r   getSwallowTitle   s    zDesktopEntry.getSwallowTitlec             C   s
   | j dS )NSwallowExec)r   )r   r   r   r   getSwallowExec   s    zDesktopEntry.getSwallowExecc             C   s   | j dddS )N	SortOrderT)r)   )r   )r   r   r   r   getSortOrder   s    zDesktopEntry.getSortOrderc             C   s   | j dddS )NFilePatternr6   )r   )r   )r   r   r   r   getFilePattern   s    zDesktopEntry.getFilePatternc             C   s   | j dddS )NActionsT)r)   )r   )r   r   r   r   
getActions   s    zDesktopEntry.getActionsc             C   sh   t jj|d dkrd}n$t jj|d dkr4d}n
td|t | _| j| j | jd| || _	dS )	zMake this instance into a new desktop entry.
        
        If filename has a .desktop extension, Type is set to Application. If it
        has a .directory extension, Type is Directory.
           z.desktopApplicationz
.directory	DirectoryzUnknown extensionr   N)
r   r	   splitextr   r   r   ZaddGroupdefaultGroupsetr   )r   r   r   r   r   r   r      s    
zDesktopEntry.newc             C   s   | j dkr| jjd | jdkr.| jjd n | jdkrN| jdkrN| jjd y| j| j  d | _W n  tk
r   | jjd	 Y nX y| j| j  d
 | _W n  tk
r   | jjd Y nX d S )NzKDE Desktop Entryz([KDE Desktop Entry]-Header is deprecatedz.kdelnkz$File extension .kdelnk is deprecatedz.desktopz
.directoryzUnknown File extensionr   zKey 'Type' is missingr   zKey 'Name' is missing)	rm   warningsappendfileExtensionr   r   KeyErrorerrorsname)r   r   r   r   checkExtras   s    

zDesktopEntry.checkExtrasc             C   sh   || j kp(tjd|p(tjd|o(t|s<| jjd|  n(d| j| krdd| j| krd| jjd d S )Nz^Desktop Action [a-zA-Z0-9\-]+$z^X-zInvalid Group name: %sr(   r+   z;Group may either have OnlyShowIn or NotShowIn, but not both)rm   rematchr   rs   rp   r   )r   groupr   r   r   
checkGroup   s    
zDesktopEntry.checkGroupc             C   s  |dkr|dks |dks |dkr2| j jd|  n>|dkrH| j jd n(|dkp^|d	kp^|d
ksp| jjd|  | jdkr|d
k r| j jd|  n| jdkr|d
kr| j jd |dkrd| j| kr| j jd |d	krd| j| kr| j jd n|dkr| j|| ntjdtj	j
 d |r4ntjdtj	j
 d |rRnt|dkrp| j||dd nVtjdtj	j
 d |rn8tjdtj	j
 d |r| j|| n|dkr| j||dd n|dkr| j||dd  | j| n|d!kr&| j||dd  | j| n|d"krL| j|| | j|d nz|dkrr| j|| | j|d nT|d#kr| j|| | j|d n.|d$kr| j||dd | j|d n|d%kr| j||dd  | j|d n|dkr| j||dd  | j|d n|d&krF| j|| | j|d | j| ntjd'tj	j
 d |r| j||d(dd) | j|d nD|d*kr| j||dd | j|d n|d+kr| j|d n |dkr| j|| | j|d n|d,kr| j||dd  | j jd-|  n|d.krD| j|| | j jd-|  n|d/krr| j||d0d | j jd-|  nT|d1kr| j|| | j|d | j jd-|  n|d2kr| j|| | j|d | j jd-|  n|d3kr| j|| | j|d | j jd-|  n|d4krN| j||dd | j|d | j jd-|  nxtjd5tj	j
 d |r| j|| | j|d | j jd-|  n2|d6kr| j|| | j jd7|  ntjd8tj	j
 d |r| j|| | j jd7|  n|d9kr"| j|| | j jd7|  n|d:krL| j|| | j jd7|  nz|d;krz| j||dd  | j jd7|  nL|d<kr| j||dd  | j jd7|  n|d=kr| j|| | j jd7|  n|d>kr| j|| | j jd7|  ntjd?tj	j
 d |r$| j jd7|  n|d@krL| j|| | j jd7|  nz|dAkrz| j||dBdd) | j jd7|  nL|dCkr| j||dd  | j jd7|  n tjdD|rn| jjdE|  d S )FNr   ZServiceTypeZServiceZFSDevicezType=%s is a KDE extensionr5   zType=MimeType is deprecatedrj   ZLinkrk   zGValue of key 'Type' must be Application, Link or Directory, but is '%s'z
.directoryz.File extension is .directory, but Type is '%s'z.desktopz>Files with Type=Directory should have the extension .directoryr/   z!Type=Application needs 'Exec' keyr?   zType=Link needs 'URL' keyr   z^Name$z^GenericNamer    r!   )r   z^Commentz^Iconr&   r(   T)r)   r+   r-   r1   r3   rg   r9   z	^KeywordsZlocalestring)r   r)   r;   r=   rA   zKey '%s' is a KDE extensionrC   rF   r   rH   rJ   rL   rN   z^UnmountIconr^   zKey '%s' is deprecatedz	^MiniIconrR   rT   rV   rX   rZ   r\   z^SwallowTitlera   re   r6   rc   z^X-[a-zA-Z0-9-]+zInvalid key: %s)ro   rp   rs   rq   r   Z
checkValuerv   rw   xdgZLocaler6   checkOnlyShowIn	checkTypecheckCategories)r   keyvaluerx   r   r   r   checkKey   s   































zDesktopEntry.checkKeyc             C   s$   | j  |ks | jjd||f  d S )Nz Key '%s' only allowed in Type=%s)r   rs   rp   )r   r   r   r   r   r   r}     s    zDesktopEntry.checkTypec          
   C   s\   | j |}ddddddddd	d
g
}x4|D ],}||kr(|dd dkr(| jjd|  q(W d S )NGNOMEKDEZLXDEZMATEZRazorZROXZTDEZUnityXFCEZOldr      zX-z)'%s' is not a registered OnlyShowIn value)getListrs   rp   )r   r   valuesZvaliditemr   r   r   r|     s    

zDesktopEntry.checkOnlyShowInc          ~      s  | j |}ddddddddd	d
dddg t fdd|D  rL| jjd dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddg~}|  }x6|D ].}||kor|jd r| jjd|  qZW d S )NZ
AudioVideoZAudioZVideoZDevelopmentZ	EducationZGameZGraphicsZNetworkZOfficeZScienceZSettingsZSystemZUtilityc             3   s   | ]}| kV  qd S )Nr   ).0r   )mainr   r   	<genexpr>  s    z/DesktopEntry.checkCategories.<locals>.<genexpr>zMissing main categoryZBuildingZDebuggerZIDEZGUIDesignerZ	ProfilingZRevisionControlZTranslationZCalendarZContactManagementZDatabaseZ
DictionaryZChartZEmailZFinanceZ	FlowChartZPDAZProjectManagementZPresentationZSpreadsheetZWordProcessorZ
2DGraphicsZVectorGraphicsZRasterGraphicsZ
3DGraphicsZScanningZOCRZPhotographyZ
PublishingZViewerZ	TextToolsZDesktopSettingsZHardwareSettingsZPrintingZPackageManagerZDialupZInstantMessagingZChatZ	IRCClientZFeedZFileTransferZHamRadioZNewsZP2PZRemoteAccessZ	TelephonyZTelephonyToolsZVideoConferenceZ
WebBrowserZWebDevelopmentZMidiZMixerZ	SequencerZTunerZTVZAudioVideoEditingZPlayerZRecorderZDiscBurningZ
ActionGameZAdventureGameZ
ArcadeGameZ	BoardGameZ
BlocksGameZCardGameZKidsGameZ	LogicGameZRolePlayingZShooterZ
SimulationZ
SportsGameZStrategyGameZArtZConstructionZMusicZ	LanguagesZArtificialIntelligenceZ	AstronomyZBiologyZ	ChemistryZComputerScienceZDataVisualizationZEconomyZElectricityZ	GeographyZGeologyZ
GeoscienceZHistoryZ
HumanitiesZImageProcessingZ
LiteratureZMapsZMathZNumericalAnalysisZMedicalSoftwareZPhysicsZRoboticsZSpiritualityZSportsZParallelComputingZ	AmusementZ	ArchivingZCompressionZElectronicsZEmulatorZEngineeringZ	FileToolsZFileManagerZTerminalEmulatorZ
FilesystemZMonitorZSecurityZAccessibilityZ
CalculatorZClockZ
TextEditorZDocumentationZAdultZCorer   r   r   ZGTKZQtZMotifZJavaZConsoleOnlyzX-z!'%s' is not a registered Category)r   anyrs   rp   
startswith)r   r   r   Z
additionalZallcategoriesr   r   )r   r   r~     s    
 
zDesktopEntry.checkCategoriesc             C   s   t jdt | j|S )z`Deprecated alias for checkCategories - only exists for backwards
        compatibility.
        z1checkCategorie is deprecated, use checkCategories)ro   warnDeprecationWarningr~   )r   r   r   r   r   checkCategorie  s    zDesktopEntry.checkCategorie)N);__name__
__module____qualname____doc__rm   r   r   r   r   r   r   r   r   r"   r$   r%   r'   r*   r,   r.   r0   r2   r4   r7   r8   r:   r<   r>   r@   rB   rD   rE   rG   rI   rK   rM   rO   rP   rQ   rS   rU   rW   rY   r[   r]   r_   r`   rb   rd   rf   rh   r   ru   ry   r   r}   r|   r~   r   r   r   r   r   r      sr   
 =r   )r   Zxdg.IniFiler   r   Z
xdg.Localer{   Zxdg.Exceptionsr   os.pathr   rv   ro   r   r   r   r   r   <module>   s   