summaryrefslogtreecommitdiffstats
path: root/kplayer/kplayernode.h
diff options
context:
space:
mode:
Diffstat (limited to 'kplayer/kplayernode.h')
-rw-r--r--kplayer/kplayernode.h1430
1 files changed, 1430 insertions, 0 deletions
diff --git a/kplayer/kplayernode.h b/kplayer/kplayernode.h
new file mode 100644
index 0000000..5620cf1
--- /dev/null
+++ b/kplayer/kplayernode.h
@@ -0,0 +1,1430 @@
+/***************************************************************************
+ kplayernode.h
+ -------------
+ begin : Wed Feb 16 2005
+ copyright : (C) 2005-2007 by kiriuja
+ email : http://kplayer.sourceforge.net/email.html
+ ***************************************************************************/
+
+/***************************************************************************
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#ifndef KPLAYERNODE_H
+#define KPLAYERNODE_H
+
+#include "kplayerproperties.h"
+#include "kplayersource.h"
+
+class KPlayerMediaNode;
+class KPlayerRootNode;
+
+/**Node list iterator.
+ * @author kiriuja
+ */
+typedef QPtrListIterator<KPlayerNode> KPlayerNodeListIterator;
+
+/**Node map by ID.
+ * @author kiriuja
+ */
+typedef QMap<QString, KPlayerNode*> KPlayerNodeMap;
+
+/**Container node map by ID.
+ * @author kiriuja
+ */
+typedef QMap<QString, KPlayerContainerNode*> KPlayerContainerNodeMap;
+
+/**Node list.
+ *@author kiriuja
+ */
+class KPlayerNodeList : public QPtrList<KPlayerNode>
+{
+public:
+ /** Constructor. */
+ KPlayerNodeList (void) { }
+ /** Destructor. */
+ virtual ~KPlayerNodeList();
+
+ /** Compares the two given nodes. */
+ virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
+
+ /** Releases all nodes on the list. */
+ void releaseAll (void) const;
+
+ /** Creates a node list from the given URL list. */
+ static KPlayerNodeList fromUrlList (const KURL::List& urls);
+};
+
+/**Node list sorted by name.
+ *@author kiriuja
+ */
+class KPlayerNodeListByName : public KPlayerNodeList
+{
+public:
+ /** Constructor. */
+ KPlayerNodeListByName (void) { }
+ /** Destructor. */
+ virtual ~KPlayerNodeListByName();
+
+ /** Compares the two given nodes. */
+ virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
+};
+
+/**Playlist node list.
+ *@author kiriuja
+ */
+class KPlayerPlaylistNodeList : public KPlayerNodeList
+{
+public:
+ /** Constructor. */
+ KPlayerPlaylistNodeList (void) { }
+ /** Destructor. */
+ virtual ~KPlayerPlaylistNodeList();
+
+ /** Compares the two given nodes. */
+ virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
+};
+
+/**Node in the hierarchy.
+ *@author kiriuja
+ */
+class KPlayerNode : public QObject
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerNode();
+
+ /** Initializes the node. */
+ void setup (KPlayerContainerNode* parent, const QString& id, KPlayerContainerNode* origin = 0);
+
+ /** Unique identifier of the node within its parent node. */
+ const QString& id (void) const
+ { return m_id; }
+ /** Suggested identifier for a copy of this node. */
+ virtual QString suggestId (void) const;
+
+ /** Node name. */
+ QString name (void) const
+ { return media() -> name(); }
+
+ /** Node URL. Gives node location in the hierarchy. */
+ virtual KURL url (void) const;
+ /** The URL of a subnode with the given ID. */
+ KURL url (const QString& id) const;
+ /** Media URL. Refers to the meta information storage of the node. */
+ virtual KURL metaurl (void) const;
+ /** Media URL of a subnode with the given ID. */
+ KURL metaurl (const QString& id) const;
+
+ /** Parent node. Null for root node. */
+ KPlayerContainerNode* parent (void) const
+ { return m_parent; }
+ /** Sets the parent node. */
+ void setParent (KPlayerContainerNode* node)
+ { m_parent = node; }
+
+ /** Media properties. */
+ KPlayerGenericProperties* media (void) const
+ { return m_media; }
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+
+ /** Configuration. */
+ KPlayerConfiguration* configuration (void) const
+ { return KPlayerEngine::engine() -> configuration(); }
+ /** Settings. */
+ KPlayerSettings* settings (void) const
+ { return KPlayerEngine::engine() -> settings(); }
+
+ /** Returns the top level node. */
+ KPlayerContainerNode* topLevelNode (void) const;
+
+ /** Returns whether the node is ready for playing. */
+ virtual bool ready (void) const;
+
+ /** Returns whether the node is a container. */
+ virtual bool isContainer (void) const;
+
+ /** Returns whether the node has media properties. */
+ virtual bool hasProperties (void) const;
+
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+
+ /** Compares this node to the the given node by name. */
+ int compareByName (KPlayerNode* node) const;
+ /** Compares this node to the the given node using the current criteria. */
+ int compare (KPlayerNode* node) const;
+
+ /** Adds the node attribute counts to the given map. */
+ void countAttributes (KPlayerPropertyCounts& counts) const;
+
+ /** Adds a reference keeping the node in memory. */
+ void reference (void)
+ { ++ m_references; }
+ /** Release a reference and delete the node if no references remain. */
+ void release (void);
+ /** Detaches the node and its subnodes. */
+ void detach (void);
+
+ /** Returns the previous media node starting from this node. */
+ KPlayerMediaNode* previousMediaNode (void);
+ /** Returns the last media node starting from this node. */
+ virtual KPlayerMediaNode* lastMediaNode (void) = 0;
+
+ /** Returns the root node of the hierarchy. */
+ static KPlayerRootNode* root (void)
+ { return m_root; }
+
+ /** Initializes the node hierarchy. */
+ static void initialize (void);
+ /** Terminates the node hierarchy. */
+ static void terminate (void);
+
+ /** Sets the sorting key and ascending order. */
+ static void setSorting (const QString& key, bool ascending);
+ /** Returns whether nodes are being sorted by name. */
+ static bool sortByName (void)
+ { return m_sort_by_name; }
+ /** Returns the sort key. */
+ static const QString& sortKey (void)
+ { return m_sort_key; }
+ /** Returns whether to sort in ascending order. */
+ static bool sortAscending (void)
+ { return m_sort_ascending; }
+
+protected slots:
+ /** Checks if the meta information has changed and emits the meta signals. */
+ virtual void updated (void);
+
+protected:
+ /** Initializes the node media. */
+ virtual void setupMedia (void);
+ /** Initializes the node children. */
+ virtual void setupChildren (KPlayerContainerNode* origin);
+
+ /** Unique identifier of the node within its parent node. */
+ QString m_id;
+ /** Parent node. Null for root node. */
+ KPlayerContainerNode* m_parent;
+ /** Reference count of the node. */
+ int m_references;
+
+ /** Media properties. */
+ KPlayerGenericProperties* m_media;
+
+ /** Root node of the hierarchy. */
+ static KPlayerRootNode* m_root;
+
+ /** Flag indicating whether the list is being sorted by name. */
+ static bool m_sort_by_name;
+ /** Sort key. */
+ static QString m_sort_key;
+ /** Sort in ascending order. */
+ static bool m_sort_ascending;
+};
+
+/**Media node.
+ *@author kiriuja
+ */
+class KPlayerMediaNode : public KPlayerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerMediaNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerMediaNode();
+
+ /** Returns whether the node has media properties. */
+ virtual bool hasProperties (void) const;
+
+ /** Returns the last media node starting from this node. */
+ virtual KPlayerMediaNode* lastMediaNode (void);
+
+protected:
+ /** Initializes the node media. */
+ virtual void setupMedia (void);
+ /** Initializes the node URL. */
+ virtual void setupUrl (void);
+};
+
+/**File node.
+ *@author kiriuja
+ */
+class KPlayerFileNode : public KPlayerMediaNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerFileNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerFileNode();
+
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+};
+
+/**Track node.
+ *@author kiriuja
+ */
+class KPlayerTrackNode : public KPlayerMediaNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerTrackNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerTrackNode();
+
+ /** Parent node. */
+ KPlayerDiskNode* parent (void) const
+ { return (KPlayerDiskNode*) m_parent; }
+
+ /** Media URL. Refers to the meta information storage of the node. */
+ virtual KURL metaurl (void) const;
+};
+
+/**Channel node.
+ *@author kiriuja
+ */
+class KPlayerChannelNode : public KPlayerMediaNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerChannelNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerChannelNode();
+
+ /** Parent node. */
+ KPlayerDeviceNode* parent (void) const
+ { return (KPlayerDeviceNode*) m_parent; }
+ /** Media properties. */
+ KPlayerChannelProperties* media (void) const
+ { return (KPlayerChannelProperties*) m_media; }
+};
+
+/**Item node.
+ *@author kiriuja
+ */
+class KPlayerItemNode : public KPlayerMediaNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerItemNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerItemNode();
+
+ /** Media URL. Refers to the meta information storage of the node. */
+ virtual KURL metaurl (void) const;
+
+protected:
+ /** Initializes the node URL. */
+ virtual void setupUrl (void);
+
+ /** Media URL. Refers to the meta information storage of the node. */
+ KURL m_url;
+};
+
+#if 0
+/**Search item node.
+ *@author kiriuja
+ */
+class KPlayerSearchItemNode : public KPlayerItemNode
+{
+ //Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerSearchItemNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerSearchItemNode();
+};
+#endif
+
+/**Container node.
+ *@author kiriuja
+ */
+class KPlayerContainerNode : public KPlayerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerContainerNode (void);
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerContainerNode();
+
+ /** Origin node, for linked group nodes only. */
+ KPlayerContainerNode* origin (void) const
+ { return m_origin; }
+ /** Sets the origin node. */
+ void setOrigin (KPlayerContainerNode* node)
+ { m_origin = node; }
+
+ /** Source of subnodes. */
+ KPlayerSource* source (void) const
+ { return m_source; }
+ /** Sets the source. */
+ void setSource (KPlayerSource* source)
+ { m_source = source; }
+
+ /** List of subnodes. */
+ const KPlayerNodeList& nodes (void) const
+ { return m_nodes; }
+
+ /** Returns whether the node is ready for playing. */
+ virtual bool ready (void) const;
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Suggested identifier for a copy of this node. */
+ virtual QString suggestId (void) const;
+
+ /** Returns whether the node is a container. */
+ virtual bool isContainer (void) const;
+ /** Returns whether the node is a group. */
+ virtual bool isGroup (void) const;
+ /** Returns whether the node is a directory. */
+ virtual bool isDirectory (void) const;
+ /** Returns whether the node is a collection group. */
+ virtual bool isCollection (void) const;
+ /** Indicates whether the node is a playlist. */
+ virtual bool isPlaylist (void) const;
+ /** Indicates whether the node is a recent node. */
+ virtual bool isRecent (void) const;
+ /** Returns whether the node is a now playing group. */
+ virtual bool isNowPlaying (void) const;
+ /** Indicates whether the node is the device list. */
+ virtual bool isDevices (void) const;
+
+ /** Returns whether the node and its subnodes can be queued for playing. */
+ bool canQueue (void) const;
+
+#if 0
+ /** Returns whether the node can be grouped. */
+ bool canGroup (void) const;
+#endif
+
+ /** Returns whether the node can be saved as a playlist. */
+ virtual bool canSaveAsPlaylist (void) const;
+
+ /** Indicates whether leaves can be added. */
+ bool canAddLeaves (void) const
+ { return source() -> canAddLeaves(); }
+ /** Indicates whether branches can be added. */
+ bool canAddBranches (void) const
+ { return source() -> canAddBranches(); }
+ /** Indicates whether nodes can be removed. */
+ bool canRemove (void) const
+ { return source() -> canRemove(); }
+
+ /** Indicates whether nodes are arranged in a custom order. */
+ bool customOrder (void) const;
+ /** Sets whether nodes are arranged in a custom order. */
+ void setCustomOrder (bool custom);
+ /** Sets custom order by name if not already set. */
+ void customOrderByName (void);
+
+ /** Returns whether custom order is allowed. */
+ virtual bool allowsCustomOrder (void) const;
+
+ /** Indicates whether duplicates are acceptable. */
+ virtual bool acceptsDuplicates (void) const;
+
+ /** Indicates whether groups should be put before items when sorting. */
+ bool groupsFirst (void) const;
+
+ /** Compares the given nodes by their position in the list of nodes. */
+ int compareByPosition (const KPlayerNode* node1, const KPlayerNode* node2);
+
+ /** Returns whether there are child nodes. */
+ bool hasNodes (void) const
+ { return m_source -> has (false); }
+ /** Returns whether there are child groups. */
+ bool hasGroups (void) const
+ { return m_source -> has (true); }
+
+ /** Returns whether the given node can be copied into this container. */
+ bool canCopy (const KPlayerNodeList& nodes) const;
+ /** Returns whether the given nodes can be linked into this container. */
+ bool canLink (const KPlayerNodeList& nodes) const;
+ /** Returns whether the given node can be linked into this container. */
+ virtual bool canLink (KPlayerContainerNode* node) const;
+ /** Returns whether the given node belongs to the same top level node as this one. */
+ bool preferMove (KPlayerNode* node) const;
+
+ /** Returns a node for the given ID from the node list. */
+ KPlayerNode* nodeById (const QString& id) const;
+ /** Returns a node for the given ID if it exists. */
+ KPlayerContainerNode* getNodeById (const QString& id);
+ /** Returns a node at the given path if it exists. */
+ virtual KPlayerContainerNode* getNodeByPath (const QString& path);
+
+ /** Returns the next node after the given one. */
+ KPlayerNode* nextNode (KPlayerNode*);
+ /** Returns the last media node starting from this node. */
+ virtual KPlayerMediaNode* lastMediaNode (void);
+
+ /** Returns whether nodes are populated. */
+ bool populated (void)
+ { return m_populate_nodes > 0; }
+ /** Returns whether groups are populated. */
+ bool groupsPopulated (void)
+ { return m_populate_groups > 0; }
+
+ /** Populates the list of all subnodes. */
+ void populate (void);
+ /** Populates the list of group subnodes. */
+ void populateGroups (void);
+ /** Recursively populates the node hierarchy. */
+ void populateAll (void);
+
+ /** Vacates the list of all subnodes. */
+ void vacate (void);
+ /** Vacates the list of group subnodes. */
+ void vacateGroups (void);
+ /** Recursively vacates the node hierarchy. */
+ void vacateAll (void);
+
+ /** Saves the node data into the store. */
+ void save (void);
+
+ /** Adds a new branch node with the given name. */
+ void addBranch (const QString& name, KPlayerNode* after = 0);
+ /** Adds a new branch node with the given name at the top of the node list. */
+ void prependBranch (const QString& name)
+ { addBranch (name, this); }
+ /** Adds a new branch node with the given name at the end of the node list. */
+ void appendBranch (const QString& name);
+
+ /** Adds the given nodes to this node, optionally linking to the origin. */
+ void add (const KPlayerNodeList& nodes, bool link = true, KPlayerNode* after = 0);
+ /** Adds the given nodes at the top of the node list, linking to the origin. */
+ void prepend (const KPlayerNodeList& nodes)
+ { add (nodes, true, this); }
+ /** Adds the given nodes at the end of the node list, linking to the origin. */
+ void append (const KPlayerNodeList& nodes);
+
+ /** Adds the given URL list to this node, linking local directories to the origin. */
+ void add (const KURL::List& urls, bool link = true, KPlayerNode* after = 0);
+ /** Adds the given URL list at the top of the node list, linking to the origin. */
+ void prepend (const KURL::List& urls)
+ { add (urls, true, this); }
+ /** Adds the given URL list at the end of the node list, linking to the origin. */
+ void append (const KURL::List& urls);
+
+ /** Moves the given nodes after the given node. */
+ void move (const KPlayerNodeList& nodes, KPlayerNode* after);
+
+ /** Removes the given nodes from this node. */
+ void remove (const KPlayerNodeList& nodes);
+
+ /** Replaces the existing nodes with the given ones. */
+ void replace (const KPlayerNodeList& list)
+ {
+ remove (nodes());
+ append (list);
+ }
+
+ /** Replaces the existing nodes with the given URL list. */
+ void replace (const KURL::List& urls)
+ {
+ remove (nodes());
+ append (urls);
+ }
+
+ /** Adds the given nodes to the list of nodes, optionally linking to the origin. */
+ KPlayerNode* added (const KPlayerNodeList& nodes, bool link, KPlayerNode* after = 0);
+ /** Adds all subnodes of the given node to the list of nodes, optionally linking to the origin. */
+ void added (KPlayerContainerNode* node, bool link);
+ /** Adds the given files to the list of nodes. */
+ void added (const QFileInfoList& list);
+ /** Adds the given branches to the list of nodes. */
+ void addedBranches (const QStringList& list);
+ /** Adds the given leaves to the list of nodes. */
+ void addedLeaves (const QStringList& list);
+
+ /** Moves the given nodes after the given node. */
+ KPlayerNode* moved (const KPlayerNodeList& nodes, KPlayerNode* after);
+
+ /** Removes the given nodes from the list of nodes. */
+ virtual void removed (const KPlayerNodeList& nodes);
+ /** Removes the node and all subnodes. */
+ virtual void removed (void);
+ /** Removes nodes with the given IDs from the list of nodes. */
+ void removed (const QStringList& ids);
+ /** Finishes removing the given nodes and counts and emits the removed signal. */
+ void removed (const KPlayerNodeList& nodes, const KPlayerPropertyCounts& counts);
+
+ /** Removes the given node from the list of nodes. */
+ bool remove (KPlayerNode* node);
+ /** Detaches the node and its subnodes. */
+ void detach (void);
+
+ /** Releases the origin and switches to store source. */
+ virtual void releaseOrigin (void);
+ /** Detaches the origin and switches to store source recursively. */
+ void detachOrigin (void);
+
+ /** Remove the given node from the list of subnodes and release the reference. */
+ void release (KPlayerNode* node);
+ /** Release a reference and delete the node if no references remain. */
+ void release (void)
+ { KPlayerNode::release(); }
+
+ /** Returns names and counts of attributes found in subnodes. */
+ const KPlayerPropertyCounts& attributeCounts (void) const
+ { return m_attribute_counts; }
+
+ /** Updates attribute counts. */
+ void updateAttributes (KPlayerNode* node)
+ {
+ const KPlayerPropertyCounts& added = node -> media() -> added();
+ const KPlayerPropertyCounts& removed = node -> media() -> removed();
+ m_attribute_counts.add (added);
+ m_attribute_counts.subtract (removed);
+ if ( ! added.isEmpty() || ! removed.isEmpty() )
+ emitAttributesUpdated (added, removed);
+ emitUpdated (node);
+ }
+
+ /** Emits nodesAdded signal. */
+ void emitAdded (const KPlayerNodeList& nodes, KPlayerNode* after = 0)
+ { emit nodesAdded (this, nodes, after); }
+ /** Emits nodesRemoved signal. */
+ void emitRemoved (const KPlayerNodeList& nodes)
+ { emit nodesRemoved (this, nodes); }
+ /** Emits detached signal. */
+ void emitDetached (void)
+ { emit detached(); }
+ /** Emits nodeUpdated signal. */
+ void emitUpdated (KPlayerNode* node)
+ { emit nodeUpdated (this, node); }
+ /** Emits attributesUpdated signal. */
+ void emitAttributesUpdated (const KPlayerPropertyCounts& added, const KPlayerPropertyCounts& removed)
+ { emit attributesUpdated (added, removed); }
+
+signals:
+ /** Emitted when nodes have been added. */
+ void nodesAdded (KPlayerContainerNode* parent, const KPlayerNodeList& nodes, KPlayerNode* after);
+ /** Emitted when nodes have been removed. */
+ void nodesRemoved (KPlayerContainerNode* parent, const KPlayerNodeList& nodes);
+ /** Emitted when the node has been detached. */
+ void detached (void);
+ /** Emitted when a node has been updated. */
+ void nodeUpdated (KPlayerContainerNode*, KPlayerNode*);
+ /** Emitted when some node attributes have been updated. */
+ void attributesUpdated (const KPlayerPropertyCounts& added, const KPlayerPropertyCounts& removed);
+
+protected:
+ /** Initializes the node children. */
+ virtual void setupChildren (KPlayerContainerNode* origin);
+ /** Initializes the node origin. */
+ virtual void setupOrigin (void);
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new leaf node with the given id. */
+ virtual KPlayerNode* createLeaf (const QString& id);
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+
+ /** Inserts the given node and adds a reference if necessary. */
+ void insert (KPlayerNode* node, KPlayerNode* after);
+ /** Appends the given node to the node list and map. */
+ void append (KPlayerNode* node);
+
+ /** Inserts a new leaf subnode and adds a reference if necessary. */
+ KPlayerNode* insertLeaf (const QString& id, KPlayerNode* after = 0);
+ /** Inserts a new branch subnode and adds references as necessary. */
+ KPlayerContainerNode* insertBranch (const QString& id, KPlayerNode* after = 0, KPlayerContainerNode* origin = 0);
+
+ /** Populates the list of all subnodes. */
+ void doPopulate (void);
+ /** Populates the list of group subnodes. */
+ void doPopulateGroups (void);
+ /** Refreshes the list of subnodes. */
+ void refreshNodes (void);
+
+ /** Returns the last node. */
+ KPlayerNode* lastNode (void);
+
+ /** Arranges nodes in the correct order. */
+ void applyCustomOrder (void);
+
+ /** List of all subnodes of this node. */
+ KPlayerNodeList m_nodes;
+ /** Reference count for all nodes. */
+ int m_populate_nodes;
+ /** Reference count for group nodes. */
+ int m_populate_groups;
+ /** Origin node, for linked group nodes only. */
+ KPlayerContainerNode* m_origin;
+ /** Responsible for routing of subnodes into and out of the node. */
+ KPlayerSource* m_source;
+ /** Maps node ids to pointers for quick lookup. */
+ KPlayerNodeMap m_node_map;
+ /** Names and counts of subnode attributes. */
+ KPlayerPropertyCounts m_attribute_counts;
+};
+
+/**Temporary node.
+ *@author kiriuja
+ */
+class KPlayerTemporaryNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerTemporaryNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerTemporaryNode();
+
+ /** Creates and returns a temporary item node. */
+ KPlayerNode* temporaryItem (const QString& id);
+};
+
+/**Root node.
+ *@author kiriuja
+ */
+class KPlayerRootNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerRootNode (void);
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerRootNode();
+
+ /** Node URL. Gives node location in the hierarchy. */
+ virtual KURL url (void) const;
+
+ /** Temporary node. */
+ KPlayerTemporaryNode* temporaryNode (void) const
+ { return m_temp; }
+
+ /** Returns the list of default IDs. */
+ const QStringList& defaultIds (void)
+ { return m_default_ids; }
+
+ /** Returns a node from the hierarchy given a URL. */
+ KPlayerContainerNode* getNodeByUrl (const KURL& url);
+
+protected:
+ /** Initializes the node children. */
+ virtual void setupSource (void);
+
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+
+ /** List of default IDs. */
+ QStringList m_default_ids;
+ /** Map of standard nodes. */
+ KPlayerContainerNodeMap m_defaults;
+ /** External node map. */
+ KPlayerContainerNodeMap m_externals;
+ /** Temporary node. */
+ KPlayerTemporaryNode* m_temp;
+};
+
+/**Directory node.
+ *@author kiriuja
+ */
+class KPlayerDirectoryNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerDirectoryNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerDirectoryNode();
+
+ /** Returns whether the node is a directory. */
+ virtual bool isDirectory (void) const;
+
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+
+ /** Returns whether custom order is allowed. */
+ virtual bool allowsCustomOrder (void) const;
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new leaf node with the given id. */
+ virtual KPlayerNode* createLeaf (const QString& id);
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+};
+
+/**External node.
+ *@author kiriuja
+ */
+class KPlayerExternalNode : public KPlayerDirectoryNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerExternalNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerExternalNode();
+
+ /** Node URL. Gives node location in the hierarchy. */
+ virtual KURL url (void) const;
+};
+
+/**Group node.
+ *@author kiriuja
+ */
+class KPlayerGroupNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerGroupNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerGroupNode();
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Returns whether the node is a group. */
+ virtual bool isGroup (void) const;
+
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+};
+
+/**Collection node.
+ *@author kiriuja
+ */
+class KPlayerCollectionNode : public KPlayerGroupNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerCollectionNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerCollectionNode();
+
+ /** Returns whether the node is a collection group. */
+ virtual bool isCollection (void) const;
+
+ /** Returns whether the given node can be linked into this container. */
+ virtual bool canLink (KPlayerContainerNode* node) const;
+
+ /** Returns whether custom order is allowed. */
+ virtual bool allowsCustomOrder (void) const;
+
+#if 0
+ /** The key that is used to create group nodes. */
+ const QString& groupingKey (void) const
+ { return media() -> groupingKey(); }
+ /** Returns whether the node is grouped. */
+ bool isGrouped (void) const
+ { return (! origin() || ! origin() -> canGroup()) && ! groupingKey().isEmpty(); }
+
+ /** Parent's grouping key. */
+ const QString& parentKey (void) const
+ { return parent() -> canGroup() ? ((KPlayerCollectionNode*) parent()) -> groupingKey() : QString::null; }
+ /** Returns whether the node is grouped. */
+ bool isParentGrouped (void) const
+ { return parent() -> canGroup() && ((KPlayerCollectionNode*) parent()) -> isGrouped(); }
+
+ /** Groups the subnodes by key. */
+ void group (const QString& key);
+ /** Groups the subnodes by folder. */
+ void ungroup (void)
+ { group (QString::null); }
+ /** Flattens the subnode hierarchy. */
+ void flatten (void)
+ { group (""); }
+#endif
+
+protected:
+ /** Initializes the node origin. */
+ virtual void setupOrigin (void);
+
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+};
+
+/**Playlist node.
+ *@author kiriuja
+ */
+class KPlayerPlaylistNode : public KPlayerGroupNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerPlaylistNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerPlaylistNode();
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Returns whether the given node can be linked into this container. */
+ virtual bool canLink (KPlayerContainerNode* node) const;
+
+ /** Indicates whether duplicates are acceptable. */
+ virtual bool acceptsDuplicates (void) const;
+
+ /** Indicates whether the node is a playlist. */
+ virtual bool isPlaylist (void) const;
+
+ /** Releases the origin and switches to store source. */
+ virtual void releaseOrigin (void);
+
+protected slots:
+ /** Removes duplicate nodes if needed. */
+ virtual void configurationUpdated (void);
+
+ /** Receives updated signal from the origin and updates media if needed. */
+ void originUpdated (KPlayerContainerNode*, KPlayerNode* node);
+
+protected:
+ /** Initializes the node origin. */
+ virtual void setupOrigin (void);
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+
+ /** Duplicate indicator. */
+ bool m_duplicates;
+};
+
+/**Now playing node.
+ *@author kiriuja
+ */
+class KPlayerNowPlayingNode : public KPlayerPlaylistNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerNowPlayingNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerNowPlayingNode();
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Returns whether the node is a now playing group. */
+ virtual bool isNowPlaying (void) const;
+
+ /** Returns whether the given node can be linked into this container. */
+ virtual bool canLink (KPlayerContainerNode* node) const;
+
+protected slots:
+ /** Receives updated signal from the origin and updates media if needed. */
+ void originUpdated (KPlayerContainerNode*, KPlayerNode* node);
+
+protected:
+ /** Initializes the node origin. */
+ virtual void setupOrigin (void);
+
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+};
+
+/**Recent node.
+ *@author kiriuja
+ */
+class KPlayerRecentNode : public KPlayerPlaylistNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerRecentNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerRecentNode();
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Indicates whether the node is a recent node. */
+ virtual bool isRecent (void) const;
+
+ /** Returns whether the given node can be linked into this container. */
+ virtual bool canLink (KPlayerContainerNode* node) const;
+
+protected:
+ /** Creates a new branch node with the given id. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+};
+
+/**Recents node.
+ *@author kiriuja
+ */
+class KPlayerRecentsNode : public KPlayerRecentNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerRecentsNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerRecentsNode();
+
+ /** Adds the given nodes to this node as a single node, linking to the origin. */
+ void addRecent (const KPlayerNodeList& nodes);
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Removes excess nodes. */
+ virtual void configurationUpdated (void);
+};
+
+/**Devices node.
+ *@author kiriuja
+ */
+class KPlayerDevicesNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerDevicesNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerDevicesNode();
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Indicates whether the node is the device list. */
+ virtual bool isDevices (void) const;
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+ /** Returns whether the node can be saved as a playlist. */
+ virtual bool canSaveAsPlaylist (void) const;
+
+ /** Returns whether the initial listing is complete. */
+ bool complete (void) const
+ { return m_complete; }
+
+ /** Returns a node for the given ID from the node list. */
+ KPlayerDeviceNode* nodeById (const QString& id)
+ { return (KPlayerDeviceNode*) KPlayerContainerNode::nodeById (id); }
+ /** Returns a node at the given path if it exists. */
+ virtual KPlayerContainerNode* getNodeByPath (const QString& path);
+
+ /** Source of subnodes. */
+ KPlayerDevicesSource* source (void) const
+ { return (KPlayerDevicesSource*) m_source; }
+
+ /** Returns the list of device paths. */
+ const QStringList& devices (void)
+ { return m_devices; }
+
+ /** Returns the type of the given device. */
+ const QString& deviceType (const QString& id)
+ { return m_type_map [id]; }
+
+ /** Returns the suggested name of the given device. */
+ const QString& deviceName (const QString& id)
+ { return m_name_map [id]; }
+
+ /** Returns the disk type in the given device. */
+ const QString& diskType (const QString& id)
+ { return m_disk_types [id]; }
+
+ /** Updates the list of devices. */
+ void update (void);
+ /** Updates the list of devices and nodes. */
+ void dirty (void);
+
+ /** Refreshes the given item. */
+ void refreshItem (KFileItem* item);
+
+ /** Removes the given nodes from the list of nodes. */
+ virtual void removed (const KPlayerNodeList& nodes);
+
+protected slots:
+ /** Refreshes all items. */
+ void completed (void);
+ /** Refreshes the given items. */
+ void refresh (const KFileItemList &entries);
+ /** Removes the given item. */
+ void removed (KFileItem *fileItem);
+ /** Receives dirty signal from directory watch. */
+ void dirty (const QString& path);
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+
+ /** Updates the list of devices. */
+ void update (QStringList& current, QStringList& previous);
+ /** Adds device names based on the given numeric map. */
+ void addToNameMap (QMap<QString, int>& map, const QString& device, const QString& deviceno);
+
+ /** Device paths. */
+ QStringList m_devices;
+ /** Device types. */
+ QMap<QString, QString> m_type_map;
+ /** Device names. */
+ QMap<QString, QString> m_name_map;
+ /** Disk types. */
+ QMap<QString, QString> m_disk_types;
+
+ /** Directory. */
+ QDir m_directory;
+ /** Directory watch. */
+ KDirWatch m_watch;
+ /** Media directory lister. */
+ KDirLister m_lister;
+ /** Indicates whether the initial listing is complete. */
+ bool m_complete;
+};
+
+/**Device node.
+ *@author kiriuja
+ */
+class KPlayerDeviceNode : public KPlayerContainerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerDeviceNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerDeviceNode();
+
+ /** Parent node. */
+ KPlayerDevicesNode* parent (void) const
+ { return (KPlayerDevicesNode*) m_parent; }
+ /** Source of subnodes. */
+ KPlayerDeviceSource* source (void) const
+ { return (KPlayerDeviceSource*) m_source; }
+ /** Media properties. */
+ KPlayerDeviceProperties* media (void) const
+ { return (KPlayerDeviceProperties*) m_media; }
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+ /** Returns open icon name. */
+ virtual QString openIcon (void) const;
+
+ /** Returns whether the node has media properties. */
+ virtual bool hasProperties (void) const;
+
+ /** Returns whether custom order is allowed. */
+ virtual bool allowsCustomOrder (void) const;
+
+ /** Returns whether the device is a disk device. */
+ virtual bool diskDevice (void);
+
+ /** Removes the node and all subnodes. */
+ virtual void removed (void);
+};
+
+/**Disk node.
+ *@author kiriuja
+ */
+class KPlayerDiskNode : public KPlayerDeviceNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerDiskNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerDiskNode();
+
+ /** Returns whether the node is ready for playing. */
+ virtual bool ready (void) const;
+
+ /** Suggested identifier for a copy of this node. */
+ virtual QString suggestId (void) const;
+
+ /** Source of subnodes. */
+ KPlayerDiskSource* source (void) const
+ { return (KPlayerDiskSource*) m_source; }
+
+ /** Returns the device properties. */
+ KPlayerDeviceProperties* device (void) const
+ { return m_device; }
+ /** Returns the disk properties. */
+ KPlayerDiskProperties* disk (void) const
+ { return m_disk; }
+
+ /** Returns icon name. */
+ virtual QString icon (void) const;
+
+ /** Returns the number of tracks and starts autodetection if needed. */
+ int tracks (void);
+ /** Starts autodetection unconditionally. */
+ void loadDisk (void);
+
+ /** Returns the local path if known. */
+ const QString& localPath (void) const
+ { return m_local_path; }
+ /** Returns whether the local path is known. */
+ bool hasLocalPath (void) const
+ { return ! m_local_path.isEmpty(); }
+ /** Starts the process of local path acquisition. */
+ void getLocalPath (void);
+
+ /** Updates the node with the disk properties. */
+ void diskInserted (const QString& path = QString::null);
+ /** Updates the node with the device properties. */
+ void diskRemoved (void);
+
+ /** Returns whether the device is a disk device. */
+ virtual bool diskDevice (void);
+ /** Returns whether the disk is of a media type. */
+ bool mediaDisk (void);
+ /** Returns whether the disk is of a data type. */
+ bool dataDisk (void);
+
+protected slots:
+ /** Processes the result of a list job. */
+ void listResult (KIO::Job* job);
+ /** Processes the result of a mount job. */
+ void mountResult (KIO::Job* job);
+ /** Processes the result of a stat job. */
+ void pathResult (KIO::Job* job);
+ /** Processes the result of a stat job. */
+ void statResult (KIO::Job* job);
+
+ /** Processes an MPlayer output line. */
+ void receivedOutput (KPlayerLineOutputProcess*, char*, int);
+ /** Finishes refreshing lists. */
+ void processExited (KProcess*);
+
+ /** Processes an MPlayer output line. */
+ void receivedCddbOutput (KPlayerLineOutputProcess*, char*, int);
+ /** Deletes the process. */
+ void cddbProcessExited (KProcess*);
+
+protected:
+ /** Initializes the node media. */
+ virtual void setupMedia (void);
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new leaf node with the given id. */
+ virtual KPlayerNode* createLeaf (const QString& id);
+
+ /** Starts disk autodetection. */
+ void autodetect (void);
+ /** Wraps up autodetection. */
+ void autodetected (void);
+ /** Updates track nodes. */
+ void updateTracks (void);
+
+ /** Identifies the disk and returns its properties. */
+ bool accessDisk (void);
+ /** Updates the node with the disk properties. */
+ void diskDetected (const QString& diskid);
+
+ /** Sets the disk type and updates the default name. */
+ void setDiskType (const QString& type);
+
+ /** Disk properties. */
+ KPlayerDeviceProperties* m_device;
+ /** Disk properties. */
+ KPlayerDiskProperties* m_disk;
+ /** Track lengths. */
+ QValueList<float> m_track_lengths;
+ /** URL currently being autodetected. */
+ QString m_url;
+ /** Audio CD disk ID. */
+ QString m_disk_id;
+ /** Audio CD disk ID for matching against the one above. */
+ QString m_cddb_id;
+ /** Number of detected tracks. */
+ uint m_detected_tracks;
+ /** Indicates autodetection success. */
+ bool m_autodetected;
+ /** Artist. */
+ QString m_artist;
+ /** Album. */
+ QString m_album;
+ /** Year. */
+ int m_year;
+ /** Genre. */
+ QString m_genre;
+ /** Fast autodetect when type is known from media slave. */
+ bool m_fast_autodetect;
+ /** Local path. */
+ QString m_local_path;
+};
+
+/**Tuner node.
+ *@author kiriuja
+ */
+class KPlayerTunerNode : public KPlayerDeviceNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerTunerNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerTunerNode();
+
+ /** Source of subnodes. */
+ KPlayerTunerSource* source (void) const
+ { return (KPlayerTunerSource*) m_source; }
+ /** Media properties. */
+ KPlayerTunerProperties* media (void) const
+ { return (KPlayerTunerProperties*) m_media; }
+
+protected slots:
+ /** Checks if the channel list has changed and updates subnodes as necessary. */
+ virtual void updated (void);
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new leaf node with the given id. */
+ virtual KPlayerNode* createLeaf (const QString& id);
+
+ /** Current channel list. */
+ QString m_channel_list;
+};
+
+/**TV node.
+ *@author kiriuja
+ */
+class KPlayerTVNode : public KPlayerTunerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerTVNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerTVNode();
+
+ /** Media properties. */
+ KPlayerTVProperties* media (void) const
+ { return (KPlayerTVProperties*) m_media; }
+
+protected:
+ /** Initializes the node media. */
+ virtual void setupMedia (void);
+};
+
+/**DVB node.
+ *@author kiriuja
+ */
+class KPlayerDVBNode : public KPlayerTunerNode
+{
+ Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerDVBNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerDVBNode();
+
+ /** Media properties. */
+ KPlayerDVBProperties* media (void) const
+ { return (KPlayerDVBProperties*) m_media; }
+
+protected:
+ /** Initializes the node media. */
+ virtual void setupMedia (void);
+};
+
+#if 0
+/**Searches node.
+ *@author kiriuja
+ */
+class KPlayerSearchesNode : public KPlayerContainerNode
+{
+ //Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerSearchesNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerSearchesNode();
+
+ /** Returns whether the node can be renamed. */
+ virtual bool canRename (void) const;
+
+protected:
+ /** Creates a new branch node with the given id and origin. */
+ virtual KPlayerContainerNode* createBranch (const QString& id, KPlayerContainerNode* origin = 0);
+};
+
+/**Search node.
+ *@author kiriuja
+ */
+class KPlayerSearchNode : public KPlayerGroupNode
+{
+ //Q_OBJECT
+
+public:
+ /** Default constructor. Initializes the node. */
+ KPlayerSearchNode (void) { }
+ /** Destructor. Frees resources. */
+ virtual ~KPlayerSearchNode();
+
+ /** Returns whether custom order is allowed. */
+ virtual bool allowsCustomOrder (void) const;
+
+protected:
+ /** Initializes the node source. */
+ virtual void setupSource (void);
+
+ /** Creates a new leaf node with the given id. */
+ virtual KPlayerNode* createLeaf (const QString& id);
+};
+#endif
+
+#endif