File indexing completed on 2024-05-05 04:56:10

0001 /*
0002     SPDX-FileCopyrightText: 2002-2003 Koos Vriezen <koos.vriezen@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #ifndef KMPLAYER_PART_H
0008 #define KMPLAYER_PART_H
0009 
0010 #include <KPluginFactory>
0011 #include <KParts/BrowserExtension>
0012 #include <KParts/LiveConnectExtension>
0013 #include <kcoreaddons_version.h>
0014 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 77, 0)
0015 #include <KAboutData>
0016 #endif
0017 #include "kmplayerpartbase.h"
0018 #include "config-kmplayer.h"
0019 
0020 
0021 class QLabel;
0022 class KMPlayerPart;
0023 class JSCommandEntry;
0024 namespace KMPlayer {
0025     class PlayListNotify;
0026 }
0027 
0028 class KMPlayerFactory : public KPluginFactory {
0029     Q_OBJECT
0030     Q_PLUGIN_METADATA(IID "org.kde.KPluginFactory" FILE "kmplayer_part.json")
0031     Q_INTERFACES(KPluginFactory)
0032 public:
0033     KMPlayerFactory();
0034     ~KMPlayerFactory() override;
0035 
0036     QObject* create(const char *iface, QWidget* parentWidget, QObject* parent,
0037             const QVariantList& args, const QString& keyword) Q_DECL_OVERRIDE;
0038 #if KCOREADDONS_VERSION < QT_VERSION_CHECK(5, 77, 0)
0039     static KAboutData& aboutData();
0040 private:
0041     static KAboutData* s_about;
0042 #endif
0043 };
0044 
0045 /*
0046  * Document to get first frame for streams starting with a picture
0047  */
0048 class GrabDocument : public KMPlayer::SourceDocument
0049 {
0050 public:
0051     GrabDocument (KMPlayerPart *part, const QString &url, const QString &file,
0052             KMPlayer::PlayListNotify *);
0053 
0054     void activate () override;
0055     void undefer () override;
0056     void begin () override;
0057     void message (KMPlayer::MessageType msg, void *content) override;
0058 
0059     QString m_grab_file;
0060     KMPlayerPart *m_part;
0061 };
0062 
0063 /*
0064  * Part notifications to hosting application
0065  */
0066 class KMPlayerBrowserExtension : public KParts::BrowserExtension
0067 {
0068     Q_OBJECT
0069 public:
0070     KMPlayerBrowserExtension(KMPlayerPart *parent);
0071     ~KMPlayerBrowserExtension () override {}
0072     void urlChanged (const QString & url);
0073     void setLoadingProgress (int percentage);
0074 
0075     void saveState (QDataStream & stream) override;
0076     void restoreState (QDataStream & stream) override;
0077     void requestOpenURL (const QUrl & url, const QString & target, const QString & service);
0078 };
0079 
0080 /*
0081  * Part javascript support
0082  */
0083 class KMPlayerLiveConnectExtension : public KParts::LiveConnectExtension
0084 {
0085     Q_OBJECT
0086 public:
0087     KMPlayerLiveConnectExtension (KMPlayerPart * parent);
0088     ~KMPlayerLiveConnectExtension () override;
0089 
0090     // LiveConnect interface
0091     bool get (const unsigned long, const QString &,
0092             KParts::LiveConnectExtension::Type &, unsigned long &, QString &) override;
0093     bool put (const unsigned long, const QString &, const QString &) override;
0094     bool call (const unsigned long, const QString &,
0095             const QStringList &, KParts::LiveConnectExtension::Type &, 
0096             unsigned long &, QString &) override;
0097     void unregister (const unsigned long) override;
0098     void sendEvent(const unsigned long objid, const QString & event, const KParts::LiveConnectExtension::ArgList & args ) {
0099         Q_EMIT partEvent(objid, event, args);
0100     }
0101 
0102     void enableFinishEvent (bool b = true) { m_enablefinish = b; }
0103     QString evaluate (const QString & script);
0104 Q_SIGNALS:
0105     void partEvent (const unsigned long, const QString &,
0106                     const KParts::LiveConnectExtension::ArgList &);
0107     void requestGet (const uint32_t, const QString &, QString *);
0108     void requestCall (const uint32_t, const QString &, const QStringList &, QString *);
0109 public Q_SLOTS:
0110     void setSize (int w, int h);
0111     void started ();
0112     void finished ();
0113     void handleEvaluateRequest (const QString & script, bool store, QString & result);
0114 private:
0115     KMPlayerPart * player;
0116     QString script_result;
0117     QString m_allow;
0118     QStringList redir_funcs;
0119     const JSCommandEntry * lastJSCommandEntry;
0120     unsigned int object_counter;
0121     bool m_started;
0122     bool m_enablefinish;
0123     bool m_evaluating;
0124     bool m_skip_put;
0125 };
0126 
0127 
0128 /*
0129  * Part that gets created when used a KPart
0130  */
0131 class KMPlayerPart : public KMPlayer::PartBase
0132 {
0133     Q_OBJECT
0134     friend struct GroupPredicate;
0135 public:
0136     enum Features {
0137         Feat_Unknown = 0,
0138         Feat_Viewer = 0x01, Feat_Controls = 0x02,
0139         Feat_Label = 0x04, Feat_StatusBar = 0x08,
0140         Feat_InfoPanel = 0x10, Feat_VolumeSlider = 0x20, Feat_PlayList = 0x40,
0141         Feat_ImageWindow = 0x80, Feat_All = 0xff
0142     };
0143 #if KCOREADDONS_VERSION >= QT_VERSION_CHECK(5, 77, 0)
0144     KMPlayerPart(QWidget* parentWidget, QObject* parent, const KPluginMetaData& metaData, const QVariantList &args);
0145 #else
0146     KMPlayerPart (QWidget *wparent, QObject *parent, const QVariantList &args);
0147 #endif
0148     ~KMPlayerPart () override;
0149 
0150     KMPlayerBrowserExtension * browserextension() const
0151         { return m_browserextension; }
0152     KMPlayerLiveConnectExtension * liveconnectextension () const
0153         { return m_liveconnectextension; }
0154     bool hasFeature (int f) { return m_features & f; }
0155     bool allowRedir (const QUrl & url) const;
0156     void connectToPart (KMPlayerPart *);
0157     KMPlayerPart * master () const { return m_master; }
0158     void setMaster (KMPlayerPart * m) { m_master = m; }
0159     void setLoaded (int percentage) override;
0160     bool openNewURL (const QUrl & url); // for JS interface
0161     /// @param pic local file path to a placeholder image
0162     bool startUrl (const QUrl &url, const QString &pic=QString ());//clickToPlay
0163 
0164     QString doEvaluate (const QString &script) override;
0165 
0166     using KMPlayer::PartBase::openUrl;
0167 public Q_SLOTS:
0168     bool openUrl(const QUrl& url) override;
0169     void openUrl(const QUrl&, const QString& t, const QString& srv) override;
0170     bool closeUrl () override;
0171     void setMenuZoom (int id);
0172 protected:
0173     void processCreated (KMPlayer::Process *) override;
0174     void playingStarted () override;
0175     void playingStopped () override;
0176 protected Q_SLOTS:
0177     void viewerPartDestroyed (QObject *);
0178     void viewerPartProcessChanged (const char *);
0179     void viewerPartSourceChanged (KMPlayer::Source *, KMPlayer::Source *);
0180     void waitForImageWindowTimeOut ();
0181     void statusPosition (int pos, int length);
0182     void nppLoaded ();
0183 #ifndef KMPLAYER_WITH_CAIRO
0184     void pictureClicked ();
0185 #endif
0186 private:
0187     void setAutoControls (bool);
0188     KMPlayerPart * m_master;
0189     KMPlayerBrowserExtension * m_browserextension;
0190     KMPlayerLiveConnectExtension * m_liveconnectextension;
0191     QLabel* m_playtime_info;
0192     QString m_group;
0193     QString m_src_url;
0194     QString m_href_url;
0195     QString m_file_name;
0196     QString m_grab_file;
0197     QString m_target;
0198     int m_expected_view_width;
0199     int m_expected_view_height;
0200     int m_features;
0201     int last_time_left;
0202     bool m_started_emited : 1;
0203     bool m_wait_npp_loaded : 1;
0204     //bool m_noresize : 1;
0205 };
0206 
0207 
0208 #endif