
    b_6D                     n    d Z ddlmZmZ ddlZddlmZ ddlm	Z	 ddl
ZddlZddlZ G d de          ZdS )a/  
Complete implementation of the XDG Desktop Entry Specification
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)ParsingError)whichc                   b   e Zd ZdZdZd;dZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d  Z!d! Z"d" Z#d# Z$d$ Z%d% Z&d& Z'd' Z(d( Z)d) Z*d* Z+d+ Z,d, Z-d- Z.d. Z/d/ Z0d0 Z1d1 Z2d2 Z3d3 Z4d4 Z5d5 Z6d6 Z7d7 Z8d8 Z9d9 Z:d: Z;dS )<DesktopEntryz+Class to parse and validate Desktop EntriesDesktop EntryNc                     t                      | _        |r6t          j                            |          r|                     |           dS |r|                     |           dS 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filenames     0lib/python3.11/site-packages/xdg/DesktopEntry.py__init__zDesktopEntry.__init__   sn     vv 	x00 	JJx      	HHX	 	    c                 *    |                                  S N)getNamer   s    r   __str__zDesktopEntry.__str__&   s    ||~~r   c                 6    t          j        | |ddg           dS )zParse a desktop entry file.
        
        This can raise :class:`~xdg.Exceptions.ParsingError`,
        :class:`~xdg.Exceptions.DuplicateGroupError` or
        :class:`~xdg.Exceptions.DuplicateKeyError`.
        r	   KDE Desktop EntryN)r   r   )r   files     r   r   zDesktopEntry.parse)   s$     	dD?4G"HIIIIIr   c                 N    |                      dd          }t          |          S )zLooks in the PATH for the executable given in the TryExec field.
        
        Returns the full path to the executable if it is found, None if not.
        Raises :class:`~xdg.Exceptions.NoKeyError` if TryExec is not present.
        TryExecT)strict)getr   )r   tryexecs     r   findTryExeczDesktopEntry.findTryExec2   s%     ((9T(22W~~r   c                 ,    |                      d          S )NTyper"   r   s    r   getTypezDesktopEntry.getType<       xxr   c                 0    |                      dd          S )z)deprecated, use getVersionString instead Versionnumerictyper'   r   s    r   
getVersionzDesktopEntry.getVersion>   s    xx		x222r   c                 ,    |                      d          S )Nr+   r'   r   s    r   getVersionStringzDesktopEntry.getVersionStringA       xx	"""r   c                 0    |                      dd          S )NNameTlocaler'   r   s    r   r   zDesktopEntry.getNameC       xxtx,,,r   c                 0    |                      dd          S )NGenericNameTr5   r'   r   s    r   getGenericNamezDesktopEntry.getGenericNameE       xxdx333r   c                 0    |                      dd          S )N	NoDisplaybooleanr-   r'   r   s    r   getNoDisplayzDesktopEntry.getNoDisplayG   s    xx)x444r   c                 0    |                      dd          S )NCommentTr5   r'   r   s    r   
getCommentzDesktopEntry.getCommentI   s    xx	$x///r   c                 0    |                      dd          S )NIconTr5   r'   r   s    r   getIconzDesktopEntry.getIconK   r7   r   c                 0    |                      dd          S )NHiddenr>   r-   r'   r   s    r   	getHiddenzDesktopEntry.getHiddenM   s    xxyx111r   c                 0    |                      dd          S )N
OnlyShowInTlistr'   r   s    r   getOnlyShowInzDesktopEntry.getOnlyShowInO       xx4x000r   c                 0    |                      dd          S )N	NotShowInTrK   r'   r   s    r   getNotShowInzDesktopEntry.getNotShowInQ       xx$x///r   c                 ,    |                      d          S )Nr    r'   r   s    r   
getTryExeczDesktopEntry.getTryExecS   r2   r   c                 ,    |                      d          S )NExecr'   r   s    r   getExeczDesktopEntry.getExecU   r)   r   c                 ,    |                      d          S )NPathr'   r   s    r   getPathzDesktopEntry.getPathW   r)   r   c                 0    |                      dd          S )NTerminalr>   r-   r'   r   s    r   getTerminalzDesktopEntry.getTerminalY       xx
x333r   c                 2    |                      ddd          S )z%deprecated, use getMimeTypes instead MimeTypeTregex)rL   r.   r'   r   s    r   getMimeTypezDesktopEntry.getMimeType[   s    xx
Gx<<<r   c                 0    |                      dd          S )Nr`   TrK   r'   r   s    r   getMimeTypeszDesktopEntry.getMimeTypes^   s    xx
x...r   c                 0    |                      dd          S )N
CategoriesTrK   r'   r   s    r   getCategorieszDesktopEntry.getCategories`   rN   r   c                 0    |                      dd          S )NStartupNotifyr>   r-   r'   r   s    r   getStartupNotifyzDesktopEntry.getStartupNotifyb   s    xxix888r   c                 ,    |                      d          S )NStartupWMClassr'   r   s    r   getStartupWMClasszDesktopEntry.getStartupWMClassd   s    xx()))r   c                 ,    |                      d          S )NURLr'   r   s    r   getURLzDesktopEntry.getURLf       xxr   c                 0    |                      dd          S )NServiceTypesTrK   r'   r   s    r   getServiceTypeszDesktopEntry.getServiceTypesk   s    xxTx222r   c                 ,    |                      d          S )NDocPathr'   r   s    r   
getDocPathzDesktopEntry.getDocPathm   r2   r   c                 2    |                      ddd          S )NKeywordsT)rL   r6   r'   r   s    r   getKeywordszDesktopEntry.getKeywordso   s    xx
dx;;;r   c                 ,    |                      d          S )NInitialPreferencer'   r   s    r   getInitialPreferencez!DesktopEntry.getInitialPreferenceq   s    xx+,,,r   c                 ,    |                      d          S )NDevr'   r   s    r   getDevzDesktopEntry.getDevs   rq   r   c                 ,    |                      d          S )NFSTyper'   r   s    r   	getFSTypezDesktopEntry.getFSTypeu   s    xx!!!r   c                 ,    |                      d          S )N
MountPointr'   r   s    r   getMountPointzDesktopEntry.getMountPointw       xx%%%r   c                 0    |                      dd          S )NReadOnlyr>   r-   r'   r   s    r   getReadonlyzDesktopEntry.getReadonlyy   r^   r   c                 0    |                      dd          S )NUnmountIconTr5   r'   r   s    r   getUnmountIconzDesktopEntry.getUnmountIcon{   r;   r   c                 0    |                      dd          S )NMiniIconTr5   r'   r   s    r   getMiniIconzDesktopEntry.getMiniIcon   s    xx
4x000r   c                 ,    |                      d          S )NTerminalOptionsr'   r   s    r   getTerminalOptionszDesktopEntry.getTerminalOptions   s    xx)***r   c                 ,    |                      d          S )N
DefaultAppr'   r   s    r   getDefaultAppzDesktopEntry.getDefaultApp   r   r   c                 0    |                      dd          S )N	ProtocolsTrK   r'   r   s    r   getProtocolszDesktopEntry.getProtocols   rR   r   c                 0    |                      dd          S )N
ExtensionsTrK   r'   r   s    r   getExtensionszDesktopEntry.getExtensions   rN   r   c                 ,    |                      d          S )NBinaryPatternr'   r   s    r   getBinaryPatternzDesktopEntry.getBinaryPattern   s    xx(((r   c                 ,    |                      d          S )N	MapNotifyr'   r   s    r   getMapNotifyzDesktopEntry.getMapNotify   s    xx$$$r   c                 ,    |                      d          S )NEncodingr'   r   s    r   getEncodingzDesktopEntry.getEncoding   s    xx
###r   c                 0    |                      dd          S )NSwallowTitleTr5   r'   r   s    r   getSwallowTitlezDesktopEntry.getSwallowTitle   s    xxtx444r   c                 ,    |                      d          S )NSwallowExecr'   r   s    r   getSwallowExeczDesktopEntry.getSwallowExec   s    xx&&&r   c                 0    |                      dd          S )N	SortOrderTrK   r'   r   s    r   getSortOrderzDesktopEntry.getSortOrder   rR   r   c                 0    |                      dd          S )NFilePatternra   r-   r'   r   s    r   getFilePatternzDesktopEntry.getFilePattern   s    xxGx444r   c                 0    |                      dd          S )NActionsTrK   r'   r   s    r   
getActionszDesktopEntry.getActions   s    xx	x---r   c                 j   t           j                            |          d         dk    rd}n<t           j                            |          d         dk    rd}nt          d|          t	                      | _        |                     | j                   |                     d|           || _	        dS )	a$  Make this instance into a new, blank desktop entry.
        
        If filename has a .desktop extension, Type is set to Application. If it
        has a .directory extension, Type is Directory. Other extensions will
        cause :class:`~xdg.Exceptions.ParsingError` to be raised.
           .desktopApplication
.directory	DirectoryzUnknown extensionr&   N)
r   r   splitextr   r   r   addGroupdefaultGroupsetr   )r   r   r.   s      r   r   zDesktopEntry.new   s     7H%%a(J66 DDWh''*l::DD2H===vvd'((( r   c                     | j         dk    r| j                            d           | j        dk    r| j                            d           n0| j        dk    r%| j        dk    r| j                            d           	 | j        | j                  d         | _        n*# t          $ r | j                            d	           Y nw xY w	 | j        | j                  d
         | _        d S # t          $ r | j                            d           Y d S w xY w)Nr   z([KDE Desktop Entry]-Header is deprecatedz.kdelnkz$File extension .kdelnk is deprecatedr   r   zUnknown File extensionr&   zKey 'Type' is missingr4   zKey 'Name' is missing)	r   warningsappendfileExtensionr   r.   KeyErrorerrorsnamer   s    r   checkExtraszDesktopEntry.checkExtras   s3    333M  !KLLL **M  !GHHHH:--$2D2T2TM  !9:::	8T%67?DII 	8 	8 	8K677777	8	8T%67?DIII 	8 	8 	8K6777777	8s$   =B $CCC% %$DDc                 D   || j         k    sXt          j        d|          sCt          j        d|          rt          |          s| j                            d|z             d S d| j        |         v r+d| j        |         v r| j                            d           d S d S d S )Nz^Desktop Action [a-zA-Z0-9-]+$z^X-zInvalid Group name: %srJ   rP   z;Group may either have OnlyShowIn or NotShowIn, but not both)r   rematchr   r   r   r   )r   groups     r   
checkGroupzDesktopEntry.checkGroup   s    ***84e<< +HUE"" +'/ + K7%?@@@@@ U 333+V[I\:\:\""#`aaaaa 43:\:\r   c                    |dk    r>|dk    s|dk    s|dk    r| j                             d|z             nP|dk    r| j                             d           n/|dk    s)|d	k    s#|d
k    s| j                            d|z             | j        dk    r$|d
k    s| j                             d|z             n+| j        dk    r |d
k    r| j                             d           |dk    r)d| j        |         vr| j                             d           |d	k    r+d| j        |         vr| j                             d           d S d S d S |dk    r|                     ||           d S t          j        dt          j	        j
        z   dz   |          rd S t          j        dt          j	        j
        z   dz   |          rd S |dk    r|                     ||d           d S t          j        dt          j	        j
        z   dz   |          rd S t          j        dt          j	        j
        z   dz   |          r|                     ||           d S |dk    r|                     ||d           d S |dk    r/|                     ||d            |                     |           d S |d!k    r/|                     ||d            |                     |           d S |d"k    r.|                     ||           |                     |d           d S |dk    r.|                     ||           |                     |d           d S |d#k    r.|                     ||           |                     |d           d S |d$k    r0|                     ||d           |                     |d           d S |d%k    r0|                     ||d            |                     |d           d S |dk    r0|                     ||d            |                     |d           d S |d&k    rC|                     ||           |                     |d           |                     |           d S t          j        d't          j	        j
        z   dz   |          r1|                     ||d(d)           |                     |d           d S |d*k    r0|                     ||d           |                     |d           d S |d+k    r|                     |d           d S |dk    r.|                     ||           |                     |d           d S |d,k    r7|                     ||d            | j                             d-|z             d S |d.k    r5|                     ||           | j                             d-|z             d S |d/k    r7|                     ||d0           | j                             d-|z             d S |d1k    rK|                     ||           |                     |d           | j                             d-|z             d S |d2k    rK|                     ||           |                     |d           | j                             d-|z             d S |d3k    rK|                     ||           |                     |d           | j                             d-|z             d S |d4k    rM|                     ||d           |                     |d           | j                             d-|z             d S t          j        d5t          j	        j
        z   dz   |          rK|                     ||           |                     |d           | j                             d-|z             d S |d6k    r5|                     ||           | j                             d7|z             d S t          j        d8t          j	        j
        z   dz   |          r5|                     ||           | j                             d7|z             d S |d9k    r5|                     ||           | j                             d7|z             d S |d:k    r5|                     ||           | j                             d7|z             d S |d;k    r7|                     ||d            | j                             d7|z             d S |d<k    r7|                     ||d            | j                             d7|z             d S |d=k    r5|                     ||           | j                             d7|z             d S |d>k    r5|                     ||           | j                             d7|z             d S t          j        d?t          j	        j
        z   dz   |          r| j                             d7|z             d S |d@k    r5|                     ||           | j                             d7|z             d S |dAk    r8|                     ||dBd)           | j                             d7|z             d S |dCk    r7|                     ||d            | j                             d7|z             d S t          j        dD|          rd S | j                            dE|z             d S )FNr&   ServiceTypeServiceFSDevicezType=%s is a KDE extensionr`   zType=MimeType is deprecatedr   Linkr   zGValue of key 'Type' must be Application, Link or Directory, but is '%s'r   z.File extension is .directory, but Type is '%s'r   z>Files with Type=Directory should have the extension .directoryrV   z!Type=Application needs 'Exec' keyro   zType=Link needs 'URL' keyr+   z^Name$z^GenericNamer=   r>   r-   z^Commentz^IconrG   rJ   TrK   rP   r    rY   r\   r   rf   z	^Keywordslocalestring)r.   rL   ri   rl   rs   zKey '%s' is a KDE extensionrv   r|   r,   r   r   r   r   z^UnmountIconr   zKey '%s' is deprecatedz	^MiniIconr   r   r   r   r   r   z^SwallowTitler   r   ra   r   z^X-[a-zA-Z0-9-]+zInvalid key: %s)r   r   r   r   r   
checkValuer   r   xdgLocalera   checkOnlyShowIn	checkTypecheckCategories)r   keyvaluer   s       r   checkKeyzDesktopEntry.checkKey   s   &==%%)););u
?R?R$$%AC%GHHHH*$$$$%BCCCC},,5KCWCW""#lot#tuuu!\11%;:N:N$$%UX]%]^^^^#z11e{6J6J$$%efff%%e!444M(()LMMMU 333M(()DEEEEE 33 IOOC'''''Xgcj..s2C88 a	8DXnSZ%55c93?? ^	8DKOOCYO77777Xj!11#5s;; X	8DXgcj..s2C88 U	8OOC'''''H__OOCYO77777L  OOCTO222  '''''KOOCTO222  '''''IOOC'''NN3.....F]]OOC'''NN3.....F]]OOC'''NN3.....JOOCYO777NN3.....IOOCTO222NN3.....JOOCTO222NN3.....L  OOC'''NN3...  '''''Xk#*"2236<< j	8OOC^$OGGGNN3.....O##OOCYO777NN3.....$$$NN3.....E\\OOC'''NN3&&&&& N""OOCTO222M  !>!DEEEEEIOOC'''M  !>!DEEEEE'''OOCYO777M  !>!DEEEEEE\\OOC'''NN3
+++M  !>!DEEEEEH__OOC'''NN3
+++M  !>!DEEEEEL  OOC'''NN3
+++M  !>!DEEEEEJOOCYO777NN3
+++M  !>!DEEEEEXnSZ%55c93?? :	8OOC'''NN3
+++M  !>!DEEEEE JOOC'''M  !9C!?@@@@@Xk#*"2236<< 0	8OOC'''M  !9C!?@@@@@%%%OOC'''M  !9C!?@@@@@L  OOC'''M  !9C!?@@@@@KOOCTO222M  !9C!?@@@@@L  OOCTO222M  !9C!?@@@@@O##OOC'''M  !9C!?@@@@@KOOC'''M  !9C!?@@@@@Xocj&66s:C@@ 	8M  !9C!?@@@@@M!!OOC'''M  !9C!?@@@@@M!!OOCW4O@@@M  !9C!?@@@@@KOOCTO222M  !9C!?@@@@@ X(#.. 	8D K03677777r   c                 z    |                                  |k    s"| j                            d|d|           d S d S )NzKey 'z' only allowed in Type=)r(   r   r   )r   r   r.   s      r   r   zDesktopEntry.checkType  sG    ||~~%%KSSS$$OPPPPP &%r   c                     |                      |          }g d}|D ]1}||vr+|dd         dk    r| j                            d|z             2d S )N)
GNOMEKDELXDEMATERazorROXTDEUnityXFCEOldr      X-z)'%s' is not a registered OnlyShowIn value)getListr   r   )r   r   valuesvaliditems        r   r   zDesktopEntry.checkOnlyShowIn  s|    e$$      	X 	XD5  T!A#Y$%6%6""#NQU#UVVV	X 	Xr   c                 ,   |                      |          }g dt          fd|D                       s| j                            d           g d}|z   }|D ]8}||vr2|                    d          s| j                            d|z             9d S )N)
AudioVideoAudioVideoDevelopment	EducationGameGraphicsNetworkOfficeScienceSettingsSystemUtilityc              3       K   | ]}|v V  	d S r    ).0r   mains     r   	<genexpr>z/DesktopEntry.checkCategories.<locals>.<genexpr>  s'      33D44<333333r   zMissing main category)~BuildingDebuggerIDEGUIDesigner	ProfilingRevisionControlTranslationCalendarContactManagementDatabase
DictionaryChartEmailFinance	FlowChartPDAProjectManagementPresentationSpreadsheetWordProcessor
2DGraphicsVectorGraphicsRasterGraphics
3DGraphicsScanningOCRPhotography
PublishingViewer	TextToolsDesktopSettingsHardwareSettingsPrintingPackageManagerDialupInstantMessagingChat	IRCClientFeedFileTransferHamRadioNewsP2PRemoteAccess	TelephonyTelephonyToolsVideoConference
WebBrowserWebDevelopmentMidiMixer	SequencerTunerTVAudioVideoEditingPlayerRecorderDiscBurning
ActionGameAdventureGame
ArcadeGame	BoardGame
BlocksGameCardGameKidsGame	LogicGameRolePlayingShooter
Simulation
SportsGameStrategyGameArtConstructionMusic	LanguagesArtificialIntelligence	AstronomyBiology	ChemistryComputerScienceDataVisualizationEconomyElectricity	GeographyGeology
GeoscienceHistory
HumanitiesImageProcessing
LiteratureMapsMathNumericalAnalysisMedicalSoftwarePhysicsRoboticsSpiritualitySportsParallelComputing	Amusement	ArchivingCompressionElectronicsEmulatorEngineering	FileToolsFileManagerTerminalEmulator
FilesystemMonitorSecurityAccessibility
CalculatorClock
TextEditorDocumentationAdultCorer   r   r   GTKQtMotifJavaConsoleOnlyr   z!'%s' is not a registered Category)r   anyr   r   
startswith)r   r   r   
additionalallcategoriesr   r   s         @r   r   zDesktopEntry.checkCategories  s    e$$ a  a  a3333F33333 	8K6777 c  c  c
"T) 	P 	PD=((1F1F(""#F#MNNN	P 	Pr   c                 `    t          j        dt                     |                     |          S )z`Deprecated alias for checkCategories - only exists for backwards
        compatibility.
        z1checkCategorie is deprecated, use checkCategories)r   warnDeprecationWarningr   )r   r   s     r   checkCategoriezDesktopEntry.checkCategorie  s5     	I<N	P 	P 	P##E***r   r   )<__name__
__module____qualname____doc__r   r   r   r   r$   r(   r/   r1   r   r:   r?   rB   rE   rH   rM   rQ   rT   rW   rZ   r]   rb   rd   rg   rj   rm   rp   rt   rw   rz   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   r      sp       11"L
 
 
 
  J J J       3 3 3# # #- - -4 4 45 5 50 0 0- - -2 2 21 1 10 0 0# # #          4 4 4= = =/ / /1 1 19 9 9* * *  
3 3 3# # #< < <- - -  " " "& & &4 4 44 4 4
1 1 1+ + +& & &0 0 01 1 1) ) )% % %$ $ $5 5 5' ' '0 0 05 5 5. . .
! ! !*8 8 8.	b 	b 	bz8 z8 z8xQ Q QX X XP P P+ + + + +r   r   )r  xdg.IniFiler   r   
xdg.Localer   xdg.Exceptionsr   xdg.utilr   os.pathr   r   r   r   r   r   r   <module>r     s   
 
 * ) ) ) ) ) ) )     ' ' ' ' ' '        				 [+ [+ [+ [+ [+7 [+ [+ [+ [+ [+r   