File indexing completed on 2024-12-01 12:30:23

0001 //  -*- c-basic-offset:4; indent-tabs-mode:nil -*-
0002 /*
0003     This file is part of the KDE libraries
0004     SPDX-FileCopyrightText: 2000, 2006 David Faure <faure@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-only
0007 */
0008 #ifndef __kbookmarkmanager_h
0009 #define __kbookmarkmanager_h
0010 
0011 #include <QDomDocument>
0012 #include <QObject>
0013 #include <QString>
0014 
0015 #include <memory>
0016 
0017 class KBookmarkManagerPrivate;
0018 
0019 #include "kbookmark.h"
0020 #if KBOOKMARKS_ENABLE_DEPRECATED_SINCE(5, 79)
0021 #include "kbookmarkowner.h" // for SC reasons
0022 #endif
0023 
0024 class KBookmarkGroup;
0025 class QDBusMessage;
0026 
0027 /**
0028  * @class KBookmarkManager kbookmarkmanager.h KBookmarkManager
0029  *
0030  * This class implements the reading/writing of bookmarks in XML.
0031  * The bookmarks file is read and written using the XBEL standard
0032  * (http://pyxml.sourceforge.net/topics/xbel/)
0033  *
0034  * A sample file looks like this :
0035  * \code
0036  * <xbel>
0037  *   <bookmark href="http://techbase.kde.org"><title>Developer Web Site</title></bookmark>
0038  *   <folder folded="no">
0039  *     <title>Title of this folder</title>
0040  *     <bookmark icon="kde" href="http://www.kde.org"><title>KDE Web Site</title></bookmark>
0041  *     <folder toolbar="yes">
0042  *       <title>My own bookmarks</title>
0043  *       <bookmark href="http://www.koffice.org"><title>KOffice Web Site</title></bookmark>
0044  *       <separator/>
0045  *       <bookmark href="http://www.kdevelop.org"><title>KDevelop Web Site</title></bookmark>
0046  *     </folder>
0047  *   </folder>
0048  * </xbel>
0049  * \endcode
0050  */
0051 class KBOOKMARKS_EXPORT KBookmarkManager : public QObject
0052 {
0053     Q_OBJECT
0054 private:
0055     /**
0056      * Creates a bookmark manager with a path to the bookmarks.  By
0057      * default, it will use the KDE standard dirs to find and create the
0058      * correct location.  If you are using your own app-specific
0059      * bookmarks directory, you must instantiate this class with your
0060      * own path <em>before</em> KBookmarkManager::managerForFile() is ever
0061      * called.
0062      *
0063      * @param bookmarksFile full path to the bookmarks file,
0064      * Use ~/.kde/share/apps/konqueror/bookmarks.xml for the konqueror bookmarks
0065      *
0066      * @param dbusObjectName a unique name that represents this bookmark collection,
0067      * usually your component (e.g. application) name. This is "konqueror" for the
0068      * konqueror bookmarks, "kfile" for KFileDialog bookmarks, etc.
0069      * The final D-Bus object path is /KBookmarkManager/dbusObjectName
0070      * An empty @p dbusObjectName disables the registration to D-Bus (used for temporary managers)
0071      */
0072     KBOOKMARKS_NO_EXPORT KBookmarkManager(const QString &bookmarksFile, const QString &dbusObjectName);
0073 
0074     /**
0075      * Creates a bookmark manager for an external file
0076      * (Using QFileSystemWatcher for change monitoring)
0077      * @since 4.1
0078      */
0079     KBOOKMARKS_NO_EXPORT explicit KBookmarkManager(const QString &bookmarksFile);
0080 
0081     /**
0082      * Creates a temp bookmark manager
0083      */
0084     KBOOKMARKS_NO_EXPORT KBookmarkManager();
0085 
0086 public:
0087     /**
0088      * Destructor
0089      */
0090     ~KBookmarkManager() override;
0091 
0092     /**
0093      * Check whether auto error handling is enabled.
0094      * If enabled, it will show an error dialog to the user when an
0095      * error occurs. It is turned on by default.
0096      * @return true if auto error handling is enabled, false otherwise
0097      * @note dialogs will only be displayed if the current thread is the gui thread
0098      * @since 4.6
0099      * @see setAutoErrorHandlingEnabled()
0100      */
0101     bool autoErrorHandlingEnabled() const;
0102 
0103     /**
0104      * Enable or disable auto error handling is enabled.
0105      * If enabled, it will show an error dialog to the user when an
0106      * error occurs. It is turned on by default.
0107      * If disabled, the application should react on the error() signal.
0108      * @param enable true to enable auto error handling, false to disable
0109      * @param parent the parent widget for the error dialogs, can be @c nullptr for
0110      *               top-level
0111      * @since 4.6
0112      * @see autoErrorHandlingEnabled()
0113      */
0114     void setAutoErrorHandlingEnabled(bool enable, QWidget *parent);
0115 
0116     /**
0117      * Set the update flag. Defaults to true.
0118      * @param update if true then KBookmarkManager will listen to D-Bus update requests.
0119      */
0120     void setUpdate(bool update);
0121 
0122     /**
0123      * Save the bookmarks to the given XML file on disk.
0124      * @param filename full path to the desired bookmarks file location
0125      * @param toolbarCache iff true save a cache of the toolbar folder, too
0126      * @return true if saving was successful
0127      */
0128     // KF6 TODO: Use an enum and not a bool
0129     bool saveAs(const QString &filename, bool toolbarCache = true) const;
0130 
0131     /**
0132      * Update access time stamps for a given url.
0133      * @param url the viewed url
0134      * @return true if any metadata was modified (bookmarks file is not saved automatically)
0135      */
0136     bool updateAccessMetadata(const QString &url);
0137 
0138     /*
0139      * NB. currently *unimplemented*
0140      *
0141      * Update favicon url for a given url.
0142      * @param url the viewed url
0143      * @param faviconurl the favicion url
0144      */
0145     void updateFavicon(const QString &url, const QString &faviconurl);
0146 
0147     /**
0148      * This will return the path that this manager is using to read
0149      * the bookmarks.
0150      * @internal
0151      * @return the path containing the bookmarks
0152      */
0153     QString path() const;
0154 
0155     /**
0156      * This will return the root bookmark.  It is used to iterate
0157      * through the bookmarks manually.  It is mostly used internally.
0158      *
0159      * @return the root (top-level) bookmark
0160      */
0161     KBookmarkGroup root() const;
0162 
0163     /**
0164      * This returns the root of the toolbar menu.
0165      * In the XML, this is the group with the attribute toolbar=yes
0166      *
0167      * @return the toolbar group
0168      */
0169     KBookmarkGroup toolbar();
0170 
0171     /**
0172      * @return the bookmark designated by @p address
0173      * @param address the address belonging to the bookmark you're looking for
0174      * @param tolerate when true tries to find the most tolerable bookmark position
0175      * @see KBookmark::address
0176      */
0177     KBookmark findByAddress(const QString &address);
0178 
0179     /**
0180      * Saves the bookmark file and notifies everyone.
0181      *
0182      **/
0183     void emitChanged();
0184 
0185     /**
0186      * Saves the bookmark file and notifies everyone.
0187      * @param group the parent of all changed bookmarks
0188      */
0189     void emitChanged(const KBookmarkGroup &group);
0190 
0191     /**
0192      * Save the bookmarks to an XML file on disk.
0193      * You should use emitChanged() instead of this function, it saves
0194      * and notifies everyone that the file has changed.
0195      * Only use this if you don't want the emitChanged signal.
0196      * @param toolbarCache iff true save a cache of the toolbar folder, too
0197      * @return true if saving was successful
0198      */
0199     // KF6 TODO: Use an enum and not a bool
0200     bool save(bool toolbarCache = true) const;
0201 
0202     void emitConfigChanged();
0203 
0204     /**
0205      * Set options with which slotEditBookmarks called keditbookmarks
0206      * this can be used to change the appearance of the keditbookmarks
0207      * in order to provide a slightly differing outer shell depending
0208      * on the bookmarks file / app which calls it.
0209      * @param caption the --caption string, for instance "Konsole"
0210      * @param browser iff false display no browser specific
0211      *            menu items in keditbookmarks :: --nobrowser
0212      */
0213     // KF6 TODO: Use an enum and not a bool
0214     void setEditorOptions(const QString &caption, bool browser);
0215 
0216     /**
0217      * This static function will return an instance of the
0218      * KBookmarkManager, responsible for the given @p bookmarksFile.
0219      * If you do not instantiate this class either
0220      * natively or in a derived class, then it will return an object
0221      * with the default behaviors.  If you wish to use different
0222      * behaviors, you <em>must</em> derive your own class and
0223      * instantiate it before this method is ever called.
0224      *
0225      * @param bookmarksFile full path to the bookmarks file,
0226      * Use ~/.kde/share/apps/konqueror/bookmarks.xml for the konqueror bookmarks
0227      *
0228      * @param dbusObjectName a unique name that represents this bookmark collection,
0229      * usually your component (e.g. application) name. This is "konqueror" for the
0230      * konqueror bookmarks, "kfile" for KFileDialog bookmarks, etc.
0231      * The final D-Bus object path is /KBookmarkManager/dbusObjectName
0232      * An empty @p dbusObjectName disables the registration to D-Bus (used for temporary managers)
0233      *
0234      */
0235     static KBookmarkManager *managerForFile(const QString &bookmarksFile, const QString &dbusObjectName);
0236 
0237     /**
0238      * Returns a KBookmarkManager, which will use QFileSystemWatcher for change detection
0239      * This is important when sharing bookmarks with other Desktops.
0240      * @param bookmarksFile full path to the bookmarks file
0241      * @since 4.1
0242      */
0243     static KBookmarkManager *managerForExternalFile(const QString &bookmarksFile);
0244 
0245     /**
0246      * only used for KBookmarkBar
0247      */
0248     static KBookmarkManager *createTempManager();
0249 
0250     /**
0251      * Returns a pointer to the user's main (konqueror) bookmark collection.
0252      */
0253     static KBookmarkManager *userBookmarksManager();
0254 
0255     /**
0256      * @internal
0257      */
0258     QDomDocument internalDocument() const;
0259 
0260 public Q_SLOTS:
0261     void slotEditBookmarks();
0262     void slotEditBookmarksAtAddress(const QString &address);
0263 
0264     /**
0265      * Reparse the whole bookmarks file and notify about the change
0266      * Doesn't send signal over D-Bus to the other Bookmark Managers
0267      * You probably want to use emitChanged()
0268      *
0269      */
0270     void notifyCompleteChange(const QString &caller);
0271 
0272 #ifndef KBOOKMARKS_NO_DBUS
0273     /**
0274      * Emit the changed signal for the group whose address is given
0275      * @see KBookmark::address()
0276      * Called by the process that saved the file after
0277      * a small change (new bookmark or new folder).
0278      * Does not send signal over D-Bus to the other Bookmark Managers
0279      * You probably want to call emitChanged()
0280      */
0281     void notifyChanged(const QString &groupAddress, const QDBusMessage &msg);
0282 #endif
0283 
0284     void notifyConfigChanged();
0285 
0286 Q_SIGNALS:
0287     /**
0288      * Signal send over D-Bus
0289      */
0290     void bookmarkCompleteChange(QString caller);
0291 
0292     /**
0293      * Signal send over D-Bus
0294      */
0295     void bookmarksChanged(QString groupAddress);
0296 
0297     /**
0298      * Signal send over D-Bus
0299      */
0300     void bookmarkConfigChanged();
0301 
0302     /**
0303      * Signals that the group (or any of its children) with the address
0304      * @p groupAddress (e.g. "/4/5")
0305      * has been modified by the caller @p caller.
0306      * connect to this
0307      */
0308     void changed(const QString &groupAddress, const QString &caller);
0309 
0310     /**
0311      * Signals that the config changed
0312      */
0313     void configChanged();
0314 
0315     /**
0316      * Emitted when an error occurs.
0317      * Contains the translated error message.
0318      * @since 4.6
0319      */
0320     void error(const QString &errorMessage);
0321 
0322 private Q_SLOTS:
0323     KBOOKMARKS_NO_EXPORT void slotFileChanged(const QString &path); // external bookmarks
0324 
0325 private:
0326     // consts added to avoid a copy-and-paste of internalDocument
0327     KBOOKMARKS_NO_EXPORT void parse() const;
0328     KBOOKMARKS_NO_EXPORT void init(const QString &dbusPath);
0329 
0330     KBOOKMARKS_NO_EXPORT void startKEditBookmarks(const QStringList &args);
0331 
0332 private:
0333     std::unique_ptr<KBookmarkManagerPrivate> const d;
0334 
0335     friend class KBookmarkGroup;
0336 };
0337 
0338 #endif