summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/krun.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/krun.h')
-rw-r--r--tdeio/tdeio/krun.h512
1 files changed, 512 insertions, 0 deletions
diff --git a/tdeio/tdeio/krun.h b/tdeio/tdeio/krun.h
new file mode 100644
index 000000000..03186af85
--- /dev/null
+++ b/tdeio/tdeio/krun.h
@@ -0,0 +1,512 @@
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
+ Copyright (C) 2006 David Faure <faure@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 __k_run_h__
+#define __k_run_h__
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <tqobject.h>
+#include <tqtimer.h>
+#include <tqstring.h>
+#include <kurl.h>
+#include <kstartupinfo.h>
+
+class TDEProcess;
+class KService;
+namespace TDEIO {
+ class Job;
+ class StatJob;
+}
+
+/**
+ * To open files with their associated applications in KDE, use KRun.
+ *
+ * It can execute any desktop entry, as well as any file, using
+ * the default application or another application "bound" to the file type
+ * (or URL protocol).
+ *
+ * In that example, the mimetype of the file is not known by the application,
+ * so a KRun instance must be created. It will determine the mimetype by itself.
+ * If the mimetype is known, or if you even know the service (application) to
+ * use for this file, use one of the static methods.
+ *
+ * By default KRun uses auto deletion. It causes the KRun instance to delete
+ * itself when the it finished its task. If you allocate the KRun
+ * object on the stack you must disable auto deletion, otherwise it will crash.
+ *
+ * @short Opens files with their associated applications in KDE
+ */
+class TDEIO_EXPORT KRun : public TQObject
+{
+ Q_OBJECT
+public:
+ /**
+ * Create a KRun object to run the preferred application for a file/URL.
+ * KRun will first determine the type of the file, and will then
+ * run the associated application.
+ *
+ * @param url the URL of the file or directory to 'run'
+ *
+ * @param mode The @p st_mode field of <tt>struct stat</tt>. If
+ * you don't know this set it to 0.
+ *
+ * @param isLocalFile
+ * If this parameter is set to @p false then @p url is
+ * examined to find out whether it is a local URL or
+ * not. This flag is just used to improve speed, since the
+ * function KURL::isLocalFile is a bit slow.
+ *
+ * @param showProgressInfo
+ * Whether to show progress information when determining the
+ * type of the file (i.e. when using TDEIO::stat and TDEIO::mimetype)
+ * Before you set this to false to avoid a dialog box, think about
+ * a very slow FTP server...
+ * It is always better to provide progress info in such cases.
+ */
+ KRun( const KURL& url, mode_t mode = 0,
+ bool isLocalFile = false, bool showProgressInfo = true );
+
+ /**
+ * BIC: Combine with the above ctor for KDE 4.0.
+ * @param window
+ * The top-level widget of the app that invoked this object.
+ * It is used to make sure private information like passwords
+ * are properly handled per application.
+ * @param url the URL of the file or directory to 'run'
+ *
+ * @param mode The @p st_mode field of <tt>struct stat</tt>. If
+ * you don't know this set it to 0.
+ *
+ * @param isLocalFile
+ * If this parameter is set to @p false then @p url is
+ * examined to find out whether it is a local URL or
+ * not. This flag is just used to improve speed, since the
+ * function KURL::isLocalFile is a bit slow.
+ *
+ * @param showProgressInfo
+ * Whether to show progress information when determining the
+ * type of the file (i.e. when using TDEIO::stat and TDEIO::mimetype)
+ * Before you set this to false to avoid a dialog box, think about
+ * a very slow FTP server...
+ * It is always better to provide progress info in such cases.
+ */
+ KRun( const KURL& url, TQWidget* window, mode_t mode = 0,
+ bool isLocalFile = false, bool showProgressInfo = true );
+ KRun( const KURL& url, TQWidget* window, const TQCString& asn, mode_t mode = 0,
+ bool isLocalFile = false, bool showProgressInfo = true );
+
+ /**
+ * Destructor. Don't call it yourself, since a KRun object auto-deletes
+ * itself.
+ */
+ virtual ~KRun();
+
+ /**
+ * Abort this KRun. This kills any jobs launched by it,
+ * and leads to deletion if auto-deletion is on.
+ * This is much safer than deleting the KRun (in case it's
+ * currently showing an error dialog box, for instance)
+ */
+ void abort();
+
+ /**
+ * Returns true if the KRun instance has an error.
+ * @return true when an error occurred
+ * @see error()
+ */
+ bool hasError() const { return m_bFault; }
+
+ /**
+ * Returns true if the KRun instance has finished.
+ * @return true if the KRun instance has finished
+ * @see finished()
+ */
+ bool hasFinished() const { return m_bFinished; }
+
+ /**
+ * Checks whether auto delete is activated.
+ * Auto-deletion causes the KRun instance to delete itself
+ * when it finished its task.
+ * By default auto deletion is on.
+ * @return true if auto deletion is on, false otherwise
+ */
+ bool autoDelete() const { return m_bAutoDelete; }
+
+ /**
+ * Enables or disabled auto deletion.
+ * Auto deletion causes the KRun instance to delete itself
+ * when it finished its task. If you allocate the KRun
+ * object on the stack you must disable auto deletion.
+ * By default auto deletion is on.
+ * @param b true to enable auto deletion, false to disable
+ */
+ void setAutoDelete(bool b) { m_bAutoDelete = b; }
+
+ /**
+ * Set the preferred service for opening this URL, after
+ * its mimetype will have been found by KRun. IMPORTANT: the service is
+ * only used if its configuration says it can handle this mimetype.
+ * This is used for instance for the X-TDE-LastOpenedWith key, for
+ * the recent documents list.
+ * @param desktopEntryName the desktopEntryName of the service, e.g. "kate".
+ */
+ void setPreferredService( const TQString& desktopEntryName );
+
+ /**
+ * Sets whether executables, .desktop files or shell scripts should
+ * be run by KRun. This is enabled by default.
+ * @param b whether to run executable files or not.
+ * @see isExecutable()
+ * @since 3.2
+ */
+ void setRunExecutables(bool b);
+
+ /**
+ * Sets whether the external webbrowser setting should be honoured.
+ * This is enabled by default.
+ * This should only be disabled in webbrowser applications.
+ * @param b whether to enable the external browser or not.
+ * @since 3.4
+ */
+ void setEnableExternalBrowser(bool b);
+
+ /**
+ * Sets the file name to use in the case of downloading the file to a tempfile
+ * in order to give to a non-url-aware application. Some apps rely on the extension
+ * to determine the mimetype of the file. Usually the file name comes from the URL,
+ * but in the case of the HTTP Content-Disposition header, we need to override the
+ * file name.
+ * @since 3.5.3
+ */
+ void setSuggestedFileName( const TQString& fileName );
+
+ /**
+ * Open a list of URLs with a certain service (application).
+ *
+ * @param _service the service to run
+ * @param _urls the list of URLs, can be empty (app launched
+ * without argument)
+ * @param window The top-level widget of the app that invoked this object.
+ * @param tempFiles if true and _urls are local files, they will be deleted
+ * when the application exits.
+ * @return the process id, or 0 on error
+ * @since 3.5.2
+ */
+ static pid_t run( const KService& _service, const KURL::List& _urls, TQWidget* window, bool tempFiles = false );
+ static pid_t run( const KService& _service, const KURL::List& _urls, TQWidget* window,
+ const TQCString& asn, bool tempFiles = false );
+ /**
+ * Open a list of URLs with a certain service (application).
+ *
+ * @param _service the service to run
+ * @param _urls the list of URLs, can be empty (app launched
+ * without argument)
+ * @param tempFiles if true and _urls are local files, they will be deleted
+ * when the application exits.
+ * @return the process id, or 0 on error
+ */
+ // BIC merge second overload with first one, using tempFiles=false
+ static pid_t run( const KService& _service, const KURL::List& _urls, bool tempFiles );
+ static pid_t run( const KService& _service, const KURL::List& _urls );
+ /// @since 3.5.3
+ /// @internal
+ static pid_t run( const KService& _service, const KURL::List& _urls, TQWidget* window, bool tempFiles, const TQString& suggestedFileName );
+ static pid_t run( const KService& _service, const KURL::List& _urls, TQWidget* window,
+ const TQCString& asn, bool tempFiles, const TQString& suggestedFileName );
+
+ /**
+ * Open a list of URLs with.
+ *
+ * @param _exec the name of the executable, for example
+ * "/usr/bin/netscape".
+ * @param _urls the list of URLs to open, can be empty (app launched without argument)
+ * @param _name the logical name of the application, for example
+ * "Netscape 4.06".
+ * @param _icon the icon which should be used by the application.
+ * @param _obsolete1 Do not use!
+ * @param _obsolete2 Do not use!
+ * @return the process id, or 0 on error
+ */
+ static pid_t run( const TQString& _exec, const KURL::List& _urls,
+ const TQString& _name = TQString::null,
+ const TQString& _icon = TQString::null,
+ const TQString& _obsolete1 = TQString::null,
+ const TQString& _obsolete2 = TQString::null );
+
+ /**
+ * Open the given URL.
+ *
+ * This function is used after the mime type
+ * is found out. It will search for all services which can handle
+ * the mime type and call run() afterwards.
+ * @param _url the URL to open
+ * @param _mimetype the mime type of the resource
+ * @param tempFile if true and _url is a local file, it will be deleted
+ * when the launched application exits.
+ * @param runExecutables if false then local .desktop files,
+ * executables and shell scripts will not be run.
+ * See also isExecutable().
+ * @return the process id, or 0 on error
+ */
+ // BIC Merge second overload with first one using runExecutables=true, and
+ // merge third overload with first one as well using tempFiles=false and
+ // runExecutables=true
+ static pid_t runURL( const KURL& _url, const TQString& _mimetype, bool tempFile, bool runExecutables);
+ static pid_t runURL( const KURL& _url, const TQString& _mimetype, bool tempFile);
+ static pid_t runURL( const KURL& _url, const TQString& _mimetype );
+ /// @since 3.5.3
+ /// @internal
+ static pid_t runURL( const KURL& _url, const TQString& _mimetype, TQWidget* window, const TQCString& asn, bool tempFile, bool runExecutables, const TQString& suggestedFileName );
+ static pid_t runURL( const KURL& _url, const TQString& _mimetype, bool tempFile, bool runExecutables, const TQString& suggestedFileName );
+
+ /**
+ * Run the given shell command and notifies kicker of the starting
+ * of the application. If the program to be called doesn't exist,
+ * an error box will be displayed.
+ *
+ * Use only when you know the full command line. Otherwise use the other
+ * static methods, or KRun's constructor.
+ *
+ * @p _cmd must be a shell command. You must not append "&"
+ * to it, since the function will do that for you.
+ *
+ * @return PID of running command, 0 if it could not be started, 0 - (PID
+ * of running command) if command was unsafe for map notification.
+ */
+ static pid_t runCommand( TQString cmd );
+
+ /**
+ * Same as the other runCommand(), but it also takes the name of the
+ * binary, to display an error message in case it couldn't find it.
+ *
+ * @param cmd must be a shell command. You must not append "&"
+ * to it, since the function will do that for you.
+ * @param execName the name of the executable
+ * @param icon icon for app starting notification
+ * @return PID of running command, 0 if it could not be started, 0 - (PID
+ * of running command) if command was unsafe for map notification.
+ */
+ static pid_t runCommand( const TQString& cmd, const TQString & execName, const TQString & icon );
+ static pid_t runCommand( const TQString& cmd, const TQString & execName, const TQString & icon,
+ TQWidget* window, const TQCString& asn );
+
+ /**
+ * Display the Open-With dialog for those URLs, and run the chosen application.
+ * @param lst the list of applications to run
+ * @param tempFiles if true and lst are local files, they will be deleted
+ * when the application exits.
+ * @return false if the dialog was canceled
+ */
+ // BIC merge second overload with first one, using tempFiles=false
+ static bool displayOpenWithDialog( const KURL::List& lst, bool tempFiles );
+ static bool displayOpenWithDialog( const KURL::List& lst );
+ /// @since 3.5.3
+ /// @internal
+ static bool displayOpenWithDialog( const KURL::List& lst, bool tempFiles, const TQString& suggestedFileName );
+
+ /**
+ * Quotes a string for the shell.
+ * @param _str the string to quote. The quoted string will be written here
+ */
+ static void shellQuote( TQString &_str );
+
+ /**
+ * Processes a Exec= line as found in .desktop files.
+ * @param _service the service to extract information from.
+ * @param _urls The urls the service should open.
+ * @param has_shell If true, the arguments are going to be fed into a
+ * shell e.g by using system().
+ * If false, the arguments are going to be fed into a exec() kind
+ * call.
+ * If the arguments are intended for an exec() kind of call and
+ * the Exec line contains shell commands then "/bin/sh -c" is added.
+ * @param tempFiles if true and _urls are local files, they will be deleted
+ * when the application exits.
+ * @return a list of arguments suitable for either system() or exec().
+ */
+ static TQStringList processDesktopExec(const KService &_service, const KURL::List &_urls, bool has_shell, bool tempFiles);
+ static TQStringList processDesktopExec(const KService &_service, const KURL::List &_urls, bool has_shell);
+ /// @since 3.5.3
+ /// @internal
+ static TQStringList processDesktopExec(const KService &_service, const KURL::List &_urls, bool has_shell, bool tempFiles, const TQString& suggestedFileName);
+
+ /**
+ * Given a full command line (e.g. the Exec= line from a .desktop file),
+ * extract the name of the binary being run.
+ * @param execLine the full command line
+ * @param removePath if true, remove a (relative or absolute) path. E.g. /usr/bin/ls becomes ls.
+ * @return the name of the binary to run
+ * @since 3.1
+ */
+ static TQString binaryName( const TQString & execLine, bool removePath );
+
+ /**
+ * Returns whether @p serviceType refers to an executable program instead
+ * of a data file.
+ * @since 3.2
+ */
+ static bool isExecutable( const TQString& serviceType );
+
+ /**
+ * Returns wether the @p url of @p mimetype is executable.
+ * To be executable the file must pass the following rules:
+ * -# Must reside on the local filesystem.
+ * -# Must be marked as executable for the user by the filesystem.
+ * -# The mime type must inherit application/x-executable or application/x-executable-script.
+ * To allow a script to run when the above rules are satisfied add the entry
+ * @code
+ * X-TDE-IsAlso=application/x-executable-script
+ * @endcode
+ * to the mimetype's desktop file.
+ * @since 3.3
+ */
+ static bool isExecutableFile( const KURL& url, const TQString &mimetype );
+
+ /**
+ * @internal
+ * @since 3.4
+ */
+ static bool checkStartupNotify( const TQString& binName, const KService* service, bool* silent_arg, TQCString* wmclass_arg );
+
+signals:
+ /**
+ * Emitted when the operation finished.
+ * @see hasFinished()
+ */
+ void finished();
+ /**
+ * Emitted when the operation had an error.
+ * @see hasError()
+ */
+ void error();
+
+protected slots:
+ void slotTimeout();
+ void slotScanFinished( TDEIO::Job * );
+ void slotScanMimeType( TDEIO::Job *, const TQString &type );
+ virtual void slotStatResult( TDEIO::Job * );
+
+protected:
+ virtual void init();
+
+ virtual void scanFile();
+
+ /**
+ * Called if the mimetype has been detected. The function checks
+ * whether the document and appends the gzip protocol to the
+ * URL. Otherwise runURL is called to finish the job.
+ */
+ virtual void foundMimeType( const TQString& _type );
+
+ virtual void killJob();
+
+ KURL m_strURL;
+ bool m_bFault;
+ bool m_bAutoDelete;
+ bool m_bProgressInfo;
+ bool m_bFinished;
+ TDEIO::Job * m_job;
+ TQTimer m_timer;
+
+ /**
+ * Used to indicate that the next action is to scan the file.
+ * This action is invoked from slotTimeout.
+ */
+ bool m_bScanFile;
+ bool m_bIsDirectory;
+
+ /**
+ * USed to indicate that the next action is to initialize.
+ * This action is invoked from slotTimeout
+ */
+ bool m_bInit;
+
+ bool m_bIsLocalFile;
+ mode_t m_mode;
+
+protected:
+ virtual void virtual_hook( int id, void* data );
+
+private:
+ void init (const KURL& url, TQWidget* window, const TQCString& asn, mode_t mode,
+ bool isLocalFile, bool showProgressInfo);
+private:
+ class KRunPrivate;
+ KRunPrivate *d;
+};
+
+#ifndef KDE_NO_COMPAT
+/**
+ * @deprecated. Kept for source compatibility, does nothing nowadays.
+ * Do not use in new source.
+ * KRun can open the openwith dialog directly now.
+ * Use KRun::displayOpenWithDialog() if you were using KOpenWithHandler directly.
+ */
+class TDEIO_EXPORT_DEPRECATED KOpenWithHandler
+{
+public:
+ KOpenWithHandler() {}
+ static bool exists() { return true; }
+};
+#endif
+
+/**
+ * @internal
+ * This class watches a process launched by KRun.
+ * It sends a notification when the process exits (for the taskbar)
+ * and it will show an error message if necessary (e.g. "program not found").
+ */
+class TDEIO_EXPORT TDEProcessRunner : public TQObject
+{
+ Q_OBJECT
+
+ public:
+
+ static pid_t run(TDEProcess *, const TQString & binName);
+#ifdef Q_WS_X11 // We don't have KStartupInfo in Qt/Embedded
+ static pid_t run(TDEProcess *, const TQString & binName, const KStartupInfoId& id );
+#endif
+
+ virtual ~TDEProcessRunner();
+
+ pid_t pid() const;
+
+ protected slots:
+
+ void slotProcessExited(TDEProcess *);
+
+ private:
+
+ TDEProcessRunner(TDEProcess *, const TQString & binName);
+#ifdef Q_WS_X11 // We don't have KStartupInfo in Qt/Embedded
+ TDEProcessRunner(TDEProcess *, const TQString & binName, const KStartupInfoId& id );
+#endif
+ TDEProcessRunner();
+
+ TDEProcess * process_;
+ TQString binName;
+#ifdef Q_WS_X11 // We don't have KStartupInfo in Qt/Embedded
+ KStartupInfoId id_;
+#endif
+};
+
+#endif