summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/kservice.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/kservice.h')
-rw-r--r--tdeio/tdeio/kservice.h562
1 files changed, 562 insertions, 0 deletions
diff --git a/tdeio/tdeio/kservice.h b/tdeio/tdeio/kservice.h
new file mode 100644
index 000000000..4db478ba6
--- /dev/null
+++ b/tdeio/tdeio/kservice.h
@@ -0,0 +1,562 @@
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __kservices_h__
+#define __kservices_h__
+
+#include <tqstringlist.h>
+#include <tqmap.h>
+#include <tqvariant.h>
+#include <kicontheme.h>
+
+#include "tdesycocaentry.h"
+
+class TQDataStream;
+class KDesktopFile;
+class KService;
+class KBuildSycoca;
+class TQWidget;
+
+/**
+ * Represent a service, i.e. an application bound to one or several mimetypes
+ * (or servicetypes) as written in its desktop entry file.
+ *
+ * A service may be a library, too.
+ * The starting point you need is often the static methods.
+ * Service types are stored as desktop files in the "service" resource..
+ *
+ * @see KServiceType
+ * @see KServiceGroup
+ * @author Torben Weis <weis@kde.org>
+ */
+class TDEIO_EXPORT KService : public KSycocaEntry
+{
+ K_SYCOCATYPE( KST_KService, KSycocaEntry )
+
+ friend class KBuildSycoca;
+
+public:
+ typedef KSharedPtr<KService> Ptr;
+ typedef TQValueList<Ptr> List;
+public:
+ /**
+ * Construct a temporary service with a given name, exec-line and icon.
+ * @param _name the name of the service
+ * @param _exec the executable
+ * @param _icon the name of the icon
+ */
+ KService( const TQString & _name, const TQString &_exec, const TQString &_icon);
+
+ /**
+ * Construct a service and take all information from a config file.
+ *
+ * @param _fullpath Full path to the config file.
+ */
+ explicit KService( const TQString & _fullpath );
+
+ /**
+ * Construct a service and take all information from a desktop file.
+ * @param config the desktop file to read
+ */
+ KService( KDesktopFile *config ); // KDE-4.0: make explicit
+
+ /**
+ * @internal
+ * Construct a service from a stream.
+ * The stream must already be positionned at the correct offset.
+ */
+ KService( TQDataStream& _str, int offset );
+
+ virtual ~KService();
+
+ /**
+ * Returns the type of the service.
+ * @return the type of the service ("Application" or "Service")
+ */
+ virtual TQString type() const { return m_strType; }
+ /**
+ * Returns the name of the service.
+ * @return the name of the service,
+ * or TQString::null if not set
+ */
+ virtual TQString name() const { return m_strName; }
+ /**
+ * Returns the executable.
+ * @return the command that the service executes,
+ * or TQString::null if not set
+ */
+ TQString exec() const { return m_strExec; }
+ /**
+ * Returns the name of the service's library.
+ * @return the name of the library that contains the services
+ * implementation,
+ * or TQString::null if not set
+ */
+ TQString library() const { return m_strLibrary; }
+ /**
+ * Returns the name of the init function to call (KControl modules).
+ * @return the name of the init function to call in this service
+ * during startup of KDE. (KControl modules only),
+ * or TQString::null if not set
+ */
+ TQString init() const { return m_strInit; }
+
+ /**
+ * Returns the name of the icon.
+ * @return the icon associated with the service,
+ * or "unknown" if not set
+ */
+ TQString icon() const { return m_strIcon; }
+ /**
+ * Returns the pixmap that represents the icon.
+ * @return a pixmap for this service (finds and loads icon()),
+ * null if not set
+ * @see icon()
+ */
+ TQPixmap pixmap( KIcon::Group _group, int _force_size = 0, int _state = 0,
+ TQString * _path = 0L ) const;
+ /**
+ * Checks whethe the service should be run in a terminal.
+ * @return true if the service is to be run in a terminal.
+ */
+ bool terminal() const { return m_bTerminal; }
+ /**
+ * Returns any options associated with the terminal the service
+ * runs in, if it requires a terminal.
+ *
+ * The service must be a tty-oriented program.
+ * @return the terminal options,
+ * or TQString::null if not set
+ */
+ TQString terminalOptions() const { return m_strTerminalOptions; }
+ /**
+ * Checks whether the service runs with a different user id.
+ * @return true if the service has to be run under a different uid.
+ * @see username()
+ */
+ bool substituteUid() const;
+ /**
+ * Returns the user name, if the service runs with a
+ * different user id.
+ * @return the username under which the service has to be run,
+ * or TQString::null if not set
+ * @see substututeUid()a
+ */
+ TQString username() const;
+
+ /**
+ * Returns the path to the location where the service desktop entry
+ * is stored.
+ *
+ * This is a relative path if the desktop entry was found in any
+ * of the locations pointed to by $TDEDIRS (e.g. "Internet/kppp.desktop")
+ * It is a full path if the desktop entry originates from another
+ * location.
+ * @return the path of the service's desktop file,
+ * or TQString::null if not set
+ */
+ TQString desktopEntryPath() const { return entryPath(); }
+
+ /**
+ * Returns the filename of the service desktop entry without any
+ * extension. E.g. "kppp"
+ * @return the name of the desktop entry without path or extension,
+ * or TQString::null if not set
+ */
+ TQString desktopEntryName() const { return m_strDesktopEntryName; }
+
+ /**
+ * Returns the menu ID of the service desktop entry.
+ * The menu ID is used to add or remove the entry to a menu.
+ * @return the menu ID
+ * @since 3.2
+ */
+ TQString menuId() const;
+
+ /**
+ * Returns a normalized ID suitable for storing in configuration files.
+ * It will be based on the menu-id when available and otherwise falls
+ * back to desktopEntryPath()
+ * @return the storage ID
+ * @since 3.2
+ */
+ TQString storageId() const;
+
+ /**
+ * Describes the DCOP type of the service.
+ * @li None - This service has no DCOP support
+ * @li Unique - This service provides a unique DCOP service.
+ * The service name is equal to the desktopEntryName.
+ * @li Multi - This service provides a DCOP service which can be run
+ * with multiple instances in parallel. The service name of
+ * an instance is equal to the desktopEntryName + "-" +
+ * the PID of the process.
+ * @li Wait - This service has no DCOP support, the launcher will wait
+ * till it is finished.
+ */
+ enum DCOPServiceType_t { DCOP_None = 0, DCOP_Unique, DCOP_Multi, DCOP_Wait };
+
+ /**
+ * Returns the DCOPServiceType supported by this service.
+ * @return the DCOPServiceType supported by this service
+ */
+ DCOPServiceType_t DCOPServiceType() const { return m_DCOPServiceType; }
+
+ /**
+ * Returns the working directory to run the program in.
+ * @return the working directory to run the program in,
+ * or TQString::null if not set
+ */
+ TQString path() const { return m_strPath; }
+
+ /**
+ * Returns the descriptive comment for the service, if there is one.
+ * @return the descriptive comment for the service, or TQString::null
+ * if not set
+ */
+ TQString comment() const { return m_strComment; }
+
+ /**
+ * Returns the generic name for the service, if there is one
+ * (e.g. "Mail Client").
+ * @return the generic name,
+ * or TQString::null if not set
+ */
+ TQString genericName() const { return m_strGenName; }
+
+ /**
+ * Returns the untranslated (US English) generic name
+ * for the service, if there is one
+ * (e.g. "Mail Client").
+ * @return the generic name,
+ * or TQString::null if not set
+ * @since 3.2
+ */
+ TQString untranslatedGenericName() const;
+
+ /**
+ * Returns a list of descriptive keywords the service, if there are any.
+ * @return the list of keywords
+ */
+ TQStringList keywords() const { return m_lstKeywords; }
+
+ /**
+ * Returns a list of VFolder categories.
+ * @return the list of VFolder categories
+ * @since 3.1
+ */
+ TQStringList categories() const;
+
+ /**
+ * Returns the service types that this service supports.
+ * @return the list of service types that are supported
+ */
+ TQStringList serviceTypes() const { return m_lstServiceTypes; }
+
+ /**
+ * Checks whether the service supports this service type
+ * @param _service The name of the service type you are
+ * interested in determining whether this services supports.
+ *
+ * @return true if the service you specified is supported,
+ * otherwise false.
+ */
+ bool hasServiceType( const TQString& _service ) const;
+
+ /**
+ * Set to true if it is allowed to use this service as the default (main)
+ * action for the files it supports (e.g. Left Click in a file manager, or KRun in general).
+ *
+ * If not, then this service is only available in RMB popups, so it must
+ * be selected explicitely by the user in order to be used.
+ * Note that servicemenus supersede this functionality though, at least in konqueror.
+ *
+ * @return true if the service may be used as the default (main) handler
+ */
+ bool allowAsDefault() const { return m_bAllowAsDefault; }
+
+ /**
+ * Checks whether this service can handle several files as
+ * startup arguments.
+ * @return true if multiple files may be passed to this service at
+ * startup. False if only one file at a time may be passed.
+ */
+ bool allowMultipleFiles() const;
+
+ /**
+ * What preference to associate with this service initially (before
+ * the user has had any chance to define a profile for it).
+ * The bigger the value, the most preferred the service is.
+ * @return the service preference level of the service
+ */
+ int initialPreference() const { return m_initialPreference; }
+
+ /**
+ * What preference to associate with this service initially
+ * for handling the specified mimetype. (before the user has
+ * had any chance to define a profile for it).
+ * The bigger the value, the most preferred the service is.
+ * @return the service preference level of the service for
+ * this mimetype
+ */
+ int initialPreferenceForMimeType( const TQString& mimeType ) const;
+
+ /**
+ * @internal. Allows KServiceType::offers to tweak the initial preference.
+ */
+ void setInitialPreference( int i ) { m_initialPreference = i; }
+
+ /**
+ * Whether the entry should be suppressed in menus.
+ * @return true to suppress this service
+ */
+ bool noDisplay() const;
+ /**
+ * check if the application entry is important
+ */
+ bool SuSEunimportant() const;
+
+ /**
+ * Name of the application this service belongs to.
+ * (Useful for e.g. plugins)
+ * @return the parent application, or TQString::null if not set
+ * @since 3.1
+ */
+ TQString parentApp() const;
+
+ /**
+ * Returns the requested property. Some often used properties
+ * have convenience access functions like exec(),
+ * serviceTypes etc.
+ *
+ * It depends upon the serviceTypes() of this service which
+ * properties a service can have.
+ *
+ * @param _name the name of the property
+ * @return the property, or invalid if not found
+ * @see KServiceType
+ */
+ virtual TQVariant property( const TQString& _name ) const;
+
+ /**
+ * Returns the requested property.
+ *
+ * @param _name the name of the property
+ * @param t the assumed type of the property
+ * @return the property, or invalid if not found
+ * @see KServiceType
+ * @since 3.2
+ */
+ TQVariant property( const TQString& _name, TQVariant::Type t ) const;
+
+ /**
+ * Returns the list of all properties that this service can have.
+ * That means, that some of these properties may be empty.
+ * @return the list of supported properties
+ */
+ virtual TQStringList propertyNames() const;
+
+ /**
+ * Checks whether the service is valid.
+ * @return true if the service is valid (e.g. name is not empty)
+ */
+ bool isValid() const { return m_bValid; }
+
+ /**
+ * Returns a path that can be used for saving changes to this
+ * service
+ * @return path that can be used for saving changes to this service
+ * @since 3.2
+ */
+ TQString locateLocal();
+
+ /**
+ * @internal
+ * Load the service from a stream.
+ */
+ virtual void load( TQDataStream& );
+ /**
+ * @internal
+ * Save the service to a stream.
+ */
+ virtual void save( TQDataStream& );
+ /**
+ * @internal
+ * Set the menu id
+ */
+ void setMenuId(const TQString &menuId);
+ /**
+ * @internal
+ * Sets whether to use a terminal or not
+ */
+ void setTerminal(bool b) { m_bTerminal = b; }
+ /**
+ * @internal
+ * Sets the terminal options to use
+ */
+ void setTerminalOptions(const TQString &options) { m_strTerminalOptions = options; }
+
+ /**
+ * Find a service by name, i.e. the translated Name field. You should
+ * really not use this method, since the name is translated.
+ *
+ * @param _name the name to search
+ * @return a pointer to the requested service or 0 if the service is
+ * unknown.
+ * @em Very @em important: Don't store the result in a KService* !
+ */
+ static Ptr serviceByName( const TQString& _name );
+
+ /**
+ * Find a service based on its path as returned by desktopEntryPath().
+ * It's usually better to use serviceByStorageId() instead.
+ *
+ * @param _path the path of the configuration file
+ * @return a pointer to the requested service or 0 if the service is
+ * unknown.
+ * @em Very @em important: Don't store the result in a KService* !
+ */
+ static Ptr serviceByDesktopPath( const TQString& _path );
+
+ /**
+ * Find a service by the name of its desktop file, not depending on
+ * its actual location (as long as it's under the applnk or service
+ * directories). For instance "konqbrowser" or "kcookiejar". Note that
+ * the ".desktop" extension is implicit.
+ *
+ * This is the recommended method (safe even if the user moves stuff)
+ * but note that it assumes that no two entries have the same filename.
+ *
+ * @param _name the name of the configuration file
+ * @return a pointer to the requested service or 0 if the service is
+ * unknown.
+ * @em Very @em important: Don't store the result in a KService* !
+ */
+ static Ptr serviceByDesktopName( const TQString& _name );
+
+ /**
+ * Find a service by its menu-id
+ *
+ * @param _menuId the menu id of the service
+ * @return a pointer to the requested service or 0 if the service is
+ * unknown.
+ * @em Very @em important: Don't store the result in a KService* !
+ * @since 3.2
+ */
+ static Ptr serviceByMenuId( const TQString& _menuId );
+
+ /**
+ * Find a service by its storage-id or desktop-file path. This
+ * function will try very hard to find a matching service.
+ *
+ * @param _storageId the storage id or desktop-file path of the service
+ * @return a pointer to the requested service or 0 if the service is
+ * unknown.
+ * @em Very @em important: Don't store the result in a KService* !
+ * @since 3.2
+ */
+ static Ptr serviceByStorageId( const TQString& _storageId );
+
+ /**
+ * Returns the whole list of services.
+ *
+ * Useful for being able to
+ * to display them in a list box, for example.
+ * More memory consuming than the ones above, don't use unless
+ * really necessary.
+ * @return the list of all services
+ */
+ static List allServices();
+
+ /**
+ * Returns all services that require initialisation.
+ *
+ * Only needed by "kcminit"
+ * @return the list of all services that need to be initialized
+ */
+ static List allInitServices();
+
+ /**
+ * Returns a path that can be used to create a new KService based
+ * on @p suggestedName.
+ * @param showInMenu true, if the service should be shown in the TDE menu
+ * false, if the service should be hidden from the menu
+ * @param suggestedName name to base the file on, if a service with such
+ * name already exists, a prefix will be added to make it unique.
+ * @param menuId If provided, menuId will be set to the menu id to use for
+ * the KService
+ * @param reservedMenuIds If provided, the path and menu id will be chosen
+ * in such a way that the new menu id does not conflict with any
+ * of the reservedMenuIds
+ * @return The path to use for the new KService.
+ * @since 3.2
+ */
+ static TQString newServicePath(bool showInMenu, const TQString &suggestedName,
+ TQString *menuId = 0,
+ const TQStringList *reservedMenuIds = 0);
+
+
+ /**
+ * Rebuild KSycoca and show a progress dialog while doing so.
+ * @param parent Parent widget for the progress dialog
+ * @since 3.2
+ */
+ static void rebuildKSycoca(TQWidget *parent);
+
+protected:
+
+ void init(KDesktopFile *config);
+
+ TQStringList &accessServiceTypes() { return m_lstServiceTypes; }
+
+
+private:
+ KService( const KService& ); // forbidden
+ KService& operator=(const KService&);
+
+ TQString m_strType;
+ TQString m_strName;
+ TQString m_strExec;
+ TQString m_strIcon;
+ TQString m_strTerminalOptions;
+ TQString m_strPath;
+ TQString m_strComment;
+ TQString m_strLibrary;
+ TQStringList m_lstServiceTypes;
+ bool m_bAllowAsDefault;
+ int m_initialPreference;
+ bool m_bTerminal;
+ //bool m_bSuid;
+ //TQString m_strUsername;
+ TQString m_strDesktopEntryName;
+ //TQString m_docPath;
+ //bool m_bHideFromPanel;
+ DCOPServiceType_t m_DCOPServiceType;
+ TQMap<TQString,TQVariant> m_mapProps;
+ bool m_bValid;
+ TQStringList m_lstKeywords;
+ TQString m_strInit;
+ TQString m_strGenName;
+protected:
+ virtual void virtual_hook( int id, void* data );
+private:
+ class KServicePrivate;
+ KServicePrivate* d;
+};
+#endif