You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmplayer/src/kmplayer_part.cpp

1208 lines
54 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/**
* Copyright (C) 2002-2003 by Koos Vriezen <koos.vriezen@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* 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 Steet, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#ifdef KDE_USE_FINAL
#undef Always
#endif
#include <list>
#include <algorithm>
#include <config.h>
#include <tqpopupmenu.h>
#include <tqtimer.h>
#include <tqpushbutton.h>
#include <tqslider.h>
class KXMLGUIClient; // workaround for trinity.3 on sarge with gcc4, tdeactioncollection.h does not forward declare KXMLGUIClient
#include <klibloader.h>
#include <kdebug.h>
#include <tdeconfig.h>
#include <ksimpleconfig.h>
#include <tdeaction.h>
#include <tdeapplication.h>
#include <tdelocale.h>
#include <kinstance.h>
#include <tdeparts/factory.h>
#include <kstaticdeleter.h>
#include <kstatusbar.h>
#include "kmplayer_part.h"
#include "kmplayerview.h"
#include "viewarea.h"
#include "kmplayercontrolpanel.h"
#include "kmplayerconfig.h"
#include "kmplayerprocess.h"
using namespace KMPlayer;
typedef std::list <KMPlayerPart *> KMPlayerPartList;
struct KMPLAYER_NO_EXPORT KMPlayerPartStatic {
KMPlayerPartStatic ();
~KMPlayerPartStatic ();
KMPlayerPartList partlist;
};
static KMPlayerPartStatic * kmplayerpart_static = 0L;
KDE_NO_CDTOR_EXPORT KMPlayerPartStatic::KMPlayerPartStatic () {
StringPool::init ();
}
KDE_NO_CDTOR_EXPORT KMPlayerPartStatic::~KMPlayerPartStatic () {
kmplayerpart_static = 0L;
StringPool::reset ();
// delete map content
}
struct KMPLAYER_NO_EXPORT GroupPredicate {
const KMPlayerPart * m_part;
const TQString & m_group;
bool m_get_any;
GroupPredicate(const KMPlayerPart *part, const TQString &group, bool b=false)
: m_part (part), m_group (group), m_get_any (b) {}
bool operator () (const KMPlayerPart * part) const {
return ((m_get_any && part != m_part &&
!part->master () && !part->url ().isEmpty ()) ||
(m_part->allowRedir (part->m_docbase) &&
(part->m_group == m_group ||
part->m_group == TQString::fromLatin1("_master") ||
m_group == TQString::fromLatin1("_master")) &&
(part->m_features & KMPlayerPart::Feat_Viewer) !=
(m_part->m_features & KMPlayerPart::Feat_Viewer)));
}
};
static KStaticDeleter <KMPlayerPartStatic> kmplayerpart_staticdeleter;
//-----------------------------------------------------------------------------
class KMPlayerFactory : public KParts::Factory {
public:
KMPlayerFactory ();
virtual ~KMPlayerFactory ();
virtual KParts::Part *createPartObject
(TQWidget *wparent, const char *wname,
TQObject *parent, const char *name,
const char *className, const TQStringList &args);
static TDEInstance * instance () { return s_instance; }
private:
static TDEInstance * s_instance;
};
K_EXPORT_COMPONENT_FACTORY (libkmplayerpart, KMPlayerFactory)
TDEInstance *KMPlayerFactory::s_instance = 0;
KDE_NO_CDTOR_EXPORT KMPlayerFactory::KMPlayerFactory () {
s_instance = new TDEInstance ("kmplayer");
}
KDE_NO_CDTOR_EXPORT KMPlayerFactory::~KMPlayerFactory () {
delete s_instance;
}
KDE_NO_EXPORT KParts::Part *KMPlayerFactory::createPartObject
(TQWidget *wparent, const char *wname,
TQObject *parent, const char * name,
const char * cls, const TQStringList & args) {
kdDebug() << "KMPlayerFactory::createPartObject " << cls << endl;
return new KMPlayerPart (wparent, wname, parent, name, args);
}
//-----------------------------------------------------------------------------
static bool getBoolValue (const TQString & value) {
return (value.lower() != TQString::fromLatin1("false") &&
value.lower() != TQString::fromLatin1("off") &&
value.lower() != TQString::fromLatin1("0"));
}
#define SET_FEAT_ON(f) { m_features |= f; turned_off_features &= ~f; }
#define SET_FEAT_OFF(f) { m_features &= ~f; turned_off_features |= f; }
KDE_NO_CDTOR_EXPORT KMPlayerPart::KMPlayerPart (TQWidget * wparent, const char *wname,
TQObject * parent, const char *name, const TQStringList &args)
: PartBase (wparent, wname, parent, name, new TDEConfig ("kmplayerrc")),
m_master (0L),
m_browserextension (new KMPlayerBrowserExtension (this)),
m_liveconnectextension (new KMPlayerLiveConnectExtension (this)),
m_features (Feat_Unknown),
m_started_emited (false),
m_havehref (false) {
kdDebug () << "KMPlayerPart(" << this << ")::KMPlayerPart ()" << endl;
bool show_fullscreen = false;
if (!kmplayerpart_static)
kmplayerpart_static = kmplayerpart_staticdeleter.setObject (new KMPlayerPartStatic ());
setInstance (KMPlayerFactory::instance (), true);
init (actionCollection ());
m_sources ["hrefsource"] = (new KMPlayerHRefSource (this));
#ifdef HAVE_NSPR
KMPlayer::NpPlayer *npp = (KMPlayer::NpPlayer *) players () ["npp"];
connect (npp, TQT_SIGNAL (evaluate (const TQString &, TQString &)),
m_liveconnectextension, TQT_SLOT (evaluate (const TQString &, TQString &)));
connect (npp, TQT_SIGNAL (openUrl (const KURL &, const TQString &)),
m_browserextension,
TQT_SLOT (slotRequestOpenURL (const KURL &, const TQString &)));
#endif
/*TDEAction *playact =*/ new TDEAction(i18n("P&lay"), TQString ("media-playback-start"), TDEShortcut (), this, TQT_SLOT(play ()), actionCollection (), "play");
/*TDEAction *pauseact =*/ new TDEAction(i18n("&Pause"), TQString ("media-playback-pause"), TDEShortcut (), this, TQT_SLOT(pause ()), actionCollection (), "pause");
/*TDEAction *stopact =*/ new TDEAction(i18n("&Stop"), TQString ("media-playback-stop"), TDEShortcut (), this, TQT_SLOT(stop ()), actionCollection (), "stop");
new TDEAction (i18n ("Increase Volume"), TQString ("player_volume"), TDEShortcut (), this, TQT_SLOT (increaseVolume ()), actionCollection (), "edit_volume_up");
new TDEAction (i18n ("Decrease Volume"), TQString ("player_volume"), TDEShortcut (), this, TQT_SLOT (decreaseVolume ()), actionCollection (), "edit_volume_down");
Source * urlsource = m_sources ["urlsource"];
KMPlayer::ControlPanel * panel = m_view->controlPanel ();
TQStringList::const_iterator it = args.begin ();
TQStringList::const_iterator end = args.end ();
int turned_off_features = 0;
for ( ; it != end; ++it) {
int equalPos = (*it).find("=");
if (equalPos > 0) {
TQString name = (*it).left (equalPos).lower ();
TQString value = (*it).right ((*it).length () - equalPos - 1);
if (value.at(0)=='\"')
value = value.right (value.length () - 1);
if (value.at (value.length () - 1) == '\"')
value.truncate (value.length () - 1);
kdDebug () << "name=" << name << " value=" << value << endl;
if (name == "href") {
urlsource->setURL (KURL (value));
urlsource->setIdentified (false);
m_havehref = true;
} else if (name == TQString::fromLatin1("width")) {
m_noresize = true;
} else if (name == TQString::fromLatin1("height")) {
m_noresize = true;
} else if (name == TQString::fromLatin1("type")) {
urlsource->document ()->mrl ()->mimetype = value;
} else if (name == TQString::fromLatin1("controls")) {
//http://service.real.com/help/library/guides/production8/realpgd.htm?src=noref,rnhmpg_080301,rnhmtn,nosrc
//http://service.real.com/help/library/guides/production8/htmfiles/control.htm
TQStringList sl = TQStringList::split (TQChar (','), value);
TQStringList::const_iterator it = sl.begin ();
const TQStringList::const_iterator e = sl.end ();
for (TQStringList::const_iterator i = sl.begin (); i != e; ++i) {
TQString val_lower ((*i).lower ());
if (val_lower == TQString::fromLatin1("imagewindow")) {
SET_FEAT_ON (Feat_ImageWindow | Feat_Viewer)
} else if (val_lower == TQString::fromLatin1("all")) {
m_features = (Feat_Controls | Feat_StatusBar);
} else if (val_lower == TQString::fromLatin1("tacctrl")) {
SET_FEAT_ON (Feat_Label)
} else if (val_lower == TQString::fromLatin1("controlpanel")) {
SET_FEAT_ON (Feat_Controls)
} else if (val_lower == TQString::fromLatin1("infovolumepanel")){
SET_FEAT_ON (Feat_Controls) // TODO
} else if (val_lower == TQString::fromLatin1("positionfield") ||
val_lower == TQString::fromLatin1("positionslider")) {
setAutoControls (false);
panel->positionSlider ()->show ();
SET_FEAT_ON (Feat_Controls)
} else if ( val_lower == TQString::fromLatin1("homectrl")) {
setAutoControls (false);
panel->button (KMPlayer::ControlPanel::button_config)->show();
} else if (val_lower == TQString::fromLatin1("mutectrl") ||
val_lower == TQString::fromLatin1("mutevolume")) {
setAutoControls (false);
panel->volumeBar()->setMinimumSize (TQSize (20, panel->volumeBar()->minimumSize ().height ()));
panel->volumeBar()->show ();
SET_FEAT_ON (Feat_Controls)
} else if (val_lower == TQString::fromLatin1("rwctrl")) {
setAutoControls (false);
panel->button (KMPlayer::ControlPanel::button_back)->show (); // rewind ?
SET_FEAT_ON (Feat_Controls)
} else if ( val_lower == TQString::fromLatin1("ffctrl")) {
setAutoControls (false);
panel->button(KMPlayer::ControlPanel::button_forward)->show();
m_features = Feat_Controls;
} else if ( val_lower ==TQString::fromLatin1("stopbutton")) {
setAutoControls (false);
panel->button (KMPlayer::ControlPanel::button_stop)->show ();
SET_FEAT_ON (Feat_Controls)
} else if (val_lower == TQString::fromLatin1("playbutton") ||
val_lower ==TQString::fromLatin1("playonlybutton")) {
setAutoControls (false);
panel->button (KMPlayer::ControlPanel::button_play)->show ();
SET_FEAT_ON (Feat_Controls)
} else if (val_lower ==TQString::fromLatin1("pausebutton")) {
setAutoControls (false);
panel->button (KMPlayer::ControlPanel::button_pause)->show ();
SET_FEAT_ON (Feat_Controls)
} else if (val_lower == TQString::fromLatin1("statusbar") ||
val_lower == TQString::fromLatin1("statusfield")) {
SET_FEAT_ON (Feat_StatusBar)
} else if (val_lower == TQString::fromLatin1("infopanel")) {
SET_FEAT_ON (Feat_InfoPanel)
} else if (val_lower == TQString::fromLatin1("playlist")) {
SET_FEAT_ON (Feat_PlayList)
} else if (val_lower==TQString::fromLatin1("volumeslider")) {
SET_FEAT_ON (Feat_VolumeSlider)
setAutoControls (false);
panel->volumeBar()->show ();
panel->volumeBar()->setMinimumSize (TQSize (20, panel->volumeBar()->minimumSize ().height ()));
}
}
} else if (name == TQString::fromLatin1("uimode")) {
TQString val_lower (value.lower ());
if (val_lower == TQString::fromLatin1("full"))
SET_FEAT_ON (Feat_All & ~(Feat_PlayList | Feat_ImageWindow))
// TODO: invisible, none, mini
} else if (name == TQString::fromLatin1("nolabels")) {
SET_FEAT_OFF (Feat_Label)
} else if (name == TQString::fromLatin1("nocontrols")) {
SET_FEAT_OFF (Feat_Controls | Feat_VolumeSlider)
} else if (name == TQString::fromLatin1("showdisplay")) {
// the author name, the clip name, and the copyright information
if (getBoolValue (value))
SET_FEAT_ON (Feat_InfoPanel)
else
SET_FEAT_OFF (Feat_InfoPanel)
} else if (name == TQString::fromLatin1("showcontrols")) {
if (getBoolValue (value))
SET_FEAT_ON (Feat_Viewer | Feat_Controls)
else
SET_FEAT_OFF (Feat_Controls | Feat_VolumeSlider)
} else if (name == TQString::fromLatin1("showstatusbar")) {
if (getBoolValue (value))
SET_FEAT_ON (Feat_Viewer | Feat_StatusBar)
else
SET_FEAT_OFF (Feat_StatusBar)
// else showcaptioning/showgotobar/showpositioncontrols/showtracker
} else if (name == TQString::fromLatin1("console")) {
m_group = value.isEmpty() ? TQString::fromLatin1("_anonymous") : value;
} else if (name == TQString::fromLatin1("__tdehtml__pluginbaseurl")) {
m_docbase = KURL (value);
} else if (name == TQString::fromLatin1("src")) {
m_src_url = value;
} else if (name == TQString::fromLatin1("filename")) {
m_file_name = value;
} else if (name == TQString::fromLatin1 ("fullscreenmode")) {
show_fullscreen = getBoolValue (value);
} else if (name == TQString::fromLatin1 ("autostart")) {
urlsource->setAutoPlay (getBoolValue (value));
}
// volume/clicktoplay/transparentatstart/animationatstart
// autorewind/displaysize/border
if (name.startsWith (TQString::fromLatin1 ("__tdehtml__")))
name = name.mid (9);
convertNode <KMPlayer::Element> (urlsource->document ())->setAttribute (name, value);
}
}
if (turned_off_features) {
if (m_features == Feat_Unknown)
m_features = (Feat_All & ~(Feat_PlayList | Feat_ImageWindow));
m_features &= ~turned_off_features;
}
//KParts::Part::setWidget (m_view);
setXMLFile("kmplayerpartui.rc");
panel->zoomMenu ()->connectItem (KMPlayer::ControlPanel::menu_zoom50,
this, TQT_SLOT (setMenuZoom (int)));
panel->zoomMenu ()->connectItem (KMPlayer::ControlPanel::menu_zoom100,
this, TQT_SLOT (setMenuZoom (int)));
panel->zoomMenu ()->connectItem (KMPlayer::ControlPanel::menu_zoom150,
this, TQT_SLOT (setMenuZoom (int)));
panel->zoomMenu ()->connectItem (KMPlayer::ControlPanel::menu_zoom200,
this, TQT_SLOT (setMenuZoom (int)));
panel->zoomMenu ()->connectItem (KMPlayer::ControlPanel::menu_zoom300,
this, TQT_SLOT (setMenuZoom (int)));
m_view->setNoInfoMessages (m_features != Feat_InfoPanel);
if (m_features == Feat_InfoPanel)
m_view->setInfoPanelOnly ();
else if (m_features == Feat_PlayList)
m_view->setPlaylistOnly ();
else {
if (m_features & Feat_StatusBar)
m_view->setStatusBarMode (KMPlayer::View::SB_Show);
if (m_features & (Feat_Controls | Feat_VolumeSlider))
m_view->setControlPanelMode (m_features & Feat_Viewer ? KMPlayer::View::CP_Show : KMPlayer::View::CP_Only);
else if (m_features & Feat_ImageWindow)
m_view->setControlPanelMode (KMPlayer::View::CP_Hide);
else
m_view->setControlPanelMode (KMPlayer::View::CP_AutoHide);
}
bool group_member = !m_group.isEmpty () && m_group != TQString::fromLatin1("_unique") && m_features != Feat_Unknown;
if (!group_member || m_features & Feat_Viewer) {
// not part of a group or we're the viewer
setProcess ("mplayer");
setRecorder ("mencoder");
connectPanel (m_view->controlPanel ());
if (m_features & Feat_StatusBar) {
last_time_left = 0;
connect (this, TQT_SIGNAL (positioned (int, int)),
this, TQT_SLOT (statusPosition (int, int)));
m_view->statusBar ()->insertItem (TQString ("--:--"), 1, 0, true);
}
}
if (group_member) {
KMPlayerPartList::iterator i =kmplayerpart_static->partlist.begin ();
KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end ();
GroupPredicate pred (this, m_group);
for (i = std::find_if (i, e, pred);
i != e;
i = std::find_if (++i, e, pred)) {
// found viewer and control part, exchange players now
KMPlayerPart * vp = (m_features & Feat_Viewer) ? this : *i;
KMPlayerPart * cp = (m_features & Feat_Viewer) ? *i : this;
setProcess ("mplayer");
cp->connectToPart (vp);
}
} else
m_group.truncate (0);
kmplayerpart_static->partlist.push_back (this);
TQWidget *pwidget = view ()->parentWidget ();
if (pwidget) {
m_view->viewArea()->setPaletteBackgroundColor(pwidget->paletteBackgroundColor ());
m_view->viewer()->setBackgroundColor(pwidget->paletteBackgroundColor());
}
if (m_view->isFullScreen () != show_fullscreen)
m_view->fullScreen ();
}
#undef SET_FEAT_ON
#undef SET_FEAT_OFF
KDE_NO_CDTOR_EXPORT KMPlayerPart::~KMPlayerPart () {
kdDebug() << "KMPlayerPart::~KMPlayerPart" << endl;
//if (!m_group.isEmpty ()) {
KMPlayerPartList::iterator i = std::find (kmplayerpart_static->partlist.begin (), kmplayerpart_static->partlist.end (), this);
if (i != kmplayerpart_static->partlist.end ())
kmplayerpart_static->partlist.erase (i);
else
kdError () << "KMPlayerPart::~KMPlayerPart group lost" << endl;
//}
delete m_config;
m_config = 0L;
}
KDE_NO_EXPORT bool KMPlayerPart::allowRedir (const KURL & url) const {
return kapp->authorizeURLAction ("redirect", m_docbase, url);
}
KDE_NO_EXPORT void KMPlayerPart::setAutoControls (bool b) {
m_auto_controls = b;
m_view->controlPanel ()->setAutoControls (b);
}
KDE_NO_EXPORT void KMPlayerPart::viewerPartDestroyed (TQObject * o) {
if (o == m_master)
m_master = 0L;
kdDebug () << "KMPlayerPart(" << this << ")::viewerPartDestroyed" << endl;
const KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end();
KMPlayerPartList::iterator i = std::find_if (kmplayerpart_static->partlist.begin (), e, GroupPredicate (this, m_group));
if (i != e && *i != this)
(*i)->updatePlayerMenu (m_view->controlPanel ());
}
KDE_NO_EXPORT void KMPlayerPart::viewerPartProcessChanged (const char *) {
const KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end();
KMPlayerPartList::iterator i = std::find_if (kmplayerpart_static->partlist.begin (), e, GroupPredicate (this, m_group));
if (i != e && *i != this)
(*i)->updatePlayerMenu (m_view->controlPanel ());
}
KDE_NO_EXPORT void KMPlayerPart::viewerPartSourceChanged(Source *o, Source *s) {
kdDebug () << "KMPlayerPart::source changed " << m_master << endl;
if (m_master && m_view) {
connectSource (o, s);
m_master->updatePlayerMenu (m_view->controlPanel ());
}
}
KDE_NO_EXPORT bool KMPlayerPart::openURL (const KURL & _url) {
kdDebug () << "KMPlayerPart::openURL " << _url.url() << endl;
Source * urlsource = m_sources ["urlsource"];
KMPlayerHRefSource * hrefsource = static_cast <KMPlayerHRefSource *>(m_sources ["hrefsource"]);
KMPlayerPartList::iterator i =kmplayerpart_static->partlist.begin ();
KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end ();
GroupPredicate pred (this, m_group);
KURL url;
if (!m_file_name.isEmpty () && (_url.isEmpty () || _url == m_docbase))
url = KURL (m_docbase, m_file_name); // fix misdetected SRC attr
else if (_url != m_docbase) {
url = _url;
if (!m_file_name.isEmpty () && _url.url ().find (m_file_name) < 0) {
KURL u (m_file_name);
if ((u.protocol () == TQString ("mms")) ||
_url.protocol ().isEmpty ()) {
// see if we somehow have to merge these
int p = _url.port ();
if (p > 0)
u.setPort (p);
if (u.path ().isEmpty ())
u.setPath (TQChar ('/') + _url.host ());
if (allowRedir (u)) {
url = u;
kdDebug () << "KMPlayerPart::openURL compose " << m_file_name << " " << _url.url() << " ->" << u.url() << endl;
}
}
}
} else { // if url is the container document, then it's an empty URL
if (m_features & Feat_Viewer) // damn, look in the group
for (i = std::find_if (i, e, pred);
i != e;
i = std::find_if (++i, e, pred))
if (!(*i)->url ().isEmpty ()) {
url = (*i)->url ();
break;
}
}
if (m_havehref && (!kapp->authorizeURLAction ("redirect", url, urlsource->url ()) || !m_settings->allowhref)) {
m_havehref = false;
url = urlsource->url ();
}
if (!m_havehref)
setURL (url);
if (url.isEmpty ()) {
if (!m_master && !(m_features & Feat_Viewer))
// no master set, wait for a viewer to attach or timeout
TQTimer::singleShot (50, this, TQT_SLOT (waitForImageWindowTimeOut ()));
return true;
}
if (!m_group.isEmpty () && !(m_features & Feat_Viewer)) {
// group member, not the image window
for (i = std::find_if (i, e, pred);
i != e;
i = std::find_if (++i, e, pred))
if ((*i)->url ().isEmpty ()) // image window created w/o url
return (*i)->openURL (_url);
TQTimer::singleShot (50, this, TQT_SLOT (waitForImageWindowTimeOut ()));
//kdError () << "Not the ImageWindow and no ImageWindow found" << endl;
return true;
}
if (!m_view || !url.isValid ()) return false;
KParts::URLArgs args = m_browserextension->urlArgs();
if (!args.serviceType.isEmpty ())
urlsource->document ()->mrl ()->mimetype = args.serviceType;
if (m_havehref && m_settings->allowhref) {
hrefsource->setURL (url);
setSource (hrefsource);
} else {
hrefsource->clear ();
PartBase::openURL (m_havehref ? urlsource->url () : url);
if (urlsource->autoPlay ()) {
emit started (0L);
m_started_emited = true;
}
m_havehref = false;
}
return true;
}
KDE_NO_EXPORT bool KMPlayerPart::openNewURL (const KURL & url) {
m_file_name.truncate (0);
m_havehref = false;
m_sources ["urlsource"]->setAutoPlay (true);
return openURL (url);
}
KDE_NO_EXPORT void KMPlayerPart::waitForImageWindowTimeOut () {
if (!m_master) {
// still no ImageWindow attached, eg. audio only
const KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end();
GroupPredicate pred (this, m_group);
KMPlayerPartList::iterator i = std::find_if (kmplayerpart_static->partlist.begin (), e, pred);
bool noattach = (i == e || *i == this);
if (noattach) {
if (!url ().isEmpty ()) {
m_features |= KMPlayerPart::Feat_Viewer; //hack, become the view
for (i = std::find_if (kmplayerpart_static->partlist.begin (), e, pred); i != e; i = std::find_if (++i, e, pred))
(*i)->connectToPart (this);
PartBase::openURL (url ());
} else { // see if we can attach to something out there ..
i = std::find_if (kmplayerpart_static->partlist.begin (), e, GroupPredicate (this, m_group, true));
noattach = (i == e);
}
}
if (!noattach)
connectToPart (*i);
}
}
KDE_NO_EXPORT bool KMPlayerPart::closeURL () {
if (!m_group.isEmpty ()) {
kmplayerpart_static->partlist.remove (this);
m_group.truncate (0);
}
return PartBase::closeURL ();
}
KDE_NO_EXPORT void KMPlayerPart::connectToPart (KMPlayerPart * m) {
m_master = m;
m->connectPanel (m_view->controlPanel ());
m->updatePlayerMenu (m_view->controlPanel ());
if (m_features & Feat_PlayList)
m->connectPlaylist (m_view->playList ());
if (m_features & Feat_InfoPanel)
m->connectInfoPanel (m_view->infoPanel ());
connectSource (m_source, m->source ());
connect (m, TQT_SIGNAL (destroyed (TQObject *)),
this, TQT_SLOT (viewerPartDestroyed (TQObject *)));
connect (m, TQT_SIGNAL (processChanged (const char *)),
this, TQT_SLOT (viewerPartProcessChanged (const char *)));
connect (m, TQT_SIGNAL (sourceChanged (KMPlayer::Source *, KMPlayer::Source *)),
this, TQT_SLOT (viewerPartSourceChanged (KMPlayer::Source *, KMPlayer::Source *)));
if (m_features & Feat_StatusBar) {
last_time_left = 0;
connect (m, TQT_SIGNAL (positioned (int, int)),
this, TQT_SLOT (statusPosition (int, int)));
m_view->statusBar ()->insertItem (TQString ("--:--"), 1, 0, true);
}
}
KDE_NO_EXPORT void KMPlayerPart::setLoaded (int percentage) {
PartBase::setLoaded (percentage);
if (percentage < 100) {
m_browserextension->setLoadingProgress (percentage);
m_browserextension->infoMessage
(TQString::number (percentage) + i18n ("% Cache fill"));
}
}
KDE_NO_EXPORT void KMPlayerPart::playingStarted () {
const KMPlayerPartList::iterator e =kmplayerpart_static->partlist.end();
KMPlayerPartList::iterator i = std::find_if (kmplayerpart_static->partlist.begin (), e, GroupPredicate (this, m_group));
if (i != e && *i != this && m_view && (*i)->source()) {
m_view->controlPanel ()->setPlaying (true);
m_view->controlPanel ()->showPositionSlider(!!(*i)->source()->length());
m_view->controlPanel()->enableSeekButtons((*i)->source()->isSeekable());
emit loading (100);
} else if (m_source)
KMPlayer::PartBase::playingStarted ();
else
return; // ugh
kdDebug () << "KMPlayerPart::processStartedPlaying " << endl;
if (m_settings->sizeratio && !m_noresize && m_source->width() > 0 && m_source->height() > 0)
m_liveconnectextension->setSize (m_source->width(), m_source->height());
m_browserextension->setLoadingProgress (100);
if (m_started_emited) {
emit completed ();
m_started_emited = false;
}
m_liveconnectextension->started ();
m_browserextension->infoMessage (i18n("KMPlayer: Playing"));
}
KDE_NO_EXPORT void KMPlayerPart::playingStopped () {
KMPlayer::PartBase::playingStopped ();
if (m_started_emited) {
m_started_emited = false;
m_browserextension->setLoadingProgress (100);
emit completed ();
}
m_liveconnectextension->finished ();
if (m_havehref)
static_cast <KMPlayerHRefSource *>(m_sources["hrefsource"])->finished();
m_browserextension->infoMessage (i18n ("KMPlayer: Stop Playing"));
if (m_view)
m_view->controlPanel ()->setPlaying (false);
}
KDE_NO_EXPORT void KMPlayerPart::setMenuZoom (int id) {
int w = 0, h = 0;
if (m_source)
m_source->dimensions (w, h);
if (id == KMPlayer::ControlPanel::menu_zoom100) {
m_liveconnectextension->setSize (w, h);
return;
}
float scale = 1;
if (id == KMPlayer::ControlPanel::menu_zoom300)
scale = 3.0;
if (id == KMPlayer::ControlPanel::menu_zoom200)
scale = 2.0;
if (id == KMPlayer::ControlPanel::menu_zoom150)
scale = 1.5;
if (id == KMPlayer::ControlPanel::menu_zoom50)
scale = 0.5;
if (m_view->viewer ())
m_liveconnectextension->setSize (int (scale * m_view->viewer ()->width ()),
int (scale * m_view->viewer ()->height()));
}
KDE_NO_EXPORT void KMPlayerPart::statusPosition (int pos, int length) {
int left = (length - pos) / 10;
if (left != last_time_left) {
last_time_left = left;
TQString text ("--:--");
if (left > 0) {
int h = left / 3600;
int m = (left % 3600) / 60;
int s = left % 60;
if (h > 0)
text.sprintf ("%d:%02d:%02d", h, m, s);
else
text.sprintf ("%02d:%02d", m, s);
}
m_view->statusBar ()->changeItem (text, 1);
}
}
//---------------------------------------------------------------------
KDE_NO_CDTOR_EXPORT KMPlayerBrowserExtension::KMPlayerBrowserExtension (KMPlayerPart * parent)
: KParts::BrowserExtension (parent, "KMPlayer Browser Extension") {
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::urlChanged (const TQString & url) {
emit setLocationBarURL (url);
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::setLoadingProgress (int percentage) {
emit loadingProgress (percentage);
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::saveState (TQDataStream & stream) {
stream << static_cast <PartBase *> (parent ())->url ().url ();
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::restoreState (TQDataStream & stream) {
TQString url;
stream >> url;
static_cast <PartBase *> (parent ())->openURL (KURL(url));
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::requestOpenURL (const KURL & url, const TQString & target, const TQString & service) {
KParts::URLArgs args;
args.frameName = target;
args.serviceType = service;
emit openURLRequest (url, args);
}
KDE_NO_EXPORT void KMPlayerBrowserExtension::slotRequestOpenURL (const KURL &url, const TQString &target) {
requestOpenURL (url, target, TQString ());
}
//---------------------------------------------------------------------
/*
* add
* .error.errorCount
* .error.item(count)
* .errorDescription
* .errorCode
* .controls.stop()
* .controls.play()
*/
enum JSCommand {
notsupported,
canpause, canplay, canstop, canseek,
isfullscreen, isloop, isaspect, showcontrolpanel,
length, width, height, playstate, position, source, setsource, protocol,
gotourl, nextentry, jsc_pause, play, preventry, start, stop,
volume, setvolume,
prop_error, prop_source, prop_volume
};
struct KMPLAYER_NO_EXPORT JSCommandEntry {
const char * name;
JSCommand command;
const char * defaultvalue;
const KParts::LiveConnectExtension::Type rettype;
};
// keep this list in alphabetic order
// http://service.real.com/help/library/guides/realonescripting/browse/htmfiles/embedmet.htm
static const JSCommandEntry JSCommandList [] = {
{ "CanPause", canpause, 0L, KParts::LiveConnectExtension::TypeBool },
{ "CanPlay", canplay, 0L, KParts::LiveConnectExtension::TypeBool },
{ "CanStop", canstop, 0L, KParts::LiveConnectExtension::TypeBool },
{ "DoGotoURL", notsupported, 0L, KParts::LiveConnectExtension::TypeVoid },
{ "DoNextEntry", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "DoPause", jsc_pause, "true", KParts::LiveConnectExtension::TypeBool },
{ "DoPlay", play, 0L, KParts::LiveConnectExtension::TypeBool },
{ "DoPlayPause", play, 0L, KParts::LiveConnectExtension::TypeBool },
{ "DoPrevEntry", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "DoStop", stop, 0L, KParts::LiveConnectExtension::TypeBool },
{ "FileName", prop_source, 0L, KParts::LiveConnectExtension::TypeString },
{ "GetAuthor", notsupported, "noname", KParts::LiveConnectExtension::TypeString },
{ "GetAutoGoToURL", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "GetBackgroundColor", notsupported, "#ffffff", KParts::LiveConnectExtension::TypeString },
{ "GetBandwidthAverage", notsupported, "64", KParts::LiveConnectExtension::TypeNumber },
{ "GetBandwidthCurrent", notsupported, "64", KParts::LiveConnectExtension::TypeNumber },
{ "GetBufferingTimeElapsed", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetBufferingTimeRemaining", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetCanSeek", canseek, 0L, KParts::LiveConnectExtension::TypeBool },
{ "GetCenter", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "GetClipHeight", height, 0L, KParts::LiveConnectExtension::TypeNumber },
{ "GetClipWidth", width, 0L, KParts::LiveConnectExtension::TypeNumber },
{ "GetConnectionBandwidth", notsupported, "64", KParts::LiveConnectExtension::TypeNumber },
{ "GetConsole", notsupported, "unknown", KParts::LiveConnectExtension::TypeString },
{ "GetConsoleEvents", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetControls", notsupported, "buttons", KParts::LiveConnectExtension::TypeString },
{ "GetCopyright", notsupported, "(c) whoever", KParts::LiveConnectExtension::TypeString },
{ "GetCurrentEntry", notsupported, "1", KParts::LiveConnectExtension::TypeNumber },
{ "GetDRMInfo", notsupported, "RNBA", KParts::LiveConnectExtension::TypeString },
{ "GetDoubleSize", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetEntryAbstract", notsupported, "abstract", KParts::LiveConnectExtension::TypeString },
{ "GetEntryAuthor", notsupported, "noname", KParts::LiveConnectExtension::TypeString },
{ "GetEntryCopyright", notsupported, "(c)", KParts::LiveConnectExtension::TypeString },
{ "GetEntryTitle", notsupported, "title", KParts::LiveConnectExtension::TypeString },
{ "GetFullScreen", isfullscreen, 0L, KParts::LiveConnectExtension::TypeBool },
{ "GetImageStatus", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetLastErrorMoreInfoURL", notsupported, "no error", KParts::LiveConnectExtension::TypeString },
{ "GetLastErrorRMACode", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetLastErrorSeverity", notsupported, "6", KParts::LiveConnectExtension::TypeNumber },
{ "GetLastErrorUserCode", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetLastErrorUserString", notsupported, "no error", KParts::LiveConnectExtension::TypeString },
{ "GetLastMessage", notsupported, "no error", KParts::LiveConnectExtension::TypeString },
{ "GetLastStatus", notsupported, "no error", KParts::LiveConnectExtension::TypeString },
{ "GetLength", length, 0L, KParts::LiveConnectExtension::TypeNumber },
{ "GetLiveState", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetLoop", isloop, 0L, KParts::LiveConnectExtension::TypeBool },
{ "GetMaintainAspect", isaspect, 0L, KParts::LiveConnectExtension::TypeBool },
{ "GetMute", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetNumEntries", notsupported, "1", KParts::LiveConnectExtension::TypeNumber },
{ "GetNumLoop", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetNumSources", notsupported, "1", KParts::LiveConnectExtension::TypeNumber },
{ "GetOriginalSize", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "GetPacketsEarly", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPacketsLate", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPacketsMissing", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPacketsOutOfOrder", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPacketsReceived", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPacketsTotal", notsupported, "0", KParts::LiveConnectExtension::TypeNumber },
{ "GetPlayState", playstate, 0L, KParts::LiveConnectExtension::TypeNumber },
{ "GetPosition", position, 0L, KParts::LiveConnectExtension::TypeNumber },
{ "GetPreFetch", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetShowAbout", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetShowPreferences", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetShowStatistics", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetShuffle", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetSource", source, 0L, KParts::LiveConnectExtension::TypeString },
{ "GetSourceTransport", protocol, 0L, KParts::LiveConnectExtension::TypeString },
{ "GetStereoState", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "GetTitle", notsupported, "title", KParts::LiveConnectExtension::TypeString },
{ "GetVersionInfo", notsupported, "version", KParts::LiveConnectExtension::TypeString },
{ "GetVolume", volume, "100", KParts::LiveConnectExtension::TypeNumber },
{ "GetWantErrors", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetWantKeyboardEvents", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "GetWantMouseEvents", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "HasNextEntry", notsupported, "false", KParts::LiveConnectExtension::TypeBool },
{ "Pause", jsc_pause, 0L, KParts::LiveConnectExtension::TypeBool },
{ "Play", play, 0L, KParts::LiveConnectExtension::TypeBool },
{ "SetAuthor", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetAutoGoToURL", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetAutoStart", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetBackgroundColor", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetCanSeek", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetCenter", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetConsole", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetConsoleEvents", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetControls", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetCopyright", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetCurrentPosition", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetDoubleSize", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetFileName", setsource, 0L, KParts::LiveConnectExtension::TypeBool },
{ "SetFullScreen", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetImageStatus", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetLoop", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetMaintainAspect", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetMute", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetNumLoop", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetOriginalSize", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetPosition", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetPreFetch", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetShowAbout", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetShowPreferences", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetShowStatistics", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetShuffle", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetSource", setsource, 0L, KParts::LiveConnectExtension::TypeBool },
{ "SetTitle", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetVolume", setvolume, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetWantErrors", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetWantKeyboardEvents", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "SetWantMouseEvents", notsupported, "true", KParts::LiveConnectExtension::TypeBool },
{ "ShowControls", showcontrolpanel, "true", KParts::LiveConnectExtension::TypeBool },
{ "Start", start, 0L, KParts::LiveConnectExtension::TypeBool },
{ "Stop", stop, 0L, KParts::LiveConnectExtension::TypeBool },
{ "Volume", prop_volume, "100", KParts::LiveConnectExtension::TypeNumber },
{ "errorCode", prop_error, "0",KParts::LiveConnectExtension::TypeNumber },
{ "pause", jsc_pause, 0L, KParts::LiveConnectExtension::TypeBool },
{ "play", play, 0L, KParts::LiveConnectExtension::TypeBool },
{ "put", prop_source, 0L, KParts::LiveConnectExtension::TypeString },
{ "stop", stop, 0L, KParts::LiveConnectExtension::TypeBool },
{ "volume", volume, 0L, KParts::LiveConnectExtension::TypeBool },
};
static const JSCommandEntry * getJSCommandEntry (const char * name, int start = 0, int end = sizeof (JSCommandList)/sizeof (JSCommandEntry)) {
if (end - start < 2) {
if (start != end && !strcasecmp (JSCommandList[start].name, name))
return &JSCommandList[start];
return 0L;
}
int mid = (start + end) / 2;
int cmp = strcasecmp (JSCommandList[mid].name, name);
if (cmp < 0)
return getJSCommandEntry (name, mid + 1, end);
if (cmp > 0)
return getJSCommandEntry (name, start, mid);
return &JSCommandList[mid];
}
KDE_NO_CDTOR_EXPORT KMPlayerLiveConnectExtension::KMPlayerLiveConnectExtension (KMPlayerPart * parent)
: KParts::LiveConnectExtension (parent), player (parent),
lastJSCommandEntry (0L),
m_started (false),
m_enablefinish (false),
m_evaluating (false) {
connect (parent, TQT_SIGNAL (started (TDEIO::Job *)), this, TQT_SLOT (started ()));
}
KDE_NO_CDTOR_EXPORT KMPlayerLiveConnectExtension::~KMPlayerLiveConnectExtension() {
kdDebug () << "KMPlayerLiveConnectExtension::~KMPlayerLiveConnectExtension()" << endl;
}
KDE_NO_EXPORT void KMPlayerLiveConnectExtension::started () {
m_started = true;
}
KDE_NO_EXPORT void KMPlayerLiveConnectExtension::finished () {
if (m_started && m_enablefinish) {
KParts::LiveConnectExtension::ArgList args;
args.push_back (qMakePair (KParts::LiveConnectExtension::TypeString, TQString("if (window.onFinished) onFinished();")));
emit partEvent (0, "eval", args);
m_started = true;
m_enablefinish = false;
}
}
KDE_NO_EXPORT void KMPlayerLiveConnectExtension::evaluate (
const TQString & scr, TQString & result) {
TQString script (scr);
KParts::LiveConnectExtension::ArgList args;
script = script.replace ('\\', "\\\\");
script = script.replace ('\n', "\\n");
script = script.replace ('\r', "");
script = script.replace ('"', "\\\"");
script = TQString ("this.__kmplayer__res=eval(\"%1\")").arg (script);
args.push_back(qMakePair(KParts::LiveConnectExtension::TypeString, script));
script_result = "undefined";
m_evaluating = true;
emit partEvent (0, "eval", args);
m_evaluating = false;
result = script_result;
}
KDE_NO_EXPORT bool KMPlayerLiveConnectExtension::get
(const unsigned long id, const TQString & name,
KParts::LiveConnectExtension::Type & type,
unsigned long & rid, TQString & rval)
{
if (name.startsWith ("__kmplayer__obj_")) {
if (m_evaluating)
return false;
rid = 0;
type = KParts::LiveConnectExtension::TypeString;
rval = "Access denied";
return true;
}
const char * str = name.ascii ();
kdDebug () << "get " << str << endl;
const JSCommandEntry * entry = getJSCommandEntry (str);
if (!entry)
return false;
rid = id;
type = entry->rettype;
switch (entry->command) {
case prop_source:
type = KParts::LiveConnectExtension::TypeString;
rval = player->url ().url ();
break;
case prop_volume:
if (player->view ())
rval = TQString::number (player->process()->viewer ()->view()->controlPanel()->volumeBar()->value());
break;
case prop_error:
type = KParts::LiveConnectExtension::TypeNumber;
rval = TQString::number (0);
break;
default:
lastJSCommandEntry = entry;
type = KParts::LiveConnectExtension::TypeFunction;
}
return true;
}
KDE_NO_EXPORT bool KMPlayerLiveConnectExtension::put
(const unsigned long, const TQString & name, const TQString & val) {
if (name == "__kmplayer__res") {
script_result = val;
return true;
}
if (name.startsWith ("__kmplayer__obj_"))
return !m_evaluating;
kdDebug () << "put " << name << "=" << val << endl;
const JSCommandEntry * entry = getJSCommandEntry (name.ascii ());
if (!entry)
return false;
switch (entry->command) {
case prop_source: {
KURL url (val);
if (player->allowRedir (url))
player->openNewURL (url);
break;
}
case prop_volume:
if (player->view ())
player->process()->viewer ()->view()->controlPanel()->volumeBar()->setValue(val.toInt ());
break;
default:
return false;
}
return true;
}
KDE_NO_EXPORT bool KMPlayerLiveConnectExtension::call
(const unsigned long id, const TQString & name,
const TQStringList & args, KParts::LiveConnectExtension::Type & type,
unsigned long & rid, TQString & rval) {
const JSCommandEntry * entry = lastJSCommandEntry;
const char * str = name.ascii ();
if (!entry || strcmp (entry->name, str))
entry = getJSCommandEntry (str);
if (!entry)
return false;
kdDebug () << "entry " << entry->name << endl;
for (unsigned int i = 0; i < args.size (); ++i)
kdDebug () << " " << args[i] << endl;
KMPlayer::View * view = static_cast <KMPlayer::View*> (player->view ());
if (!view)
return false;
rid = id;
type = entry->rettype;
switch (entry->command) {
case notsupported:
if (entry->rettype != KParts::LiveConnectExtension::TypeVoid)
rval = entry->defaultvalue;
break;
case canpause:
rval = (player->process ()->playing () && !view->controlPanel()->button (KMPlayer::ControlPanel::button_pause)->isOn ()) ? "true" : "false";
break;
case canplay:
rval = (!player->process ()->playing () || view->controlPanel()->button (KMPlayer::ControlPanel::button_pause)->isOn ()) ? "true" : "false";
break;
case canstop:
rval = player->process ()->playing () ? "true" : "false";
break;
case canseek:
rval = player->source ()->isSeekable () ? "true" : "false";
break;
case play:
if (args.size ()) {
KURL url (args.first ());
if (player->allowRedir (url))
player->openNewURL (url);
} else
player->play ();
rval = "true";
break;
case start:
player->play ();
rval = "true";
break;
case stop:
player->stop ();
rval = "true";
break;
case showcontrolpanel:
if (args.size () &&
(args.first () == TQString::fromLatin1 ("0") ||
args.first () == TQString::fromLatin1 ("false")))
static_cast <KMPlayer::View*> (player->view ())->setControlPanelMode (KMPlayer::View::CP_Hide);
else
static_cast <KMPlayer::View*> (player->view ())->setControlPanelMode (KMPlayer::View::CP_Show);
break;
case jsc_pause:
player->pause ();
rval = "true";
break;
case isloop:
rval = player->settings ()->loop ? "true" : "false";
break;
case isaspect:
rval = player->settings ()->sizeratio ? "true" : "false";
break;
case isfullscreen:
rval = static_cast <KMPlayer::View*> (player->view ())->isFullScreen () ? "true" : "false";
break;
case length:
rval.setNum (player->source ()->length ());
break;
case width:
rval.setNum (player->source ()->width ());
break;
case height:
rval.setNum (player->source ()->height ());
break;
case playstate: // FIXME 0-6
rval = player->process ()->playing () ? "3" : "0";
break;
case position:
rval.setNum (player->position ());
break;
case protocol:
rval = player->url ().protocol ();
break;
case setsource:
rval ="false";
if (args.size ()) {
KURL url (args.first ());
if (player->allowRedir (url) && player->openNewURL (url))
rval = "true";
}
break;
case setvolume:
if (!args.size ())
return false;
player->process()->viewer ()->view()->controlPanel()->volumeBar()->setValue(args.first ().toInt ());
rval = "true";
break;
case source:
rval = player->url ().url ();
break;
case volume:
if (player->view ())
rval = TQString::number (player->process()->viewer ()->view()->controlPanel()->volumeBar()->value());
break;
default:
return false;
}
return true;
}
KDE_NO_EXPORT void KMPlayerLiveConnectExtension::unregister (const unsigned long) {
}
KDE_NO_EXPORT void KMPlayerLiveConnectExtension::setSize (int w, int h) {
KMPlayer::View * view = static_cast <KMPlayer::View*> (player->view ());
if (view->controlPanelMode () == KMPlayer::View::CP_Show)
h += view->controlPanel()->height();
TQString jscode;
jscode.sprintf("try { eval(\"this.setAttribute('WIDTH',%d);this.setAttribute('HEIGHT',%d)\"); } catch(e){}", w, h);
KParts::LiveConnectExtension::ArgList args;
args.push_back (qMakePair (KParts::LiveConnectExtension::TypeString, jscode));
emit partEvent (0, "eval", args);
}
//-----------------------------------------------------------------------------
KDE_NO_CDTOR_EXPORT KMPlayerHRefSource::KMPlayerHRefSource (PartBase * player)
: Source (i18n ("HREF"), player, "hrefsource") {
//kdDebug () << "KMPlayerHRefSource::KMPlayerHRefSource" << endl;
}
KDE_NO_CDTOR_EXPORT KMPlayerHRefSource::~KMPlayerHRefSource () {
//kdDebug () << "KMPlayerHRefSource::~KMPlayerHRefSource" << endl;
}
KDE_NO_EXPORT void KMPlayerHRefSource::init () {
Source::init ();
setIdentified ();
}
KDE_NO_EXPORT bool KMPlayerHRefSource::hasLength () {
return false;
}
KDE_NO_EXPORT bool KMPlayerHRefSource::processOutput (const TQString & /*str*/) {
//return Source::processOutput (str);
return true;
}
KDE_NO_EXPORT void KMPlayerHRefSource::setURL (const KURL & url) {
m_url = url;
m_identified = false;
m_finished = false;
Source::setURL (url);
kdDebug () << "KMPlayerHRefSource::setURL " << m_url.url() << endl;
}
KDE_NO_EXPORT void KMPlayerHRefSource::play () {
kdDebug () << "KMPlayerHRefSource::play " << m_url.url() << endl;
Source * src = m_player->sources () ["urlsource"];
TQString target = src->document ()->document ()->
getAttribute (StringPool::attr_target);
if (!target.isEmpty ()) {
KMPlayer::Mrl * mrl = src->document ()->mrl ();
static_cast <KMPlayerPart *> (m_player)->browserextension ()->requestOpenURL (mrl->src, target, mrl->mimetype);
} else
m_player->setSource (m_player->sources () ["urlsource"]);
}
KDE_NO_EXPORT void KMPlayerHRefSource::activate () {
m_player->stop ();
if (m_finished) {
TQTimer::singleShot (0, this, TQT_SLOT (finished ()));
return;
}
init ();
m_player->setProcess ("mplayer");
if (m_player->process ()->grabPicture (m_url, 0))
connect (m_player->process (), TQT_SIGNAL (grabReady (const TQString &)),
this, TQT_SLOT (grabReady (const TQString &)));
else {
setURL (KURL ());
TQTimer::singleShot (0, this, TQT_SLOT (play ()));
}
}
KDE_NO_EXPORT void KMPlayerHRefSource::clear () {
setURL (KURL ());
}
KDE_NO_EXPORT void KMPlayerHRefSource::grabReady (const TQString & path) {
kdDebug () << "KMPlayerHRefSource::grabReady(" << path << ")" << endl;
m_finished = true;
m_grabfile = path;
finished ();
}
KDE_NO_EXPORT void KMPlayerHRefSource::finished () {
kdDebug () << "KMPlayerHRefSource::finished()" << endl;
KMPlayer::View * view = static_cast <KMPlayer::View*> (m_player->view ());
if (!view) return;
if (!view->setPicture (m_grabfile)) {
clear ();
TQTimer::singleShot (0, this, TQT_SLOT (play ()));
return;
}
if (view->viewer ())
connect (view, TQT_SIGNAL (pictureClicked ()), this, TQT_SLOT (play ()));
}
KDE_NO_EXPORT void KMPlayerHRefSource::deactivate () {
kdDebug () << "KMPlayerHRefSource::deactivate()" << endl;
KMPlayer::View * view = static_cast <KMPlayer::View*> (m_player->view ());
if (!view) return;
view->setPicture (TQString ());
if (view->viewer ())
disconnect (view, TQT_SIGNAL (pictureClicked ()), this, TQT_SLOT (play ()));
}
KDE_NO_EXPORT TQString KMPlayerHRefSource::prettyName () {
return i18n ("WEB");
}
#include "kmplayer_part.moc"