File indexing completed on 2024-04-21 12:25:32

0001 /*
0002     This file belong to the KMPlayer project, a movie player plugin for Konqueror
0003     SPDX-FileCopyrightText: 2009 Koos Vriezen <koos.vriezen@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #ifndef _KMPLAYER_LISTS_H_
0009 #define _KMPLAYER_LISTS_H_
0010 
0011 #include <config-kmplayer.h>
0012 
0013 #include <QProcess>
0014 
0015 #include "kmplayerplaylist.h"
0016 #include "kmplayerpartbase.h"
0017 
0018 static const short id_node_recent_document = 31;
0019 static const short id_node_recent_node = 32;
0020 static const short id_node_disk_document = 33;
0021 static const short id_node_disk_node = 34;
0022 static const short id_node_gen_generator = 36;
0023 static const short id_node_gen_input = 37;
0024 static const short id_node_gen_uri = 38;
0025 static const short id_node_gen_literal = 39;
0026 static const short id_node_gen_ask = 40;
0027 static const short id_node_gen_title = 41;
0028 static const short id_node_gen_description = 42;
0029 static const short id_node_gen_process = 43;
0030 static const short id_node_gen_program = 44;
0031 static const short id_node_gen_argument = 45;
0032 static const short id_node_gen_predefined = 46;
0033 static const short id_node_gen_document = 47;
0034 static const short id_node_gen_http_get = 48;
0035 static const short id_node_gen_http_key_value = 49;
0036 static const short id_node_gen_sequence = 50;
0037 
0038 class QTextStream;
0039 class KMPlayerApp;
0040 
0041 class ListsSource : public KMPlayer::URLSource
0042 {
0043 public:
0044     ListsSource (KMPlayer::PartBase * p)
0045         : KMPlayer::URLSource (p, QUrl ("lists://")) {}
0046     void play (KMPlayer::Mrl *) override;
0047     void activate () override;
0048     QString prettyName () override;
0049 };
0050 
0051 class FileDocument : public KMPlayer::SourceDocument
0052 {
0053 public:
0054     FileDocument (short id, const QString&, KMPlayer::Source *source = nullptr);
0055     KMPlayer::Node *childFromTag (const QString &tag) override;
0056     void readFromFile (const QString &file);
0057     void writeToFile (const QString &file);
0058     void sync (const QString & file);
0059     unsigned int load_tree_version;
0060 };
0061 
0062 class Recents : public FileDocument
0063 {
0064 public:
0065     Recents (KMPlayerApp *a);
0066     void defer () override;
0067     void activate () override;
0068     void message (KMPlayer::MessageType msg, void *content=nullptr) override;
0069     KMPlayer::Node *childFromTag (const QString &tag) override;
0070     const char *nodeName () const override { return "playlist"; }
0071     KMPlayerApp *app;
0072 };
0073 
0074 class Recent : public KMPlayer::Mrl
0075 {
0076 public:
0077     Recent (KMPlayer::NodePtr & doc, KMPlayerApp *a, const QString &url = QString());
0078     void activate () override;
0079     void closed () override;
0080     const char *nodeName () const override { return "item"; }
0081     KMPlayerApp *app;
0082 };
0083 
0084 class Group
0085  : public KMPlayer::Element, public KMPlayer::PlaylistRole
0086 {
0087 public:
0088     Group (KMPlayer::NodePtr &doc, KMPlayerApp *a, const QString &pn=QString());
0089     KMPlayer::Node *childFromTag (const QString &tag) override;
0090     void defer () override {} // TODO lazy loading of largish sub trees
0091     void closed () override;
0092     void *role (KMPlayer::RoleType msg, void *content=nullptr) override;
0093     const char *nodeName () const override { return "group"; }
0094     KMPlayerApp *app;
0095 };
0096 
0097 class Playlist : public FileDocument
0098 {
0099 public:
0100     Playlist (KMPlayerApp *a, KMPlayer::Source *s, bool plmod = false);
0101     void message (KMPlayer::MessageType msg, void *content=nullptr) override;
0102     void defer () override;
0103     void activate () override;
0104     KMPlayer::Node *childFromTag (const QString &tag) override;
0105     const char * nodeName () const override { return "playlist"; }
0106     KMPlayerApp *app;
0107     bool playmode;
0108 };
0109 
0110 class PlaylistItemBase : public KMPlayer::Mrl
0111 {
0112 public:
0113     PlaylistItemBase (KMPlayer::NodePtr &d, short id, KMPlayerApp *a, bool pm);
0114     void activate () override;
0115     void closed () override;
0116     KMPlayerApp *app;
0117     bool playmode;
0118 };
0119 
0120 class PlaylistItem : public PlaylistItemBase
0121 {
0122 public:
0123     PlaylistItem (KMPlayer::NodePtr & doc, KMPlayerApp *a, bool playmode, const QString &url = QString());
0124     void closed () override;
0125     void begin () override;
0126     void setNodeName (const QString&) override;
0127     const char *nodeName () const override { return "item"; }
0128 };
0129 
0130 class PlaylistGroup
0131  : public KMPlayer::Element, public KMPlayer::PlaylistRole
0132 {
0133 public:
0134     PlaylistGroup (KMPlayer::NodePtr &doc, KMPlayerApp *a, const QString &pn);
0135     PlaylistGroup (KMPlayer::NodePtr &doc, KMPlayerApp *a, bool plmode=false);
0136     KMPlayer::Node *childFromTag (const QString &tag) override;
0137     void closed () override;
0138     void *role (KMPlayer::RoleType msg, void *content=nullptr) override;
0139     void setNodeName (const QString&) override;
0140     const char *nodeName () const override { return "group"; }
0141     KMPlayerApp *app;
0142     bool playmode;
0143 };
0144 
0145 class HtmlObject : public PlaylistItemBase
0146 {
0147 public:
0148     HtmlObject (KMPlayer::NodePtr &doc, KMPlayerApp *a, bool playmode);
0149     void activate () override;
0150     void closed () override;
0151     KMPlayer::Node *childFromTag (const QString &tag) override;
0152     const char *nodeName () const override { return "object"; }
0153 };
0154 
0155 class Generator : public QObject, public FileDocument
0156 {
0157     Q_OBJECT
0158 public:
0159     Generator (KMPlayerApp *a);
0160     void activate () override;
0161     void begin () override;
0162     void deactivate () override;
0163     void message (KMPlayer::MessageType msg, void *content=nullptr) override;
0164     KMPlayer::Node *childFromTag (const QString &tag) override;
0165     const char *nodeName () const override { return "generator"; }
0166 
0167 private Q_SLOTS:
0168     void started ();
0169     void error (QProcess::ProcessError err);
0170     void readyRead ();
0171     void finished ();
0172 
0173 private:
0174     struct ProgramCmd
0175     {
0176         QString program;
0177         QStringList args;
0178         bool isEmpty() const { return program.isEmpty(); }
0179         QString toString() const;
0180     };
0181     ProgramCmd genReadProgramCmd (KMPlayer::Node *n);
0182     QString genReadInput (KMPlayer::Node *n);
0183     QString genReadString (KMPlayer::Node *n);
0184     QString genReadUriGet (KMPlayer::Node *n);
0185     QString genReadAsk (KMPlayer::Node *n);
0186 
0187     KMPlayerApp *app;
0188     QProcess *qprocess;
0189     QTextStream *data;
0190     ProgramCmd process;
0191     QString buffer;
0192     bool canceled;
0193     bool quote;
0194 };
0195 
0196 class GeneratorElement : public KMPlayer::Element
0197 {
0198 public:
0199     GeneratorElement (KMPlayer::NodePtr &doc, const QString &t, short id)
0200         : KMPlayer::Element (doc, id), tag (t.toUtf8 ()) {}
0201     KMPlayer::Node *childFromTag (const QString &tag) override;
0202     const char *nodeName () const override { return tag.constData (); }
0203     QByteArray tag;
0204 };
0205 
0206 #endif